<?php
error_reporting(-1);
header('Content-Type: text/html; charset=utf-8');
class Employee
{
public $department;
public $rang;
public $salary;
public $coffee;
public $pages;
public function __construct($department,$post,$rang,$salary, $coffee,$pages)
{
//
$this->department = $department;
$this->rang = $rang;
$this->post = $post;
$this->salary = $salary;
$this->coffee = $coffee;
$this->pages = $pages;
}
public function getSalary($post,$rang){
$salary=0;
$getMeSalary = function() use ($rang){
$salary = 0;
$me_base_salary=500;
if($rang==1){
$salary=$me_base_salary;
}
elseif($rang==2){
$salary=$me_base_salary+$me_base_salary*0.25;
}
elseif($rang==3){
$salary=$me_base_salary+$me_base_salary*0.5;
}
return $salary;
};
$getMaSalary = function() use ($rang){
$salary = 0;
$ma_base_salary=400;
if($this->rang==1){
$salary=$ma_base_salary;
}
elseif($this->rang==2){
$salary=$ma_base_salary+$ma_base_salary*0.25;
}
elseif($this->rang==3){
$salary=$ma_base_salary+$ma_base_salary*0.5;
}
return $salary;
};
$getDevSalary = function() use ($rang){
$salary = 0;
$dev_base_salary=200;
if($this->rang==1){
$salary=$dev_base_salary;
}
elseif($this->rang==2){
$salary=$dev_base_salary+$dev_base_salary*0.25;
}
elseif($this->rang==3){
$salary=$dev_base_salary+$dev_base_salary*0.5;
}
return $salary;
};
$getAnSalary = function() use ($rang){
$salary = 0;
$analytics_base_salary=800;
if($this->rang==1){
$salary=$analytics_base_salary;
}
elseif($this->rang==2){
$salary=$analytics_base_salary+$analytics_base_salary*0.25;
}
elseif($this->rang==3){
$salary=$analytics_base_salary+$analytics_base_salary*0.5;
}
return $salary;
};
if($this->post=='Менеджер'){
$salary=$getMeSalary($this->rang);
}
elseif($this->post=='Руководитель менеджер'){
$salary=$getMeSalary($this->rang);
$salary=$salary+ $salary*0.5;
}
elseif($this->post=='Маркетолог'){
$salary=$getMaSalary($this->rang);
}
elseif($this->post=='Руководитель маркетолог'){
$salary=$getMaSalary($this->rang);
$salary=$salary+ $salary*0.5;
}
elseif($this->post=='Инженер'){
$salary=$getDevSalary($this->rang);
}
elseif($this->post=='Руководитель инженер'){
$salary=$getAnSalary($this->rang);
$salary=$salary+ $salary*0.5;
}
return $salary;
}
public function getEmployeeStatsByDep($counter){
$count= count($counter);
return $count;
}
public function salarySummary($summary){
$summarySalary=0;
foreach($summary as $var ){
$summarySalary+=$var->salary;
}
return $summarySalary;
}
public function coffeeSummary($coffee){
$summaryCoffee=0;
foreach($coffee as $var ){
$summaryCoffee+=$var->coffee;
}
return $summaryCoffee;
}
public function pagesSummary($pages){
$summaryPages=0;
foreach($pages as $var ){
$summaryPages+=$var->pages;
}
return $summaryPages;
}
public function efficiency($salary,$pages){
return round($efficiency= $salary/$pages,1);
}
public function average($first,$second,$third,$fourth){
$departments=4;
$summ=$first+$second+$third+$fourth;
return round($summ/$departments,1);
}
public function summaryStats($employee){
$employeeSummary=0;
$salarySummary=0;
$coffeeSummary=0;
$pagesSummary=0;
$efficiencySummary=0;
foreach($employee as $employer){
$salarySummary+=$employer->salary;
$coffeeSummary+=$employer->coffee;
$pagesSummary+=$employer->pages;
$employeeSummary=$employeeSummary+1;
}
$result=array('Всего',$employeeSummary,$salarySummary,$coffeeSummary,$pagesSummary,round($salarySummary/$pagesSummary,1));
return $result;
}
}
$Employee = array(); //Все департаменты
$firstDep = array(); //Департамент закупок
$secondDep= array(); //Департамент продаж
$thirdDep = array(); //Департамент рекламы
$fourthDep= array(); //Департамент логистики
$finalStats=array(); //Конечный массив
for($i=0;$i<9;$i++){ //9×ме1
$app = new Employee('Департамент закупок','Менеджер',1,0,20,200);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($firstDep,$app);
}
for($i=0;$i<3;$i++){ //3×ме2
$app = new Employee('Департамент закупок','Менеджер',2,0,20,200);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($firstDep,$app);
}
for($i=0;$i<2;$i++){ //2×ме3
$app = new Employee('Департамент закупок','Менеджер',3,0,20,200);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($firstDep,$app);
}
for($i=0;$i<2;$i++){ //2×ма1
$app = new Employee('Департамент закупок','Маркетолог',1,0,15,150);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($firstDep,$app);
}
$app = new Employee('Департамент закупок','Руководитель менеджер',2,0,20*2,0);//руководитель департамента ме2
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($firstDep,$app);
//Департамент продаж
for($i=0;$i<12;$i++){ //12×ме1
$app = new Employee('Департамент продаж','Менеджер',1,0,20,200);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($secondDep,$app);
}
for($i=0;$i<6;$i++){ //6×ма1
$app = new Employee('Департамент продаж','Маркетолог',1,0,15,150);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($secondDep,$app);
}
for($i=0;$i<3;$i++){ //3×ан1
$app = new Employee('Департамент продаж','Аналитик',1,0,50,5);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($secondDep,$app);
}
for($i=0;$i<2;$i++){ //2×ан2
$app = new Employee('Департамент продаж','Аналитик',2,0,50,5);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($secondDep,$app);
}
//руководитель ма2
$app = new Employee('Департамент закупок','Руководитель маркетолог',2,0,15*2,0);//руководитель департамента ме2
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($secondDep,$app);
//Департамент рекламы
for($i=0;$i<15;$i++){ //15×ма1
$app = new Employee('Департамент рекламы','Маркетолог',1,0,15,150);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($thirdDep,$app);
}
for($i=0;$i<10;$i++){ //10×ма1
$app = new Employee('Департамент рекламы','Маркетолог',2,0,15,150);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($thirdDep,$app);
}
for($i=0;$i<8;$i++){ //8×ме1
$app = new Employee('Департамент рекламы','Менеджер',1,0,20,200);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($thirdDep,$app);
}
for($i=0;$i<2;$i++){ //2×ин1
$app = new Employee('Департамент рекламы','Инженер',1,0,5,50);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($thirdDep,$app);
}
//руководитель ма3
$app = new Employee('Департамент рекламы','Руководитель маркетолог',3,0,15*2,0);//руководитель департамента ме2
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($thirdDep,$app);
//Департамент логистики
for($i=0;$i<13;$i++){ //13×ме1
$app = new Employee('Департамент логистики','Менеджер',1,0,20,200);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($fourthDep,$app);
}
for($i=0;$i<5;$i++){ //5×ме1
$app = new Employee('Департамент логистики','Менеджер',2,0,20,200);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($fourthDep,$app);
}
for($i=0;$i<5;$i++){ //5×ин1
$app = new Employee('Департамент логистики','Инженер',1,0,5,50);
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($fourthDep,$app);
}
//руководитель ме1
$app = new Employee('Департамент логистики','Руководитель менеджер',1,0,20*2,0);//руководитель департамента ме2
$get_salary= $app->getSalary($app->post,$app->rang);
$app->salary=$get_salary;
array_push($fourthDep,$app);
//Число сотрудников по каждому департаменту
$firstDepStats=$app->getEmployeeStatsByDep($firstDep);
$secondDepStats=$app->getEmployeeStatsByDep($secondDep);
$thirdDepStats= $app->getEmployeeStatsByDep($thirdDep);
$fourthDepStats= $app->getEmployeeStatsByDep($fourthDep);
$Employee = array_merge($firstDep,$secondDep,$thirdDep,$fourthDep);
//Суммарная зарплата по департаменту
$summarySalaryFirstDep=$app->salarySummary($firstDep);
$summarySalarySecondDep=$app->salarySummary($secondDep);
$summarySalaryThirdDep=$app->salarySummary($thirdDep);
$summarySalaryFourthDep=$app->salarySummary($fourthDep);
//Суммарно выпито коффе по департаменту
$summaryCoffeeFirstDep=$app->coffeeSummary($firstDep);
$summaryCoffeeSecondDep=$app->coffeeSummary($secondDep);
$summaryCoffeeThirdDep=$app->coffeeSummary($thirdDep);
$summaryCoffeeFourthDep=$app->coffeeSummary($fourthDep);
//Суммарно страниц по департаменту
$summaryPagesFirstDep=$app->pagesSummary($firstDep);
$summaryPagesSecondDep=$app->pagesSummary($secondDep);
$summaryPagesThirdDep=$app->pagesSummary($thirdDep);
$summaryPagesFourthDep=$app->pagesSummary($fourthDep);
//Эффективность по департаменту
$efficiencyFirstDep=$app->efficiency($summarySalaryFirstDep,$summaryPagesFirstDep);
$efficiencySecondDep=$app->efficiency($summarySalarySecondDep,$summaryPagesSecondDep);
$efficiencyThirdDep=$app->efficiency($summarySalaryThirdDep,$summaryPagesThirdDep);
$efficiencyFourthDep=$app->efficiency($summarySalaryFourthDep,$summaryPagesFourthDep);
//Подсчет среднего
$averageEmployeeStat=$app->average($firstDepStats,$secondDepStats,$thirdDepStats,$fourthDepStats);
$averageSalaryStat=$app->average($summarySalaryFirstDep,$summarySalarySecondDep,$summarySalaryThirdDep,$summarySalaryFourthDep);
$averageCoffeeStat=$app->average($summaryCoffeeFirstDep,$summaryCoffeeSecondDep,$summaryCoffeeThirdDep,$summaryCoffeeFourthDep);
$averagePagesStat=$app->average($summaryPagesFirstDep,$summaryPagesSecondDep,$summaryPagesThirdDep,$summaryPagesFourthDep);
$averageEfficiency=$app->average($efficiencyFirstDep,$efficiencySecondDep,$efficiencyThirdDep,$efficiencyFourthDep);
//Конечный результат
$finalStatsFirstDep=array('Закупок',$firstDepStats,$summarySalaryFirstDep,$summaryCoffeeFirstDep,$summaryPagesFirstDep,$efficiencyFirstDep);
$finalStatsSecondDep=array('Продаж',$secondDepStats,$summarySalarySecondDep,$summaryCoffeeSecondDep,$summaryPagesSecondDep,$efficiencySecondDep);
$finalStatsThirdDep=array('Рекламы',$thirdDepStats,$summarySalaryThirdDep,$summaryCoffeeThirdDep,$summaryPagesThirdDep,$efficiencyThirdDep);
$finalStatsFourthDep=array('Логистики',$fourthDepStats,$summarySalaryFourthDep,$summaryCoffeeFourthDep,$summaryPagesFourthDep,$efficiencyFourthDep);
$averageStats= array('Среднее',$averageEmployeeStat,$averageSalaryStat,$averageCoffeeStat,$averagePagesStat,$averageEfficiency);
$summaryStats= $app->summaryStats($Employee);
?>
<table>
<thead>
<tr>
<td>Департамент</td>
<td>сотр.</td>
<td>тугр.</td>
<td>кофе</td>
<td>стр.</td>
<td>туг./стр.</td>
</tr>
</thead>
<tbody>
<tr>
<?php foreach ($finalStatsFirstDep as $key => $value):?>
<td><? echo $value?></td>
<?endforeach;?>
</tr>
<tr>
<?php foreach ($finalStatsSecondDep as $key => $value):?>
<td><? echo $value?></td>
<?endforeach;?>
</tr>
<tr>
<?php foreach ($finalStatsThirdDep as $key => $value):?>
<td><? echo $value?></td>
<?endforeach;?>
</tr>
<tr>
<?php foreach ($finalStatsFourthDep as $key => $value):?>
<td><? echo $value?></td>
<?endforeach;?>
</tr>
<tr>
<?php foreach ($averageStats as $key => $value):?>
<td><? echo $value?></td>
<?endforeach;?>
</tr>
<tr>
<?php foreach ($summaryStats as $key => $value):?>
<td><? echo $value?></td>
<?endforeach;?>
</tr>
</tbody>
</table>
PD9waHAKZXJyb3JfcmVwb3J0aW5nKC0xKTsKaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCcpOwpjbGFzcyBFbXBsb3llZQp7CiAgICBwdWJsaWMgJGRlcGFydG1lbnQ7CiAgICBwdWJsaWMgJHJhbmc7CiAgICBwdWJsaWMgJHNhbGFyeTsKICAgIHB1YmxpYyAkY29mZmVlOwogICAgcHVibGljICRwYWdlczsKCgoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZGVwYXJ0bWVudCwkcG9zdCwkcmFuZywkc2FsYXJ5LCAkY29mZmVlLCRwYWdlcykKICAgIHsKICAgICAgICAvLwogICAgICAgICAgJHRoaXMtPmRlcGFydG1lbnQgPSAkZGVwYXJ0bWVudDsKICAgICAgICAgICR0aGlzLT5yYW5nID0gJHJhbmc7CiAgICAgICAgICAkdGhpcy0+cG9zdCA9ICRwb3N0OwogICAgICAgICAgJHRoaXMtPnNhbGFyeSA9ICRzYWxhcnk7CiAgICAgICAgICAkdGhpcy0+Y29mZmVlID0gJGNvZmZlZTsKICAgICAgICAgICR0aGlzLT5wYWdlcyA9ICRwYWdlczsKICAgIH0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTYWxhcnkoJHBvc3QsJHJhbmcpewogICAgICAgICRzYWxhcnk9MDsKICAgICAgICAkZ2V0TWVTYWxhcnkgPSBmdW5jdGlvbigpIHVzZSAoJHJhbmcpewogICAgICAgICAgICAkc2FsYXJ5ID0gMDsKICAgICAgICAgICAgJG1lX2Jhc2Vfc2FsYXJ5PTUwMDsKICAgICAgICAgICAgaWYoJHJhbmc9PTEpewogICAgICAgICAgICAgICAgJHNhbGFyeT0kbWVfYmFzZV9zYWxhcnk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZWlmKCRyYW5nPT0yKXsKICAgICAgICAgICAgICAgICRzYWxhcnk9JG1lX2Jhc2Vfc2FsYXJ5KyRtZV9iYXNlX3NhbGFyeSowLjI1OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2VpZigkcmFuZz09Myl7CiAgICAgICAgICAgICAgICAkc2FsYXJ5PSRtZV9iYXNlX3NhbGFyeSskbWVfYmFzZV9zYWxhcnkqMC41OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkc2FsYXJ5OwogICAgICAgIH07CgogICAgICAgICRnZXRNYVNhbGFyeSA9IGZ1bmN0aW9uKCkgdXNlICgkcmFuZyl7CiAgICAgICAgICAgICRzYWxhcnkgPSAwOwogICAgICAgICAgICAkbWFfYmFzZV9zYWxhcnk9NDAwOwogICAgICAgICAgICBpZigkdGhpcy0+cmFuZz09MSl7CiAgICAgICAgICAgICAgICAkc2FsYXJ5PSRtYV9iYXNlX3NhbGFyeTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlaWYoJHRoaXMtPnJhbmc9PTIpewogICAgICAgICAgICAgICAgJHNhbGFyeT0kbWFfYmFzZV9zYWxhcnkrJG1hX2Jhc2Vfc2FsYXJ5KjAuMjU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZWlmKCR0aGlzLT5yYW5nPT0zKXsKICAgICAgICAgICAgICAgICRzYWxhcnk9JG1hX2Jhc2Vfc2FsYXJ5KyRtYV9iYXNlX3NhbGFyeSowLjU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRzYWxhcnk7CiAgICAgICAgfTsKCiAgICAgICAgJGdldERldlNhbGFyeSA9IGZ1bmN0aW9uKCkgdXNlICgkcmFuZyl7CiAgICAgICAgICAgICRzYWxhcnkgPSAwOwogICAgICAgICAgICAkZGV2X2Jhc2Vfc2FsYXJ5PTIwMDsKICAgICAgICAgICAgaWYoJHRoaXMtPnJhbmc9PTEpewogICAgICAgICAgICAgICAgJHNhbGFyeT0kZGV2X2Jhc2Vfc2FsYXJ5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2VpZigkdGhpcy0+cmFuZz09Mil7CiAgICAgICAgICAgICAgICAkc2FsYXJ5PSRkZXZfYmFzZV9zYWxhcnkrJGRldl9iYXNlX3NhbGFyeSowLjI1OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2VpZigkdGhpcy0+cmFuZz09Myl7CiAgICAgICAgICAgICAgICAkc2FsYXJ5PSRkZXZfYmFzZV9zYWxhcnkrJGRldl9iYXNlX3NhbGFyeSowLjU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRzYWxhcnk7CiAgICAgICAgfTsKCiAgICAgICAgJGdldEFuU2FsYXJ5ID0gZnVuY3Rpb24oKSB1c2UgKCRyYW5nKXsKICAgICAgICAgICAgJHNhbGFyeSA9IDA7CiAgICAgICAgICAgICRhbmFseXRpY3NfYmFzZV9zYWxhcnk9ODAwOwogICAgICAgICAgICBpZigkdGhpcy0+cmFuZz09MSl7CiAgICAgICAgICAgICAgICAkc2FsYXJ5PSRhbmFseXRpY3NfYmFzZV9zYWxhcnk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZWlmKCR0aGlzLT5yYW5nPT0yKXsKICAgICAgICAgICAgICAgICRzYWxhcnk9JGFuYWx5dGljc19iYXNlX3NhbGFyeSskYW5hbHl0aWNzX2Jhc2Vfc2FsYXJ5KjAuMjU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZWlmKCR0aGlzLT5yYW5nPT0zKXsKICAgICAgICAgICAgICAgICRzYWxhcnk9JGFuYWx5dGljc19iYXNlX3NhbGFyeSskYW5hbHl0aWNzX2Jhc2Vfc2FsYXJ5KjAuNTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHNhbGFyeTsKICAgICAgICB9OwoKCiAgICAgICAgaWYoJHRoaXMtPnBvc3Q9PSfQnNC10L3QtdC00LbQtdGAJyl7CiAgICAgICAgICAgICRzYWxhcnk9JGdldE1lU2FsYXJ5KCR0aGlzLT5yYW5nKTsKICAgICAgICB9CiAgICAgICAgZWxzZWlmKCR0aGlzLT5wb3N0PT0n0KDRg9C60L7QstC+0LTQuNGC0LXQu9GMINC80LXQvdC10LTQttC10YAnKXsKICAgICAgICAgICAgJHNhbGFyeT0kZ2V0TWVTYWxhcnkoJHRoaXMtPnJhbmcpOwogICAgICAgICAgICAkc2FsYXJ5PSRzYWxhcnkrICRzYWxhcnkqMC41OwogICAgICAgIH0KICAgICAgICBlbHNlaWYoJHRoaXMtPnBvc3Q9PSfQnNCw0YDQutC10YLQvtC70L7QsycpewogICAgICAgICAgICAkc2FsYXJ5PSRnZXRNYVNhbGFyeSgkdGhpcy0+cmFuZyk7CiAgICAgICAgfQogICAgICAgIGVsc2VpZigkdGhpcy0+cG9zdD09J9Cg0YPQutC+0LLQvtC00LjRgtC10LvRjCDQvNCw0YDQutC10YLQvtC70L7QsycpewogICAgICAgICAgICAkc2FsYXJ5PSRnZXRNYVNhbGFyeSgkdGhpcy0+cmFuZyk7CiAgICAgICAgICAgICRzYWxhcnk9JHNhbGFyeSsgJHNhbGFyeSowLjU7CiAgICAgICAgfQogICAgICAgIGVsc2VpZigkdGhpcy0+cG9zdD09J9CY0L3QttC10L3QtdGAJyl7CiAgICAgICAgICAgICRzYWxhcnk9JGdldERldlNhbGFyeSgkdGhpcy0+cmFuZyk7CiAgICAgICAgfQogICAgICAgIGVsc2VpZigkdGhpcy0+cG9zdD09J9Cg0YPQutC+0LLQvtC00LjRgtC10LvRjCDQuNC90LbQtdC90LXRgCcpewogICAgICAgICAgICAkc2FsYXJ5PSRnZXRBblNhbGFyeSgkdGhpcy0+cmFuZyk7CiAgICAgICAgICAgICRzYWxhcnk9JHNhbGFyeSsgJHNhbGFyeSowLjU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkc2FsYXJ5OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRFbXBsb3llZVN0YXRzQnlEZXAoJGNvdW50ZXIpewogICAgICAgICRjb3VudD0gY291bnQoJGNvdW50ZXIpOwogICAgICAgIHJldHVybiAkY291bnQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHNhbGFyeVN1bW1hcnkoJHN1bW1hcnkpewogICAgICAgICAgICAkc3VtbWFyeVNhbGFyeT0wOwogICAgICAgIGZvcmVhY2goJHN1bW1hcnkgYXMgJHZhciApewogICAgICAgICAgICAkc3VtbWFyeVNhbGFyeSs9JHZhci0+c2FsYXJ5OwogICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRzdW1tYXJ5U2FsYXJ5OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb2ZmZWVTdW1tYXJ5KCRjb2ZmZWUpewogICAgICAgICRzdW1tYXJ5Q29mZmVlPTA7CiAgICAgICAgZm9yZWFjaCgkY29mZmVlIGFzICR2YXIgKXsKICAgICAgICAgICAgJHN1bW1hcnlDb2ZmZWUrPSR2YXItPmNvZmZlZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRzdW1tYXJ5Q29mZmVlOwogICAgfQogICAgcHVibGljIGZ1bmN0aW9uIHBhZ2VzU3VtbWFyeSgkcGFnZXMpewogICAgICAgICRzdW1tYXJ5UGFnZXM9MDsKICAgICAgICBmb3JlYWNoKCRwYWdlcyBhcyAkdmFyICl7CiAgICAgICAgICAgICRzdW1tYXJ5UGFnZXMrPSR2YXItPnBhZ2VzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHN1bW1hcnlQYWdlczsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZWZmaWNpZW5jeSgkc2FsYXJ5LCRwYWdlcyl7CgogICAgICAgIHJldHVybiAgcm91bmQoJGVmZmljaWVuY3k9ICRzYWxhcnkvJHBhZ2VzLDEpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhdmVyYWdlKCRmaXJzdCwkc2Vjb25kLCR0aGlyZCwkZm91cnRoKXsKICAgICAgICAkZGVwYXJ0bWVudHM9NDsKICAgICAgICAkc3VtbT0kZmlyc3QrJHNlY29uZCskdGhpcmQrJGZvdXJ0aDsKICAgICAgICByZXR1cm4gcm91bmQoJHN1bW0vJGRlcGFydG1lbnRzLDEpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBzdW1tYXJ5U3RhdHMoJGVtcGxveWVlKXsKICAgICRlbXBsb3llZVN1bW1hcnk9MDsKICAgICRzYWxhcnlTdW1tYXJ5PTA7CiAgICAkY29mZmVlU3VtbWFyeT0wOwogICAgJHBhZ2VzU3VtbWFyeT0wOwogICAgJGVmZmljaWVuY3lTdW1tYXJ5PTA7CiAgICAgICAgZm9yZWFjaCgkZW1wbG95ZWUgYXMgJGVtcGxveWVyKXsKICAgICAgICAgICAgJHNhbGFyeVN1bW1hcnkrPSRlbXBsb3llci0+c2FsYXJ5OwogICAgICAgICAgICAkY29mZmVlU3VtbWFyeSs9JGVtcGxveWVyLT5jb2ZmZWU7CiAgICAgICAgICAgICRwYWdlc1N1bW1hcnkrPSRlbXBsb3llci0+cGFnZXM7CiAgICAgICAgICAgICRlbXBsb3llZVN1bW1hcnk9JGVtcGxveWVlU3VtbWFyeSsxOwogICAgICAgIH0KICAgICAkcmVzdWx0PWFycmF5KCfQktGB0LXQs9C+JywkZW1wbG95ZWVTdW1tYXJ5LCRzYWxhcnlTdW1tYXJ5LCRjb2ZmZWVTdW1tYXJ5LCRwYWdlc1N1bW1hcnkscm91bmQoJHNhbGFyeVN1bW1hcnkvJHBhZ2VzU3VtbWFyeSwxKSk7CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgoKfQoKJEVtcGxveWVlID0gYXJyYXkoKTsgICAgICAgIC8v0JLRgdC1INC00LXQv9Cw0YDRgtCw0LzQtdC90YLRiwokZmlyc3REZXAgPSBhcnJheSgpOyAgICAgICAgLy/QlNC10L/QsNGA0YLQsNC80LXQvdGCINC30LDQutGD0L/QvtC6CiRzZWNvbmREZXA9IGFycmF5KCk7ICAgICAgICAvL9CU0LXQv9Cw0YDRgtCw0LzQtdC90YIg0L/RgNC+0LTQsNC2CiR0aGlyZERlcCA9IGFycmF5KCk7ICAgICAgICAgLy/QlNC10L/QsNGA0YLQsNC80LXQvdGCINGA0LXQutC70LDQvNGLCiRmb3VydGhEZXA9IGFycmF5KCk7ICAgICAgICAvL9CU0LXQv9Cw0YDRgtCw0LzQtdC90YIg0LvQvtCz0LjRgdGC0LjQutC4CiRmaW5hbFN0YXRzPWFycmF5KCk7ICAgICAgICAvL9Ca0L7QvdC10YfQvdGL0Lkg0LzQsNGB0YHQuNCyCgpmb3IoJGk9MDskaTw5OyRpKyspeyAgICAgICAgLy85w5fQvNC1MQogICAgJGFwcCA9IG5ldyBFbXBsb3llZSgn0JTQtdC/0LDRgNGC0LDQvNC10L3RgiDQt9Cw0LrRg9C/0L7QuicsJ9Cc0LXQvdC10LTQttC10YAnLDEsMCwyMCwyMDApOwogICAgJGdldF9zYWxhcnk9ICRhcHAtPmdldFNhbGFyeSgkYXBwLT5wb3N0LCRhcHAtPnJhbmcpOwogICAgJGFwcC0+c2FsYXJ5PSRnZXRfc2FsYXJ5OwogICAgYXJyYXlfcHVzaCgkZmlyc3REZXAsJGFwcCk7Cn0KCmZvcigkaT0wOyRpPDM7JGkrKyl7ICAgICAgICAvLzPDl9C80LUyCiAgICAkYXBwID0gbmV3IEVtcGxveWVlKCfQlNC10L/QsNGA0YLQsNC80LXQvdGCINC30LDQutGD0L/QvtC6Jywn0JzQtdC90LXQtNC20LXRgCcsMiwwLDIwLDIwMCk7CiAgICAkZ2V0X3NhbGFyeT0gJGFwcC0+Z2V0U2FsYXJ5KCRhcHAtPnBvc3QsJGFwcC0+cmFuZyk7CiAgICAkYXBwLT5zYWxhcnk9JGdldF9zYWxhcnk7CiAgICBhcnJheV9wdXNoKCRmaXJzdERlcCwkYXBwKTsKfQoKZm9yKCRpPTA7JGk8MjskaSsrKXsgICAgICAgIC8vMsOX0LzQtTMKICAgICRhcHAgPSBuZXcgRW1wbG95ZWUoJ9CU0LXQv9Cw0YDRgtCw0LzQtdC90YIg0LfQsNC60YPQv9C+0LonLCfQnNC10L3QtdC00LbQtdGAJywzLDAsMjAsMjAwKTsKICAgICRnZXRfc2FsYXJ5PSAkYXBwLT5nZXRTYWxhcnkoJGFwcC0+cG9zdCwkYXBwLT5yYW5nKTsKICAgICRhcHAtPnNhbGFyeT0kZ2V0X3NhbGFyeTsKICAgIGFycmF5X3B1c2goJGZpcnN0RGVwLCRhcHApOwp9Cgpmb3IoJGk9MDskaTwyOyRpKyspeyAgICAgICAgLy8yw5fQvNCwMQogICAgJGFwcCA9IG5ldyBFbXBsb3llZSgn0JTQtdC/0LDRgNGC0LDQvNC10L3RgiDQt9Cw0LrRg9C/0L7QuicsJ9Cc0LDRgNC60LXRgtC+0LvQvtCzJywxLDAsMTUsMTUwKTsKICAgICRnZXRfc2FsYXJ5PSAkYXBwLT5nZXRTYWxhcnkoJGFwcC0+cG9zdCwkYXBwLT5yYW5nKTsKICAgICRhcHAtPnNhbGFyeT0kZ2V0X3NhbGFyeTsKICAgIGFycmF5X3B1c2goJGZpcnN0RGVwLCRhcHApOwp9CiAgICAkYXBwID0gbmV3IEVtcGxveWVlKCfQlNC10L/QsNGA0YLQsNC80LXQvdGCINC30LDQutGD0L/QvtC6Jywn0KDRg9C60L7QstC+0LTQuNGC0LXQu9GMINC80LXQvdC10LTQttC10YAnLDIsMCwyMCoyLDApOy8v0YDRg9C60L7QstC+0LTQuNGC0LXQu9GMINC00LXQv9Cw0YDRgtCw0LzQtdC90YLQsCDQvNC1MgogICAgJGdldF9zYWxhcnk9ICRhcHAtPmdldFNhbGFyeSgkYXBwLT5wb3N0LCRhcHAtPnJhbmcpOwogICAgJGFwcC0+c2FsYXJ5PSRnZXRfc2FsYXJ5OwphcnJheV9wdXNoKCRmaXJzdERlcCwkYXBwKTsKCi8v0JTQtdC/0LDRgNGC0LDQvNC10L3RgiDQv9GA0L7QtNCw0LYKCmZvcigkaT0wOyRpPDEyOyRpKyspeyAgICAgICAgLy8xMsOX0LzQtTEKICAgICRhcHAgPSBuZXcgRW1wbG95ZWUoJ9CU0LXQv9Cw0YDRgtCw0LzQtdC90YIg0L/RgNC+0LTQsNC2Jywn0JzQtdC90LXQtNC20LXRgCcsMSwwLDIwLDIwMCk7CiAgICAkZ2V0X3NhbGFyeT0gJGFwcC0+Z2V0U2FsYXJ5KCRhcHAtPnBvc3QsJGFwcC0+cmFuZyk7CiAgICAkYXBwLT5zYWxhcnk9JGdldF9zYWxhcnk7CiAgICBhcnJheV9wdXNoKCRzZWNvbmREZXAsJGFwcCk7Cn0KCmZvcigkaT0wOyRpPDY7JGkrKyl7ICAgICAgICAvLzbDl9C80LAxCiAgICAkYXBwID0gbmV3IEVtcGxveWVlKCfQlNC10L/QsNGA0YLQsNC80LXQvdGCINC/0YDQvtC00LDQticsJ9Cc0LDRgNC60LXRgtC+0LvQvtCzJywxLDAsMTUsMTUwKTsKICAgICRnZXRfc2FsYXJ5PSAkYXBwLT5nZXRTYWxhcnkoJGFwcC0+cG9zdCwkYXBwLT5yYW5nKTsKICAgICRhcHAtPnNhbGFyeT0kZ2V0X3NhbGFyeTsKICAgIGFycmF5X3B1c2goJHNlY29uZERlcCwkYXBwKTsKfQoKZm9yKCRpPTA7JGk8MzskaSsrKXsgICAgICAgIC8vM8OX0LDQvTEKICAgICRhcHAgPSBuZXcgRW1wbG95ZWUoJ9CU0LXQv9Cw0YDRgtCw0LzQtdC90YIg0L/RgNC+0LTQsNC2Jywn0JDQvdCw0LvQuNGC0LjQuicsMSwwLDUwLDUpOwogICAgJGdldF9zYWxhcnk9ICRhcHAtPmdldFNhbGFyeSgkYXBwLT5wb3N0LCRhcHAtPnJhbmcpOwogICAgJGFwcC0+c2FsYXJ5PSRnZXRfc2FsYXJ5OwogICAgYXJyYXlfcHVzaCgkc2Vjb25kRGVwLCRhcHApOwp9CmZvcigkaT0wOyRpPDI7JGkrKyl7ICAgICAgICAvLzLDl9Cw0L0yCiAgICAkYXBwID0gbmV3IEVtcGxveWVlKCfQlNC10L/QsNGA0YLQsNC80LXQvdGCINC/0YDQvtC00LDQticsJ9CQ0L3QsNC70LjRgtC40LonLDIsMCw1MCw1KTsKICAgICRnZXRfc2FsYXJ5PSAkYXBwLT5nZXRTYWxhcnkoJGFwcC0+cG9zdCwkYXBwLT5yYW5nKTsKICAgICRhcHAtPnNhbGFyeT0kZ2V0X3NhbGFyeTsKICAgIGFycmF5X3B1c2goJHNlY29uZERlcCwkYXBwKTsKfQovL9GA0YPQutC+0LLQvtC00LjRgtC10LvRjCDQvNCwMgokYXBwID0gbmV3IEVtcGxveWVlKCfQlNC10L/QsNGA0YLQsNC80LXQvdGCINC30LDQutGD0L/QvtC6Jywn0KDRg9C60L7QstC+0LTQuNGC0LXQu9GMINC80LDRgNC60LXRgtC+0LvQvtCzJywyLDAsMTUqMiwwKTsvL9GA0YPQutC+0LLQvtC00LjRgtC10LvRjCDQtNC10L/QsNGA0YLQsNC80LXQvdGC0LAg0LzQtTIKJGdldF9zYWxhcnk9ICRhcHAtPmdldFNhbGFyeSgkYXBwLT5wb3N0LCRhcHAtPnJhbmcpOwokYXBwLT5zYWxhcnk9JGdldF9zYWxhcnk7CmFycmF5X3B1c2goJHNlY29uZERlcCwkYXBwKTsKCi8v0JTQtdC/0LDRgNGC0LDQvNC10L3RgiDRgNC10LrQu9Cw0LzRiwpmb3IoJGk9MDskaTwxNTskaSsrKXsgICAgICAgIC8vMTXDl9C80LAxCiAgICAkYXBwID0gbmV3IEVtcGxveWVlKCfQlNC10L/QsNGA0YLQsNC80LXQvdGCINGA0LXQutC70LDQvNGLJywn0JzQsNGA0LrQtdGC0L7Qu9C+0LMnLDEsMCwxNSwxNTApOwogICAgJGdldF9zYWxhcnk9ICRhcHAtPmdldFNhbGFyeSgkYXBwLT5wb3N0LCRhcHAtPnJhbmcpOwogICAgJGFwcC0+c2FsYXJ5PSRnZXRfc2FsYXJ5OwogICAgYXJyYXlfcHVzaCgkdGhpcmREZXAsJGFwcCk7Cn0KCmZvcigkaT0wOyRpPDEwOyRpKyspeyAgICAgICAgLy8xMMOX0LzQsDEKICAgICRhcHAgPSBuZXcgRW1wbG95ZWUoJ9CU0LXQv9Cw0YDRgtCw0LzQtdC90YIg0YDQtdC60LvQsNC80YsnLCfQnNCw0YDQutC10YLQvtC70L7QsycsMiwwLDE1LDE1MCk7CiAgICAkZ2V0X3NhbGFyeT0gJGFwcC0+Z2V0U2FsYXJ5KCRhcHAtPnBvc3QsJGFwcC0+cmFuZyk7CiAgICAkYXBwLT5zYWxhcnk9JGdldF9zYWxhcnk7CiAgICBhcnJheV9wdXNoKCR0aGlyZERlcCwkYXBwKTsKfQoKZm9yKCRpPTA7JGk8ODskaSsrKXsgICAgICAgIC8vOMOX0LzQtTEKICAgICRhcHAgPSBuZXcgRW1wbG95ZWUoJ9CU0LXQv9Cw0YDRgtCw0LzQtdC90YIg0YDQtdC60LvQsNC80YsnLCfQnNC10L3QtdC00LbQtdGAJywxLDAsMjAsMjAwKTsKICAgICRnZXRfc2FsYXJ5PSAkYXBwLT5nZXRTYWxhcnkoJGFwcC0+cG9zdCwkYXBwLT5yYW5nKTsKICAgICRhcHAtPnNhbGFyeT0kZ2V0X3NhbGFyeTsKICAgIGFycmF5X3B1c2goJHRoaXJkRGVwLCRhcHApOwp9Cgpmb3IoJGk9MDskaTwyOyRpKyspeyAgICAgICAgLy8yw5fQuNC9MQogICAgJGFwcCA9IG5ldyBFbXBsb3llZSgn0JTQtdC/0LDRgNGC0LDQvNC10L3RgiDRgNC10LrQu9Cw0LzRiycsJ9CY0L3QttC10L3QtdGAJywxLDAsNSw1MCk7CiAgICAkZ2V0X3NhbGFyeT0gJGFwcC0+Z2V0U2FsYXJ5KCRhcHAtPnBvc3QsJGFwcC0+cmFuZyk7CiAgICAkYXBwLT5zYWxhcnk9JGdldF9zYWxhcnk7CiAgICBhcnJheV9wdXNoKCR0aGlyZERlcCwkYXBwKTsKfQovL9GA0YPQutC+0LLQvtC00LjRgtC10LvRjCDQvNCwMwokYXBwID0gbmV3IEVtcGxveWVlKCfQlNC10L/QsNGA0YLQsNC80LXQvdGCINGA0LXQutC70LDQvNGLJywn0KDRg9C60L7QstC+0LTQuNGC0LXQu9GMINC80LDRgNC60LXRgtC+0LvQvtCzJywzLDAsMTUqMiwwKTsvL9GA0YPQutC+0LLQvtC00LjRgtC10LvRjCDQtNC10L/QsNGA0YLQsNC80LXQvdGC0LAg0LzQtTIKJGdldF9zYWxhcnk9ICRhcHAtPmdldFNhbGFyeSgkYXBwLT5wb3N0LCRhcHAtPnJhbmcpOwokYXBwLT5zYWxhcnk9JGdldF9zYWxhcnk7CmFycmF5X3B1c2goJHRoaXJkRGVwLCRhcHApOwoKLy/QlNC10L/QsNGA0YLQsNC80LXQvdGCINC70L7Qs9C40YHRgtC40LrQuApmb3IoJGk9MDskaTwxMzskaSsrKXsgICAgICAgIC8vMTPDl9C80LUxCiAgICAkYXBwID0gbmV3IEVtcGxveWVlKCfQlNC10L/QsNGA0YLQsNC80LXQvdGCINC70L7Qs9C40YHRgtC40LrQuCcsJ9Cc0LXQvdC10LTQttC10YAnLDEsMCwyMCwyMDApOwogICAgJGdldF9zYWxhcnk9ICRhcHAtPmdldFNhbGFyeSgkYXBwLT5wb3N0LCRhcHAtPnJhbmcpOwogICAgJGFwcC0+c2FsYXJ5PSRnZXRfc2FsYXJ5OwogICAgYXJyYXlfcHVzaCgkZm91cnRoRGVwLCRhcHApOwp9Cgpmb3IoJGk9MDskaTw1OyRpKyspeyAgICAgICAgLy81w5fQvNC1MQogICAgJGFwcCA9IG5ldyBFbXBsb3llZSgn0JTQtdC/0LDRgNGC0LDQvNC10L3RgiDQu9C+0LPQuNGB0YLQuNC60LgnLCfQnNC10L3QtdC00LbQtdGAJywyLDAsMjAsMjAwKTsKICAgICRnZXRfc2FsYXJ5PSAkYXBwLT5nZXRTYWxhcnkoJGFwcC0+cG9zdCwkYXBwLT5yYW5nKTsKICAgICRhcHAtPnNhbGFyeT0kZ2V0X3NhbGFyeTsKICAgIGFycmF5X3B1c2goJGZvdXJ0aERlcCwkYXBwKTsKfQoKZm9yKCRpPTA7JGk8NTskaSsrKXsgICAgICAgIC8vNcOX0LjQvTEKICAgICRhcHAgPSBuZXcgRW1wbG95ZWUoJ9CU0LXQv9Cw0YDRgtCw0LzQtdC90YIg0LvQvtCz0LjRgdGC0LjQutC4Jywn0JjQvdC20LXQvdC10YAnLDEsMCw1LDUwKTsKICAgICRnZXRfc2FsYXJ5PSAkYXBwLT5nZXRTYWxhcnkoJGFwcC0+cG9zdCwkYXBwLT5yYW5nKTsKICAgICRhcHAtPnNhbGFyeT0kZ2V0X3NhbGFyeTsKICAgIGFycmF5X3B1c2goJGZvdXJ0aERlcCwkYXBwKTsKfQovL9GA0YPQutC+0LLQvtC00LjRgtC10LvRjCDQvNC1MQokYXBwID0gbmV3IEVtcGxveWVlKCfQlNC10L/QsNGA0YLQsNC80LXQvdGCINC70L7Qs9C40YHRgtC40LrQuCcsJ9Cg0YPQutC+0LLQvtC00LjRgtC10LvRjCDQvNC10L3QtdC00LbQtdGAJywxLDAsMjAqMiwwKTsvL9GA0YPQutC+0LLQvtC00LjRgtC10LvRjCDQtNC10L/QsNGA0YLQsNC80LXQvdGC0LAg0LzQtTIKJGdldF9zYWxhcnk9ICRhcHAtPmdldFNhbGFyeSgkYXBwLT5wb3N0LCRhcHAtPnJhbmcpOwokYXBwLT5zYWxhcnk9JGdldF9zYWxhcnk7CmFycmF5X3B1c2goJGZvdXJ0aERlcCwkYXBwKTsKCi8v0KfQuNGB0LvQviDRgdC+0YLRgNGD0LTQvdC40LrQvtCyINC/0L4g0LrQsNC20LTQvtC80YMg0LTQtdC/0LDRgNGC0LDQvNC10L3RgtGDCiRmaXJzdERlcFN0YXRzPSRhcHAtPmdldEVtcGxveWVlU3RhdHNCeURlcCgkZmlyc3REZXApOwokc2Vjb25kRGVwU3RhdHM9JGFwcC0+Z2V0RW1wbG95ZWVTdGF0c0J5RGVwKCRzZWNvbmREZXApOwokdGhpcmREZXBTdGF0cz0gJGFwcC0+Z2V0RW1wbG95ZWVTdGF0c0J5RGVwKCR0aGlyZERlcCk7CiRmb3VydGhEZXBTdGF0cz0gJGFwcC0+Z2V0RW1wbG95ZWVTdGF0c0J5RGVwKCRmb3VydGhEZXApOwoKCiRFbXBsb3llZSA9IGFycmF5X21lcmdlKCRmaXJzdERlcCwkc2Vjb25kRGVwLCR0aGlyZERlcCwkZm91cnRoRGVwKTsKCgovL9Ch0YPQvNC80LDRgNC90LDRjyDQt9Cw0YDQv9C70LDRgtCwINC/0L4g0LTQtdC/0LDRgNGC0LDQvNC10L3RgtGDCiRzdW1tYXJ5U2FsYXJ5Rmlyc3REZXA9JGFwcC0+c2FsYXJ5U3VtbWFyeSgkZmlyc3REZXApOwokc3VtbWFyeVNhbGFyeVNlY29uZERlcD0kYXBwLT5zYWxhcnlTdW1tYXJ5KCRzZWNvbmREZXApOwokc3VtbWFyeVNhbGFyeVRoaXJkRGVwPSRhcHAtPnNhbGFyeVN1bW1hcnkoJHRoaXJkRGVwKTsKJHN1bW1hcnlTYWxhcnlGb3VydGhEZXA9JGFwcC0+c2FsYXJ5U3VtbWFyeSgkZm91cnRoRGVwKTsKCi8v0KHRg9C80LzQsNGA0L3QviDQstGL0L/QuNGC0L4g0LrQvtGE0YTQtSDQv9C+INC00LXQv9Cw0YDRgtCw0LzQtdC90YLRgwokc3VtbWFyeUNvZmZlZUZpcnN0RGVwPSRhcHAtPmNvZmZlZVN1bW1hcnkoJGZpcnN0RGVwKTsKJHN1bW1hcnlDb2ZmZWVTZWNvbmREZXA9JGFwcC0+Y29mZmVlU3VtbWFyeSgkc2Vjb25kRGVwKTsKJHN1bW1hcnlDb2ZmZWVUaGlyZERlcD0kYXBwLT5jb2ZmZWVTdW1tYXJ5KCR0aGlyZERlcCk7CiRzdW1tYXJ5Q29mZmVlRm91cnRoRGVwPSRhcHAtPmNvZmZlZVN1bW1hcnkoJGZvdXJ0aERlcCk7CgovL9Ch0YPQvNC80LDRgNC90L4g0YHRgtGA0LDQvdC40YYg0L/QviDQtNC10L/QsNGA0YLQsNC80LXQvdGC0YMKJHN1bW1hcnlQYWdlc0ZpcnN0RGVwPSRhcHAtPnBhZ2VzU3VtbWFyeSgkZmlyc3REZXApOwokc3VtbWFyeVBhZ2VzU2Vjb25kRGVwPSRhcHAtPnBhZ2VzU3VtbWFyeSgkc2Vjb25kRGVwKTsKJHN1bW1hcnlQYWdlc1RoaXJkRGVwPSRhcHAtPnBhZ2VzU3VtbWFyeSgkdGhpcmREZXApOwokc3VtbWFyeVBhZ2VzRm91cnRoRGVwPSRhcHAtPnBhZ2VzU3VtbWFyeSgkZm91cnRoRGVwKTsKCi8v0K3RhNGE0LXQutGC0LjQstC90L7RgdGC0Ywg0L/QviDQtNC10L/QsNGA0YLQsNC80LXQvdGC0YMKJGVmZmljaWVuY3lGaXJzdERlcD0kYXBwLT5lZmZpY2llbmN5KCRzdW1tYXJ5U2FsYXJ5Rmlyc3REZXAsJHN1bW1hcnlQYWdlc0ZpcnN0RGVwKTsKJGVmZmljaWVuY3lTZWNvbmREZXA9JGFwcC0+ZWZmaWNpZW5jeSgkc3VtbWFyeVNhbGFyeVNlY29uZERlcCwkc3VtbWFyeVBhZ2VzU2Vjb25kRGVwKTsKJGVmZmljaWVuY3lUaGlyZERlcD0kYXBwLT5lZmZpY2llbmN5KCRzdW1tYXJ5U2FsYXJ5VGhpcmREZXAsJHN1bW1hcnlQYWdlc1RoaXJkRGVwKTsKJGVmZmljaWVuY3lGb3VydGhEZXA9JGFwcC0+ZWZmaWNpZW5jeSgkc3VtbWFyeVNhbGFyeUZvdXJ0aERlcCwkc3VtbWFyeVBhZ2VzRm91cnRoRGVwKTsKCi8v0J/QvtC00YHRh9C10YIg0YHRgNC10LTQvdC10LPQvgokYXZlcmFnZUVtcGxveWVlU3RhdD0kYXBwLT5hdmVyYWdlKCRmaXJzdERlcFN0YXRzLCRzZWNvbmREZXBTdGF0cywkdGhpcmREZXBTdGF0cywkZm91cnRoRGVwU3RhdHMpOwokYXZlcmFnZVNhbGFyeVN0YXQ9JGFwcC0+YXZlcmFnZSgkc3VtbWFyeVNhbGFyeUZpcnN0RGVwLCRzdW1tYXJ5U2FsYXJ5U2Vjb25kRGVwLCRzdW1tYXJ5U2FsYXJ5VGhpcmREZXAsJHN1bW1hcnlTYWxhcnlGb3VydGhEZXApOwokYXZlcmFnZUNvZmZlZVN0YXQ9JGFwcC0+YXZlcmFnZSgkc3VtbWFyeUNvZmZlZUZpcnN0RGVwLCRzdW1tYXJ5Q29mZmVlU2Vjb25kRGVwLCRzdW1tYXJ5Q29mZmVlVGhpcmREZXAsJHN1bW1hcnlDb2ZmZWVGb3VydGhEZXApOwokYXZlcmFnZVBhZ2VzU3RhdD0kYXBwLT5hdmVyYWdlKCRzdW1tYXJ5UGFnZXNGaXJzdERlcCwkc3VtbWFyeVBhZ2VzU2Vjb25kRGVwLCRzdW1tYXJ5UGFnZXNUaGlyZERlcCwkc3VtbWFyeVBhZ2VzRm91cnRoRGVwKTsKJGF2ZXJhZ2VFZmZpY2llbmN5PSRhcHAtPmF2ZXJhZ2UoJGVmZmljaWVuY3lGaXJzdERlcCwkZWZmaWNpZW5jeVNlY29uZERlcCwkZWZmaWNpZW5jeVRoaXJkRGVwLCRlZmZpY2llbmN5Rm91cnRoRGVwKTsKCgovL9Ca0L7QvdC10YfQvdGL0Lkg0YDQtdC30YPQu9GM0YLQsNGCCiRmaW5hbFN0YXRzRmlyc3REZXA9YXJyYXkoJ9CX0LDQutGD0L/QvtC6JywkZmlyc3REZXBTdGF0cywkc3VtbWFyeVNhbGFyeUZpcnN0RGVwLCRzdW1tYXJ5Q29mZmVlRmlyc3REZXAsJHN1bW1hcnlQYWdlc0ZpcnN0RGVwLCRlZmZpY2llbmN5Rmlyc3REZXApOwokZmluYWxTdGF0c1NlY29uZERlcD1hcnJheSgn0J/RgNC+0LTQsNC2Jywkc2Vjb25kRGVwU3RhdHMsJHN1bW1hcnlTYWxhcnlTZWNvbmREZXAsJHN1bW1hcnlDb2ZmZWVTZWNvbmREZXAsJHN1bW1hcnlQYWdlc1NlY29uZERlcCwkZWZmaWNpZW5jeVNlY29uZERlcCk7CiRmaW5hbFN0YXRzVGhpcmREZXA9YXJyYXkoJ9Cg0LXQutC70LDQvNGLJywkdGhpcmREZXBTdGF0cywkc3VtbWFyeVNhbGFyeVRoaXJkRGVwLCRzdW1tYXJ5Q29mZmVlVGhpcmREZXAsJHN1bW1hcnlQYWdlc1RoaXJkRGVwLCRlZmZpY2llbmN5VGhpcmREZXApOwokZmluYWxTdGF0c0ZvdXJ0aERlcD1hcnJheSgn0JvQvtCz0LjRgdGC0LjQutC4JywkZm91cnRoRGVwU3RhdHMsJHN1bW1hcnlTYWxhcnlGb3VydGhEZXAsJHN1bW1hcnlDb2ZmZWVGb3VydGhEZXAsJHN1bW1hcnlQYWdlc0ZvdXJ0aERlcCwkZWZmaWNpZW5jeUZvdXJ0aERlcCk7CiRhdmVyYWdlU3RhdHM9IGFycmF5KCfQodGA0LXQtNC90LXQtScsJGF2ZXJhZ2VFbXBsb3llZVN0YXQsJGF2ZXJhZ2VTYWxhcnlTdGF0LCRhdmVyYWdlQ29mZmVlU3RhdCwkYXZlcmFnZVBhZ2VzU3RhdCwkYXZlcmFnZUVmZmljaWVuY3kpOwokc3VtbWFyeVN0YXRzPSAkYXBwLT5zdW1tYXJ5U3RhdHMoJEVtcGxveWVlKTsKPz4KCjx0YWJsZT4KICAgIDx0aGVhZD4KICAgIDx0cj4KICAgICAgICA8dGQ+0JTQtdC/0LDRgNGC0LDQvNC10L3RgjwvdGQ+CiAgICAgICAgPHRkPtGB0L7RgtGALjwvdGQ+CiAgICAgICAgPHRkPtGC0YPQs9GALjwvdGQ+CiAgICAgICAgPHRkPtC60L7RhNC1PC90ZD4KICAgICAgICA8dGQ+0YHRgtGALjwvdGQ+CiAgICAgICAgPHRkPtGC0YPQsy4v0YHRgtGALjwvdGQ+CiAgICA8L3RyPgogICAgPC90aGVhZD4KICAgIDx0Ym9keT4KICAgIDx0cj4KICAgICAgICA8P3BocCBmb3JlYWNoICgkZmluYWxTdGF0c0ZpcnN0RGVwIGFzICRrZXkgPT4gJHZhbHVlKTo/PgogICAgICAgIDx0ZD48PyBlY2hvICR2YWx1ZT8+PC90ZD4KICAgICAgICA8P2VuZGZvcmVhY2g7Pz4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPD9waHAgZm9yZWFjaCAoJGZpbmFsU3RhdHNTZWNvbmREZXAgYXMgJGtleSA9PiAkdmFsdWUpOj8+CiAgICAgICAgICAgIDx0ZD48PyBlY2hvICR2YWx1ZT8+PC90ZD4KICAgICAgICA8P2VuZGZvcmVhY2g7Pz4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPD9waHAgZm9yZWFjaCAoJGZpbmFsU3RhdHNUaGlyZERlcCBhcyAka2V5ID0+ICR2YWx1ZSk6Pz4KICAgICAgICAgICAgPHRkPjw/IGVjaG8gJHZhbHVlPz48L3RkPgogICAgICAgIDw/ZW5kZm9yZWFjaDs/PgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8P3BocCBmb3JlYWNoICgkZmluYWxTdGF0c0ZvdXJ0aERlcCBhcyAka2V5ID0+ICR2YWx1ZSk6Pz4KICAgICAgICAgICAgPHRkPjw/IGVjaG8gJHZhbHVlPz48L3RkPgogICAgICAgIDw/ZW5kZm9yZWFjaDs/PgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8P3BocCBmb3JlYWNoICgkYXZlcmFnZVN0YXRzIGFzICRrZXkgPT4gJHZhbHVlKTo/PgogICAgICAgICAgICA8dGQ+PD8gZWNobyAkdmFsdWU/PjwvdGQ+CiAgICAgICAgPD9lbmRmb3JlYWNoOz8+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDw/cGhwIGZvcmVhY2ggKCRzdW1tYXJ5U3RhdHMgYXMgJGtleSA9PiAkdmFsdWUpOj8+CiAgICAgICAgICAgIDx0ZD48PyBlY2hvICR2YWx1ZT8+PC90ZD4KICAgICAgICA8P2VuZGZvcmVhY2g7Pz4KICAgIDwvdHI+CiAgICA8L3Rib2R5Pgo8L3RhYmxlPgo=