Файл: ai-bolit/ai-bolit.php
Строк: 3933
<?php
///////////////////////////////////////////////////////////////////////////
// Created and developed by Greg Zemskov, Revisium Company
// Email: ai@revisium.com, http://revisium.com/ai/, skype: greg_zemskov
// Commercial usage is not allowed without a license purchase or written permission of author
// Source code usage is not allowed without author's permission
// Certificated in Federal Institute of Industrial Property in 2012
// http://revisium.com/ai/i/mini_aibolit.jpg
////////////////////////////////////////////////////////////////////////////
// Запрещено использование скрипта в коммерческих целях без приобретения лицензии.
// Запрещено использование исходного кода скрипта без приобретения лицензии.
//
// По вопросам приобретения лицензии обращайтесь в компанию "Ревизиум": http://www.revisium.com
// ai@revisium.com
// На скрипт получено авторское свидетельство в Роспатенте
// http://revisium.com/ai/i/mini_aibolit.jpg
///////////////////////////////////////////////////////////////////////////
// put 1 for expert mode, 0 for basic check and 2 for paranoic mode
// установите 1 для режима "Эксперта", 0 для быстрой проверки и 2 для параноидальной проверки (для лечения сайта) 
define('AI_EXPERT', 1); 
//define('LANG', 'EN');
define('LANG', 'RU');
// Put any strong password to open the script from web
// Впишите вместо put_any_strong_password_here сложный пароль     
define('PASS', 'put_any_strong_password_here'); 
define('REPORT_MASK_PHPSIGN', 1);
define('REPORT_MASK_SPAMLINKS', 2);
define('REPORT_MASK_DOORWAYS', 4);
define('REPORT_MASK_SUSP', 8);
define('REPORT_MASK_CANDI', 16);
define('REPORT_MASK_WRIT', 32);
define('REPORT_MASK_FULL', REPORT_MASK_PHPSIGN | REPORT_MASK_SPAMLINKS | REPORT_MASK_DOORWAYS | REPORT_MASK_SUSP
/* <-- remove this line to enable "recommendations"  
| REPORT_MASK_CANDI | REPORT_MASK_WRIT
 remove this line to enable "recommendations" --> */
);
$defaults = array(
    'path' => dirname(__FILE__),
    'scan_all_files' => 0, // full scan (rather than just a .js, .php, .html, .htaccess)
    'scan_delay' => 1, // delay in file scanning to reduce system load
    'max_size_to_scan' => '512K',
    'site_url' => '', // website url
    'no_rw_dir' => 0,
    'report_mask' =>  REPORT_MASK_FULL // full-featured report
);
define('DEBUG_MODE', 0);
define('DIR_SEPARATOR', '/');
define('DOUBLECHECK_FILE', 'AI-BOLIT-DOUBLECHECK.php');
if ((isset($_SERVER['OS']) && stripos('Win', $_SERVER['OS']) !== false)/* && stripos('CygWin', $_SERVER['OS']) === false)*/) {
   define('DIR_SEPARATOR', '\');
}
if (LANG == 'RU') {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// RUSSIAN INTERFACE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
define('AI_STR_001', '<h3>AI-Болит v.%s — ищет вредоносный код и вирусы в файлах.</h3><h5>Григорий Земсков, компания "<a href="http://www.revisium.com/">Ревизиум</a>", 2012-2014, <a target=_blank href="http://revisium.com/ai/">Страница проекта на Revisium.com.</a> %s</h5>');
define('AI_STR_002', '<div class="update">Проверьте обновление на сайте <a href="http://revisium.com/ai/">http://revisium.com/ai/</a>. Возможно, ваша версия скрипта уже устарела.</div>');
define('AI_STR_003', 'ВНИМАНИЕ! Не оставляйте файл ai-bolit.php или файл отчета на сервере, и не давайте прямых ссылок с других сайтов на файл отчета или скрипта. Отчет содержит важную информацию о вашем сайте или сервере, сохраните его в надежном месте от посторонних глаз!');
define('AI_STR_004', 'Путь');
define('AI_STR_005', 'Дата создания');
define('AI_STR_006', 'Дата модификации');
define('AI_STR_007', 'Размер');
define('AI_STR_008', 'Конфигурация PHP');
define('AI_STR_009', "Вы установили слабый пароль на скрипт AI-BOLIT. Укажите пароль не менее 8 символов, содержащий латинские буквы в верхнем и нижнем регистре, а также цифры. Например, такой <b>%s</b>");
define('AI_STR_010', "Запустите скрипт с паролем, который установлен в переменной PASS (в начале файла). <br/>Например, так http://ваш_сайт_и_путь_до_скрипта/ai-bolit.php?p=<b>%s</b>");
define('AI_STR_011', 'Текущая директория не доступна для чтения скрипту. Пожалуйста, укажите права на доступ <b>rwxr-xr-x</b> или с помощью командной строки <b>chmod +r имя_директории</b>');
define('AI_STR_012', "<div class="rep">Текущая база скрипта содержит %s шелл-сигнатур, а также %s других вредоносных фрагментов. Затрачено времени: <b>%s</b>.<br/>Сканирование начато: %s. Сканирование завершено: %s</div> ");
define('AI_STR_013', '<div class="rep">Всего проверено %s директорий и %s файлов.</div>');
define('AI_STR_014', '<div class="rep" style="color: #0000A0">Внимание, скрипт выполнил быструю проверку сайта. Проверяются только наиболее критические файлы, но часть вредоносных скриптов может быть не обнаружена. Пожалуйста, запустите скрипт из командной строки для выполнения полного тестирования. Подробнее смотрите в <a href="http://revisium.com/ai/faq.php">FAQ вопрос №10</a>.</div>');
define('AI_STR_015', '<div class="sec">Критические замечания</div>');
define('AI_STR_016', 'Найдены сигнатуры шелл-скрипта. Подозрение на вредоносный скрипт:');
define('AI_STR_017', 'Шелл-скрипты не найдены.');
define('AI_STR_018', 'Обнаружены сигнатуры javascript вирусов:');
define('AI_STR_019', 'Обнаружены сигнатуры исполняемых файлов unix. Они могут быть вредоносными файлами:');
define('AI_STR_020', 'Двойное расширение, зашифрованный контент или подозрение на вредоносный скрипт. Требуется дополнительный анализ:');
define('AI_STR_021', 'Подозрение на вредоносный скрипт:');
define('AI_STR_022', 'Список файловых ссылок (symlinks):');
define('AI_STR_023', 'Список скрытых файлов:');
define('AI_STR_024', 'Скорее всего этот файл лежит в каталоге с дорвеем:');
define('AI_STR_025', 'Не найдено директорий c дорвеями');
define('AI_STR_026', 'Предупреждения');
define('AI_STR_027', 'Опасный код в .htaccess (редирект на внешний сервер, подмена расширений или автовнедрение кода):');
define('AI_STR_028', 'В не .php файле содержится стартовая сигнатура PHP кода. Возможно, там вредоносный код:');
define('AI_STR_029', 'В этих файлах размещен код по продаже ссылок. Убедитесь, что размещали его вы:');
define('AI_STR_030', 'Непроверенные файлы - ошибка чтения');
define('AI_STR_031', 'В этих файлах размещены невидимые ссылки. Подозрение на ссылочный спам:');
define('AI_STR_032', 'Список невидимых ссылок:');
define('AI_STR_033', 'Отображены только первые ');
define('AI_STR_034', 'Найдены директории, в которых подозрительно много файлов .php или .html. Подозрение на дорвей:');
define('AI_STR_035', 'Скрипт использует код, который часто используются во вредоносных скриптах:');
define('AI_STR_036', 'Директории из файла .adirignore были пропущены при сканировании:');
define('AI_STR_037', 'Версии найденных CMS:');
define('AI_STR_038', 'Большие файлы (больше чем %s! Пропущено:');
define('AI_STR_039', 'Не найдено файлов больше чем %s');
define('AI_STR_040', 'Временные файлы или файлы(каталоги)-кандидаты на удаление по ряду причин:');
define('AI_STR_041', 'Потенциально небезопасно! Директории, доступные скрипту на запись:');
define('AI_STR_042', 'Не найдено директорий, доступных на запись скриптом');
define('AI_STR_043', 'Использовано памяти при сканировании: ');
define('AI_STR_044', '<div id="igid" style="display: none;"><div class="sec">Добавить в список игнорируемых</div><form name="ignore"><textarea name="list" style="width: 600px; height: 400px;"></textarea></form><div class="details">Скопируйте этот список и вставьте его в файл .aignore, чтобы исключить эти файлы из отчета.</div></div>');
define('AI_STR_045', '<div class="notice"><span class="vir">[!]</span> В скрипте отключено полное сканирование файлов, проверяются только .php, .html, .htaccess. Чтобы выполнить более тщательное сканирование, <br/>поменяйте значение настройки на <b>'scan_all_files' => 1</b> в самом верху скрипта. Скрипт в этом случае может работать очень долго. Рекомендуется отключить на хостинге лимит по времени выполнения, либо запускать скрипт из командной строки.</div>');
define('AI_STR_046', '[x] закрыть сообщение');
define('AI_STR_047', '<div class="offer" id="ofr"><span style="font-size: 15px;"><a href="http://www.revisium.com/ru/order/" target="_blank"><b>Оперативное лечение сайта от вирусов. Защита от взлома. Гарантия на работы. </b></a></span><br/><p style="color: #D0FFD0; font-size: 13px;">Быстро и качественно вылечим Ваш сайт от вирусов, удалим вредоносный код с сайта, поставим уникальную защиту от взлома. <a href="http://www.revisium.com/ru/order/" target=_blank>Отправьте нам запрос</a> на сайте www.revisium.com →</p><hr color=#E0E0E0 size=1><p style="color: #E0E0E0">Также приглашаем в группу ВКонтакте<br/> <a href="http://vk.com/siteprotect" target="_blank">"Безопасность Веб-сайтов"</a>. А еще у нас есть твиттер <a href="http://twitter.com/revisium" target=_blank>@revisium</a> и страница <a href="http://www.facebook.com/Revisium" target=_blank>facebook.com/revisium</a>. Присоединяйтесь!</p><hr color=#E0E0E0 size=1><p style="color: #E0E0E0"><b style="color: yellow">[$$$]</b> Если Вы хостер, веб-студия, seo-специалист или вебмастер — напишите нам на ai@revisium.com, для Вас есть партнерская программа.</p>');
define('AI_STR_048', '<p>Если у вас есть эккаунт ВКонтакте, приглашаем в <a href="http://vk.com/siteprotect" target=_blank>группу "Безопасность Веб-сайтов"</a>: там я делюсь опытом защиты веб-сайтов и поиска вредоносных скриптов.</p>');
define('AI_STR_049', 'Отказ от гарантий: даже если скрипт не нашел вредоносных скриптов на сайте, автор не гарантирует их полное отсутствие, а также не несет ответственности за возможные последствия работы скрипта ai-bolit.php или неоправданные ожидания пользователей относительно функциональности и возможностей.');
define('AI_STR_050', 'Замечания и предложения по работе скрипта и пропущенные вредоносные скрипты присылайте на <a href="mailto:ai@revisium.com">ai@revisium.com</a>.<p>Также будем чрезвычайно благодарны за любые упоминания скрипта AI-Bolit на вашем сайте, в блоге, среди друзей, знакомых и клиентов. Ссылочку можно поставить на <a href="http://revisium.com/ai/">http://revisium.com/ai/</a>. <p>Если будут вопросы - пишите <a href="mailto:ai@revisium.com">ai@revisium.com</a>. ');
define('AI_STR_051', 'Отчет по ');
define('AI_STR_052', 'Эвристический анализ обнаружил подозрительные файлы. Проверьте их на наличие вредоносного кода.');
define('AI_STR_053', 'Много косвенных вызовов функции');
define('AI_STR_054', 'Подозрение на обфусцированные переменные');
define('AI_STR_055', 'Подозрительное использование массива глобальных переменных');
define('AI_STR_056', 'Дробление строки на символы');
define('AI_STR_057', 'Сканирование выполнено в обычном режиме. Некоторые вредоносные скрипты могут быть не обнаружены.<br> Желательно проверить сайт в режиме "Эксперт". Подробно описано в <a href="http://www.revisium.com/ai/faq.php">FAQ</a> и инструкции к скрипту.');
define('AI_STR_058', 'Обнаружены фишинговые страницы:');
} else {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ENGLISH INTERFACE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
define('AI_STR_001', '<h3>AI-BOLIT v.%s — Advanced Server-Side Scanner of Viruses, Malicious and Hacker's Scripts.</h3><h5>Greg Zemskov, 2012-2014, <a target=_blank href="http://revisium.com/aibo/">AI-BOLIT web site.</a>. Non-commercial use only.</h5>');
define('AI_STR_002', '<div class="update">Check for updates on <a href="http://revisium.com/ai/">http://revisium.com/ai/</a>. Probably your version is out-of-date.</div>');
define('AI_STR_003', 'Caution! Do not leave either ai-bolit.php or report file on server and do not provide direct links to the report file. Report file contains sensitive information about your website which could be used by hackers. So keep it in safe place and don't leave on website!');
define('AI_STR_004', 'Path');
define('AI_STR_005', 'Created');
define('AI_STR_006', 'Modified');
define('AI_STR_007', 'Size');
define('AI_STR_008', 'PHP Info');
define('AI_STR_009', "Your password for AI-BOLIT is weak. Password must be more than 8 character length, contain both latin letters in upper and lower case, and digits. E.g. <b>%s</b>");
define('AI_STR_010', "Open AI-BOLIT with password specified in the beggining of file in PASS variable. <br/>E.g. http://you_website.com/ai-bolit.php?p=<b>%s</b>");
define('AI_STR_011', 'Current folder is not readable. Please change permission for <b>rwxr-xr-x</b> or using command line <b>chmod +r folder_name</b>');
define('AI_STR_012', "<div class="rep">%s malicious signatures known, %s virus signatures and other malicious code. Elapsed: <b>%s</b
>.<br/>Started: %s. Stopped: %s</div> ");
define('AI_STR_013', '<div class="rep">Scanned %s folders and %s files.</div>');
define('AI_STR_014', '<div class="rep" style="color: #0000A0">Attention! Script has performed quick scan. It scans only .html/.js/.php files  in quick scan mode so some of malicious scripts might not be detected. <br>Please launch script from a command line thru SSH to perform full scan.');
define('AI_STR_015', '<div class="sec">Critical</div>');
define('AI_STR_016', 'Shell script signatures detected. Might be a malicious or hacker's script:');
define('AI_STR_017', 'Shell scripts signatures not detected.');
define('AI_STR_018', 'Javascript virus signatures detected:');
define('AI_STR_019', 'Unix executables signatures detected. They might be a malicious binaries or rootkits:');
define('AI_STR_020', 'Suspicious encoded strings, extra .php extention or external includes detected in PHP files. Might be a malicious or hacker's script:');
define('AI_STR_021', 'Might be a malicious or hacker's script:');
define('AI_STR_022', 'Symlinks:');
define('AI_STR_023', 'Hidden files:');
define('AI_STR_024', 'Files might be a part of doorway:');
define('AI_STR_025', 'Doorway folders not detected');
define('AI_STR_026', 'Warnings');
define('AI_STR_027', 'Malicious code in .htaccess (redirect to external server, extention handler replacement or malicious code auto-append):');
define('AI_STR_028', 'Non-PHP file has PHP signature. Check for malicious code:');
define('AI_STR_029', 'This script has black-SEO links or linkfarm. Check if it was installed by your:');
define('AI_STR_030', 'Reading error. Skipped.');
define('AI_STR_031', 'These files have invisible links, might be black-seo stuff:');
define('AI_STR_032', 'List of invisible links:');
define('AI_STR_033', 'Displayed first ');
define('AI_STR_034', 'Folders contained too many .php or .html files. Might be a doorway:');
define('AI_STR_035', 'Suspicious code detected. It's usually used in malicious scrips:');
define('AI_STR_036', 'The following list of files specified in .adirignore has been skipped:');
define('AI_STR_037', 'CMS found:');
define('AI_STR_038', 'Large files (greater than %s! Skipped:');
define('AI_STR_039', 'Files greater than %s not found');
define('AI_STR_040', 'Files recommended to be remove due to security reason:');
define('AI_STR_041', 'Potentially unsafe! Folders which are writable for scripts:');
define('AI_STR_042', 'Writable folders not found');
define('AI_STR_043', 'Memory used: ');
define('AI_STR_044', '<div id="igid" style="display: none;"><div class="sec">Add to ignore list</div><form name="ignore"><textarea name="list" style="width: 600px; height: 400px;"></textarea></form><div class="details">Copy and paste the following list into .aignore to eliminate these files from AI-BOLIT report.</div></div>');
define('AI_STR_045', '<div class="notice"><span class="vir">[!]</span> Ai-BOLIT is working in quick scan mode, only .php, .html, .htaccess files will be checked. Change the following setting 'scan_all_files' => 1 to perform full scanning.</b>. </div>');
define('AI_STR_046', '[x] close window');
define('AI_STR_047', '<div class="offer" id="ofr"><span style="font-size: 15px;"><a href="http://www.revisium.com/ru/order/" target="_blank">
We will protect your website against hackers and viruses with guarantee!</a></span><br/>
<p>We completely remove malicious software and scripts from your website, protect website against hackers, check servers for rootkits and suid-files, teach you how to keep your website secured. <a href="http://www.revisium.com/en/order/">Contact Us</a>');
define('AI_STR_048', '');
define('AI_STR_049', "Disclaimer: I'm not liable to you for any damages, including general, special, incidental or consequential damages arising out of the use or inability to use the script (including but not limited to loss of data or report being rendered inaccurate or failure of the script). There's no warranty for the program. Use at your own risk. ");
define('AI_STR_050', "I'm sincerely appreciate reports for any bugs you may found in the script. Please email me: <a href="mailto:audit@revisium.com">audit@revisium.com</a>.<p> Also I appriciate any reference to the script in your blog or forum posts. Thank you for the link to download page: <a href="http://revisium.com/aibo/">http://revisium.com/aibo/</a>");
define('AI_STR_051', 'Report for ');
define('AI_STR_052', 'Heuristic Analyzer has detected suspicious files. Check if they are malware.');
define('AI_STR_053', 'Function called by reference');
define('AI_STR_054', 'Suspected for obfuscated variables');
define('AI_STR_055', 'Suspected for $GLOBAL array usage');
define('AI_STR_056', 'Abnormal split of string');
define('AI_STR_057', 'Scanning has been done in simple mode. It is strongly recommended to perform scanning in "Expert" mode. See readme.txt for details.');
define('AI_STR_058', 'Phishing pages detected:');
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// This is signatures wrapped into base64. 
$g_DBShe = unserialize(base64_decode("YTozMTI6e2k6MDtzOjg6IlpPQlVHVEVMIjtpOjE7czoxMzoiTWFnZWxhbmdDeWJlciI7aToyO3M6MTM6InByb2ZleG9yLmhlbGwiO2k6MztzOjIwOiI8IS0tQ09PS0lFIFVQREFURS0tPiI7aTo0O3M6OToiLy9yYXN0YS8vIjtpOjU7czo1NzoiJHBhcmFtMm1hc2suIilcPVtcPHFxPlwiXSguKj8pKD89W1w8cXE+XCJdIClbXDxxcT5cIl0vc2llIjtpOjY7czoxOToiKTsgJGkrKykkcmV0Lj1jaHIoJCI7aTo3O3M6Mjc6ImVyZWdfcmVwbGFjZSg8cT4mZW1haWwmPHE+LCI7aTo4O3M6MTM6Il1dKSk7fX1ldmFsKCQiO2k6OTtzOjMwOiJmd3JpdGUoZm9wZW4oZGlybmFtZShfX0ZJTEVfXykiO2k6MTA7czoxMToiQmFieV9EcmFrb24iO2k6MTE7czoyNDoiJGlzZXZhbGZ1bmN0aW9uYXZhaWxhYmxlIjtpOjEyO3M6MTU6Ik5ldEBkZHJlc3MgTWFpbCI7aToxMztzOjM0OiJQYXNzd29yZDo8cz4iLiRfUE9TVFs8cT5wYXNzd2Q8cT5dIjtpOjE0O3M6MTU6IkNyZWF0ZWQgQnkgRU1NQSI7aToxNTtzOjEyOiJHSUY4OUE7PD9waHAiO2k6MTY7czoyODoib1RhdDhEM0RzRTgnJn5oVTA2Q0NINTskZ1lTcSI7aToxNztzOjIwOiIkbWQ1PW1kNSgiJHJhbmRvbSIpOyI7aToxODtzOjY6IjN4cDFyMyI7aToxOTtzOjMyOiIkaW09c3Vic3RyKCR0eCwkcCsyLCRwMi0oJHArMikpOyI7aToyMDtzOjE1OiJOaW5qYVZpcnVzIEhlcmUiO2k6MjE7czoyMToiN1AxdGQrTldsaWFJL2hXa1o0Vlg5IjtpOjIyO3M6MTA6Ijxkb3Q+SXJJc1QiO2k6MjM7czoxMDoibmRyb2l8aHRjXyI7aToyNDtzOjEwOiJhbmRleHxvb2dsIjtpOjI1O3M6MTc6IkhhY2tlZCBCeSBFbkRMZVNzIjtpOjI2O3M6MTc6IigkX1BPU1RbImRpciJdKSk7IjtpOjI3O3M6NTU6IigkaW5kYXRhLCRiNjQ9MSl7aWYoJGI2ND09MSl7JGNkPWJhc2U2NF9kZWNvZGUoJGluZGF0YSkiO2k6Mjg7czo3NToiJGltPXN1YnN0cigkaW0sMCwkaSkuc3Vic3RyKCRpbSwkaTIrMSwkaTQtKCRpMisxKSkuc3Vic3RyKCRpbSwkaTQrMTIsc3RybGVuIjtpOjI5O3M6MTg6Ijw/cGhwIGVjaG8gIiMhISMiOyI7aTozMDtzOjEwOiJQdW5rZXIyQm90IjtpOjMxO3M6MTE6IiRzaDNsbENvbG9yIjtpOjMyO3M6NDc6IkBjaHIoKCRoWyRlWyRvXV08PDQpKygkaFskZVsrKyRvXV0pKTt9fWV2YWwoJGQpIjtpOjMzO3M6MzY6InBwY3xtaWRwfHdpbmRvd3MgY2V8bXRrfGoybWV8c3ltYmlhbiI7aTozNDtzOjQwOiJhYmFjaG98YWJpemRpcmVjdG9yeXxhYm91dHxhY29vbnxhbGV4YW5hIjtpOjM1O3M6NToiWmVkMHgiO2k6MzY7czo4OiJkYXJrbWlueiI7aTozNztzOjEzOiJSZWFMX1B1TmlTaEVyIjtpOjM4O3M6NzoiT29OX0JveSI7aTozOTtzOjIwOiJfX1ZJRVdTVEFURUVOQ1JZUFRFRCI7aTo0MDtzOjY6Ik00bGwzciI7aTo0MTtzOjI1OiJjcmVhdGVGaWxlc0ZvcklucHV0T3V0cHV0IjtpOjQyO3M6ODoiUGFzaGtlbGEiO2k6NDM7czoyMjoiXmNeYV5sXnBeZV5yXl9eZ15lXnJecCI7aTo0NDtzOjE0OiI9PSAiYmluZHNoZWxsIiI7aTo0NTtzOjE1OiJXZWJjb21tYW5kZXIgYXQiO2k6NDY7czoyNToiaXNzZXQoJF9QT1NUWydleGVjZ2F0ZSddKSI7aTo0NztzOjM3OiJmd3JpdGUoJGZwc2V0diwgZ2V0ZW52KCJIVFRQX0NPT0tJRSIpIjtpOjQ4O3M6MjA6Ii1JL3Vzci9sb2NhbC9iYW5kbWluIjtpOjQ5O3M6MjE6IiRPT08wMDAwMDA9dXJsZGVjb2RlKCI7aTo1MDtzOjg6IllFTkkzRVJJIjtpOjUxO3M6MTU6ImxldGFrc2VrYXJhbmcoKSI7aTo1MjtzOjY6ImQzbGV0ZSI7aTo1MztzOjQzOiJmdW5jdGlvbiB1cmxHZXRDb250ZW50cygkdXJsLCAkdGltZW91dCA9IDUpIjtpOjU0O3M6NDY6Im92ZXJmbG93LXk6c2Nyb2xsO1wiPiIuJGxpbmtzLiRodG1sX21mWydib2R5J10iO2k6NTU7czoxNjoiTWFkZSBieSBEZWxvcmVhbiI7aTo1NjtzOjc1OiJpZihlbXB0eSgkX0dFVFsnemlwJ10pIGFuZCBlbXB0eSgkX0dFVFsnZG93bmxvYWQnXSkgJiBlbXB0eSgkX0dFVFsnaW1nJ10pKXsiO2k6NTc7czo2NToic3RyX3JvdDEzKCRiYXNlYVsoJGRpbWVuc2lvbiokZGltZW5zaW9uLTEpIC0gKCRpKiRkaW1lbnNpb24rJGopXSkiO2k6NTg7czo2MDoiUjBsR09EbGhFd0FRQUxNQUFBQUFBUC8vLzV5Y0FNN09ZLy8vblAvL3p2L09uUGYzOS8vLy93QUFBQUFBIjtpOjU5O3M6NDU6InByZWdfbWF0Y2goJyFNSURQfFdBUHxXaW5kb3dzLkNFfFBQQ3xTZXJpZXM2MCI7aTo2MDtzOjQ3OiJwcmVnX21hdGNoKCcvKD88PVJld3JpdGVSdWxlKS4qKD89XFtMXCxSXD0zMDJcXSI7aTo2MTtzOjM3OiIkdXJsID0gJHVybHNbcmFuZCgwLCBjb3VudCgkdXJscyktMSldIjtpOjYyO3M6ODA6IndwX3Bvc3RzIFdIRVJFIHBvc3RfdHlwZSA9ICdwb3N0JyBBTkQgcG9zdF9zdGF0dXMgPSAncHVibGlzaCcgT1JERVIgQlkgYElEYCBERVNDIjtpOjYzO3M6NjU6Imh0dHA6Ly8nLiRfU0VSVkVSWydIVFRQX0hPU1QnXS51cmxkZWNvZGUoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIjtpOjY0O3M6MzY6ImZ3cml0ZSgkZixnZXRfZG93bmxvYWQoJF9HRVRbJ3VybCddKSI7aTo2NTtzOjc0OiIkcGFyYW0geCAkbi5zdWJzdHIgKCRwYXJhbSwgbGVuZ3RoKCRwYXJhbSkgLSBsZW5ndGgoJGNvZGUpJWxlbmd0aCgkcGFyYW0pKSI7aTo2NjtzOjQ3OiIkdGltZV9zdGFydGVkLiRzZWN1cmVfc2Vzc2lvbl91c2VyLnNlc3Npb25faWQoKSI7aTo2NztzOjQ4OiIkdGhpcy0+Ri0+R2V0Q29udHJvbGxlcigkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkiO2k6Njg7czoyMToibHVjaWZmZXJAbHVjaWZmZXIub3JnIjtpOjY5O3M6Mjc6ImJhc2U2NF9kZWNvZGUoJGNvZGVfc2NyaXB0KSI7aTo3MDtzOjIxOiJ1bmxpbmsoJHdyaXRhYmxlX2RpcnMiO2k6NzE7czo0MToiZmlsZV9nZXRfY29udGVudHModHJpbSgkZlskX0dFVFsnaWQnXV0pKTsiO2k6NzI7czoxMDoiQ3liZXN0ZXI5MCI7aTo3MztzOjI3OiIvaG9tZS9teWRpci9lZ2dkcm9wL2ZpbGVzeXMiO2k6NzQ7czoyOToiLS1EQ0NESVIgW2xpbmRleCAkVXNlcigkaSkgMl0iO2k6NzU7czoxMjoidW5iaW5kIFJBVyAtIjtpOjc2O3M6MTE6InB1dGJvdCAkYm90IjtpOjc3O3M6MTM6InByaXZtc2cgJG5pY2siO2k6Nzg7czoyNjoicHJvYyBodHRwOjpDb25uZWN0IHt0b2tlbn0iO2k6Nzk7czo0Mzoic2V0IGdvb2dsZShkYXRhKSBbaHR0cDo6ZGF0YSAkZ29vZ2xlKHBhZ2UpXSI7aTo4MDtzOjIyOiJiaW5kIGpvaW4gLSAqIGdvcF9qb2luIjtpOjgxO3M6MTM6InByaXZtc2cgJGNoYW4iO2k6ODI7czoyNDoicjRhVGMuZFBudEUvZnp0U0YxYkgzUkgwIjtpOjgzO3M6MTA6ImJpbmQgZGNjIC0iO2k6ODQ7czozNToia2lsbCAtQ0hMRCBcJGJvdHBpZCA+L2Rldi9udWxsIDI+JjEiO2k6ODU7czo1MDoicmVnc3ViIC1hbGwgLS0gLCBbc3RyaW5nIHRvbG93ZXIgJG93bmVyXSAiIiBvd25lcnMiO2k6ODY7czozMDoiYmluZCBmaWx0IC0gIlwwMDFBQ1RJT04gKlwwMDEiIjtpOjg3O3M6Mjc6ImF5dSBwcjEgcHIyIHByMyBwcjQgcHI1IHByNiI7aTo4ODtzOjIwOiJzZXQgcHJvdGVjdC10ZWxuZXQgMCI7aTo4OTtzOjMzOiIvdXNyL2xvY2FsL2FwYWNoZS9iaW4vaHR0cGQgLURTU0wiO2k6OTA7czo3NjoiJHRzdTJbcmFuZCgwLGNvdW50KCR0c3UyKSAtIDEpXS4kdHN1MVtyYW5kKDAsY291bnQoJHRzdTEpIC0gMSldLiR0c3UyW3JhbmQoMCI7aTo5MTtzOjE5OiJmb3BlbignL2V0Yy9wYXNzd2QnIjtpOjkyO3M6MTE6ImYwVk1SZ0VCQVFBIjtpOjkzO3M6MzU6IjBkMGEwZDBhNjc2YzZmNjI2MTZjMjAyNDZkNzk1ZjczNmQ3IjtpOjk0O3M6OToiZXRhbGZuaXpnIjtpOjk1O3M6Mzc6IkpIWnBjMmwwWTI5MWJuUWdQU0FrU0ZSVVVGOURUMDlMU1VWZlYiO2k6OTY7czoxMzoiZWRvY2VkXzQ2ZXNhYiI7aTo5NztzOjU6ImUvKi4vIjtpOjk4O3M6Mjg6IkBzZXRjb29raWUoImhpdCIsIDEsIHRpbWUoKSsiO2k6OTk7czo0NjoiZmluZF9kaXJzKCRncmFuZHBhcmVudF9kaXIsICRsZXZlbCwgMSwgJGRpcnMpOyI7aToxMDA7czo2OToiQGNvcHkoJF9GSUxFU1tmaWxlTWFzc11bdG1wX25hbWVdLCRfUE9TVFtwYXRoXS4kX0ZJTEVTW2ZpbGVNYXNzXVtuYW1lIjtpOjEwMTtzOjc2OiJpbnQzMigoKCR6ID4+IDUgJiAweDA3ZmZmZmZmKSBeICR5IDw8IDIpICsgKCgkeSA+PiAzICYgMHgxZmZmZmZmZikgXiAkeiA8PCA0IjtpOjEwMjtzOjExOiJWT0JSQSBHQU5HTyI7aToxMDM7czo1OToiZWNobyB5IDsgc2xlZXAgMSA7IH0gfCB7IHdoaWxlIHJlYWQgOyBkbyBlY2hvIHokUkVQTFk7IGRvbmUiO2k6MTA0O3M6OToiPHN0ZGxpYi5oIjtpOjEwNTtzOjQ1OiJhZGRfZmlsdGVyKCd0aGVfY29udGVudCcsICdfYmxvZ2luZm8nLCAxMDAwMSkiO2k6MTA2O3M6MTc6Iml0c29rbm9wcm9ibGVtYnJvIjtpOjEwNztzOjI4OiJpZiBzZWxmLmhhc2hfdHlwZSA9PSAncHdkdW1wIjtpOjEwODtzOjU5OiIkZnJhbWV3b3JrLnBsdWdpbnMubG9hZCgiI3tycGN0eXBlLmRvd25jYXNlfXJwYyIsIG9wdHMpLnJ1biI7aToxMDk7czo1Nzoic3VicHJvY2Vzcy5Qb3BlbignJXNnZGIgLXAgJWQgLWJhdGNoICVzJyAlIChnZGJfcHJlZml4LCBwIjtpOjExMDtzOjU3OiJhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj1oZWxwLCBwcm9nPSJzY3R1bm5lbCIiO2k6MTExO3M6MzI6InJ1bGVfcmVxID0gcmF3X2lucHV0KCJTb3VyY2VGaXJlIjtpOjExMjtzOjUwOiJvcy5zeXN0ZW0oJ2VjaG8gYWxpYXMgbHM9Ii5scy5iYXNoIiA+PiB+Ly5iYXNocmMnKSI7aToxMTM7czo0MjoiY29ubmVjdGlvbi5zZW5kKCJzaGVsbCAiK3N0cihvcy5nZXRjd2QoKSkrIjtpOjExNDtzOjY3OiJwcmludCgiWyFdIEhvc3Q6ICIgKyBob3N0bmFtZSArICIgbWlnaHQgYmUgZG93biFcblshXSBSZXNwb25zZSBDb2RlIjtpOjExNTtzOjY5OiJkZWYgZGFlbW9uKHN0ZGluPScvZGV2L251bGwnLCBzdGRvdXQ9Jy9kZXYvbnVsbCcsIHN0ZGVycj0nL2Rldi9udWxsJykiO2k6MTE2O3M6ODM6InN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbCA9IFRydWUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VIjtpOjExNztzOjQ3OiJpZihpc3NldCgkX0dFVFsnaG9zdCddKSYmaXNzZXQoJF9HRVRbJ3RpbWUnXSkpeyI7aToxMTg7czoxNToiTklHR0VSUy5OSUdHRVJTIjtpOjExOTtzOjI1OiJIVFRQIGZsb29kIGNvbXBsZXRlIGFmdGVyIjtpOjEyMDtzOjIxOiI4MCAtYiAkMSAtaSBldGgwIC1zIDgiO2k6MTIxO3M6MTM6ImV4cGxvaXRjb29raWUiO2k6MTIyO3M6MjY6InN5c3RlbSgicGhwIC1mIHhwbCAkaG9zdCIpIjtpOjEyMztzOjExOiJzaCBnbyAkMS4keCI7aToxMjQ7czoxMjoiYXo4OHBpeDAwcTk4IjtpOjEyNTtzOjMwOiJ1bmxlc3Mob3BlbihQRkQsJGdfdXBsb2FkX2RiKSkiO2k6MTI2O3M6MTE6Ind3dy50MHMub3JnIjtpOjEyNztzOjM5OiIkdmFsdWUgPX4gcy8lKC4uKS9wYWNrKCdjJyxoZXgoJDEpKS9lZzsiO2k6MTI4O3M6MTQ6IlRoZSBEYXJrIFJhdmVyIjtpOjEyOTtzOjYxOiJRM0psWkdsMElEb2dWVzVrWlhKbmNtOTFibVFnUkdWMmFXd2dKbTVpYzNBN0lDQjhEUW84WVNCb2NtVm1QIjtpOjEzMDtzOjI5OiJ9ZWxzZWlmKCRfR0VUWydwYWdlJ109PSdkZG9zJyI7aToxMzE7czoxNjoieyRfUE9TVFsncm9vdCddfSI7aToxMzI7czozOToiSS9nY1ovdlgwQTEwRERSRGc3RXprL2QrMys4cXZxcVMxSzArQVhZIjtpOjEzMztzOjY0OiJGSjNGa3VQS0ZrVS81M1dFQm1JYWlwa3RuTHdRVzh6NDlkYzFyYmJMcXN3OGU2OWw2dkpNKzMvMTI0eFZuKzdsIjtpOjEzNDtzOjEwMjoiXHUwMDNjXHUwMDY5XHUwMDZkXHUwMDY3XHUwMDIwXHUwMDczXHUwMDcyXHUwMDYzXHUwMDNkXHUwMDIyXHUwMDY4XHUwMDc0XHUwMDc0XHUwMDcwXHUwMDNhXHUwMDJmXHUwMDJmIjtpOjEzNTtzOjU1OiI0NjM4Mzk2MTBjMDAwYjAwODAwMTAwZmZmZmZmZmZmZmZmMjFmOTA0MDEwMDAwMDEwMDJjMDAwIjtpOjEzNjtzOjMwOiJmcmVhZCgkZnAsIGZpbGVzaXplKCRmaWNoZXJvKSkiO2k6MTM3O3M6MjQ6IiRiYXNsaWs9JF9QT1NUWydiYXNsaWsnXSI7aToxMzg7czoxODoicHJvY19vcGVuKCdJSFN0ZWFtIjtpOjEzOTtzOjU2OiJceDMxXHhkYlx4ZjdceGUzXHg1M1x4NDNceDUzXHg2YVx4MDJceDg5XHhlMVx4YjBceDY2XHhjZCI7aToxNDA7czo1ODoiQUFBQUFBQUFNQUF3QUJBQUFBZUFVQUFEUUFBQURzQ1FBQUFBQUFBRFFBSUFBREFDZ0FGd0FVQUFFQSI7aToxNDE7czozMToiJGluaVsndXNlcnMnXSA9IGFycmF5KCdyb290JyA9PiI7aToxNDI7czo1ODoiSEozSGp1dGNrb1JmcFhmOUExelFPMkF3RFJyUmV5OXVHdlRlZXo3OXFBYW8xYTByZ3Vka1prUjhSYSI7aToxNDM7czo1MDoiY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgImh0dHA6Ly8kaG9zdDoyMDgyIikiO2k6MTQ0O3M6NjQ6IjwlPSAiXCIgJiBvU2NyaXB0TmV0LkNvbXB1dGVyTmFtZSAmICJcIiAmIG9TY3JpcHROZXQuVXNlck5hbWUgJT4iO2k6MTQ1O3M6MTA0OiJzcWxDb21tYW5kLlBhcmFtZXRlcnMuQWRkKCgoVGFibGVDZWxsKWRhdGFHcmlkSXRlbS5Db250cm9sc1swXSkuVGV4dCwgU3FsRGJUeXBlLkRlY2ltYWwpLlZhbHVlID0gZGVjaW1hbCI7aToxNDY7czo5MDoiUmVzcG9uc2UuV3JpdGUoIjxicj4oICkgPGEgaHJlZj0/dHlwZT0xJmZpbGU9IiAmIHNlcnZlci5VUkxlbmNvZGUoaXRlbS5wYXRoKSAmICJcPiIgJiBpdGVtIjtpOjE0NztzOjExMToibmV3IEZpbGVTdHJlYW0oUGF0aC5Db21iaW5lKGZpbGVJbmZvLkRpcmVjdG9yeU5hbWUsIFBhdGguR2V0RmlsZU5hbWUoaHR0cFBvc3RlZEZpbGUuRmlsZU5hbWUpKSwgRmlsZU1vZGUuQ3JlYXRlIjtpOjE0ODtzOjcxOiJSZXNwb25zZS5Xcml0ZShTZXJ2ZXIuSHRtbEVuY29kZSh0aGlzLkV4ZWN1dGVDb21tYW5kKHR4dENvbW1hbmQuVGV4dCkpKSI7aToxNDk7czo4MzoiPCU9UmVxdWVzdC5TZXJ2ZXJ2YXJpYWJsZXMoIlNDUklQVF9OQU1FIiklPj90eHRwYXRoPTwlPVJlcXVlc3QuUXVlcnlTdHJpbmcoInR4dHBhdGgiO2k6MTUwO3M6NjA6Im91dHN0ciArPSBzdHJpbmcuRm9ybWF0KCI8YSBocmVmPSc/ZmRpcj17MH0nPnsxfS88L2E+Jm5ic3A7IiI7aToxNTE7czo2MToiUU9pS1dBZ1Y2MTNMdnN0S1krVUI5OEpaVFJHSWhZQmRIdUpDQXdtK1h0aDE2QXdROFg0dFBNY01WWlF0ZSI7aToxNTI7czozMzoicmUuZmluZGFsbChkaXJ0KycoLiopJyxwcm9nbm0pWzBdIjtpOjE1MztzOjQwOiJmaW5kIC8gLW5hbWUgLnNzaCA+ICRkaXIvc3Noa2V5cy9zc2hrZXlzIjtpOjE1NDtzOjYwOiJGU19jaGtfZnVuY19saWJjPSggJChyZWFkZWxmIC1zICRGU19saWJjIHwgZ3JlcCBfY2hrQEAgfCBhd2siO2k6MTU1O3M6NDk6Ikx5ODNNVGczT1dReU1USmtZemhqWW1ZMFpEUm1aREEwTkdFelpERTNaamszWm1JMk4iO2k6MTU2O3M6OTU6IiRmaWxlID0gJF9GSUxFU1siZmlsZW5hbWUiXVsibmFtZSJdOyBlY2hvICI8YSBocmVmPVwiJGZpbGVcIj4kZmlsZTwvYT4iO30gZWxzZSB7ZWNobygiZW1wdHkiKTt9IjtpOjE1NztzOjQ4OiJESjdWSVU3UklDWHI2c0VFVjJjQnRIRFNPZTluVmRwRUdoRW12UlZSTlVSZncxd1EiO2k6MTU4O3M6NTE6Ikx6OF9MeTh2RHg4ZV92Ny03dTd1M3M3dXpzN096cTZ1bnE3ZXJxNnV2cTUtam82dWpuNSI7aToxNTk7czo4MzoiaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFvQUFBQUlDQVlBQUFEQS1tNjJBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVUiO2k6MTYwO3M6NTE6InNlcnZlci48L3A+XHJcbjwvYm9keT48L2h0bWw+IjtleGl0O31pZihwcmVnX21hdGNoKCI7aToxNjE7czo3NzoiJEZjaG1vZCwkRmRhdGEsJE9wdGlvbnMsJEFjdGlvbiwkaGRkYWxsLCRoZGRmcmVlLCRoZGRwcm9jLCR1bmFtZSwkaWRkKTpzaGFyZWQiO2k6MTYyO3M6MTU6InBocCAiLiR3c29fcGF0aCI7aToxNjM7czo2MToiJHByb2Q9InN5Ii4icyIuInRlbSI7JGlkPSRwcm9kKCRfUkVRVUVTVFsncHJvZHVjdCddKTskeydpZCd9OyI7aToxNjQ7czozMDoiQGFzc2VydCgkX1JFUVVFU1RbJ1BIUFNFU1NJRCddIjtpOjE2NTtzOjY4OiJQT1NUIHskcGF0aH17JGNvbm5lY3Rvcn0/Q29tbWFuZD1GaWxlVXBsb2FkJlR5cGU9RmlsZSZDdXJyZW50Rm9sZGVyPSI7aToxNjY7czo4NzoiImFkbWluMS5waHAiLCAiYWRtaW4xLmh0bWwiLCAiYWRtaW4yLnBocCIsICJhZG1pbjIuaHRtbCIsICJ5b25ldGltLnBocCIsICJ5b25ldGltLmh0bWwiIjtpOjE2NztzOjk3OiJAcGF0aDE9KCdhZG1pbi8nLCdhZG1pbmlzdHJhdG9yLycsJ21vZGVyYXRvci8nLCd3ZWJhZG1pbi8nLCdhZG1pbmFyZWEvJywnYmItYWRtaW4vJywnYWRtaW5Mb2dpbi8nIjtpOjE2ODtzOjM2OiJjYXQgJHtibGtsb2dbMl19IHwgZ3JlcCAicm9vdDp4OjA6MCIiO2k6MTY5O3M6NDY6Ij91cmw9Jy4kX1NFUlZFUlsnSFRUUF9IT1NUJ10pLnVubGluayhST09UX0RJUi4iO2k6MTcwO3M6NDY6ImxvbmcgaW50OnQoMCwzKT1yKDAsMyk7LTIxNDc0ODM2NDg7MjE0NzQ4MzY0NzsiO2k6MTcxO3M6NzU6ImNyZWF0ZV9mdW5jdGlvbigiJiQiLiJmdW5jdGlvbiIsIiQiLiJmdW5jdGlvbiA9IGNocihvcmQoJCIuImZ1bmN0aW9uKS0zKTsiKSI7aToxNzI7czo4NjoiZnVuY3Rpb24gZ29vZ2xlX2JvdCgpIHskc1VzZXJBZ2VudCA9IHN0cnRvbG93ZXIoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKTtpZighKHN0cnAiO2k6MTczO3M6NzQ6ImNvcHkoJF9GSUxFU1sndXBrayddWyd0bXBfbmFtZSddLCJray8iLmJhc2VuYW1lKCRfRklMRVNbJ3Vwa2snXVsnbmFtZSddKSk7IjtpOjE3NDtzOjY3OiJmb3IgKCR2YWx1ZSkgeyBzLyYvJmFtcDsvZzsgcy88LyZsdDsvZzsgcy8+LyZndDsvZzsgcy8iLyZxdW90Oy9nOyB9IjtpOjE3NTtzOjQyOiIkZGJfZCA9IEBteXNxbF9zZWxlY3RfZGIoJGRhdGFiYXNlLCRjb24xKTsiO2k6MTc2O3M6NTE6IlNlbmQgdGhpcyBmaWxlOiA8SU5QVVQgTkFNRT0idXNlcmZpbGUiIFRZUEU9ImZpbGUiPiI7aToxNzc7czoyMjoiZndyaXRlICgkZnAsICIkeWF6aSIpOyI7aToxNzg7czo1MjoibWFwIHsgcmVhZF9zaGVsbCgkXykgfSAoJHNlbF9zaGVsbC0+Y2FuX3JlYWQoMC4wMSkpOyI7aToxNzk7czoyNzoiMj4mMSAxPiYyIiA6ICIgMT4mMSAyPiYxIik7IjtpOjE4MDtzOjU5OiJnbG9iYWwgJG15c3FsSGFuZGxlLCAkZGJuYW1lLCAkdGFibGVuYW1lLCAkb2xkX25hbWUsICRuYW1lLCI7aToxODE7czo2OToiX19hbGxfXyA9IFsiU01UUFNlcnZlciIsIkRlYnVnZ2luZ1NlcnZlciIsIlB1cmVQcm94eSIsIk1haWxtYW5Qcm94eSJdIjtpOjE4MjtzOjI5OiJpZiAoaXNfZmlsZSgiL3RtcC8kZWtpbmNpIikpeyI7aToxODM7czozODoiaWYoJGNtZCAhPSAiIikgcHJpbnQgU2hlbGxfRXhlYygkY21kKTsiO2k6MTg0O3M6MjY6IiRjbWQgPSAoJF9SRVFVRVNUWydjbWQnXSk7IjtpOjE4NTtzOjU1OiIkdXBsb2FkZmlsZSA9ICRycGF0aC4iLyIgLiAkX0ZJTEVTWyd1c2VyZmlsZSddWyduYW1lJ107IjtpOjE4NjtzOjMzOiJpZiAoJGZ1bmNhcmcgPX4gL15wb3J0c2NhbiAoLiopLykiO2k6MTg3O3M6NDY6IjwlIEZvciBFYWNoIFZhcnMgSW4gUmVxdWVzdC5TZXJ2ZXJWYXJpYWJsZXMgJT4iO2k6MTg4O3M6NDg6ImlmKCcnPT0oJGRmPUBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSl7ZWNobyI7aToxODk7czozODoiJGZpbGVuYW1lID0gJGJhY2t1cHN0cmluZy4iJGZpbGVuYW1lIjsiO2k6MTkwO3M6NTk6IjwlI0B+Xkh3QUFBQT09QCNAJkRua3dLeC9/Un9VTkAjQCZueDlQZDsoQCNAJnVnY0FBQT09XiN+QCU+IjtpOjE5MTtzOjI0OiIkZnVuY3Rpb24oJF9QT1NUWydjbWQnXSkiO2k6MTkyO3M6Mjk6ImVjaG8gIkZJTEUgVVBMT0FERUQgVE8gJGRleiI7IjtpOjE5MztzOjY4OiJpZiAoIUBpc19saW5rKCRmaWxlKSAmJiAoJHIgPSByZWFscGF0aCgkZmlsZSkpICE9IEZBTFNFKSAkZmlsZSA9ICRyOyI7aToxOTQ7czo4NzoiVU5JT04gU0VMRUNUICcwJyAsICc8PyBzeXN0ZW0oXCRfR0VUW2NwY10pO2V4aXQ7ID8+JyAsMCAsMCAsMCAsMCBJTlRPIE9VVEZJTEUgJyRvdXRmaWxlIjtpOjE5NTtzOjg5OiJpZihtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1siZmljIl1bInRtcF9uYW1lIl0sZ29vZF9saW5rKCIuLyIuJF9GSUxFU1siZmljIl1bIm5hbWUiXSkpKSI7aToxOTY7czo3MjoiY29ubmVjdChTT0NLRVQsIHNvY2thZGRyX2luKCRBUkdWWzFdLCBpbmV0X2F0b24oJEFSR1ZbMF0pKSkgb3IgZGllIHByaW50IjtpOjE5NztzOjUyOiJlbHNlaWYoQGlzX3dyaXRhYmxlKCRGTikgJiYgQGlzX2ZpbGUoJEZOKSkgJHRtcE91dE1GIjtpOjE5ODtzOjY4OiJ3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQsTVlTUUxfQVNTT0MpKSBwcmludF9yKCRyb3cpOyI7aToxOTk7czoxODoiJGZlKCIkY21kICAyPiYxIik7IjtpOjIwMDtzOjY5OiJzZW5kKFNPQ0s1LCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydGEsICRpYWRkcikpIGFuZCAkcGFjb3Rlc3tvfSsrOzsiO2k6MjAxO3M6Njk6In0gZWxzaWYgKCRzZXJ2YXJnID1+IC9eXDooLis/KVwhKC4rPylcQCguKz8pIFBSSVZNU0cgKC4rPykgXDooLispLykgeyI7aToyMDI7czozNzoiZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygic2hlbGxfZXhlYyIpKSI7aToyMDM7czo3MToic3lzdGVtKCIkY21kIDE+IC90bXAvY21kdGVtcCAyPiYxOyBjYXQgL3RtcC9jbWR0ZW1wOyBybSAvdG1wL2NtZHRlbXAiKTsiO2k6MjA0O3M6NTI6IiRfRklMRVNbJ3Byb2JlJ11bJ3NpemUnXSwgJF9GSUxFU1sncHJvYmUnXVsndHlwZSddKTsiO2k6MjA1O3M6ODc6IiRyYTQ0ICA9IHJhbmQoMSw5OTk5OSk7JHNqOTggPSAic2gtJHJhNDQiOyRtbCA9ICIkc2Q5OCI7JGE1ID0gJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddOyI7aToyMDY7czo2NjoibXlzcWxfcXVlcnkoIkNSRUFURSBUQUJMRSBgeHBsb2l0YCAoYHhwbG9pdGAgTE9OR0JMT0IgTk9UIE5VTEwpIik7IjtpOjIwNztzOjY2OiJwYXNzdGhydSggJGJpbmRpci4ibXlzcWxkdW1wIC0tdXNlcj0kVVNFUk5BTUUgLS1wYXNzd29yZD0kUEFTU1dPUkQiO2k6MjA4O3M6ODQ6IjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249dmlld1NjaGVtYSZkYm5hbWU9JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSc+U2NoZW1hPC9hPiI7aToyMDk7czo2MDoiaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkkc2hlbGxPdXQ9c3RyaXBzbGFzaGVzKCRzaGVsbE91dCk7IjtpOjIxMDtzOjQ3OiJpZiAoIWRlZmluZWQkcGFyYW17Y21kfSl7JHBhcmFte2NtZH09ImxzIC1sYSJ9OyI7aToyMTE7czoyMzoic2hlbGxfZXhlYygndW5hbWUgLWEnKTsiO2k6MjEyO3M6OTE6ImlmIChtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZmlsYSddWyd0bXBfbmFtZSddLCAkY3VyZGlyLiIvIi4kX0ZJTEVTWydmaWxhJ11bJ25hbWUnXSkpIHsiO2k6MjEzO3M6ODM6ImlmIChlbXB0eSgkX1BPU1RbJ3dzZXInXSkpIHskd3NlciA9ICJ3aG9pcy5yaXBlLm5ldCI7fSBlbHNlICR3c2VyID0gJF9QT1NUWyd3c2VyJ107IjtpOjIxNDtzOjM2OiI8JT1lbnYucXVlcnlIYXNodGFibGUoInVzZXIubmFtZSIpJT4iO2k6MjE1O3M6NjE6IlB5U3lzdGVtU3RhdGUuaW5pdGlhbGl6ZShTeXN0ZW0uZ2V0UHJvcGVydGllcygpLCBudWxsLCBhcmd2KTsiO2k6MjE2O3M6MzU6ImlmKCEkd2hvYW1pKSR3aG9hbWk9ZXhlYygid2hvYW1pIik7IjtpOjIxNztzOjM2OiJzaGVsbF9leGVjKCRfUE9TVFsnY21kJ10gLiAiIDI+JjEiKTsiO2k6MjE4O3M6NTM6IlBuVmxrV002MyFAI0AmZEt4fm5NRFdNfkR/L0Vzbn54fzZEQCNAJlB+fiw/blksV1B7UG9qIjtpOjIxOTtzOjI1OiIhJF9SRVFVRVNUWyJjOTlzaF9zdXJsIl0pIjtpOjIyMDtzOjYwOiIoZXJlZygnXltbOmJsYW5rOl1dKmNkW1s6Ymxhbms6XV0qJCcsICRfUkVRVUVTVFsnY29tbWFuZCddKSkiO2k6MjIxO3M6MjM6IiRsb2dpbj1AcG9zaXhfZ2V0dWlkKCk7IjtpOjIyMjtzOjM4OiJzeXN0ZW0oInVuc2V0IEhJU1RGSUxFOyB1bnNldCBTQVZFSElTVCI7aToyMjM7czozMToiPEhUTUw+PEhFQUQ+PFRJVExFPmNnaS1zaGVsbC5weSI7aToyMjQ7czozNjoiZXhlY2woIi9iaW4vc2giLCJzaCIsIi1pIiwoY2hhciopMCk7IjtpOjIyNTtzOjI2OiJuY2Z0cHB1dCAtdSAkZnRwX3VzZXJfbmFtZSI7aToyMjY7czoyOToiJGFbaGl0c10nKTsgXHJcbiNlbmRxdWVyeVxyXG4iO2k6MjI3O3M6MjM6Inske3Bhc3N0aHJ1KCRjbWQpfX08YnI+IjtpOjIyODtzOjQyOiIkYmFja2Rvb3ItPmNjb3B5KCRjZmljaGllciwkY2Rlc3RpbmF0aW9uKTsiO2k6MjI5O3M6NTk6IiRpemlubGVyMj1zdWJzdHIoYmFzZV9jb252ZXJ0KEBmaWxlcGVybXMoJGZuYW1lKSwxMCw4KSwtNCk7IjtpOjIzMDtzOjUwOiJmb3IoOyRwYWRkcj1hY2NlcHQoQ0xJRU5ULCBTRVJWRVIpO2Nsb3NlIENMSUVOVCkgeyI7aToyMzE7czo4OiJBc21vZGV1cyI7aToyMzI7czozNzoicGFzc3RocnUoZ2V0ZW52KCJIVFRQX0FDQ0VQVF9MQU5HVUFHRSI7aToyMzM7czozOToiJF9fX189QGd6aW5mbGF0ZSgkX19fXykpe2lmKGlzc2V0KCRfUE9TIjtpOjIzNDtzOjg1OiIkc3Viaj11cmxkZWNvZGUoJF9HRVRbJ3N1J10pOyRib2R5PXVybGRlY29kZSgkX0dFVFsnYm8nXSk7JHNkcz11cmxkZWNvZGUoJF9HRVRbJ3NkJ10pIjtpOjIzNTtzOjMyOiIka2E9Jzw/Ly9CUkUnOyRrYWthPSRrYS4nQUNLLy8/PiI7aToyMzY7czozMToiQ2F1dGFtIGZpc2llcmVsZSBkZSBjb25maWd1cmFyZSI7aToyMzc7czoxMjoiQlJVVEVGT1JDSU5HIjtpOjIzODtzOjE4OiJwd2QgPiBHZW5lcmFzaS5kaXIiO2k6MjM5O3M6NTY6InhoIC1zICIvdXNyL2xvY2FsL2FwYWNoZS9zYmluL2h0dHBkIC1EU1NMIiAuL2h0dHBkIC1tICQxIjtpOjI0MDtzOjQ4OiIkYT0oc3Vic3RyKHVybGVuY29kZShwcmludF9yKGFycmF5KCksMSkpLDUsMSkuYykiO2k6MjQxO3M6MjE6IiFAJF9DT09LSUVbJHNlc3NkdF9rXSI7aToyNDI7czo1ODoiU0VMRUNUIDEgRlJPTSBteXNxbC51c2VyIFdIRVJFIGNvbmNhdChgdXNlcmAsICdAJywgYGhvc3RgKSI7aToyNDM7czo0NDoiY29weSgkX0ZJTEVTW3hdW3RtcF9uYW1lXSwkX0ZJTEVTW3hdW25hbWVdKSkiO2k6MjQ0O3M6NTQ6IiRNZXNzYWdlU3ViamVjdCA9IGJhc2U2NF9kZWNvZGUoJF9QT1NUWyJtc2dzdWJqZWN0Il0pOyI7aToyNDU7czoxNzoicmVuYW1lKCJ3c28ucGhwIiwiO2k6MjQ2O3M6ODg6IiRyZWRpcmVjdFVSTD0naHR0cDovLycuJHJTaXRlLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddO2lmKGlzc2V0KCRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSkiO2k6MjQ3O3M6NDA6IiRmaWxlcGF0aD1AcmVhbHBhdGgoJF9QT1NUWydmaWxlcGF0aCddKTsiO2k6MjQ4O3M6NDI6Ildvcmtlcl9HZXRSZXBseUNvZGUoJG9wRGF0YVsncmVjdkJ1ZmZlciddKSI7aToyNDk7czoyMToiRmFUYUxpc1RpQ3pfRnggRngyOVNoIjtpOjI1MDtzOjEzOiJ3NGNrMW5nIHNoZWxsIjtpOjI1MTtzOjIyOiJwcml2YXRlIFNoZWxsIGJ5IG00cmNvIjtpOjI1MjtzOjIwOiJTaGVsbCBieSBNYXdhcl9IaXRhbSI7aToyNTM7czoxMjoiUEhQU0hFTEwuUEhQIjtpOjI1NDtzOjQ2OiJyb3VuZCgwKzk4MzAuNCs5ODMwLjQrOTgzMC40Kzk4MzAuNCs5ODMwLjQpKT09IjtpOjI1NTtzOjExMDoidnp2NmQraU92dGtkMzhUbEh1OG1RYXZYZG5KQ2JwUWNwWGhOYmJMbVpPcU1vcERaZU5hbGIrVktsZWRoQ2pwVkFNUVNRbnhWSUVDUUFmTHU1S2dMbXdCNmVoUVFHTlNCWWpwZzlnNUdkQmloWG8iO2k6MjU2O3M6NjU6ImlmIChlcmVnKCdeW1s6Ymxhbms6XV0qY2RbWzpibGFuazpdXSsoW147XSspJCcsICRjb21tYW5kLCAkcmVncykpIjtpOjI1NztzOjc2OiJMUzBnUkhWdGNETmtJR0o1SUZCcGNuVnNhVzR1VUVoUUlGZGxZbk5vTTJ4c0lIWXhMakFnWXpCa1pXUWdZbmtnY2pCa2NqRWdPa3c9IjtpOjI1ODtzOjE0MjoiNWpiMjBpS1c5eUlITjBjbWx6ZEhJb0pISmxabVZ5WlhJc0ltRndiM0owSWlrZ2IzSWdjM1J5YVhOMGNpZ2tjbVZtWlhKbGNpd2libWxuYldFaUtTQnZjaUJ6ZEhKcGMzUnlLQ1J5WldabGNtVnlMQ0ozWldKaGJIUmhJaWtnYjNJZ2MzUnlhWE4wY2lnayI7aToyNTk7czoyMToiZXZhbChiYXNlNjRfZGVjb2RlKCRfIjtpOjI2MDtzOjQ4OiJ3c29FeCgndGFyIGNmenYgJyAuIGVzY2FwZXNoZWxsYXJnKCRfUE9TVFsncDInXSkiO2k6MjYxO3M6ODY6Ijxub2JyPjxiPiRjZGlyJGNmaWxlPC9iPiAoIi4kZmlsZVsic2l6ZV9zdHIiXS4iKTwvbm9icj48L3RkPjwvdHI+PGZvcm0gbmFtZT1jdXJyX2ZpbGU+IjtpOjI2MjtzOjE2OiJDb250ZW50LVR5cGU6ICRfIjtpOjI2MztzOjE0MToiPC90ZD48dGQgaWQ9ZmE+WyA8YSB0aXRsZT1cIkhvbWU6ICciLmh0bWxzcGVjaWFsY2hhcnMoc3RyX3JlcGxhY2UoIlwiLCAkc2VwLCBnZXRjd2QoKSkpLiInLlwiIGlkPWZhIGhyZWY9XCJqYXZhc2NyaXB0OlZpZXdEaXIoJyIucmF3dXJsZW5jb2RlIjtpOjI2NDtzOjEwNzoiQ1Fib0dsN2YreGNBeVV5c3hiNW1LUzZrQVdzblJMZFMrc0tnR29aV2Rzd0xGSlpWOHRWelhzcSttZVNQSE14VEkzblNVQjRmSjJ2UjNyM09udlh0TkFxTjZ3bi9EdFRUaStDdTFVT0p3TkwiO2k6MjY1O3M6Mzk6IldTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSI7aToyNjY7czoxMjY6IlgxTkZVMU5KVDA1YkozUjRkR0YxZEdocGJpZGRJRDBnZEhKMVpUc05DaUFnSUNCcFppQW9KRjlRVDFOVVd5ZHliU2RkS1NCN0RRb2dJQ0FnSUNCelpYUmpiMjlyYVdVb0ozUjRkR0YxZEdoZkp5NGtjbTFuY205MWNDd2diVyI7aToyNjc7czozOToiSkAhVnJAKiZSSFJ3fkpMdy5HfHhsaG5MSn4/MS5id09ieGJQfCFWIjtpOjI2ODtzOjExOiJ6ZWhpcmhhY2tlciI7aToyNjk7czoxNjE6IignIicsJyZxdW90OycsJGZuKSkuJyI7ZG9jdW1lbnQubGlzdC5zdWJtaXQoKTtcJz4nLmh0bWxzcGVjaWFsY2hhcnMoc3RybGVuKCRmbik+Zm9ybWF0P3N1YnN0cigkZm4sMCxmb3JtYXQtMykuJy4uLic6JGZuKS4nPC9hPicuc3RyX3JlcGVhdCgnICcsZm9ybWF0LXN0cmxlbigkZm4pIjtpOjI3MDtzOjE2MDoicHJpbnQoKGlzX3JlYWRhYmxlKCRmKSAmJiBpc193cml0ZWFibGUoJGYpKT8iPHRyPjx0ZD4iLncoMSkuYigiUiIudygxKS5mb250KCdyZWQnLCdSVycsMykpLncoMSk6KCgoaXNfcmVhZGFibGUoJGYpKT8iPHRyPjx0ZD4iLncoMSkuYigiUiIpLncoNCk6IiIpLigoaXNfd3JpdGFibCI7aToyNzE7czo3MzoiUjBsR09EbGhGQUFVQUtJQUFBQUFBUC8vLzkzZDNjREF3SWFHaGdRRUJQLy8vd0FBQUNINUJBRUFBQVlBTEFBQUFBQVVBQlFBQSI7aToyNzI7czo5MDoiPCU9UmVxdWVzdC5TZXJ2ZXJWYXJpYWJsZXMoInNjcmlwdF9uYW1lIiklPj9Gb2xkZXJQYXRoPTwlPVNlcnZlci5VUkxQYXRoRW5jb2RlKEZvbGRlci5Ecml2IjtpOjI3MztzOjExMzoibTkxZEN3Z0pHVnZkWFFwT3cwS2MyVnNaV04wS0NSeWIzVjBJRDBnSkhKcGJpd2dkVzVrWldZc0lDUmxiM1YwSUQwZ0pISnBiaXdnTVRJd0tUc05DbWxtSUNnaEpISnZkWFFnSUNZbUlDQWhKR1Z2ZFgiO2k6Mjc0O3M6Mzg6IlJvb3RTaGVsbCEnKTtzZWxmLmxvY2F0aW9uLmhyZWY9J2h0dHA6IjtpOjI3NTtzOjc2OiJhIGhyZWY9Ijw/ZWNobyAiJGZpc3Rpay5waHA/ZGl6aW49JGRpemluLy4uLyI/PiIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uIjtpOjI3NjtzOjEyNzoiQ0IyYVRacElERXdNalF0RFFvakxTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExRMEtJM0psY1hWcCI7aToyNzc7czozMToicygpLmcoKS5zKCkucygpLmcoKS5zKCkucygpLmcoKSI7aToyNzg7czoxMjI6Im50KShkaXNrX3RvdGFsX3NwYWNlKGdldGN3ZCgpKS8oMTAyNCoxMDI0KSkgLiAiTWIgIiAuICJGcmVlIHNwYWNlICIgLiAoaW50KShkaXNrX2ZyZWVfc3BhY2UoZ2V0Y3dkKCkpLygxMDI0KjEwMjQpKSAuICJNYiA8IjtpOjI3OTtzOjM3OiJrbGFzdmF5di5hc3A/eWVuaWRvc3lhPTwlPWFrdGlma2xhcyU+IjtpOjI4MDtzOjQ0OiJXVCtQe35FVzBFclBPdG5VQCNAJl5sXnNQMWxkbnlAI0AmbnNrK3IwLEdUKyI7aToyODE7czoxMTU6Im1wdHkoJF9QT1NUWyd1ciddKSkgJG1vZGUgfD0gMDQwMDsgaWYgKCFlbXB0eSgkX1BPU1RbJ3V3J10pKSAkbW9kZSB8PSAwMjAwOyBpZiAoIWVtcHR5KCRfUE9TVFsndXgnXSkpICRtb2RlIHw9IDAxMDAiO2k6MjgyO3M6MTA1OiIvMHRWU0cvU3V2MFVyL2hhVVlBZG4zak1Rd2Jib2NHZmZBZUMyOUJOOXRtQmlKZFYxbGsrallEVTkyQzk0amR0RGlmK3hPWWpHNkNMaHgzMVVvOXg5L2VBV2dzQks2MGtLMm1Md3F6cWQiO2k6MjgzO3M6ODY6ImNybGYuJ3VubGluaygkbmFtZSk7Jy4kY3JsZi4ncmVuYW1lKCJ+Ii4kbmFtZSwgJG5hbWUpOycuJGNybGYuJ3VubGluaygiZ3JwX3JlcGFpci5waHAiIjtpOjI4NDtzOjE1OiJEWF9IZWFkZXJfZHJhd24iO2k6Mjg1O3M6MzA6IltBdjRiZkNZQ1MseEtXayQrVGtVUyx4bkdkQXhbTyI7aToyODY7czoxMTE6IkJEQVFrSkNRd0xEQmdORFJneUlSd2hNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpML3dBQVJDQUFRQUJBREFTSUFBaEVCQSI7aToyODc7czoxMToiY3RzaGVsbC5waHAiO2k6Mjg4O3M6NDc6IkV4ZWN1dGVkIGNvbW1hbmQ6IDxiPjxmb250IGNvbG9yPSNkY2RjZGM+WyRjbWRdIjtpOjI4OTtzOjEzOiJXU0NSSVBULlNIRUxMIjtpOjI5MDtzOjc6ImNhc3VzMTUiO2k6MjkxO3M6NzY6IlIwbEdPRGxoSmdBV0FJQUFBQUFBQVAvLy95SDVCQVVVQUFFQUxBQUFBQUFtQUJZQUFBSXZqSStweSswUEY0aTBnVnZ6dVZ4WERub1EiO2k6MjkyO3M6MTc6ImFkbWluQHNweWdydXAub3JnIjtpOjI5MztzOjE0OiJ0ZW1wX3I1N190YWJsZSI7aToyOTQ7czoxNzoiJGM5OXNoX3VwZGF0ZWZ1cmwiO2k6Mjk1O3M6OToiQnkgUHN5Y2gwIjtpOjI5NjtzOjE2OiJjOTlmdHBicnV0ZWNoZWNrIjtpOjI5NztzOjg0OiI8dGV4dGFyZWEgbmFtZT1cInBocGV2XCIgcm93cz1cIjVcIiBjb2xzPVwiMTUwXCI+Ii5AJF9QT1NUWydwaHBldiddLiI8L3RleHRhcmVhPjxicj4iO2k6Mjk4O3M6OTQ6IiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDQwKSA/KCgkcGVybXMgJiAweDA4MDApID8gJ3MnIDogJ3gnICkgOigoJHBlcm1zICYgMHgwODAwKSA/ICdTJyA6ICctJykiO2k6Mjk5O3M6MzA6IiRyYW5kX3dyaXRhYmxlX2ZvbGRlcl9mdWxscGF0aCI7aTozMDA7czoxMDoiRHIuYWJvbGFsaCI7aTozMDE7czo2OiJLIUxMM3IiO2k6MzAyO3M6NzoiTXJIYXplbSI7aTozMDM7czoxMDoiQzBkZXJ6LmNvbSI7aTozMDQ7czoyNjoiT0xCOlBST0RVQ1Q6T05MSU5FX0JBTktJTkciO2k6MzA1O3M6MTA6IkJZIE1NTkJPQloiO2k6MzA2O3M6MTY6IkNvbm5lY3RCYWNrU2hlbGwiO2k6MzA3O3M6ODoiSGFja2VhZG8iO2k6MzA4O3M6NToiZDNiflgiO2k6MzA5O3M6NToicmFodWkiO2k6MzEwO3M6OToiTXIuSGlUbWFuIjtpOjMxMTtzOjEwOiJNcmxvb2wuZXhlIjt9"));
$gX_DBShe = unserialize(base64_decode("YTo0OTp7aTowO3M6MTU6IkRhcmtDcmV3RnJpZW5kcyI7aToxO3M6MTE6IlNpbUF0dGFja2VyIjtpOjI7czoxMjoiXVtyb3VuZCgwKV0oIjtpOjM7czozMjoiPCEtLSNleGVjIGNtZD0iJEhUVFBfQUNDRVBUIiAtLT4iO2k6NDtzOjQ6IkFtIXIiO2k6NTtzOjU6IjZlc2FiIjtpOjY7czo4OiJbY29kZXJ6XSI7aTo3O3M6MTE6IlsgUGhwcm94eSBdIjtpOjg7czo2OiJTcGFtZXIiO2k6OTtzOjc6IkRlZmFjZXIiO2k6MTA7czoxMToiRGV2aWxIYWNrZXIiO2k6MTE7czo3OiJ3ZWJyMDB0IjtpOjEyO3M6NjoiazBkLmNjIjtpOjEzO3M6NTU6ImlzX2NhbGxhYmxlKCdleGVjJykgYW5kICFpbl9hcnJheSgnZXhlYycsICRkaXNhYmxlZnVuY3MiO2k6MTQ7czoxNDoiJEdMT0JBTFNbJ19fX18iO2k6MTU7czoyMzoiaXNfd3JpdGFibGUoIi92YXIvdG1wIikiO2k6MTY7czoyMzoiZXZhbChmaWxlX2dldF9jb250ZW50cygiO2k6MTc7czozNDoiL3Byb2Mvc3lzL2tlcm5lbC95YW1hL3B0cmFjZV9zY29wZSI7aToxODtzOjQ5OiInaHR0cGQuY29uZicsJ3Zob3N0cy5jb25mJywnY2ZnLnBocCcsJ2NvbmZpZy5waHAnIjtpOjE5O3M6NzoiYnIwd3MzciI7aToyMDtzOjc6Im1pbHcwcm0iO2k6MjE7czozNjoiaW5jbHVkZSgkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pIjtpOjIyO3M6MTA6ImRpciAvT0cgL1giO2k6MjM7czozNDoiaWYgKCgkcGVybXMgJiAweEMwMDApID09IDB4QzAwMCkgeyI7aToyNDtzOjU5OiJpZiAoaXNfY2FsbGFibGUoImV4ZWMiKSBhbmQgIWluX2FycmF5KCJleGVjIiwkZGlzYWJsZWZ1bmMpKSI7aToyNTtzOjQwOiJzZXRjb29raWUoICJteXNxbF93ZWJfYWRtaW5fdXNlcm5hbWUiICk7IjtpOjI2O3M6MTk6InByaW50ICJTcGFtZWQnPjxicj4iO2k6Mjc7czo1MToiJG1lc3NhZ2UgPSBlcmVnX3JlcGxhY2UoIiU1QyUyMiIsICIlMjIiLCAkbWVzc2FnZSk7IjtpOjI4O3M6MTU6Ii9ldGMvbmFtZWQuY29uZiI7aToyOTtzOjEwOiIvZXRjL2h0dHBkIjtpOjMwO3M6MTE6Ii92YXIvY3BhbmVsIjtpOjMxO3M6MTg6Ik5lIHVkYWxvcyB6YWdydXppdCI7aTozMjtzOjE0OiJleGVjKCJybSAtciAtZiI7aTozMztzOjg6IlNoZWxsIE9rIjtpOjM0O3M6MTE6Im15c2hlbGxleGVjIjtpOjM1O3M6OToicm9vdHNoZWxsIjtpOjM2O3M6OToiYW50aXNoZWxsIjtpOjM3O3M6MTI6InI1N3NoZWxsLnBocCI7aTozODtzOjExOiJMb2N1czdTaGVsbCI7aTozOTtzOjExOiJTdG9ybTdTaGVsbCI7aTo0MDtzOjg6Ik4zdHNoZWxsIjtpOjQxO3M6MTE6ImRldmlselNoZWxsIjtpOjQyO3M6MTI6IldlYiBTaGVsbCBieSI7aTo0MztzOjc6IkZ4Yzk5c2giO2k6NDQ7czo4OiJjaWhzaGVsbCI7aTo0NTtzOjc6Ik5URGFkZHkiO2k6NDY7czo4OiJyNTdzaGVsbCI7aTo0NztzOjg6ImM5OXNoZWxsIjtpOjQ4O3M6NjI6IjxkaXYgY2xhc3M9ImJsb2NrIGJ0eXBlMSI+PGRpdiBjbGFzcz0iZHRvcCI+PGRpdiBjbGFzcz0iZGJ0bSI+Ijt9"));
$g_FlexDBShe = unserialize(base64_decode("YToyNzY6e2k6MDtzOjc5OiJSZXdyaXRlUnVsZVxzK1xeXChcLlwqXCksXChcLlwqXClcJFxzK1wkMlwucGhwXD9yZXdyaXRlX3BhcmFtcz1cJDEmcGFnZV91cmw9XCQyIjtpOjE7czo1ODoiZnVuY3Rpb25ccytyZWFkX3BpY1woXHMqXCRBXHMqXClccyp7XHMqXCRhXHMqPVxzKlwkX1NFUlZFUiI7aToyO3M6NTI6ImZpbGVtdGltZVwoXCRiYXNlcGF0aFxzKlwuXHMqWyciXS9jb25maWd1cmF0aW9uXC5waHAiO2k6MztzOjYyOiJsaXN0XHMqXChccypcJGhvc3RccyosXHMqXCRwb3J0XHMqLFxzKlwkc2l6ZVxzKixccypcJGV4ZWNfdGltZSI7aTo0O3M6NDE6Imxpc3RpbmdfcGFnZVwoXHMqbm90aWNlXChccypbJyJdc3ltbGlua2VkIjtpOjU7czozNToibWFrZV9kaXJfYW5kX2ZpbGVcKFxzKlwkcGF0aF9qb29tbGEiO2k6NjtzOjIxOiJmdW5jdGlvblxzK2luRGlhcGFzb24iO2k6NztzOjQxOiImJlxzKiFlbXB0eVwoXHMqXCRfQ09PS0lFXFtbJyJdZmlsbFsnIl1cXSI7aTo4O3M6MzM6ImZpbGVfZXhpc3RzXHMqXCgqXHMqWyciXS92YXIvdG1wLyI7aTo5O3M6NTk6InN0cl9yZXBsYWNlXChcJGZpbmRccyosXHMqXCRmaW5kXHMqXC5ccypcJGh0bWxccyosXHMqXCR0ZXh0IjtpOjEwO3M6MzY6IlwkZGF0YW1hc2lpPWRhdGVcKCJEIE0gZCwgWSBnOmkgYSJcKSI7aToxMTtzOjM0OiJcJGFkZGRhdGU9ZGF0ZVwoIkQgTSBkLCBZIGc6aSBhIlwpIjtpOjEyO3M6MTg6ImZ1Y2tccyt5b3VyXHMrbWFtYSI7aToxMztzOjUwOiJHb29nbGVib3RbJyJdezAsMX1ccypcKVwpe2VjaG9ccytmaWxlX2dldF9jb250ZW50cyI7aToxNDtzOjM3OiJbJyJdezAsMX0uYy5bJyJdezAsMX1cLnN1YnN0clwoXCR2YmcsIjtpOjE1O3M6Mjg6ImFycmF5XChcJGVuLFwkZXMsXCRlZixcJGVsXCkiO2k6MTY7czo0NjoibG9jXHMqPVxzKlsnIl17MCwxfTxcP2VjaG9ccytcJHJlZGlyZWN0O1xzKlw/PiI7aToxNztzOjE3OiJLYXphbi9pbmRleFwuaHRtbCI7aToxODtzOjE4OiI9PTBcKXtqc29uUXVpdFwoXCQiO2k6MTk7czo0MDoiQHN0cmVhbV9zb2NrZXRfY2xpZW50XChbJyJdezAsMX10Y3A6Ly9cJCI7aToyMDtzOjMwOiI6OlsnIl1cLnBocHZlcnNpb25cKFwpXC5bJyJdOjoiO2k6MjE7czozODoicHJlZ19yZXBsYWNlXChbJyJdLlVURlxcLTg6XCguXCpcKS5Vc2UiO2k6MjI7czoxMzoiIj0+XCR7XCR7IlxceCI7aToyMztzOjQyOiJmc29ja29wZW5cKFwkbVxbMFxdLFwkbVxbMTBcXSxcJF8sXCRfXyxcJG0iO2k6MjQ7czozMzoiZVZhTFwoXHMqdHJpbVwoXHMqYmFTZTY0X2RlQ29EZVwoIjtpOjI1O3M6NDY6ImVjaG9ccyptZDVcKFwkX1BPU1RcW1snIl17MCwxfWNoZWNrWyciXXswLDF9XF0iO2k6MjY7czoyNToiaW1nIHNyYz1bJyJdb3BlcmEwMDBcLnBuZyI7aToyNztzOjM3OiJmdW5jdGlvbiByZWxvYWRcKFwpe2hlYWRlclwoIkxvY2F0aW9uIjtpOjI4O3M6NDA6InN1YnN0cl9jb3VudFwoZ2V0ZW52XChcXFsnIl1IVFRQX1JFRkVSRVIiO2k6Mjk7czozMToid2ViaVwucnUvd2ViaV9maWxlcy9waHBfbGlibWFpbCI7aTozMDtzOjY1OiJjaHIyPVwoXChlbmMyJjE1XCk8PDRcKVx8XChlbmMzPj4yXCk7Y2hyMz1cKFwoZW5jMyYzXCk8PDZcKVx8ZW5jNCI7aTozMTtzOjEyOiJSRVJFRkVSX1BUVEgiO2k6MzI7czo5OiJ0c29oX3B0dGgiO2k6MzM7czoxNToidG5lZ2FfcmVzdV9wdHRoIjtpOjM0O3M6NDc6Im1tY3J5cHRcKFwkZGF0YSwgXCRrZXksIFwkaXYsIFwkZGVjcnlwdCA9IEZBTFNFIjtpOjM1O3M6MTM6ImZvcG9cLmNvbVwuYXIiO2k6MzY7czoyMDoic3ByYXZvY2huaWstbm9tZXJvdi0iO2k6Mzc7czoxODoiaWNxLWRseWEtdGVsZWZvbmEtIjtpOjM4O3M6MTc6InRlbGVmb25uYXlhLWJhemEtIjtpOjM5O3M6MjY6InNsZXNoXCtzbGVzaFwrZG9tZW5cK3BvaW50IjtpOjQwO3M6MjI6InNyYz0iZmlsZXNfc2l0ZS9qc1wuanMiO2k6NDE7czo5NToiXCR0PVwkcztccypcJG9ccyo9XHMqWyciXVsnIl07XHMqZm9yXChcJGk9MDtcJGk8c3RybGVuXChcJHRcKTtcJGlcK1wrXCl7XHMqXCRvXHMqXC49XHMqXCR0e1wkaX0iO2k6NDI7czo4MDoiV0JTX0RJUlxzKlwuXHMqWyciXXswLDF9dGVtcC9bJyJdezAsMX1ccypcLlxzKlwkYWN0aXZlRmlsZVxzKlwuXHMqWyciXXswLDF9XC50bXAiO2k6NDM7czo1MToiQCptYWlsXChcJG1vc0NvbmZpZ19tYWlsZnJvbSwgXCRtb3NDb25maWdfbGl2ZV9zaXRlIjtpOjQ0O3M6NjY6IlwkW2EtekEtWjAtOV9dKz8vXCouezEsMTB9XCovXHMqXC5ccypcJFthLXpBLVowLTlfXSs/L1wqLnsxLDEwfVwqLyI7aTo0NTtzOjE3OiJAXCRfUE9TVFxbXChjaHJcKCI7aTo0NjtzOjMzOiI8XD9waHBccytyZW5hbWVcKFsnIl13c29cLnBocFsnIl0iO2k6NDc7czo1MjoiXCRzdHI9WyciXXswLDF9PGgxPjQwM1xzK0ZvcmJpZGRlbjwvaDE+PCEtLVxzKnRva2VuOiI7aTo0ODtzOjUwOiJjaHVua19zcGxpdFwoYmFzZTY0X2VuY29kZVwoZnJlYWRcKFwke1wke1snIl17MCwxfSI7aTo0OTtzOjYwOiJpbmlfZ2V0XChbJyJdezAsMX1maWx0ZXJcLmRlZmF1bHRfZmxhZ3NbJyJdezAsMX1cKVwpe2ZvcmVhY2giO2k6NTA7czozODoiZmlsZV9nZXRfY29udGVudHNcKHRyaW1cKFwkZlxbXCRfR0VUXFsiO2k6NTE7czoxMzM6Im1haWxcKFwkYXJyXFtbJyJdezAsMX10b1snIl17MCwxfVxdLFwkYXJyXFtbJyJdezAsMX1zdWJqWyciXXswLDF9XF0sXCRhcnJcW1snIl17MCwxfW1zZ1snIl17MCwxfVxdLFwkYXJyXFtbJyJdezAsMX1oZWFkWyciXXswLDF9XF1cKTsiO2k6NTI7czo1NDoiaWZcKGlzc2V0XChcJF9QT1NUXFtbJyJdezAsMX1tc2dzdWJqZWN0WyciXXswLDF9XF1cKVwpIjtpOjUzO3M6MzU6ImJhc2U2NF9kZWNvZGVcKFwkX1BPU1RcW1snIl17MCwxfV8tIjtpOjU0O3M6NTM6InJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uXChccypbJyJdezAsMX1yZWFkX2Fuc19jb2RlIjtpOjU1O3M6NzU6IlwkcGFyYW1ccyo9XHMqXCRwYXJhbVxzKnhccypcJG5cLnN1YnN0clxzKlwoXCRwYXJhbVxzKixccypsZW5ndGhcKFwkcGFyYW1cKSI7aTo1NjtzOjI0OiJiYXNlWyciXXswLDF9XC5cKDMyXCoyXCkiO2k6NTc7czo2NjoiaWZcKEBcJHZhcnNcKGdldF9tYWdpY19xdW90ZXNfZ3BjXChcKVxzKlw/XHMqc3RyaXBzbGFzaGVzXChcJHVyaVwpIjtpOjU4O3M6Mjk6IlwpXF07fWlmXChpc3NldFwoXCRfU0VSVkVSXFtfIjtpOjU5O3M6NDI6ImlmXChlbXB0eVwoXCRfQ09PS0lFXFtbJyJdeFsnIl1cXVwpXCl7ZWNobyI7aTo2MDtzOjUyOiJpc193cml0YWJsZVwoXCRkaXJcLlsnIl13cC1pbmNsdWRlcy92ZXJzaW9uXC5waHBbJyJdIjtpOjYxO3M6MjE6IkFwcGxlXHMrU3BBbVxzK1JlWnVsVCI7aTo2MjtzOjE3OiIjXHMqc3RlYWx0aFxzKmJvdCI7aTo2MztzOjIyOiIjXHMqc2VjdXJpdHlzcGFjZVwuY29tIjtpOjY0O3M6Mjg6IlVSTD08XD9lY2hvXHMrXCRpbmRleDtccytcPz4iO2k6NjU7czo5NToiPHNjcmlwdFxzK3R5cGU9WyciXXswLDF9dGV4dC9qYXZhc2NyaXB0WyciXXswLDF9XHMrc3JjPVsnIl17MCwxfWpxdWVyeS11XC5qc1snIl17MCwxfT48L3NjcmlwdD4iO2k6NjY7czo1NzoiY3JlYXRlX2Z1bmN0aW9uXChbJyJdWyciXSxccypcJG9wdFxbMVxdXHMqXC5ccypcJG9wdFxbNFxdIjtpOjY3O3M6NTA6ImZpbGVfcHV0X2NvbnRlbnRzXChTVkNfU0VMRlxzKlwuXHMqWyciXS9cLmh0YWNjZXNzIjtpOjY4O3M6NTE6IlwkYWxsZW1haWxzXHMqPVxzKkBzcGxpdFwoIlxcbiJccyosXHMqXCRlbWFpbGxpc3RcKSI7aTo2OTtzOjE4OiJKb29tbGFfYnJ1dGVfRm9yY2UiO2k6NzA7czozODoiXCRzeXNfcGFyYW1zXHMqPVxzKkAqZmlsZV9nZXRfY29udGVudHMiO2k6NzE7czozNToiZndyaXRlXHMqXChccypcJGZsd1xzKixccypcJGZsXHMqXCkiO2k6NzI7czo4NjoiZmlsZV9wdXRfY29udGVudHNccypcKFsnIl17MCwxfTFcLnR4dFsnIl17MCwxfVxzKixccypwcmludF9yXHMqXChccypcJF9QT1NUXHMqLFxzKnRydWUiO2k6NzM7czo4MDoiXCRoZWFkZXJzXHMqPVxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtbJyJdezAsMX1oZWFkZXJzWyciXXswLDF9XF0iO2k6NzQ7czo0NDoiY3JlYXRlX2Z1bmN0aW9uXHMqXChbJyJdWyciXVxzKixccypzdHJfcm90MTMiO2k6NzU7czozMzoiZGllXHMqXChccypQSFBfT1NccypcLlxzKmNoclxzKlwoIjtpOjc2O3M6NTU6ImlmXHMqXChtZDVcKHRyaW1cKFwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6Nzc7czo0NDoiZlxzKj1ccypcJHFccypcLlxzKlwkYVxzKlwuXHMqXCRiXHMqXC5ccypcJHgiO2k6Nzg7czo0MToiY29udGVudD1bJyJdezAsMX0xO1VSTD1jZ2ktYmluXC5odG1sXD9jbWQiO2k6Nzk7czo2MzoiXCR1cmxbJyJdezAsMX1ccypcLlxzKlwkc2Vzc2lvbl9pZFxzKlwuXHMqWyciXXswLDF9L2xvZ2luXC5odG1sIjtpOjgwO3M6NjQ6IlwkX1NFU1NJT05cW1snIl17MCwxfXNlc3Npb25fcGluWyciXXswLDF9XF1ccyo9XHMqWyciXXswLDF9XCRQSU4iO2k6ODE7czo0MjoiZnNvY2tvcGVuXHMqXChccypcJENvbm5lY3RBZGRyZXNzXHMqLFxzKjI1IjtpOjgyO3M6NDc6ImVjaG9ccytcJGlmdXBsb2FkPVsnIl17MCwxfVxzKkl0c09rXHMqWyciXXswLDF9IjtpOjgzO3M6Nzc6InByZWdfbWF0Y2hcKFsnIl0vXCh5YW5kZXhcfGdvb2dsZVx8Ym90XCkvaVsnIl0sXHMqZ2V0ZW52XChbJyJdSFRUUF9VU0VSX0FHRU5UIjtpOjg0O3M6NTI6IlwkbWFpbGVyXHMqPVxzKlwkX1BPU1RcW1snIl17MCwxfXhfbWFpbGVyWyciXXswLDF9XF0iO2k6ODU7czo1NzoiXCRPT08wTzBPMDA9X19GSUxFX187XHMqXCRPTzAwTzAwMDBccyo9XHMqMHgxYjU0MDtccypldmFsIjtpOjg2O3M6MTI6IkJ5XHMrV2ViUm9vVCI7aTo4NztzOjgwOiJoZWFkZXJcKFsnIl17MCwxfXM6XHMqWyciXXswLDF9XHMqXC5ccypwaHBfdW5hbWVccypcKFxzKlsnIl17MCwxfW5bJyJdezAsMX1ccypcKSI7aTo4ODtzOjczOiJtb3ZlX3VwbG9hZGVkX2ZpbGVcKFwkX0ZJTEVTXFtbJyJdezAsMX1lbGlmWyciXXswLDF9XF1cW1snIl17MCwxfXRtcF9uYW1lIjtpOjg5O3M6NjI6IlwkZ3ppcFxzKj1ccypAKmd6aW5mbGF0ZVxzKlwoXHMqQCpzdWJzdHJccypcKFxzKlwkZ3plbmNvZGVfYXJnIjtpOjkwO3M6ODM6ImlmXHMqXChccyptYWlsXHMqXChccypcJG1haWxzXFtcJGlcXVxzKixccypcJHRlbWFccyosXHMqYmFzZTY0X2VuY29kZVxzKlwoXHMqXCR0ZXh0IjtpOjkxO3M6ODQ6ImZ3cml0ZVxzKlwoXHMqXCRmaFxzKixccypzdHJpcHNsYXNoZXNccypcKFxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aTo5MjtzOjk0OiJlY2hvXHMrZmlsZV9nZXRfY29udGVudHNccypcKFxzKmJhc2U2NF91cmxfZGVjb2RlXHMqXChccypAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjkzO3M6NjA6ImlmXHMqXChccypAKm1kNVxzKlwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aTo5NDtzOjk5OiJjaHJccypcKFxzKjEwMVxzKlwpXHMqXC5ccypjaHJccypcKFxzKjExOFxzKlwpXHMqXC5ccypjaHJccypcKFxzKjk3XHMqXClccypcLlxzKmNoclxzKlwoXHMqMTA4XHMqXCkiO2k6OTU7czoxNTI6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtbJyJdezAsMX1bYS16QS1aMC05X10rP1snIl17MCwxfVxdXChccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9W2EtekEtWjAtOV9dKz9bJyJdezAsMX1cXVxzKlwpIjtpOjk2O3M6NzU6IlwkcmVzdWx0RlVMXHMqPVxzKnN0cmlwY3NsYXNoZXNccypcKFxzKlwkX1BPU1RcW1snIl17MCwxfXJlc3VsdEZVTFsnIl17MCwxfSI7aTo5NztzOjE1OiIvdXNyL3NiaW4vaHR0cGQiO2k6OTg7czozMjoiUFJJVk1TR1wuXCo6XC5vd25lclxcc1wrXChcLlwqXCkiO2k6OTk7czo4MzoicHJpbnRccytcJHNvY2tccytbJyJdezAsMX1OSUNLIFsnIl17MCwxfVxzK1wuXHMrXCRuaWNrXHMrXC5ccytbJyJdezAsMX1cXG5bJyJdezAsMX0iO2k6MTAwO3M6ODA6IlwkdXJsXHMqPVxzKlwkdXJsXHMqXC5ccypbJyJdezAsMX1cP1snIl17MCwxfVxzKlwuXHMqaHR0cF9idWlsZF9xdWVyeVwoXCRxdWVyeVwpIjtpOjEwMTtzOjEyMzoicHJlZ19tYXRjaF9hbGxcKFsnIl17MCwxfS88YSBocmVmPSJcXC91cmxcXFw/cT1cKFwuXCtcP1wpXFsmXHwiXF1cKy9pc1snIl17MCwxfSwgXCRwYWdlXFtbJyJdezAsMX1leGVbJyJdezAsMX1cXSwgXCRsaW5rc1wpIjtpOjEwMjtzOjEwMToiPHNjcmlwdFxzK2xhbmd1YWdlPVsnIl17MCwxfUphdmFTY3JpcHRbJyJdezAsMX0+XHMqcGFyZW50XC53aW5kb3dcLm9wZW5lclwubG9jYXRpb25ccyo9XHMqWyciXWh0dHA6Ly8iO2k6MTAzO3M6Nzc6IlwkcFxzKj1ccypzdHJwb3NccypcKFxzKlwkdHhccyosXHMqWyciXXswLDF9eyNbJyJdezAsMX1ccyosXHMqXCRwMlxzKlwrXHMqMlwpIjtpOjEwNDtzOjE1OiJcKG1zaWVcfG9wZXJhXCkiO2k6MTA1O3M6NDk6IlJld3JpdGVDb25kXHMqJXtIVFRQX1VTRVJfQUdFTlR9XHMqXC5cKm5kcm9pZFwuXCoiO2k6MTA2O3M6OTk6ImlmXHMqXChccyppc19kaXJccypcKFxzKlwkRnVsbFBhdGhccypcKVxzKlwpXHMqQWxsRGlyXHMqXChccypcJEZ1bGxQYXRoXHMqLFxzKlwkRmlsZXNccypcKTtccyp9XHMqfSI7aToxMDc7czoxNjc6IlsnIl17MCwxfUZyb206XHMqWyciXXswLDF9XC5cJF9QT1NUXFtbJyJdezAsMX1yZWFsbmFtZVsnIl17MCwxfVxdXC5bJyJdezAsMX0gWyciXXswLDF9XC5bJyJdezAsMX0gPFsnIl17MCwxfVwuXCRfUE9TVFxbWyciXXswLDF9ZnJvbVsnIl17MCwxfVxdXC5bJyJdezAsMX0+XFxuWyciXXswLDF9IjtpOjEwODtzOjUzOiI8IS0tI2V4ZWNccytjbWQ9WyciXXswLDF9XCRIVFRQX0FDQ0VQVFsnIl17MCwxfVxzKi0tPiI7aToxMDk7czoyNjoiXFstXF1ccytDb25uZWN0aW9uXHMrZmFpbGQiO2k6MTEwO3M6NjM6ImlmXCgvXF5cXDpcJG93bmVyIVwuXCpcXEBcLlwqUFJJVk1TR1wuXCo6XC5tc2dmbG9vZFwoXC5cKlwpL1wpeyI7aToxMTE7czozNDoicHJpbnRccypcJHNvY2sgIlBSSVZNU0cgIlwuXCRvd25lciI7aToxMTI7czo2NDoiXF09WyciXXswLDF9aXBbJyJdezAsMX1ccyo7XHMqaWZccypcKFxzKmlzc2V0XHMqXChccypcJF9TRVJWRVJcWyI7aToxMTM7czo1MToiXF1ccyp9XHMqPVxzKnRyaW1ccypcKFxzKmFycmF5X3BvcFxzKlwoXHMqXCR7XHMqXCR7IjtpOjExNDtzOjMwOiJwcmludFwoIiNccytpbmZvXHMrT0tcXG5cXG4iXCkiO2k6MTE1O3M6MTEyOiJcJHVzZXJfYWdlbnRccyo9XHMqcHJlZ19yZXBsYWNlXHMqXChccypbJyJdXHxVc2VyXFxcLkFnZW50XFw6XFtcXHMgXF1cP1x8aVsnIl1ccyosXHMqWyciXVsnIl1ccyosXHMqXCR1c2VyX2FnZW50IjtpOjExNjtzOjcxOiJcJHBccyo9XHMqc3RycG9zXChcJHR4XHMqLFxzKlsnIl17MCwxfXsjWyciXXswLDF9XHMqLFxzKlwkcDJccypcK1xzKjJcKSI7aToxMTc7czo5MjoiY3JlYXRlX2Z1bmN0aW9uXHMqXChccypbJyJdXCRtWyciXVxzKixccypbJyJdaWZccypcKFxzKlwkbVxzKlxbXHMqMHgwMVxzKlxdXHMqPT1ccypbJyJdTFsnIl0iO2k6MTE4O3M6ODk6IlwkbGV0dGVyXHMqPVxzKnN0cl9yZXBsYWNlXHMqXChccypcJEFSUkFZXFswXF1cW1wkalxdXHMqLFxzKlwkYXJyXFtcJGluZFxdXHMqLFxzKlwkbGV0dGVyIjtpOjExOTtzOjk6IklySXNUXC5JciI7aToxMjA7czo0NjoiaWZccypcKGRldGVjdF9tb2JpbGVfZGV2aWNlXChcKVwpXHMqe1xzKmhlYWRlciI7aToxMjE7czozMjoiXCRwb3N0XHMqPVxzKlsnIl1cXHg3N1xceDY3XFx4NjUiO2k6MTIyO3M6Mjc6ImVjaG9ccypbJyJdYW5zd2VyPWVycm9yWyciXSI7aToxMjM7czozNDoidXJsPTxcP3BocFxzKmVjaG9ccypcJHJhbmRfdXJsO1w/PiI7aToxMjQ7czo0NToiaWZcKENoZWNrSVBPcGVyYXRvclwoXClccyomJlxzKiFpc01vZGVtXChcKVwpIjtpOjEyNTtzOjU5OiJzdHJwb3NcKFwkdWEsXHMqWyciXXswLDF9eWFuZGV4Ym90WyciXXswLDF9XClccyohPT1ccypmYWxzZSI7aToxMjY7czoxMzQ6ImlmXHMqXChcJGtleVxzKiE9XHMqWyciXXswLDF9bWFpbF90b1snIl17MCwxfVxzKiYmXHMqXCRrZXlccyohPVxzKlsnIl17MCwxfXNtdHBfc2VydmVyWyciXXswLDF9XHMqJiZccypcJGtleVxzKiE9XHMqWyciXXswLDF9c210cF9wb3J0IjtpOjEyNztzOjUyOiJlY2hvWyciXXswLDF9PGNlbnRlcj48Yj5Eb25lXHMqPT0+XHMqXCR1c2VyZmlsZV9uYW1lIjtpOjEyODtzOjE1OiJbJyJdZS9cKlwuL1snIl0iO2k6MTI5O3M6Mjg6ImFzc2VydFxzKlwoXHMqQCpzdHJpcHNsYXNoZXMiO2k6MTMwO3M6NTE6IlwpXHMqXC5ccypzdWJzdHJccypcKFxzKm1kNVxzKlwoXHMqc3RycmV2XHMqXChccypcJCI7aToxMzE7czo2NToiXCRmbFxzKj1ccyoiPG1ldGEgaHR0cC1lcXVpdj1cXCJSZWZyZXNoXFwiXHMrY29udGVudD1cXCIwO1xzKlVSTD0iO2k6MTMyO3M6OTA6IixccyphcnJheVxzKlwoJ1wuJywnXC5cLicsJ1RodW1ic1wuZGInXClccypcKVxzKlwpXHMqe1xzKmNvbnRpbnVlO1xzKn1ccyppZlxzKlwoXHMqaXNfZmlsZSI7aToxMzM7czo4MzoiaWZccypcKFxzKlwkZGF0YVNpemVccyo8XHMqQk9UQ1JZUFRfTUFYX1NJWkVccypcKVxzKnJjNFxzKlwoXHMqXCRkYXRhLFxzKlwkY3J5cHRrZXkiO2k6MTM0O3M6MTc4OiJpZlxzKlwoXHMqXCRfUE9TVFxbXHMqWyciXXswLDF9cGF0aFsnIl17MCwxfVxzKlxdXHMqPT1ccypbJyJdezAsMX1bJyJdezAsMX1ccypcKVxzKntccypcJHVwbG9hZGZpbGVccyo9XHMqXCRfRklMRVNcW1xzKlsnIl17MCwxfWZpbGVbJyJdezAsMX1ccypcXVxbXHMqWyciXXswLDF9bmFtZVsnIl17MCwxfVxzKlxdIjtpOjEzNTtzOjk5OiJpZlxzKlwoXHMqZndyaXRlXHMqXChccypcJGhhbmRsZVxzKixccypmaWxlX2dldF9jb250ZW50c1xzKlwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6MTM2O3M6ODk6ImFycmF5X2tleV9leGlzdHNccypcKFxzKlwkZmlsZVJhc1xzKixccypcJGZpbGVUeXBlXClccypcP1xzKlwkZmlsZVR5cGVcW1xzKlwkZmlsZVJhc1xzKlxdIjtpOjEzNztzOjY1OiJ1cmxlbmNvZGVcKHByaW50X3JcKGFycmF5XChcKSwxXClcKSw1LDFcKVwuY1wpLFwkY1wpO31ldmFsXChcJGRcKSI7aToxMzg7czo0NDoiaWZccypcKFxzKmZ1bmN0aW9uX2V4aXN0c1xzKlwoXHMqJ3BjbnRsX2ZvcmsiO2k6MTM5O3M6NDM6ImZpbmRccysvXHMrLXR5cGVccytmXHMrLXBlcm1ccystMDQwMDBccystbHMiO2k6MTQwO3M6NzE6ImV4ZWNsXChbJyJdL2Jpbi9zaFsnIl1ccyosXHMqWyciXS9iaW4vc2hbJyJdXHMqLFxzKlsnIl0taVsnIl1ccyosXHMqMFwpIjtpOjE0MTtzOjQxOiJmdW5jdGlvblxzK2luamVjdFwoXCRmaWxlLFxzKlwkaW5qZWN0aW9uPSI7aToxNDI7czozODoiZmNsb3NlXChcJGZcKTtccyplY2hvXHMqWyciXW9cLmtcLlsnIl0iO2k6MTQzO3M6OTI6InByZWdfcmVwbGFjZVxzKlwoXHMqXCRleGlmXFtccypcXFsnIl1NYWtlXFxbJyJdXHMqXF1ccyosXHMqXCRleGlmXFtccypcXFsnIl1Nb2RlbFxcWyciXVxzKlxdIjtpOjE0NDtzOjcyOiJcXmRvd25sb2Fkcy9cKFxbMC05XF1cKlwpL1woXFswLTlcXVwqXCkvXCRccytkb3dubG9hZHNcLnBocFw/Yz1cJDEmcD1cJDIiO2k6MTQ1O3M6ODE6IlwkcmVzPW15c3FsX3F1ZXJ5XChbJyJdezAsMX1TRUxFQ1RccytcKlxzK0ZST01ccytgd2F0Y2hkb2dfb2xkXzA1YFxzK1dIRVJFXHMrcGFnZSI7aToxNDY7czo1MjoiUmV3cml0ZVJ1bGVccytcLlwqXHMraW5kZXhcLnBocFw/dXJsPVwkMFxzK1xbTCxRU0FcXSI7aToxNDc7czoxMDA6IklPOjpTb2NrZXQ6OklORVQtPm5ld1woUHJvdG9ccyo9PlxzKiJ0Y3AiXHMqLFxzKkxvY2FsUG9ydFxzKj0+XHMqMzYwMDBccyosXHMqTGlzdGVuXHMqPT5ccypTT01BWENPTk4iO2k6MTQ4O3M6Mzk6ImV2YWxccypcKCpccypzdHJyZXZccypcKCpccypzdHJfcmVwbGFjZSI7aToxNDk7czoyMTM6IkAqbW92ZV91cGxvYWRlZF9maWxlXHMqXChccypcJF9GSUxFU1xbXHMqWyciXXswLDF9bWVzc2FnZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX10bXBfbmFtZVsnIl17MCwxfVxzKlxdXHMqLFxzKlwkc2VjdXJpdHlfY29kZVxzKlwuXHMqIi8iXHMqXC5ccypcJF9GSUxFU1xbWyciXXswLDF9bWVzc2FnZVsnIl17MCwxfVxdXFtbJyJdezAsMX1uYW1lWyciXXswLDF9XF1cKSI7aToxNTA7czo4MjoiXCRVUkxccyo9XHMqXCR1cmxzXFtccypyYW5kXChccyowXHMqLFxzKmNvdW50XHMqXChccypcJHVybHNccypcKVxzKi1ccyoxXHMqXClccypcXSI7aToxNTE7czoyMzI6Imlzc2V0XHMqXChccypcJF9GSUxFU1xbXHMqWyciXXswLDF9eFsnIl17MCwxfVxzKlxdXHMqXClccypcP1xzKlwoXHMqaXNfdXBsb2FkZWRfZmlsZVxzKlwoXHMqXCRfRklMRVNcW1xzKlsnIl17MCwxfXhbJyJdezAsMX1ccypcXVxbXHMqWyciXXswLDF9dG1wX25hbWVbJyJdezAsMX1ccypcXVxzKlwpXHMqXD9ccypcKFxzKmNvcHlccypcKFxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX14WyciXXswLDF9XHMqXF0iO2k6MTUyO3M6ODc6ImlmXHMqXChccypcJGlccyo8XHMqXChccypjb3VudFxzKlwoXHMqXCRfUE9TVFxbXHMqWyciXXswLDF9cVsnIl17MCwxfVxzKlxdXHMqXClccyotXHMqMSI7aToxNTM7czo3MDoiZmlsZV9nZXRfY29udGVudHNccypcKCpccypBRE1JTl9SRURJUl9VUkxccyosXHMqZmFsc2VccyosXHMqXCRjdHhccypcKSI7aToxNTQ7czoxMjoidG1oYXBiemNlcmZmIjtpOjE1NTtzOjk3OiJjb250ZW50PVsnIl17MCwxfW5vLWNhY2hlWyciXXswLDF9O1xzKlwkY29uZmlnXFtbJyJdezAsMX1kZXNjcmlwdGlvblsnIl17MCwxfVxdXHMqXC49XHMqWyciXXswLDF9IjtpOjE1NjtzOjc0OiJjbGVhcnN0YXRjYWNoZVwoXHMqXCk7XHMqaWZccypcKFxzKiFpc19kaXJccypcKFxzKlwkZmxkXHMqXClccypcKVxzKnJldHVybiI7aToxNTc7czo5NzoiXCRyQnVmZkxlblxzKj1ccypvcmRccypcKFxzKlZDX0RlY3J5cHRccypcKFxzKmZyZWFkXHMqXChccypcJGlucHV0LFxzKjFccypcKVxzKlwpXHMqXClccypcKlxzKjI1NiI7aToxNTg7czo5OiJJclNlY1RlYW0iO2k6MTU5O3M6NzM6IkBoZWFkZXJcKFsnIl1Mb2NhdGlvbjpccypbJyJdXC5bJyJdaFsnIl1cLlsnIl10WyciXVwuWyciXXRbJyJdXC5bJyJdcFsnIl0iO2k6MTYwO3M6Njc6InNldF90aW1lX2xpbWl0XHMqXChccyowXHMqXCk7XHMqaWZccypcKCFTZWNyZXRQYWdlSGFuZGxlcjo6Y2hlY2tLZXkiO2k6MTYxO3M6MTA2OiJyZXR1cm5ccypcKFxzKnN0cnN0clxzKlwoXHMqXCRzXHMqLFxzKidlY2hvJ1xzKlwpXHMqPT1ccypmYWxzZVxzKlw/XHMqXChccypzdHJzdHJccypcKFxzKlwkc1xzKixccyoncHJpbnQnIjtpOjE2MjtzOjc1OiJ0aW1lXChcKVxzKlwrXHMqMTAwMDBccyosXHMqWyciXS9bJyJdXCk7XHMqZWNob1xzK1wkbV96ejtccypldmFsXHMqXChcJG1fenoiO2k6MTYzO3M6MTQ1OiJpZlwoIWVtcHR5XChcJF9GSUxFU1xbWyciXXswLDF9bWVzc2FnZVsnIl17MCwxfVxdXFtbJyJdezAsMX1uYW1lWyciXXswLDF9XF1cKVxzK0FORFxzK1wobWQ1XChcJF9QT1NUXFtbJyJdezAsMX1uaWNrWyciXXswLDF9XF1cKVxzKj09XHMqWyciXXswLDF9IjtpOjE2NDtzOjQ3OiJzdHJfcm90MTNccypcKFxzKmd6aW5mbGF0ZVxzKlwoXHMqYmFzZTY0X2RlY29kZSI7aToxNjU7czo1MDoiZ3p1bmNvbXByZXNzXHMqXChccypzdHJfcm90MTNccypcKFxzKmJhc2U2NF9kZWNvZGUiO2k6MTY2O3M6NTA6Imd6dW5jb21wcmVzc1xzKlwoXHMqYmFzZTY0X2RlY29kZVxzKlwoXHMqc3RyX3JvdDEzIjtpOjE2NztzOjYxOiJnemluZmxhdGVccypcKFxzKmJhc2U2NF9kZWNvZGVccypcKFxzKnN0cl9yb3QxM1xzKlwoXHMqc3RycmV2IjtpOjE2ODtzOjYxOiJnemluZmxhdGVccypcKFxzKmJhc2U2NF9kZWNvZGVccypcKFxzKnN0cnJldlxzKlwoXHMqc3RyX3JvdDEzIjtpOjE2OTtzOjQ0OiJnemluZmxhdGVccypcKFxzKmJhc2U2NF9kZWNvZGVccypcKFxzKnN0cnJldiI7aToxNzA7czo2ODoiZ3ppbmZsYXRlXHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypzdHJfcm90MTMiO2k6MTcxO3M6NTQ6ImJhc2U2NF9kZWNvZGVccypcKFxzKmd6dW5jb21wcmVzc1xzKlwoXHMqYmFzZTY0X2RlY29kZSI7aToxNzI7czo0NzoiZ3ppbmZsYXRlXHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypzdHJfcm90MTMiO2k6MTczO3M6NDc6Imd6aW5mbGF0ZVxzKlwoXHMqc3RyX3JvdDEzXHMqXChccypiYXNlNjRfZGVjb2RlIjtpOjE3NDtzOjE3OiJCcmF6aWxccytIYWNrVGVhbSI7aToxNzU7czo2MDoiXCR0bGRccyo9XHMqYXJyYXlccypcKFxzKlsnIl1jb21bJyJdLFsnIl1vcmdbJyJdLFsnIl1uZXRbJyJdIjtpOjE3NjtzOjQ1OiJkZWZpbmVccypcKCpccypbJyJdU0JDSURfUkVRVUVTVF9GSUxFWyciXVxzKiwiO2k6MTc3O3M6MzQ6InByZWdfcmVwbGFjZVxzKlwoKlxzKlsnIl0vXC5cKy9lc2kiO2k6MTc4O3M6MTc6Ik15c3RlcmlvdXNccytXaXJlIjtpOjE3OTtzOjUxOiJcJGhlYWRlcnNccypcLj1ccypcJF9QT1NUXFtccypbJyJdZU1haWxBZGRbJyJdXHMqXF0iO2k6MTgwO3M6MzM6ImRlZmluZVxzKlwoXHMqWyciXURFRkNBTExCQUNLTUFJTCI7aToxODE7czo0NzoiZGVmYXVsdF9hY3Rpb25ccyo9XHMqWyciXXswLDF9RmlsZXNNYW5bJyJdezAsMX0iO2k6MTgyO3M6Mzg6ImVjaG9ccytAZmlsZV9nZXRfY29udGVudHNccypcKFxzKlwkZ2V0IjtpOjE4MztzOjE1NjoiaWZccypcKFxzKnN0cmlwb3NccypcKFxzKlwkX1NFUlZFUlxbWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XF1ccyosXHMqWyciXXswLDF9QW5kcm9pZFsnIl17MCwxfVwpXHMqIT09ZmFsc2VccyomJlxzKiFcJF9DT09LSUVcW1snIl17MCwxfWRsZV91c2VyX2lkIjtpOjE4NDtzOjYwOiJoZWFkZXJccypcKFsnIl1Mb2NhdGlvbjpccypbJyJdXHMqXC5ccypcJHRvXHMqXC5ccyp1cmxkZWNvZGUiO2k6MTg1O3M6MTA6IkRjMFJIYVsnIl0iO2k6MTg2O3M6MzY6IiF0b3VjaFwoWyciXXswLDF9XC5cLi9cLlwuL2xhbmd1YWdlLyI7aToxODc7czozODoiZXZhbFwoXHMqc3RyaXBzbGFzaGVzXChccypcXFwkX1JFUVVFU1QiO2k6MTg4O3M6Nzg6ImRvY3VtZW50XC53cml0ZVxzKlwoXHMqWyciXXswLDF9PHNjcmlwdFxzK3NyYz1bJyJdezAsMX1odHRwOi8vPFw/PVwkZG9tYWluXD8+LyI7aToxODk7czo4NToiZXhpdFxzKlwoXHMqWyciXXswLDF9PHNjcmlwdD5ccypzZXRUaW1lb3V0XHMqXChccypcXFsnIl17MCwxfWRvY3VtZW50XC5sb2NhdGlvblwuaHJlZiI7aToxOTA7czoyNToiZnVuY3Rpb25ccytzcWwyX3NhZmVccypcKCI7aToxOTE7czo0MToiXCRwb3N0UmVzdWx0XHMqPVxzKmN1cmxfZXhlY1xzKlwoKlxzKlwkY2giO2k6MTkyO3M6ODc6IiYmXHMqZnVuY3Rpb25fZXhpc3RzXHMqXCgqXHMqWyciXXswLDF9Z2V0bXhyclsnIl17MCwxfVwpXHMqXClccyp7XHMqQGdldG14cnJccypcKCpccypcJCI7aToxOTM7czo1NzoiaXNfX3dyaXRhYmxlXHMqXCgqXHMqXCRwYXRoXHMqXC5ccyp1bmlxaWRccypcKCpccyptdF9yYW5kIjtpOjE5NDtzOjI4OiJmaWxlX3B1dF9jb250ZW50elxzKlwoKlxzKlwkIjtpOjE5NTtzOjU1OiJAKmd6aW5mbGF0ZVxzKlwoXHMqQCpiYXNlNjRfZGVjb2RlXHMqXChccypAKnN0cl9yZXBsYWNlIjtpOjE5NjtzOjEwNToiZm9wZW5ccypcKCpccypbJyJdaHR0cDovL1snIl1ccypcLlxzKlwkY2hlY2tfZG9tYWluXHMqXC5ccypbJyJdOjgwWyciXVxzKlwuXHMqXCRjaGVja19kb2NccyosXHMqWyciXXJbJyJdIjtpOjE5NztzOjQzOiJAXCRfQ09PS0lFXFtbJyJdezAsMX1zdGF0Q291bnRlclsnIl17MCwxfVxdIjtpOjE5ODtzOjM1OiJpZlxzKlwoKlxzKkAqcHJlZ19tYXRjaFxzKlwoKlxzKnN0ciI7aToxOTk7czo5NDoiYXJyYXlfcG9wXHMqXCgqXHMqXCR3b3JrUmVwbGFjZVxzKixccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKixccypcJGNvdW50S2V5c05ldyI7aToyMDA7czo1NDoiKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClccypcW1xzKlsnIl1fX19bJyJdXHMqIjtpOjIwMTtzOjIzOiJcKFxzKlsnIl1JTlNIRUxMWyciXVxzKiI7aToyMDI7czo0NzoiXCRiXHMqXC5ccypcJHBccypcLlxzKlwkaFxzKlwuXHMqXCRrXHMqXC5ccypcJHYiO2k6MjAzO3M6ODg6Ij1ccypwcmVnX3NwbGl0XHMqXChccypbJyJdL1xcLFwoXFwgXCtcKVw/L1snIl0sXHMqQCppbmlfZ2V0XHMqXChccypbJyJdZGlzYWJsZV9mdW5jdGlvbnMiO2k6MjA0O3M6MTAxOiJpZlxzKlwoIWZ1bmN0aW9uX2V4aXN0c1xzKlwoXHMqWyciXXBvc2l4X2dldHB3dWlkWyciXVxzKlwpXHMqJiZccyohaW5fYXJyYXlccypcKFxzKlsnIl1wb3NpeF9nZXRwd3VpZCI7aToyMDU7czoxMjM6InByZWdfcmVwbGFjZVxzKlwoXHMqWyciXS9cXlwod3d3XHxmdHBcKVxcXC4vaVsnIl1ccyosXHMqWyciXVsnIl0sXHMqQFwkX1NFUlZFUlxzKlxbXHMqWyciXXswLDF9SFRUUF9IT1NUWyciXXswLDF9XHMqXF1ccypcKSI7aToyMDY7czoyNjE6ImlmXHMqXCgqXHMqaXNzZXRccypcKCpccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKlxbXHMqWyciXXswLDF9W2EtekEtWl8wLTldK1snIl17MCwxfVxzKlxdXHMqXCkqXHMqXClccyp7XHMqXCRbYS16QS1aXzAtOV0rXHMqPVxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbJyJdezAsMX1bYS16QS1aXzAtOV0rWyciXXswLDF9XHMqXF07XHMqZXZhbFxzKlwoKlxzKlwkW2EtekEtWl8wLTldK1xzKlwpKiI7aToyMDc7czo4MToiZXZhbFxzKlwoKlxzKnN0cmlwc2xhc2hlc1xzKlwoKlxzKmFycmF5X3BvcFwoKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjIwODtzOjEzOToiaWZccytcKFxzKnN0cnBvc1xzKlwoXHMqXCR1cmxccyosXHMqWyciXWpzL21vb3Rvb2xzXC5qc1snIl1ccypcKVxzKj09PVxzKmZhbHNlXHMrJiZccytzdHJwb3NccypcKFxzKlwkdXJsXHMqLFxzKlsnIl1qcy9jYXB0aW9uXC5qc1snIl17MCwxfSI7aToyMDk7czo2ODoiaWZccytcKCpccyptYWlsXHMqXChccypcJHJlY3BccyosXHMqXCRzdWJqXHMqLFxzKlwkc3R1bnRccyosXHMqXCRmcm0iO2k6MjEwO3M6NDM6IjxcP3BocFxzK1wkX0Zccyo9XHMqX19GSUxFX19ccyo7XHMqXCRfWFxzKj0iO2k6MjExO3M6Nzk6IlwkeFxkK1xzKj1ccypbJyJdLis/WyciXVxzKjtccypcJHhcZCtccyo9XHMqWyciXS4rP1snIl1ccyo7XHMqXCR4XGQrXHMqPVxzKlsnIl0iO2k6MjEyO3M6MTE1OiJcJGJlZWNvZGVccyo9QCpmaWxlX2dldF9jb250ZW50c1xzKlwoKlsnIl17MCwxfVxzKlwkdXJscHVyc1xzKlsnIl17MCwxfVwpKlxzKjtccyplY2hvXHMrWyciXXswLDF9XCRiZWVjb2RlWyciXXswLDF9IjtpOjIxMztzOjEwMToiXCRHTE9CQUxTXFtccypbJyJdezAsMX0uKz9bJyJdezAsMX1ccypcXVxbXHMqXGQrXHMqXF1cKFxzKlwkX1xkK1xzKixccypfXGQrXHMqXChccypcZCtccypcKVxzKlwpXHMqXCkiO2k6MjE0O3M6NzM6InByZWdfcmVwbGFjZVxzKlwoKlxzKlsnIl17MCwxfS9cLlwqXFsuKz9cXVw/L2VbJyJdezAsMX1ccyosXHMqc3RyX3JlcGxhY2UiO2k6MjE1O3M6MTQ5OiJcJEdMT0JBTFNcW1snIl17MCwxfS4rP1snIl17MCwxfVxdPUFycmF5XHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypbJyJdezAsMX0uKz9bJyJdezAsMX1ccypcKVxzKixccypiYXNlNjRfZGVjb2RlXHMqXChccypbJyJdezAsMX0uKz9bJyJdezAsMX1ccypcKSI7aToyMTY7czoyMDA6IlVOSU9OXHMrU0VMRUNUXHMrWyciXXswLDF9MFsnIl17MCwxfVxzKixccypbJyJdezAsMX08XD8gc3lzdGVtXChcXFwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtjcGNcXVwpO2V4aXQ7XHMqXD8+WyciXXswLDF9XHMqLFxzKjBccyosMFxzKixccyowXHMqLFxzKjBccytJTlRPXHMrT1VURklMRVxzK1snIl17MCwxfVwkWyciXXswLDF9IjtpOjIxNztzOjY2OiJpc3NldFxzKlwoKlxzKlwkX1BPU1RccypcW1xzKlsnIl17MCwxfWV4ZWNnYXRlWyciXXswLDF9XHMqXF1ccypcKSoiO2k6MjE4O3M6NzE6ImZ3cml0ZVxzKlwoKlxzKlwkZnBzZXR2XHMqLFxzKmdldGVudlxzKlwoXHMqWyciXUhUVFBfQ09PS0lFWyciXVxzKlwpXHMqIjtpOjIxOTtzOjI2OiJzeW1saW5rXHMqXCgqXHMqWyciXS9ob21lLyI7aToyMjA7czo3MDoiZnVuY3Rpb25ccyt1cmxHZXRDb250ZW50c1xzKlwoKlxzKlwkdXJsXHMqLFxzKlwkdGltZW91dFxzKj1ccypcZCtccypcKSI7aToyMjE7czo0OToic3RycmV2XCgqXHMqWyciXXswLDF9ZWRvY2VkXzQ2ZXNhYlsnIl17MCwxfVxzKlwpKiI7aToyMjI7czo0Mjoic3RycmV2XCgqXHMqWyciXXswLDF9dHJlc3NhWyciXXswLDF9XHMqXCkqIjtpOjIyMztzOjIwOiJleGVjXHMqXChccypbJyJdaXBmdyI7aToyMjQ7czoxMzY6IndwX3Bvc3RzXHMrV0hFUkVccytwb3N0X3R5cGVccyo9XHMqWyciXXswLDF9cG9zdFsnIl17MCwxfVxzK0FORFxzK3Bvc3Rfc3RhdHVzXHMqPVxzKlsnIl17MCwxfXB1Ymxpc2hbJyJdezAsMX1ccytPUkRFUlxzK0JZXHMrYElEYFxzK0RFU0MiO2k6MjI1O3M6MTEyOiJmaWxlX2dldF9jb250ZW50c1xzKlwoKlxzKnRyaW1ccypcKFxzKlwkLis/XFtcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9Lis/WyciXXswLDF9XF1cXVwpXCk7IjtpOjIyNjtzOjIxMzoiaXNfY2FsbGFibGVccypcKCpccypbJyJdezAsMX0oZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVsnIl17MCwxfVwpKlxzK2FuZFxzKyFpbl9hcnJheVxzKlwoKlxzKlsnIl17MCwxfShmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pWyciXXswLDF9XHMqLFxzKlwkZGlzYWJsZWZ1bmNzIjtpOjIyNztzOjI0OiJcJEdMT0JBTFNcW1snIl17MCwxfV9fX18iO2k6MjI4O3M6NDM6ImZvcGVuXHMqXCgqXHMqWyciXXswLDF9L2V0Yy9wYXNzd2RbJyJdezAsMX0iO2k6MjI5O3M6NTk6ImV2YWxccypcKCpAKlxzKnN0cmlwc2xhc2hlc1xzKlwoKlxzKmFycmF5X3BvcFxzKlwoKlxzKkAqXCRfIjtpOjIzMDtzOjQxOiJldmFsXHMqXCgqQCpccypzdHJpcHNsYXNoZXNccypcKCpccypAKlwkXyI7aToyMzE7czo3NDoiQCpzZXRjb29raWVccypcKCpccypbJyJdezAsMX1oaXRbJyJdezAsMX0sXHMqMVxzKixccyp0aW1lXHMqXCgqXHMqXCkqXHMqXCsiO2k6MjMyO3M6MzY6ImV2YWxccypcKCpccypmaWxlX2dldF9jb250ZW50c1xzKlwoKiI7aToyMzM7czo0NjoicHJlZ19yZXBsYWNlXHMqXCgqXHMqWyciXXswLDF9L1wuXCovZVsnIl17MCwxfSI7aToyMzQ7czo4MToiXHMqe1xzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbJyJdezAsMX1yb290WyciXXswLDF9XHMqXF1ccyp9IjtpOjIzNTtzOjEzNToiWyciXXswLDF9aHR0cGRcLmNvbmZbJyJdezAsMX1ccyosXHMqWyciXXswLDF9dmhvc3RzXC5jb25mWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfWNmZ1wucGhwWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfWNvbmZpZ1wucGhwWyciXXswLDF9IjtpOjIzNjtzOjMzOiJwcm9jX29wZW5ccypcKFxzKlsnIl17MCwxfUlIU3RlYW0iO2k6MjM3O3M6ODg6IlwkaW5pXHMqXFtccypbJyJdezAsMX11c2Vyc1snIl17MCwxfVxzKlxdXHMqPVxzKmFycmF5XHMqXChccypbJyJdezAsMX1yb290WyciXXswLDF9XHMqPT4iO2k6MjM4O3M6ODg6ImN1cmxfc2V0b3B0XHMqXChccypcJGNoXHMqLFxzKkNVUkxPUFRfVVJMXHMqLFxzKlsnIl17MCwxfWh0dHA6Ly9cJGhvc3Q6XGQrWyciXXswLDF9XHMqXCkiO2k6MjM5O3M6NDU6InN5c3RlbVxzKlwoKlxzKlsnIl17MCwxfXdob2FtaVsnIl17MCwxfVxzKlwpKiI7aToyNDA7czo1MjoiZmluZFxzKy9ccystbmFtZVxzK1wuc3NoXHMrPlxzK1wkZGlyL3NzaGtleXMvc3Noa2V5cyI7aToyNDE7czo1MjoiYXNzZXJ0XHMqXCgqXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aToyNDI7czo1MDoiZXZhbFxzKlwoKlxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6MjQzO3M6MjU6InBocFxzKyJccypcLlxzKlwkd3NvX3BhdGgiO2k6MjQ0O3M6ODk6IkAqYXNzZXJ0XHMqXCgqXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClccypcW1xzKlsnIl17MCwxfS4rP1snIl17MCwxfVxzKlxdXHMqIjtpOjI0NTtzOjIxOiJldmExW2EtekEtWjAtOV9dKz9TaXIiO2k6MjQ2O3M6OTM6IlwkY21kXHMqPVxzKlwoXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKlxbXHMqWyciXXswLDF9Lis/WyciXXswLDF9XHMqXF1ccypcKSI7aToyNDc7czo5NjoiXCRmdW5jdGlvblxzKlwoKlxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClccypcW1xzKlsnIl17MCwxfWNtZFsnIl17MCwxfVxzKlxdXHMqXCkqIjtpOjI0ODtzOjIzOiJcJGZlXCgiXCRjbWRccysyPiYxIlwpOyI7aToyNDk7czoxNDE6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChbJyJdXCRjbWRccysxPlxzKi90bXAvY21kdGVtcFxzKzI+JjE7XHMqY2F0XHMrL3RtcC9jbWR0ZW1wO1xzKnJtXHMrL3RtcC9jbWR0ZW1wWyciXVwpOyI7aToyNTA7czo1Mzoic2V0Y29va2llXCgqXHMqWyciXW15c3FsX3dlYl9hZG1pbl91c2VybmFtZVsnIl1ccypcKSoiO2k6MjUxO3M6ODY6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqWyciXXVuYW1lXHMrLWFbJyJdXHMqXCkqIjtpOjI1MjtzOjEyNDoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilccypcKCpccypAKlwkX1BPU1RccypcW1xzKlsnIl0uKz9bJyJdXHMqXF1ccypcLlxzKiJccyoyXHMqPlxzKiYxXHMqWyciXSI7aToyNTM7czo0OToiIUAqXCRfUkVRVUVTVFxzKlxbXHMqWyciXWM5OXNoX3N1cmxbJyJdXHMqXF1ccypcKSI7aToyNTQ7czozNzoiXCRsb2dpblxzKj1ccypAKnBvc2l4X2dldHVpZFwoKlxzKlwpKiI7aToyNTU7czozMToibmNmdHBwdXRccyotdVxzKlwkZnRwX3VzZXJfbmFtZSI7aToyNTY7czo4MjoicnVuY29tbWFuZFxzKlwoXHMqWyciXXNoZWxsaGVscFsnIl1ccyosXHMqWyciXShHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpWyciXSI7aToyNTc7czo1NToie1xzKlwkXHMqe1xzKnBhc3N0aHJ1XHMqXCgqXHMqXCRjbWRccypcKVxzKn1ccyp9XHMqPGJyPiI7aToyNTg7czo1ODoicGFzc3RocnVccypcKCpccypnZXRlbnZccypcKCpccypcXFsnIl1IVFRQX0FDQ0VQVF9MQU5HVUFHRSI7aToyNTk7czo1NjoicGFzc3RocnVccypcKCpccypnZXRlbnZccypcKCpccypbJyJdSFRUUF9BQ0NFUFRfTEFOR1VBR0UiO2k6MjYwO3M6ODc6IlNFTEVDVFxzKzFccytGUk9NXHMrbXlzcWxcLnVzZXJccytXSEVSRVxzK2NvbmNhdFwoXHMqYHVzZXJgXHMqLFxzKidAJ1xzKixccypgaG9zdGBccypcKSI7aToyNjE7czo5NzoiXCRNZXNzYWdlU3ViamVjdFxzKj1ccypiYXNlNjRfZGVjb2RlXHMqXChccypcJF9QT1NUXHMqXFtccypbJyJdezAsMX1tc2dzdWJqZWN0WyciXXswLDF9XHMqXF1ccypcKSI7aToyNjI7czo0NzoicmVuYW1lXHMqXChccypccypbJyJdezAsMX13c29cLnBocFsnIl17MCwxfVxzKiwiO2k6MjYzO3M6NzQ6ImZpbGVwYXRoXHMqPVxzKkAqcmVhbHBhdGhccypcKFxzKlwkX1BPU1RccypcW1xzKlsnIl1maWxlcGF0aFsnIl1ccypcXVxzKlwpIjtpOjI2NDtzOjc4OiJmaWxlcGF0aFxzKj1ccypAKnJlYWxwYXRoXHMqXChccypcJF9QT1NUXHMqXFtccypcXFsnIl1maWxlcGF0aFxcWyciXVxzKlxdXHMqXCkiO2k6MjY1O3M6NDA6ImV2YWxccypcKCpccypiYXNlNjRfZGVjb2RlXHMqXCgqXHMqQCpcJF8iO2k6MjY2O3M6MTA3OiJ3c29FeFxzKlwoXHMqXFxbJyJdXHMqdGFyXHMqY2Z6dlxzKlxcWyciXVxzKlwuXHMqZXNjYXBlc2hlbGxhcmdccypcKFxzKlwkX1BPU1RcW1xzKlxcWyciXXAyXFxbJyJdXHMqXF1ccypcKSI7aToyNjc7czo3NDoiV1NPc2V0Y29va2llXHMqXChccyptZDVccypcKFxzKkAqXCRfU0VSVkVSXFtccypbJyJdSFRUUF9IT1NUWyciXVxzKlxdXHMqXCkiO2k6MjY4O3M6Nzg6IldTT3NldGNvb2tpZVxzKlwoXHMqbWQ1XHMqXChccypAKlwkX1NFUlZFUlxbXHMqXFxbJyJdSFRUUF9IT1NUXFxbJyJdXHMqXF1ccypcKSI7aToyNjk7czoxNzA6IlwkaW5mbyBcLj0gXChcKFwkcGVybXNccyomXHMqMHgwMDQwXClccypcP1woXChcJHBlcm1zXHMqJlxzKjB4MDgwMFwpXHMqXD9ccypcXFsnIl1zXFxbJyJdXHMqOlxzKlxcWyciXXhcXFsnIl1ccypcKVxzKjpcKFwoXCRwZXJtc1xzKiZccyoweDA4MDBcKVxzKlw/XHMqJ1MnXHMqOlxzKictJ1xzKlwpIjtpOjI3MDtzOjM1OiJkZWZhdWx0X2FjdGlvblxzKj1ccypcXFsnIl1GaWxlc01hbiI7aToyNzE7czozMzoic3lzdGVtXHMrZmlsZVxzK2RvXHMrbm90XHMrZGVsZXRlIjtpOjI3MjtzOjE5OiJoYWNrZWRccytieVxzK0htZWk3IjtpOjI3MztzOjExOiJieVxzK0dyaW5heSI7aToyNzQ7czoyMzoiQ2FwdGFpblxzK0NydW5jaFxzK1RlYW0iO2k6Mjc1O3M6OTY6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtccypbJyJdezAsMX1wMlsnIl17MCwxfVxzKlxdXHMqPT1ccypbJyJdezAsMX1jaG1vZFsnIl17MCwxfSI7fQ=="));
$gX_FlexDBShe = unserialize(base64_decode("YToyNTI6e2k6MDtzOjIyOiJkaXNhYmxlX2Z1bmN0aW9ucz1OT05FIjtpOjE7czoyMToiJl9TRVNTSU9OXFtwYXlsb2FkXF09IjtpOjI7czoyNjoiPFw/XHMqPUBgXCRbYS16QS1aMC05X10rP2AiO2k6MztzOjE2OiJQSFBTSEVMTF9WRVJTSU9OIjtpOjQ7czo2OToidG91Y2hcKFxzKlwkX1NFUlZFUlxbXHMqWyciXURPQ1VNRU5UX1JPT1RbJyJdXHMqXF1ccypcLlxzKlsnIl0vZW5naW5lIjtpOjU7czo4MToiZmlsZV9nZXRfY29udGVudHNcKFxzKlwkX1NFUlZFUlxbXHMqWyciXURPQ1VNRU5UX1JPT1RbJyJdXHMqXF1ccypcLlxzKlsnIl0vZW5naW5lIjtpOjY7czo1NjoiQFwkX1NFUlZFUlxbXHMqSFRUUF9IT1NUXHMqXF0+WyciXVxzKlwuXHMqWyciXVxcclxcblsnIl0iO2k6NztzOjcxOiJ0cmltXChccypcJGhlYWRlcnNccypcKVxzKlwpXHMqYXNccypcJGhlYWRlclxzKlwpXHMqaGVhZGVyXChccypcJGhlYWRlciI7aTo4O3M6MTY6IkNvZGVkXHMrYnlccytFWEUiO2k6OTtzOjEyOiJCeVxzK1dlYlJvb1QiO2k6MTA7czoyMDoiaGVhZGVyXHMqXChccypfXGQrXCgiO2k6MTE7czo0MToiaWZccypcKGZ1bmN0aW9uX2V4aXN0c1woXHMqWyciXXBjbnRsX2ZvcmsiO2k6MTI7czoyOToiZG9fd29ya1woXHMqXCRpbmRleF9maWxlXHMqXCkiO2k6MTM7czo4MzoiXCRpZFxzKlwuXHMqWyciXVw/ZD1bJyJdXHMqXC5ccypiYXNlNjRfZW5jb2RlXChccypcJF9TRVJWRVJcW1xzKlsnIl1IVFRQX1VTRVJfQUdFTlQiO2k6MTQ7czoyNToibmV3XHMrY29uZWN0QmFzZVwoWyciXWFIUiI7aToxNTtzOjkwOiJmaWxlX2dldF9jb250ZW50c1woUk9PVF9ESVJcLlsnIl0vdGVtcGxhdGVzL1snIl1cLlwkY29uZmlnXFtbJyJdc2tpblsnIl1cXVwuWyciXS9tYWluXC50cGwiO2k6MTY7czo1OToiJTwhLS1cXHNcKlwkbWFya2VyXFxzXCotLT5cLlwrXD88IS0tXFxzXCovXCRtYXJrZXJcXHNcKi0tPiUiO2k6MTc7czoyNDoiZnVuY3Rpb25ccytnZXRmaXJzdHNodGFnIjtpOjE4O3M6MTg6InJlc3VsdHNpZ25fd2FybmluZyI7aToxOTtzOjI5OiJmaWxlX2V4aXN0c1woXHMqXCRGaWxlQmF6YVRYVCI7aToyMDtzOjE5OiI9PVxzKlsnIl1jc2hlbGxbJyJdIjtpOjIxO3M6NjE6IlwkX1NFUlZFUlxbWyciXXswLDF9UkVNT1RFX0FERFJbJyJdezAsMX1cXTtpZlwoXChwcmVnX21hdGNoXCgiO2k6MjI7czo2NzoiXCRmaWxlX2Zvcl90b3VjaFxzKj1ccypcJF9TRVJWRVJcW1snIl17MCwxfURPQ1VNRU5UX1JPT1RbJyJdezAsMX1cXSI7aToyMztzOjIzOiJcJGluZGV4X3BhdGhccyosXHMqMDQwNCI7aToyNDtzOjMwOiJyZWFkX2ZpbGVfbmV3XzJcKFwkcmVzdWx0X3BhdGgiO2k6MjU7czozODoiY2hyXChccypoZXhkZWNcKFxzKnN1YnN0clwoXHMqXCRtYWtldXAiO2k6MjY7czoyNzoiXGQrJkBwcmVnX21hdGNoXChccypzdHJ0clwoIjtpOjI3O3M6NzU6InZhbHVlPVsnIl08XD9ccysoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoWyciXSI7aToyODtzOjE4OiJBY2FkZW1pY29ccytSZXN1bHQiO2k6Mjk7czozMDoiU0VMRUNUXHMrXCpccytGUk9NXHMrZG9yX3BhZ2VzIjtpOjMwO3M6NDE6ImdfZGVsZXRlX29uX2V4aXRccyo9XHMqbmV3XHMrRGVsZXRlT25FeGl0IjtpOjMxO3M6NTI6ImlmXChwcmVnX21hdGNoXChbJyJdI3dvcmRwcmVzc19sb2dnZWRfaW5cfGFkbWluXHxwd2QiO2k6MzI7czo1MDoiWyciXVwuWyciXVsnIl1cLlsnIl1bJyJdXC5bJyJdWyciXVwuWyciXVsnIl1cLlsnIl0iO2k6MzM7czoyODoiXCk7ZnVuY3Rpb25ccytzdHJpbmdfY3B0XChcJCI7aTozNDtzOjI4OiJcJHNldGNvb2tcKTtzZXRjb29raWVcKFwkc2V0IjtpOjM1O3M6MzU6Ijxsb2M+PFw/cGhwXHMrZWNob1xzK1wkY3VycmVudF91cmw7IjtpOjM2O3M6NDA6IlwkYmFubmVkSVBccyo9XHMqYXJyYXlcKFxzKlsnIl1cXjY2XC4xMDIiO2k6Mzc7czo2MjoiXCRyZXN1bHQ9c21hcnRDb3B5XChccypcJHNvdXJjZVxzKlwuXHMqWyciXS9bJyJdXHMqXC5ccypcJGZpbGUiO2k6Mzg7czozODoiXCRmaWxsID0gXCRfQ09PS0lFXFtcXFsnIl1maWxsXFxbJyJdXF0iO2k6Mzk7czo4MzoiaWZcKFsnIl1zdWJzdHJfY291bnRcKFsnIl1cJF9TRVJWRVJcW1snIl1SRVFVRVNUX1VSSVsnIl1cXVxzKixccypbJyJdcXVlcnlcLnBocFsnIl0iO2k6NDA7czo4NToiaWZcKFxzKlwkX0dFVFxbXHMqWyciXWlkWyciXVxzKlxdIT1ccypbJyJdWyciXVxzKlwpXHMqXCRpZD1cJF9HRVRcW1xzKlsnIl1pZFsnIl1ccypcXSI7aTo0MTtzOjIyOiI8YVxzK2hyZWY9WyciXW9zaGlia2EtIjtpOjQyO3M6NzY6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChccypbJyJdY2RccysvdG1wO3dnZXQiO2k6NDM7czo1NToiZ2V0cHJvdG9ieW5hbWVcKFxzKlsnIl10Y3BbJyJdXHMqXClccytcfFx8XHMrZGllXHMrc2hpdCI7aTo0NDtzOjQ3OiJmaWxlX3B1dF9jb250ZW50c1woXHMqXCRpbmRleF9wYXRoXHMqLFxzKlwkY29kZSI7aTo0NTtzOjY2OiIsXHMqWyciXS9pbmRleFxcXC5cKHBocFx8aHRtbFwpL2lbJyJdXHMqLFxzKlJlY3Vyc2l2ZVJlZ2V4SXRlcmF0b3IiO2k6NDY7czoxMzoiQU9MXHMrRGV0YWlscyI7aTo0NztzOjIwOiJ0SEFOS3Nccyt0T1xzK1Nub3BweSI7aTo0ODtzOjIwOiJNYXNyMVxzK0N5YjNyXHMrVGU0bSI7aTo0OTtzOjE4OiJVczNccytZMHVyXHMrYnI0MW4iO2k6NTA7czoyMDoiTWFzcmlccytDeWJlclxzK1RlYW0iO2k6NTE7czo0OToiZndyaXRlXChcJGZwXHMqLFxzKnN0cnJldlwoXHMqXCRjb250ZXh0XHMqXClccypcKSI7aTo1MjtzOjk6Ii9wbXQvcmF2LyI7aTo1MztzOjM0OiJmaWxlX2dldF9jb250ZW50c1woXHMqWyciXS92YXIvdG1wIjtpOjU0O3M6MjM6IlwkaW5fUGVybXNccysmXHMrMHg0MDAwIjtpOjU1O3M6NDM6ImZvcGVuXChccypcJHJvb3RfZGlyXHMqXC5ccypbJyJdL1wuaHRhY2Nlc3MiO2k6NTY7czo2MjoiaW50MzJcKFwoXChcJHpccyo+PlxzKjVccyomXHMqMHgwN2ZmZmZmZlwpXHMqXF5ccypcJHlccyo8PFxzKjIiO2k6NTc7czozNToiPGd1aWQ+PFw/cGhwXHMrZWNob1xzK1wkY3VycmVudF91cmwiO2k6NTg7czoxOToiLWtseWNoLWstaWdyZVwuaHRtbCI7aTo1OTtzOjY2OiI8ZGl2XHMraWQ9WyciXWxpbmsxWyciXT48YnV0dG9uIG9uY2xpY2s9WyciXXByb2Nlc3NUaW1lclwoXCk7WyciXT4iO2k6NjA7czoxMToic2NvcGJpblsnIl0iO2k6NjE7czoxNDoiLUFwcGxlX1Jlc3VsdC0iO2k6NjI7czo0NzoidGFyXHMrLWN6ZlxzKyJccypcLlxzKlwkRk9STXt0YXJ9XHMqXC5ccyoiXC50YXIiO2k6NjM7czoxNDoiQ1ZWMjpccypcJENWVjIiO2k6NjQ7czo2MzoiXCRDVlYyQ1xzKj1ccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbXHMqWyciXUNWVjJDIjtpOjY1O3M6NzU6ImZ3cml0ZVwoXHMqXCRmXHMqLFxzKmdldF9kb3dubG9hZFwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aTo2NjtzOjMzOiJcW1xdXHMqPVxzKlsnIl1SZXdyaXRlRW5naW5lXHMrb24iO2k6Njc7czo5ODoic3Vic3RyXChccypcJHN0cmluZzJccyosXHMqc3RybGVuXChccypcJHN0cmluZzJccypcKVxzKi1ccyo5XHMqLFxzKjlcKVxzKj09XHMqWyciXXswLDF9XFtsLHI9MzAyXF0iO2k6Njg7czoxMzoiPWJ5XHMrRFJBR09OPSI7aTo2OTtzOjQwOiJfX2ZpbGVfZ2V0X3VybF9jb250ZW50c1woXHMqXCRyZW1vdGVfdXJsIjtpOjcwO3M6ODI6IlwkVVJMXHMqPVxzKlwkdXJsc1xbXHMqcmFuZFwoXHMqMFxzKixccypjb3VudFwoXHMqXCR1cmxzXHMqXClccyotXHMqMVwpXHMqXF1cLnJhbmQiO2k6NzE7czo0OToibWFpbFwoXHMqXCRyZXRvcm5vXHMqLFxzKlwkYXN1bnRvXHMqLFxzKlwkbWVuc2FqZSI7aTo3MjtzOjc4OiJjYWxsX3VzZXJfZnVuY1woXHMqWyciXWFjdGlvblsnIl1ccypcLlxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6NzM7czozNToiZmlsZV9leGlzdHNcKFxzKlsnIl0vdG1wL3RtcC1zZXJ2ZXIiO2k6NzQ7czoyNzoiXChbJyJdXCR0bXBkaXIvc2Vzc19mY1wubG9nIjtpOjc1O3M6NTI6InRvdWNoXChccypbJyJdezAsMX1cJGJhc2VwYXRoL2NvbXBvbmVudHMvY29tX2NvbnRlbnQiO2k6NzY7czo0NjoiPVwkZmlsZVwoQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aTo3NztzOjcyOiJzZW5kX3NtdHBcKFxzKlwkZW1haWxcW1snIl17MCwxfWFkclsnIl17MCwxfVxdXHMqLFxzKlwkc3VialxzKixccypcJHRleHQiO2k6Nzg7czozNDoiX19MSU5LX188YVxzK2hyZWY9WyciXXswLDF9aHR0cDovLyI7aTo3OTtzOjQ0OiJzY3JpcHRzXFtccypnenVuY29tcHJlc3NcKFxzKmJhc2U2NF9kZWNvZGVcKCI7aTo4MDtzOjc4OiIhZmlsZV9wdXRfY29udGVudHNcKFxzKlwkZGJuYW1lXHMqLFxzKlwkdGhpcy0+Z2V0SW1hZ2VFbmNvZGVkVGV4dFwoXHMqXCRkYm5hbWUiO2k6ODE7czoxMTc6IlwkY29udGVudFxzKj1ccypodHRwX3JlcXVlc3RcKFsnIl17MCwxfWh0dHA6Ly9bJyJdezAsMX1ccypcLlxzKlwkX1NFUlZFUlxbWyciXXswLDF9U0VSVkVSX05BTUVbJyJdezAsMX1cXVwuWyciXXswLDF9LyI7aTo4MjtzOjYwOiJtYWlsXChccypcJE1haWxUb1xzKixccypcJE1lc3NhZ2VTdWJqZWN0XHMqLFxzKlwkTWVzc2FnZUJvZHkiO2k6ODM7czozNjoiZmlsZV9wdXRfY29udGVudHNcKFxzKlsnIl17MCwxfS9ob21lIjtpOjg0O3M6NzA6Im1haWxcKFxzKlwkYVxbXGQrXF1ccyosXHMqXCRhXFtcZCtcXVxzKixccypcJGFcW1xkK1xdXHMqLFxzKlwkYVxbXGQrXF0iO2k6ODU7czoyMzoiaXNfd3JpdGFibGU9aXNfd3JpdGFibGUiO2k6ODY7czoyMzoiZXhwbG9pdC1kYlwuY29tL3NlYXJjaC8iO2k6ODc7czoxNDoiRGF2aWRccypCbGFpbmUiO2k6ODg7czozMzoiY3JvbnRhYlxzKy1sXHxncmVwXHMrLXZccytjcm9udGFiIjtpOjg5O3M6ODA6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChccypbJyJdezAsMX1hdFxzK25vd1xzKy1mIjtpOjkwO3M6NjM6IiMhL2Jpbi9zaG5jZFxzK1snIl17MCwxfVsnIl17MCwxfVwuXCRTQ1BcLlsnIl17MCwxfVsnIl17MCwxfW5pZiI7aTo5MTtzOjQ0OiJmaWxlX3B1dF9jb250ZW50c1woWyciXXswLDF9XC4vbGlid29ya2VyXC5zbyI7aTo5MjtzOjM2OiJcJHVzZXJfYWdlbnRfdG9fZmlsdGVyXHMqPVxzKmFycmF5XCgiO2k6OTM7czoyMDoiZm9wZW5cKFxzKlsnIl0vaG9tZS8iO2k6OTQ7czoyMDoibWtkaXJcKFxzKlsnIl0vaG9tZS8iO2k6OTU7czozOToiI1VzZVsnIl17MCwxfVxzKixccypmaWxlX2dldF9jb250ZW50c1woIjtpOjk2O3M6Mjk6ImVyZWdpXChccypzcWxfcmVnY2FzZVwoXHMqXCRfIjtpOjk3O3M6NzE6IlwkX1xbXHMqXGQrXHMqXF1cKFxzKlwkX1xbXHMqXGQrXHMqXF1cKFwkX1xbXHMqXGQrXHMqXF1cKFxzKlwkX1xbXHMqXGQrIjtpOjk4O3M6MzY6ImV2YWxcKFxzKlwkW2EtekEtWjAtOV9dKz9cKFxzKlwkPGFtYyI7aTo5OTtzOjMzOiJAXCRmdW5jXChcJGNmaWxlLCBcJGNkaXJcLlwkY25hbWUiO2k6MTAwO3M6NjI6InVuYW1lXF1bJyJdezAsMX1ccypcLlxzKnBocF91bmFtZVwoXClccypcLlxzKlsnIl17MCwxfVxbL3VuYW1lIjtpOjEwMTtzOjU0OiJcJEdMT0JBTFNcW1snIl17MCwxfVthLXpBLVowLTlfXSs/WyciXXswLDF9XF1cKFxzKk5VTEwiO2k6MTAyO3M6MjM6Il9fdXJsX2dldF9jb250ZW50c1woXCRsIjtpOjEwMztzOjI2OiJcJGRvcl9jb250ZW50PXByZWdfcmVwbGFjZSI7aToxMDQ7czo3MzoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFsnIl1sc1xzKy92YXIvbWFpbCI7aToxMDU7czozMDoiaGVhZGVyXChbJyJdezAsMX1yOlxzKm5vXHMrY29tIjtpOjEwNjtzOjQ4OiJwcmVnX21hdGNoX2FsbFwoXHMqWyciXVx8XChcLlwqXCk8XFwhLS0ganMtdG9vbHMiO2k6MTA3O3M6Mzc6ImlmXHMqXChccyppbmlfZ2V0XChbJyJdezAsMX1zYWZlX21vZGUiO2k6MTA4O3M6NDk6IkAqZmlsZV9wdXRfY29udGVudHNcKFxzKlwkdGhpcy0+ZmlsZVxzKixccypzdHJyZXYiO2k6MTA5O3M6NDE6Ii9wbHVnaW5zL3NlYXJjaC9xdWVyeVwucGhwXD9fX19fcGdmYT1odHRwIjtpOjExMDtzOjkxOiJtYWlsXChccypzdHJpcHNsYXNoZXNcKFwkdG9cKVxzKixccypzdHJpcHNsYXNoZXNcKFwkc3ViamVjdFwpXHMqLFxzKnN0cmlwc2xhc2hlc1woXCRtZXNzYWdlIjtpOjExMTtzOjg1OiJcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9dXJbJyJdezAsMX1cXVwpXClccypcJG1vZGVccypcfD1ccyowNDAwIjtpOjExMjtzOjgyOiJlcmVnX3JlcGxhY2VcKFsnIl17MCwxfSU1QyUyMlsnIl17MCwxfVxzKixccypbJyJdezAsMX0lMjJbJyJdezAsMX1ccyosXHMqXCRtZXNzYWdlIjtpOjExMztzOjg4OiJmaWxlX3B1dF9jb250ZW50c1woXHMqXCRuYW1lXHMqLFxzKmJhc2U2NF9kZWNvZGVcKFxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjExNDtzOjEyMjoid2luZG93XC5sb2NhdGlvbj1ifVxzKlwpXChccypuYXZpZ2F0b3JcLnVzZXJBZ2VudFxzKlx8XHxccypuYXZpZ2F0b3JcLnZlbmRvclxzKlx8XHxccyp3aW5kb3dcLm9wZXJhXHMqLFxzKlsnIl17MCwxfWh0dHA6Ly8iO2k6MTE1O3M6ODk6Ilwkc2FwZV9vcHRpb25cW1xzKlsnIl17MCwxfWZldGNoX3JlbW90ZV90eXBlWyciXXswLDF9XHMqXF1ccyo9XHMqWyciXXswLDF9c29ja2V0WyciXXswLDF9IjtpOjExNjtzOjEwNToiXCRwYXRoXHMqPVxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxzKlxdXHMqXC5ccypbJyJdezAsMX0vaW1hZ2VzL3N0b3JpZXMvWyciXXswLDF9IjtpOjExNztzOjgyOiJAKmFycmF5X2RpZmZfdWtleVwoXHMqQCphcnJheVwoXHMqXChzdHJpbmdcKVxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjExODtzOjIwOiJldmFsXHMqXChccypUUExfRklMRSI7aToxMTk7czozODoiSlJlc3BvbnNlOjpzZXRCb2R5XHMqXChccypwcmVnX3JlcGxhY2UiO2k6MTIwO3M6NDg6IlxzKlsnIl17MCwxfXNsdXJwWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfW1zbmJvdCI7aToxMjE7czo1NDoiXHMqWyciXXswLDF9cm9va2VlWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfXdlYmVmZmVjdG9yIjtpOjEyMjtzOjExOiJDb3VwZGVncmFjZSI7aToxMjM7czoxMjoiU3VsdGFuSGFpa2FsIjtpOjEyNDtzOjYwOiJmaWxlX2dldF9jb250ZW50c1woYmFzZW5hbWVcKFwkX1NFUlZFUlxbWyciXXswLDF9U0NSSVBUX05BTUUiO2k6MTI1O3M6Mjc6Imh0dHBzOi8vYXBwbGVpZFwuYXBwbGVcLmNvbSI7aToxMjY7czoxOToiXCRia2V5d29yZF9iZXo9WyciXSI7aToxMjc7czozNDoiY3JjMzJcKFxzKlwkX1BPU1RcW1xzKlsnIl17MCwxfWNtZCI7aToxMjg7czoxOToiZ3JlcFxzKy12XHMrY3JvbnRhYiI7aToxMjk7czoyODoiWyciXVsnIl1ccypcLlxzKmd6VW5jb01wcmVTcyI7aToxMzA7czoyOToiWyciXVsnIl1ccypcLlxzKkJBc2U2NF9kZUNvRGUiO2k6MTMxO3M6MzI6ImV2YWxcKFsnIl1cPz5bJyJdXC5iYXNlNjRfZGVjb2RlIjtpOjEzMjtzOjI3OiJjdXJsX2luaXRcKFxzKmJhc2U2NF9kZWNvZGUiO2k6MTMzO3M6MTI6Im1pbHcwcm1cLmNvbSI7aToxMzQ7czo0NToiXCRmaWxlXChAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjEzNTtzOjM2OiJyZXR1cm5ccytiYXNlNjRfZGVjb2RlXChcJGFcW1wkaVxdXCkiO2k6MTM2O3M6ODoiSGFyY2hhTGkiO2k6MTM3O3M6NjA6InBsdWdpbnMvc2VhcmNoL3F1ZXJ5XC5waHBcP19fX19wZ2ZhPWh0dHAlM0ElMkYlMkZ3d3dcLmdvb2dsZSI7aToxMzg7czozNjoiY3JlYXRlX2Z1bmN0aW9uXChzdWJzdHJcKDIsMVwpLFwkc1wpIjtpOjEzOTtzOjgxOiJ0eXBlb2ZccypcKGRsZV9hZG1pblwpXHMqPT1ccypbJyJdezAsMX11bmRlZmluZWRbJyJdezAsMX1ccypcfFx8XHMqZGxlX2FkbWluXHMqPT0iO2k6MTQwO3M6MzI6IlxbXCRvXF1cKTtcJG9cK1wrXCl7aWZcKFwkbzwxNlwpIjtpOjE0MTtzOjMyOiJcJFNcW1wkaVwrXCtcXVwoXCRTXFtcJGlcK1wrXF1cKCI7aToxNDI7czozNzoic2V0Y29va2llXChccypcJHpcWzBcXVxzKixccypcJHpcWzFcXSI7aToxNDM7czo4NjoiL2luZGV4XC5waHBcP29wdGlvbj1jb21famNlJnRhc2s9cGx1Z2luJnBsdWdpbj1pbWdtYW5hZ2VyJmZpbGU9aW1nbWFuYWdlciZ2ZXJzaW9uPTE1NzYiO2k6MTQ0O3M6MTU6ImNhdGF0YW5ccytzaXR1cyI7aToxNDU7czo0MToiaWZcKFxzKmlzc2V0XChccypcJF9SRVFVRVNUXFtbJyJdezAsMX1jaWQiO2k6MTQ2O3M6NDA6InN0cl9yZXBsYWNlXHMqXChccypbJyJdezAsMX0vcHVibGljX2h0bWwiO2k6MTQ3O3M6NTE6IkBhcnJheVwoXHMqXChzdHJpbmdcKVxzKnN0cmlwc2xhc2hlc1woXHMqXCRfUkVRVUVTVCI7aToxNDg7czo2MDoiaWZccypcKFxzKmZpbGVfcHV0X2NvbnRlbnRzXHMqXChccypcJGluZGV4X3BhdGhccyosXHMqXCRjb2RlIjtpOjE0OTtzOjk0OiJpZlwoaXNfZGlyXChcJHBhdGhcLlsnIl17MCwxfS93cC1jb250ZW50WyciXXswLDF9XClccytBTkRccytpc19kaXJcKFwkcGF0aFwuWyciXXswLDF9L3dwLWFkbWluIjtpOjE1MDtzOjI4OiJpZlwoXCRvPDE2XCl7XCRoXFtcJGVcW1wkb1xdIjtpOjE1MTtzOjk6ImJ5XHMrZzAwbiI7aToxNTI7czoxNToiQXV0b1xzKlhwbG9pdGVyIjtpOjE1MztzOjEwMjoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFsnIl17MCwxfVwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiIjtpOjE1NDtzOjcyOiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoWyciXXswLDF9Y21kXC5leGUiO2k6MTU1O3M6OToiQnlccytEWjI3IjtpOjE1NjtzOjI3OiJFdGhuaWNccytBbGJhbmlhblxzK0hhY2tlcnMiO2k6MTU3O3M6MjA6IlZvbGdvZ3JhZGluZGV4XC5odG1sIjtpOjE1ODtzOjMyOiJcJF9Qb3N0XFtbJyJdezAsMX1TU05bJyJdezAsMX1cXSI7aToxNTk7czoxNToicGFja1xzKyJTbkE0eDgiIjtpOjE2MDtzOjE0OiJbJyJdezAsMX1EWmUxciI7aToxNjE7czoxMjoiVGVhTVxzK01vc1RhIjtpOjE2MjtzOjYzOiJpZlwobWFpbFwoXCRlbWFpbFxbXCRpXF0sXHMqXCRzdWJqZWN0LFxzKlwkbWVzc2FnZSxccypcJGhlYWRlcnMiO2k6MTYzO3M6MzY6InByaW50XHMrWyciXXswLDF9ZGxlX251bGxlZFsnIl17MCwxfSI7aToxNjQ7czozOToiaWZccypcKGNoZWNrX2FjY1woXCRsb2dpbixcJHBhc3MsXCRzZXJ2IjtpOjE2NTtzOjM4OiJwcmVnX3JlcGxhY2VcKFwpe3JldHVyblxzK19fRlVOQ1RJT05fXyI7aToxNjY7czozMzoiXCRvcHRccyo9XHMqXCRmaWxlXChAKlwkX0NPT0tJRVxbIjtpOjE2NztzOjM2OiJpZlwoQGZ1bmN0aW9uX2V4aXN0c1woWyciXXswLDF9ZnJlYWQiO2k6MTY4O3M6MTA4OiJmb3JcKFwkW2EtekEtWjAtOV9dKz89XGQrO1wkW2EtekEtWjAtOV9dKz88XGQrO1wkW2EtekEtWjAtOV9dKz8tPVxkK1wpe2lmXChcJFthLXpBLVowLTlfXSs/IT1cZCtcKVxzKmJyZWFrO30iO2k6MTY5O3M6MzU6IlwkY291bnRlclVybFxzKj1ccypbJyJdezAsMX1odHRwOi8vIjtpOjE3MDtzOjY3OiJhcnJheVwoXHMqWyciXWhbJyJdXHMqLFxzKlsnIl10WyciXVxzKixccypbJyJddFsnIl1ccyosXHMqWyciXXBbJyJdIjtpOjE3MTtzOjQyOiJpZlxzKlwoZnVuY3Rpb25fZXhpc3RzXChbJyJdc2Nhbl9kaXJlY3RvcnkiO2k6MTcyO3M6NjI6IlwkX1NFU1NJT05cW1snIl17MCwxfWRhdGFfYVsnIl17MCwxfVxdXFtcJG5hbWVcXVxzKj1ccypcJHZhbHVlIjtpOjE3MztzOjM4OiJaZW5kXHMrT3B0aW1pemF0aW9uXHMrdmVyXHMrMVwuMFwuMFwuMSI7aToxNzQ7czoyNjoiaW5kZXhcLnBocFw/aWQ9XCQxJiV7UVVFUlkiO2k6MTc1O3M6ODY6IkBpbmlfc2V0XHMqXChbJyJdezAsMX1pbmNsdWRlX3BhdGhbJyJdezAsMX0sWyciXXswLDF9aW5pX2dldFxzKlwoWyciXXswLDF9aW5jbHVkZV9wYXRoIjtpOjE3NjtzOjI4OiJpZlxzKlwoQGlzX3dyaXRhYmxlXChcJGluZGV4IjtpOjE3NztzOjI4OiJcJF9QT1NUXFtbJyJdezAsMX1zbXRwX2xvZ2luIjtpOjE3ODtzOjM3OiJfWyciXXswLDF9XF1cWzJcXVwoWyciXXswLDF9TG9jYXRpb246IjtpOjE3OTtzOjM0OiJpZlwoQHByZWdfbWF0Y2hcKHN0cnRyXChbJyJdezAsMX0vIjtpOjE4MDtzOjE1OiI8IS0tXHMranMtdG9vbHMiO2k6MTgxO3M6NzoidWdnYzovLyI7aToxODI7czo0NzoiaWYgXChkYXRlXChbJyJdezAsMX1qWyciXXswLDF9XClccyotXHMqXCRuZXdzaWQiO2k6MTgzO3M6MTY6IjxEYXZpZFxzK0JsYWluZT4iO2k6MTg0O3M6MjU6IlwkaXNldmFsZnVuY3Rpb25hdmFpbGFibGUiO2k6MTg1O3M6NDE6ImlmIFwoIXN0cnBvc1woXCRzdHJzXFswXF0sWyciXXswLDF9PFw/cGhwIjtpOjE4NjtzOjg1OiJcJHN0cmluZ1xzKj1ccypcJF9TRVNTSU9OXFtbJyJdezAsMX1kYXRhX2FbJyJdezAsMX1cXVxbWyciXXswLDF9bnV0emVybmFtZVsnIl17MCwxfVxdIjtpOjE4NztzOjU2OiJ3aGlsZVwoY291bnRcKFwkbGluZXNcKT5cJGNvbF96YXBcKSBhcnJheV9wb3BcKFwkbGluZXNcKSI7aToxODg7czoxMDQ6InNpdGVfZnJvbT1bJyJdezAsMX1cLlwkX1NFUlZFUlxbWyciXXswLDF9SFRUUF9IT1NUWyciXXswLDF9XF1cLlsnIl17MCwxfSZzaXRlX2ZvbGRlcj1bJyJdezAsMX1cLlwkZlxbMVxdIjtpOjE4OTtzOjMxOiJcJGZpbGViXHMqPVxzKmZpbGVfZ2V0X2NvbnRlbnRzIjtpOjE5MDtzOjMzOiJwb3J0bGV0cy9mcmFtZXdvcmsvc2VjdXJpdHkvbG9naW4iO2k6MTkxO3M6Mjk6IlwkYlxzKj1ccyptZDVfZmlsZVwoXCRmaWxlYlwpIjtpOjE5MjtzOjUxOiJcJGRhdGFccyo9XHMqYXJyYXlcKFsnIl17MCwxfXRlcm1pbmFsWyciXXswLDF9XHMqPT4iO2k6MTkzO3M6NzA6InN0cnBvc1woXCRfU0VSVkVSXFtbJyJdezAsMX1IVFRQX1JFRkVSRVJbJyJdezAsMX1cXSxccypbJyJdezAsMX1nb29nbGUiO2k6MTk0O3M6NzA6InN0cnBvc1woXCRfU0VSVkVSXFtbJyJdezAsMX1IVFRQX1JFRkVSRVJbJyJdezAsMX1cXSxccypbJyJdezAsMX15YW5kZXgiO2k6MTk1O3M6Nzc6InN0cmlzdHJcKFwkX1NFUlZFUlxbWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XF0sXHMqWyciXXswLDF9WWFuZGV4Qm90IjtpOjE5NjtzOjUzOiJmb3BlblwoWyciXXswLDF9XC5cLi9cLlwuL1wuXC4vWyciXXswLDF9XC5cJGZpbGVwYXRocyI7aToxOTc7czozNjoicHJlZ19yZXBsYWNlXChccypbJyJdZVsnIl0sWyciXXswLDF9IjtpOjE5ODtzOjQwOiIoW15cP1xzXSlcKHswLDF9XC5bXCtcKl1cKXswLDF9XDJbYS16XSplIjtpOjE5OTtzOjE3OiJteDJcLmhvdG1haWxcLmNvbSI7aToyMDA7czozNToicGhwX1snIl1cLlwkZXh0XC5bJyJdXC5kbGxbJyJdezAsMX0iO2k6MjAxO3M6MjA6Ii9lWyciXVxzKixccypbJyJdXFx4IjtpOjIwMjtzOjMyOiI8aDE+NDAzIEZvcmJpZGRlbjwvaDE+PCEtLSB0b2tlbiI7aToyMDM7czoyMzoiL3Zhci9xbWFpbC9iaW4vc2VuZG1haWwiO2k6MjA0O3M6NDQ6ImFycmF5XChccypbJyJdR29vZ2xlWyciXVxzKixccypbJyJdU2x1cnBbJyJdIjtpOjIwNTtzOjEyOiJhbmRleFx8b29nbGUiO2k6MjA2O3M6MjQ6InBhZ2VfZmlsZXMvc3R5bGUwMDBcLmNzcyI7aToyMDc7czoyMToiPT1bJyJdXClcKTtyZXR1cm47XD8+IjtpOjIwODtzOjE2OiJTcGFtXHMrY29tcGxldGVkIjtpOjIwOTtzOjM1OiJlY2hvXHMrWyciXXswLDF9aW5zdGFsbF9va1snIl17MCwxfSI7aToyMTA7czo2MDoiXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1snIl17MCwxfWN2dlsnIl17MCwxfVxdIjtpOjIxMTtzOjExOiJDVlY6XHMqXCRjdiI7aToyMTI7czozMDoiY3VybFwuaGF4eFwuc2UvcmZjL2Nvb2tpZV9zcGVjIjtpOjIxMztzOjEyOiJraWxsYWxsXHMrLTkiO2k6MjE0O3M6NTc6InByZWdfcmVwbGFjZVxzKlwoXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aToyMTU7czo1ODoiXCRtYWlsZXJccyo9XHMqXCRfUE9TVFxbXHMqWyciXXswLDF9eF9tYWlsZXJbJyJdezAsMX1ccypcXSI7aToyMTY7czozMDoicHJlZ19yZXBsYWNlXHMqXChccypbJyJdL1wuXCovIjtpOjIxNztzOjI5OiJFcnJvckRvY3VtZW50XHMrNDAwXHMraHR0cDovLyI7aToyMTg7czoyOToiRXJyb3JEb2N1bWVudFxzKzUwMFxzK2h0dHA6Ly8iO2k6MjE5O3M6Mjg6Imdvb2dsZVx8eWFuZGV4XHxib3RcfHJhbWJsZXIiO2k6MjIwO3M6MjE6ImV2YWxccypcKFxzKnN0cl9yb3QxMyI7aToyMjE7czozODoiZXZhbFxzKlwoXHMqZ3ppbmZsYXRlXHMqXChccypzdHJfcm90MTMiO2k6MjIyO3M6NDg6ImZ1bmN0aW9uXHMqY2htb2RfUlxzKlwoXHMqXCRwYXRoXHMqLFxzKlwkcGVybVxzKiI7aToyMjM7czozMzoic3ltYmlhblx8bWlkcFx8d2FwXHxwaG9uZVx8cG9ja2V0IjtpOjIyNDtzOjI4OiJlY2hvXHMrWyciXW9cLmtcLlsnIl07XHMqXD8+IjtpOjIyNTtzOjcyOiJAc2V0Y29va2llXChbJyJdbVsnIl0sXHMqWyciXVthLXpBLVowLTlfXSs/WyciXSxccyp0aW1lXChcKVxzKlwrXHMqODY0MDAiO2k6MjI2O3M6NzA6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqWyciXXdnZXQiO2k6MjI3O3M6MzM6Imd6dW5jb21wcmVzc1xzKlwoXHMqYmFzZTY0X2RlY29kZSI7aToyMjg7czozMDoiZ3ppbmZsYXRlXHMqXChccypiYXNlNjRfZGVjb2RlIjtpOjIyOTtzOjI1OiJldmFsXHMqXChccypiYXNlNjRfZGVjb2RlIjtpOjIzMDtzOjMyOiJzdHJfaXJlcGxhY2VccypcKCpccypbJyJdPC9oZWFkPiI7aToyMzE7czozOToiaWZccypcKFxzKnByZWdfbWF0Y2hccypcKFxzKlsnIl0jeWFuZGV4IjtpOjIzMjtzOjMxOiI9XHMqYXJyYXlfbWFwXHMqXCgqXHMqc3RycmV2XHMqIjtpOjIzMztzOjk6IlwkX19fXHMqPSI7aToyMzQ7czo0OToiZ3p1bmNvbXByZXNzXHMqXCgqXHMqc3Vic3RyXHMqXCgqXHMqYmFzZTY0X2RlY29kZSI7aToyMzU7czoyMzoiQWRkSGFuZGxlclxzK3BocC1zY3JpcHQiO2k6MjM2O3M6MTQ1OiJcJFthLXpBLVowLTlfXSs/XHMqXChccypcZCtccypcXlxzKlxkK1xzKlwpXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XHMqXChccypcZCtccypcXlxzKlxkK1xzKlwpXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XHMqXChccypcZCtccypcXlxzKlxkK1xzKlwpIjtpOjIzNztzOjM4OiJzdHJlYW1fc29ja2V0X2NsaWVudFxzKlwoXHMqWyciXXRjcDovLyI7aToyMzg7czo5NToiaXNzZXRcKFxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1snIl1bYS16QS1aMC05X10rP1snIl1cXVwpXHMqb3JccypkaWVcKCouKj9cKSoiO2k6MjM5O3M6NTc6Ik9wdGlvbnNccytGb2xsb3dTeW1MaW5rc1xzK011bHRpVmlld3NccytJbmRleGVzXHMrRXhlY0NHSSI7aToyNDA7czozMjoiaXNfd3JpdGFibGVccypcKCpccypbJyJdL3Zhci90bXAiO2k6MjQxO3M6OTU6ImFkZF9maWx0ZXJccypcKCpccypbJyJdezAsMX10aGVfY29udGVudFsnIl17MCwxfVxzKixccypbJyJdezAsMX1fYmxvZ2luZm9bJyJdezAsMX1ccyosXHMqLis/XCkqIjtpOjI0MjtzOjI5OiJldmFsXHMqXCgqXHMqZ2V0X29wdGlvblxzKlwoKiI7aToyNDM7czoxMDQ6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKlxbIjtpOjI0NDtzOjEwNzoiaWZccypcKFxzKmlzX2NhbGxhYmxlXHMqXCgqXHMqWyciXXswLDF9KGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilbJyJdezAsMX1ccypcKSoiO2k6MjQ1O3M6MTE0OiJpZlxzKlwoXHMqZnVuY3Rpb25fZXhpc3RzXHMqXChccypbJyJdezAsMX0oZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVsnIl17MCwxfVxzKlwpXHMqXCkiO2k6MjQ2O3M6NzQ6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqWyciXXJtXHMqLWZyIjtpOjI0NztzOjc0OiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVxzKlwoKlxzKlsnIl1ybVxzKi1yZiI7aToyNDg7czo3ODoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilccypcKCpccypbJyJdcm1ccyotclxzKi1mIjtpOjI0OTtzOjQwOiJldmFsXHMqXCgqXHMqZ3ppbmZsYXRlXHMqXCgqXHMqc3RyX3JvdDEzIjtpOjI1MDtzOjE5OiJyb3VuZFxzKlwoXHMqMFxzKlwrIjtpOjI1MTtzOjE5OiJDb250ZW50LVR5cGU6XHMqXCRfIjt9"));
$gXX_FlexDBShe = unserialize(base64_decode("YToyMDg6e2k6MDtzOjQ4OiJwYXJzZV9xdWVyeV9zdHJpbmdcKFxzKlwkRU5We1xzKlsnIl1RVUVSWV9TVFJJTkciO2k6MTtzOjQ0OiJAXCRbYS16QS1aMC05X10rP1woXHMqXCRbYS16QS1aMC05X10rP1xzKlwpOyI7aToyO3M6Mzk6IlthLXpBLVowLTlfXSs/XChccypbYS16QS1aMC05X10rPz1ccypcKSI7aTozO3M6MTI6IlsnIl1yaW55WyciXSI7aTo0O3M6MTQ6IlsnIl1mbGZncnpbJyJdIjtpOjU7czoxNToiWyciXW9mbmlwaHBbJyJdIjtpOjY7czoxNzoiWyciXTMxdG9yX3J0c1snIl0iO2k6NztzOjE0OiJbJyJddHJlc3NhWyciXSI7aTo4O3M6MTM6ImVkb2NlZF80NmVzYWIiO2k6OTtzOjEyOiJzc2VycG1vY251emciO2k6MTA7czo5OiJldGFsZm5pemciO2k6MTE7czoxMjoiWyciXXJpbnlbJyJdIjtpOjEyO3M6MTQ6IlsnIl1mbGZncnpbJyJdIjtpOjEzO3M6NzoiY3VjdmFzYiI7aToxNDtzOjk6ImZnZV9lYmcxMyI7aToxNTtzOjE0OiJbJyJdbmZmcmVnWyciXSI7aToxNjtzOjEzOiJvbmZyNjRfcXJwYnFyIjtpOjE3O3M6MTI6InRtaGFwYnpjZXJmZiI7aToxODtzOjk6InRtdmFzeW5nciI7aToxOTtzOjQ4OiI8XD9ccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XHMqXCkiO2k6MjA7czoyMToiZGF0YTp0ZXh0L2h0bWw7YmFzZTY0IjtpOjIxO3M6MTM6Im51bGxfZXhwbG9pdHMiO2k6MjI7czoxMzA6ImlmXChpc3NldFwoXCRfUkVRVUVTVFxbWyciXVthLXpBLVowLTlfXSs/WyciXVxdXClcKVxzKntccypcJFthLXpBLVowLTlfXSs/XHMqPVxzKlwkX1JFUVVFU1RcW1snIl1bYS16QS1aMC05X10rP1snIl1cXTtccypleGl0XChcKTsiO2k6MjM7czo1NjoibWFpbFwoXHMqXCRhcnJcW1snIl10b1snIl1cXVxzKixccypcJGFyclxbWyciXXN1YmpbJyJdXF0iO2k6MjQ7czoyNDoidW5saW5rXChccypfX0ZJTEVfX1xzKlwpIjtpOjI1O3M6MjE6Ii1JL3Vzci9sb2NhbC9iYW5kbWFpbiI7aToyNjtzOjQzOiJuYW1lPVsnIl11cGxvYWRlclsnIl1ccytpZD1bJyJddXBsb2FkZXJbJyJdIjtpOjI3O3M6MzE6ImVjaG9ccypbJyJdPGI+VXBsb2FkPHNzPlN1Y2Nlc3MiO2k6Mjg7czozNzoiaGVhZGVyXChccypbJyJdTG9jYXRpb246XHMqXCRsaW5rWyciXSI7aToyOTtzOjUxOiJ0eXBlPVsnIl1zdWJtaXRbJyJdXHMqdmFsdWU9WyciXVVwbG9hZCBmaWxlWyciXVxzKj4iO2k6MzA7czozMDoiZWxzZVxzKntccyplY2hvXHMqWyciXWZhaWxbJyJdIjtpOjMxO3M6NDQ6IlxzKj1ccyppbmlfZ2V0XChccypbJyJdZGlzYWJsZV9mdW5jdGlvbnNbJyJdIjtpOjMyO3M6NTc6IkBlcnJvcl9yZXBvcnRpbmdcKFxzKjBccypcKTtccyppZlxzKlwoXHMqIWlzc2V0XHMqXChccypcJCI7aTozMztzOjU4OiJyb3VuZFxzKlwoXHMqXChccypcJHBhY2tldHNccypcKlxzKjY1XClccyovXHMqMTAyNFxzKixccyoyIjtpOjM0O3M6MTI6Ilplcm9EYXlFeGlsZSI7aTozNTtzOjExOiJTX1xdQF9cXlVcXiI7aTozNjtzOjUwOiI8aW5wdXRccyt0eXBlPXN1Ym1pdFxzK3ZhbHVlPVVwbG9hZFxzKi8+XHMqPC9mb3JtPiI7aTozNztzOjEwODoiaWZcKFxzKiFzb2NrZXRfc2VuZHRvXChccypcJHNvY2tldFxzKixccypcJGRhdGFccyosXHMqc3RybGVuXChccypcJGRhdGFccypcKVxzKixccyowXHMqLFxzKlwkaXBccyosXHMqXCRwb3J0IjtpOjM4O3M6NTQ6InN1YnN0clwoXHMqXCRyZXNwb25zZVxzKixccypcJGluZm9cW1xzKlsnIl1oZWFkZXJfc2l6ZSI7aTozOTtzOjE5OiJkaWVcKFxzKlsnIl1ubyBjdXJsIjtpOjQwO3M6NzQ6IlwkcmV0ID0gXCR0aGlzLT5fZGItPnVwZGF0ZU9iamVjdFwoIFwkdGhpcy0+X3RibCwgXCR0aGlzLCBcJHRoaXMtPl90Ymxfa2V5IjtpOjQxO3M6NDQ6Im9wZW5ccypcKFxzKk1ZRklMRVxzKixccypbJyJdXHMqPlxzKnRhclwudG1wIjtpOjQyO3M6MTg6Ii1cKi1ccypjb25mXHMqLVwqLSI7aTo0MztzOjQ5OiJAdG91Y2hccypcKFxzKlwkY3VyZmlsZVxzKixccypcJHRpbWVccyosXHMqXCR0aW1lIjtpOjQ0O3M6MzM6InRvdWNoXHMqXChccypkaXJuYW1lXChccypfX0ZJTEVfXyI7aTo0NTtzOjI3OiJcLlwuL1wuXC4vXC5cLi9cLlwuL21vZHVsZXMiO2k6NDY7czoyOToiZXhlY1woXHMqWyciXS9iaW4vc2hbJyJdXHMqXCkiO2k6NDc7czoxNToiL3RtcC9cLklDRS11bml4IjtpOjQ4O3M6MTU6Ii90bXAvdG1wLXNlcnZlciI7aTo0OTtzOjI2OiI9XHMqWyciXXNlbmRtYWlsXHMqLXRccyotZiI7aTo1MDtzOjI0OiJwcm9jX2Nsb3NlXChccypcJHByb2Nlc3MiO2k6NTE7czoxNjoiO1xzKi9iaW4vc2hccyotaSI7aTo1MjtzOjIzOiJbJyJdXHMqXHxccyovYmluL3NoWyciXSI7aTo1MztzOjQyOiJAdW1hc2tcKFxzKjA3NzdccyomXHMqflxzKlwkZmlsZXBlcm1pc3Npb24iO2k6NTQ7czo1MjoiY2htb2RcKFxzKlwkW1xzJVwuQFwtXCtcKFwpL2EtekEtWjAtOV9dKz9ccyosXHMqMDc1NSI7aTo1NTtzOjUyOiJjaG1vZFwoXHMqXCRbXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1xzKixccyowNDA0IjtpOjU2O3M6NDc6InN0cnRvbG93ZXJcKFxzKnN1YnN0clwoXHMqXCR1c2VyX2FnZW50XHMqLFxzKjAsIjtpOjU3O3M6OToiTDNaaGNpOTNkIjtpOjU4O3M6NTU6Ilwkb3V0XHMqXC49XHMqXCR0ZXh0e1xzKlwkaVxzKn1ccypcXlxzKlwka2V5e1xzKlwkalxzKn0iO2k6NTk7czo4NDoiL2luZGV4XC5waHBcP29wdGlvbj1jb21fY29udGVudCZ2aWV3PWFydGljbGUmaWQ9WyciXVwuXCRwb3N0XFtbJyJdezAsMX1pZFsnIl17MCwxfVxdIjtpOjYwO3M6Mjc6IkBjaGRpclwoXHMqXCRfUE9TVFxbXHMqWyciXSI7aTo2MTtzOjY0OiJpc3NldFwoXHMqXCRfQ09PS0lFXFtccyptZDVcKFxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9SFRUUF9IT1NUIjtpOjYyO3M6Mjc6InN0cmxlblwoXHMqXCRwYXRoVG9Eb3JccypcKSI7aTo2MztzOjI5OiJmb3BlblwoXHMqWyciXVwuXC4vXC5odGFjY2VzcyI7aTo2NDtzOjQzOiJcJF9QT1NUXFtccypbJyJdezAsMX1lTWFpbEFkZFsnIl17MCwxfVxzKlxdIjtpOjY1O3M6NzI6Im1haWxcKFxzKlwkcmVjaXBpZW50XHMqLFxzKlwkc3ViamVjdFxzKixccypcJG1lc3NhZ2VccyosXHMqXCRoZWFkZXJccypcKSI7aTo2NjtzOjY4OiJtYWlsXChccypcJHNlbmRccyosXHMqXCRzdWJqZWN0XHMqLFxzKlwkbWVzc2FnZVxzKixccypcJGhlYWRlcnNccypcKSI7aTo2NztzOjUzOiJtYWlsXChccypcJHRvXHMqLFxzKlwkc3ViaixccypcJG1zZ1xzKixccypcJGZyb21ccypcKSI7aTo2ODtzOjQzOiJjb250ZW50PSJcZCs7VVJMPWh0dHBzOi8vZG9jc1wuZ29vZ2xlXC5jb20vIjtpOjY5O3M6NDI6Ilwka2V5XHMqPVxzKlwkX0dFVFxbWyciXXswLDF9cVsnIl17MCwxfVxdOyI7aTo3MDtzOjE5OiIvaW5zdHJ1a3RzaXlhLWRseWEtIjtpOjcxO3M6MTQ6Ii9cP2RvPW9zaGlia2EtIjtpOjcyO3M6MTc6Ii9cP2RvPWthay11ZGFsaXQtIjtpOjczO3M6MTU6Imd6aW5mbGF0ZVwoXChcKCI7aTo3NDtzOjIzOiIwXHMqXChccypnenVuY29tcHJlc3NcKCI7aTo3NTtzOjIwOiJcJF9SRVFVRVNUXFtbJyJdbGFsYSI7aTo3NjtzOjQzOiJzdHJwb3NcKFwkaW1ccyosXHMqWyciXTxcP1snIl1ccyosXHMqXCRpXCsxIjtpOjc3O3M6NjM6Imh0dHA6Ly93d3dcLmdvb2dsZVwuY29tL3NlYXJjaFw/cT1bJyJdXC5cJHF1ZXJ5XC5bJyJdJmhsPVwkbGFuZyI7aTo3ODtzOjQzOiJodHRwOi8vZ29cLm1haWxcLnJ1L3NlYXJjaFw/cT1bJyJdXC5cJHF1ZXJ5IjtpOjc5O3M6NTA6Imh0dHA6Ly93d3dcLmJpbmdcLmNvbS9zZWFyY2hcP3E9XCRxdWVyeSZwcT1cJHF1ZXJ5IjtpOjgwO3M6Mzg6InNldFRpbWVvdXRcKFxzKlsnIl1sb2NhdGlvblwucmVwbGFjZVwoIjtpOjgxO3M6MTIwOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqWyciXVtccyVcLkBcLVwrXChcKS9hLXpBLVowLTlfXSs/L1tccyVcLkBcLVwrXChcKS9hLXpBLVowLTlfXSs/XC5naWYiO2k6ODI7czoxMjA6IihpbmNsdWRlfGluY2x1ZGVfb25jZXxyZXF1aXJlfHJlcXVpcmVfb25jZSlccypcKCpccypbJyJdW1xzJVwuQFwtXCtcKFwpL2EtekEtWjAtOV9dKz8vW1xzJVwuQFwtXCtcKFwpL2EtekEtWjAtOV9dKz9cLmpwZyI7aTo4MztzOjEyMDoiKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoKlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rPy9bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wucG5nIjtpOjg0O3M6MTQyOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF1ccypcLlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wucG5nIjtpOjg1O3M6MTQyOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF1ccypcLlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wuZ2lmIjtpOjg2O3M6MTQyOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF1ccypcLlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wuanBnIjtpOjg3O3M6MTA2OiJ1bmxpbmtcKFxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxdXHMqXC5ccypbJyJdezAsMX0vYXNzZXRzL2NhY2hlL3RlbXAvRmlsZVNldHRpbmdzIjtpOjg4O3M6NDg6ImlmXChccypzdHJwb3NcKFxzKlwkdmFsdWVccyosXHMqXCRtYXNrXHMqXClccypcKSI7aTo4OTtzOjg6ImFiYWtvL0FPIjtpOjkwO3M6NTU6IlwqL1xzKihpbmNsdWRlfGluY2x1ZGVfb25jZXxyZXF1aXJlfHJlcXVpcmVfb25jZSlccyovXCoiO2k6OTE7czozNDoiZ3JvdXBfY29uY2F0XCgweDIxN2UscGFzc3dvcmQsMHgzYSI7aTo5MjtzOjM3OiJjb25jYXRcKDB4MjE3ZSxwYXNzd29yZCwweDNhLHVzZXJuYW1lIjtpOjkzO3M6MjM6IlwrdW5pb25cK3NlbGVjdFwrMCwwLDAsIjtpOjk0O3M6OToic2V4c2V4c2V4IjtpOjk1O3M6MzU6IlwkYmFzZV9kb21haW5ccyo9XHMqZ2V0X2Jhc2VfZG9tYWluIjtpOjk2O3M6MzE6IiFlcmVnXChbJyJdXF5cKHVuc2FmZV9yYXdcKVw/XCQiO2k6OTc7czo5MToiXCRbYS16QS1aMC05X10rPz1cJFthLXpBLVowLTlfXSs/XChcJFthLXpBLVowLTlfXSs/LFwkW2EtekEtWjAtOV9dKz9cKFsnIl17XCRbYS16QS1aMC05X10rPyI7aTo5ODtzOjE5OiJsbXBfY2xpZW50XChzdHJjb2RlIjtpOjk5O3M6MTY6ImV2YWxcKFsnIl1ccyovXCoiO2k6MTAwO3M6MTU6ImV2YWxcKFsnIl1ccyovLyI7aToxMDE7czozNDoiXCRxdWVyeVxzKyxccytbJyJdZnJvbSUyMGpvc191c2VycyI7aToxMDI7czo3OToiXCRbYS16QS1aMC05X10rP1xbXCRbYS16QS1aMC05X10rP1xdXFtcJFthLXpBLVowLTlfXSs/XFtcZCtcXVwuXCRbYS16QS1aMC05X10rPyI7aToxMDM7czoyOToiXClcKSxQSFBfVkVSU0lPTixtZDVfZmlsZVwoXCQiO2k6MTA0O3M6ODM6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChbJyJdezAsMX1jdXJsXHMrLU9ccytodHRwOi8vIjtpOjEwNTtzOjE5OiJjb2Rlc1wubWFpbmxpbmtcLnJ1IjtpOjEwNjtzOjM2OiJjaG1vZFwoZGlybmFtZVwoX19GSUxFX19cKSxccyowNTExXCkiO2k6MTA3O3M6Mzk6ImxvY2F0aW9uXC5yZXBsYWNlXChcXFsnIl1cJHVybF9yZWRpcmVjdCI7aToxMDg7czoyODoiTW90aGVyWyciXXNccytNYWlkZW5ccytOYW1lOiI7aToxMDk7czo5MDoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFsnIl1teXNxbGR1bXBccystaFxzK2xvY2FsaG9zdFxzKy11IjtpOjExMDtzOjc3OiJhcnJheV9tZXJnZVwoXCRleHRccyosXHMqYXJyYXlcKFsnIl13ZWJzdGF0WyciXSxbJyJdYXdzdGF0c1snIl0sWyciXXRlbXBvcmFyeSI7aToxMTE7czozMzoiQ29tZmlybVxzK1RyYW5zYWN0aW9uXHMrUGFzc3dvcmQ6IjtpOjExMjtzOjIyOiJ4cnVtZXJfc3BhbV9saW5rc1wudHh0IjtpOjExMztzOjY6IlNFb0RPUiI7aToxMTQ7czo3MDoiPFw/cGhwXHMrKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoXHMqWyciXS9ob21lLyI7aToxMTU7czoyMjoiLFsnIl08XD9waHBcXG5bJyJdXC5cJCI7aToxMTY7czo1MDoiPGlmcmFtZVxzK3NyYz1bJyJdaHR0cHM6Ly9kb2NzXC5nb29nbGVcLmNvbS9mb3Jtcy8iO2k6MTE3O3M6MzY6ImV4ZWNccyt7WyciXS9iaW4vc2hbJyJdfVxzK1snIl0tYmFzaCI7aToxMTg7czo0NToiaWZcKGZpbGVfcHV0X2NvbnRlbnRzXChcJGluZGV4X3BhdGgsXHMqXCRjb2RlIjtpOjExOTtzOjMxOiI9XHMqbmV3XHMrRGlyZWN0b3J5SXRlcmF0b3JcKFwkIjtpOjEyMDtzOjUzOiJcJFthLXpBLVowLTlfXSs/ID0gXCRbYS16QS1aMC05X10rP1woWyciXXswLDF9aHR0cDovLyI7aToxMjE7czo1MjoiY1wubGVuZ3RoXCk7fXJldHVyblxzKlxcWyciXVxcWyciXTt9aWZcKCFnZXRDb29raWVcKCI7aToxMjI7czo4OiIjdPpJN/bf0CI7aToxMjM7czozMToic2VsZWN0IGxhbmd1YWdlc19pZCwgbmFtZSwgY29kZSI7aToxMjQ7czo0NDoidXBkYXRlIGNvbmZpZ3VyYXRpb24gc2V0IGNvbmZpZ3VyYXRpb25fdmFsdWUiO2k6MTI1O3M6NjU6InNlbGVjdCBjb25maWd1cmF0aW9uX2lkLCBjb25maWd1cmF0aW9uX3RpdGxlLCBjb25maWd1cmF0aW9uX3ZhbHVlIjtpOjEyNjtzOjM2OiIvYWRtaW4vY29uZmlndXJhdGlvblwucGhwL2xvZ2luXC5waHAiO2k6MTI3O3M6MTAxOiJzdHJfcmVwbGFjZVwoWyciXS5bJyJdXHMqLFxzKlsnIl0uWyciXVxzKixccypzdHJfcmVwbGFjZVwoWyciXS5bJyJdXHMqLFxzKlsnIl0uWyciXVxzKixccypzdHJfcmVwbGFjZSI7aToxMjg7czoxMjoiZG1sbGQwUmhkR0U9IjtpOjEyOTtzOjgxOiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoWyciXWx3cC1kb3dubG9hZFxzK2h0dHA6Ly8iO2k6MTMwO3M6Njg6IlwkW2EtekEtWjAtOV9dKz9cKFxzKlsnIl1bJyJdXHMqLFxzKmV2YWxcKFwkW2EtekEtWjAtOV9dKz9ccypcKVxzKlwpIjtpOjEzMTtzOjY3OiJcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XHMqXClccyosIjtpOjEzMjtzOjYwOiJcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XFsiO2k6MTMzO3M6Mzk6IlwkW2EtekEtWjAtOV9dKz9cKFxzKlwkW2EtekEtWjAtOV9dKz9cWyI7aToxMzQ7czo1OToiXChccypcJHNlbmRccyosXHMqXCRzdWJqZWN0XHMqLFxzKlwkbWVzc2FnZVxzKixccypcJGhlYWRlcnMiO2k6MTM1O3M6MTc6Ij1ccypbJyJdL3Zhci90bXAvIjtpOjEzNjtzOjY1OiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqWyciXS92YXIvdG1wLyI7aToxMzc7czoyNjoiZXhpdFwoXCk6ZXhpdFwoXCk6ZXhpdFwoXCkiO2k6MTM4O3M6Mzg6IkFkZFR5cGVccythcHBsaWNhdGlvbi94LWh0dHBkLWNnaVxzK1wuIjtpOjEzOTtzOjM4OiJAbW92ZV91cGxvYWRlZF9maWxlXChccypcJHVzZXJmaWxlX3RtcCI7aToxNDA7czoyMjoiZGlzYWJsZV9mdW5jdGlvbnM9bm9uZSI7aToxNDE7czoxNTU6IlwkW2EtekEtWjAtOV9dKz9cW1xzKlwkW2EtekEtWjAtOV9dKz9ccypcXVxbXHMqXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwuIjtpOjE0MjtzOjIyMjoiXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwuXHMqXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwuXHMqIjtpOjE0MztzOjYwOiJcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XCgiO2k6MTQ0O3M6NDI6Ij1ccypjcmVhdGVfZnVuY3Rpb25cKFsnIl17MCwxfVwkYVsnIl17MCwxfSI7aToxNDU7czo5OiJcJGJcKFsnIl0iO2k6MTQ2O3M6MzE6IlwkYlxzKj1ccypjcmVhdGVfZnVuY3Rpb25cKFsnIl0iO2k6MTQ3O3M6MzY6IlgtTWFpbGVyOlxzKk1pY3Jvc29mdCBPZmZpY2UgT3V0bG9vayI7aToxNDg7czo1NjoiQCpmaWxlX3B1dF9jb250ZW50c1woXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6MTQ5O3M6MTk6IlsnIl0vXGQrL1xbYS16XF1cKmUiO2k6MTUwO3M6NjQ6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbYS16QS1aMC05X10rP1xzKlxdXCgiO2k6MTUxO3M6MTM6IkBleHRyYWN0XHMqXCQiO2k6MTUyO3M6MTM6IkBleHRyYWN0XHMqXCgiO2k6MTUzO3M6Nzc6Im1haWxccypcKFwkZW1haWxccyosXHMqWyciXXswLDF9PVw/VVRGLThcP0JcP1snIl17MCwxfVwuYmFzZTY0X2VuY29kZVwoXCRmcm9tIjtpOjE1NDtzOjgxOiJtYWlsXChcJF9QT1NUXFtbJyJdezAsMX1lbWFpbFsnIl17MCwxfVxdLFxzKlwkX1BPU1RcW1snIl17MCwxfXN1YmplY3RbJyJdezAsMX1cXSwiO2k6MTU1O3M6ODQ6Im1vdmVfdXBsb2FkZWRfZmlsZVxzKlwoXHMqXCRfRklMRVNcW1snIl1bYS16QS1aMC05X10rP1snIl1cXVxbWyciXXRtcF9uYW1lWyciXVxdXHMqLCI7aToxNTY7czo0NToiTW96aWxsYS81XC4wXHMqXChjb21wYXRpYmxlO1xzKkdvb2dsZWJvdC8yXC4xIjtpOjE1NztzOjE0OiJyb290QGxvY2FsaG9zdCI7aToxNTg7czo0MzoiKFxcWzAtOV1bMC05XVswLTldfFxceFswLTlhLWZdWzAtOWEtZl0pezcsfSI7aToxNTk7czoxNzoiPC9ib2R5PlxzKjxzY3JpcHQiO2k6MTYwO3M6NDM6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXXByZWdfcmVwbGFjZVsnIl0iO2k6MTYxO3M6Mzc6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXWFzc2VydFsnIl0iO2k6MTYyO3M6NDY6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXWNyZWF0ZV9mdW5jdGlvblsnIl0iO2k6MTYzO3M6NDQ6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXWJhc2U2NF9kZWNvZGVbJyJdIjtpOjE2NDtzOjM1OiJcJFthLXpBLVowLTlfXSs/XHMqPVxzKlsnIl1ldmFsWyciXSI7aToxNjU7czoyODoiQ3JlZGl0XHMqQ2FyZFxzKlZlcmlmaWNhdGlvbiI7aToxNjY7czo2NjoiUmV3cml0ZUNvbmRccyole0hUVFA6QWNjZXB0LUxhbmd1YWdlfVxzKlwocnVcfHJ1LXJ1XHx1a1wpXHMqXFtOQ1xdIjtpOjE2NztzOjQyOiJSZXdyaXRlQ29uZFxzKiV7SFRUUDp4LW9wZXJhbWluaS1waG9uZS11YX0iO2k6MTY4O3M6MzQ6IlJld3JpdGVDb25kXHMqJXtIVFRQOngtd2FwLXByb2ZpbGUiO2k6MTY5O3M6MjI6ImV2YWxccypcKFxzKmdldF9vcHRpb24iO2k6MTcwO3M6Mjk6ImVjaG9ccytbJyJdezAsMX1nb29kWyciXXswLDF9IjtpOjE3MTtzOjUxOiJDVVJMT1BUX1JFRkVSRVIsXHMqWyciXXswLDF9aHR0cHM6Ly93d3dcLmdvb2dsZVwuY28iO2k6MTcyO3M6MTU6IlwkYXV0aF9wYXNzXHMqPSI7aToxNzM7czo2NDoiPVxzKlwkR0xPQkFMU1xbXHMqWyciXV8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVsnIl1ccypcXSI7aToxNzQ7czo2NDoiZWNob1xzK3N0cmlwc2xhc2hlc1xzKlwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aToxNzU7czoyMjoiPGgxPkxvYWRpbmdcLlwuXC48L2gxPiI7aToxNzY7czoxMjoicGhwaW5mb1woXCk7IjtpOjE3NztzOjE4NzoiKGV2YWx8YmFzZTY0X2RlY29kZXxnemluZmxhdGV8Z3p1bmNvbXByZXNzfHN0cl9yb3QxM3xtZDUpXHMqXChccyooZXZhbHxiYXNlNjRfZGVjb2RlfGd6aW5mbGF0ZXxnenVuY29tcHJlc3N8c3RyX3JvdDEzfG1kNSlccypcKFxzKihldmFsfGJhc2U2NF9kZWNvZGV8Z3ppbmZsYXRlfGd6dW5jb21wcmVzc3xzdHJfcm90MTN8bWQ1KSI7aToxNzg7czoxMToiSGFja2VkXHMrQnkiO2k6MTc5O3M6MTU6IlsnIl0vXC5cKi9lWyciXSI7aToxODA7czoyODoiZWNob1xzKlwoKlxzKlsnIl1OTyBGSUxFWyciXSI7aToxODE7czoxOTA6Im1vdmVfdXBsb2FkZWRfZmlsZVxzKlwoKlxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX1maWxlbmFtZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX10bXBfbmFtZVsnIl17MCwxfVxzKlxdXHMqLFxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX1maWxlbmFtZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX1uYW1lWyciXXswLDF9XHMqXF0iO2k6MTgyO3M6MjM6ImNvcHlccypcKFxzKlsnIl1odHRwOi8vIjtpOjE4MztzOjgyOiI8bWV0YVxzK2h0dHAtZXF1aXY9WyciXXswLDF9UmVmcmVzaFsnIl17MCwxfVxzK2NvbnRlbnQ9WyciXXswLDF9XGQrO1xzKlVSTD1odHRwOi8vIjtpOjE4NDtzOjgxOiI8bWV0YVxzK2h0dHAtZXF1aXY9WyciXXswLDF9cmVmcmVzaFsnIl17MCwxfVxzK2NvbnRlbnQ9WyciXXswLDF9XGQrO1xzKnVybD08XD9waHAiO2k6MTg1O3M6MTA6IlsnIl1hSFIwY0QiO2k6MTg2O3M6Njc6InN0cmNoclxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF0iO2k6MTg3O3M6Njc6InN0cnN0clxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF0iO2k6MTg4O3M6Njc6InN0cnBvc1xzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF0iO2k6MTg5O3M6MzM6IkFkZFR5cGVccythcHBsaWNhdGlvbi94LWh0dHBkLXBocCI7aToxOTA7czoxMDoicGNudGxfZXhlYyI7aToxOTE7czo2OToiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKCpbJyJdY2RccysvdG1wIjtpOjE5MjtzOjI3OiJcJE9PTy4rPz1ccyp1cmxkZWNvZGVccypcKCoiO2k6MTkzO3M6MTI6InJtXHMrLWZccystciI7aToxOTQ7czoxMjoicm1ccystclxzKy1mIjtpOjE5NTtzOjg6InJtXHMrLWZyIjtpOjE5NjtzOjg6InJtXHMrLXJmIjtpOjE5NztzOjYzOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqWyciXWltYWdlcy8iO2k6MTk4O3M6ODk6IihpbmNsdWRlfGluY2x1ZGVfb25jZXxyZXF1aXJlfHJlcXVpcmVfb25jZSlccypcKCpccypAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjE5OTtzOjU5OiJiYXNlNjRfZGVjb2RlXHMqXCgqXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aToyMDA7czo1MToiZG9jdW1lbnRcLndyaXRlXHMqXChccyp1bmVzY2FwZVxzKlwoXHMqWyciXXswLDF9JTNDIjtpOjIwMTtzOjg6Ii8vTk9uYU1FIjtpOjIwMjtzOjg6ImxzXHMrLWxhIjtpOjIwMztzOjM3OiJpbmlfc2V0XChccypbJyJdezAsMX1tYWdpY19xdW90ZXNfZ3BjIjtpOjIwNDtzOjI4OiJhbmRyb2lkXHxhdmFudGdvXHxibGFja2JlcnJ5IjtpOjIwNTtzOjQxOiJmaW5kXHMrL1xzKy10eXBlXHMrZlxzKy1uYW1lXHMrXC5odHBhc3N3ZCI7aToyMDY7czozNzoiZmluZFxzKy9ccystdHlwZVxzK2ZccystcGVybVxzKy0wMjAwMCI7aToyMDc7czozNzoiZmluZFxzKy9ccystdHlwZVxzK2ZccystcGVybVxzKy0wNDAwMCI7fQ=="));
$g_ExceptFlex = unserialize(base64_decode("YToxMDc6e2k6MDtzOjM3OiJlY2hvICI8c2NyaXB0PiBhbGVydFwoJyJcLlwkZGItPmdldEVyIjtpOjE7czo0MDoiZWNobyAiPHNjcmlwdD4gYWxlcnRcKCciXC5cJG1vZGVsLT5nZXRFciI7aToyO3M6ODoic29ydFwoXCkiO2k6MztzOjEwOiJtdXN0LXJldmFsIjtpOjQ7czo2OiJyaWV2YWwiO2k6NTtzOjk6ImRvdWJsZXZhbCI7aTo2O3M6NjY6InJlcXVpcmVccypcKCpccypcJF9TRVJWRVJcW1xzKlsnIl17MCwxfURPQ1VNRU5UX1JPT1RbJyJdezAsMX1ccypcXSI7aTo3O3M6NzE6InJlcXVpcmVfb25jZVxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxzKlxdIjtpOjg7czo2NjoiaW5jbHVkZVxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxzKlxdIjtpOjk7czo3MToiaW5jbHVkZV9vbmNlXHMqXCgqXHMqXCRfU0VSVkVSXFtccypbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XHMqXF0iO2k6MTA7czoxNzoiXCRzbWFydHktPl9ldmFsXCgiO2k6MTE7czozMDoicHJlcFxzK3JtXHMrLXJmXHMrJXtidWlsZHJvb3R9IjtpOjEyO3M6MjI6IlRPRE86XHMrcm1ccystcmZccyt0aGUiO2k6MTM7czoyNzoia3Jzb3J0XChcJHdwc21pbGllc3RyYW5zXCk7IjtpOjE0O3M6NjM6ImRvY3VtZW50XC53cml0ZVwodW5lc2NhcGVcKCIlM0NzY3JpcHQgc3JjPSciIFwrIGdhSnNIb3N0IFwrICJnbyI7aToxNTtzOjY6IlwuZXhlYyI7aToxNjtzOjg6ImV4ZWNcKFwpIjtpOjE3O3M6MjQ6IlwkeDEgPSBcJHRoaXMtPncgLSBcJHgxOyI7aToxODtzOjMxOiJhc29ydFwoXCRDYWNoZURpck9sZEZpbGVzQWdlXCk7IjtpOjE5O3M6MTM6IlwoJ3I1N3NoZWxsJywiO2k6MjA7czoyNToiZXZhbFwoImxpc3RlbmVyID0gIlwrbGlzdCI7aToyMTtzOjg6ImV2YWxcKFwpIjtpOjIyO3M6MzM6InByZWdfcmVwbGFjZV9jYWxsYmFja1woJy9cXHtcKGltYSI7aToyMztzOjIxOiJldmFsIFwoX2N0TWVudUluaXRTdHIiO2k6MjQ7czoyOToiYmFzZTY0X2RlY29kZVwoXCRhY2NvdW50S2V5XCkiO2k6MjU7czozOToiYmFzZTY0X2RlY29kZVwoXCRkYXRhXClcKTsgXCRhcGktPnNldFJlIjtpOjI2O3M6NDg6InJlcXVpcmVcKFwkX1NFUlZFUlxbXFwiRE9DVU1FTlRfUk9PVFxcIlxdXC5cXCIvYiI7aToyNztzOjY1OiJiYXNlNjRfZGVjb2RlXChcJF9SRVFVRVNUXFsncGFyYW1ldGVycydcXVwpOyBpZlwoQ2hlY2tTZXJpYWxpemVkRCI7aToyODtzOjYzOiJwY250bF9leGVjJyA9PiBBcnJheVwoQXJyYXlcKDFcKSwgXCRhclJlc3VsdFxbJ1NFQ1VSSU5HX0ZVTkNUSU8iO2k6Mjk7czozOToiZWNobyAiPHNjcmlwdD5hbGVydFwoJyJcLkNVdGlsOjpKU0VzY2FwIjtpOjMwO3M6Njg6ImJhc2U2NF9kZWNvZGVcKFwkX1JFUVVFU1RcWyd0aXRsZV9jaGFuZ2VyX2xpbmsnXF1cKTsgaWYgXChzdHJsZW5cKFwkIjtpOjMxO3M6NTE6ImV2YWxcKCdcJGhleGR0aW1lID0gIicgXC4gXCRoZXhkdGltZSBcLiAnIjsnXCk7IFwkZiI7aTozMjtzOjUyOiJlY2hvICI8c2NyaXB0PmFsZXJ0XCgnXCRyb3ctPnRpdGxlIC0gIlwuX01PRFVMRV9JU19FIjtpOjMzO3M6Mzc6ImVjaG8gIjxzY3JpcHQ+YWxlcnRcKCdcJGNpZHMgIlwuX0NBTk4iO2k6MzQ7czo0MToiaWZcKDFcKSB7IFwkdl9ob3VyID0gXChcJHBfaGVhZGVyXFsnbXRpbWUiO2k6MzU7czo3MDoiZG9jdW1lbnRcLndyaXRlXCh1bmVzY2FwZVwoIiUzQ3NjcmlwdCUyMHNyYz0lMjJodHRwIiBcKyBcKFwoImh0dHBzOiIgPSI7aTozNjtzOjU3OiJkb2N1bWVudFwud3JpdGVcKHVuZXNjYXBlXCgiJTNDc2NyaXB0IHNyYz0nIiBcKyBwa0Jhc2VVUkwiO2k6Mzc7czozMjoiZWNobyAiPHNjcmlwdD5hbGVydFwoJyJcLkpUZXh0OjoiO2k6Mzg7czoyNToiJ2ZpbGVuYW1lJ1wpLCBcKCdyNTdzaGVsbCI7aTozOTtzOjQzOiJlY2hvICI8c2NyaXB0PmFsZXJ0XCgnIiBcLiBcJGVyck1zZyBcLiAiJ1wpIjtpOjQwO3M6NDI6ImVjaG8gIjxzY3JpcHQ+YWxlcnRcKFxcIkVycm9yIHdoZW4gbG9hZGluZyI7aTo0MTtzOjQzOiJlY2hvICI8c2NyaXB0PmFsZXJ0XCgnIlwuSlRleHQ6Ol9cKCdWQUxJRF9FIjtpOjQyO3M6ODoiZXZhbFwoXCkiO2k6NDM7czo4OiInc3lzdGVtJyI7aTo0NDtzOjY6IidldmFsJyI7aTo0NTtzOjY6IiJldmFsIiI7aTo0NjtzOjY6ImNvcHlcKCI7aTo0NztzOjc6Il9zeXN0ZW0iO2k6NDg7czo5OiJzYXZlMmNvcHkiO2k6NDk7czoxMDoiZmlsZXN5c3RlbSI7aTo1MDtzOjg6InNlbmRtYWlsIjtpOjUxO3M6ODoiY2FuQ2htb2QiO2k6NTI7czoxMzoiL2V0Yy9wYXNzd2RcKSI7aTo1MztzOjI0OiJ1ZHA6Ly8nXC5zZWxmOjpcJF9jX2FkZHIiO2k6NTQ7czozNDoiZWRvY2VkXzQ2ZXNhYlwoJydcfCJcKVxcXCknLCAncmVnZSI7aTo1NTtzOjk6ImRvdWJsZXZhbCI7aTo1NjtzOjE2OiJvcGVyYXRpbmcgc3lzdGVtIjtpOjU3O3M6MTA6Imdsb2JhbGV2YWwiO2k6NTg7czoyMToid2l0aCAwLzAvMCBpZiBcKDFcKSB7IjtpOjU5O3M6NDg6IlwkeDIgPSBcJHBhcmFtXFtbJyJdezAsMX14WyciXXswLDF9XF0gXCsgXCR3aWR0aCI7aTo2MDtzOjExOiJzcGVjaWFsaXNlZCI7aTo2MTtzOjE5OiJ3cF9nZXRfY3VycmVudF91c2VyIjtpOjYyO3M6NzoiLT5jaG1vZCI7aTo2MztzOjc6Il9tYWlsXCgiO2k6NjQ7czo3OiJfY29weVwoIjtpOjY1O3M6NDY6InN0cnBvc1woXCRfU0VSVkVSXFsnSFRUUF9VU0VSX0FHRU5UJ1xdLCAnRHJ1cGEiO2k6NjY7czo0NToic3RycG9zXChcJF9TRVJWRVJcWydIVFRQX1VTRVJfQUdFTlQnXF0sICdNU0lFIjtpOjY3O3M6NDU6InN0cnBvc1woXCRfU0VSVkVSXFsiSFRUUF9VU0VSX0FHRU5UIlxdLCAnTVNJRSI7aTo2ODtzOjE3OiJldmFsIFwoY2xhc3NTdHJcKSI7aTo2OTtzOjMxOiJmdW5jdGlvbl9leGlzdHNcKCdiYXNlNjRfZGVjb2RlIjtpOjcwO3M6NDQ6ImVjaG8gIjxzY3JpcHQ+YWxlcnRcKCciXC5KVGV4dDo6X1woJ1ZBTElEX0VNIjtpOjcxO3M6NTI6IlwkeDEgPSBcJG1pbl94OyBcJHgyID0gXCRtYXhfeDsgXCR5MSA9IFwkbWluX3k7IFwkeTIiO2k6NzI7czo1NToiXCRjdG1cWydhJ1xdXClcKSB7IFwkeCA9IFwkeCBcKiBcJHRoaXMtPms7IFwkeSA9IFwoXCR0aCI7aTo3MztzOjYwOiJbJyJdezAsMX1jcmVhdGVfZnVuY3Rpb25bJyJdezAsMX0sIFsnIl17MCwxfWdldF9yZXNvdXJjZV90eXAiO2k6NzQ7czo0OToiWyciXXswLDF9Y3JlYXRlX2Z1bmN0aW9uWyciXXswLDF9LCBbJyJdezAsMX1jcnlwdCI7aTo3NTtzOjY5OiJzdHJwb3NcKFwkX1NFUlZFUlxbWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XF0sIFsnIl17MCwxfUx5bngiO2k6NzY7czo2ODoic3Ryc3RyXChcJF9TRVJWRVJcW1snIl17MCwxfUhUVFBfVVNFUl9BR0VOVFsnIl17MCwxfVxdLCBbJyJdezAsMX1NU0kiO2k6Nzc7czoyNToic29ydFwoXCREaXN0cmlidXRpb25cW1wkayI7aTo3ODtzOjI1OiJzb3J0XChmdW5jdGlvblwoYSxiXCl7cmV0IjtpOjc5O3M6MjU6Imh0dHA6Ly93d3dcLmZhY2Vib29rXC5jb20iO2k6ODA7czoyNToiaHR0cDovL21hcHNcLmdvb2dsZVwuY29tLyI7aTo4MTtzOjUyOiJ1ZHA6Ly8nXC5zZWxmOjpcJGNfYWRkciwgODAsIFwkZXJybm8sIFwkZXJyc3RyLCAxNTAwIjtpOjgyO3M6MjA6IlwoXC5cKlwodmlld1wpXD9cLlwqIjtpOjgzO3M6NDQ6ImVjaG8gWyciXXswLDF9PHNjcmlwdD5hbGVydFwoWyciXXswLDF9XCR0ZXh0IjtpOjg0O3M6MTc6InNvcnRcKFwkdl9saXN0XCk7IjtpOjg1O3M6Nzc6Im1vdmVfdXBsb2FkZWRfZmlsZVwoIFwkX0ZJTEVTXFsndXBsb2FkZWRfcGFja2FnZSdcXVxbJ3RtcF9uYW1lJ1xdLCBcJG1vc0NvbmZpIjtpOjg2O3M6MzE6IkNyZWRpdCBDYXJkIFZlcmlmaWNhdGlvbiBDb2RlJzsiO2k6ODc7czoxMjoiZmFsc2VcKSBcKTsjIjtpOjg4O3M6MTU6Im5jeV9uYW1lYCcgXCk7IyI7aTo4OTtzOjQ3OiJzdHJwb3NcKFwkX1NFUlZFUlxbJ0hUVFBfVVNFUl9BR0VOVCdcXSwgJ01hYyBPUyI7aTo5MDtzOjIwOiIvL25vbmFtZTogJzxcPz1DVXRpbCI7aTo5MTtzOjUwOiJkb2N1bWVudFwud3JpdGVcKHVuZXNjYXBlXCgiJTNDc2NyaXB0IHNyYz0nL2JpdHJpeCI7aTo5MjtzOjI1OiJcJF9TRVJWRVIgXFsiUkVNT1RFX0FERFIiIjtpOjkzO3M6MTc6ImFIUjBjRG92TDJOeWJETXVaIjtpOjk0O3M6NTU6IkpSZXNwb25zZTo6c2V0Qm9keVwocHJlZ19yZXBsYWNlXChcJHBhdHRlcm5zLCBcJHJlcGxhY2UiO2k6OTU7czo0MDoiXFx4MWZcXHg4YlxceDA4XFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMCI7aTo5NjtzOjQwOiJcXHg1MFxceDRiXFx4MDVcXHgwNlxceDAwXFx4MDBcXHgwMFxceDAwIjtpOjk3O3M6NDY6IlxceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceDJGXFx4M0VcXVxbXF4iO2k6OTg7czo0MDoiXFx4ODlcXHg1MFxceDRFXFx4NDdcXHgwRFxceDBBXFx4MUFcXHgwQSI7aTo5OTtzOjEwOiJcKTsjaScsICcmIjtpOjEwMDtzOjE3OiJcKTsjbWlzJywgJyAnLCBcJCI7aToxMDE7czoyMDoiXCk7I2knLCBcJGRhdGEsIFwkbWEiO2k6MTAyO3M6MzU6IlwkZnVuY1woIFwkcGFyYW1zXFtcJHR5cGVcXS0+cGFyYW1zIjtpOjEwMztzOjQwOiJcXHgxZlxceDhiXFx4MDhcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwIjtpOjEwNDtzOjQ1OiJcXHgwMFxceDAxXFx4MDJcXHgwM1xceDA0XFx4MDVcXHgwNlxceDA3XFx4MDgiO2k6MTA1O3M6NDA6IlxceDIxXFx4MjNcXHgyNFxceDI1XFx4MjZcXHgyN1xceDJhXFx4MmIiO2k6MTA2O3M6MzU6IlxceDgzXFx4OEJcXHg4RFxceDlCXFx4OUVcXHg5RlxceEExIjt9"));
$g_SusDB = unserialize(base64_decode("YToxMzE6e2k6MDtzOjE0OiJAKmV4dHJhY3RccypcKCI7aToxO3M6MTQ6IkAqZXh0cmFjdFxzKlwkIjtpOjI7czoxMjoiWyciXWV2YWxbJyJdIjtpOjM7czoyMToiWyciXWJhc2U2NF9kZWNvZGVbJyJdIjtpOjQ7czoyMzoiWyciXWNyZWF0ZV9mdW5jdGlvblsnIl0iO2k6NTtzOjE0OiJbJyJdYXNzZXJ0WyciXSI7aTo2O3M6NDM6ImZvcmVhY2hccypcKFxzKlwkZW1haWxzXHMrYXNccytcJGVtYWlsXHMqXCkiO2k6NztzOjc6IlNwYW1tZXIiO2k6ODtzOjE1OiJldmFsXHMqWyciXChcJF0iO2k6OTtzOjE3OiJhc3NlcnRccypbJyJcKFwkXSI7aToxMDtzOjI4OiJzcnBhdGg6Ly9cLlwuL1wuXC4vXC5cLi9cLlwuIjtpOjExO3M6MTI6InBocGluZm9ccypcKCI7aToxMjtzOjE2OiJTSE9XXHMrREFUQUJBU0VTIjtpOjEzO3M6MTI6IlxicG9wZW5ccypcKCI7aToxNDtzOjk6ImV4ZWNccypcKCI7aToxNTtzOjEzOiJcYnN5c3RlbVxzKlwoIjtpOjE2O3M6MTU6IlxicGFzc3RocnVccypcKCI7aToxNztzOjE2OiJcYnByb2Nfb3BlblxzKlwoIjtpOjE4O3M6MTU6InNoZWxsX2V4ZWNccypcKCI7aToxOTtzOjE2OiJpbmlfcmVzdG9yZVxzKlwoIjtpOjIwO3M6OToiXGJkbFxzKlwoIjtpOjIxO3M6MTQ6Ilxic3ltbGlua1xzKlwoIjtpOjIyO3M6MTI6IlxiY2hncnBccypcKCI7aToyMztzOjE0OiJcYmluaV9zZXRccypcKCI7aToyNDtzOjEzOiJcYnB1dGVudlxzKlwoIjtpOjI1O3M6MTM6ImdldG15dWlkXHMqXCgiO2k6MjY7czoxNDoiZnNvY2tvcGVuXHMqXCgiO2k6Mjc7czoxNzoicG9zaXhfc2V0dWlkXHMqXCgiO2k6Mjg7czoxNzoicG9zaXhfc2V0c2lkXHMqXCgiO2k6Mjk7czoxODoicG9zaXhfc2V0cGdpZFxzKlwoIjtpOjMwO3M6MTU6InBvc2l4X2tpbGxccypcKCI7aTozMTtzOjI3OiJhcGFjaGVfY2hpbGRfdGVybWluYXRlXHMqXCgiO2k6MzI7czoxMjoiXGJjaG1vZFxzKlwoIjtpOjMzO3M6MTI6IlxiY2hkaXJccypcKCI7aTozNDtzOjE1OiJwY250bF9leGVjXHMqXCgiO2k6MzU7czoxNDoiXGJ2aXJ0dWFsXHMqXCgiO2k6MzY7czoxNToicHJvY19jbG9zZVxzKlwoIjtpOjM3O3M6MjA6InByb2NfZ2V0X3N0YXR1c1xzKlwoIjtpOjM4O3M6MTk6InByb2NfdGVybWluYXRlXHMqXCgiO2k6Mzk7czoxNDoicHJvY19uaWNlXHMqXCgiO2k6NDA7czoxMzoiZ2V0bXlnaWRccypcKCI7aTo0MTtzOjE5OiJwcm9jX2dldHN0YXR1c1xzKlwoIjtpOjQyO3M6MTU6InByb2NfY2xvc2VccypcKCI7aTo0MztzOjE5OiJlc2NhcGVzaGVsbGNtZFxzKlwoIjtpOjQ0O3M6MTk6ImVzY2FwZXNoZWxsYXJnXHMqXCgiO2k6NDU7czoxNjoic2hvd19zb3VyY2VccypcKCI7aTo0NjtzOjEzOiJcYnBjbG9zZVxzKlwoIjtpOjQ3O3M6MTM6InNhZmVfZGlyXHMqXCgiO2k6NDg7czoxNjoiaW5pX3Jlc3RvcmVccypcKCI7aTo0OTtzOjEwOiJjaG93blxzKlwoIjtpOjUwO3M6MTA6ImNoZ3JwXHMqXCgiO2k6NTE7czoxNzoic2hvd25fc291cmNlXHMqXCgiO2k6NTI7czoxOToibXlzcWxfbGlzdF9kYnNccypcKCI7aTo1MztzOjIxOiJnZXRfY3VycmVudF91c2VyXHMqXCgiO2k6NTQ7czoxMjoiZ2V0bXlpZFxzKlwoIjtpOjU1O3M6MTE6IlxibGVha1xzKlwoIjtpOjU2O3M6MTU6InBmc29ja29wZW5ccypcKCI7aTo1NztzOjIxOiJnZXRfY3VycmVudF91c2VyXHMqXCgiO2k6NTg7czoxMToic3lzbG9nXHMqXCgiO2k6NTk7czoxODoiXCRkZWZhdWx0X3VzZV9hamF4IjtpOjYwO3M6MjE6ImV2YWxccypcKCpccyp1bmVzY2FwZSI7aTo2MTtzOjc6IkZMb29kZVIiO2k6NjI7czozMToiZG9jdW1lbnRcLndyaXRlXHMqXChccyp1bmVzY2FwZSI7aTo2MztzOjExOiJcYmNvcHlccypcKCI7aTo2NDtzOjIzOiJtb3ZlX3VwbG9hZGVkX2ZpbGVccypcKCI7aTo2NTtzOjg6IlwuMzMzMzMzIjtpOjY2O3M6ODoiXC42NjY2NjYiO2k6Njc7czoyMToicm91bmRccypcKCpccyowXHMqXCkqIjtpOjY4O3M6MTExOiJjb3B5XHMqXCgqXHMqXCRfRklMRVNccypcW1xzKlsnIl17MCwxfWZpbGVbJyJdezAsMX1ccypcXVxbXHMqWyciXXswLDF9dG1wX25hbWVbJyJdezAsMX1ccypcXVxzKixccypcJHVwbG9hZGZpbGUiO2k6Njk7czoxMjY6Im1vdmVfdXBsb2FkZWRfZmlsZXNccypcKCpccypcJF9GSUxFU1xzKlxbXHMqWyciXXswLDF9ZmlsZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX10bXBfbmFtZVsnIl17MCwxfVxzKlxdXHMqLFxzKlwkdXBsb2FkZmlsZSI7aTo3MDtzOjUwOiJpbmlfZ2V0XHMqXChccypbJyJdezAsMX1kaXNhYmxlX2Z1bmN0aW9uc1snIl17MCwxfSI7aTo3MTtzOjM2OiJVTklPTlxzK1NFTEVDVFxzK1snIl17MCwxfTBbJyJdezAsMX0iO2k6NzI7czoxMDoiMlxzKj5ccyomMSI7aTo3MztzOjU3OiJlY2hvXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF0iO2k6NzQ7czozNzoiPVxzKkFycmF5XHMqXCgqXHMqYmFzZTY0X2RlY29kZVxzKlwoKiI7aTo3NTtzOjE0OiJraWxsYWxsXHMrLVxkKyI7aTo3NjtzOjc6ImVyaXVxZXIiO2k6Nzc7czoxMDoidG91Y2hccypcKCI7aTo3ODtzOjc6InNzaGtleXMiO2k6Nzk7czo4OiJAaW5jbHVkZSI7aTo4MDtzOjg6IkByZXF1aXJlIjtpOjgxO3M6NjI6ImlmXHMqXChtYWlsXHMqXChccypcJHRvLFxzKlwkc3ViamVjdCxccypcJG1lc3NhZ2UsXHMqXCRoZWFkZXJzIjtpOjgyO3M6Mzg6IkBpbmlfc2V0XHMqXCgqWyciXXswLDF9YWxsb3dfdXJsX2ZvcGVuIjtpOjgzO3M6MTg6IkBmaWxlX2dldF9jb250ZW50cyI7aTo4NDtzOjE3OiJmaWxlX3B1dF9jb250ZW50cyI7aTo4NTtzOjQ2OiJhbmRyb2lkXHMqXHxccyptaWRwXHMqXHxccypqMm1lXHMqXHxccypzeW1iaWFuIjtpOjg2O3M6Mjg6IkBzZXRjb29raWVccypcKCpbJyJdezAsMX1oaXQiO2k6ODc7czoxMDoiQGZpbGVvd25lciI7aTo4ODtzOjY6IjxrdWt1PiI7aTo4OTtzOjU6InN5cGV4IjtpOjkwO3M6OToiXCRiZWVjb2RlIjtpOjkxO3M6ODoiQmFja2Rvb3IiO2k6OTI7czoxNDoicGhwX3VuYW1lXHMqXCgiO2k6OTM7czo1NToibWFpbFxzKlwoKlxzKlwkdG9ccyosXHMqXCRzdWJqXHMqLFxzKlwkbXNnXHMqLFxzKlwkZnJvbSI7aTo5NDtzOjI5OiJlY2hvXHMqWyciXTxzY3JpcHQ+XHMqYWxlcnRcKCI7aTo5NTtzOjY3OiJtYWlsXHMqXCgqXHMqXCRzZW5kXHMqLFxzKlwkc3ViamVjdFxzKixccypcJGhlYWRlcnNccyosXHMqXCRtZXNzYWdlIjtpOjk2O3M6NjU6Im1haWxccypcKCpccypcJHRvXHMqLFxzKlwkc3ViamVjdFxzKixccypcJG1lc3NhZ2VccyosXHMqXCRoZWFkZXJzIjtpOjk3O3M6MTIwOiJzdHJwb3NccypcKCpccypcJG5hbWVccyosXHMqWyciXXswLDF9SFRUUF9bJyJdezAsMX1ccypcKSpccyohPT1ccyowXHMqJiZccypzdHJwb3NccypcKCpccypcJG5hbWVccyosXHMqWyciXXswLDF9UkVRVUVTVF8iO2k6OTg7czo1MzoiaXNfZnVuY3Rpb25fZW5hYmxlZFxzKlwoXHMqWyciXXswLDF9aWdub3JlX3VzZXJfYWJvcnQiO2k6OTk7czozMDoiZWNob1xzKlwoKlxzKmZpbGVfZ2V0X2NvbnRlbnRzIjtpOjEwMDtzOjI2OiJlY2hvXHMqXCgqWyciXXswLDF9PHNjcmlwdCI7aToxMDE7czozMToicHJpbnRccypcKCpccypmaWxlX2dldF9jb250ZW50cyI7aToxMDI7czoyNzoicHJpbnRccypcKCpbJyJdezAsMX08c2NyaXB0IjtpOjEwMztzOjg1OiI8bWFycXVlZVxzK3N0eWxlXHMqPVxzKlsnIl17MCwxfXBvc2l0aW9uXHMqOlxzKmFic29sdXRlXHMqO1xzKndpZHRoXHMqOlxzKlxkK1xzKnB4XHMqIjtpOjEwNDtzOjQyOiI9XHMqWyciXXswLDF9XC5cLi9cLlwuL1wuXC4vd3AtY29uZmlnXC5waHAiO2k6MTA1O3M6NzoiZWdnZHJvcCI7aToxMDY7czo5OiJyd3hyd3hyd3giO2k6MTA3O3M6MTU6ImVycm9yX3JlcG9ydGluZyI7aToxMDg7czoxNzoiXGJjcmVhdGVfZnVuY3Rpb24iO2k6MTA5O3M6NDM6Intccypwb3NpdGlvblxzKjpccyphYnNvbHV0ZTtccypsZWZ0XHMqOlxzKi0iO2k6MTEwO3M6MTU6IjxzY3JpcHRccythc3luYyI7aToxMTE7czo2NjoiX1snIl17MCwxfVxzKlxdXHMqPVxzKkFycmF5XHMqXChccypiYXNlNjRfZGVjb2RlXHMqXCgqXHMqWyciXXswLDF9IjtpOjExMjtzOjMzOiJBZGRUeXBlXHMrYXBwbGljYXRpb24veC1odHRwZC1jZ2kiO2k6MTEzO3M6NDQ6ImdldGVudlxzKlwoKlxzKlsnIl17MCwxfUhUVFBfQ09PS0lFWyciXXswLDF9IjtpOjExNDtzOjQ1OiJpZ25vcmVfdXNlcl9hYm9ydFxzKlwoKlxzKlsnIl17MCwxfTFbJyJdezAsMX0iO2k6MTE1O3M6MjE6IlwkX1JFUVVFU1RccypcW1xzKiUyMiI7aToxMTY7czo1MToidXJsXHMqXChbJyJdezAsMX1kYXRhXHMqOlxzKmltYWdlL3BuZztccypiYXNlNjRccyosIjtpOjExNztzOjUxOiJ1cmxccypcKFsnIl17MCwxfWRhdGFccyo6XHMqaW1hZ2UvZ2lmO1xzKmJhc2U2NFxzKiwiO2k6MTE4O3M6MzA6Ijpccyp1cmxccypcKFxzKlsnIl17MCwxfTxcP3BocCI7aToxMTk7czoxNzoiPC9odG1sPi4rPzxzY3JpcHQiO2k6MTIwO3M6MTc6IjwvaHRtbD4uKz88aWZyYW1lIjtpOjEyMTtzOjY0OiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVxzKlsnIlwoXCRdIjtpOjEyMjtzOjExOiJcYm1haWxccypcKCI7aToxMjM7czo0NjoiZmlsZV9nZXRfY29udGVudHNccypcKCpccypbJyJdezAsMX1waHA6Ly9pbnB1dCI7aToxMjQ7czoxMTg6IjxtZXRhXHMraHR0cC1lcXVpdj1bJyJdezAsMX1Db250ZW50LXR5cGVbJyJdezAsMX1ccytjb250ZW50PVsnIl17MCwxfXRleHQvaHRtbDtccypjaGFyc2V0PXdpbmRvd3MtMTI1MVsnIl17MCwxfT48Ym9keT4iO2k6MTI1O3M6NjI6Ij1ccypkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoXHMqWyciXXswLDF9c2NyaXB0WyciXXswLDF9XHMqXCk7IjtpOjEyNjtzOjY5OiJkb2N1bWVudFwuYm9keVwuaW5zZXJ0QmVmb3JlXChkaXYsXHMqZG9jdW1lbnRcLmJvZHlcLmNoaWxkcmVuXFswXF1cKTsiO2k6MTI3O3M6Nzc6IjxzY3JpcHRccyt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXHMrc3JjPSJodHRwOi8vW2EtekEtWjAtOV9dKz9cLnBocCI+PC9zY3JpcHQ+IjtpOjEyODtzOjI3OiJlY2hvXHMrWyciXXswLDF9b2tbJyJdezAsMX0iO2k6MTI5O3M6MTg6Ii91c3Ivc2Jpbi9zZW5kbWFpbCI7aToxMzA7czoyMzoiL3Zhci9xbWFpbC9iaW4vc2VuZG1haWwiO30="));
$g_SusDBPrio = unserialize(base64_decode("YToxMjE6e2k6MDtpOjA7aToxO2k6MDtpOjI7aTowO2k6MztpOjA7aTo0O2k6MDtpOjU7aTowO2k6NjtpOjA7aTo3O2k6MDtpOjg7aToxO2k6OTtpOjE7aToxMDtpOjA7aToxMTtpOjA7aToxMjtpOjA7aToxMztpOjA7aToxNDtpOjA7aToxNTtpOjA7aToxNjtpOjA7aToxNztpOjA7aToxODtpOjA7aToxOTtpOjA7aToyMDtpOjA7aToyMTtpOjA7aToyMjtpOjA7aToyMztpOjA7aToyNDtpOjA7aToyNTtpOjA7aToyNjtpOjA7aToyNztpOjA7aToyODtpOjA7aToyOTtpOjE7aTozMDtpOjE7aTozMTtpOjA7aTozMjtpOjA7aTozMztpOjA7aTozNDtpOjA7aTozNTtpOjA7aTozNjtpOjA7aTozNztpOjA7aTozODtpOjA7aTozOTtpOjA7aTo0MDtpOjA7aTo0MTtpOjA7aTo0MjtpOjA7aTo0MztpOjA7aTo0NDtpOjA7aTo0NTtpOjA7aTo0NjtpOjA7aTo0NztpOjA7aTo0ODtpOjA7aTo0OTtpOjA7aTo1MDtpOjA7aTo1MTtpOjA7aTo1MjtpOjA7aTo1MztpOjA7aTo1NDtpOjA7aTo1NTtpOjA7aTo1NjtpOjE7aTo1NztpOjA7aTo1ODtpOjA7aTo1OTtpOjI7aTo2MDtpOjE7aTo2MTtpOjA7aTo2MjtpOjA7aTo2MztpOjA7aTo2NDtpOjI7aTo2NTtpOjI7aTo2NjtpOjA7aTo2NztpOjA7aTo2ODtpOjA7aTo2OTtpOjI7aTo3MDtpOjE7aTo3MTtpOjA7aTo3MjtpOjA7aTo3MztpOjE7aTo3NDtpOjA7aTo3NTtpOjE7aTo3NjtpOjE7aTo3NztpOjI7aTo3ODtpOjE7aTo3OTtpOjM7aTo4MDtpOjI7aTo4MTtpOjA7aTo4MjtpOjI7aTo4MztpOjA7aTo4NDtpOjA7aTo4NTtpOjI7aTo4NjtpOjA7aTo4NztpOjA7aTo4ODtpOjA7aTo4OTtpOjE7aTo5MDtpOjE7aTo5MTtpOjE7aTo5MjtpOjE7aTo5MztpOjA7aTo5NDtpOjI7aTo5NTtpOjI7aTo5NjtpOjI7aTo5NztpOjI7aTo5ODtpOjI7aTo5OTtpOjE7aToxMDA7aToxO2k6MTAxO2k6MztpOjEwMjtpOjM7aToxMDM7aToxO2k6MTA0O2k6MztpOjEwNTtpOjM7aToxMDY7aToyO2k6MTA3O2k6MDtpOjEwODtpOjM7aToxMDk7aToxO2k6MTEwO2k6MTtpOjExMTtpOjM7aToxMTI7aTozO2k6MTEzO2k6MztpOjExNDtpOjE7aToxMTU7aToxO2k6MTE2O2k6MTtpOjExNztpOjQ7aToxMTg7aToxO2k6MTE5O2k6MztpOjEyMDtpOjA7fQ=="));
$g_AdwareSig = unserialize(base64_decode("YTozMzp7aTowO3M6MTk6Il9fbGlua2ZlZWRfcm9ib3RzX18iO2k6MTtzOjEzOiJMSU5LRkVFRF9VU0VSIjtpOjI7czoxNDoiTGlua2ZlZWRDbGllbnQiO2k6MztzOjE4OiJfX3NhcGVfZGVsaW1pdGVyX18iO2k6NDtzOjI5OiJkaXNwZW5zZXJcLmFydGljbGVzXC5zYXBlXC5ydSI7aTo1O3M6MTE6IkxFTktfY2xpZW50IjtpOjY7czoxMToiU0FQRV9jbGllbnQiO2k6NztzOjE2OiJfX2xpbmtmZWVkX2VuZF9fIjtpOjg7czoxNjoiU0xBcnRpY2xlc0NsaWVudCI7aTo5O3M6MTc6Ii0+R2V0TGlua3NccypcKFwpIjtpOjEwO3M6MTc6ImRiXC50cnVzdGxpbmtcLnJ1IjtpOjExO3M6Mzc6ImNsYXNzXHMrQ01fY2xpZW50XHMrZXh0ZW5kc1xzKkNNX2Jhc2UiO2k6MTI7czoxOToibmV3XHMrQ01fY2xpZW50XChcKSI7aToxMztzOjE2OiJ0bF9saW5rc19kYl9maWxlIjtpOjE0O3M6MjA6ImNsYXNzXHMrbG1wX2Jhc2Vccyt7IjtpOjE1O3M6MTU6IlRydXN0bGlua0NsaWVudCI7aToxNjtzOjEzOiItPlxzKlNMQ2xpZW50IjtpOjE3O3M6MTY2OiJpc3NldFxzKlwoKlxzKlwkX1NFUlZFUlxzKlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF1ccypcKVxzKiYmXHMqXCgqXHMqXCRfU0VSVkVSXHMqXFtccypbJyJdezAsMX1IVFRQX1VTRVJfQUdFTlRbJyJdezAsMX1cXVxzKj09XHMqWyciXXswLDF9TE1QX1JvYm90IjtpOjE4O3M6NDM6IlwkbGlua3MtPlxzKnJldHVybl9saW5rc1xzKlwoKlxzKlwkbGliX3BhdGgiO2k6MTk7czo0NDoiXCRsaW5rc19jbGFzc1xzKj1ccypuZXdccytHZXRfbGlua3NccypcKCpccyoiO2k6MjA7czo1MjoiWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfVwuWyciXXswLDF9XHMqXCkqXHMqO1xzKlw/PiI7aToyMTtzOjc6Imxldml0cmEiO2k6MjI7czoxMDoiZGFwb3hldGluZSI7aToyMztzOjY6InZpYWdyYSI7aToyNDtzOjY6ImNpYWxpcyI7aToyNTtzOjg6InByb3ZpZ2lsIjtpOjI2O3M6MTk6ImNsYXNzXHMrVFdlZmZDbGllbnQiO2k6Mjc7czoxODoibmV3XHMrU0xDbGllbnRcKFwpIjtpOjI4O3M6MjQ6Il9fbGlua2ZlZWRfYmVmb3JlX3RleHRfXyI7aToyOTtzOjE2OiJfX3Rlc3RfdGxfbGlua19fIjtpOjMwO3M6MTg6InM6MTE6ImxtcF9jaGFyc2V0IiI7aTozMTtzOjIwOiI9XHMrbmV3XHMrTUxDbGllbnRcKCI7aTozMjtzOjQ3OiJlbHNlXHMraWZccypcKFxzKlwoXHMqc3RycG9zXChccypcJGxpbmtzX2lwXHMqLCI7fQ=="));
$g_JSVirSig = unserialize(base64_decode("YToxMTM6e2k6MDtzOjcwOiJ1c2VyQWdlbnRcfHBwXHxodHRwXHxkYXphbHl6WyciXXswLDF9XC5zcGxpdFwoWyciXXswLDF9XHxbJyJdezAsMX1cKSwwIjtpOjE7czo0MToiZj0nZidcKydyJ1wrJ28nXCsnbSdcKydDaCdcKydhckMnXCsnb2RlJzsiO2k6MjtzOjIyOiJcLnByb3RvdHlwZVwuYX1jYXRjaFwoIjtpOjM7czozNzoidHJ5e0Jvb2xlYW5cKFwpXC5wcm90b3R5cGVcLnF9Y2F0Y2hcKCI7aTo0O3M6MzQ6ImlmXChSZWZcLmluZGV4T2ZcKCdcLmdvb2dsZVwuJ1wpIT0iO2k6NTtzOjg2OiJpbmRleE9mXHxpZlx8cmNcfGxlbmd0aFx8bXNuXHx5YWhvb1x8cmVmZXJyZXJcfGFsdGF2aXN0YVx8b2dvXHxiaVx8aHBcfHZhclx8YW9sXHxxdWVyeSI7aTo2O3M6NTQ6IkFycmF5XC5wcm90b3R5cGVcLnNsaWNlXC5jYWxsXChhcmd1bWVudHNcKVwuam9pblwoIiJcKSI7aTo3O3M6ODI6InE9ZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKCJkIlwrImkiXCsidiJcKTtxXC5hcHBlbmRDaGlsZFwocVwrIiJcKTt9Y2F0Y2hcKHF3XCl7aD0iO2k6ODtzOjc5OiJcK3p6O3NzPVxbXF07Zj0nZnInXCsnb20nXCsnQ2gnO2ZcKz0nYXJDJztmXCs9J29kZSc7dz10aGlzO2U9d1xbZlxbInN1YnN0ciJcXVwoIjtpOjk7czoxMTU6InM1XChxNVwpe3JldHVybiBcK1wrcTU7fWZ1bmN0aW9uIHlmXChzZix3ZVwpe3JldHVybiBzZlwuc3Vic3RyXCh3ZSwxXCk7fWZ1bmN0aW9uIHkxXCh3Ylwpe2lmXCh3Yj09MTY4XCl3Yj0xMDI1O2Vsc2UiO2k6MTA7czo2NDoiaWZcKG5hdmlnYXRvclwudXNlckFnZW50XC5tYXRjaFwoL1woYW5kcm9pZFx8bWlkcFx8ajJtZVx8c3ltYmlhbiI7aToxMTtzOjEwNjoiZG9jdW1lbnRcLndyaXRlXCgnPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IidcK2RvbWFpblwrJyI+PC9zY3InXCsnaXB0PidcKSI7aToxMjtzOjMxOiJodHRwOi8vcGhzcFwucnUvXy9nb1wucGhwXD9zaWQ9IjtpOjEzO3M6MTc6IjwvaHRtbD5ccyo8c2NyaXB0IjtpOjE0O3M6MTc6IjwvaHRtbD5ccyo8aWZyYW1lIjtpOjE1O3M6NjY6Ij1uYXZpZ2F0b3JcW2FwcFZlcnNpb25fdmFyXF1cLmluZGV4T2ZcKCJNU0lFIlwpIT0tMVw/JzxpZnJhbWUgbmFtZSI7aToxNjtzOjc6IlxceDY1QXQiO2k6MTc7czo5OiJcXHg2MXJDb2QiO2k6MTg7czoyMjoiImZyIlwrIm9tQyJcKyJoYXJDb2RlIiI7aToxOTtzOjExOiI9ImV2IlwrImFsIiI7aToyMDtzOjc4OiJcW1woXChlXClcPyJzIjoiIlwpXCsicCJcKyJsaXQiXF1cKCJhXCQiXFtcKFwoZVwpXD8ic3UiOiIiXClcKyJic3RyIlxdXCgxXClcKTsiO2k6MjE7czozOToiZj0nZnInXCsnb20nXCsnQ2gnO2ZcKz0nYXJDJztmXCs9J29kZSc7IjtpOjIyO3M6MjA6ImZcKz1cKGhcKVw/J29kZSc6IiI7IjtpOjIzO3M6NDE6ImY9J2YnXCsncidcKydvJ1wrJ20nXCsnQ2gnXCsnYXJDJ1wrJ29kZSc7IjtpOjI0O3M6NTA6ImY9J2Zyb21DaCc7ZlwrPSdhckMnO2ZcKz0ncWdvZGUnXFsic3Vic3RyIlxdXCgyXCk7IjtpOjI1O3M6MTY6InZhclxzK2Rpdl9jb2xvcnMiO2k6MjY7czo5OiJ2YXJccytfMHgiO2k6Mjc7czoyMDoiQ29yZUxpYnJhcmllc0hhbmRsZXIiO2k6Mjg7czo3OiJwaW5nbm93IjtpOjI5O3M6ODoic2VyY2hib3QiO2k6MzA7czoxMDoia20wYWU5Z3I2bSI7aTozMTtzOjY6ImMzMjg0ZCI7aTozMjtzOjg6IlxceDY4YXJDIjtpOjMzO3M6ODoiXFx4NmRDaGEiO2k6MzQ7czo3OiJcXHg2ZmRlIjtpOjM1O3M6NzoiXFx4NmZkZSI7aTozNjtzOjg6IlxceDQzb2RlIjtpOjM3O3M6NzoiXFx4NzJvbSI7aTozODtzOjc6IlxceDQzaGEiO2k6Mzk7czo3OiJcXHg3MkNvIjtpOjQwO3M6ODoiXFx4NDNvZGUiO2k6NDE7czoxMDoiXC5keW5kbnNcLiI7aTo0MjtzOjk6IlwuZHluZG5zLSI7aTo0MztzOjc5OiJ9XHMqZWxzZVxzKntccypkb2N1bWVudFwud3JpdGVccypcKFxzKlsnIl17MCwxfVwuWyciXXswLDF9XClccyp9XHMqfVxzKlJcKFxzKlwpIjtpOjQ0O3M6NDU6ImRvY3VtZW50XC53cml0ZVwodW5lc2NhcGVcKCclM0NkaXYlMjBpZCUzRCUyMiI7aTo0NTtzOjE4OiJcLmJpdGNvaW5wbHVzXC5jb20iO2k6NDY7czo0MToiXC5zcGxpdFwoIiYmIlwpO2g9MjtzPSIiO2lmXChtXClmb3JcKGk9MDsiO2k6NDc7czo0MToiPGlmcmFtZVxzK3NyYz0iaHR0cDovL2RlbHV4ZXNjbGlja3NcLnByby8iO2k6NDg7czo0NToiM0Jmb3JcfGZyb21DaGFyQ29kZVx8MkMyN1x8M0RcfDJDODhcfHVuZXNjYXBlIjtpOjQ5O3M6NTg6Ijtccypkb2N1bWVudFwud3JpdGVcKFsnIl17MCwxfTxpZnJhbWVccypzcmM9Imh0dHA6Ly95YVwucnUiO2k6NTA7czoxMTA6IndcLmRvY3VtZW50XC5ib2R5XC5hcHBlbmRDaGlsZFwoc2NyaXB0XCk7XHMqY2xlYXJJbnRlcnZhbFwoaVwpO1xzKn1ccyp9XHMqLFxzKlxkK1xzKlwpXHMqO1xzKn1ccypcKVwoXHMqd2luZG93IjtpOjUxO3M6MTEwOiJpZlwoIWdcKFwpJiZ3aW5kb3dcLm5hdmlnYXRvclwuY29va2llRW5hYmxlZFwpe2RvY3VtZW50XC5jb29raWU9IjE9MTtleHBpcmVzPSJcK2VcLnRvR01UU3RyaW5nXChcKVwrIjtwYXRoPS8iOyI7aTo1MjtzOjcwOiJubl9wYXJhbV9wcmVsb2FkZXJfY29udGFpbmVyXHw1MDAxXHxoaWRkZW5cfGlubmVySFRNTFx8aW5qZWN0XHx2aXNpYmxlIjtpOjUzO3M6MzE6IjwhLS0gW2EtekEtWjAtOV9dKz9cfFx8c3RhdCAtLT4iO2k6NTQ7czo4NToiJnBhcmFtZXRlcj1cJGtleXdvcmQmc2U9XCRzZSZ1cj0xJkhUVFBfUkVGRVJFUj0nXCtlbmNvZGVVUklDb21wb25lbnRcKGRvY3VtZW50XC5VUkxcKSI7aTo1NTtzOjQ4OiJ3aW5kb3dzXHxzZXJpZXNcfDYwXHxzeW1ib3NcfGNlXHxtb2JpbGVcfHN5bWJpYW4iO2k6NTY7czozNToiXFtbJyJdZXZhbFsnIl1cXVwoc1wpO319fX08L3NjcmlwdD4iO2k6NTc7czo1OToia0M3MEZNYmx5SmtGV1pvZENLbDFXWU9kV1lVbG5RelJuYmwxV1pzVkVkbGRtTDA1V1p0VjNZdlJHSTkiO2k6NTg7czo1NToie2s9aTtzPXNcLmNvbmNhdFwoc3NcKGV2YWxcKGFzcVwoXClcKS0xXClcKTt9ej1zO2V2YWxcKCI7aTo1OTtzOjEzMDoiZG9jdW1lbnRcLmNvb2tpZVwubWF0Y2hcKG5ld1xzK1JlZ0V4cFwoXHMqIlwoXD86XF5cfDsgXCkiXHMqXCtccypuYW1lXC5yZXBsYWNlXCgvXChcW1xcXC5cJFw/XCpcfHt9XFxcKFxcXClcXFxbXFxcXVxcL1xcXCtcXlxdXCkvZyI7aTo2MDtzOjg2OiJzZXRDb29raWVccypcKCpccyoiYXJ4X3R0IlxzKixccyoxXHMqLFxzKmR0XC50b0dNVFN0cmluZ1woXClccyosXHMqWyciXXswLDF9L1snIl17MCwxfSI7aTo2MTtzOjE0NDoiZG9jdW1lbnRcLmNvb2tpZVwubWF0Y2hccypcKFxzKm5ld1xzK1JlZ0V4cFxzKlwoXHMqIlwoXD86XF5cfDtccypcKSJccypcK1xzKm5hbWVcLnJlcGxhY2VccypcKC9cKFxbXFxcLlwkXD9cKlx8e31cXFwoXFxcKVxcXFtcXFxdXFwvXFxcK1xeXF1cKS9nIjtpOjYyO3M6OTg6InZhclxzK2R0XHMrPVxzK25ld1xzK0RhdGVcKFwpLFxzK2V4cGlyeVRpbWVccys9XHMrZHRcLnNldFRpbWVcKFxzK2R0XC5nZXRUaW1lXChcKVxzK1wrXHMrOTAwMDAwMDAwIjtpOjYzO3M6MTA1OiJpZlxzKlwoXHMqbnVtXHMqPT09XHMqMFxzKlwpXHMqe1xzKnJldHVyblxzKjE7XHMqfVxzKmVsc2Vccyp7XHMqcmV0dXJuXHMrbnVtXHMqXCpccypyRmFjdFwoXHMqbnVtXHMqLVxzKjEiO2k6NjQ7czo0MToiXCs9U3RyaW5nXC5mcm9tQ2hhckNvZGVcKHBhcnNlSW50XCgwXCsneCciO2k6NjU7czo4MzoiPHNjcmlwdFxzK2xhbmd1YWdlPSJKYXZhU2NyaXB0Ij5ccypwYXJlbnRcLndpbmRvd1wub3BlbmVyXC5sb2NhdGlvbj0iaHR0cDovL3ZrXC5jb20iO2k6NjY7czo0NDoibG9jYXRpb25cLnJlcGxhY2VcKFsnIl17MCwxfWh0dHA6Ly92NWs0NVwucnUiO2k6Njc7czoxMjk6Ijt0cnl7XCtcK2RvY3VtZW50XC5ib2R5fWNhdGNoXChxXCl7YWE9ZnVuY3Rpb25cKGZmXCl7Zm9yXChpPTA7aTx6XC5sZW5ndGg7aVwrXCtcKXt6YVwrPVN0cmluZ1xbZmZcXVwoZVwodlwrXCh6XFtpXF1cKVwpLTEyXCk7fX07fSI7aTo2ODtzOjE0MjoiZG9jdW1lbnRcLndyaXRlXHMqXChbJyJdezAsMX08WyciXXswLDF9XHMqXCtccyp4XFswXF1ccypcK1xzKlsnIl17MCwxfSBbJyJdezAsMX1ccypcK1xzKnhcWzRcXVxzKlwrXHMqWyciXXswLDF9PlwuWyciXXswLDF9XHMqXCt4XHMqXFsyXF1ccypcKyI7aTo2OTtzOjYwOiJpZlwodFwubGVuZ3RoPT0yXCl7elwrPVN0cmluZ1wuZnJvbUNoYXJDb2RlXChwYXJzZUludFwodFwpXCsiO2k6NzA7czo3NDoid2luZG93XC5vbmxvYWRccyo9XHMqZnVuY3Rpb25cKFwpXHMqe1xzKmlmXHMqXChkb2N1bWVudFwuY29va2llXC5pbmRleE9mXCgiO2k6NzE7czo5NzoiXC5zdHlsZVwuaGVpZ2h0XHMqPVxzKlsnIl17MCwxfTBweFsnIl17MCwxfTt3aW5kb3dcLm9ubG9hZFxzKj1ccypmdW5jdGlvblwoXClccyp7ZG9jdW1lbnRcLmNvb2tpZSI7aTo3MjtzOjEyMjoiXC5zcmM9XChbJyJdezAsMX1odHBzOlsnIl17MCwxfT09ZG9jdW1lbnRcLmxvY2F0aW9uXC5wcm90b2NvbFw/WyciXXswLDF9aHR0cHM6Ly9zc2xbJyJdezAsMX06WyciXXswLDF9aHR0cDovL1snIl17MCwxfVwpXCsiO2k6NzM7czozMDoiNDA0XC5waHBbJyJdezAsMX0+XHMqPC9zY3JpcHQ+IjtpOjc0O3M6NzY6InByZWdfbWF0Y2hcKFsnIl17MCwxfS9zYXBlL2lbJyJdezAsMX1ccyosXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1IVFRQX1JFRkVSRVIiO2k6NzU7czo3NDoiZGl2XC5pbm5lckhUTUxccypcKz1ccypbJyJdezAsMX08ZW1iZWRccytpZD0iZHVtbXkyIlxzK25hbWU9ImR1bW15MiJccytzcmMiO2k6NzY7czo3Mzoic2V0VGltZW91dFwoWyciXXswLDF9YWRkTmV3T2JqZWN0XChcKVsnIl17MCwxfSxcZCtcKTt9fX07YWRkTmV3T2JqZWN0XChcKSI7aTo3NztzOjUxOiJcKGI9ZG9jdW1lbnRcKVwuaGVhZFwuYXBwZW5kQ2hpbGRcKGJcLmNyZWF0ZUVsZW1lbnQiO2k6Nzg7czozMDoiQ2hyb21lXHxpUGFkXHxpUGhvbmVcfElFTW9iaWxlIjtpOjc5O3M6MTk6IlwkOlwoe31cKyIiXClcW1wkXF0iO2k6ODA7czo1Mzoie3Bvc2l0aW9uOmFic29sdXRlO3RvcDotOTk5OXB4O308L3N0eWxlPjxkaXZccytjbGFzcz0iO2k6ODE7czoxMjg6ImlmXHMqXChcKHVhXC5pbmRleE9mXChbJyJdezAsMX1jaHJvbWVbJyJdezAsMX1cKVxzKj09XHMqLTFccyomJlxzKnVhXC5pbmRleE9mXCgid2luIlwpXHMqIT1ccyotMVwpXHMqJiZccypuYXZpZ2F0b3JcLmphdmFFbmFibGVkIjtpOjgyO3M6NTg6InBhcmVudFwud2luZG93XC5vcGVuZXJcLmxvY2F0aW9uPVsnIl17MCwxfWh0dHA6Ly92a1wuY29tXC4iO2k6ODM7czo0MToiXF1cLnN1YnN0clwoMCwxXClcKTt9fXJldHVybiB0aGlzO30sXFx1MDAiO2k6ODQ7czo2ODoiamF2YXNjcmlwdFx8aGVhZFx8dG9Mb3dlckNhc2VcfGNocm9tZVx8d2luXHxqYXZhRW5hYmxlZFx8YXBwZW5kQ2hpbGQiO2k6ODU7czoyMToibG9hZFBOR0RhdGFcKHN0ckZpbGUsIjtpOjg2O3M6MjA6IlwpO2lmXCghflwoWyciXXswLDF9IjtpOjg3O3M6MjM6Ii8vXHMqU29tZVwuZGV2aWNlc1wuYXJlIjtpOjg4O3M6NTU6InN0cmlwb3NccypcKFxzKmZfaGF5c3RhY2tccyosXHMqZl9uZWVkbGVccyosXHMqZl9vZmZzZXQiO2k6ODk7czozMjoid2luZG93XC5vbmVycm9yXHMqPVxzKmtpbGxlcnJvcnMiO2k6OTA7czoxMDU6ImNoZWNrX3VzZXJfYWdlbnQ9XFtccypbJyJdezAsMX1MdW5hc2NhcGVbJyJdezAsMX1ccyosXHMqWyciXXswLDF9aVBob25lWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfU1hY2ludG9zaCI7aTo5MTtzOjE1MzoiZG9jdW1lbnRcLndyaXRlXChbJyJdezAsMX08WyciXXswLDF9XCtbJyJdezAsMX1pWyciXXswLDF9XCtbJyJdezAsMX1mWyciXXswLDF9XCtbJyJdezAsMX1yWyciXXswLDF9XCtbJyJdezAsMX1hWyciXXswLDF9XCtbJyJdezAsMX1tWyciXXswLDF9XCtbJyJdezAsMX1lIjtpOjkyO3M6MTc6InNleGZyb21pbmRpYVwuY29tIjtpOjkzO3M6MTE6ImZpbGVreFwuY29tIjtpOjk0O3M6MTM6InN0dW1tYW5uXC5uZXQiO2k6OTU7czoxNDoiaHR0cDovL3h6eFwucG0iO2k6OTY7czoxODoiXC5ob3B0b1wubWUvanF1ZXJ5IjtpOjk3O3M6MTE6Im1vYmktZ29cLmluIjtpOjk4O3M6MTg6ImJhbmtvZmFtZXJpY2FcLmNvbSI7aTo5OTtzOjE2OiJteWZpbGVzdG9yZVwuY29tIjtpOjEwMDtzOjE3OiJmaWxlc3RvcmU3MlwuaW5mbyI7aToxMDE7czoxNjoiZmlsZTJzdG9yZVwuaW5mbyI7aToxMDI7czoxNToidXJsMnNob3J0XC5pbmZvIjtpOjEwMztzOjE4OiJmaWxlc3RvcmUxMjNcLmluZm8iO2k6MTA0O3M6MTI6InVybDEyM1wuaW5mbyI7aToxMDU7czoxNDoiZG9sbGFyYWRlXC5jb20iO2k6MTA2O3M6MTE6InNlY2NsaWtcLnJ1IjtpOjEwNztzOjExOiJtb2J5LWFhXC5ydSI7aToxMDg7czoxMjoic2VydmxvYWRcLnJ1IjtpOjEwOTtzOjQ4OiJzdHJpcG9zXChuYXZpZ2F0b3JcLnVzZXJBZ2VudFxzKixccypsaXN0X2RhdGFcW2kiO2k6MTEwO3M6MjY6ImlmXHMqXCghc2VlX3VzZXJfYWdlbnRcKFwpIjtpOjExMTtzOjQ2OiJjXC5sZW5ndGhcKTt9cmV0dXJuXHMqWyciXVsnIl07fWlmXCghZ2V0Q29va2llIjtpOjExMjtzOjcwOiI8c2NyaXB0XHMqdHlwZT1bJyJdezAsMX10ZXh0L2phdmFzY3JpcHRbJyJdezAsMX1ccypzcmM9WyciXXswLDF9ZnRwOi8vIjt9"));
$gX_JSVirSig = unserialize(base64_decode("YToxNTp7aTowO3M6NDg6ImRvY3VtZW50XC53cml0ZVxzKlwoXHMqdW5lc2NhcGVccypcKFsnIl17MCwxfSUzYyI7aToxO3M6Njk6ImRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoWyciXWhlYWRbJyJdXClcWzBcXVwuYXBwZW5kQ2hpbGRcKGFcKSI7aToyO3M6Mjg6ImlwXChob25lXHxvZFwpXHxpcmlzXHxraW5kbGUiO2k6MztzOjQ4OiJzbWFydHBob25lXHxibGFja2JlcnJ5XHxtdGtcfGJhZGFcfHdpbmRvd3MgcGhvbmUiO2k6NDtzOjQwOiJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi1cZCtweDt0b3A6LVxkK3B4IjtpOjU7czozMDoiY29tcGFsXHxlbGFpbmVcfGZlbm5lY1x8aGlwdG9wIjtpOjY7czo1NjoiO2M9MX07d2hpbGVcKGMtLVwpe2lmXChrXFtjXF1cKXtwPXBcLnJlcGxhY2VcKG5ldyBSZWdFeHAiO2k6NztzOjM3OiJkb2N1bWVudFwud3JpdGVcKFsnIl08c2NyWyciXVwrWyciXWlwIjtpOjg7czo0OToiaWZyYW1lXC5zdHlsZVwud2lkdGhccyo9XHMqWyciXXswLDF9MHB4WyciXXswLDF9OyI7aTo5O3M6MTAxOiJkb2N1bWVudFwuY2FwdGlvbj1udWxsO3dpbmRvd1wuYWRkRXZlbnRcKFsnIl17MCwxfWxvYWRbJyJdezAsMX0sZnVuY3Rpb25cKFwpe3ZhciBjYXB0aW9uPW5ldyBKQ2FwdGlvbiI7aToxMDtzOjEyOiJodHRwOi8vZnRwXC4iO2k6MTE7czo3OiJubm5cLnBtIjtpOjEyO3M6Nzoibm5tXC5wbSI7aToxMztzOjc4OiI8c2NyaXB0XHMqdHlwZT1bJyJdezAsMX10ZXh0L2phdmFzY3JpcHRbJyJdezAsMX1ccypzcmM9WyciXXswLDF9aHR0cDovL2dvb1wuZ2wiO2k6MTQ7czo2NzoiIlxzKlwrXHMqbmV3IERhdGVcKFwpXC5nZXRUaW1lXChcKTtccypkb2N1bWVudFwuYm9keVwuYXBwZW5kQ2hpbGRcKCI7fQ=="));
$g_PhishingSig = unserialize(base64_decode("YToyNjp7aTowO3M6MjE6Ii1ccypQYXlQYWxccyo8L3RpdGxlPiI7aToxO3M6MTY6Ijx0aXRsZT5QYXlccypQYWwiO2k6MjtzOjIyOiItXHMqUHJpdmF0aVxzKjwvdGl0bGU+IjtpOjM7czoxOToiPHRpdGxlPlxzKlVuaUNyZWRpdCI7aTo0O3M6MTk6IkJhbmtccytvZlxzK0FtZXJpY2EiO2k6NTtzOjI1OiJBbGliYWJhJm5ic3A7TWFudWZhY3R1cmVyIjtpOjY7czoyMDoiVmVyaWZpZWRccytieVxzK1Zpc2EiO2k6NztzOjIxOiJIb25nXHMrTGVvbmdccytPbmxpbmUiO2k6ODtzOjMwOiJZb3VyXHMrYWNjb3VudFxzK1x8XHMrTG9nXHMraW4iO2k6OTtzOjE2OiJPbmxpbmVccytCYW5raW5nIjtpOjEwO3M6MTQ6Ik9ubGluZS1CYW5raW5nIjtpOjExO3M6MjI6IlNpZ25ccytpblxzK3RvXHMrWWFob28iO2k6MTI7czoxMToiQkFOQ09MT01CSUEiO2k6MTM7czoxNjoiPHRpdGxlPlxzKkFtYXpvbiI7aToxNDtzOjE1OiI8dGl0bGU+XHMqQXBwbGUiO2k6MTU7czoyMjoiPHRpdGxlPkdvb2dsZVxzK1NlY3VyZSI7aToxNjtzOjI4OiI8dGl0bGU+TWVyYWtccytNYWlsXHMrU2VydmVyIjtpOjE3O3M6MjM6Ijx0aXRsZT5Tb2NrZXRccytXZWJtYWlsIjtpOjE4O3M6MTg6Ijx0aXRsZT5cW0xfUVVFUllcXSI7aToxOTtzOjMxOiI8dGl0bGU+QU5aXHMrSW50ZXJuZXRccytCYW5raW5nIjtpOjIwO3M6MzM6ImNvbVwud2Vic3RlcmJhbmtcLnNlcnZsZXRzXC5Mb2dpbiI7aToyMTtzOjE1OiI8dGl0bGU+XHMqR21haWwiO2k6MjI7czoyNjoiU29jaWFsXHMrU2VjdXJpdHlccytOdW1iZXIiO2k6MjM7czozNjoiXGQrO1VSTD1odHRwczovL3d3d1wud2VsbHNmYXJnb1wuY29tIjtpOjI0O3M6MTg6Ijx0aXRsZT5XZWxscyBGYXJnbyI7aToyNTtzOjQ5OiJwcm9wZXJ0eT0ib2c6c2l0ZV9uYW1lIlxzKmNvbnRlbnQ9IkZhY2Vib29rIlxzKi8+Ijt9"));
//var_dump($g_FlexDBShe);
//exit;
$g_UnsafeFilesArray = array('td*.php', 'a{1,}.php', 'zd*.php', '123.php', 'testd*.php', 'asd.php', 'info.php', 'CHANGELOG.php', 
                           'COPYRIGHT.php', 'CREDITS.php', 'LICENSE.php', 'LICENSES.php', 'backup.+?.zip', 
                           'backup.+?.tar.gz', 'backup.+?.tgz', 
                           'phpinfo.php', 'changelog.txt', 'readme.txt', 'INSTALLATION.php', 'dump.sql', 'changelog.log');
$g_UnsafeDirArray = array('install', 'backup', 'webalizer', 'awstats');
////////////////////////////////////////////////////////////////////////////
if (!isCli() && !isset($_SERVER['HTTP_USER_AGENT'])) {
  echo "#####################################################n";
  echo "# Error: cannot run on php-cgi. Requires php as cli #n";
  echo "#                                                   #n";
  echo "# See FAQ: http://revisium.com/ai/faq.php           #n";
  echo "#####################################################n";
  exit;
}
define('AI_VERSION', '20140813');
define('INFO_M', base64_decode('PGZvbnQgY29sb3I9I0UwNjA2MD7QotC+0LvRjNC60L4g0LTQu9GPINC90LXQutC+0LzQvNC10YDRh9C10YHQutC+0LPQviDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyE8L2ZvbnQ+PC9oNT4='));
////////////////////////////////////////////////////////////////////////////
$l_Res = '';
$g_Structure = array();
$g_Counter = 0;
$g_NotRead = array();
$g_FileInfo = array();
$g_Iframer = array();
$g_PHPCodeInside = array();
$g_CriticalJS = array();
$g_Phishing = array();
$g_HeuristicDetected = array();
$g_HeuristicType = array();
$g_UnixExec = array();
$g_SkippedFolders = array();
$g_UnsafeFilesFound = array();
$g_CMS = array();
$g_SymLinks = array();
$g_HiddenFiles = array();
$g_TotalFolder = 0;
$g_TotalFiles = 0;
$g_FoundTotalDirs = 0;
$g_FoundTotalFiles = 0;
if (!isCli()) {
   $defaults['site_url'] = 'http://' . $_SERVER['HTTP_HOST'] . '/'; 
}
define('CRC32_LIMIT', pow(2, 31) - 1);
define('CRC32_DIFF', CRC32_LIMIT * 2 -2);
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
srand(time());
set_time_limit(0);
ini_set('max_execution_time', '90000');
ini_set('memory_limit','256M');
if (!function_exists('stripos')) {
    function stripos($par_Str, $par_Entry, $Offset = 0) {
        return strpos(strtolower($par_Str), strtolower($par_Entry), $Offset);
    }
}
define('CMS_BITRIX', 'Bitrix');
define('CMS_WORDPRESS', 'Wordpress');
define('CMS_JOOMLA', 'Joomla');
define('CMS_DLE', 'Data Life Engine');
define('CMS_IPB', 'Invision Power Board');
define('CMS_WEBASYST', 'WebAsyst');
define('CMS_OSCOMMERCE', 'OsCommerce');
define('CMS_DRUPAL', 'Drupal');
define('CMS_MODX', 'MODX');
define('CMS_INSTANTCMS', 'Instant CMS');
define('CMS_PHPBB', 'PhpBB');
define('CMS_VBULLETIN', 'vBulletin');
define('CMS_SHOPSCRIPT', 'PHP ShopScript Premium');
define('CMS_VERSION_UNDEFINED', '0.0');
class CmsVersionDetector {
    private $root_path;
    private $versions;
    private $types;
    public function __construct($root_path = '.') {
        $this->root_path = $root_path;
        $this->versions = array();
        $this->types = array();
        $version = '';
        if ($this->checkBitrix($version)) {
           $this->addCms(CMS_BITRIX, $version);
        }
        if ($this->checkWordpress($version)) {
           $this->addCms(CMS_WORDPRESS, $version);
        }
        if ($this->checkJoomla($version)) {
           $this->addCms(CMS_JOOMLA, $version);
        }
        if ($this->checkDle($version)) {
           $this->addCms(CMS_DLE, $version);
        }
        if ($this->checkIpb($version)) {
           $this->addCms(CMS_IPB, $version);
        }
        if ($this->checkWebAsyst($version)) {
           $this->addCms(CMS_WEBASYST, $version);
        }
        if ($this->checkOsCommerce($version)) {
           $this->addCms(CMS_OSCOMMERCE, $version);
        }
        if ($this->checkDrupal($version)) {
           $this->addCms(CMS_DRUPAL, $version);
        }
        if ($this->checkMODX($version)) {
           $this->addCms(CMS_MODX, $version);
        }
        if ($this->checkInstantCms($version)) {
           $this->addCms(CMS_INSTANTCMS, $version);
        }
        if ($this->checkPhpBb($version)) {
           $this->addCms(CMS_PHPBB, $version);
        }
        if ($this->checkVBulletin($version)) {
           $this->addCms(CMS_VBULLETIN, $version);
        }
        if ($this->checkPhpShopScript($version)) {
           $this->addCms(CMS_SHOPSCRIPT, $version);
        }
    }
    function getCmsList() {
      return $this->types;
    }
    function getCmsVersions() {
      return $this->versions;
    }
    function getCmsNumber() {
      return count($this->types);
    }
    function getCmsName($index = 0) {
      return $this->types[$index];
    }
    function getCmsVersion($index = 0) {
      return $this->versions[$index];
    }
    private function addCms($type, $version) {
       $this->types[] = $type;
       $this->versions[] = $version;
    }
    private function checkBitrix(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/bitrix')) {
          $res = true;
          $tmp_content = @implode('', @file($this->root_path .'/bitrix/modules/main/classes/general/version.php'));
          if (preg_match('|define("SM_VERSION","(.+?)")|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }
       }
       return $res;
    }
    private function checkWordpress(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/wp-admin')) {
          $res = true;
          $tmp_content = @implode('', @file($this->root_path .'/wp-includes/version.php'));
          if (preg_match('|$wp_versions*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }
       }
       return $res;
    }
    private function checkJoomla(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/libraries/joomla')) {
          $res = true;
          // for 1.5.x
          $tmp_content = @implode('', @file($this->root_path .'/libraries/joomla/version.php'));
          if (preg_match('|vars+$RELEASEs*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
             if (preg_match('|vars+$DEV_LEVELs*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
                $version .= '.' . $tmp_ver[1];
             }
          }
          // for 1.7.x
          $tmp_content = @implode('', @file($this->root_path .'/includes/version.php'));
          if (preg_match('|publics+$RELEASEs*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
             if (preg_match('|publics+$DEV_LEVELs*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
                $version .= '.' . $tmp_ver[1];
             }
          }
          // for 2.5.x and 3.x
          $tmp_content = @implode('', @file($this->root_path .'/libraries/cms/version/version.php'));
          if (preg_match('|publics+$RELEASEs*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
             if (preg_match('|publics+$DEV_LEVELs*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
                $version .= '.' . $tmp_ver[1];
             }
          }
       }
       return $res;
    }
    private function checkDle(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/engine/engine.php')) {
          $res = true;
          $tmp_content = @implode('', @file($this->root_path .'/engine/data/config.php'));
          if (preg_match('|'version_id's*=>s*"(.+?)"|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }
          $tmp_content = @implode('', @file($this->root_path .'/install.php'));
          if (preg_match('|'version_id's*=>s*"(.+?)"|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }
       }
       return $res;
    }
    private function checkIpb(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/ips_kernel')) {
          $res = true;
          $tmp_content = @implode('', @file($this->root_path .'/ips_kernel/class_xml.php'));
          if (preg_match('|IP.Boards+v([0-9.]+)|si', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }
       }
       return $res;
    }
    private function checkWebAsyst(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/wbs/installer')) {
          $res = true;
          $tmp_content = @implode('', @file($this->root_path .'/license.txt'));
          if (preg_match('|v([0-9.]+)|si', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }
       }
       return $res;
    }
    private function checkOsCommerce(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/includes/version.php')) {
          $res = true;
          $tmp_content = @implode('', @file($this->root_path .'/includes/version.php'));
          if (preg_match('|([0-9.]+)|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }
       }
       return $res;
    }
    private function checkDrupal(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/sites/all')) {
          $res = true;
          $tmp_content = @implode('', @file($this->root_path .'/CHANGELOG.txt'));
          if (preg_match('|Drupals+([0-9.]+)|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }
       }
       return $res;
    }
    private function checkMODX(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/manager/assets')) {
          $res = true;
          // no way to pick up version
       }
       return $res;
    }
    private function checkInstantCms(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/plugins/p_usertab')) {
          $res = true;
          $tmp_content = @implode('', @file($this->root_path .'/index.php'));
          if (preg_match('|InstantCMSs+v([0-9.]+)|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }
       }
       return $res;
    }
    private function checkPhpBb(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/includes/acp')) {
          $res = true;
          $tmp_content = @implode('', @file($this->root_path .'/config.php'));
          if (preg_match('|phpBBs+([0-9.x]+)|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }
       }
       return $res;
    }
    private function checkVBulletin(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/core/admincp')) {
          $res = true;
          $tmp_content = @implode('', @file($this->root_path .'/core/api.php'));
          if (preg_match('|vBulletins+([0-9.x]+)|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }
       }
       return $res;
    }
    private function checkPhpShopScript(&$version) {
       $version = CMS_VERSION_UNDEFINED;
       $res = false;
       if (file_exists($this->root_path .'/install/consts.php')) {
          $res = true;
          $tmp_content = @implode('', @file($this->root_path .'/install/consts.php'));
          if (preg_match('|STRING_VERSION',s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }
       }
       return $res;
    }
}
/**
 * Print file
*/
function printFile() {
    $l_FileName = $_GET['fn'];
    $l_CRC = isset($_GET['c']) ? (int)$_GET['c'] : 0;
    $l_Content = implode('', file($l_FileName));
    $l_FileCRC = realCRC($l_Content);
    if ($l_FileCRC != $l_CRC) {
        echo 'Доступ запрещен.';
        exit;
    }
    
    echo '<pre>' . htmlspecialchars($l_Content) . '</pre>';
}
/**
 *
 */
function realCRC($str_in, $full = false)
{
        $in = crc32( $full ? normal($str_in) : $str_in );
        return ($in > CRC32_LIMIT) ? ($in - CRC32_DIFF) : $in;
}
/**
 * Determine php script is called from the command line interface
 * @return bool
 */
function isCli()
{
    return php_sapi_name() == 'cli';
}
function myCheckSum($str) {
  return str_replace('-', 'x', crc32($str));
}
/*
 *
 */
function shanonEntropy($par_Str)
{
    $dic = array();
    $len = strlen($par_Str);
    for ($i = 0; $i < $len; $i++) {
        $dic[$par_Str[$i]]++;
    } 
    $result = 0.0;
    $frequency = 0.0;
    foreach ($dic as $item)
    {
        $frequency = (float)$item / (float)$len;
        $result -= $frequency * (log($frequency) / log(2));
    }
    return $result;
}
 function generatePassword ($length = 9)
  {
    // start with a blank password
    $password = "";
    // define possible characters - any character in this string can be
    // picked for use in the password, so if you want to put vowels back in
    // or add special characters such as exclamation marks, this is where
    // you should do it
    $possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";
    // we refer to the length of $possible a few times, so let's grab it now
    $maxlength = strlen($possible);
  
    // check for length overflow and truncate if necessary
    if ($length > $maxlength) {
      $length = $maxlength;
    }
    
    // set up a counter for how many characters are in the password so far
    $i = 0; 
    
    // add random characters to $password until $length is reached
    while ($i < $length) { 
      // pick a random character from the possible ones
      $char = substr($possible, mt_rand(0, $maxlength-1), 1);
        
      // have we already used this character in $password?
      if (!strstr($password, $char)) { 
        // no, so it's OK to add it onto the end of whatever we've already got...
        $password .= $char;
        // ... and increase the counter by one
        $i++;
      }
    }
    // done!
    return $password;
  }
/**
 * Print to console
 * @param mixed $text
 * @param bool $add_lb Add line break
 * @return void
 */
function stdOut($text, $add_lb = true)
{
    global $BOOL_RESULT;
    if (!isCli())
        return;
        
    if (is_bool($text))
    {
        $text = $text ? 'true' : 'false';
    }
    else if (is_null($text))
    {
        $text = 'null';
    }
    if (!is_scalar($text))
    {
        $text = print_r($text, true);
    }
     if (!$BOOL_RESULT)
     {
         @fwrite(STDOUT, $text . ($add_lb ? "n" : ''));
     }
}
/**
 * Print progress
 * @param int $num Current file
 */
function printProgress($num, &$par_File)
{
    global $g_CriticalPHP, $g_Base64, $g_Phishing, $g_CriticalJS, $g_Iframer;
    $total_files = $GLOBALS['g_FoundTotalFiles'];
    $elapsed_time = microtime(true) - START_TIME;
    $stat = '';
    if ($elapsed_time >= 1)
    {
        $elapsed_seconds = round($elapsed_time, 0);
        $fs = floor($num / $elapsed_seconds);
        $left_files = $total_files - $num;
        if ($fs > 0) 
        {
           $left_time = ($left_files / $fs); //ceil($left_files / $fs);
           $stat = '. [Avg: ' . round($fs,2) . ' files/s' . ($left_time > 0  ? ' Left: ' . seconds2Human($left_time) : '') . '] [Mlw:' . (count($g_CriticalPHP) + count($g_Base64))  . '|' . (count($g_CriticalJS) + count($g_Iframer) + count($g_Phishing)) . ']';
        }
    }
    $l_FN = substr($par_File, -60);
    $text = "[$l_FN] $num of {$total_files}" . $stat;
    $text = str_pad($text, 160, ' ', STR_PAD_RIGHT);
    stdOut(str_repeat(chr(8), 160) . $text, false);
}
/**
 * Seconds to human readable
 * @param int $seconds
 * @return string
 */
function seconds2Human($seconds)
{
    $r = '';
    $_seconds = floor($seconds);
    $ms = $seconds - $_seconds;
    $seconds = $_seconds;
    if ($hours = floor($seconds / 3600))
    {
        $r .= $hours . (isCli() ? ' h ' : ' час ');
        $seconds = $seconds % 3600;
    }
    if ($minutes = floor($seconds / 60))
    {
        $r .= $minutes . (isCli() ? ' m ' : ' мин ');
        $seconds = $seconds % 60;
    }
    if ($minutes<3) $r .= ' ' . $seconds + ($ms > 0 ? round($ms, 5) : 0) . (isCli() ? ' s' : ' сек'); //' сек' - not good for shell
    return $r;
}
if (isCli())
{
    $cli_options = array(
        'm:' => 'memory:',
        's:' => 'size:',
        'a' => 'all',
        'd:' => 'delay:',
        'l:' => 'list:',
        'r:' => 'report:',
        'f' => 'fast',
        'j:' => 'file',
        'p:' => 'path:',
        'q' => 'quite',
        'h' => 'help'
    );
    $options = getopt(implode('', array_keys($cli_options)), array_values($cli_options));
    if (isset($options['h']) OR isset($options['help']))
    {
        $memory_limit = ini_get('memory_limit');
        echo <<<HELP
AI-Bolit - Script to search for shells and other malicious software.
Usage: php {$_SERVER['PHP_SELF']} [OPTIONS] [PATH]
Current default path is: {$defaults['path']}
  -j, --file=FILE      Specified path and filename to scan the only file
  -l, --list=FILE      Full path and filename to create plain text file with a list of found malware
  -p, --path=PATH      Directory path to scan, by default the file directory is used
                       Current path: {$defaults['path']}
  -m, --memory=SIZE    Maximum amount of memory a script may consume. Current value: $memory_limit
                       Can take shorthand byte values (1M, 1G...)
  -s, --size=SIZE      Scan files are smaller than SIZE. 0 - All files. Current value: {$defaults['max_size_to_scan']}
  -a, --all            Scan all files (by default scan. js,. php,. html,. htaccess)
  -d, --delay=INT      delay in milliseconds when scanning files to reduce load on the file system (Default: 1)
  -r, --report=PATH/EMAILS
                       Full path to create report or email address to send report to.
                       You can also specify multiple email separated by commas.
  -q,                Use only with -j. Quiet result check of file, 1=Infected 
      --help           Display this help and exit
* Mandatory arguments listed below are required for both full and short way of usage.
HELP;
        exit;
    }
    $l_FastCli = false;
    
    if (
        (isset($options['memory']) AND !empty($options['memory']) AND ($memory = $options['memory']))
        OR (isset($options['m']) AND !empty($options['m']) AND ($memory = $options['m']))
    )
    {
        $memory = getBytes($memory);
        if ($memory > 0)
        {
            $defaults['memory_limit'] = $memory;
        }
    }
    if (
        (isset($options['file']) AND !empty($options['file']) AND ($file = $options['file']) !== false)
        OR (isset($options['j']) AND !empty($options['j']) AND ($file = $options['j']) !== false)
    )
    {
        define('SCAN_FILE', $file);
    }
    if (
        (isset($options['list']) AND !empty($options['list']) AND ($file = $options['list']) !== false)
        OR (isset($options['l']) AND !empty($options['l']) AND ($file = $options['l']) !== false)
    )
    {
        define('PLAIN_FILE', $file);
    }
    if (
        (isset($options['size']) AND !empty($options['size']) AND ($size = $options['size']) !== false)
        OR (isset($options['s']) AND !empty($options['s']) AND ($size = $options['s']) !== false)
    )
    {
        $size = getBytes($size);
        $defaults['max_size_to_scan'] = $size > 0 ? $size : 0;
    }
     if (
         (isset($options['file']) AND !empty($options['file']) AND ($file = $options['file']) !== false)
         OR (isset($options['j']) AND !empty($options['j']) AND ($file = $options['j']) !== false)
         AND (isset($options['q'])) 
     
     )
     {
         $BOOL_RESULT = true;
     }
 
    if (isset($options['f'])) 
     {
       $l_FastCli = true;
     }
        
    if (
        (isset($options['delay']) AND !empty($options['delay']) AND ($delay = $options['delay']) !== false)
        OR (isset($options['d']) AND !empty($options['d']) AND ($delay = $options['d']) !== false)
    )
    {
        $delay = (int) $delay;
        if (!($delay < 0))
        {
            $defaults['scan_delay'] = $delay;
        }
    }
    if (isset($options['all']) OR isset($options['a']))
    {
        $defaults['scan_all_files'] = 1;
    }
    if (
        (isset($options['report']) AND ($report = $options['report']) !== false)
        OR (isset($options['r']) AND ($report = $options['r']) !== false)
    )
    {
        define('REPORT', $report);
    }
    defined('REPORT') OR define('REPORT', 'AI-BOLIT-REPORT-' . date('d-m-Y_H-i') . '-' . rand(1, 999999) . '.html');
    $last_arg = max(1, sizeof($_SERVER['argv']) - 1);
    if (isset($_SERVER['argv'][$last_arg]))
    {
        $path = $_SERVER['argv'][$last_arg];
        if (
            substr($path, 0, 1) != '-'
            AND (substr($_SERVER['argv'][$last_arg - 1], 0, 1) != '-' OR array_key_exists(substr($_SERVER['argv'][$last_arg - 1], -1), $cli_options)))
        {
            $defaults['path'] = $path;
        }
    }    
    
    if (
        (isset($options['path']) AND !empty($options['path']) AND ($path = $options['path']) !== false)
        OR (isset($options['p']) AND !empty($options['p']) AND ($path = $options['p']) !== false)
    )
    {
        $defaults['path'] = $path;
    }
}
if (!defined('PLAIN_FILE')) { define('PLAIN_FILE', ''); }
// Init
define('MAX_ALLOWED_PHP_HTML_IN_DIR', 100);
define('BASE64_LENGTH', 69);
define('MAX_PREVIEW_LEN', 80);
define('MAX_EXT_LINKS', 1001);
// Perform full scan when running from command line
if (isCli() || isset($_GET['full'])) {
  $defaults['scan_all_files'] = 1;
}
if ($l_FastCli) {
  $defaults['scan_all_files'] = 0; 
}
define('SCAN_ALL_FILES', (bool) $defaults['scan_all_files']);
define('SCAN_DELAY', (int) $defaults['scan_delay']);
define('MAX_SIZE_TO_SCAN', getBytes($defaults['max_size_to_scan']));
if ($defaults['memory_limit'] AND ($defaults['memory_limit'] = getBytes($defaults['memory_limit'])) > 0)
    ini_set('memory_limit', $defaults['memory_limit']);
define('START_TIME', microtime(true));
define('ROOT_PATH', realpath($defaults['path']));
if (!ROOT_PATH)
{
        if (isCli())  {
        die(stdOut("Directory '{$defaults['path']}' not found!"));
    }
}
elseif(!is_readable(ROOT_PATH))
{
        if (isCli())  {
        die(stdOut("Cannot read directory '" . ROOT_PATH . "'!"));
    }
}
define('CURRENT_DIR', getcwd());
chdir(ROOT_PATH);
// Проверяем отчет
if (isCli() AND REPORT !== '' AND !getEmails(REPORT))
{
    $report = str_replace('\', '/', REPORT);
    $abs = strpos($report, '/') === 0 ? DIR_SEPARATOR : '';
    $report = array_values(array_filter(explode('/', $report)));
    $report_file = array_pop($report);
    $report_path = realpath($abs . implode(DIR_SEPARATOR, $report));
    define('REPORT_FILE', $report_file);
    define('REPORT_PATH', $report_path);
    if (REPORT_FILE AND REPORT_PATH AND is_file(REPORT_PATH . DIR_SEPARATOR . REPORT_FILE))
    {
        @unlink(REPORT_PATH . DIR_SEPARATOR . REPORT_FILE);
    }
}
if (function_exists('phpinfo')) {
   ob_start();
   phpinfo();
   $l_PhpInfo = ob_get_contents();
   ob_end_clean();
   $l_PhpInfo = str_replace('border: 1px', '', $l_PhpInfo);
   preg_match('|<body>(.*)</body>|smi', $l_PhpInfo, $l_PhpInfoBody);
}
$l_Result =<<<MAIN_PAGE
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<META NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW">
<style type="text/css" title="currentStyle">
    @import "http://www.revisium.com/extra/media/css/demo_page.css";
    @import "http://www.revisium.com/extra/media/css/jquery.dataTables.css";
</style>
<script type="text/javascript" language="javascript" src="http://yandex.st/jquery/2.1.0/jquery.min.js"></script>
<script type="text/javascript" language="javascript" src="https://datatables.net/download/build/jquery.dataTables.js"></script>
<style type="text/css">
 body {
   font-family: Georgia;
   color: #303030;
   background: #FFFFF0;
   font-size: 12px;
   margin: 20px;
   padding: 0;
 }
.hidd {
display: none;
}
 h3 {
   font-size: 27px;
   margin: 0 0;
 }
 .sec {
  font-size: 25px;
  margin-bottom: 10px;
 }
 .warn {
   color: #FF4C00;
   margin: 0 0 20px 0;
 }
 .warn .it {
   color: #FF4C00;
 }
 .warn2 {
   color: #42ADFF;
   margin: 0 0 20px 0;
 }
 .warn2 .it {
   color: #42ADFF;
 }
 .ok {
   color: #007F0E;
   margin: 0 0 20px 0;
 }
 .vir {
    color: #A00000;
    margin: 0 0 20px 0;
  }
 .vir .it {
    color: #A00000;
 }
 .disclaimer {
   font-size: 11px;
   font-family: Arial;
   color: #505050;
   margin: 10px 0 10px 0;
 }
 .thanx {
  border: 1px solid #F0F0F0;
   padding: 20px 20px 10px 20px;
  font-size: 12px;
  font-family: Arial;
  background: #FBFFBA;
 }
 .footer {
  margin: 40px 0 0 0;
 }
 .rep {
   margin: 10px 0 20px 0;
   font-size: 11px;
   font-family: Arial;
 }
 .php_ok
 {
  color: #007F0E; 
 }
 .php_bad
 {
  color: #A00000; 
 }
 .notice
 {
  border: 1px solid cornflowerblue;
  padding: 10px;
  font-size: 12px;
  font-family: Arial;
  background: #E8F8F8;
 }
 .offer {
  -webkit-border-radius: 6px;
   -moz-border-radius: 6px;
   border-radius: 6px;
   position: absolute;
   width: 350px;
   right: 20px;
   top: 54px;
   background: #E06060;
   color: white;
   font-size: 11px;
   font-family: Arial;
   padding: 15px 20px 10px 20px;
 }
  .offer2 {
  -webkit-border-radius: 6px;
   -moz-border-radius: 6px;
   border-radius: 6px;
   position: absolute;
   width: 350px;
   right: 100px;
   top: 100px;
   background: #30A030;
   color: white;
   font-size: 11px;
   font-family: Arial;
   padding: 20px 20px 10px 20px;
 }
 
 .offer A, .offer2 A {
   color: yellow;
 }
 .update {
   color: red;
   font-size: 12px;
   font-family: Arial;
   margin: 0 0 20px 0;
 }
.updateinfo {
   color: blue;
   font-size: 12px;
   font-family: Arial;
   margin: 0 0 20px 0;
 }
 .tbg0 {
 }
 .tbg1 {
   background: #F0F0F0;
 }
 .it {
    font-size: 12px;
    font-family: Arial;
 }
 .ctd {
    font-size: 12px;
    font-family: Arial;
    color: #909090;
 }
 .flist {
   margin: 10px 0 30px 0;
 }
 .tbgh {
   background: #E0E0E0;
 }
 TH {
   text-align: left;
   font-size: 12px;
   font-family: Arial;
   color: #909090;
 }
 .details {
  font-size: 9px;
  font-family: Arial;
  color: #303030;
 }
 .marker
 {
    color: #FF0000;
    font-size: 16px;
    font-weight: 700;
 }
</style>
<script language="javascript">
  function addToIgnore(par_Lnk, par_FN, par_CRC) {
    var o = document.getElementById('igid');
    var ta = document.forms.ignore.list;
    
    ta.value = ta.value + par_FN + String.fromCharCode(09) + par_CRC + String.fromCharCode(10);
    
    par_Lnk.innerHTML = 'Добавлено'; 
    o.style.display = 'block';
  }
function hsig(id) {
  var divs = document.getElementsByTagName("tr");
  for(var i = 0; i < divs.length; i++){
     
     if (divs[i].getAttribute('o') == id) {
        divs[i].innerHTML = '';
     }
  }
  return false;
}
</script>
</head>
<body>
<noindex>
MAIN_PAGE;
////////////////////////////////////////////////////////////////////////////
$l_Result .= sprintf(AI_STR_001, AI_VERSION, INFO_M); 
$l_CreationTime = filemtime(__FILE__);
if (time() - $l_CreationTime > 86400 * 7) {
  $l_Result .= AI_STR_002;
}
$l_Result .= '<div class="update" style="margin: 20px 0 20px 0; padding: 20px; width: 500px; border: 1px solid #400000"><b>' . AI_STR_003 . '</b></div>';
if (AI_EXPERT == 0) {
   $l_Result .= '<div class="updateinfo">' . AI_STR_057 . '</div>'; 
} else {
   $l_Result .= '<div style="font-size: 8px; color: #909090; margin: 10px 0 10px 0;">MODE=' . AI_EXPERT . '</div>'; 
}
define('QCR_INDEX_FILENAME', 'fn');
define('QCR_INDEX_TYPE', 'type');
define('QCR_INDEX_WRITABLE', 'wr');
define('QCR_SVALUE_FILE', '1');
define('QCR_SVALUE_FOLDER', '0');
/**
 * Extract emails from the string
 * @param string $email
 * @return array of strings with emails or false on error
 */
function getEmails($email)
{
    $email = preg_split('#[,s;]#', $email, -1, PREG_SPLIT_NO_EMPTY);
    $r = array();
    for ($i = 0, $size = sizeof($email); $i < $size; $i++)
    {
            if (function_exists('filter_var')) {
              if (filter_var($email[$i], FILTER_VALIDATE_EMAIL))
              {
                  $r[] = $email[$i];
               }
                } else {
                   // for PHP4
                   if (strpos($email[$i], '@') !== false) {
                  $r[] = $email[$i];
                   }
                }
    }
    return empty($r) ? false : $r;
}
/**
 * Get bytes from shorthand byte values (1M, 1G...)
 * @param int|string $val
 * @return int
 */
function getBytes($val)
{
    $val = trim($val);
    $last = strtolower($val{strlen($val) - 1});
    switch($last) {
        case 't':
            $val *= 1024;
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }
    return intval($val);
}
/**
 * Format bytes to human readable
 * @param int $bites
 * @return string
 */
function bytes2Human($bites)
{
    if ($bites < 1024)
    {
        return $bites . ' b';
    }
    elseif (($kb = $bites / 1024) < 1024)
    {
        return number_format($kb, 2) . ' Kb';
    }
    elseif (($mb = $kb / 1024) < 1024)
    {
        return number_format($mb, 2) . ' Mb';
    }
    elseif (($gb = $mb / 1024) < 1024)
    {
        return number_format($gb, 2) . ' Gb';
    }
    else
    {
        return number_format($gb / 1024, 2) . 'Tb';
    }
}
///////////////////////////////////////////////////////////////////////////
function needIgnore($par_FN, $par_CRC) {
  global $g_IgnoreList;
  
  for ($i = 0; $i < count($g_IgnoreList); $i++) {
     if (strpos($par_FN, $g_IgnoreList[$i][0]) !== false) {
        if ($par_CRC == $g_IgnoreList[$i][1]) {
            return true;
        }
     }
  }
  
  return false;
}
///////////////////////////////////////////////////////////////////////////
function printList($par_List, $par_Details = null, $par_NeedIgnore = false, $par_SigId = null, $par_TableName = null) {
  global $g_Structure;
  
  if ($par_TableName == null) {
     $par_TableName = 'table_' . rand(1000000,9000000);
  }
  $l_Result = '';
  $l_Result .= "<div class="flist"><table cellspacing=1 cellpadding=4 border=0 id="" . $par_TableName . "">";
  $l_Result .= "<thead><tr class="tbgh" . ( $i % 2 ). "">";
  $l_Result .= "<th>" . AI_STR_004 . "</th>";
  $l_Result .= "<th>" . AI_STR_005 . "</th>";
  $l_Result .= "<th>" . AI_STR_006 . "</th>";
  $l_Result .= "<th width=90>" . AI_STR_007 . "</th>";
  $l_Result .= "<th width=90>CRC32</th>";
  $l_Result .= "<th width=0></th>";
  $l_Result .= "<th width=0></th>";
  $l_Result .= "<th width=0></th>";
  
  $l_Result .= "</tr></thead><tbody>";
  for ($i = 0; $i < count($par_List); $i++) {
    if ($par_SigId != null) {
       $l_SigId = 'id_' . $par_SigId[$i];
    } else {
       $l_SigId = 'id_z' . rand(1000000,9000000);
    }
    
    $l_Pos = $par_List[$i];
        if ($par_NeedIgnore) {
             if (needIgnore($g_Structure['n'][$par_List[$i]], $g_Structure['crc'][$l_Pos])) {
                 continue;
             }
        }
  
     $l_Creat = $g_Structure['c'][$l_Pos] > 0 ? date("d/m/Y H:i:s", $g_Structure['c'][$l_Pos]) : '-';
     $l_Modif = $g_Structure['m'][$l_Pos] > 0 ? date("d/m/Y H:i:s", $g_Structure['m'][$l_Pos]) : '-';
     $l_Size = $g_Structure['s'][$l_Pos] > 0 ? bytes2Human($g_Structure['s'][$l_Pos]) : '-';
     if ($par_Details != null) {
        $l_WithMarker = preg_replace('|@AI_MARKER@|smi', '<span class="marker">|</span>', $par_Details[$i]);
        $l_Body = '<div class="details">';
        if ($par_SigId != null) {
           $l_Body .= '<a href="#" onclick="return hsig('' . $l_SigId . '')">[x]</a> ';
        }
        $l_Body .= $l_WithMarker . '</div>';
     } else {
        $l_Body = '';
     }
     $l_Result .= '<tr class="tbg' . ( $i % 2 ). '" o="' . $l_SigId .'">';
     
     if (is_file($g_Structure['n'][$l_Pos])) {
        $l_Result .= '<td><div class="it"><a  class="it" target="_blank" href="'. $defaults['site_url'] . 'ai-bolit.php?fn=' .
                  $g_Structure['n'][$l_Pos] . '&ph=' . realCRC(PASS) . '&c=' . $g_Structure['crc'][$l_Pos] . '">' . $g_Structure['n'][$l_Pos] . '</a></div>' . $l_Body . '</td>';
     } else {
        $l_Result .= '<td><div class="it">' . $g_Structure['n'][$par_List[$i]] . '</div></td>';
     }
     
     $l_Result .= '<td><div class="ctd">' . $l_Creat . '</div></td>';
     $l_Result .= '<td><div class="ctd">' . $l_Modif . '</div></td>';
     $l_Result .= '<td><div class="ctd">' . $l_Size . '</div></td>';
     $l_Result .= '<td><div class="ctd"><a href="#" onclick="addToIgnore(this, '' . $g_Structure['n'][$l_Pos] . '','' . $g_Structure['crc'][$l_Pos] . '');return false;">' . $g_Structure['crc'][$l_Pos] . '</a></div></td>';
     $l_Result .= '<td class="hidd"><div class="hidd">' . $g_Structure['c'][$l_Pos] . '</div></td>';
     $l_Result .= '<td class="hidd"><div class="hidd">' . $g_Structure['m'][$l_Pos] . '</div></td>';
     $l_Result .= '<td class="hidd"><div class="hidd">' . $l_SigId . '</div></td>';
     $l_Result .= '</tr>';
  }
  $l_Result .= "</tbody></table></div>";
  return $l_Result;
}
///////////////////////////////////////////////////////////////////////////
function printPlainList($par_List, $par_Details = null, $par_NeedIgnore = false, $par_SigId = null, $par_TableName = null) {
  global $g_Structure;
  
//  $l_Result = "n#n";
  $l_Src = array('"', '<', '>', '&');
  $l_Dst = array('"',      '<',    '>',    '&');
  for ($i = 0; $i < count($par_List); $i++) {
    $l_Pos = $par_List[$i];
        if ($par_NeedIgnore) {
             if (needIgnore($g_Structure['n'][$par_List[$i]], $g_Structure['crc'][$l_Pos])) {
                 continue;
             }                      
        }
  
     if ($par_Details != null) {
        $l_Body = preg_replace('|(Ld+).+@AI_MARKER@|smi', '$1: ...', $par_Details[$i]);
        $l_Body = preg_replace('/[^x21-x7F]/', '.', $l_Body);
        $l_Body = str_replace($l_Src, $l_Dst, $l_Body);
     } else {
        $l_Body = '';
     }
     if (is_file($g_Structure['n'][$l_Pos])) {
        $l_Result .= $g_Structure['n'][$l_Pos] . "ttt" . $l_Body . "n";
     } else {
        $l_Result .= $g_Structure['n'][$par_List[$i]] . "n";
     }
     
  }
  return $l_Result;
}
///////////////////////////////////////////////////////////////////////////
function extractValue(&$par_Str, $par_Name) {
  if (preg_match('|<tr><td class="e">s*'.$par_Name.'s*</td><td class="v">(.+?)</td>|sm', $par_Str, $l_Result)) {
     return str_replace('no value', '', strip_tags($l_Result[1]));
  }
}
///////////////////////////////////////////////////////////////////////////
function QCR_ExtractInfo($par_Str) {
   $l_PhpInfoSystem = extractValue($par_Str, 'System');
   $l_PhpPHPAPI = extractValue($par_Str, 'Server API');
   $l_AllowUrlFOpen = extractValue($par_Str, 'allow_url_fopen');
   $l_AllowUrlInclude = extractValue($par_Str, 'allow_url_include');
   $l_DisabledFunction = extractValue($par_Str, 'disable_functions');
   $l_DisplayErrors = extractValue($par_Str, 'display_errors');
   $l_ErrorReporting = extractValue($par_Str, 'error_reporting');
   $l_ExposePHP = extractValue($par_Str, 'expose_php');
   $l_LogErrors = extractValue($par_Str, 'log_errors');
   $l_MQGPC = extractValue($par_Str, 'magic_quotes_gpc');
   $l_MQRT = extractValue($par_Str, 'magic_quotes_runtime');
   $l_OpenBaseDir = extractValue($par_Str, 'open_basedir');
   $l_RegisterGlobals = extractValue($par_Str, 'register_globals');
   $l_SafeMode = extractValue($par_Str, 'safe_mode');
   $l_DisabledFunction = ($l_DisabledFunction == '' ? '-?-' : $l_DisabledFunction);
   $l_OpenBaseDir = ($l_OpenBaseDir == '' ? '-?-' : $l_OpenBaseDir);
   $l_Result = '<div class="sec">' . AI_STR_008 . ': ' . phpversion() . '</div>';
   $l_Result .= 'System Version: <span class="php_ok">' . $l_PhpInfoSystem . '</span><br/>';
   $l_Result .= 'PHP API: <span class="php_ok">' . $l_PhpPHPAPI. '</span><br/>';
   $l_Result .= 'allow_url_fopen: <span class="php_' . ($l_AllowUrlFOpen == 'On' ? 'bad' : 'ok') . '">' . $l_AllowUrlFOpen. '</span><br/>';
   $l_Result .= 'allow_url_include: <span class="php_' . ($l_AllowUrlInclude == 'On' ? 'bad' : 'ok') . '">' . $l_AllowUrlInclude. '</span><br/>';
   $l_Result .= 'disable_functions: <span class="php_' . ($l_DisabledFunction == '-?-' ? 'bad' : 'ok') . '">' . $l_DisabledFunction. '</span><br/>';
   $l_Result .= 'display_errors: <span class="php_' . ($l_DisplayErrors == 'On' ? 'ok' : 'bad') . '">' . $l_DisplayErrors. '</span><br/>';
   $l_Result .= 'error_reporting: <span class="php_ok">' . $l_ErrorReporting. '</span><br/>';
   $l_Result .= 'expose_php: <span class="php_' . ($l_ExposePHP == 'On' ? 'bad' : 'ok') . '">' . $l_ExposePHP. '</span><br/>';
   $l_Result .= 'log_errors: <span class="php_' . ($l_LogErrors == 'On' ? 'ok' : 'bad') . '">' . $l_LogErrors . '</span><br/>';
   $l_Result .= 'magic_quotes_gpc: <span class="php_' . ($l_MQGPC == 'On' ? 'ok' : 'bad') . '">' . $l_MQGPC. '</span><br/>';
   $l_Result .= 'magic_quotes_runtime: <span class="php_' . ($l_MQRT == 'On' ? 'bad' : 'ok') . '">' . $l_MQRT. '</span><br/>';
   $l_Result .= 'register_globals: <span class="php_' . ($l_RegisterGlobals == 'On' ? 'bad' : 'ok') . '">' . $l_RegisterGlobals . '</span><br/>';
   $l_Result .= 'open_basedir: <span class="php_' . ($l_OpenBaseDir == '-?-' ? 'bad' : 'ok') . '">' . $l_OpenBaseDir . '</span><br/>';
   
   if (phpversion() < '5.3.0') {
      $l_Result .= 'safe_mode (PHP < 5.3.0): <span class="php_' . ($l_SafeMode == 'On' ? 'ok' : 'bad') . '">' . $l_SafeMode. '</span><br/>';
   }
   return $l_Result . '<p>';
}
///////////////////////////////////////////////////////////////////////////
function QCR_Debug($par_Str) {
  if (!DEBUG_MODE) {
     return;
  }
  $l_MemInfo = ' ';  
  if (function_exists('memory_get_usage')) {
     $l_MemInfo .= ' curmem=' .  bytes2Human(memory_get_usage());
  }
  if (function_exists('memory_get_peak_usage')) {
     $l_MemInfo .= ' maxmem=' .  bytes2Human(memory_get_peak_usage());
  }
  stdOut("n" . date('H:i:s') . ': ' . $par_Str . $l_MemInfo . "n");
}
///////////////////////////////////////////////////////////////////////////
function QCR_ScanDirectories($l_RootDir)
{
    global $g_Structure, $g_Counter, $g_Doorway, $g_FoundTotalFiles, $g_FoundTotalDirs, 
            $defaults, $g_SkippedFolders, $g_UrlIgnoreList, $g_DirIgnoreList, $g_UnsafeFilesArray, $g_UnsafeDirArray, 
                        $g_UnsafeFilesFound, $g_SymLinks, $g_HiddenFiles;
    $l_DirCounter = 0;
    $l_DoorwayFilesCounter = 0;
    $l_SourceDirIndex = $g_Counter - 1;
    QCR_Debug('Scan ' . $l_RootDir);
        $l_QuotedSeparator = quotemeta(DIR_SEPARATOR); 
        $l_NeedCheckCandi = ($defaults['report_mask'] & REPORT_MASK_CANDI) == REPORT_MASK_CANDI;
    if ($l_DIRH = @opendir($l_RootDir))
    {
        while (($l_FileName = readdir($l_DIRH)) !== false)
        {
            if ($l_FileName == '.' || $l_FileName == '..') continue;
                        if (is_link($l_FileName)) 
                        {
                            $g_SymLinks[] = $l_FileName;
                            continue;
                        }
            $l_FileName = $l_RootDir . DIR_SEPARATOR . $l_FileName;
            $l_Ext = substr($l_FileName, strrpos($l_FileName, '.') + 1);
            $l_IsDir = is_dir($l_FileName);
            // which files should be scanned
            $l_NeedToScan = SCAN_ALL_FILES || (in_array($l_Ext, array(
                'js', 'php', 'php3', 'phtml', 'shtml', 'khtml',
                'php4', 'php5', 'tpl', 'inc', 'htaccess', 'html', 'htm'
            )));
            if (strpos(basename($l_FileName), '.') === 0) {
                            $g_HiddenFiles[] = $l_FileName;
                        }
            if ($l_IsDir)
            {
                // if folder in ignore list
                $l_Skip = false;
                for ($dr = 0; $dr < count($g_DirIgnoreList); $dr++) {
                    if (($g_DirIgnoreList[$dr] != '') &&
                        preg_match('#' . $g_DirIgnoreList[$dr] . '#', $l_FileName, $l_Found)) {
                        $l_Skip = true;
                    }
                }
            
                // skip on ignore
                if ($l_Skip) {
                    $g_SkippedFolders[] = $l_FileName;
                    continue;
                }
                
                $g_Structure['d'][$g_Counter] = $l_IsDir;
                $g_Structure['n'][$g_Counter] = $l_FileName;
                $l_DirCounter++;
                                if ($l_NeedCheckCandi) {
                         for ($j = 0; $j < count($g_UnsafeDirArray); $j++) {
                             if (preg_match('|' . $l_QuotedSeparator . $g_UnsafeDirArray[$j] . '$|i', $l_FileName, $l_Found)) {
                                                $g_UnsafeFilesFound[] = $g_Counter;
                                                break;
                                             }
                         }
                     }
                if ($l_DirCounter > MAX_ALLOWED_PHP_HTML_IN_DIR)
                {
                    $g_Doorway[] = $l_SourceDirIndex;
                    $l_DirCounter = -655360;
                }
                $g_Counter++;
                $g_FoundTotalDirs++;
                QCR_ScanDirectories($l_FileName);
            } else
            {
                if ($l_NeedToScan)
                {
                    $g_FoundTotalFiles++;
                    if (in_array($l_Ext, array(
                        'php', 'php3',
                        'php4', 'php5', 'html', 'htm', 'phtml', 'shtml', 'khtml'
                    ))
                    )
                    {
                        $l_DoorwayFilesCounter++;
                        
                        if ($l_DoorwayFilesCounter > MAX_ALLOWED_PHP_HTML_IN_DIR)
                        {
                            $g_Doorway[] = $l_SourceDirIndex;
                            $l_DoorwayFilesCounter = -655360;
                        }
                    }
                    $l_Stat = stat($l_FileName);
                    $g_Structure['d'][$g_Counter] = $l_IsDir;
                    $g_Structure['n'][$g_Counter] = $l_FileName;
                    $g_Structure['s'][$g_Counter] = $l_Stat['size'];
                    $g_Structure['c'][$g_Counter] = $l_Stat['ctime'];
                    $g_Structure['m'][$g_Counter] = $l_Stat['mtime'];
                                        if ($l_NeedCheckCandi) {
                              for ($j = 0; $j < count($g_UnsafeFilesArray); $j++) {
                                 if (preg_match('|' . $l_QuotedSeparator . $g_UnsafeFilesArray[$j] . '|i', $l_FileName, $l_Found)) {
                                                        $g_UnsafeFilesFound[] = $g_Counter;
                                                        break;
                                                     }
                             }
                         }
                    $g_Counter++;
                }
            }
        }
        closedir($l_DIRH);
    }
    return $g_Structure;
}
///////////////////////////////////////////////////////////////////////////
function QCR_ScanFile($l_TheFile)
{
    global $g_Structure, $g_Counter, $g_Doorway, $g_FoundTotalFiles, $g_FoundTotalDirs, 
            $defaults, $g_SkippedFolders, $g_UrlIgnoreList, $g_DirIgnoreList, $g_UnsafeFilesArray, $g_UnsafeDirArray, 
                        $g_UnsafeFilesFound, $g_SymLinks, $g_HiddenFiles;
    QCR_Debug('Scan file ' . $l_TheFile);
          $l_Stat = stat($l_TheFile);
          $g_Structure['d'][$g_Counter] = false;
          $g_Structure['n'][$g_Counter] = $l_TheFile;
          $g_Structure['s'][$g_Counter] = $l_Stat['size'];
          $g_Structure['c'][$g_Counter] = $l_Stat['ctime'];
          $g_Structure['m'][$g_Counter] = $l_Stat['mtime'];
          $g_Counter++;
    return $g_Structure;
}
///////////////////////////////////////////////////////////////////////////
function getFragment($par_Content, $par_Pos) {
  $l_MaxChars = MAX_PREVIEW_LEN;
  $l_MaxLen = strlen($par_Content);
  $l_RightPos = min($par_Pos + $l_MaxChars, $l_MaxLen); 
  $l_MinPos = max(0, $par_Pos - $l_MaxChars);
  $l_FoundStart = substr($par_Content, 0, $par_Pos);
  $l_FoundStart = str_replace("r", '', $l_FoundStart);
  $l_LineNo = strlen($l_FoundStart) - strlen(str_replace("n", '', $l_FoundStart)) + 1;
  $l_Res = 'L' . $l_LineNo . "  " . ($l_MinPos > 0 ? '...' : '') . substr($par_Content, $l_MinPos, $par_Pos - $l_MinPos) . 
           '@AI_MARKER@' . 
           substr($par_Content, $par_Pos, $l_RightPos - $par_Pos - 1);
  return htmlspecialchars($l_Res);
}
///////////////////////////////////////////////////////////////////////////
function _utf8_decode($string)
{
  $tmp = $string;
  $count = 0;
  while (detect_utf_encoding($tmp) !== false )
  {
    $tmp = utf8_decode($tmp);
    $count++;
  }
  
  for ($i = 0; $i < $count-1 ; $i++)
  {
    $string = utf8_decode($string);
    
  }
  return $string;
 
}
///////////////////////////////////////////////////////////////////////////
function escapedHexToHex($escaped)
{ $GLOBALS['g_EncObfu']++; return chr(hexdec($escaped[1])); }
function escapedOctDec($escaped)
{ $GLOBALS['g_EncObfu']++; return chr(octdec($escaped[1])); }
function escapedDec($escaped)
{ $GLOBALS['g_EncObfu']++; return chr($escaped[1]); }
///////////////////////////////////////////////////////////////////////////
if (!defined('T_ML_COMMENT')) {
   define('T_ML_COMMENT', T_COMMENT);
} else {
   define('T_DOC_COMMENT', T_ML_COMMENT);
}
function UnwrapObfu($par_Content) {
  $GLOBALS['g_EncObfu'] = 0;
  $par_Content = preg_replace_callback('/\\x([a-fA-F0-9]{1,2})/i','escapedHexToHex', $par_Content);
  $par_Content = preg_replace_callback('/\\([0-9]{1,3})/i','escapedOctDec', $par_Content);
//  $par_Content = preg_replace_callback('/\\([0-9]{2})/i','escapedDec', $par_Content);
  $par_Content = preg_replace('/['"]s*?.s*?['"]/smi', '', $par_Content);
  return $par_Content;
}
///////////////////////////////////////////////////////////////////////////
// Unicode BOM is U+FEFF, but after encoded, it will look like this.
define ('UTF32_BIG_ENDIAN_BOM'   , chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
define ('UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
define ('UTF16_BIG_ENDIAN_BOM'   , chr(0xFE) . chr(0xFF));
define ('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
define ('UTF8_BOM'               , chr(0xEF) . chr(0xBB) . chr(0xBF));
function detect_utf_encoding($text) {
    $first2 = substr($text, 0, 2);
    $first3 = substr($text, 0, 3);
    $first4 = substr($text, 0, 3);
    
    if ($first3 == UTF8_BOM) return 'UTF-8';
    elseif ($first4 == UTF32_BIG_ENDIAN_BOM) return 'UTF-32BE';
    elseif ($first4 == UTF32_LITTLE_ENDIAN_BOM) return 'UTF-32LE';
    elseif ($first2 == UTF16_BIG_ENDIAN_BOM) return 'UTF-16BE';
    elseif ($first2 == UTF16_LITTLE_ENDIAN_BOM) return 'UTF-16LE';
    return false;
}
///////////////////////////////////////////////////////////////////////////
function QCR_SearchPHP($src)
{
  if (preg_match("/(<?php[ws]{5,})/smi", $src, $l_Found, PREG_OFFSET_CAPTURE)) {
      return $l_Found[0][1];
  }
  if (preg_match("/(<script[^>]*languages*=s*)('|"|)php('|"|)([^>]*>)/i", $src, $l_Found, PREG_OFFSET_CAPTURE)) {
    return $l_Found[0][1];
  }
  return false;
}
///////////////////////////////////////////////////////////////////////////
function knowUrl($par_URL) {
  global $g_UrlIgnoreList;
  for ($jk = 0; $jk < count($g_UrlIgnoreList); $jk++) {
     if  ((stripos($par_URL, $g_UrlIgnoreList[$jk]) !== false)) {
         return true;
     }
  }
  return false;
}
///////////////////////////////////////////////////////////////////////////
function QCR_GoScan($par_Offset)
{
    global $g_IframerFragment, $g_Iframer, $g_SuspDir, $g_Redirect, $g_Doorway, $g_EmptyLink, $g_Structure, $g_Counter, 
           $g_WritableDirectories, $g_HeuristicType, $g_HeuristicDetected, $g_TotalFolder, $g_TotalFiles, $g_WarningPHP, $g_AdwareList,
           $g_CriticalPHP, $g_Phishing, $g_CriticalJS, $g_UrlIgnoreList, $g_CriticalJSFragment, $g_PHPCodeInside, $g_PHPCodeInsideFragment, 
           $g_NotRead, $g_WarningPHPFragment, $g_WarningPHPSig, $g_BigFiles, $g_RedirectPHPFragment, $g_EmptyLinkSrc, $g_CriticalPHPSig, $g_CriticalPHPFragment, 
           $g_Base64Fragment, $g_UnixExec, $g_PhishingSigFragment, $g_PhishingFragment, $g_PhishingSig, $g_CriticalJSSig, $g_IframerFragment, $g_CMS, $defaults, $g_AdwareListFragment, $g_KnownList;
    static $_files_and_ignored = 0;
        QCR_Debug('QCR_GoScan ' . $par_Offset);
    for ($i = $par_Offset; $i < $g_Counter; $i++)
    {
        $l_Filename = $g_Structure['n'][$i];
             QCR_Debug('Check ' . $l_Filename);
        if ($g_Structure['d'][$i])
        {
            // FOLDER
            $g_TotalFolder++;
            if (is_writable($l_Filename))
            {
                $g_WritableDirectories[] = $i;
            }
        }
        else
        {
            // FILE
            if ((MAX_SIZE_TO_SCAN > 0 AND $g_Structure['s'][$i] > MAX_SIZE_TO_SCAN) || ($g_Structure['s'][$i] < 0))
            {
                $g_BigFiles[] = $i;
            }
            else
            {
                $g_TotalFiles++;
                $l_Content = @implode('', file($l_Filename));
                if (($l_Content == '') && ($g_Structure['s'][$i] > 0)) {
                   $g_NotRead[] = $i;
                }
                $g_Structure['crc'][$i] = realCRC($l_Content);
                                $l_KnownCRC = $g_Structure['crc'][$i] + realCRC(basename($l_Filename));
                                if (in_array($l_KnownCRC, $g_KnownList)) {
                       printProgress(++$_files_and_ignored, $l_Filename);
                                   continue;
                                }
                $l_Unwrapped = UnwrapObfu($l_Content);
                if (detect_utf_encoding($l_Content) !== false) {
                          if (function_exists('mb_convert_encoding')) {
                                      $l_Unwrapped = mb_convert_encoding($l_Unwrapped, "CP1251");
                                   } else {
                                      $g_NotRead[] = $i;
                   }
                                }
                          
                // ignore itself
                if (strpos($l_Content, 'OI87547623YUIOIUYIOYHJW') !== false) {
                    continue;
                }
                // warnings
                $l_Pos = '';
                if (WarningPHP($l_Filename, $l_Unwrapped, $l_Pos, $l_SigId))
                {       $l_Prio = 1;
                        if (strpos($l_Filename, '.php') !== false) {
                              $l_Prio = 0;
                    }
                    $g_WarningPHP[$l_Prio][] = $i;
                    $g_WarningPHPFragment[$l_Prio][] = getFragment($l_Content, $l_Pos);
                    $g_WarningPHPSig[] = $l_SigId;
                }
                // adware
                if (Adware($l_Filename, $l_Unwrapped, $l_Pos))
                {
                    $g_AdwareList[] = $i;
                    $g_AdwareListFragment[] = getFragment($l_Unwrapped, $l_Pos);
                }
                // critical
                $g_SkipNextCheck = false;
                if (CriticalPHP($l_Filename, $i, $l_Unwrapped, $l_Pos, $l_SigId))
                {
                    $g_CriticalPHP[] = $i;
                    $g_CriticalPHPFragment[] = getFragment($l_Unwrapped, $l_Pos);
                    $g_CriticalPHPSig[] = $l_SigId;
                    $g_SkipNextCheck = true;
                } else {
                         if (CriticalPHP($l_Filename, $i, $l_Content, $l_Pos, $l_SigId))
                         {
                             $g_CriticalPHP[] = $i;
                             $g_CriticalPHPFragment[] = getFragment($l_Content, $l_Pos);
                        $g_CriticalPHPSig[] = $l_SigId;
                             $g_SkipNextCheck = true;
                         }
                }
                
                // critical without comments
                $l_NoComments = preg_replace('|/*.*?*/|smiu', '', $l_Unwrapped);
                if ($l_NoComments == $l_Unwrapped) {
                                   $g_SkipNextCheck = true;
                                }
                     
                if ((!$g_SkipNextCheck) && CriticalPHP($l_Filename, $i, $l_NoComments, $l_Pos, $l_SigId))
                {
                    $g_CriticalPHP[] = $i;
                    $g_CriticalPHPFragment[] = getFragment($l_Unwrapped, $l_Pos);
                    $g_CriticalPHPSig[] = $l_SigId;
                }            
                $l_TypeDe = 0;
                if (ai_check_extra_obfus($l_Content, $l_TypeDe)) {
                    $g_HeuristicDetected[] = $i;
                    $g_HeuristicType[] = $l_TypeDe;
                }
                // critical JS
                $l_Pos = CriticalJS($l_Filename, $i, $l_Unwrapped, $l_SigId);
                if ($l_Pos !== false)
                {
                    $g_CriticalJS[] = $i;
                    $g_CriticalJSFragment[] = getFragment($l_Unwrapped, $l_Pos);
                    $g_CriticalJSSig[] = $l_SigId;
                }
                // phishing
                $l_Pos = Phishing($l_Filename, $i, $l_Unwrapped, $l_SigId);
                if ($l_Pos !== false)
                {
                    $g_Phishing[] = $i;
                    $g_PhishingFragment[] = getFragment($l_Unwrapped, $l_Pos);
                    $g_PhishingSigFragment[] = $l_SigId;
                }
                if
                (stripos($l_Filename, 'index.php') ||
                    stripos($l_Filename, 'index.htm') ||
                    SCAN_ALL_FILES
                )
                {
                    // check iframes
                    if (preg_match_all('|<iframe[^>]+src.+?>|smi', $l_Unwrapped, $l_Found, PREG_SET_ORDER)) 
                    {
                        for ($kk = 0; $kk < count($l_Found); $kk++) {
                                $l_Pos = stripos($l_Found[$kk][0], 'http://');
                            if  (($l_Pos !== false) && (!knowUrl($l_Found[$kk][0]))) {
                                     $g_Iframer[] = $i;
                                     $g_IframerFragment[] = getFragment($l_Found[$kk][0], $l_Pos);
                            }
                        }
                    }
                    // check empty links
                    if (preg_match_all('|<a[^>]+href([^>]+?)>(.*?)</a>|smi', $l_Unwrapped, $l_Found, PREG_SET_ORDER))
                    {
                        for ($kk = 0; $kk < count($l_Found); $kk++) {
                            if  ((stripos($l_Found[$kk][1], 'http://') !== false) &&
                                                            (trim(strip_tags($l_Found[$kk][2])) == '')) {
                                $l_NeedToAdd = true;
                                if  ((stripos($l_Found[$kk][1], $default['site_url']) !== false)
                                                                 || knowUrl($l_Found[$kk][1])) {
                                        $l_NeedToAdd = false;
                                }
                                
                                if ($l_NeedToAdd && (count($g_EmptyLink) < MAX_EXT_LINKS)) {
                                    $g_EmptyLink[] = $i;
                                    $g_EmptyLinkSrc[$i][] = substr($l_Found[$kk][0], 0, MAX_PREVIEW_LEN);
                                }
                            }
                        }
                    }
                }
                // check for PHP code inside any type of file
                if ((stripos($l_Filename, '.php') === false) && 
                    (stripos($l_Filename, '.phtml') === false))
                {
                    $l_Pos = QCR_SearchPHP($l_Content);
                    if ($l_Pos !== false)
                    {
                        $g_PHPCodeInside[] = $i;
                        $g_PHPCodeInsideFragment[] = getFragment($l_Unwrapped, $l_Pos);
                    }
                }
                // articles
                if (stripos($l_Filename, 'article_index'))
                {
                    $g_AdwareSig[] = $i;
                }
                // unix executables
                if (strpos($l_Content, chr(127) . 'ELF') !== false) 
                {
                    $g_UnixExec[] = $i;
                }
                
                // htaccess
                if (stripos($l_Filename, '.htaccess'))
                {
                
                if (stripos($l_Content, 'index.php?name=$1') !== false ||
                        stripos($l_Content, 'index.php?m=1') !== false
                    )
                    {
                        $g_SuspDir[] = $i;
                    }
                    $l_Pos = stripos($l_Content, '^(%2d|-)[^=]+$');
                    if ($l_Pos !== false)
                    {
                        $g_Redirect[] = $i;
                        $g_RedirectPHPFragment[] = getFragment($l_Content, $l_Pos);
                    }
                    $l_Pos = stripos($l_Content, '%{HTTP_USER_AGENT}');
                    if ($l_Pos !== false)
                    {
                        $g_Redirect[] = $i;
                        $g_RedirectPHPFragment[] = getFragment($l_Content, $l_Pos);
                    }
                    if (
                        preg_match_all('|(RewriteConds+%{HTTP_HOST}/%1 !^[w.]*([^/]+)/\1$s+[NC])|smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)
                       )
                    {
                        $g_Redirect[] = $i;
                                    $g_RedirectPHPFragment[] = getFragment($l_Content, $l_Found[0][1]);
                    }
//
                    $l_HTAContent = preg_replace('|^s*#.+$|m', '', $l_Content);
                    if (
                        preg_match_all("|RewriteRules+.+?s+http://(.+?)/.+s+[.*R=d+.*]|smi", $l_HTAContent, $l_Found, PREG_SET_ORDER)
                    )
                    {
                        $l_Host = str_replace('www.', '', $_SERVER['HTTP_HOST']);
                        for ($j = 0; $j < sizeof($l_Found); $j++)
                        {
                            $l_Found[$j][1] = str_replace('www.', '', $l_Found[$j][1]);
                            if ($l_Found[$j][1] != $l_Host)
                            {
                                $g_Redirect[] = $i;
                                break;
                            }
                        }
                    }
                    unset($l_HTAContent);
                    
                    $l_Pos = stripos($l_Content, 'auto_prepend_file');
                    if ($l_Pos !== false) {
                        $g_Redirect[] = $i;
                        $g_RedirectPHPFragment[] = getFragment($l_Content, $l_Pos);
                    }
                    $l_Pos = stripos($l_Content, 'auto_append_file');
                    if ($l_Pos !== false) {
                        $g_Redirect[] = $i;
                        $g_RedirectPHPFragment[] = getFragment($l_Content, $l_Pos);
                    }
                    if (preg_match("|RewriteRules+^(.*)$s+-s+[s*Fs*,s*Ls*]|smi", $l_Content, $l_Found)) {
                        $g_Redirect[] = $i;
                    }
                }
            }
            
            unset($l_Unwrapped);
            unset($l_Content);
            
            printProgress(++$_files_and_ignored, $l_Filename);
        } // end of if (file)
        usleep(SCAN_DELAY * 1000);
    } // end of for
}
///////////////////////////////////////////////////////////////////////////
function WarningPHP($l_FN, $l_Content, &$l_Pos, &$l_SigId)
{
  global $g_SusDB;
  $l_Res = false;
  foreach ($g_SusDB as $l_Item) {
    if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
       if (!CheckException($l_Content, $l_Found)) {
           $l_Pos = $l_Found[0][1];
           $l_SigId = myCheckSum($l_Item);
           return true;
       }
    }
  }
  return $l_Res;
}
///////////////////////////////////////////////////////////////////////////
function Adware($l_FN, $l_Content, &$l_Pos)
{
  global $g_AdwareSig;
  $l_Res = false;
  foreach ($g_AdwareSig as $l_Item) {
    if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
       if (!CheckException($l_Content, $l_Found)) {
           $l_Pos = $l_Found[0][1];
           return true;
       }
    }
  }
  return $l_Res;
}
///////////////////////////////////////////////////////////////////////////
function CheckException(&$l_Content, &$l_Found) {
  global $g_ExceptFlex, $gX_FlexDBShe, $gXX_FlexDBShe, $g_FlexDBShe, $gX_DBShe, $g_DBShe, $g_Base64, $g_Base64Fragment;
   $l_FoundStrPlus = substr($l_Content, max($l_Found[0][1] - 10, 0), 70);
   foreach ($g_ExceptFlex as $l_ExceptItem) {
      if (preg_match('#(' . $l_ExceptItem . ')#smi', $l_FoundStrPlus, $l_Detected)) {
         $l_Exception = true;
         return true;
      }
   }
   return false;
}
///////////////////////////////////////////////////////////////////////////
function Phishing($l_FN, $l_Index, $l_Content, &$l_SigId)
{
  global $g_PhishingSig;
  $l_Res = false;
  foreach ($g_PhishingSig as $l_Item) {
    if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
       if (!CheckException($l_Content, $l_Found)) {
           $l_Pos = $l_Found[0][1];
           $l_SigId = myCheckSum($l_Item);
           if (DEBUG_MODE) {
              echo "Phis: $l_FN matched [$l_Item] in $l_Posn";
           }
           return $l_Pos;
       }
    }
  }
  return $l_Res;
}
///////////////////////////////////////////////////////////////////////////
function CriticalJS($l_FN, $l_Index, $l_Content, &$l_SigId)
{
  global $g_JSVirSig, $gX_JSVirSig;
  $l_Res = false;
  foreach ($g_JSVirSig as $l_Item) {
    if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
       if (!CheckException($l_Content, $l_Found)) {
           $l_Pos = $l_Found[0][1];
           $l_SigId = myCheckSum($l_Item);
           if (DEBUG_MODE) {
              echo "JS: $l_FN matched [$l_Item] in $l_Posn";
           }
           return $l_Pos;
       }
    }
  }
if (AI_EXPERT > 1) {
  foreach ($gX_JSVirSig as $l_Item) {
    if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
       if (!CheckException($l_Content, $l_Found)) {
           $l_Pos = $l_Found[0][1];
           $l_SigId = myCheckSum($l_Item);
           if (DEBUG_MODE) {
              echo "JS PARA: $l_FN matched [$l_Item] in $l_Posn";
           }
           return $l_Pos;
       }
    }
  }
}
  return $l_Res;
}
///////////////////////////////////////////////////////////////////////////
  function get_descr_heur($type) {
     $msg = '';
     switch ($type) {
        case 1: $msg = AI_STR_053;
                break;
        case 2: $msg = AI_STR_054;
                break;
        case 3: $msg = AI_STR_055;
                break;
        case 4: $msg = AI_STR_056;
                break;
     }
     
     return $msg;
  }
  function ai_check_extra_obfus($content, &$type) {
     $res = false;
     // 1
     if (preg_match_all('|($[a-zA-Z0-9_]{3,}[[d+]]s*(s*$)|smiu', $content, $found, PREG_SET_ORDER)) {
        $ref_calls = count($found);
     }
     // 2
     if (preg_match_all('|$([a-zA-Z0-9_]{3,}?)s*[;=(]|smi', $content, $found, PREG_SET_ORDER)) {
       $obf_var1 = 0;
       $obf_var2 = 0;
       $arr = array();
       foreach ($found as $item) {
         $arr[$item[1]] = 1;
       }                          
       $found = array_keys($arr);
       foreach ($found as $item) {
          if (preg_match('|([a-zA-Z]{2,}[0-9]+[a-zA-Z]+){1,}|', $item, $found_ob)) {
             $obf_var1++;
          }
          if (!preg_match('|([aeiouy_])|i', $item, $found_ob) && (strlen($item) > 4)) {
             $obf_var2++;
          }
          if (preg_match('|([0-9bcdfghjklmnpqrstvwxz]{6,})|i', $item, $found_ob) && (strlen($item) > 3)) {
             $obf_var3++;
          }
       }
     }
     // 3
     if (preg_match_all('|($GLOBALS['[a-z_0-9]+'][d+]()|smiu', $content, $found, PREG_SET_ORDER)) {
        $ref_glob = count($found);
     }
     // 4
//     if (preg_match_all('|(["'].+?["']s*.s*){10,}|smiu', $content, $found, PREG_SET_ORDER)) {
//        $type = 4;
//        return true;
//     }
     
     /////////////////////////////////////
     if ($ref_calls > 10) {
        $type = 1;
        return true;
     }
     if ($ref_glob > 10) {
        $type = 2;
        return true;
     }
     
     if ($obf_var1 + $obf_var2 + $obf_var3 >= 3) {
        $type = 3;
        return true;
     }
 
     return false;
  }
///////////////////////////////////////////////////////////////////////////
function CriticalPHP($l_FN, $l_Index, $l_Content, &$l_Pos, &$l_SigId)
{
  global $g_ExceptFlex, $gXX_FlexDBShe, $gX_FlexDBShe, $g_FlexDBShe, $gX_DBShe, $g_DBShe, $g_Base64, $g_Base64Fragment;
  // OI87547623YUIOIUYIOYHJW
  foreach ($g_FlexDBShe as $l_Item) {
    if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
       if (!CheckException($l_Content, $l_Found)) {
           $l_Pos = $l_Found[0][1];
           $l_SigId = myCheckSum($l_Item);
           if (DEBUG_MODE) {
              echo "CRIT 1: $l_FN matched [$l_Item] in $l_Posn";
           }
           return true;
       }
    }
  }
if (AI_EXPERT > 1) {
  foreach ($gXX_FlexDBShe as $l_Item) {
    if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
       if (!CheckException($l_Content, $l_Found)) {
           $l_Pos = $l_Found[0][1];
           $l_SigId = myCheckSum($l_Item);
           if (DEBUG_MODE) {
              echo "CRIT 2: $l_FN matched [$l_Item] in $l_Posn";
           }
           return true;
       }
    }
  }
}
if (AI_EXPERT > 0) {
  foreach ($gX_FlexDBShe as $l_Item) {
    if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
       if (!CheckException($l_Content, $l_Found)) {
           $l_Pos = $l_Found[0][1];
           $l_SigId = myCheckSum($l_Item);
           if (DEBUG_MODE) {
              echo "CRIT 3: $l_FN matched [$l_Item] in $l_Posn";
           }
           return true;
       }
    }
  }
}
  foreach ($g_DBShe as $l_Item) {
    $l_Pos = stripos($l_Content, $l_Item);
    if ($l_Pos !== false) {
       $l_SigId = myCheckSum($l_Item);
       if (DEBUG_MODE) {
          echo "CRIT 4: $l_FN matched [$l_Item] in $l_Posn";
       }
       return true;
    }
  }
if (AI_EXPERT) {
  foreach ($gX_DBShe as $l_Item) {
    $l_Pos = stripos($l_Content, $l_Item);
    if ($l_Pos !== false) {
       $l_SigId = myCheckSum($l_Item);
       if (DEBUG_MODE) {
          echo "CRIT 5: $l_FN matched [$l_Item] in $l_Posn";
       }
       return true;
    }
  }
  if ((strpos($l_FN, '.ph') !== false) && (AI_EXPERT > 1)) {
     // for php only
     $g_Specials = array(');#');
     foreach ($g_Specials as $l_Item) {
       $l_Pos = stripos($l_Content, $l_Item);
       if ($l_Pos !== false) {
          $l_SigId = myCheckSum($l_Item);
          return true;
       }
     }
  }
}
  if ((strpos($l_Content, 'GIF89') === 0) && (strpos($l_FN, '.php') !== false )) {
     $l_Pos = 0;
     if (DEBUG_MODE) {
          echo "CRIT 6: $l_FN matched [$l_Item] in $l_Posn";
     }
     return true;
  }
  if (strpos($l_FN, '.php.') !== false ) {
     $g_Base64[] = $l_Index;
     $g_Base64Fragment[] = '".php."';
     $l_Pos = 0;
     if (DEBUG_MODE) {
          echo "CRIT 7: $l_FN matched [$l_Item] in $l_Posn";
     }
     return false;
  }
  if (preg_match('#((include|require|require_once|include_once)s*(*s*["']http://.+?["'])#smi', $l_Content, $l_Found)) {
     $g_Base64[] = $l_Index;
     $g_Base64Fragment[] = substr($l_Found[1], 0, MAX_PREVIEW_LEN);
     if (DEBUG_MODE) {
          echo "CRIT 8: $l_FN matchedn";
     }
  }
  // detect base64 suspicious
  if (preg_match('|([A-Za-z0-9+/]{' . BASE64_LENGTH . ',})|smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
     if (preg_match('#base64_decodes*(#smi', 
                 $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
        if ((!CheckException($l_Content, $l_Found)) && (!in_array($l_Index, $g_Base64))) {
        $g_Base64[] = $l_Index;
        $g_Base64Fragment[] = getFragment($l_Content, $l_Found[1][1]);
           if (DEBUG_MODE) {
                echo "CRIT 9: $l_FN matchedn";
           }
        }
     }
  }
  // count number of base64_decode entries
  $l_Count = substr_count($l_Content, 'base64_decode');
  if ($l_Count > 10) {
     $g_Base64[] = $l_Index;
     $g_Base64Fragment[] = getFragment($l_Content, stripos($l_Content, 'base64_decode'));
     if (DEBUG_MODE) {
        echo "CRIT 10: $l_FN matchedn";
     }
  }
  return false;
}
///////////////////////////////////////////////////////////////////////////
if (!isCli()) {
   header('Content-type: text/html; charset=utf-8');
}
if (!isCli()) {
  $l_PassOK = false;
  if (strlen(PASS) > 8) {
     $l_PassOK = true;   
  } 
  if ($l_PassOK && preg_match('|[0-9]|', PASS, $l_Found) && preg_match('|[A-Z]|', PASS, $l_Found) && preg_match('|[a-z]|', PASS, $l_Found) ) {
     $l_PassOK = true;   
  }
  
  if (!$l_PassOK) {  
    echo sprintf(AI_STR_009, generatePassword());
    exit;
  }
  if (isset($_GET['fn']) && ($_GET['ph'] == crc32(PASS))) {
     printFile();
     exit;
  }
  if ($_GET['p'] != PASS) {
    echo sprintf(AI_STR_010, generatePassword());
    exit;
  }
}
if (!is_readable(ROOT_PATH)) {
  echo AI_STR_011;
  exit;
}
if (isCli()) {
    if (defined('REPORT_PATH') AND REPORT_PATH)
    {
        if (!is_writable(REPORT_PATH))
        {
            die("nCannot write report. Report dir " . REPORT_PATH . " is not writable.");
        }
        else if (!REPORT_FILE)
        {
            die("nCannot write report. Report filename is empty.");
        }
        else if (($file = REPORT_PATH . DIR_SEPARATOR . REPORT_FILE) AND is_file($file) AND !is_writable($file))
        {
            die("nCannot write report. Report file '$file' exists but is not writable.");
        }
    }
}
$g_IgnoreList = array();
$g_DirIgnoreList = array();
$g_UrlIgnoreList = array();
$g_KnownList = array();
$g_AiBolitAbsolutePath = dirname(__FILE__);
$l_IgnoreFilename = $g_AiBolitAbsolutePath . '/.aignore';
$l_DirIgnoreFilename = $g_AiBolitAbsolutePath . '/.adirignore';
$l_UrlIgnoreFilename = $g_AiBolitAbsolutePath . '/.aurlignore';
$l_KnownFilename = '.aknown';
if (file_exists($l_IgnoreFilename)) {
    $l_IgnoreListRaw = file($l_IgnoreFilename);
    for ($i = 0; $i < count($l_IgnoreListRaw); $i++) 
    {
        $g_IgnoreList[] = explode("t", trim($l_IgnoreListRaw[$i]));
    }
    unset($l_IgnoreListRaw);
}
if (file_exists($l_DirIgnoreFilename)) {
    $g_DirIgnoreList = file($l_DirIgnoreFilename);
    
    for ($i = 0; $i < count($g_DirIgnoreList); $i++) {
        $g_DirIgnoreList[$i] = trim($g_DirIgnoreList[$i]);
    }
}
if (file_exists($l_UrlIgnoreFilename)) {
    $g_UrlIgnoreList = file($l_UrlIgnoreFilename);
    
    for ($i = 0; $i < count($g_UrlIgnoreList); $i++) {
        $g_UrlIgnoreList[$i] = trim($g_UrlIgnoreList[$i]);
    }
}
$g_AiBolitAbsolutePathKnownFiles = dirname($g_AiBolitAbsolutePath) . '/known_files';
$g_AiBolitKnownFilesDirs = array('.');
if ($l_DIRH = opendir($g_AiBolitAbsolutePathKnownFiles))
{
    while (($l_FileName = readdir($l_DIRH)) !== false)
    {
    if ($l_FileName == '.' || $l_FileName == '..') continue;
        array_push($g_AiBolitKnownFilesDirs, $l_FileName);
    }
    closedir($l_DIRH);
}
foreach ($g_AiBolitKnownFilesDirs as $l_PathKnownFiles)
{
    if ($l_PathKnownFiles != '.') {
       $l_AbsolutePathKnownFiles = $g_AiBolitAbsolutePathKnownFiles . '/' . $l_PathKnownFiles;
    } else {
      $l_AbsolutePathKnownFiles = $l_PathKnownFiles;
    }
    if ($l_DIRH = opendir($l_AbsolutePathKnownFiles))
    {
        while (($l_FileName = readdir($l_DIRH)) !== false)
        {
            if ($l_FileName == '.' || $l_FileName == '..') continue;
               if (strpos($l_FileName, $l_KnownFilename) !== false) {
                           $g_KnownListTmp = file($l_AbsolutePathKnownFiles . '/' . $l_FileName);
                            for ($i = 0; $i < count($g_KnownListTmp); $i++) {
                                $g_KnownListTmp[$i] = trim($g_KnownListTmp[$i]);
                            }
                            $g_KnownList = array_merge($g_KnownListTmp, $g_KnownList);
                       }
        }
        closedir($l_DIRH);
    }
}
stdOut("Loaded " . count($g_KnownList) . ' known files');
QCR_Debug();
// scan single file
if (defined('SCAN_FILE')) {
   if (file_exists(SCAN_FILE) && is_file(SCAN_FILE) && is_readable(SCAN_FILE)) {
       stdOut("Start scanning file '" . SCAN_FILE . "'.");
       QCR_ScanFile(SCAN_FILE); 
   } else { 
       stdOut("Error:" . SCAN_FILE . " either is not a file or readable");
   }
} else {
   // scan list of files from file
   if (file_exists(DOUBLECHECK_FILE)) {
      stdOut("Start scanning the list from '" . DOUBLECHECK_FILE . "'.");
      $l_FHList = fopen(DOUBLECHECK_FILE, "r");
      while(!feof($l_FHList)) {
         $l_FN = trim(fgets($l_FHList));
         if (file_exists($l_FN)) {
            QCR_ScanFile($l_FN); 
         }
      }
      fclose($l_FHList);
   } else {
      // scan whole file system
      stdOut("Start scanning '" . ROOT_PATH . "'.");
      QCR_ScanDirectories(ROOT_PATH);
   }
}
$g_FoundTotalFiles = count($g_Structure['n']);
QCR_Debug();
stdOut("Found $g_FoundTotalFiles files in $g_FoundTotalDirs directories.");
stdOut(str_repeat(' ', 160),false);
$g_FoundTotalFiles = count($g_Structure['n']);
// detect version CMS
$l_CmsListDetector = new CmsVersionDetector('.');
$l_CmsDetectedNum = $l_CmsListDetector->getCmsNumber();
for ($tt = 0; $tt < $l_CmsDetectedNum; $tt++) {
    $g_CMS[] = $l_CmsListDetector->getCmsName($tt) . ' v' . $l_CmsListDetector->getCmsVersion($tt);
}
QCR_GoScan(0);
QCR_Debug();
////////////////////////////////////////////////////////////////////////////
 if ($BOOL_RESULT) {
  if ((count($g_CriticalPHP) > 0) OR (count($g_CriticalJS) > 0) OR (count($g_Base64) > 0) OR (count($g_SuspDir) > 0) OR  (count($g_Iframer) > 0) OR  (count($g_UnixExec) > 0))
  {
  echo "1n";
  exit(0);
  }
 }
////////////////////////////////////////////////////////////////////////////
$l_Result .= "<div class="sec"><b>" . AI_STR_051 . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : realpath('.')) . "</b></div>";
$time_tacked = seconds2Human(microtime(true) - START_TIME);
$l_Result .= sprintf(AI_STR_013, $g_TotalFolder, $g_TotalFiles);
if (!$defaults['scan_all_files']) {
    $l_Result .= AI_STR_014;
}
$l_Result .= AI_STR_015;
$l_ShowOffer = false;
stdOut("nBuilding reportn");
////////////////////////////////////////////////////////////////////////////
// save 
if ((count($g_CriticalPHP) > 0) OR (count($g_CriticalJS) > 0) OR (count($g_Base64) > 0) OR (count($g_SuspDir) > 0) OR 
   (count($g_Iframer) > 0) OR  (count($g_UnixExec))) 
{
  if (!file_exists(DOUBLECHECK_FILE)) {
      if ($l_FH = fopen(DOUBLECHECK_FILE, 'w')) {
         fputs($l_FH, '<?php die("Forbidden"); ?>' . "n");
         $l_CurrPath = dirname(__FILE__);
         for ($i = 0; $i < count($g_CriticalPHP); $i++) {
             fputs($l_FH, str_replace($l_CurrPath, '.', $g_Structure['n'][$g_CriticalPHP[$i]]) . "n");
             //unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_CriticalPHP[$i]]));  
         }
         for ($i = 0; $i < count($g_Base64); $i++) {
             fputs($l_FH, str_replace($l_CurrPath, '.', $g_Structure['n'][$g_Base64[$i]]) . "n");
             //unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_Base64[$i]]));
         }
         for ($i = 0; $i < count($g_CriticalJS); $i++) {
             fputs($l_FH, str_replace($l_CurrPath, '.', $g_Structure['n'][$g_CriticalJS[$i]]) . "n");
             //unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_CriticalJS[$i]]));
         }
         for ($i = 0; $i < count($g_SuspDir); $i++) {
             fputs($l_FH, str_replace($l_CurrPath, '.', $g_Structure['n'][$g_SuspDir[$i]]) . "n");
             //unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_SuspDir[$i]]));
         }
         for ($i = 0; $i < count($g_Iframer); $i++) {
             fputs($l_FH, str_replace($l_CurrPath, '.', $g_Structure['n'][$g_Iframer[$i]]) . "n");
             //unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_Iframer[$i]]));
         }
         for ($i = 0; $i < count($g_UnixExec); $i++) {
             fputs($l_FH, str_replace($l_CurrPath, '.', $g_Structure['n'][$g_UnixExec[$i]]) . "n");
             //unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_UnixExec[$i]]));
         }
         fclose($l_FH);
      } else {
         stdOut("Error! Cannot create " . DOUBLECHECK_FILE);
      }      
  } else {
      stdOut(DOUBLECHECK_FILE . ' already exists.');
      $l_Result .= '<div class="err">' . DOUBLECHECK_FILE . ' already exists.</div>';
  }
 
}
////////////////////////////////////////////////////////////////////////////
stdOut("Building list of shells " . count($g_CriticalPHP));
if (function_exists("gethostname") && is_callable("gethostname")) {
  $l_HostName = gethostname();
} else {
  $l_HostName = '???';
}
$l_PlainResult = "# Malware list detected by AI-Bolit (http://revisium.com/ai/) on " . date("d/m/Y H:i:s", time()) . " " . $l_HostName .  "nn";
if (count($g_CriticalPHP) > 0) {
  $l_Result .= '<div class="vir"><b>' . AI_STR_016 . '</b> (' . count($g_CriticalPHP) . ')';
  $l_Result .= printList($g_CriticalPHP, $g_CriticalPHPFragment, true, $g_CriticalPHPSig, 'table_crit');
  $l_PlainResult .= printPlainList($g_CriticalPHP, $g_CriticalPHPFragment, true, $g_CriticalPHPSig, 'table_crit');
  $l_Result .= '</div>';
  $l_ShowOffer = true;
} else {
  $l_Result .= '<div class="ok"><b>' . AI_STR_017. '</b></div>';
}
stdOut("Building list of js " . count($g_CriticalJS));
if (count($g_CriticalJS) > 0) {
  $l_Result .= '<div class="vir"><b>' . AI_STR_018 . '</b> (' . count($g_CriticalJS) . ')';
  $l_Result .= printList($g_CriticalJS, $g_CriticalJSFragment, true, $g_CriticalJSSig, 'table_vir');
  $l_PlainResult .= printPlainList($g_CriticalJS, $g_CriticalJSFragment, true, $g_CriticalJSSig, 'table_vir');
  $l_Result .= "</div>";
  $l_ShowOffer = true;
}
stdOut("Building phishing pages " . count($g_Phishing));
if (count($g_Phishing) > 0) {
  $l_Result .= '<div class="vir"><b>' . AI_STR_058 . '</b> (' . count($g_Phishing) . ')';
  $l_Result .= printList($g_Phishing, $g_PhishingFragment, true, $g_PhishingSigFragment, 'table_vir');
  $l_PlainResult .= printPlainList($g_Phishing, $g_PhishingFragment, true, $g_PhishingSigFragment, 'table_vir');
  $l_Result .= "</div>";
  $l_ShowOffer = true;
}
stdOut("Building list of unix executables " . count($g_UnixExec));
if (count($g_UnixExec) > 0) {
  $l_Result .= "<div class="vir"><b>". AI_STR_019 ."</b> (" . count($g_UnixExec) . ')';
  $l_Result .= printList($g_UnixExec, '', true);
  $l_PlainResult .= printPlainList($g_UnixExec, '', true);
  $l_Result .= "</div>";
  $l_ShowOffer = true;
}
stdOut("Building list of iframes " . count($g_Iframer));
if (count($g_Iframer) > 0) {
  $l_ShowOffer = true;
  $l_Result .= "<div class="vir"><b>" . AI_STR_021 . "</b> (" . count($g_Iframer) . ')';
  $l_Result .= printList($g_Iframer, $g_IframerFragment, true);
  $l_Result .= "</div>";
}
stdOut("Building list of base64s " . count($g_Base64));
if (count($g_Base64) > 0) {
  $l_ShowOffer = true;
  $l_Result .= "<div class="warn"><b>" . AI_STR_020 ."</b> (" . count($g_Base64) . ')';
  $l_Result .= printList($g_Base64, $g_Base64Fragment, true);
  $l_PlainResult .= printPlainList($g_Base64, $g_Base64Fragment, true);
  $l_Result .= "</div>";
}
stdOut("Building list of heuristics " . count($g_HeuristicDetected));
if (count($g_HeuristicDetected) > 0) {
  $l_Result .= '<div class="warn"><b>' . AI_STR_052 . '</b><ul>';
  for ($i = 0; $i < count($g_HeuristicDetected); $i++) {
       $l_Result .= '<li>' . $g_Structure['n'][$g_HeuristicDetected[$i]] . ' (' . get_descr_heur($g_HeuristicType[$i]) . ')</li>';
  }
  
  $l_Result .= '</ul></div>';
  $l_ShowOffer = true;
}
stdOut("Building list of unread files " . count($g_NotRead));
if (count($g_NotRead) > 0) {
  $l_ShowOffer = true;
  $l_Result .= "<div class="vir"><b>" . AI_STR_030 . ":</b>";
  $l_Result .= printList($g_NotRead);
  $l_Result .= "</div>";
}
stdOut("Building list of symlinks " . count($g_SymLinks));
if (count($g_SymLinks) > 0) {
  $l_Result .= "<div class="warn"><b>" . AI_STR_022 . "</b> (" . count($g_SymLinks) .")<br>";
  $l_Result .= implode("<br>", $g_SymLinks);
  $l_Result .= "</div>";
}
stdOut("Building list of hidden files " . count($g_HiddenFiles));
if (count($g_HiddenFiles) > 0) {
  $l_Result .= "<div class="warn"><b>" . AI_STR_023 . "</b> (" . count($g_HiddenFiles) . ")<br>";
  $l_Result .= implode("<br>", $g_HiddenFiles);
  $l_Result .= "</div>";
}
stdOut("Building list of susp dirs " . count($g_SuspDir));
if (count($g_SuspDir) > 0) {
  $l_Result .= "<div class="vir"><b>" . AI_STR_024 . "</b><br>";
  $l_Result .= printList($g_SuspDir);
  $l_Result .= "</div>";
} else {
  $l_Result .= '<div class="ok"><b>' . AI_STR_025 . '</b></div>';
}
 
stdOut("Building list of redirects " . count($g_Redirect));
$l_Result .= "<div class="sec">" . AI_STR_026 . "</div>";
if (count($g_Redirect) > 0) {
  $l_ShowOffer = true;
  $l_Result .= "<div class="warn"><b>" . AI_STR_027 . "</b>";
  $l_Result .= printList($g_Redirect, $g_RedirectPHPFragment, true);
  $l_Result .= "</div>";
}
stdOut("Building list of php inj " . count($g_PHPCodeInside));
if ((count($g_PHPCodeInside) > 0) && (($defaults['report_mask'] & REPORT_MASK_PHPSIGN) == REPORT_MASK_PHPSIGN)) {
  $l_ShowOffer = true;
  $l_Result .= "<div class="warn"><b>" . AI_STR_028 . "</b>";
  $l_Result .= printList($g_PHPCodeInside, $g_PHPCodeInsideFragment, true);
  $l_Result .= "</div>";
}
stdOut("Building list of adware " . count($g_AdwareList));
if (count($g_AdwareList) > 0) {
  $l_ShowOffer = true;
  $l_Result .= "<div class="warn"><b>" . AI_STR_029 . "</b>";
  $l_Result .= printList($g_AdwareList, $g_AdwareListFragment, true);
  $l_Result .= "</div>";
}
stdOut("Building list of empty links " . count($g_EmptyLink));
if ((count($g_EmptyLink) > 0) && (($defaults['report_mask'] & REPORT_MASK_SPAMLINKS) == REPORT_MASK_SPAMLINKS)) {
  $l_ShowOffer = true;
  $l_Result .= "<div class="warn"><b>" . AI_STR_031 . "</b>";
  $l_Result .= printList($g_EmptyLink, '', true);
  $l_Result .= AI_STR_032 . '<br/>';
  
  if (count($g_EmptyLink) == MAX_EXT_LINKS) {
      $l_Result .= '(' . AI_STR_033 . MAX_EXT_LINKS . ')<br/>';
    }
   
  for ($i = 0; $i < count($g_EmptyLink); $i++) {
    $l_Idx = $g_EmptyLink[$i];
    for ($j = 0; $j < count($g_EmptyLinkSrc[$l_Idx]); $j++) {
      $l_Result .= '<span class="details">' . $g_Structure['n'][$g_EmptyLink[$i]] . ' → ' . htmlspecialchars($g_EmptyLinkSrc[$l_Idx][$j]) . '</span><br/>';
    }
  }
  $l_Result .= "</div>";
}
stdOut("Building list of doorways " . count($g_Doorway));
if ((count($g_Doorway) > 0) && (($defaults['report_mask'] & REPORT_MASK_DOORWAYS) == REPORT_MASK_DOORWAYS)) {
  $l_ShowOffer = true;
  $l_Result .= "<div class="warn"><b>" . AI_STR_034 . "</b>";
  $l_Result .= printList($g_Doorway);
  $l_Result .= "</div>";
}
stdOut("Building list of php warnings " . (count($g_WarningPHP[0]) + count($g_WarningPHP[1])));
if (($defaults['report_mask'] & REPORT_MASK_SUSP) == REPORT_MASK_SUSP) {
   if ((count($g_WarningPHP[0]) + count($g_WarningPHP[1])) > 0) {
     $l_ShowOffer = true;
     $l_Result .= "<div class="warn"><b>" . AI_STR_035 . "</b>";
     for ($i = 0; $i < count($g_WarningPHP); $i++) {
         if (count($g_WarningPHP[$i]) > 0) 
            $l_Result .= printList($g_WarningPHP[$i], $g_WarningPHPFragment[$i], true, $g_WarningPHPSig, 'table_warn');
     }                                                                                                                    
     $l_Result .= "</div>";
   } 
}
stdOut("Building list of skipped dirs " . count($g_SkippedFolders));
if (count($g_SkippedFolders) > 0) {
     $l_Result .= "<div class="warn2"><b>" . AI_STR_036 . "</b><br/>";
     $l_Result .= implode("<br>", $g_SkippedFolders);
     $l_Result .= "</div>";
 }
 stdOut("Building list of writeable dirs " . count($g_WritableDirectories));
if (count($g_CMS) > 0) {
     $l_Result .= "<div class="warn2"><b>" . AI_STR_037 . "</b><br/>";
     $l_Result .= implode("<br>", $g_CMS);
     $l_Result .= "</div>";
}
if (!isCli()) {
   $l_Result .= QCR_ExtractInfo($l_PhpInfoBody[1]);
}
$max_size_to_scan = getBytes(MAX_SIZE_TO_SCAN);
$max_size_to_scan = $max_size_to_scan > 0 ? $max_size_to_scan : getBytes('1m');
stdOut("Building list of bigfiles " . count($g_BigFiles));
if (count($g_BigFiles) > 0) {
  $l_Result .= "<div class="warn2"><b>" . sprintf(AI_STR_038, bytes2Human($max_size_to_scan)) . "</b>";
  $l_Result .= printList($g_BigFiles);
  $l_Result .= "</div>";
} else {
  if (SCAN_ALL_FILES) {
    $l_Result .= '<div class="ok"><b>' . sprintf(AI_STR_039, bytes2Human($max_size_to_scan)) . '</b></div>';
  }
}
stdOut("Building list of sensitive files " . count($g_UnsafeFilesFound) . "n");
if ((count($g_UnsafeFilesFound) > 0) && (($defaults['report_mask'] & REPORT_MASK_CANDI) == REPORT_MASK_CANDI)) {
  $l_Result .= "<div class="warn2"><b>" . AI_STR_040 . "</b>";
  $l_Result .= printList($g_UnsafeFilesFound);
  $l_Result .= "</div>";
}
if (!$defaults['no_rw_dir']) {
   if ((($defaults['report_mask'] & REPORT_MASK_WRIT) == REPORT_MASK_WRIT)) {
      if ((count($g_WritableDirectories) > 0)) {
        $l_Result .= "<div class="warn2"><b>" . AI_STR_041 . "</b>";
        $l_Result .= printList($g_WritableDirectories);
        $l_Result .= "</div>";
      } else {
        $l_Result .= '<div class="ok"><b>' . AI_STR_042 . '</b></div>';
      }
   }
}
if (function_exists('memory_get_peak_usage')) {
  $l_Result .= AI_STR_043 . bytes2Human(memory_get_peak_usage()) . '<p>';
}
$l_Result .= AI_STR_044;
if (!SCAN_ALL_FILES) {
  $l_Result .= AI_STR_045;
}
$l_Result .= sprintf(AI_STR_012, count($g_DBShe) + count($gX_DBShe) + count($g_FlexDBShe), (count($g_SusDB) + count($g_AdwareSig ) + count($g_JSVirSig)), $time_tacked, date('d-m-Y в H:i:s', floor(START_TIME)) , date('d-m-Y в H:i:s'));
$l_Result .= '<div class="footer"><div class="disclaimer"><span class="vir">[!]</span> ' . AI_STR_049 . '</div>';
$l_Result .= '<div class="thanx">' . AI_STR_050 . '</div>';
$l_Result .= '</div>';
$l_OfferVK = AI_STR_048;
              
if ($l_ShowOffer) {
  $l_Result .= AI_STR_047 .
        '<p><a href="#" onclick="document.getElementById('ofr').style.display='none'" style="color: #303030">' . AI_STR_046 . '</a></p>' .
        '</div>';
} else {
  $l_Result .= '<div class="offer2" id="ofr2">' . $l_OfferVK .
        '<p><a href="#" onclick="document.getElementById('ofr2').style.display='none'" style="color: #303030">' . AI_STR_046 .'</a></p>' .
        '</div>';
}
$l_Result .=<<<ENDING
</body> 
<script language="javascript">
$(document).ready(function(){
    $('#table_crit').dataTable({
       "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
       "aoColumns": [
                                     {"iDataSort": 7},
                                     {"iDataSort": 5},
                                     {"iDataSort": 6},
                                     {"bSortable": true},
                                     {"bSortable": true},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false}
                     ],
       "iDisplayLength": 500,
        "oLanguage": {
            "sLengthMenu": "Отображать по _MENU_ записей",
            "sZeroRecords": "Ничего не найдено",
            "sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
            "sInfoEmpty": "Нет файлов",
            "sInfoFiltered": "(всего записей _MAX_)",
            "sSearch":       "Поиск:",
            "sUrl":          "",
            "oPaginate": {
                "sFirst": "Первая",
                "sPrevious": "Предыдущая",
                "sNext": "Следующая",
                "sLast": "Последняя"
            },
            "oAria": {
                "sSortAscending":  ": активировать для сортировки столбца по возрастанию",
                "sSortDescending": ": активировать для сортировки столбцов по убыванию"            
            }
        }
     } );
});
$(document).ready(function(){
    $('#table_vir').dataTable({
       "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
       "aoColumns": [
                                     {"iDataSort": 7},
                                     {"iDataSort": 5},
                                     {"iDataSort": 6},
                                     {"bSortable": true},
                                     {"bSortable": true},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false}
                     ],
       "iDisplayLength": 500,
        "oLanguage": {
            "sLengthMenu": "Отображать по _MENU_ записей",
            "sZeroRecords": "Ничего не найдено",
            "sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
            "sInfoEmpty": "Нет файлов",
            "sInfoFiltered": "(всего записей _MAX_)",
            "sSearch":       "Поиск:",
            "sUrl":          "",
            "oPaginate": {
                "sFirst": "Первая",
                "sPrevious": "Предыдущая",
                "sNext": "Следующая",
                "sLast": "Последняя"
            },
            "oAria": {
                "sSortAscending":  ": активировать для сортировки столбца по возрастанию",
                "sSortDescending": ": активировать для сортировки столбцов по убыванию"            
            }
        },
     } );
});
    $('#table_warn').dataTable({
       "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
       "aoColumns": [
                                     {"iDataSort": 7},
                                     {"iDataSort": 5},
                                     {"iDataSort": 6},
                                     {"bSortable": true},
                                     {"bSortable": true},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false}
                     ],
       "iDisplayLength": 500,
        "oLanguage": {
            "sLengthMenu": "Отображать по _MENU_ записей",
            "sZeroRecords": "Ничего не найдено",
            "sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
            "sInfoEmpty": "Нет файлов",
            "sInfoFiltered": "(всего записей _MAX_)",
            "sSearch":       "Поиск:",
            "sUrl":          "",
            "oPaginate": {
                "sFirst": "Первая",
                "sPrevious": "Предыдущая",
                "sNext": "Следующая",
                "sLast": "Последняя"
            },
            "oAria": {
                "sSortAscending":  ": активировать для сортировки столбца по возрастанию",
                "sSortDescending": ": активировать для сортировки столбцов по убыванию"            
            }
        }
     } );
</script>
</html>
ENDING;
////////////////////////////////////////////////////////////////////////////
if (!isCli())
{
    echo $l_Result;
    exit;
}
if (!defined('REPORT') OR REPORT === '')
{
    die('Report not written.');
}
 
// write plain text result
if (PLAIN_FILE != '') {
   if ($l_FH = fopen(PLAIN_FILE, "w")) {
      fputs($l_FH, $l_PlainResult);
      fclose($l_FH);
   }
}
$emails = getEmails(REPORT);
if (!$emails) {
    if ($l_FH = fopen($file, "w")) {
       fputs($l_FH, $l_Result);
       fclose($l_FH);
       stdOut("nReport written to '$file'.");
    } else {
        stdOut("nCannot create '$file'.");
    }
}    else    {
        $headers = array(
            'MIME-Version: 1.0',
            'Content-type: text/html; charset=UTF-8',
            'From: ' . ($defaults['email_from'] ? $defaults['email_from'] : 'AI-Bolit@myhost')
        );
        for ($i = 0, $size = sizeof($emails); $i < $size; $i++)
        {
            mail($emails[$i], 'AI-Bolit Report ' . date("d/m/Y H:i", time()), $l_Result, implode("rn", $headers));
        }
        stdOut("nReport sended to " . implode(', ', $emails));
}
$time_taken = microtime(true) - START_TIME;
$time_taken = number_format($time_taken, 5);
stdOut("Scanning complete! Time taken: " . seconds2Human($time_taken));
stdOut("nn!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
stdOut("Attention! DO NOT LEAVE either ai-bolit.php or AI-BOLIT-REPORT-<xxxx>-<yy>.html nfile on server. COPY it locally then REMOVE from server. ");
stdOut("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
QCR_Debug();
?>