<?php
abstract class Worker{
protected $payment;
protected $drink;
protected $produce;
protected $grade;
protected $description;
protected function getPayment($grade) {
if ($grade==1){
return $this->payment;
}
else if($grade ==2)
{
return $this->payment*(1/4)+($this->payment);
}
else if($grade==3){
return $this->payment*(1/2)+($this->payment);
}
else if($grade ==4){ return $this->payment*(1/2)+($this->payment);}
}
protected function getProduce($grade){
if ($grade!=4)
return $this->produce;
else return $this->produce*0;
}
protected function getDrink($grade){
if ($grade==4) return $this->drink+((1/2)*$this->drink);
else return $this->drink;
}
}
class Manager extends Worker{
public $payment = 500;
public $drink = 20;
public $produce = 200;
public function __construct($grade) {
$this->payment = $this->getPayment($grade);
$this->drink = $this ->getDrink($grade);
$this ->produce = $this->getProduce($grade);
$this->grade = $grade;
$this->description = "me" . $grade;
}
public function getInfo(){
$arr=[];
$wrk = new Manager($this->grade);
foreach($wrk as $value){
$arr[]=$value;
}
return $arr;
}
}
class Marketer extends Worker{
public $payment = 400;
public $drink = 15;
public $produce = 150;
public function __construct($grade) {
$this->payment = $this->getPayment($grade);
$this->drink = $this ->getDrink($grade);
$this ->produce = $this->getProduce($grade);
$this->grade = $grade;
$this->description = "ma" . $grade;
}
public function getInfo(){
$arr=[];
$wrk = new Marketer($this->grade);
foreach($wrk as $value){
$arr[]=$value;
}
return $arr;
}
}
class Engineer extends Worker{
public $payment = 200;
public $drink = 5;
public $produce = 50;
public function __construct($grade) {
$this->payment = $this->getPayment($grade);
$this->drink = $this ->getDrink($grade);
$this ->produce = $this->getProduce($grade);
$this->grade = $grade;
$this->description = "en" . $grade;
}
public function getInfo(){
$arr=[];
$wrk = new Engineer($this->grade);
foreach($wrk as $value){
$arr[]=$value;
}
return $arr;
}
}
class Analyst extends Worker{
public $payment = 800;
public $drink = 50;
public $produce = 5;
public function __construct($grade) {
$this->payment = $this->getPayment($grade);
$this->drink = $this ->getDrink($grade);
$this ->produce = $this->getProduce($grade);
$this->grade = $grade;
$this->description = "an" . $grade;
}
public function getInfo(){
$arr=[];
$wrk = new Analyst($this->grade);
foreach($wrk as $value){
$arr[]=$value;
}
return $arr;
}
}
class Department{
public function FirstDep(){
$dep1 = [];
for ($i=0;$i<9;$i++){
$a=new Manager(1);
$dep1[] = $a->getInfo();
}
for ($i=0;$i<3;$i++){
$a=new Manager(2);
$dep1[] = $a->getInfo();
}
for ($i=0;$i<2;$i++){
$a=new Manager(3);
$dep1[] = $a->getInfo();
}
for ($i=0;$i<2;$i++){
$a=new Marketer(1);
$dep1[] = $a->getInfo();
}
return $dep1;
}
public function SecondDep(){
$dep1 = [];
for ($i=0;$i<12;$i++){
$a=new Manager(1);
$dep1[] = $a->getInfo();
}
for ($i=0;$i<6;$i++){
$a=new Marketer(1);
$dep1[] = $a->getInfo();
}
for ($i=0;$i<3;$i++){
$a=new Analyst(1);
$dep1[] = $a->getInfo();
}
for ($i=0;$i<2;$i++){
$a=new Analyst(2);
$dep1[] = $a->getInfo();
}
return $dep1;
}
public function ThirdDep(){
$dep1 = [];
for ($i=0;$i<15;$i++){
$a=new Marketer(1);
$dep1[] = $a->getInfo();
}
for ($i=0;$i<10;$i++){
$a=new Marketer(2);
$dep1[] = $a->getInfo();
}
for ($i=0;$i<8;$i++){
$a=new Manager(1);
$dep1[] = $a->getInfo();
}
for ($i=0;$i<2;$i++){
$a=new Engineer(1);
$dep1[] = $a->getInfo();
}
return $dep1;
}
public function FourthDep(){
$dep1 = [];
for ($i=0;$i<13;$i++){
$a=new Manager(1);
$dep1[] = $a->getInfo();
}
for ($i=0;$i<5;$i++){
$a=new Manager(2);
$dep1[] = $a->getInfo();
}
for ($i=0;$i<5;$i++){
$a=new Engineer(1);
$dep1[] = $a->getInfo();
}
return $dep1;
}
public function arraysum($var, $array){
$sum=[];
foreach ($array as $value ){
for ($i=0;$i<count($value[$var]);$i++){ $sum[] =$value[$var];
}
}
}
public function ArrayMiddle($number){
$middle = new Department();
$a= $middle->arraysum($number,$middle->FirstDep());
$b= $middle->arraysum($number,$middle->SecondDep());
$c= $middle->arraysum($number,$middle->ThirdDep());
$d= $middle->arraysum($number,$middle->FourthDep());
$sum = $a+$b+$c+$d;
return $sum;
}
}
function padRight($string, $length){
}
function padLeft($string, $length){
return $string;
}
$firstdep = new Department();
$col1 = 30;
$col2 = 10;
echo"<pre>";
echo padRight("Департамент", $col1).
padLeft("сотр", $col2).
padLeft("тугр.", $col2).
padLeft("кофе", $col2).
padLeft("стр.", $col2).
padLeft("тугр./стр", $col2). " <br>";
for ($i=0;$i<50;$i++){
echo "_ ";
}
echo"<br>";
echo"<br>";
echo padRight("Закупок", $col1).
padLeft
(count($firstdep->FirstDep()), $col2). padLeft($firstdep->arraysum(0,$firstdep->FirstDep()), $col2).
padLeft($firstdep->arraysum(1,$firstdep->FirstDep()), $col2).
padLeft($firstdep->arraysum(2,$firstdep->FirstDep()), $col2).
padLeft
(round($firstdep->arraysum(0,$firstdep->FirstDep())/$firstdep->arraysum(2,$firstdep->FirstDep())), $col2). " <br>";
echo"<br>";
echo padRight("Продаж", $col1).
padLeft
(count($firstdep->SecondDep()), $col2). padLeft($firstdep->arraysum(0,$firstdep->SecondDep()), $col2).
padLeft($firstdep->arraysum(1,$firstdep->SecondDep()), $col2).
padLeft($firstdep->arraysum(2,$firstdep->SecondDep()), $col2).
padLeft
(round($firstdep->arraysum(0,$firstdep->SecondDep())/$firstdep->arraysum(2,$firstdep->SecondDep())), $col2). " <br>";
echo"<br>";
echo padRight("Рекламы", $col1).
padLeft
(count($firstdep->ThirdDep()), $col2). padLeft($firstdep->arraysum(0,$firstdep->ThirdDep()), $col2).
padLeft($firstdep->arraysum(1,$firstdep->ThirdDep()), $col2).
padLeft($firstdep->arraysum(2,$firstdep->ThirdDep()), $col2).
padLeft
(round($firstdep->arraysum(0,$firstdep->ThirdDep())/$firstdep->arraysum(2,$firstdep->ThirdDep())), $col2). " <br>";
echo"<br>";
echo padRight("Логистики", $col1).
padLeft
(count($firstdep->FourthDep()), $col2). padLeft($firstdep->arraysum(0,$firstdep->FourthDep()), $col2).
padLeft($firstdep->arraysum(1,$firstdep->FourthDep()), $col2).
padLeft($firstdep->arraysum(2,$firstdep->FourthDep()), $col2).
padLeft
(round($firstdep->arraysum(0,$firstdep->FourthDep())/$firstdep->arraysum(2,$firstdep->FourthDep())), $col2). " <br>";
echo"<br>";
$a = (count($firstdep->FirstDep())+count($firstdep->SecondDep()) +count($firstdep->ThirdDep())+count($firstdep->FourthDep())); echo padRight("Cреднее", $col1).
padLeft($a/4, $col2).
padLeft($firstdep->ArrayMiddle(0)/4, $col2).
padLeft($firstdep->ArrayMiddle(1)/4, $col2).
padLeft($firstdep->ArrayMiddle(2)/4, $col2).
padLeft
((round($firstdep->ArrayMiddle(0)/$firstdep->ArrayMiddle(2))), $col2). " <br>";
echo padRight("Общее", $col1).
padLeft($a, $col2).
padLeft($firstdep->ArrayMiddle(0), $col2).
padLeft($firstdep->ArrayMiddle(1), $col2).
padLeft($firstdep->ArrayMiddle(2), $col2).
padLeft(12, $col2). " <br>";
PD9waHAKIGFic3RyYWN0IGNsYXNzIFdvcmtlcnsKICAgIAogICAgcHJvdGVjdGVkICRwYXltZW50OwogICAgcHJvdGVjdGVkICRkcmluazsKICAgIHByb3RlY3RlZCAkcHJvZHVjZTsKICAgcHJvdGVjdGVkICRncmFkZTsKICBwcm90ZWN0ZWQgJGRlc2NyaXB0aW9uOwogCiAgICAgIAogICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGF5bWVudCgkZ3JhZGUpIHsKICAgICAgIGlmICgkZ3JhZGU9PTEpewogICAgICAgICAgIHJldHVybiAkdGhpcy0+cGF5bWVudDsKICAgICAgIH0KICAgICAgIGVsc2UgaWYoJGdyYWRlID09MikKICAgICAgIHsKICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBheW1lbnQqKDEvNCkrKCR0aGlzLT5wYXltZW50KTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYoJGdyYWRlPT0zKXsKICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBheW1lbnQqKDEvMikrKCR0aGlzLT5wYXltZW50KTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYoJGdyYWRlID09NCl7IHJldHVybiAkdGhpcy0+cGF5bWVudCooMS8yKSsoJHRoaXMtPnBheW1lbnQpO30KfSAKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFByb2R1Y2UoJGdyYWRlKXsKICAgICBpZiAoJGdyYWRlIT00KQogICAgIHJldHVybiAkdGhpcy0+cHJvZHVjZTsKICAgICBlbHNlIHJldHVybiAkdGhpcy0+cHJvZHVjZSowOwogfQpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RHJpbmsoJGdyYWRlKXsKICAgIGlmICgkZ3JhZGU9PTQpIHJldHVybiAkdGhpcy0+ZHJpbmsrKCgxLzIpKiR0aGlzLT5kcmluayk7CiAgIGVsc2UgIHJldHVybiAkdGhpcy0+ZHJpbms7Cn0KfQoKY2xhc3MgTWFuYWdlciBleHRlbmRzIFdvcmtlcnsKICAgCiAgICBwdWJsaWMgJHBheW1lbnQgPSA1MDA7CiAgICAgIHB1YmxpYyAkZHJpbmsgPSAyMDsKICAgcHVibGljICRwcm9kdWNlID0gMjAwOwogIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZ3JhZGUpIHsKICAgICAgJHRoaXMtPnBheW1lbnQgPSAkdGhpcy0+Z2V0UGF5bWVudCgkZ3JhZGUpOwogICAgICAkdGhpcy0+ZHJpbmsgPSAkdGhpcyAtPmdldERyaW5rKCRncmFkZSk7CiAgICAgICR0aGlzIC0+cHJvZHVjZSA9ICR0aGlzLT5nZXRQcm9kdWNlKCRncmFkZSk7CiAgICAgICR0aGlzLT5ncmFkZSA9ICRncmFkZTsKICAgICAgJHRoaXMtPmRlc2NyaXB0aW9uID0gIm1lIiAuICRncmFkZTsKICAgICAgCiAgIH0KICAgcHVibGljIGZ1bmN0aW9uIGdldEluZm8oKXsKICAgICAgICRhcnI9W107CiAgICAgICAkd3JrID0gbmV3IE1hbmFnZXIoJHRoaXMtPmdyYWRlKTsKICAgICAgIGZvcmVhY2goJHdyayBhcyAgJHZhbHVlKXsKICAgICAgICAgICAkYXJyW109JHZhbHVlOwogICAgICAgfQogICAgICAgcmV0dXJuICRhcnI7CiAgIH0KfQoKY2xhc3MgTWFya2V0ZXIgZXh0ZW5kcyBXb3JrZXJ7CiAgIAogICAgcHVibGljICRwYXltZW50ID0gNDAwOwogICAgICBwdWJsaWMgJGRyaW5rID0gMTU7CiAgIHB1YmxpYyAkcHJvZHVjZSA9IDE1MDsKICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGdyYWRlKSB7CiAgICAgICAgJHRoaXMtPnBheW1lbnQgPSAkdGhpcy0+Z2V0UGF5bWVudCgkZ3JhZGUpOwogICAgICAkdGhpcy0+ZHJpbmsgPSAkdGhpcyAtPmdldERyaW5rKCRncmFkZSk7CiAgICAgICR0aGlzIC0+cHJvZHVjZSA9ICR0aGlzLT5nZXRQcm9kdWNlKCRncmFkZSk7CiAgICAgICR0aGlzLT5ncmFkZSA9ICRncmFkZTsKICAgICAgJHRoaXMtPmRlc2NyaXB0aW9uID0gIm1hIiAuICRncmFkZTsKICAgICAgCiAgIH0KICAgCiAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJbmZvKCl7CiAgICAgICAkYXJyPVtdOwogICAgICAgJHdyayA9IG5ldyBNYXJrZXRlcigkdGhpcy0+Z3JhZGUpOwogICAgICAgZm9yZWFjaCgkd3JrIGFzICAkdmFsdWUpewogICAgICAgICAgICRhcnJbXT0kdmFsdWU7CiAgICAgICB9CiAgICAgICByZXR1cm4gJGFycjsKICAgfQp9CmNsYXNzIEVuZ2luZWVyIGV4dGVuZHMgV29ya2VyewogICBwdWJsaWMgJHBheW1lbnQgPSAyMDA7CiAgICAgIHB1YmxpYyAkZHJpbmsgPSA1OwogICBwdWJsaWMgJHByb2R1Y2UgPSA1MDsKCiAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRncmFkZSkgewogICAgICAkdGhpcy0+cGF5bWVudCA9ICR0aGlzLT5nZXRQYXltZW50KCRncmFkZSk7CiAgICAgICR0aGlzLT5kcmluayA9ICR0aGlzIC0+Z2V0RHJpbmsoJGdyYWRlKTsKICAgICAgJHRoaXMgLT5wcm9kdWNlID0gJHRoaXMtPmdldFByb2R1Y2UoJGdyYWRlKTsKICAgICAgJHRoaXMtPmdyYWRlID0gJGdyYWRlOwogICAgICAkdGhpcy0+ZGVzY3JpcHRpb24gPSAiZW4iIC4gJGdyYWRlOwogICAgICAKICAgfQogICBwdWJsaWMgZnVuY3Rpb24gZ2V0SW5mbygpewogICAgICAgJGFycj1bXTsKICAgICAgICR3cmsgPSBuZXcgRW5naW5lZXIoJHRoaXMtPmdyYWRlKTsKICAgICAgIGZvcmVhY2goJHdyayBhcyAgJHZhbHVlKXsKICAgICAgICAgICAkYXJyW109JHZhbHVlOwogICAgICAgfQogICAgICAgcmV0dXJuICRhcnI7CiAgIH0KICAgCn0KY2xhc3MgQW5hbHlzdCBleHRlbmRzIFdvcmtlcnsKICAgCiAgICBwdWJsaWMgJHBheW1lbnQgPSA4MDA7CiAgICAgIHB1YmxpYyAkZHJpbmsgPSA1MDsKICAgcHVibGljICRwcm9kdWNlID0gNTsKICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGdyYWRlKSB7CiAgICAgICAkdGhpcy0+cGF5bWVudCA9ICR0aGlzLT5nZXRQYXltZW50KCRncmFkZSk7CiAgICAgICR0aGlzLT5kcmluayA9ICR0aGlzIC0+Z2V0RHJpbmsoJGdyYWRlKTsKICAgICAgJHRoaXMgLT5wcm9kdWNlID0gJHRoaXMtPmdldFByb2R1Y2UoJGdyYWRlKTsKICAgICAgJHRoaXMtPmdyYWRlID0gJGdyYWRlOwogICAgICAkdGhpcy0+ZGVzY3JpcHRpb24gPSAiYW4iIC4gJGdyYWRlOwogICAgICAKICAgfQpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5mbygpewogICAgICAgJGFycj1bXTsKICAgICAgICR3cmsgPSBuZXcgQW5hbHlzdCgkdGhpcy0+Z3JhZGUpOwogICAgICAgZm9yZWFjaCgkd3JrIGFzICAkdmFsdWUpewogICAgICAgICAgICRhcnJbXT0kdmFsdWU7CiAgICAgICB9CiAgICAgICByZXR1cm4gJGFycjsKICAgfQp9CgoKY2xhc3MgRGVwYXJ0bWVudHsKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIEZpcnN0RGVwKCl7CiAgICAgICAkZGVwMSA9IFtdOwogICAgICAgIGZvciAoJGk9MDskaTw5OyRpKyspewogICAgICAgICRhPW5ldyBNYW5hZ2VyKDEpOwogICAgICAkZGVwMVtdID0gJGEtPmdldEluZm8oKTsKICAgICAgICAKICAgICAgICB9CiAgICAgICAgZm9yICgkaT0wOyRpPDM7JGkrKyl7CiAgICAgICAgJGE9bmV3IE1hbmFnZXIoMik7CiAgICAgICRkZXAxW10gPSAkYS0+Z2V0SW5mbygpOwogICAgICB9CiAgICAgICBmb3IgKCRpPTA7JGk8MjskaSsrKXsKICAgICAgICAkYT1uZXcgTWFuYWdlcigzKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0KICAgICAgIGZvciAoJGk9MDskaTwyOyRpKyspewogICAgICAgICRhPW5ldyBNYXJrZXRlcigxKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0KICAgICAgICByZXR1cm4gJGRlcDE7CiAgICB9CiAgICAgcHVibGljIGZ1bmN0aW9uIFNlY29uZERlcCgpewogICAgICAgJGRlcDEgPSBbXTsKICAgICAgICBmb3IgKCRpPTA7JGk8MTI7JGkrKyl7CiAgICAgICAgJGE9bmV3IE1hbmFnZXIoMSk7CiAgICAgICRkZXAxW10gPSAkYS0+Z2V0SW5mbygpOwogICAgICAgIAogICAgICAgIH0KICAgICAgICBmb3IgKCRpPTA7JGk8NjskaSsrKXsKICAgICAgICAkYT1uZXcgTWFya2V0ZXIoMSk7CiAgICAgICRkZXAxW10gPSAkYS0+Z2V0SW5mbygpOwogICAgICB9CiAgICAgICBmb3IgKCRpPTA7JGk8MzskaSsrKXsKICAgICAgICAkYT1uZXcgQW5hbHlzdCgxKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0KICAgICAgIGZvciAoJGk9MDskaTwyOyRpKyspewogICAgICAgICRhPW5ldyBBbmFseXN0KDIpOwogICAgICAkZGVwMVtdID0gJGEtPmdldEluZm8oKTsKICAgICAgfQogICAgICAgIHJldHVybiAkZGVwMTsKICAgIH0KICAgICBwdWJsaWMgZnVuY3Rpb24gVGhpcmREZXAoKXsKICAgICAgICRkZXAxID0gW107CiAgICAgICAgZm9yICgkaT0wOyRpPDE1OyRpKyspewogICAgICAgICRhPW5ldyBNYXJrZXRlcigxKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgICAgCiAgICAgICAgfQogICAgICAgIGZvciAoJGk9MDskaTwxMDskaSsrKXsKICAgICAgICAkYT1uZXcgTWFya2V0ZXIoMik7CiAgICAgICRkZXAxW10gPSAkYS0+Z2V0SW5mbygpOwogICAgICB9CiAgICAgICBmb3IgKCRpPTA7JGk8ODskaSsrKXsKICAgICAgICAkYT1uZXcgTWFuYWdlcigxKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0KICAgICAgIGZvciAoJGk9MDskaTwyOyRpKyspewogICAgICAgICRhPW5ldyBFbmdpbmVlcigxKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0KICAgICAgICByZXR1cm4gJGRlcDE7CiAgICB9CiAgICAgcHVibGljIGZ1bmN0aW9uIEZvdXJ0aERlcCgpewogICAgICAgJGRlcDEgPSBbXTsKICAgICAgICBmb3IgKCRpPTA7JGk8MTM7JGkrKyl7CiAgICAgICAgJGE9bmV3IE1hbmFnZXIoMSk7CiAgICAgICRkZXAxW10gPSAkYS0+Z2V0SW5mbygpOwogICAgICAgIAogICAgICAgIH0KICAgICAgICBmb3IgKCRpPTA7JGk8NTskaSsrKXsKICAgICAgICAkYT1uZXcgTWFuYWdlcigyKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0KICAgICAgIGZvciAoJGk9MDskaTw1OyRpKyspewogICAgICAgICRhPW5ldyBFbmdpbmVlcigxKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0gCiAgICAgIHJldHVybiAkZGVwMTsKICAgIH0KICAgIAogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gYXJyYXlzdW0oJHZhciwgJGFycmF5KXsKICAgICAgICAkc3VtPVtdOwogICAgICAKICAgICAgIAogICAgICAgIApmb3JlYWNoICgkYXJyYXkgYXMgJHZhbHVlICl7CmZvciAoJGk9MDskaTxjb3VudCgkdmFsdWVbJHZhcl0pOyRpKyspewogICAgJHN1bVtdID0kdmFsdWVbJHZhcl07Cn0KICAgIH0KICAgIHJldHVybiBhcnJheV9zdW0oJHN1bSk7CiAgICB9CiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBBcnJheU1pZGRsZSgkbnVtYmVyKXsKICAgICAgICAgCiAgICAgIAogICAgICAgJG1pZGRsZSA9IG5ldyBEZXBhcnRtZW50KCk7CiAgICAgICAkYT0gJG1pZGRsZS0+YXJyYXlzdW0oJG51bWJlciwkbWlkZGxlLT5GaXJzdERlcCgpKTsKICAgICAgICRiPSAkbWlkZGxlLT5hcnJheXN1bSgkbnVtYmVyLCRtaWRkbGUtPlNlY29uZERlcCgpKTsKICAgICAgICRjPSAkbWlkZGxlLT5hcnJheXN1bSgkbnVtYmVyLCRtaWRkbGUtPlRoaXJkRGVwKCkpOwogICAgICAgJGQ9ICRtaWRkbGUtPmFycmF5c3VtKCRudW1iZXIsJG1pZGRsZS0+Rm91cnRoRGVwKCkpOwogICAgICAgJHN1bSA9ICRhKyRiKyRjKyRkOwogICAgcmV0dXJuICRzdW07CiAgICAKICAgICAgICAKICAgIH0KICAgIAp9CgogIGZ1bmN0aW9uIHBhZFJpZ2h0KCRzdHJpbmcsICRsZW5ndGgpewogICAgICAgICAgICByZXR1cm4gJHN0cmluZy49IHN0cl9yZXBlYXQoIiAiLCAkbGVuZ3RoLW1iX3N0cmxlbigkc3RyaW5nKSk7CiAgICAgICAgICAgICAKICAgICAgfQogICAgICAgICAgICAgZnVuY3Rpb24gcGFkTGVmdCgkc3RyaW5nLCAkbGVuZ3RoKXsKJHN0cmluZyA9IHN0cl9yZXBlYXQoIiAiLCAkbGVuZ3RoLW1iX3N0cmxlbigkc3RyaW5nKSkgLiRzdHJpbmc7CiAgICAgICAgICAgICAgcmV0dXJuICRzdHJpbmc7CiAgICAgICAgfQoKJGZpcnN0ZGVwID0gbmV3IERlcGFydG1lbnQoKTsKCgokY29sMSA9IDMwOwokY29sMiA9IDEwOwplY2hvIjxwcmU+IjsKICBlY2hvICAgcGFkUmlnaHQoItCU0LXQv9Cw0YDRgtCw0LzQtdC90YIiLCAkY29sMSkuCiAgICAgICAgICAgIHBhZExlZnQoItGB0L7RgtGAIiwgJGNvbDIpLgogICAgICAgICAgcGFkTGVmdCgi0YLRg9Cz0YAuIiwgJGNvbDIpLgogICAgICAgICAgICBwYWRMZWZ0KCLQutC+0YTQtSIsICRjb2wyKS4KICAgICAgICAgICAgcGFkTGVmdCgi0YHRgtGALiIsICRjb2wyKS4gCiAgICAgICAgICAgIHBhZExlZnQoItGC0YPQs9GALi/RgdGC0YAiLCAkY29sMikuICIgPGJyPiI7CiAgICAgICAgICAgICAKZm9yICgkaT0wOyRpPDUwOyRpKyspewogICAgZWNobyAiXyAiOwp9ICAKZWNobyI8YnI+IjsKZWNobyI8YnI+IjsKICAgIGVjaG8gcGFkUmlnaHQoItCX0LDQutGD0L/QvtC6IiwgJGNvbDEpLgogICAgICAgICAgICBwYWRMZWZ0KGNvdW50KCRmaXJzdGRlcC0+Rmlyc3REZXAoKSksICRjb2wyKS4KICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgwLCRmaXJzdGRlcC0+Rmlyc3REZXAoKSksICRjb2wyKS4KICAgICAgICAgICAgcGFkTGVmdCgkZmlyc3RkZXAtPmFycmF5c3VtKDEsJGZpcnN0ZGVwLT5GaXJzdERlcCgpKSwgJGNvbDIpLgogICAgICAgICAgICBwYWRMZWZ0KCRmaXJzdGRlcC0+YXJyYXlzdW0oMiwkZmlyc3RkZXAtPkZpcnN0RGVwKCkpLCAkY29sMikuIAogICAgICAgICAgICBwYWRMZWZ0KHJvdW5kKCRmaXJzdGRlcC0+YXJyYXlzdW0oMCwkZmlyc3RkZXAtPkZpcnN0RGVwKCkpLyRmaXJzdGRlcC0+YXJyYXlzdW0oMiwkZmlyc3RkZXAtPkZpcnN0RGVwKCkpKSwgJGNvbDIpLiAiIDxicj4iOwogICAgCmVjaG8iPGJyPiI7CiAgICBlY2hvIHBhZFJpZ2h0KCLQn9GA0L7QtNCw0LYiLCAkY29sMSkuCiAgICAgICAgICAgIHBhZExlZnQoY291bnQoJGZpcnN0ZGVwLT5TZWNvbmREZXAoKSksICRjb2wyKS4KICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgwLCRmaXJzdGRlcC0+U2Vjb25kRGVwKCkpLCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgxLCRmaXJzdGRlcC0+U2Vjb25kRGVwKCkpLCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgyLCRmaXJzdGRlcC0+U2Vjb25kRGVwKCkpLCAkY29sMikuIAogICAgICAgICAgICBwYWRMZWZ0KHJvdW5kKCRmaXJzdGRlcC0+YXJyYXlzdW0oMCwkZmlyc3RkZXAtPlNlY29uZERlcCgpKS8kZmlyc3RkZXAtPmFycmF5c3VtKDIsJGZpcnN0ZGVwLT5TZWNvbmREZXAoKSkpLCAkY29sMikuICIgPGJyPiI7CiAgICAKICAgIGVjaG8iPGJyPiI7CiAgICBlY2hvIHBhZFJpZ2h0KCLQoNC10LrQu9Cw0LzRiyIsICRjb2wxKS4KICAgICAgICAgICAgcGFkTGVmdChjb3VudCgkZmlyc3RkZXAtPlRoaXJkRGVwKCkpLCAkY29sMikuCiAgICAgICAgICBwYWRMZWZ0KCRmaXJzdGRlcC0+YXJyYXlzdW0oMCwkZmlyc3RkZXAtPlRoaXJkRGVwKCkpLCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgxLCRmaXJzdGRlcC0+VGhpcmREZXAoKSksICRjb2wyKS4KICAgICAgICAgICAgcGFkTGVmdCgkZmlyc3RkZXAtPmFycmF5c3VtKDIsJGZpcnN0ZGVwLT5UaGlyZERlcCgpKSwgJGNvbDIpLiAKICAgICAgICAgICAgcGFkTGVmdChyb3VuZCgkZmlyc3RkZXAtPmFycmF5c3VtKDAsJGZpcnN0ZGVwLT5UaGlyZERlcCgpKS8kZmlyc3RkZXAtPmFycmF5c3VtKDIsJGZpcnN0ZGVwLT5UaGlyZERlcCgpKSksICRjb2wyKS4gIiA8YnI+IjsKICAgIAogICAgIGVjaG8iPGJyPiI7CiAgICBlY2hvIHBhZFJpZ2h0KCLQm9C+0LPQuNGB0YLQuNC60LgiLCAkY29sMSkuCiAgICAgICAgICAgIHBhZExlZnQoY291bnQoJGZpcnN0ZGVwLT5Gb3VydGhEZXAoKSksICRjb2wyKS4KICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgwLCRmaXJzdGRlcC0+Rm91cnRoRGVwKCkpLCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgxLCRmaXJzdGRlcC0+Rm91cnRoRGVwKCkpLCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgyLCRmaXJzdGRlcC0+Rm91cnRoRGVwKCkpLCAkY29sMikuIAogICAgICAgICAgICBwYWRMZWZ0KHJvdW5kKCRmaXJzdGRlcC0+YXJyYXlzdW0oMCwkZmlyc3RkZXAtPkZvdXJ0aERlcCgpKS8kZmlyc3RkZXAtPmFycmF5c3VtKDIsJGZpcnN0ZGVwLT5Gb3VydGhEZXAoKSkpLCAkY29sMikuICIgPGJyPiI7CiAgICAKICAgICBlY2hvIjxicj4iOwogICAgICRhID0gICAgKGNvdW50KCRmaXJzdGRlcC0+Rmlyc3REZXAoKSkrY291bnQoJGZpcnN0ZGVwLT5TZWNvbmREZXAoKSkgK2NvdW50KCRmaXJzdGRlcC0+VGhpcmREZXAoKSkrY291bnQoJGZpcnN0ZGVwLT5Gb3VydGhEZXAoKSkpOwogICAgICAgICAgICBlY2hvIHBhZFJpZ2h0KCJD0YDQtdC00L3QtdC1IiwgJGNvbDEpLgogICAgICAgICAgICBwYWRMZWZ0KCRhLzQsICRjb2wyKS4KICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5BcnJheU1pZGRsZSgwKS80LCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5BcnJheU1pZGRsZSgxKS80LCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5BcnJheU1pZGRsZSgyKS80LCAkY29sMikuIAogICAgICAgICAgICBwYWRMZWZ0KChyb3VuZCgkZmlyc3RkZXAtPkFycmF5TWlkZGxlKDApLyRmaXJzdGRlcC0+QXJyYXlNaWRkbGUoMikpKSwgJGNvbDIpLiAiIDxicj4iOwoKICAgIGVjaG8gcGFkUmlnaHQoItCe0LHRidC10LUiLCAkY29sMSkuCiAgICAgICAgICAgIHBhZExlZnQoJGEsICRjb2wyKS4KICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5BcnJheU1pZGRsZSgwKSwgJGNvbDIpLgogICAgICAgICAgICBwYWRMZWZ0KCRmaXJzdGRlcC0+QXJyYXlNaWRkbGUoMSksICRjb2wyKS4KICAgICAgICAgICAgcGFkTGVmdCgkZmlyc3RkZXAtPkFycmF5TWlkZGxlKDIpLCAkY29sMikuIAogICAgICAgICAgICBwYWRMZWZ0KDEyLCAkY29sMikuICIgPGJyPiI7CgogICAgCg==