<?php
header('Content-type: text/plain');
abstract class Employee
{
private $rank;
private $boss;
protected $data;
public const TYPE_EMPLOYEES = ['manager' => '0',
'marketer' => '1',
'engineer' => '2',
'analytic' => '3'];
function __construct(int $rank, int $boss) {
$this->rank = $rank;
$this->boss = $boss;
}
public function getMoney() {
$money = $this->data['money'];
if ($this->rank == 2 ) {
$money *= 1.25;
} elseif ($this->rank == 3) {
$money *= 1.5;
}
if ($this->boss) {
$money *= 1.5;
}
return $money;
}
public function getCoffee() {
$coffee = $this->data['coffee'];
if ($this->boss) {
$coffee *= 2;
}
return $coffee;
}
public function getPages() {
$pages = $this->data['pages'];
if ($this->boss) {
$pages = 0;
}
return $pages;
}
}
class Manager extends Employee
{
protected $data = ['money' => '500',
'coffee' => '20',
'pages' => '200'];
}
class Marketer extends Employee
{
protected $data = ['money' => '400',
'coffee' => '15',
'pages' => '150'];
}
class Engineer extends Employee
{
protected $data = ['money' => '200',
'coffee' => '5',
'pages' => '50'];
}
class Analytic extends Employee
{
protected $data = ['money' => '800',
'coffee' => '50',
'pages' => '5'];
}
class Department
{
private $name;
private $employees = [];
function __construct(string $department) {
$this->name = $department;
}
/* Добавляем работников в департамент */
public function createEmployee(int $prof, int $rank, int $boss, int $count) {
for ($i = 0; $i < $count; $i++) {
switch ($prof) {
case Employee::TYPE_EMPLOYEES['manager']:
$this->employees[] = new Manager($rank, $boss);
break;
case Employee::TYPE_EMPLOYEES['marketer']:
$this->employees[] = new Marketer($rank, $boss);
break;
case Employee::TYPE_EMPLOYEES['engineer']:
$this->employees[] = new Engineer($rank, $boss);
break;
case Employee::TYPE_EMPLOYEES['analytic']:
$this->employees[] = new Analytic($rank, $boss);
break;
}
}
}
/* Создаём массив со статистикой департамента */
public function getDepStat() {
$depData = ['name' => $this->name,
'count' => count($this->employees), 'money' => 0,
'coffee' => 0,
'pages' => 0,
'average' => 0];
foreach ($this->employees as $item) {
$depData['money'] += $item->getMoney();
$depData['coffee'] += $item->getCoffee();
$depData['pages'] += $item->getPages();
}
$depData['average'] = round($depData['money'] / $depData['pages'], 1);
return $depData;
}
}
class Company
{
private $name;
private $departments;
function __construct( string $name) {
$this->name = $name;
}
public function addDepartment($department) {
$this->departments[] = $department;
}
/* Получаем статистику департаментов и заносим в массив */
public function getCompanyStat() {
foreach ($this->departments as $item) {
$companyStat[] = $item->getDepStat();
}
return $companyStat;
}
/* Полная статистика компании */
public function totalCompanyStat() {
$statistic = $this->getCompanyStat();
$totalStat = ['name' => 'Всего',
'count' => 0,
'money' => 0,
'coffee' => 0,
'pages' => 0];
foreach ($statistic as $item) {
$totalStat['count'] += $item['count'];
$totalStat['money'] += $item['money'];
$totalStat['coffee'] += $item['coffee'];
$totalStat['pages'] += $item['pages'];
}
return $totalStat;
}
/* Средние значения полной статистики */
public function averageCompanyStat() {
$depCount = count($this->departments); $statistic = $this->totalCompanyStat();
$averageStat = ['name' => 'Среднее',
'money' => 0,
'coffee' => 0,
'pages' => 0,
'average' => 0];
$averageStat['count'] = round($statistic['count'] / $depCount, 1); $averageStat['money'] = round($statistic['money'] / $depCount, 1); $averageStat['coffee'] = round($statistic['coffee'] / $depCount, 1); $averageStat['pages'] = round($statistic['pages'] / $depCount, 1); $averageStat['average'] = round($statistic['money'] / $statistic['pages'], 1); return $averageStat;
}
}
/* Создаём компанию и добавляем в неё департаменты */
$company = new Company("Вектор");
$dep = new Department("Закупок");
$dep1 = new Department("Продаж");
$dep2 = new Department("Рекламы");
$dep3 = new Department("Логистики");
$company->addDepartment($dep);
$company->addDepartment($dep1);
$company->addDepartment($dep2);
$company->addDepartment($dep3);
$dep->createEmployee(Employee::TYPE_EMPLOYEES['manager'], "1", "0", "9");
$dep->createEmployee(Employee::TYPE_EMPLOYEES['manager'], "2", "0", "3");
$dep->createEmployee(Employee::TYPE_EMPLOYEES['manager'], "3", "0", "2");
$dep->createEmployee(Employee::TYPE_EMPLOYEES['marketer'], "1", "0", "2");
$dep->createEmployee(Employee::TYPE_EMPLOYEES['manager'], "2", "1", "1");
$dep1->createEmployee(Employee::TYPE_EMPLOYEES['manager'], "1", "0", "12");
$dep1->createEmployee(Employee::TYPE_EMPLOYEES['marketer'], "1", "0", "6");
$dep1->createEmployee(Employee::TYPE_EMPLOYEES['analytic'], "1", "0", "3");
$dep1->createEmployee(Employee::TYPE_EMPLOYEES['analytic'], "2", "0", "2");
$dep1->createEmployee(Employee::TYPE_EMPLOYEES['marketer'], "2", "1", "1");
$dep2->createEmployee(Employee::TYPE_EMPLOYEES['marketer'], "1", "0", "15");
$dep2->createEmployee(Employee::TYPE_EMPLOYEES['marketer'], "2", "0", "10");
$dep2->createEmployee(Employee::TYPE_EMPLOYEES['manager'], "1", "0", "8");
$dep2->createEmployee(Employee::TYPE_EMPLOYEES['engineer'], "1", "0", "2");
$dep2->createEmployee(Employee::TYPE_EMPLOYEES['marketer'], "3", "1", "1");
$dep3->createEmployee(Employee::TYPE_EMPLOYEES['manager'], "1", "0", "13");
$dep3->createEmployee(Employee::TYPE_EMPLOYEES['manager'], "2", "0", "5");
$dep3->createEmployee(Employee::TYPE_EMPLOYEES['engineer'], "1", "0", "5");
$dep3->createEmployee(Employee::TYPE_EMPLOYEES['manager'], "1", "1", "1");
$companyStat = $company->getCompanyStat();
$totalStat = $company->totalCompanyStat();
$averageStat = $company->averageCompanyStat();
/* Вывод информации */
$col1 = 15;
$col2 = 10;
/* Заголовок */
echo padLeft("Департамент", $col1) .
padLeft("сотр.", $col2) .
padLeft("тугр.", $col2) .
padLeft("кофе", $col2) .
padLeft("стр.", $col2) .
padLeft("тугр./стр.", $col2) . "\n\n";
/* Перебор департаментов */
foreach ($companyStat as $item) {
echo padLeft($item['name'],$col1) .
padLeft($item['count'], $col2) .
padLeft($item['money'], $col2) .
padLeft($item['coffee'], $col2) .
padLeft($item['pages'], $col2) .
padLeft($item['average'], $col2) . "\n";
}
/* Всего */
echo padLeft($totalStat['name'],$col1) .
padLeft($totalStat['count'], $col2) .
padLeft($totalStat['money'], $col2) .
padLeft($totalStat['coffee'], $col2) .
padLeft($totalStat['pages'], $col2) . "\n";
/* Среднее */
echo padLeft($averageStat['name'],$col1) .
padLeft($averageStat['count'], $col2) .
padLeft($averageStat['money'], $col2) .
padLeft($averageStat['coffee'], $col2) .
padLeft($averageStat['pages'], $col2) .
padLeft($averageStat['average'], $col2);
function padLeft($value, $col){
if ($col > $count) {
}
return $value;
}
PD9waHAKaGVhZGVyKCdDb250ZW50LXR5cGU6IHRleHQvcGxhaW4nKTsKCmFic3RyYWN0IGNsYXNzICBFbXBsb3llZQp7CiAgICBwcml2YXRlICRyYW5rOwogICAgcHJpdmF0ZSAkYm9zczsKICAgIHByb3RlY3RlZCAkZGF0YTsKICAgIHB1YmxpYyBjb25zdCBUWVBFX0VNUExPWUVFUyA9IFsnbWFuYWdlcicgPT4gJzAnLAogICAgICAgICdtYXJrZXRlcicgPT4gJzEnLAogICAgICAgICdlbmdpbmVlcicgPT4gJzInLAogICAgICAgICdhbmFseXRpYycgPT4gJzMnXTsKCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJHJhbmssIGludCAkYm9zcykgewogICAgICAgICR0aGlzLT5yYW5rID0gJHJhbms7CiAgICAgICAgJHRoaXMtPmJvc3MgPSAkYm9zczsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TW9uZXkoKSB7CiAgICAgICAgJG1vbmV5ID0gJHRoaXMtPmRhdGFbJ21vbmV5J107CiAgICAgICAgaWYgKCR0aGlzLT5yYW5rID09IDIgKSB7CiAgICAgICAgICAgICRtb25leSAqPSAxLjI1OwogICAgICAgIH0gZWxzZWlmICgkdGhpcy0+cmFuayA9PSAzKSB7CiAgICAgICAgICAgICRtb25leSAqPSAxLjU7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+Ym9zcykgewogICAgICAgICAgICAkbW9uZXkgKj0gMS41OwogICAgICAgIH0KICAgICAgICByZXR1cm4gJG1vbmV5OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb2ZmZWUoKSB7CiAgICAgICAgJGNvZmZlZSA9ICR0aGlzLT5kYXRhWydjb2ZmZWUnXTsKICAgICAgICBpZiAoJHRoaXMtPmJvc3MpIHsKICAgICAgICAgICAgJGNvZmZlZSAqPSAyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGNvZmZlZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UGFnZXMoKSB7CiAgICAgICAgJHBhZ2VzID0gJHRoaXMtPmRhdGFbJ3BhZ2VzJ107CiAgICAgICAgaWYgKCR0aGlzLT5ib3NzKSB7CiAgICAgICAgICAgICRwYWdlcyA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcGFnZXM7CiAgICB9Cn0KCmNsYXNzIE1hbmFnZXIgZXh0ZW5kcyBFbXBsb3llZQp7CiAgICBwcm90ZWN0ZWQgJGRhdGEgPSBbJ21vbmV5JyA9PiAnNTAwJywKICAgICAgICAnY29mZmVlJyA9PiAnMjAnLAogICAgICAgICdwYWdlcycgPT4gJzIwMCddOwp9CgpjbGFzcyBNYXJrZXRlciBleHRlbmRzIEVtcGxveWVlCnsKICAgIHByb3RlY3RlZCAkZGF0YSA9IFsnbW9uZXknID0+ICc0MDAnLAogICAgICAgICdjb2ZmZWUnID0+ICcxNScsCiAgICAgICAgJ3BhZ2VzJyA9PiAnMTUwJ107Cn0KCmNsYXNzIEVuZ2luZWVyIGV4dGVuZHMgRW1wbG95ZWUKewogICAgcHJvdGVjdGVkICRkYXRhID0gWydtb25leScgPT4gJzIwMCcsCiAgICAgICAgJ2NvZmZlZScgPT4gJzUnLAogICAgICAgICdwYWdlcycgPT4gJzUwJ107Cn0KCmNsYXNzIEFuYWx5dGljIGV4dGVuZHMgRW1wbG95ZWUKewogICAgcHJvdGVjdGVkICRkYXRhID0gWydtb25leScgPT4gJzgwMCcsCiAgICAgICAgJ2NvZmZlZScgPT4gJzUwJywKICAgICAgICAncGFnZXMnID0+ICc1J107Cn0KCmNsYXNzIERlcGFydG1lbnQKewogICAgcHJpdmF0ZSAkbmFtZTsKICAgIHByaXZhdGUgJGVtcGxveWVlcyA9IFtdOwoKICAgIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZGVwYXJ0bWVudCkgewogICAgICAgICR0aGlzLT5uYW1lID0gJGRlcGFydG1lbnQ7CiAgICB9CiAgICAvKiDQlNC+0LHQsNCy0LvRj9C10Lwg0YDQsNCx0L7RgtC90LjQutC+0LIg0LIg0LTQtdC/0LDRgNGC0LDQvNC10L3RgiAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNyZWF0ZUVtcGxveWVlKGludCAkcHJvZiwgaW50ICRyYW5rLCBpbnQgJGJvc3MsIGludCAkY291bnQpIHsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkY291bnQ7ICRpKyspIHsKICAgICAgICAgICAgc3dpdGNoICgkcHJvZikgewogICAgICAgICAgICAgICAgY2FzZSBFbXBsb3llZTo6VFlQRV9FTVBMT1lFRVNbJ21hbmFnZXInXToKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZW1wbG95ZWVzW10gPSBuZXcgTWFuYWdlcigkcmFuaywgJGJvc3MpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBFbXBsb3llZTo6VFlQRV9FTVBMT1lFRVNbJ21hcmtldGVyJ106CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVtcGxveWVlc1tdID0gbmV3IE1hcmtldGVyKCRyYW5rLCAkYm9zcyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEVtcGxveWVlOjpUWVBFX0VNUExPWUVFU1snZW5naW5lZXInXToKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZW1wbG95ZWVzW10gPSBuZXcgRW5naW5lZXIoJHJhbmssICRib3NzKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRW1wbG95ZWU6OlRZUEVfRU1QTE9ZRUVTWydhbmFseXRpYyddOgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbXBsb3llZXNbXSA9IG5ldyBBbmFseXRpYygkcmFuaywgJGJvc3MpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgIH0KCiAgICAvKiDQodC+0LfQtNCw0ZHQvCDQvNCw0YHRgdC40LIg0YHQviDRgdGC0LDRgtC40YHRgtC40LrQvtC5INC00LXQv9Cw0YDRgtCw0LzQtdC90YLQsCAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldERlcFN0YXQoKSB7CiAgICAgICAgJGRlcERhdGEgPSBbJ25hbWUnID0+ICR0aGlzLT5uYW1lLAogICAgICAgICAgICAnY291bnQnID0+IGNvdW50KCR0aGlzLT5lbXBsb3llZXMpLAogICAgICAgICAgICAnbW9uZXknID0+IDAsCiAgICAgICAgICAgICdjb2ZmZWUnID0+IDAsCiAgICAgICAgICAgICdwYWdlcycgPT4gMCwKICAgICAgICAgICAgJ2F2ZXJhZ2UnID0+IDBdOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+ZW1wbG95ZWVzIGFzICRpdGVtKSB7CiAgICAgICAgICAgICRkZXBEYXRhWydtb25leSddICs9ICRpdGVtLT5nZXRNb25leSgpOwogICAgICAgICAgICAkZGVwRGF0YVsnY29mZmVlJ10gKz0gJGl0ZW0tPmdldENvZmZlZSgpOwogICAgICAgICAgICAkZGVwRGF0YVsncGFnZXMnXSArPSAkaXRlbS0+Z2V0UGFnZXMoKTsKICAgICAgICB9CiAgICAgICAgJGRlcERhdGFbJ2F2ZXJhZ2UnXSA9IHJvdW5kKCRkZXBEYXRhWydtb25leSddIC8gJGRlcERhdGFbJ3BhZ2VzJ10sIDEpOwoKICAgICAgICByZXR1cm4gJGRlcERhdGE7CiAgICB9Cn0KCmNsYXNzIENvbXBhbnkKewogICAgcHJpdmF0ZSAkbmFtZTsKICAgIHByaXZhdGUgJGRlcGFydG1lbnRzOwoKICAgIGZ1bmN0aW9uIF9fY29uc3RydWN0KCBzdHJpbmcgJG5hbWUpIHsKICAgICAgICAkdGhpcy0+bmFtZSA9ICRuYW1lOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGREZXBhcnRtZW50KCRkZXBhcnRtZW50KSB7CiAgICAgICAgJHRoaXMtPmRlcGFydG1lbnRzW10gPSAkZGVwYXJ0bWVudDsKICAgIH0KCiAgICAvKiDQn9C+0LvRg9GH0LDQtdC8INGB0YLQsNGC0LjRgdGC0LjQutGDINC00LXQv9Cw0YDRgtCw0LzQtdC90YLQvtCyINC4INC30LDQvdC+0YHQuNC8INCyINC80LDRgdGB0LjQsiAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbXBhbnlTdGF0KCkgewogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5kZXBhcnRtZW50cyBhcyAkaXRlbSkgewogICAgICAgICAgICAkY29tcGFueVN0YXRbXSA9ICRpdGVtLT5nZXREZXBTdGF0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkY29tcGFueVN0YXQ7CiAgICB9CgogICAgLyog0J/QvtC70L3QsNGPINGB0YLQsNGC0LjRgdGC0LjQutCwINC60L7QvNC/0LDQvdC40LggKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0b3RhbENvbXBhbnlTdGF0KCkgewogICAgICAgICRzdGF0aXN0aWMgPSAkdGhpcy0+Z2V0Q29tcGFueVN0YXQoKTsKICAgICAgICAkdG90YWxTdGF0ID0gWyduYW1lJyA9PiAn0JLRgdC10LPQvicsCiAgICAgICAgICAgICdjb3VudCcgPT4gMCwKICAgICAgICAgICAgJ21vbmV5JyA9PiAwLAogICAgICAgICAgICAnY29mZmVlJyA9PiAwLAogICAgICAgICAgICAncGFnZXMnID0+IDBdOwoKICAgICAgICBmb3JlYWNoICgkc3RhdGlzdGljIGFzICRpdGVtKSB7CiAgICAgICAgICAgICR0b3RhbFN0YXRbJ2NvdW50J10gKz0gJGl0ZW1bJ2NvdW50J107CiAgICAgICAgICAgICR0b3RhbFN0YXRbJ21vbmV5J10gKz0gJGl0ZW1bJ21vbmV5J107CiAgICAgICAgICAgICR0b3RhbFN0YXRbJ2NvZmZlZSddICs9ICRpdGVtWydjb2ZmZWUnXTsKICAgICAgICAgICAgJHRvdGFsU3RhdFsncGFnZXMnXSArPSAkaXRlbVsncGFnZXMnXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0b3RhbFN0YXQ7CiAgICB9CiAgICAvKiDQodGA0LXQtNC90LjQtSDQt9C90LDRh9C10L3QuNGPINC/0L7Qu9C90L7QuSDRgdGC0LDRgtC40YHRgtC40LrQuCAqLwogICAgcHVibGljIGZ1bmN0aW9uIGF2ZXJhZ2VDb21wYW55U3RhdCgpIHsKICAgICAgICAkZGVwQ291bnQgPSBjb3VudCgkdGhpcy0+ZGVwYXJ0bWVudHMpOwogICAgICAgICRzdGF0aXN0aWMgPSAkdGhpcy0+dG90YWxDb21wYW55U3RhdCgpOwoKICAgICAgICAkYXZlcmFnZVN0YXQgPSBbJ25hbWUnID0+ICfQodGA0LXQtNC90LXQtScsCiAgICAgICAgICAgICdtb25leScgPT4gMCwKICAgICAgICAgICAgJ2NvZmZlZScgPT4gMCwKICAgICAgICAgICAgJ3BhZ2VzJyA9PiAwLAogICAgICAgICAgICAnYXZlcmFnZScgPT4gMF07CgogICAgICAgICRhdmVyYWdlU3RhdFsnY291bnQnXSA9IHJvdW5kKCRzdGF0aXN0aWNbJ2NvdW50J10gLyAkZGVwQ291bnQsIDEpOwogICAgICAgICRhdmVyYWdlU3RhdFsnbW9uZXknXSA9IHJvdW5kKCRzdGF0aXN0aWNbJ21vbmV5J10gLyAkZGVwQ291bnQsIDEpOwogICAgICAgICRhdmVyYWdlU3RhdFsnY29mZmVlJ10gPSByb3VuZCgkc3RhdGlzdGljWydjb2ZmZWUnXSAvICRkZXBDb3VudCwgMSk7CiAgICAgICAgJGF2ZXJhZ2VTdGF0WydwYWdlcyddID0gcm91bmQoJHN0YXRpc3RpY1sncGFnZXMnXSAvICRkZXBDb3VudCwgMSk7CiAgICAgICAgJGF2ZXJhZ2VTdGF0WydhdmVyYWdlJ10gPSByb3VuZCgkc3RhdGlzdGljWydtb25leSddIC8gJHN0YXRpc3RpY1sncGFnZXMnXSwgMSk7CiAgICAgICAgcmV0dXJuICRhdmVyYWdlU3RhdDsKICAgIH0KCn0KCi8qINCh0L7Qt9C00LDRkdC8INC60L7QvNC/0LDQvdC40Y4g0Lgg0LTQvtCx0LDQstC70Y/QtdC8INCyINC90LXRkSDQtNC10L/QsNGA0YLQsNC80LXQvdGC0YsgKi8KJGNvbXBhbnkgPSBuZXcgQ29tcGFueSgi0JLQtdC60YLQvtGAIik7CgokZGVwID0gbmV3IERlcGFydG1lbnQoItCX0LDQutGD0L/QvtC6Iik7CiRkZXAxID0gbmV3IERlcGFydG1lbnQoItCf0YDQvtC00LDQtiIpOwokZGVwMiA9IG5ldyBEZXBhcnRtZW50KCLQoNC10LrQu9Cw0LzRiyIpOwokZGVwMyA9IG5ldyBEZXBhcnRtZW50KCLQm9C+0LPQuNGB0YLQuNC60LgiKTsKCiRjb21wYW55LT5hZGREZXBhcnRtZW50KCRkZXApOwokY29tcGFueS0+YWRkRGVwYXJ0bWVudCgkZGVwMSk7CiRjb21wYW55LT5hZGREZXBhcnRtZW50KCRkZXAyKTsKJGNvbXBhbnktPmFkZERlcGFydG1lbnQoJGRlcDMpOwoKJGRlcC0+Y3JlYXRlRW1wbG95ZWUoRW1wbG95ZWU6OlRZUEVfRU1QTE9ZRUVTWydtYW5hZ2VyJ10sICIxIiwgIjAiLCAiOSIpOwokZGVwLT5jcmVhdGVFbXBsb3llZShFbXBsb3llZTo6VFlQRV9FTVBMT1lFRVNbJ21hbmFnZXInXSwgIjIiLCAiMCIsICIzIik7CiRkZXAtPmNyZWF0ZUVtcGxveWVlKEVtcGxveWVlOjpUWVBFX0VNUExPWUVFU1snbWFuYWdlciddLCAiMyIsICIwIiwgIjIiKTsKJGRlcC0+Y3JlYXRlRW1wbG95ZWUoRW1wbG95ZWU6OlRZUEVfRU1QTE9ZRUVTWydtYXJrZXRlciddLCAiMSIsICIwIiwgIjIiKTsKJGRlcC0+Y3JlYXRlRW1wbG95ZWUoRW1wbG95ZWU6OlRZUEVfRU1QTE9ZRUVTWydtYW5hZ2VyJ10sICIyIiwgIjEiLCAiMSIpOwoKJGRlcDEtPmNyZWF0ZUVtcGxveWVlKEVtcGxveWVlOjpUWVBFX0VNUExPWUVFU1snbWFuYWdlciddLCAiMSIsICIwIiwgIjEyIik7CiRkZXAxLT5jcmVhdGVFbXBsb3llZShFbXBsb3llZTo6VFlQRV9FTVBMT1lFRVNbJ21hcmtldGVyJ10sICIxIiwgIjAiLCAiNiIpOwokZGVwMS0+Y3JlYXRlRW1wbG95ZWUoRW1wbG95ZWU6OlRZUEVfRU1QTE9ZRUVTWydhbmFseXRpYyddLCAiMSIsICIwIiwgIjMiKTsKJGRlcDEtPmNyZWF0ZUVtcGxveWVlKEVtcGxveWVlOjpUWVBFX0VNUExPWUVFU1snYW5hbHl0aWMnXSwgIjIiLCAiMCIsICIyIik7CiRkZXAxLT5jcmVhdGVFbXBsb3llZShFbXBsb3llZTo6VFlQRV9FTVBMT1lFRVNbJ21hcmtldGVyJ10sICIyIiwgIjEiLCAiMSIpOwoKJGRlcDItPmNyZWF0ZUVtcGxveWVlKEVtcGxveWVlOjpUWVBFX0VNUExPWUVFU1snbWFya2V0ZXInXSwgIjEiLCAiMCIsICIxNSIpOwokZGVwMi0+Y3JlYXRlRW1wbG95ZWUoRW1wbG95ZWU6OlRZUEVfRU1QTE9ZRUVTWydtYXJrZXRlciddLCAiMiIsICIwIiwgIjEwIik7CiRkZXAyLT5jcmVhdGVFbXBsb3llZShFbXBsb3llZTo6VFlQRV9FTVBMT1lFRVNbJ21hbmFnZXInXSwgIjEiLCAiMCIsICI4Iik7CiRkZXAyLT5jcmVhdGVFbXBsb3llZShFbXBsb3llZTo6VFlQRV9FTVBMT1lFRVNbJ2VuZ2luZWVyJ10sICIxIiwgIjAiLCAiMiIpOwokZGVwMi0+Y3JlYXRlRW1wbG95ZWUoRW1wbG95ZWU6OlRZUEVfRU1QTE9ZRUVTWydtYXJrZXRlciddLCAiMyIsICIxIiwgIjEiKTsKCiRkZXAzLT5jcmVhdGVFbXBsb3llZShFbXBsb3llZTo6VFlQRV9FTVBMT1lFRVNbJ21hbmFnZXInXSwgIjEiLCAiMCIsICIxMyIpOwokZGVwMy0+Y3JlYXRlRW1wbG95ZWUoRW1wbG95ZWU6OlRZUEVfRU1QTE9ZRUVTWydtYW5hZ2VyJ10sICIyIiwgIjAiLCAiNSIpOwokZGVwMy0+Y3JlYXRlRW1wbG95ZWUoRW1wbG95ZWU6OlRZUEVfRU1QTE9ZRUVTWydlbmdpbmVlciddLCAiMSIsICIwIiwgIjUiKTsKJGRlcDMtPmNyZWF0ZUVtcGxveWVlKEVtcGxveWVlOjpUWVBFX0VNUExPWUVFU1snbWFuYWdlciddLCAiMSIsICIxIiwgIjEiKTsKCgokY29tcGFueVN0YXQgPSAkY29tcGFueS0+Z2V0Q29tcGFueVN0YXQoKTsKJHRvdGFsU3RhdCA9ICRjb21wYW55LT50b3RhbENvbXBhbnlTdGF0KCk7CiRhdmVyYWdlU3RhdCA9ICRjb21wYW55LT5hdmVyYWdlQ29tcGFueVN0YXQoKTsKCi8qINCS0YvQstC+0LQg0LjQvdGE0L7RgNC80LDRhtC40LggKi8KJGNvbDEgPSAxNTsKJGNvbDIgPSAxMDsKCi8qINCX0LDQs9C+0LvQvtCy0L7QuiAqLwplY2hvIHBhZExlZnQoItCU0LXQv9Cw0YDRgtCw0LzQtdC90YIiLCAkY29sMSkgLgogICAgcGFkTGVmdCgi0YHQvtGC0YAuIiwgJGNvbDIpIC4KICAgIHBhZExlZnQoItGC0YPQs9GALiIsICRjb2wyKSAuCiAgICBwYWRMZWZ0KCLQutC+0YTQtSIsICRjb2wyKSAuCiAgICBwYWRMZWZ0KCLRgdGC0YAuIiwgJGNvbDIpIC4KICAgIHBhZExlZnQoItGC0YPQs9GALi/RgdGC0YAuIiwgJGNvbDIpIC4gIlxuXG4iOwoKLyog0J/QtdGA0LXQsdC+0YAg0LTQtdC/0LDRgNGC0LDQvNC10L3RgtC+0LIgKi8KZm9yZWFjaCAoJGNvbXBhbnlTdGF0IGFzICRpdGVtKSB7CiAgICBlY2hvIHBhZExlZnQoJGl0ZW1bJ25hbWUnXSwkY29sMSkgLgogICAgICAgIHBhZExlZnQoJGl0ZW1bJ2NvdW50J10sICRjb2wyKSAuCiAgICAgICAgcGFkTGVmdCgkaXRlbVsnbW9uZXknXSwgJGNvbDIpIC4KICAgICAgICBwYWRMZWZ0KCRpdGVtWydjb2ZmZWUnXSwgJGNvbDIpIC4KICAgICAgICBwYWRMZWZ0KCRpdGVtWydwYWdlcyddLCAkY29sMikgLgogICAgICAgIHBhZExlZnQoJGl0ZW1bJ2F2ZXJhZ2UnXSwgJGNvbDIpIC4gIlxuIjsKfQovKiDQktGB0LXQs9C+ICovCmVjaG8gcGFkTGVmdCgkdG90YWxTdGF0WyduYW1lJ10sJGNvbDEpIC4KICAgIHBhZExlZnQoJHRvdGFsU3RhdFsnY291bnQnXSwgJGNvbDIpIC4KICAgIHBhZExlZnQoJHRvdGFsU3RhdFsnbW9uZXknXSwgJGNvbDIpIC4KICAgIHBhZExlZnQoJHRvdGFsU3RhdFsnY29mZmVlJ10sICRjb2wyKSAuCiAgICBwYWRMZWZ0KCR0b3RhbFN0YXRbJ3BhZ2VzJ10sICRjb2wyKSAuICJcbiI7CgovKiDQodGA0LXQtNC90LXQtSAqLwplY2hvIHBhZExlZnQoJGF2ZXJhZ2VTdGF0WyduYW1lJ10sJGNvbDEpIC4KICAgIHBhZExlZnQoJGF2ZXJhZ2VTdGF0Wydjb3VudCddLCAkY29sMikgLgogICAgcGFkTGVmdCgkYXZlcmFnZVN0YXRbJ21vbmV5J10sICRjb2wyKSAuCiAgICBwYWRMZWZ0KCRhdmVyYWdlU3RhdFsnY29mZmVlJ10sICRjb2wyKSAuCiAgICBwYWRMZWZ0KCRhdmVyYWdlU3RhdFsncGFnZXMnXSwgJGNvbDIpIC4KICAgIHBhZExlZnQoJGF2ZXJhZ2VTdGF0WydhdmVyYWdlJ10sICRjb2wyKTsKCmZ1bmN0aW9uIHBhZExlZnQoJHZhbHVlLCAkY29sKXsKICAgICRjb3VudCA9IGljb252X3N0cmxlbigkdmFsdWUpOyAvLyBtYl9zdHJsZW4g0L3QtSDRgNCw0LHQvtGC0LDQtdGCCiAgICBpZiAoJGNvbCA+ICRjb3VudCkgewogICAgICAgICR2YWx1ZSA9ICR2YWx1ZSAuIHN0cl9yZXBlYXQoIiAiLCAkY29sIC0gJGNvdW50KTsKICAgIH0KICAgIHJldHVybiAkdmFsdWU7Cn0K