<?php
abstract class Employee
{
public function __construct($amountOfCoffe, $salary, $rank)
{
$this->amountOfCoffe = $amountOfCoffe;
$this->salary = $salary;
$this->rank = $rank;
}
public function getSalaryFromRank()
{
if($this->rank == 3){
$rankSalary = $this->salary + ($this->salary * 0.5);
} elseif ($this->rank == 2){
$rankSalary = $this->salary + ($this->salary * 0.25);
} elseif ($this->rank == 1){
$rankSalary = $this->salary;
} else {
echo 'SHIEEEEEEET';
}
return $rankSalary;
}
}
class Boss extends Employee
{
public function getBossSalary()
{
$bossSalary = $this->getSalaryFromRank() + ($this->getSalaryFromRank() * 0.5);
return $bossSalary;
}
public function getBossCoffeConsumption()
{
$bossCoffeConsumption = $this->amountOfCoffe * 2;
return $bossCoffeConsumption;
}
}
class Worker extends Employee
{
public $reports;
public $blueprints;
public $mainReports;
public function getWorkerSalary()
{
$workerSalary = $this->getSalaryFromRank();
return $workerSalary;
}
}
class Manager extends Worker
{
public $reports = 200;
}
class Engeneer extends Worker
{
public $blueprints = 50;
}
class Analyst extends Worker
{
public $mainReports = 5;
}
class Marcketolog extends Worker
{
public $reports = 150;
}
function countAllWorkers ($array) {
$workersInDepartment = count($array[1]) + 1; return $workersInDepartment;
}
function countAllSalary ($array) {
$departmentSalary = 0;
$departmentSalary += $array[0]->getBossSalary();
foreach ($array[1] as $worker) {
$departmentSalary += $worker->getWorkerSalary();
}
return $departmentSalary;
}
function departmentCoffeConsumption ($array) {
$departmentCoffe = 0;
$departmentCoffe += $array[0]->getBossCoffeConsumption();
foreach ($array[1] as $worker) {
$departmentCoffe += $worker->amountOfCoffe;
}
return $departmentCoffe;
}
function countDepartmentReports ($array) {
$departmentReports = 0;
foreach ($array[1] as $worker) {
$departmentReports += $worker->reports;
}
return $departmentReports;
}
function countDepartmentMainReports ($array) {
$departmentMainReports = 0;
foreach ($array[1] as $worker) {
$departmentMainReports += $worker->mainReports;
}
return $departmentMainReports;
}
function countDepartmentBlueprints ($array) {
$departmentBlueprints = 0;
foreach ($array[1] as $worker) {
$departmentBlueprints += $worker->blueprints;
}
return $departmentBlueprints;
}
function allPages ($array) {
$departmentPages = countDepartmentBlueprints ($array) + countDepartmentReports ($array) + countDepartmentMainReports ($array);
return $departmentPages;
}
function pageCost ($array) {
$pagesMoneyRatio = 0;
$pagesMoneyRatio = countAllSalary($array) / allPages($array);
return $pagesMoneyRatio = round($pagesMoneyRatio, 2);
}
function totalEmployees($array) {
$totalWorkers = 0;
foreach ($array as $department) {
$totalWorkers += countAllWorkers($department);
}
return $totalWorkers;
}
function totalSalary ($array) {
$departmentsSalary = 0;
foreach ($array as $department) {
$departmentsSalary += $department[0]->getBossSalary();
foreach ($department[1] as $worker) {
$departmentsSalary += $worker->getWorkerSalary();
}
}
return $departmentsSalary;
}
function totalCoffe ($array) {
$departmentsCoffe = 0;
foreach ($array as $department) {
$departmentsCoffe += $department[0]->getBossCoffeConsumption();
foreach ($department[1] as $worker) {
$departmentsCoffe += $worker->amountOfCoffe;
}
}
return $departmentsCoffe;
}
function totalPages ($array) {
$departmentsPages = 0;
foreach ($array as $department) {
$departmentsPages += allPages($department);
}
return $departmentsPages;
}
function totalPageCost ($array) {
$departmentsMoneyPagesRatio = 0;
$departmentsMoneyPagesRatio = totalSalary($array) / totalPages($array);
return $departmentsMoneyPagesRatio = round($departmentsMoneyPagesRatio, 2);
}
function avarageEmployees ($array) {
$avarageEmployees = 0;
$avarageEmployees = totalEmployees
($array) / count($array); return $avarageEmployees = round($avarageEmployees); }
function avarageSalary ($array) {
$avarageSalary = 0;
$avarageSalary = totalSalary
($array) / count($array); return $avarageSalary = round($avarageSalary, 2);
}
function avaragePages ($array) {
$avaragePages = 0;
$avaragePages = totalPages
($array) / count($array); return $avaragePages = round($avaragePages);
}
function avarageCoffe ($array) {
$avarageCoffe = 0;
$avarageCoffe = totalCoffe
($array) / count($array); return $avarageCoffe = round($avarageCoffe, 1);
}
function avaragePageCost ($array) {
$avaragePageCost = 0;
$avaragePageCost = totalSalary($array) / totalPages($array);
return $avaragePageCost = round($avaragePageCost, 2);
}
function padRight($string, $length)
{
$string = str_pad ($string, $length, " "); return $string;
}
function padLeft($string, $length)
{
$string = str_pad ($string, $length, " ", STR_PAD_LEFT
); return $string;
}
$MarketingBoss = new Boss(20, 500, 3);
$logisticBoss = new Boss(20, 500, 1);
$sellersBoss = new Boss(20, 500, 2);
$purhaseBoss = new Boss(20, 500, 2);
$purchaseDepartmentWorkers = [
$pDM1 = new Manager(20, 500, 1),
$pDM2 = new Manager(20, 500, 1),
$pDM3 = new Manager(20, 500, 1),
$pDM4 = new Manager(20, 500, 1),
$pDM5 = new Manager(20, 500, 1),
$pDM6 = new Manager(20, 500, 1),
$pDM7 = new Manager(20, 500, 1),
$pDM8 = new Manager(20, 500, 1),
$pDM9 = new Manager(20, 500, 1),
$pDM10 = new Manager(20, 500, 2),
$pDM11 = new Manager(20, 500, 2),
$pDM12 = new Manager(20, 500, 2),
$pDM13 = new Manager(20, 500, 3),
$pDM14 = new Manager(20, 500, 3),
$pDMa1 = new Marcketolog(15, 400, 1),
$pDMa2 = new Marcketolog(15, 400, 1),
];
$sellersDepartmentWorkers = [
$sDM1 = new Manager(20, 500, 1),
$sDM2 = new Manager(20, 500, 1),
$sDM3 = new Manager(20, 500, 1),
$sDM4 = new Manager(20, 500, 1),
$sDM5 = new Manager(20, 500, 1),
$sDM6 = new Manager(20, 500, 1),
$sDM7 = new Manager(20, 500, 1),
$sDM8 = new Manager(20, 500, 1),
$sDM9 = new Manager(20, 500, 1),
$sDM10 = new Manager(20, 500, 1),
$sDM11 = new Manager(20, 500, 1),
$sDM12 = new Manager(20, 500, 1),
$sDMa1 = new Marcketolog(15, 400, 1),
$sDMa2 = new Marcketolog(15, 400, 1),
$sDMa3 = new Marcketolog(15, 400, 1),
$sDMa4 = new Marcketolog(15, 400, 1),
$sDMa5 = new Marcketolog(15, 400, 1),
$sDMa6 = new Marcketolog(15, 400, 1),
$sDAn1 = new Analyst(50, 800, 1),
$sDAn2 = new Analyst(50, 800, 1),
$sDAn3 = new Analyst(50, 800, 1),
$sDAn4 = new Analyst(50, 800, 2),
$sDAn5 = new Analyst(50, 800, 2),
];
$marketingDepartmentWorkers = [
$mDMa1 = new Marcketolog(15, 400, 1),
$mDMa2 = new Marcketolog(15, 400, 1),
$mDMa3 = new Marcketolog(15, 400, 1),
$mDMa4 = new Marcketolog(15, 400, 1),
$mDMa5 = new Marcketolog(15, 400, 1),
$mDMa6 = new Marcketolog(15, 400, 1),
$mDMa7 = new Marcketolog(15, 400, 1),
$mDMa8 = new Marcketolog(15, 400, 1),
$mDMa9 = new Marcketolog(15, 400, 1),
$mDMa10 = new Marcketolog(15, 400, 1),
$mDMa11 = new Marcketolog(15, 400, 1),
$mDMa12 = new Marcketolog(15, 400, 1),
$mDMa13 = new Marcketolog(15, 400, 1),
$mDMa14 = new Marcketolog(15, 400, 1),
$mDMa15 = new Marcketolog(15, 400, 1),
$mDMa16 = new Marcketolog(15, 400, 2),
$mDMa17 = new Marcketolog(15, 400, 2),
$mDMa18 = new Marcketolog(15, 400, 2),
$mDMa19 = new Marcketolog(15, 400, 2),
$mDMa20 = new Marcketolog(15, 400, 2),
$mDMa21 = new Marcketolog(15, 400, 2),
$mDMa22 = new Marcketolog(15, 400, 2),
$mDMa23 = new Marcketolog(15, 400, 2),
$mDMa24 = new Marcketolog(15, 400, 2),
$mDMa25 = new Marcketolog(15, 400, 2),
$mDM1 = new Manager(20, 500, 1),
$mDM2 = new Manager(20, 500, 1),
$mDM3 = new Manager(20, 500, 1),
$mDM4 = new Manager(20, 500, 1),
$mDM5 = new Manager(20, 500, 1),
$mDM6 = new Manager(20, 500, 1),
$mDM7 = new Manager(20, 500, 1),
$mDM8 = new Manager(20, 500, 1),
$mDEn1 = new Engeneer(5, 200, 1),
$mDEn2 = new Engeneer(5, 200, 1),
];
$logisticDepartmentWorkers = [
$lDM1 = new Manager(15, 500, 1),
$lDM2 = new Manager(20, 500, 1),
$lDM3 = new Manager(20, 500, 1),
$lDM4 = new Manager(20, 500, 1),
$lDM5 = new Manager(20, 500, 1),
$lDM6 = new Manager(20, 500, 1),
$lDM7 = new Manager(20, 500, 1),
$lDM8 = new Manager(20, 500, 1),
$lDM9 = new Manager(20, 500, 1),
$lDM10 = new Manager(20, 500, 1),
$lDM11 = new Manager(20, 500, 1),
$lDM12 = new Manager(20, 500, 1),
$lDM13 = new Manager(20, 500, 1),
$lDM14 = new Manager(20, 500, 2),
$lDM15 = new Manager(20, 500, 2),
$lDM16 = new Manager(20, 500, 2),
$lDM17 = new Manager(20, 500, 2),
$lDM18 = new Manager(20, 500, 2),
$lDEn1 = new Engeneer(5, 200, 1),
$lDEn2 = new Engeneer(5, 200, 1),
$lDEn3 = new Engeneer(5, 200, 1),
$lDEn4 = new Engeneer(5, 200, 1),
$lDEn5 = new Engeneer(5, 200, 1),
];
$purchaseDepartment = [$purhaseBoss, $purchaseDepartmentWorkers];
$sellersDepartment = [$sellersBoss, $sellersDepartmentWorkers];
$marketingDepartment = [$MarketingBoss, $marketingDepartmentWorkers];
$logisticDepartment = [$logisticBoss, $logisticDepartmentWorkers];
$departments = [ "Purchase" => $purchaseDepartment,
"Sellers" => $sellersDepartment,
"Marketing" => $marketingDepartment,
"Logistic" =>$logisticDepartment];
$col1 = 20;
$col2 = 10;
$col3 = 10;
$col4 = 10;
$col5 = 10;
$col6 = 10;
echo padRight("Department", $col1) .
padLeft("Employees", $col2) .
padLeft("Salary", $col3) .
padLeft("Coffe", $col4) .
padLeft("Pages", $col5) .
padLeft("Page cost", $col6) . "\n";
foreach($departments as $department){
echo padRight
(key($department), $col1) . padLeft(countAllWorkers($department), $col2) .
padLeft(countAllSalary($department), $col3) .
padLeft(departmentCoffeConsumption($department), $col4) .
padLeft(allPages($department), $col5) .
padLeft(pageCost($department), $col6) . "\n";
}
echo padRight("Total", $col1) .
padLeft(totalEmployees($departments), $col2) .
padLeft(totalSalary($departments), $col3) .
padLeft(totalCoffe($departments), $col4) .
padLeft(totalPages($departments), $col5) .
padLeft(" ", $col6) . "\n";
echo padRight("Avarage", $col1) .
padLeft(avarageEmployees($departments), $col2) .
padLeft(avarageSalary($departments), $col3) .
padLeft(avarageCoffe($departments), $col4) .
padLeft(avaragePages($departments), $col5) .
padLeft(avaragePageCost($departments), $col6) . "\n";
/*
foreach($departments as $department) {
echo str_repeat("_", 60) . "</br>";
echo "Boss Salary: " . $department[0]->getBossSalary() . "\n" .
"Boss coffe consumption " . $department[0]->getBossCoffeConsumption() . "\n" .
"Boss rank: " . $department[0]->rank . "</br>";
foreach ($department[1] as $worker) {
echo "Salary:" . $worker->getWorkerSalary() . "\n" .
"Coffe consumption: " . $worker->amountOfCoffe . "\n" .
"Rank: " . $worker->rank . "</br>";
}
echo str_repeat("_", 60) . "</br>";
}
*/
/*
echo "Purchase Department" . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "NumberOfWorkers: " . countAllWorkers($purchaseDepartment) . "</br>";
echo "Total department salary: " . countAllSalary($purchaseDepartment) . "</br>";
echo "Total department coffe consumption: " . departmentCoffeConsumption($purchaseDepartment) . "</br>";
echo "Reports: " . countDepartmentReports($purchaseDepartment) . "</br>";
echo "Main reports: " . countDepartmentMainReports($purchaseDepartment) . "</br>";
echo "Blueprints: " . countDepartmentBlueprints($purchaseDepartment) . "</br>";
echo "All pages: " . allPages($purchaseDepartment) . "</br>";
echo "Cost of one page: " . pagesToMoneyRatio($purchaseDepartment) . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "Sellers Department" . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "NumberOfWorkers: " . countAllWorkers($sellersDepartment) . "</br>";
echo "Total department salary: " . countAllSalary($sellersDepartment) . "</br>";
echo "Total department coffe consumption: " . departmentCoffeConsumption($sellersDepartment) . "</br>";
echo "Reports: " . countDepartmentReports($sellersDepartment) . "</br>";
echo "Main reports: " . countDepartmentMainReports($sellersDepartment) . "</br>";
echo "Blueprints: " . countDepartmentBlueprints($sellersDepartment) . "</br>";
echo "All pages: " . allPages($sellersDepartment) . "</br>";
echo "Cost of one page: " . pagesToMoneyRatio($sellersDepartment) . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "Marketing Department" . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "NumberOfWorkers: " . countAllWorkers($marketingDepartment) . "</br>";
echo "Total department salary: " . countAllSalary($marketingDepartment) . "</br>";
echo "Total department coffe consumption: " . departmentCoffeConsumption($marketingDepartment) . "</br>";
echo "Reports: " . countDepartmentReports($marketingDepartment) . "</br>";
echo "Main reports: " . countDepartmentMainReports($marketingDepartment) . "</br>";
echo "Blueprints: " . countDepartmentBlueprints($marketingDepartment) . "</br>";
echo "All pages: " . allPages($marketingDepartment) . "</br>";
echo "Cost of one page: " . pagesToMoneyRatio($marketingDepartment) . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "Logistic Department" . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "NumberOfWorkers: " . countAllWorkers($logisticDepartment) . "</br>";
echo "Total department salary: " . countAllSalary($logisticDepartment) . "</br>";
echo "Total department coffe consumption: " . departmentCoffeConsumption($logisticDepartment) . "</br>";
echo "Reports: " . countDepartmentReports($logisticDepartment) . "</br>";
echo "Main reports: " . countDepartmentMainReports($logisticDepartment) . "</br>";
echo "Blueprints: " . countDepartmentBlueprints($logisticDepartment) . "</br>";
echo "All pages: " . allPages($logisticDepartment) . "</br>";
echo "Cost of one page: " . pagesToMoneyRatio($logisticDepartment) . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "Total employees: " . totalEmployees($departments) . "</br>";
echo "Total Salary: " . totalSalary($departments) . "</br>";
echo "Total Coffe: " . totalCoffe($departments) . "</br>";
echo "Total Pages: " . totalPages($departments) . "</br>";
echo "Total cost of one page: " . totalMonyPagesRation($departments) . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "Avarage employees: " . AvarageEmployees($departments) . "</br>";
echo "Avarage salary: " . avarageSalary($departments) . "</br>";
echo "Avarage coffe: " . avarageCoffe($departments) . "</br>";
echo "Avarage pages: " . avaragePages($departments) . "</br>";
echo "Avarage page cost: " . avaragePageCost($departments) . "</br>";
*/
PD9waHAKIAphYnN0cmFjdCBjbGFzcyBFbXBsb3llZQp7CiAKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYW1vdW50T2ZDb2ZmZSwgJHNhbGFyeSwgJHJhbmspCiAgICB7CiAKICAgICAgICAkdGhpcy0+YW1vdW50T2ZDb2ZmZSA9ICRhbW91bnRPZkNvZmZlOwogICAgICAgICR0aGlzLT5zYWxhcnkgPSAkc2FsYXJ5OwogICAgICAgICR0aGlzLT5yYW5rID0gJHJhbms7CiAKICAgIH0KIAogICAgcHVibGljIGZ1bmN0aW9uIGdldFNhbGFyeUZyb21SYW5rKCkKICAgIHsKIAogICAgICAgIGlmKCR0aGlzLT5yYW5rID09IDMpewogICAgICAgICAgICAkcmFua1NhbGFyeSA9ICR0aGlzLT5zYWxhcnkgKyAoJHRoaXMtPnNhbGFyeSAqIDAuNSk7CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5yYW5rID09IDIpewogICAgICAgICAgICAkcmFua1NhbGFyeSA9ICR0aGlzLT5zYWxhcnkgKyAoJHRoaXMtPnNhbGFyeSAqIDAuMjUpOwogICAgICAgIH0gZWxzZWlmICgkdGhpcy0+cmFuayA9PSAxKXsKICAgICAgICAgICAgJHJhbmtTYWxhcnkgPSAkdGhpcy0+c2FsYXJ5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gJ1NISUVFRUVFRUVUJzsKICAgICAgICB9CiAgICAgIHJldHVybiAkcmFua1NhbGFyeTsKICAgIH0KIAp9CiAKY2xhc3MgQm9zcyBleHRlbmRzIEVtcGxveWVlCnsKIAogICAgcHVibGljIGZ1bmN0aW9uIGdldEJvc3NTYWxhcnkoKQogICAgewogCiAgICAgICAgJGJvc3NTYWxhcnkgPSAkdGhpcy0+Z2V0U2FsYXJ5RnJvbVJhbmsoKSArICgkdGhpcy0+Z2V0U2FsYXJ5RnJvbVJhbmsoKSAqIDAuNSk7CiAgICAgICAgcmV0dXJuICRib3NzU2FsYXJ5OwogCiAgICB9CiAKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRCb3NzQ29mZmVDb25zdW1wdGlvbigpCiAgICB7CiAKICAgICAgICAkYm9zc0NvZmZlQ29uc3VtcHRpb24gPSAkdGhpcy0+YW1vdW50T2ZDb2ZmZSAqIDI7CiAgICAgICAgcmV0dXJuICRib3NzQ29mZmVDb25zdW1wdGlvbjsKIAogICAgfQogCn0KIApjbGFzcyBXb3JrZXIgZXh0ZW5kcyBFbXBsb3llZQp7ICAKICAgIHB1YmxpYyAkcmVwb3J0czsKICAgIHB1YmxpYyAkYmx1ZXByaW50czsKICAgIHB1YmxpYyAkbWFpblJlcG9ydHM7CiAKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRXb3JrZXJTYWxhcnkoKQogICAgewogCiAgICAgICAgJHdvcmtlclNhbGFyeSA9ICR0aGlzLT5nZXRTYWxhcnlGcm9tUmFuaygpOwogICAgICAgIHJldHVybiAkd29ya2VyU2FsYXJ5OwogCiAgICB9CiAKIAp9CiAKY2xhc3MgTWFuYWdlciBleHRlbmRzIFdvcmtlcgp7CiAKICAgIHB1YmxpYyAkcmVwb3J0cyA9IDIwMDsKIAp9CiAKY2xhc3MgRW5nZW5lZXIgZXh0ZW5kcyBXb3JrZXIKewogCiAgICBwdWJsaWMgJGJsdWVwcmludHMgPSA1MDsKIAp9CiAKY2xhc3MgQW5hbHlzdCBleHRlbmRzIFdvcmtlcgp7CiAKICAgIHB1YmxpYyAkbWFpblJlcG9ydHMgPSA1OwogCn0KIApjbGFzcyBNYXJja2V0b2xvZyBleHRlbmRzIFdvcmtlcgp7CiAKICAgIHB1YmxpYyAkcmVwb3J0cyA9IDE1MDsKIAp9CiAKIAogCmZ1bmN0aW9uIGNvdW50QWxsV29ya2VycyAoJGFycmF5KSB7CiAKICAgICR3b3JrZXJzSW5EZXBhcnRtZW50ID0gY291bnQoJGFycmF5WzFdKSArIDE7CiAgICByZXR1cm4gJHdvcmtlcnNJbkRlcGFydG1lbnQ7CiAKfQogCmZ1bmN0aW9uIGNvdW50QWxsU2FsYXJ5ICgkYXJyYXkpIHsKIAogICAgJGRlcGFydG1lbnRTYWxhcnkgPSAwOwogICAgJGRlcGFydG1lbnRTYWxhcnkgKz0gJGFycmF5WzBdLT5nZXRCb3NzU2FsYXJ5KCk7CiAgICAgICAgZm9yZWFjaCAoJGFycmF5WzFdIGFzICR3b3JrZXIpIHsKICAgICAgICAgICAgJGRlcGFydG1lbnRTYWxhcnkgKz0gJHdvcmtlci0+Z2V0V29ya2VyU2FsYXJ5KCk7ICAgIAogICAgICAgIH0KICAgIHJldHVybiAkZGVwYXJ0bWVudFNhbGFyeTsKfQogCmZ1bmN0aW9uIGRlcGFydG1lbnRDb2ZmZUNvbnN1bXB0aW9uICgkYXJyYXkpIHsKIAogICAgJGRlcGFydG1lbnRDb2ZmZSA9IDA7CiAgICAkZGVwYXJ0bWVudENvZmZlICs9ICRhcnJheVswXS0+Z2V0Qm9zc0NvZmZlQ29uc3VtcHRpb24oKTsKICAgIGZvcmVhY2ggKCRhcnJheVsxXSBhcyAkd29ya2VyKSB7CiAgICAgICAgICAgICRkZXBhcnRtZW50Q29mZmUgKz0gJHdvcmtlci0+YW1vdW50T2ZDb2ZmZTsgICAgCiAgICAgICAgfQogICAgcmV0dXJuICRkZXBhcnRtZW50Q29mZmU7Cn0KIApmdW5jdGlvbiBjb3VudERlcGFydG1lbnRSZXBvcnRzICgkYXJyYXkpIHsKIAogICAgJGRlcGFydG1lbnRSZXBvcnRzID0gMDsKICAgIGZvcmVhY2ggKCRhcnJheVsxXSBhcyAkd29ya2VyKSB7CiAgICAgICAgJGRlcGFydG1lbnRSZXBvcnRzICs9ICR3b3JrZXItPnJlcG9ydHM7IAogICAgfQogICAgcmV0dXJuICRkZXBhcnRtZW50UmVwb3J0czsKfQogCmZ1bmN0aW9uIGNvdW50RGVwYXJ0bWVudE1haW5SZXBvcnRzICgkYXJyYXkpIHsKIAogICAgJGRlcGFydG1lbnRNYWluUmVwb3J0cyA9IDA7CiAgICBmb3JlYWNoICgkYXJyYXlbMV0gYXMgJHdvcmtlcikgewogICAgICAgICRkZXBhcnRtZW50TWFpblJlcG9ydHMgKz0gJHdvcmtlci0+bWFpblJlcG9ydHM7IAogICAgfQogICAgcmV0dXJuICRkZXBhcnRtZW50TWFpblJlcG9ydHM7Cn0KIApmdW5jdGlvbiBjb3VudERlcGFydG1lbnRCbHVlcHJpbnRzICgkYXJyYXkpIHsKIAogICAgJGRlcGFydG1lbnRCbHVlcHJpbnRzID0gMDsKICAgIGZvcmVhY2ggKCRhcnJheVsxXSBhcyAkd29ya2VyKSB7CiAgICAgICAgJGRlcGFydG1lbnRCbHVlcHJpbnRzICs9ICR3b3JrZXItPmJsdWVwcmludHM7IAogICAgfQogICAgcmV0dXJuICRkZXBhcnRtZW50Qmx1ZXByaW50czsKfQogCmZ1bmN0aW9uIGFsbFBhZ2VzICgkYXJyYXkpIHsKIAogICAgJGRlcGFydG1lbnRQYWdlcyA9IGNvdW50RGVwYXJ0bWVudEJsdWVwcmludHMgKCRhcnJheSkgKyBjb3VudERlcGFydG1lbnRSZXBvcnRzICgkYXJyYXkpICsgY291bnREZXBhcnRtZW50TWFpblJlcG9ydHMgKCRhcnJheSk7CiAgICByZXR1cm4gJGRlcGFydG1lbnRQYWdlczsKIAp9CiAKZnVuY3Rpb24gcGFnZUNvc3QgKCRhcnJheSkgewogCiAgICAkcGFnZXNNb25leVJhdGlvID0gMDsKICAgICRwYWdlc01vbmV5UmF0aW8gPSBjb3VudEFsbFNhbGFyeSgkYXJyYXkpIC8gYWxsUGFnZXMoJGFycmF5KTsKICAgIHJldHVybiAkcGFnZXNNb25leVJhdGlvID0gcm91bmQoJHBhZ2VzTW9uZXlSYXRpbywgMik7CiAKfQogCmZ1bmN0aW9uIHRvdGFsRW1wbG95ZWVzKCRhcnJheSkgewogCiAgICAkdG90YWxXb3JrZXJzID0gMDsKICAgIGZvcmVhY2ggKCRhcnJheSBhcyAkZGVwYXJ0bWVudCkgewogICAgICAgICR0b3RhbFdvcmtlcnMgKz0gY291bnRBbGxXb3JrZXJzKCRkZXBhcnRtZW50KTsKICAgIH0KICAgIHJldHVybiAkdG90YWxXb3JrZXJzOwogCn0KIApmdW5jdGlvbiB0b3RhbFNhbGFyeSAoJGFycmF5KSB7CiAKICAgICRkZXBhcnRtZW50c1NhbGFyeSA9IDA7CiAgICBmb3JlYWNoICgkYXJyYXkgYXMgICRkZXBhcnRtZW50KSB7CiAgICAkZGVwYXJ0bWVudHNTYWxhcnkgKz0gICRkZXBhcnRtZW50WzBdLT5nZXRCb3NzU2FsYXJ5KCk7CiAgICAgICAgZm9yZWFjaCAoJGRlcGFydG1lbnRbMV0gYXMgJHdvcmtlcikgewogICAgICAgICAgICAkZGVwYXJ0bWVudHNTYWxhcnkgKz0gICR3b3JrZXItPmdldFdvcmtlclNhbGFyeSgpOyAgICAKICAgICAgICB9CiAgICB9ICAgIAogICAgcmV0dXJuICRkZXBhcnRtZW50c1NhbGFyeTsgICAKfQogCmZ1bmN0aW9uIHRvdGFsQ29mZmUgKCRhcnJheSkgewogCiAgICAkZGVwYXJ0bWVudHNDb2ZmZSA9IDA7CiAgICBmb3JlYWNoICgkYXJyYXkgYXMgICRkZXBhcnRtZW50KSB7CiAgICAkZGVwYXJ0bWVudHNDb2ZmZSArPSAkZGVwYXJ0bWVudFswXS0+Z2V0Qm9zc0NvZmZlQ29uc3VtcHRpb24oKTsKICAgIGZvcmVhY2ggKCRkZXBhcnRtZW50WzFdIGFzICR3b3JrZXIpIHsKICAgICAgICAgICAgJGRlcGFydG1lbnRzQ29mZmUgKz0gJHdvcmtlci0+YW1vdW50T2ZDb2ZmZTsgICAgCiAgICAgICAgfQogICAgfSAgICAKICAgIHJldHVybiAkZGVwYXJ0bWVudHNDb2ZmZTsKIAp9CiAKZnVuY3Rpb24gIHRvdGFsUGFnZXMgKCRhcnJheSkgewogCiAgICAkZGVwYXJ0bWVudHNQYWdlcyA9IDA7CiAgICBmb3JlYWNoICgkYXJyYXkgYXMgJGRlcGFydG1lbnQpIHsKICAgICAgICAkZGVwYXJ0bWVudHNQYWdlcyArPSBhbGxQYWdlcygkZGVwYXJ0bWVudCk7CiAgICB9CiAgICByZXR1cm4gJGRlcGFydG1lbnRzUGFnZXM7CiAKfQogCmZ1bmN0aW9uIHRvdGFsUGFnZUNvc3QgKCRhcnJheSkgewogCiAgICAkZGVwYXJ0bWVudHNNb25leVBhZ2VzUmF0aW8gPSAwOwogCiAgICAgICAgJGRlcGFydG1lbnRzTW9uZXlQYWdlc1JhdGlvID0gdG90YWxTYWxhcnkoJGFycmF5KSAvIHRvdGFsUGFnZXMoJGFycmF5KTsgCiAKICAgIHJldHVybiAkZGVwYXJ0bWVudHNNb25leVBhZ2VzUmF0aW8gPSByb3VuZCgkZGVwYXJ0bWVudHNNb25leVBhZ2VzUmF0aW8sIDIpOwogCn0KIApmdW5jdGlvbiBhdmFyYWdlRW1wbG95ZWVzICgkYXJyYXkpIHsKIAogICAgJGF2YXJhZ2VFbXBsb3llZXMgPSAwOwogICAgJGF2YXJhZ2VFbXBsb3llZXMgPSB0b3RhbEVtcGxveWVlcygkYXJyYXkpIC8gY291bnQoJGFycmF5KTsKICAgIHJldHVybiAkYXZhcmFnZUVtcGxveWVlcyA9IHJvdW5kKCRhdmFyYWdlRW1wbG95ZWVzKTsKfQogCmZ1bmN0aW9uICBhdmFyYWdlU2FsYXJ5ICgkYXJyYXkpIHsKIAogICAgJGF2YXJhZ2VTYWxhcnkgPSAwOwogICAgJGF2YXJhZ2VTYWxhcnkgPSB0b3RhbFNhbGFyeSgkYXJyYXkpIC8gY291bnQoJGFycmF5KTsKICAgIHJldHVybiAkYXZhcmFnZVNhbGFyeSA9IHJvdW5kKCRhdmFyYWdlU2FsYXJ5LCAyKTsKIAp9CiAKZnVuY3Rpb24gYXZhcmFnZVBhZ2VzICgkYXJyYXkpIHsKIAogICAgJGF2YXJhZ2VQYWdlcyA9IDA7CiAgICAkYXZhcmFnZVBhZ2VzID0gdG90YWxQYWdlcygkYXJyYXkpIC8gY291bnQoJGFycmF5KTsKICAgIHJldHVybiAkYXZhcmFnZVBhZ2VzID0gcm91bmQoJGF2YXJhZ2VQYWdlcyk7CiAKfQogCmZ1bmN0aW9uIGF2YXJhZ2VDb2ZmZSAoJGFycmF5KSB7CiAKICAgICRhdmFyYWdlQ29mZmUgPSAwOwogICAgJGF2YXJhZ2VDb2ZmZSA9IHRvdGFsQ29mZmUoJGFycmF5KSAvIGNvdW50KCRhcnJheSk7CiAgICByZXR1cm4gJGF2YXJhZ2VDb2ZmZSA9IHJvdW5kKCRhdmFyYWdlQ29mZmUsIDEpOwogCn0KIApmdW5jdGlvbiBhdmFyYWdlUGFnZUNvc3QgKCRhcnJheSkgewogCiAgICAkYXZhcmFnZVBhZ2VDb3N0ID0gMDsKICAgICRhdmFyYWdlUGFnZUNvc3QgPSB0b3RhbFNhbGFyeSgkYXJyYXkpIC8gdG90YWxQYWdlcygkYXJyYXkpOwogICAgcmV0dXJuICRhdmFyYWdlUGFnZUNvc3QgPSByb3VuZCgkYXZhcmFnZVBhZ2VDb3N0LCAyKTsKIAp9CiAKZnVuY3Rpb24gcGFkUmlnaHQoJHN0cmluZywgJGxlbmd0aCkKeyAKIAogICAgJHN0cmluZyA9IHN0cl9wYWQgKCRzdHJpbmcsICRsZW5ndGgsICIgIik7CiAgICByZXR1cm4gJHN0cmluZzsKIAp9CiAKZnVuY3Rpb24gcGFkTGVmdCgkc3RyaW5nLCAkbGVuZ3RoKQp7CiAKICAgICRzdHJpbmcgPSBzdHJfcGFkICgkc3RyaW5nLCAkbGVuZ3RoLCAiICIsIFNUUl9QQURfTEVGVCk7CiAgICByZXR1cm4gJHN0cmluZzsKIAp9CiAKIAokTWFya2V0aW5nQm9zcyA9IG5ldyBCb3NzKDIwLCA1MDAsIDMpOwokbG9naXN0aWNCb3NzID0gbmV3IEJvc3MoMjAsIDUwMCwgMSk7CiRzZWxsZXJzQm9zcyA9IG5ldyBCb3NzKDIwLCA1MDAsIDIpOwokcHVyaGFzZUJvc3MgPSBuZXcgQm9zcygyMCwgNTAwLCAyKTsKIAokcHVyY2hhc2VEZXBhcnRtZW50V29ya2VycyA9IFsKICAgICRwRE0xID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkcERNMiA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJHBETTMgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRwRE00ID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkcERNNSA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJHBETTYgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRwRE03ID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkcERNOCA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJHBETTkgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRwRE0xMCA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDIpLAogICAgJHBETTExID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMiksCiAgICAkcERNMTIgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAyKSwKICAgICRwRE0xMyA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDMpLAogICAgJHBETTE0ID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMyksCiAgICAkcERNYTEgPSBuZXcgTWFyY2tldG9sb2coMTUsIDQwMCwgMSksCiAgICAkcERNYTIgPSBuZXcgTWFyY2tldG9sb2coMTUsIDQwMCwgMSksCiAgXTsKIAokc2VsbGVyc0RlcGFydG1lbnRXb3JrZXJzID0gWwogICAgJHNETTEgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRzRE0yID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkc0RNMyA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJHNETTQgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRzRE01ID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkc0RNNiA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJHNETTcgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRzRE04ID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkc0RNOSA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJHNETTEwID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkc0RNMTEgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRzRE0xMiA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJHNETWExID0gbmV3IE1hcmNrZXRvbG9nKDE1LCA0MDAsIDEpLAogICAgJHNETWEyID0gbmV3IE1hcmNrZXRvbG9nKDE1LCA0MDAsIDEpLAogICAgJHNETWEzID0gbmV3IE1hcmNrZXRvbG9nKDE1LCA0MDAsIDEpLAogICAgJHNETWE0ID0gbmV3IE1hcmNrZXRvbG9nKDE1LCA0MDAsIDEpLAogICAgJHNETWE1ID0gbmV3IE1hcmNrZXRvbG9nKDE1LCA0MDAsIDEpLAogICAgJHNETWE2ID0gbmV3IE1hcmNrZXRvbG9nKDE1LCA0MDAsIDEpLAogICAgJHNEQW4xID0gbmV3IEFuYWx5c3QoNTAsIDgwMCwgMSksCiAgICAkc0RBbjIgPSBuZXcgQW5hbHlzdCg1MCwgODAwLCAxKSwKICAgICRzREFuMyA9IG5ldyBBbmFseXN0KDUwLCA4MDAsIDEpLAogICAgJHNEQW40ID0gbmV3IEFuYWx5c3QoNTAsIDgwMCwgMiksCiAgICAkc0RBbjUgPSBuZXcgQW5hbHlzdCg1MCwgODAwLCAyKSwKIApdOwogCiRtYXJrZXRpbmdEZXBhcnRtZW50V29ya2VycyA9IFsKICAgICRtRE1hMSA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAxKSwKICAgICRtRE1hMiA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAxKSwKICAgICRtRE1hMyA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAxKSwKICAgICRtRE1hNCA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAxKSwKICAgICRtRE1hNSA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAxKSwKICAgICRtRE1hNiA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAxKSwKICAgICRtRE1hNyA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAxKSwKICAgICRtRE1hOCA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAxKSwKICAgICRtRE1hOSA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAxKSwKICAgICRtRE1hMTAgPSBuZXcgTWFyY2tldG9sb2coMTUsIDQwMCwgMSksCiAgICAkbURNYTExID0gbmV3IE1hcmNrZXRvbG9nKDE1LCA0MDAsIDEpLAogICAgJG1ETWExMiA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAxKSwKICAgICRtRE1hMTMgPSBuZXcgTWFyY2tldG9sb2coMTUsIDQwMCwgMSksCiAgICAkbURNYTE0ID0gbmV3IE1hcmNrZXRvbG9nKDE1LCA0MDAsIDEpLAogICAgJG1ETWExNSA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAxKSwKICAgICRtRE1hMTYgPSBuZXcgTWFyY2tldG9sb2coMTUsIDQwMCwgMiksCiAgICAkbURNYTE3ID0gbmV3IE1hcmNrZXRvbG9nKDE1LCA0MDAsIDIpLAogICAgJG1ETWExOCA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAyKSwKICAgICRtRE1hMTkgPSBuZXcgTWFyY2tldG9sb2coMTUsIDQwMCwgMiksCiAgICAkbURNYTIwID0gbmV3IE1hcmNrZXRvbG9nKDE1LCA0MDAsIDIpLAogICAgJG1ETWEyMSA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAyKSwKICAgICRtRE1hMjIgPSBuZXcgTWFyY2tldG9sb2coMTUsIDQwMCwgMiksCiAgICAkbURNYTIzID0gbmV3IE1hcmNrZXRvbG9nKDE1LCA0MDAsIDIpLAogICAgJG1ETWEyNCA9IG5ldyBNYXJja2V0b2xvZygxNSwgNDAwLCAyKSwKICAgICRtRE1hMjUgPSBuZXcgTWFyY2tldG9sb2coMTUsIDQwMCwgMiksCiAgICAkbURNMSA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJG1ETTIgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRtRE0zID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkbURNNCA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJG1ETTUgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRtRE02ID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkbURNNyA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJG1ETTggPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRtREVuMSA9IG5ldyBFbmdlbmVlcig1LCAyMDAsIDEpLAogICAgJG1ERW4yID0gbmV3IEVuZ2VuZWVyKDUsIDIwMCwgMSksCl07CiAKJGxvZ2lzdGljRGVwYXJ0bWVudFdvcmtlcnMgPSBbCiAgICAkbERNMSA9IG5ldyBNYW5hZ2VyKDE1LCA1MDAsIDEpLAogICAgJGxETTIgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRsRE0zID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkbERNNCA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJGxETTUgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRsRE02ID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkbERNNyA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJGxETTggPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRsRE05ID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkbERNMTAgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRsRE0xMSA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDEpLAogICAgJGxETTEyID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMSksCiAgICAkbERNMTMgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAxKSwKICAgICRsRE0xNCA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDIpLAogICAgJGxETTE1ID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMiksCiAgICAkbERNMTYgPSBuZXcgTWFuYWdlcigyMCwgNTAwLCAyKSwKICAgICRsRE0xNyA9IG5ldyBNYW5hZ2VyKDIwLCA1MDAsIDIpLAogICAgJGxETTE4ID0gbmV3IE1hbmFnZXIoMjAsIDUwMCwgMiksCiAgICAkbERFbjEgPSBuZXcgRW5nZW5lZXIoNSwgMjAwLCAxKSwKICAgICRsREVuMiA9IG5ldyBFbmdlbmVlcig1LCAyMDAsIDEpLAogICAgJGxERW4zID0gbmV3IEVuZ2VuZWVyKDUsIDIwMCwgMSksCiAgICAkbERFbjQgPSBuZXcgRW5nZW5lZXIoNSwgMjAwLCAxKSwKICAgICRsREVuNSA9IG5ldyBFbmdlbmVlcig1LCAyMDAsIDEpLApdOwogCiRwdXJjaGFzZURlcGFydG1lbnQgPSBbJHB1cmhhc2VCb3NzLCAkcHVyY2hhc2VEZXBhcnRtZW50V29ya2Vyc107CiRzZWxsZXJzRGVwYXJ0bWVudCA9IFskc2VsbGVyc0Jvc3MsICRzZWxsZXJzRGVwYXJ0bWVudFdvcmtlcnNdOwokbWFya2V0aW5nRGVwYXJ0bWVudCA9IFskTWFya2V0aW5nQm9zcywgJG1hcmtldGluZ0RlcGFydG1lbnRXb3JrZXJzXTsKJGxvZ2lzdGljRGVwYXJ0bWVudCA9IFskbG9naXN0aWNCb3NzLCAkbG9naXN0aWNEZXBhcnRtZW50V29ya2Vyc107CiAKJGRlcGFydG1lbnRzID0gWyAiUHVyY2hhc2UiID0+ICRwdXJjaGFzZURlcGFydG1lbnQsIAoJCQkJICJTZWxsZXJzIiA9PiAkc2VsbGVyc0RlcGFydG1lbnQsCgkJCQkgIk1hcmtldGluZyIgPT4gJG1hcmtldGluZ0RlcGFydG1lbnQsIAoJCQkJICJMb2dpc3RpYyIgPT4kbG9naXN0aWNEZXBhcnRtZW50XTsKIAokY29sMSA9IDIwOwokY29sMiA9IDEwOwokY29sMyA9IDEwOwokY29sNCA9IDEwOwokY29sNSA9IDEwOwokY29sNiA9IDEwOwogCiAKZWNobyBwYWRSaWdodCgiRGVwYXJ0bWVudCIsICRjb2wxKSAuCiAgICAgcGFkTGVmdCgiRW1wbG95ZWVzIiwgJGNvbDIpIC4KICAgICBwYWRMZWZ0KCJTYWxhcnkiLCAkY29sMykgLgogICAgIHBhZExlZnQoIkNvZmZlIiwgJGNvbDQpIC4KICAgICBwYWRMZWZ0KCJQYWdlcyIsICRjb2w1KSAuCiAgICAgcGFkTGVmdCgiUGFnZSBjb3N0IiwgJGNvbDYpIC4gIlxuIjsKIAplY2hvIHN0cl9yZXBlYXQoIl8iLCA4MCkgLiAiXG4iOwogCmZvcmVhY2goJGRlcGFydG1lbnRzIGFzICRkZXBhcnRtZW50KXsKICAgIGVjaG8gcGFkUmlnaHQoa2V5KCRkZXBhcnRtZW50KSwgJGNvbDEpIC4KICAgICAgICAgcGFkTGVmdChjb3VudEFsbFdvcmtlcnMoJGRlcGFydG1lbnQpLCAkY29sMikgLgogICAgICAgICBwYWRMZWZ0KGNvdW50QWxsU2FsYXJ5KCRkZXBhcnRtZW50KSwgJGNvbDMpIC4KICAgICAgICAgcGFkTGVmdChkZXBhcnRtZW50Q29mZmVDb25zdW1wdGlvbigkZGVwYXJ0bWVudCksICRjb2w0KSAuCiAgICAgICAgIHBhZExlZnQoYWxsUGFnZXMoJGRlcGFydG1lbnQpLCAkY29sNSkgLgogICAgICAgICBwYWRMZWZ0KHBhZ2VDb3N0KCRkZXBhcnRtZW50KSwgJGNvbDYpIC4gIlxuIjsKfQogCmVjaG8gc3RyX3JlcGVhdCgiXyIsIDgwKSAuICJcbiI7CiAKZWNobyBwYWRSaWdodCgiVG90YWwiLCAkY29sMSkgLgogICAgIHBhZExlZnQodG90YWxFbXBsb3llZXMoJGRlcGFydG1lbnRzKSwgJGNvbDIpIC4KICAgICBwYWRMZWZ0KHRvdGFsU2FsYXJ5KCRkZXBhcnRtZW50cyksICRjb2wzKSAuCiAgICAgcGFkTGVmdCh0b3RhbENvZmZlKCRkZXBhcnRtZW50cyksICRjb2w0KSAuCiAgICAgcGFkTGVmdCh0b3RhbFBhZ2VzKCRkZXBhcnRtZW50cyksICRjb2w1KSAuCiAgICAgcGFkTGVmdCgiICIsICRjb2w2KSAuICJcbiI7CiAKZWNobyBzdHJfcmVwZWF0KCJfIiwgODApIC4gIlxuIjsKIAplY2hvIHBhZFJpZ2h0KCJBdmFyYWdlIiwgJGNvbDEpIC4KICAgICBwYWRMZWZ0KGF2YXJhZ2VFbXBsb3llZXMoJGRlcGFydG1lbnRzKSwgJGNvbDIpIC4KICAgICBwYWRMZWZ0KGF2YXJhZ2VTYWxhcnkoJGRlcGFydG1lbnRzKSwgJGNvbDMpIC4KICAgICBwYWRMZWZ0KGF2YXJhZ2VDb2ZmZSgkZGVwYXJ0bWVudHMpLCAkY29sNCkgLgogICAgIHBhZExlZnQoYXZhcmFnZVBhZ2VzKCRkZXBhcnRtZW50cyksICRjb2w1KSAuCiAgICAgcGFkTGVmdChhdmFyYWdlUGFnZUNvc3QoJGRlcGFydG1lbnRzKSwgJGNvbDYpIC4gIlxuIjsKIAovKgpmb3JlYWNoKCRkZXBhcnRtZW50cyBhcyAkZGVwYXJ0bWVudCkgewogICAgICAgIGVjaG8gc3RyX3JlcGVhdCgiXyIsIDYwKSAuICI8L2JyPiI7CiAgICAgICAgZWNobyAiQm9zcyBTYWxhcnk6ICIgLiAkZGVwYXJ0bWVudFswXS0+Z2V0Qm9zc1NhbGFyeSgpIC4gIlxuIiAuCiAgICAgICAgICAgICAiQm9zcyBjb2ZmZSBjb25zdW1wdGlvbiAiIC4gJGRlcGFydG1lbnRbMF0tPmdldEJvc3NDb2ZmZUNvbnN1bXB0aW9uKCkgLiAiXG4iIC4KICAgICAgICAgICAgICJCb3NzIHJhbms6ICIgLiAkZGVwYXJ0bWVudFswXS0+cmFuayAuICI8L2JyPiI7CiAgICAgICAgZm9yZWFjaCAoJGRlcGFydG1lbnRbMV0gYXMgJHdvcmtlcikgewogICAgICAgICAgICBlY2hvICJTYWxhcnk6IiAuICR3b3JrZXItPmdldFdvcmtlclNhbGFyeSgpIC4gIlxuIiAuCiAgICAgICAgICAgICAgICAgIkNvZmZlIGNvbnN1bXB0aW9uOiAiIC4gJHdvcmtlci0+YW1vdW50T2ZDb2ZmZSAuICJcbiIgLgogICAgICAgICAgICAgICAgICJSYW5rOiAiIC4gJHdvcmtlci0+cmFuayAuICI8L2JyPiI7ICAgCiAgICAgICAgfQogICAgICAgIGVjaG8gc3RyX3JlcGVhdCgiXyIsIDYwKSAuICI8L2JyPiI7CiAgICB9CiovCiAKLyoKZWNobyAiUHVyY2hhc2UgRGVwYXJ0bWVudCIgLiAiPC9icj4iOwplY2hvIHN0cl9yZXBlYXQoIl8iLCA2MCkgLiAiPC9icj4iOwplY2hvICJOdW1iZXJPZldvcmtlcnM6ICIgLiBjb3VudEFsbFdvcmtlcnMoJHB1cmNoYXNlRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJUb3RhbCBkZXBhcnRtZW50IHNhbGFyeTogIiAuIGNvdW50QWxsU2FsYXJ5KCRwdXJjaGFzZURlcGFydG1lbnQpIC4gIjwvYnI+IjsKZWNobyAiVG90YWwgZGVwYXJ0bWVudCBjb2ZmZSBjb25zdW1wdGlvbjogIiAuIGRlcGFydG1lbnRDb2ZmZUNvbnN1bXB0aW9uKCRwdXJjaGFzZURlcGFydG1lbnQpIC4gIjwvYnI+IjsKZWNobyAiUmVwb3J0czogIiAuIGNvdW50RGVwYXJ0bWVudFJlcG9ydHMoJHB1cmNoYXNlRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJNYWluIHJlcG9ydHM6ICIgLiBjb3VudERlcGFydG1lbnRNYWluUmVwb3J0cygkcHVyY2hhc2VEZXBhcnRtZW50KSAuICI8L2JyPiI7CmVjaG8gIkJsdWVwcmludHM6ICIgLiBjb3VudERlcGFydG1lbnRCbHVlcHJpbnRzKCRwdXJjaGFzZURlcGFydG1lbnQpIC4gIjwvYnI+IjsKZWNobyAiQWxsIHBhZ2VzOiAiIC4gYWxsUGFnZXMoJHB1cmNoYXNlRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJDb3N0IG9mIG9uZSBwYWdlOiAiIC4gcGFnZXNUb01vbmV5UmF0aW8oJHB1cmNoYXNlRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvIHN0cl9yZXBlYXQoIl8iLCA2MCkgLiAiPC9icj4iOwogCiAKZWNobyAiU2VsbGVycyBEZXBhcnRtZW50IiAuICI8L2JyPiI7CmVjaG8gc3RyX3JlcGVhdCgiXyIsIDYwKSAuICI8L2JyPiI7CmVjaG8gIk51bWJlck9mV29ya2VyczogIiAuIGNvdW50QWxsV29ya2Vycygkc2VsbGVyc0RlcGFydG1lbnQpIC4gIjwvYnI+IjsKZWNobyAiVG90YWwgZGVwYXJ0bWVudCBzYWxhcnk6ICIgLiBjb3VudEFsbFNhbGFyeSgkc2VsbGVyc0RlcGFydG1lbnQpIC4gIjwvYnI+IjsKZWNobyAiVG90YWwgZGVwYXJ0bWVudCBjb2ZmZSBjb25zdW1wdGlvbjogIiAuIGRlcGFydG1lbnRDb2ZmZUNvbnN1bXB0aW9uKCRzZWxsZXJzRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJSZXBvcnRzOiAiIC4gY291bnREZXBhcnRtZW50UmVwb3J0cygkc2VsbGVyc0RlcGFydG1lbnQpIC4gIjwvYnI+IjsKZWNobyAiTWFpbiByZXBvcnRzOiAiIC4gY291bnREZXBhcnRtZW50TWFpblJlcG9ydHMoJHNlbGxlcnNEZXBhcnRtZW50KSAuICI8L2JyPiI7CmVjaG8gIkJsdWVwcmludHM6ICIgLiBjb3VudERlcGFydG1lbnRCbHVlcHJpbnRzKCRzZWxsZXJzRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJBbGwgcGFnZXM6ICIgLiBhbGxQYWdlcygkc2VsbGVyc0RlcGFydG1lbnQpIC4gIjwvYnI+IjsKZWNobyAiQ29zdCBvZiBvbmUgcGFnZTogIiAuIHBhZ2VzVG9Nb25leVJhdGlvKCRzZWxsZXJzRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvIHN0cl9yZXBlYXQoIl8iLCA2MCkgLiAiPC9icj4iOwogCmVjaG8gIk1hcmtldGluZyBEZXBhcnRtZW50IiAuICI8L2JyPiI7CmVjaG8gc3RyX3JlcGVhdCgiXyIsIDYwKSAuICI8L2JyPiI7CmVjaG8gIk51bWJlck9mV29ya2VyczogIiAuIGNvdW50QWxsV29ya2VycygkbWFya2V0aW5nRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJUb3RhbCBkZXBhcnRtZW50IHNhbGFyeTogIiAuIGNvdW50QWxsU2FsYXJ5KCRtYXJrZXRpbmdEZXBhcnRtZW50KSAuICI8L2JyPiI7CmVjaG8gIlRvdGFsIGRlcGFydG1lbnQgY29mZmUgY29uc3VtcHRpb246ICIgLiBkZXBhcnRtZW50Q29mZmVDb25zdW1wdGlvbigkbWFya2V0aW5nRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJSZXBvcnRzOiAiIC4gY291bnREZXBhcnRtZW50UmVwb3J0cygkbWFya2V0aW5nRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJNYWluIHJlcG9ydHM6ICIgLiBjb3VudERlcGFydG1lbnRNYWluUmVwb3J0cygkbWFya2V0aW5nRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJCbHVlcHJpbnRzOiAiIC4gY291bnREZXBhcnRtZW50Qmx1ZXByaW50cygkbWFya2V0aW5nRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJBbGwgcGFnZXM6ICIgLiBhbGxQYWdlcygkbWFya2V0aW5nRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJDb3N0IG9mIG9uZSBwYWdlOiAiIC4gcGFnZXNUb01vbmV5UmF0aW8oJG1hcmtldGluZ0RlcGFydG1lbnQpIC4gIjwvYnI+IjsKZWNobyBzdHJfcmVwZWF0KCJfIiwgNjApIC4gIjwvYnI+IjsKIAplY2hvICJMb2dpc3RpYyBEZXBhcnRtZW50IiAuICI8L2JyPiI7CmVjaG8gc3RyX3JlcGVhdCgiXyIsIDYwKSAuICI8L2JyPiI7CmVjaG8gIk51bWJlck9mV29ya2VyczogIiAuIGNvdW50QWxsV29ya2VycygkbG9naXN0aWNEZXBhcnRtZW50KSAuICI8L2JyPiI7CmVjaG8gIlRvdGFsIGRlcGFydG1lbnQgc2FsYXJ5OiAiIC4gY291bnRBbGxTYWxhcnkoJGxvZ2lzdGljRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJUb3RhbCBkZXBhcnRtZW50IGNvZmZlIGNvbnN1bXB0aW9uOiAiIC4gZGVwYXJ0bWVudENvZmZlQ29uc3VtcHRpb24oJGxvZ2lzdGljRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJSZXBvcnRzOiAiIC4gY291bnREZXBhcnRtZW50UmVwb3J0cygkbG9naXN0aWNEZXBhcnRtZW50KSAuICI8L2JyPiI7CmVjaG8gIk1haW4gcmVwb3J0czogIiAuIGNvdW50RGVwYXJ0bWVudE1haW5SZXBvcnRzKCRsb2dpc3RpY0RlcGFydG1lbnQpIC4gIjwvYnI+IjsKZWNobyAiQmx1ZXByaW50czogIiAuIGNvdW50RGVwYXJ0bWVudEJsdWVwcmludHMoJGxvZ2lzdGljRGVwYXJ0bWVudCkgLiAiPC9icj4iOwplY2hvICJBbGwgcGFnZXM6ICIgLiBhbGxQYWdlcygkbG9naXN0aWNEZXBhcnRtZW50KSAuICI8L2JyPiI7CmVjaG8gIkNvc3Qgb2Ygb25lIHBhZ2U6ICIgLiBwYWdlc1RvTW9uZXlSYXRpbygkbG9naXN0aWNEZXBhcnRtZW50KSAuICI8L2JyPiI7CmVjaG8gc3RyX3JlcGVhdCgiXyIsIDYwKSAuICI8L2JyPiI7CiAKZWNobyAiVG90YWwgZW1wbG95ZWVzOiAiIC4gdG90YWxFbXBsb3llZXMoJGRlcGFydG1lbnRzKSAuICI8L2JyPiI7CmVjaG8gIlRvdGFsIFNhbGFyeTogIiAuIHRvdGFsU2FsYXJ5KCRkZXBhcnRtZW50cykgLiAiPC9icj4iOwplY2hvICJUb3RhbCBDb2ZmZTogIiAuIHRvdGFsQ29mZmUoJGRlcGFydG1lbnRzKSAuICI8L2JyPiI7CmVjaG8gIlRvdGFsIFBhZ2VzOiAiIC4gdG90YWxQYWdlcygkZGVwYXJ0bWVudHMpIC4gIjwvYnI+IjsKZWNobyAiVG90YWwgY29zdCBvZiBvbmUgcGFnZTogIiAuIHRvdGFsTW9ueVBhZ2VzUmF0aW9uKCRkZXBhcnRtZW50cykgLiAiPC9icj4iOwplY2hvIHN0cl9yZXBlYXQoIl8iLCA2MCkgLiAiPC9icj4iOwogCmVjaG8gIkF2YXJhZ2UgZW1wbG95ZWVzOiAiIC4gQXZhcmFnZUVtcGxveWVlcygkZGVwYXJ0bWVudHMpIC4gIjwvYnI+IjsKZWNobyAiQXZhcmFnZSBzYWxhcnk6ICIgLiBhdmFyYWdlU2FsYXJ5KCRkZXBhcnRtZW50cykgLiAiPC9icj4iOwplY2hvICJBdmFyYWdlIGNvZmZlOiAiIC4gYXZhcmFnZUNvZmZlKCRkZXBhcnRtZW50cykgLiAiPC9icj4iOwplY2hvICJBdmFyYWdlIHBhZ2VzOiAiIC4gYXZhcmFnZVBhZ2VzKCRkZXBhcnRtZW50cykgLiAiPC9icj4iOwplY2hvICJBdmFyYWdlIHBhZ2UgY29zdDogIiAuIGF2YXJhZ2VQYWdlQ29zdCgkZGVwYXJ0bWVudHMpIC4gIjwvYnI+IjsKICovCiA=