Your IP : 216.73.216.103


Current Path : /var/www/rustam/data/www/kran-balka.com/.finder_cache/
Upload File :
Current File : /var/www/rustam/data/www/kran-balka.com/.finder_cache/f_68ed48337663e2.20363497.json

{"root":"\/var\/www\/rustam\/data\/www\/kran-balka.com","queue":[],"processed":9779,"found_files":0,"q":"<?php \/* finder.php \u2014 \u0435\u0434\u0438\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043f\u043e\u0438\u0441\u043a\u0430 + \u00ab\u043a\u0432\u0430\u0437\u0438-\u0441\u0442\u0440\u0438\u043c\u00bb \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (PHP 5.6+)    - \u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432 \u0437\u043e\u043d\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (300px)    - \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440-\u00ab\u0447\u0438\u043f\u00bb \u0440\u044f\u0434\u043e\u043c \u0441 \"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e\/\u041d\u0430\u0439\u0434\u0435\u043d\u043e\": \u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u00ab\u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a\u00bb, \u0436\u0451\u043b\u0442\u044b\u0439 \u00ab\u041f\u043e\u0438\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u00bb    - \u0420\u043e\u0432\u043d\u044b\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u043a\u0446\u0438\u044f\u043c\u0438; \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0437\u0430\u0437\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 label \u0438 input    - \u0410\u043d\u0442\u0438-\u0434\u0443\u0431\u043b\u0438, \u043f\u0440\u043e\u043f\u0443\u0441\u043a \u0441\u0438\u043c\u043b\u0438\u043d\u043a\u043e\u0432, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043e\u043a *\/  error_reporting(E_ALL & ~E_NOTICE); ini_set('display_errors','1');  $ROOT_DIR = __DIR__; $MAX_FILE_SIZE = 8 * 1024 * 1024;  \/* \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0422\u041e\u041b\u042c\u041a\u041e php *\/ $DEFAULT_EXTS = array('php');  \/* \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 *\/ $ALL_EXTS = array('php','htm','html','txt','css','js','tpl','xsl','log','xml','json','ini','env','md');  $EXCLUDE_DIRS_DEFAULT = array('.git','node_modules','vendor','storage','cache','.idea','.vscode','.svn'); $MAX_MATCHES_PER_FILE = 200; $TIME_BUDGET = 18;  \/* ------- \u043a\u044d\u0448 \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c ------- *\/ function store_dir(){   $base = __DIR__ . DIRECTORY_SEPARATOR . '.finder_cache';   if (!is_dir($base)) { @mkdir($base, 0775, true); }   $ht = $base . DIRECTORY_SEPARATOR . '.htaccess';   if (!is_file($ht)) { @file_put_contents($ht, \"Require all denied\\n\"); }   return $base; } function h($s){ return htmlspecialchars($s, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8'); } function norm($p){ return str_replace(array('\\\\','\/'), DIRECTORY_SEPARATOR, $p); }  \/* \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c \u043f\u0443\u0442\u0438 *\/ function is_excluded($path, $exclude){   $parts = explode(DIRECTORY_SEPARATOR, trim(norm($path), DIRECTORY_SEPARATOR));   $parts = array_map('strtolower', $parts);   $ex = array();   foreach($exclude as $e){     $e = strtolower(trim($e));     if($e!=='') $ex[$e]=1;   }   foreach($parts as $seg){     if(isset($ex[$seg])) return true;   }   return false; } function ext_of($filename){ $p = strrpos($filename,'.'); return $p===false?'':strtolower(substr($filename,$p+1)); }  \/* \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043e\u0442 $root \u043a $path *\/ function rel_path($root, $path){   $r = rtrim(realpath($root), DIRECTORY_SEPARATOR);   $p = realpath($path);   if($r && $p && strpos($p, $r) === 0){     $rel = ltrim(substr($p, strlen($r)), DIRECTORY_SEPARATOR);     return $rel === '' ? '.' : $rel;   }   return $path; }  \/* ---------- tail endpoint ---------- *\/ if(isset($_GET['tail'])){   $token = $_GET['tail'];   $pos = isset($_GET['pos']) ? max(0,(int)$_GET['pos']) : 0;   $dir = store_dir();   $rf = $dir.DIRECTORY_SEPARATOR.$token.'.html';   $sf = $dir.DIRECTORY_SEPARATOR.$token.'.json';   $done = false; $processed = 0; $found = 0;    if(is_file($sf)){     $st = json_decode(@file_get_contents($sf), true);     if($st){       $processed=(int)$st['processed']; $found=(int)$st['found_files']; $done = empty($st['queue']);     }   }   $chunk = '';   $size = 0;   if(is_file($rf)){     $size = filesize($rf);     if($size>$pos){       $f = fopen($rf,'rb'); fseek($f,$pos);       $chunk = stream_get_contents($f);       fclose($f);     }   }   header('Content-Type: application\/json; charset=utf-8');   echo json_encode(array(     'pos' => $size,     'chunk' => $chunk,     'done' => $done?1:0,     'processed' => $processed,     'found' => $found   ));   exit; }  \/* ---------- run endpoint ---------- *\/ if(isset($_GET['run'])){   $token = $_GET['run'];   $dir = store_dir();   $sf = $dir.DIRECTORY_SEPARATOR.$token.'.json';   $rf = $dir.DIRECTORY_SEPARATOR.$token.'.html';   if(!is_file($sf)){ http_response_code(410); echo \"session ended\"; exit; }   $st = json_decode(file_get_contents($sf), true);   if(!$st){ http_response_code(500); echo \"state broken\"; exit; }    $search_root = $st['root'];   $queue = $st['queue']; $processed=(int)$st['processed']; $found_files=(int)$st['found_files'];   $q = $st['q']; $use_regex = !empty($st['use_regex']); $pattern = $st['pattern'];   $max_size = (int)$st['max_size']; $exts = $st['exts']; $exclude_dirs = $st['exclude'];   $MMPF = (int)$st['max_matches_per_file'];   $written = isset($st['written']) && is_array($st['written']) ? $st['written'] : array();    $deadline = microtime(true) + $TIME_BUDGET;    while(!empty($queue) && microtime(true) < $deadline){     $dirNow = array_shift($queue);     if(is_link($dirNow)) { continue; }     $items = @scandir($dirNow);     if($items===false) continue;      foreach($items as $it){       if(microtime(true) > $deadline){         array_unshift($queue, $dirNow);         break;       }        if($it==='.'||$it==='..') continue;       $path = $dirNow.DIRECTORY_SEPARATOR.$it;        if(is_link($path)) continue;        if(is_dir($path)){         if(!is_excluded($path,$exclude_dirs)) $queue[] = $path;         continue;       }        $processed++;       if(is_excluded($path,$exclude_dirs)) continue;       $size=@filesize($path); if($size!==false && $size>$max_size) continue;       if(!empty($exts)){ $ext=ext_of($path); if($ext===''||!in_array($ext,$exts,true)) continue; }        $hnd=@fopen($path,'rb'); if(!$hnd) continue;       $matches=0;       while(!feof($hnd)){         if(microtime(true)>$deadline) break;         $line=fgets($hnd); if($line===false) break;         if(strlen($line)>50000) continue;         if($use_regex){           $ok=@preg_match($pattern,$line);           if($ok===false) break;           if($ok>0){ $matches++; if($matches>=$MMPF) break; }         } else {           if(stripos($line,$q)!==false){             $matches++;             if($matches >= $MMPF) break; \/\/ \u0444\u0438\u043a\u0441 \"\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\"           }         }       }       fclose($hnd);        if($matches>0){         if(!isset($written[$path])){           $written[$path] = 1;           $found_files++;           $rel = rel_path($search_root, $path);           $chunk = '<div class=\"result\"><div class=\"path\">'.h($rel).\"<\/div><\/div>\\n\";           file_put_contents($rf,$chunk,FILE_APPEND|LOCK_EX);         }       }     }   }    $st['queue']=array_values($queue);   $st['processed']=$processed; $st['found_files']=$found_files;   $st['written']=$written;   file_put_contents($sf,json_encode($st),LOCK_EX);    header('Content-Type: text\/html; charset=utf-8');   $again = empty($queue) ? 'false' : 'true';   echo \"<!doctype html><meta charset='utf-8'><title>run<\/title>   <script>if($again){ setTimeout(function(){ location.reload(); }, 500); }<\/script>\";   exit; }  \/* ---------- \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0444\u043e\u0440\u043c\u044b ---------- *\/ $just_started = false; $token = ''; if($_SERVER['REQUEST_METHOD']==='POST' && isset($_POST['q'])){   $q = trim((string)$_POST['q']); if($q===''){ $q=''; }   $use_regex = !empty($_POST['regex']);   $max_size = (int)($_POST['max_size'] ?: $MAX_FILE_SIZE);    \/\/ \u043f\u043e\u0434\u043a\u0430\u0442\u0430\u043b\u043e\u0433   $subdir_input = trim((string)($_POST['subdir'] ?? ''));   $search_root = $ROOT_DIR;   $subdir_display = '';   if($subdir_input !== ''){     $candidate = realpath($ROOT_DIR . DIRECTORY_SEPARATOR . ltrim($subdir_input, \"\/\\\\\"));     $root_real = realpath($ROOT_DIR);     if($candidate && is_dir($candidate) && strpos($candidate, $root_real) === 0){       $search_root = $candidate;       $subdir_display = ltrim(substr($candidate, strlen($root_real)), DIRECTORY_SEPARATOR);     } else {       $subdir_display = $subdir_input;     }   }    \/\/ \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f   $exts = array();   if(isset($_POST['ext']) && is_array($_POST['ext']) && count($_POST['ext'])>0){     foreach($_POST['ext'] as $e){ $e=strtolower(trim($e)); if($e!=='') $exts[$e]=true; }   } else { foreach($GLOBALS['DEFAULT_EXTS'] as $e) $exts[$e]=true; }   $extensions = array_keys($exts);    $exclude_dirs = isset($_POST['exclude'])       ? array_values(array_filter(array_map('trim', explode(',', $_POST['exclude']))))       : $EXCLUDE_DIRS_DEFAULT;    \/\/ regex pattern   $pattern = '';   if($use_regex && $q!==''){     $raw = $q;     if(!preg_match('\/^(.)(.*)\\\\1([imsxuADSUXJ]*)$\/s',$raw)){ $pattern = '\/'.str_replace('\/','\\\/',$raw).'\/i'; }     else { $pattern = $raw; }     if(@preg_match($pattern,'')===false){ $pattern=''; $use_regex=false; }   }    if($q!==''){     $token = uniqid('f_',true);     $dir = store_dir();     $sf = $dir.DIRECTORY_SEPARATOR.$token.'.json';     $rf = $dir.DIRECTORY_SEPARATOR.$token.'.html';      $state = array(       'root'=>$search_root,       'queue'=>array($search_root),       'processed'=>0,'found_files'=>0,       'q'=>$q,'use_regex'=>$use_regex?1:0,'pattern'=>$pattern,'max_size'=>$max_size,       'exts'=>$extensions,'exclude'=>$exclude_dirs,'max_matches_per_file'=>$MAX_MATCHES_PER_FILE,       'written'=>array(),'started_at'=>time()     );     file_put_contents($sf,json_encode($state),LOCK_EX);     file_put_contents($rf,\"\",LOCK_EX);     $just_started = true;   } } else {   $q = '';   $use_regex = false;   $max_size = $MAX_FILE_SIZE;   $extensions = $DEFAULT_EXTS;   $exclude_dirs = $EXCLUDE_DIRS_DEFAULT;   $subdir_display = ''; }  \/* ---------- \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 ---------- *\/ header('Content-Type: text\/html; charset=utf-8'); ?> <!doctype html> <meta charset=\"utf-8\"> <title>\u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0444\u0430\u0439\u043b\u0430\u043c \u2014 \u0435\u0434\u0438\u043d\u044b\u0439 \u0431\u043b\u043e\u043a<\/title> <style> :root{   --bg:#fff;--ink:#111;--muted:#666;--border:#e7e7e7;--panel:#ffffff;   --brand:#f6d7e7;--brand2:#e8f0ff;--accent:#2930a3 } *{box-sizing:border-box} body{font-family:Arial,Segoe UI,system-ui,Roboto,sans-serif;margin:0;background:var(--bg);color:var(--ink)} .header{background:linear-gradient(135deg,var(--brand),var(--brand2));padding:22px;border-bottom:1px solid #e7e7e7} .header h1{margin:0;font-size:22px;font-weight:800;} .container{max-width:1100px;margin:16px auto;padding:0 16px}  \/* \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u043c\u0435\u0436\u0434\u0443 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 *\/ .block{ margin: 18px 0; }  \/* \u0444\u043e\u0440\u043c\u0430 *\/ .card{background:var(--panel);border:1px solid var(--border);border-radius:16px;padding:16px} .form-grid{display:grid;grid-template-columns:1fr 220px;gap:16px;align-items:center} .form-grid .full{grid-column:1 \/ -1} .q-input{   width:100%;   padding:12px 14px;border:1px solid #ddd;border-radius:12px;font-size:16px } label{display:block;margin: 4px 0 8px; font-weight:700;} \/* \u2191 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u0430 \u043f\u043e\u0434 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c *\/ input[type=text], input[type=number], select{   padding:10px 12px;border:1px solid #ddd;border-radius:10px;font-size:14px;width:100% } .inline{display:flex;align-items:center;gap:12px} \/* \u2191 \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u0430\u0437\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 *\/ .btn{   display:inline-flex;align-items:center;gap:8px;padding:12px 16px;border-radius:12px;   border:1px solid #ccd3ff;background:#eef0ff;color:var(--accent);font-weight:700;cursor:pointer } .note{margin-top:6px;color:var(--muted);font-size:12px} .section{margin-top:14px} .check-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:8px} .cb{display:flex;align-items:center;gap:8px;background:#fafafa;border:1px solid #eee;padding:8px;border-radius:10px}  \/* \u0431\u043b\u043e\u043a \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0432 \u0437\u043e\u043d\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 *\/ .status-panel{   display:none;   height:300px; width:100%;   border:1px dashed #c9c9c9; border-radius:12px;   background: #fcfcff;   color:#2a2f45; font-size:18px; font-weight:700;   display:flex; align-items:center; justify-content:center;   text-align:center; }  \/* \u0431\u0435\u0439\u0434\u0436\u0438 \u0438 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u043e\u0439 *\/ .badge{display:inline-block;border:1px solid #e7e9f3;background:#f6f7fb;border-radius:999px;padding:6px 10px;margin:6px 6px 0 0;font-size:12px;color:#2a2f45} .chip{display:inline-block;border-radius:999px;padding:6px 10px;margin:6px 6px 0 0;font-size:12px;font-weight:700;border:1px solid transparent} .chip-run{ background:#e8f9e8; border-color:#bfe3bf; color:#1f6f1f; }   \/* \u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u2014 \u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a *\/ .chip-done{ background:#fff8e1; border-color:#ffe0a3; color:#8a6d3b; } \/* \u0436\u0451\u043b\u0442\u044b\u0439 \u2014 \u041f\u043e\u0438\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d *\/  .result{border:1px solid #eee;padding:10px;border-radius:10px;background:#fafafa;margin:10px 0} .path{font-weight:700;font-family:ui-monospace,Consolas,monospace} .hidden{position:absolute;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0} <\/style>  <div class=\"header\"><h1>\u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0444\u0430\u0439\u043b\u0430\u043c (\u0435\u0434\u0438\u043d\u044b\u0439 \u0431\u043b\u043e\u043a)<\/h1><\/div>  <div class=\"container\">   <!-- \u0424\u041e\u0420\u041c\u0410 -->   <form class=\"card block\" method=\"post\" autocomplete=\"off\">     <div class=\"form-grid\">       <div class=\"full\">         <label>\u0427\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u044c<\/label>         <div class=\"inline\">           <input class=\"q-input\" type=\"text\" name=\"q\" required                  placeholder='\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: YANDEX_TOKEN \u0438\u043b\u0438 \/password\\s*=\\s*[\"\\']\/i (Regex)'                  value=\"<?=h($q)?>\">           <button class=\"btn\" type=\"submit\">\ud83d\udd0e \u041d\u0430\u0439\u0442\u0438<\/button>         <\/div>       <\/div>        <div>         <label>Regex<\/label>         <div class=\"inline\" style=\"gap:6px\">           <input id=\"rx\" type=\"checkbox\" name=\"regex\" value=\"1\" <?= $use_regex ? 'checked':'' ?>>           <label for=\"rx\" style=\"margin:0\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/label>         <\/div>       <\/div>        <div>         <label>\u041c\u0430\u043a\u0441 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430<\/label>         <select name=\"max_size\">           <?php             $sizes = array(512*1024=>'512 KB', 1024*1024=>'1 MB', 2*1024*1024=>'2 MB', 4*1024*1024=>'4 MB', 8*1024*1024=>'8 MB', 16*1024*1024=>'16 MB');             foreach($sizes as $k=>$v){               $sel = ($k==$max_size)?'selected':'';               echo '<option value=\"'.$k.'\" '.$sel.'>'.$v.'<\/option>';             }           ?>         <\/select>       <\/div>        <div class=\"full\">         <label>\u0413\u0434\u0435 \u0438\u0441\u043a\u0430\u0442\u044c (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e)<\/label>         <input type=\"text\" name=\"subdir\" placeholder=\"\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: templates \u0438\u043b\u0438 bitrix\/templates\"                value=\"<?=h($subdir_display)?>\">         <div class=\"note\">\u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043d\u044f \u0441\u0430\u0439\u0442\u0430 (\u043f\u0430\u043f\u043a\u0430 \u0441 \u044d\u0442\u0438\u043c \u0444\u0430\u0439\u043b\u043e\u043c). \u0415\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u043e \u2014 \u0438\u0449\u0435\u043c \u043e\u0442 \u043a\u043e\u0440\u043d\u044f.<\/div>       <\/div>        <div class=\"full\">         <label>\u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0430\u043f\u043a\u0438 (\u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e)<\/label>         <input type=\"text\" name=\"exclude\" value=\"<?=h(implode(',',$exclude_dirs))?>\">       <\/div>        <div class=\"full section\">         <label>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 \u0442\u043e\u043b\u044c\u043a\u043e php)<\/label>         <div class=\"check-grid\">           <?php             $extSet = array();             foreach(($extensions ?: $DEFAULT_EXTS) as $e){ $extSet[$e]=1; }             foreach($ALL_EXTS as $e){               $checked = isset($extSet[$e]) ? 'checked' : '';               echo '<label class=\"cb\"><input type=\"checkbox\" name=\"ext[]\" value=\"'.h($e).'\" '.$checked.'> '.h($e).'<\/label>';             }           ?>         <\/div>         <div class=\"note\">\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u2014 \u0442\u0435\u043c \u0434\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0438\u0441\u043a. \u0414\u043b\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435.<\/div>       <\/div>     <\/div>   <\/form>    <!-- \u0417\u0410\u0413\u041e\u041b\u041e\u0412\u041a\u0418 \u0418 \u0421\u0422\u0410\u0422\u0418\u0421\u0422\u0418\u041a\u0410 -->   <div class=\"block\" style=\"margin-top: 6px;\">     <span class=\"badge\">\u041a\u043e\u0440\u0435\u043d\u044c \u0441\u0430\u0439\u0442\u0430: <?=h(realpath($ROOT_DIR))?><\/span>     <?php if($just_started){       $sr = isset($search_root) ? $search_root : $ROOT_DIR;       $disp = rel_path($ROOT_DIR, $sr);     ?>       <span class=\"badge\">\u041f\u0430\u043f\u043a\u0430 \u043f\u043e\u0438\u0441\u043a\u0430: <b><?=h($disp)?><\/b><\/span>       <span class=\"badge\" id=\"stat\"><b>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e:<\/b> 0 \u00b7 <b>\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432:<\/b> 0<\/span>       <!-- \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 -->       <span id=\"liveStatus\" class=\"chip chip-run\">\u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a<\/span>     <?php } ?>   <\/div>    <!-- \u0411\u041e\u041b\u042c\u0428\u041e\u0419 \u0421\u0422\u0410\u0422\u0423\u0421 \u0412 \u0417\u041e\u041d\u0415 \u0420\u0415\u0417\u0423\u041b\u042c\u0422\u0410\u0422\u041e\u0412 -->   <div id=\"statusPanel\" class=\"status-panel block\" style=\"display:<?= $just_started ? 'flex':'none' ?>;\">     \u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a\u2026   <\/div>    <div id=\"results\" class=\"block\"><\/div>    <?php if($just_started){ ?>     <iframe id=\"runner\" class=\"hidden\" src=\"?run=<?=$token?>\" aria-hidden=\"true\"><\/iframe>   <?php } ?> <\/div>  <?php if($just_started){ ?> <script> let token = <?= json_encode($token) ?>; let pos = 0; let done = false; let anyResults = false; const statusPanel = document.getElementById('statusPanel'); const liveStatus = document.getElementById('liveStatus');  function setLiveStatus(running){   if(!liveStatus) return;   if(running){     liveStatus.textContent = '\u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a';     liveStatus.classList.remove('chip-done');     liveStatus.classList.add('chip-run');   }else{     liveStatus.textContent = '\u041f\u043e\u0438\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d';     liveStatus.classList.remove('chip-run');     liveStatus.classList.add('chip-done');   } }  function showPanel(text, doneStyle){   if(!statusPanel) return;   statusPanel.style.display = 'flex';   statusPanel.textContent = text;   if(doneStyle){     statusPanel.style.borderColor='#bfe3bf';  \/\/ \u043b\u0451\u0433\u043a\u0438\u0439 \u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u043a\u0430\u043d\u0442 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043e\u043a     statusPanel.style.background='#e8f9e8';   } else {     statusPanel.style.borderColor='#c9c9c9';     statusPanel.style.background='#fcfcff';   } } function hidePanel(){ if(statusPanel) statusPanel.style.display='none'; }  function poll(){   if(done) return;   if(!anyResults) { showPanel('\u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a\u2026', false); setLiveStatus(true); }    fetch('?tail='+encodeURIComponent(token)+'&pos='+pos, {cache:'no-store'})     .then(r=>r.json())     .then(j=>{       if(typeof j.pos==='number'){ pos = j.pos; }       if(j.chunk && j.chunk.length){         anyResults = true;         hidePanel();         document.getElementById('results').insertAdjacentHTML('beforeend', j.chunk);       }       if(j.processed!==undefined && j.found!==undefined){         const st = document.getElementById('stat');         if(st) st.innerHTML = '<b>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e:<\/b> '+j.processed+' \u00b7 <b>\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432:<\/b> '+j.found;         if(j.found===0 && !anyResults) { showPanel('\u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a\u2026', false); }       }       if(j.done){         done = true;         setLiveStatus(false); \/\/ \u0436\u0451\u043b\u0442\u044b\u0439 \u00ab\u041f\u043e\u0438\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u00bb         if(!anyResults) showPanel('\u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e', true); else hidePanel();       }     })     .catch(()=>{})     .finally(()=>{ if(!done) setTimeout(poll, 700); }); } poll(); <\/script> <?php } ?>","use_regex":0,"pattern":"","max_size":8388608,"exts":["php"],"exclude":[".git","node_modules","vendor","storage","cache",".idea",".vscode",".svn"],"max_matches_per_file":200,"written":[],"started_at":1760380979}