Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php eval("?>".base64_decode("PD9waHANCi8qDQpMaWNlbmNlIEZvciBkZXNpZ25zaG93LmlyDQpodHRwOi8..

Decoded Output download

?>b'<?php
/*
Licence For designshow.ir
http://designshow.ir/ */

if($_SERVER[\'HTTP_HOST\']!="www.icdst.org"  &&  $_SERVER[\'HTTP_HOST\']!="icdst.org")
    {
        echo "{\'errors\':\'    \'}";
        di();
    }
//Class Name : Persian Calendar Class
//Published Date: 2017/02/27
//Author Email : [email protected]


class Calendar
{

    public $OutputText = "";

// ghamari month name show
    function monthName($i) // $i = 1..12
    {
        static $month  = array(
            "", "", " ", " ",
            " ", " ", "", "",
            "", "", " ", " "
        );
        return $month[$i-1];
    }

    function GregorianToHijri($time = null)
    {
        if ($time === null) $time = time();
        $m = date(\'m\', $time);
        $d = date(\'d\', $time);
        $y = date(\'Y\', $time);

        return $this->JDToHijri(cal_to_jd(CAL_GREGORIAN, $m, $d, $y));
    }

    # Julian Day Count To Hijri
    function JDToHijri($jd)
    {
        $jd = $jd - 1948440 + 10632;
        $n  = (int)(($jd - 1) / 10631);
        $jd = $jd - 10631 * $n + 354;

        $j  = ((int)((10985 - $jd) / 5316)) *
            ((int)(50 * $jd / 17719)) +
            ((int)($jd / 5670)) *
            ((int)(43 * $jd / 15238));
        $jd = $jd - ((int)((30 - $j) / 15)) *
            ((int)((17719 * $j) / 50)) -
            ((int)($j / 16)) *
            ((int)((15238 * $j) / 43)) + 29;
        $m  = (int)(24 * $jd / 709);
        $d  = $jd - (int)(709 * $m / 24);
        $y  = 30*$n + $j - 29;

        return array($m, $d, $y);
    }

    # Hijri To Julian Day Count
    function HijriToJD($m, $d, $y)
    {
        return (int)((11 * $y + 3) / 30) +
        354 * $y + 30 * $m -
        (int)(($m - 1) / 2) + $d + 1948440 - 385;
    }
// ghamri end
    
    function ReturnMonthName($monname)
    {
            switch ($monname)
            {
            case 1: 
                return "";
                break;
            case 2: 
                return "";
                break;
            case 3: 
                return "";
                break;
            case 4: 
                return "";
                break;
            case 5: 
                return "";
                break;
            case 6: 
                return "";
                break;
            case 7: 
                return "";
                break;
            case 8: 
                return "";
                break;
            case 9: 
                return "";
                break;
            case 10: 
                return "";
                break;
            case 11: 
                return "";
                break;
            case 12: 
                return "";
                break;
            }
    }

    function div($a,$b) 
    {
        return (int) ($a / $b);
    }

    function gregorian_to_jalali ($g_y, $g_m, $g_d)
    {
        $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);     
    
       $gy = $g_y-1600;
       $gm = $g_m-1;
       $gd = $g_d-1;
    
       $g_day_no = 365*$gy+$this->div($gy+3,4)-$this->div($gy+99,100)+$this->div($gy+399,400);
    
       for ($i=0; $i < $gm; ++$i)
          $g_day_no += $g_days_in_month[$i];
       if ($gm>1 && (($gy%4==0 && $gy%100!=0) || ($gy%400==0)))
          /* leap and after Feb */
          $g_day_no++;
       $g_day_no += $gd;
    
       $j_day_no = $g_day_no-79;
    
       $j_np = $this->div($j_day_no, 12053); /* 12053 = 365*33 + 32/4 */
       $j_day_no = $j_day_no % 12053;
    
       $jy = 979+33*$j_np+4*$this->div($j_day_no,1461); /* 1461 = 365*4 + 4/4 */
    
       $j_day_no %= 1461;
    
       if ($j_day_no >= 366) {
          $jy += $this->div($j_day_no-1, 365);
          $j_day_no = ($j_day_no-1)%365;
       }
    
       for ($i = 0; $i < 11 && $j_day_no >= $j_days_in_month[$i]; ++$i)
          $j_day_no -= $j_days_in_month[$i];
       $jm = $i+1;
       $jd = $j_day_no+1;
    
       return array($jy, $jm, $jd);
    }
    
    function jalali_to_gregorian($j_y, $j_m, $j_d)
    {
        $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
        
       $jy = $j_y-979;
       $jm = $j_m-1;
       $jd = $j_d-1;
    
       $j_day_no = 365*$jy + $this->div($jy, 33)*8 + $this->div($jy%33+3, 4);
       for ($i=0; $i < $jm; ++$i)
          $j_day_no += $j_days_in_month[$i];
    
       $j_day_no += $jd;
    
       $g_day_no = $j_day_no+79;
    
       $gy = 1600 + 400*$this->div($g_day_no, 146097); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */
       $g_day_no = $g_day_no % 146097;
    
       $leap = true;
       if ($g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */
       {
          $g_day_no--;
          $gy += 100*$this->div($g_day_no,  36524); /* 36524 = 365*100 + 100/4 - 100/100 */
          $g_day_no = $g_day_no % 36524;
    
          if ($g_day_no >= 365)
             $g_day_no++;
          else
             $leap = false;
       }
    
       $gy += 4*$this->div($g_day_no, 1461); /* 1461 = 365*4 + 4/4 */
       $g_day_no %= 1461;
    
       if ($g_day_no >= 366) {
          $leap = false;
    
          $g_day_no--;
          $gy += $this->div($g_day_no, 365);
          $g_day_no = $g_day_no % 365;
       }
    
       for ($i = 0; $g_day_no >= $g_days_in_month[$i] + ($i == 1 && $leap); $i++)
          $g_day_no -= $g_days_in_month[$i] + ($i == 1 && $leap);
       $gm = $i+1;
       $gd = $g_day_no+1;
    
       return array($gy, $gm, $gd);
    }
    
    function EvaluateLeap($jyear)
    {
        list( $gyear, $gmonth, $gday1 ) = jalali_to_gregorian($jyear, 12, 29);
        list( $gyear, $gmonth, $gday2 ) = jalali_to_gregorian($jyear+1, 1, 1);
        if ($gday2 - $gday1 > 1) return true; else return false;
    }

    function CalculateTotalDays($jyear,$jmonth)
    {
        switch ($jmonth)
        {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            $TotalDays = 31;
            break;
            case 7:
            case 8:
            case 9:
            case 10:
            case 11:
            $TotalDays = 30;
            break;
            case 12:
            if (sLeapYear($jyear)=="false") $TotalDays = 30;  else $TotalDays = 29;
            $TotalDays = 29;
            break;
        }
        return $TotalDays;
    }





    // action : \'next\'=>\'xml\'  ,  \'preview\'=>\'xml\'  ,\'now\'=>\'xml\' , \'simpleNow\'=>\'text/html\'
    function ShowJalaliMonth($jyear,$jmonth,$action)
    {






        if ($action=="simpleNow")
        {
            $todaygyear = date("Y");
            $todaygmonth = date("m");
            $todaygday = date("d");
            list( $todayjyear, $todayjmonth, $todayjday ) = $this->gregorian_to_jalali($todaygyear, $todaygmonth, $todaygday);
            list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, 1);
            $FirstDay = mktime(0,0,0,$gmonth,$gday,$gyear);
            $FirstDayArray = getdate($FirstDay);
            $DayOfWeek = $FirstDayArray[\'wday\'];

            switch ($DayOfWeek)
            {
                case 0:
                    $Difference = -1;
                    break;
                case 1:
                    $Difference = -2;
                    break;
                case 2:
                    $Difference = -3;
                    break;
                case 3:
                    $Difference = -4;
                    break;
                case 4:
                    $Difference = -5;
                    break;
                case 5:
                    $Difference = -6;
                    break;
                case 6:
                    $Difference = 0;
                    break;
            }

                for ($i=0;$i<6;$i++)
            {
                $Const = 7 * $i + $Difference;
                $DaysInMonth = $this->CalculateTotalDays($jyear,$jmonth);
                $leap = $this->EvaluateLeap($jyear);
                if (($jmonth == 12) && ($leap == true)) $DaysInMonth++;




                $Output = $Const + 7;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {

                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div  onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                    if (($Const + 7 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        $this->OutputText .= " class=\'calColumn today holiday\' ";
                    }
                    else
                    {
                        $this->OutputText .= " class=\'calColumn day holiday\'";
                    }
                    $this->OutputText .= "><div>";
                    $this->OutputText .= $Output;
                    $this->OutputText .= "</div>";
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari

                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= "</div>";
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    // miladi
                    $this->OutputText .= $miladi[2];
                    $this->OutputText .= "</div>";


                    $this->OutputText .= "</div>";

                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";



                $Output = $Const + 6;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div  onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                    $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                    if (($Const + 6 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn today holiday\' ";
                        }
                        else
                        {
                            $this->OutputText .= " class=\' calColumn today\' ";
                        }

                    }
                    else
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\' calColumn day holiday\'";
                        }
                        else
                        {
                            $this->OutputText .= "class=\' calColumn day\'";
                        }

                    }
                    $this->OutputText .= \'><div>\';
                    $this->OutputText .= $Output;
                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari

                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= \'</div>\';
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= \'</div>\';


                    $this->OutputText .= \'</div>\';
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";





                $Output = $Const + 5;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                    $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                    if (($Const + 5 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn today holiday\' ";
                        }
                        else
                        {
                            $this->OutputText .= " class=\' calColumn today\' ";
                        }

                    }
                    else
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\' calColumn day holiday\'";
                        }
                        else
                        {
                            $this->OutputText .= " class=\' calColumn day\'";
                        }

                    }
                    $this->OutputText .= \'><div>\';
                    $this->OutputText .= $Output;
                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari
                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= \'</div>\';
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= \'</div>\';
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";






                $Output = $Const + 4;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                    $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                    if (($Const + 4 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn today holiday\' ";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn today\' ";
                        }

                    }
                    else
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn day holiday\'";
                        }
                        else
                        {
                            $this->OutputText .= "class=\' calColumn day\'";
                        }

                    }
                    $this->OutputText .= \'><div>\';
                    $this->OutputText .= $Output;
                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari

                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= \'</div>\';
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= \'</div>\';
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";




                $Output = $Const + 3;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                    $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                    if (($Const + 3 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn today holiday\' ";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn today\' ";
                        }

                    }
                    else
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn day holiday\'";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn day\'";
                        }

                    }
                    $this->OutputText .= \'><div>\';
                    $this->OutputText .= $Output;
                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari
                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= \'</div>\';
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= \'</div>\';
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";







                $Output = $Const + 2;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                    $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                    if (($Const + 2 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn today holiday\' ";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn today\' ";
                        }

                    }
                    else
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn day holiday\'";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn day\'";
                        }

                    }
                    $this->OutputText .= \'><div>\';
                    $this->OutputText .= $Output;
                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari
                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= \'</div>\';
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= \'</div>\';
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";






                $Output = $Const + 1;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                    $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                    if (($Const + 1 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn today holiday\' ";
                        }
                        else
                        {
                            $this->OutputText .= " class=\' calColumn today\' ";
                        }

                    }
                    else
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn day holiday\'";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn day\'";
                        }

                    }
                    $this->OutputText .= \'><div>\';
                    $this->OutputText .= $Output;
                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari
                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= \'</div>\';
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= \'</div>\';
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";



                
            }

            echo $this->OutputText;
        }



        if ($action == "preview")
         {

             $previewShamsiDate = shamsi_preview_month($jyear,$jmonth);
             $jyear   =  $previewShamsiDate[\'year\'];
             $jmonth  =  $previewShamsiDate[\'month\'];

             $calendar_top_items = get_top_miladi_and_ghamari($jyear,$jmonth);
             $miladitop = $calendar_top_items[\'miladi\'];
             $ghamaritop = $calendar_top_items[\'ghamari\'];

             $todaygyear = date("Y");
             $todaygmonth = date("m");
             $todaygday = date("d");
             list( $todayjyear, $todayjmonth, $todayjday ) = $this->gregorian_to_jalali($todaygyear, $todaygmonth, $todaygday);
             list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, 1);
             $FirstDay = mktime(0,0,0,$gmonth,$gday,$gyear);
             $FirstDayArray = getdate($FirstDay);
             $DayOfWeek = $FirstDayArray[\'wday\'];

             switch ($DayOfWeek)
             {

                 case 0:
                     $Difference = -1;
                     break;
                 case 1:
                     $Difference = -2;
                     break;
                 case 2:
                     $Difference = -3;
                     break;
                 case 3:
                     $Difference = -4;
                     break;
                 case 4:
                     $Difference = -5;
                     break;
                 case 5:
                     $Difference = -6;
                     break;
                 case 6:
                     $Difference = 0;
                     break;
             }






             for ($i=0;$i<6;$i++)
             {
                 $Const = 7 * $i + $Difference;
                 $DaysInMonth = $this->CalculateTotalDays($jyear,$jmonth);
                 $leap = $this->EvaluateLeap($jyear);
                 if (($jmonth == 12) && ($leap == true)) $DaysInMonth++;




                 $Output = $Const + 7;
                 if (($Output > 0) && ($Output <= $DaysInMonth)) {
                     $miladi =jalali_to_gregorian($jyear, $jmonth, $Output);
                     $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                     $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";


                     if (($Const + 7 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                     {
                             $this->OutputText .= " class=\'calColumn today holiday\' ";
                     }
                     else
                     {
                             $this->OutputText .= " class=\'calColumn day holiday\'";
                     }
                     $this->OutputText .= \'><div>\';
                     $this->OutputText .= $Output;
                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= "<div class=\'ghamari-date\'>";
                     // ghamari
                     $this->OutputText .= $hijri[2];
                     // ghamari
                     $this->OutputText .= \'</div>\';
                     // miladi
                     $this->OutputText .= "<div class=\'miladi-date\'>";
                     $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                     // miladi
                     $this->OutputText .= $miladiDay[2];

                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= \'</div>\';
                 }
                 else $this->OutputText .= "<div class=\'calColumn\'></div>";



                 $Output = $Const + 6;
                 if (($Output > 0) && ($Output <= $DaysInMonth)) {
                     $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                     $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                     $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                     $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                     if (($Const + 6 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                     {
                         if ($holidayStatus=="yes")
                         {
                             $this->OutputText .= " class=\'calColumn today holiday\' ";
                         }
                         else
                         {
                             $this->OutputText .= " class=\'calColumn today\' ";
                         }

                     }
                     else
                     {
                         if ($holidayStatus=="yes")
                         {
                             $this->OutputText .= " class=\'calColumn day holiday\'";
                         }
                         else
                         {
                             $this->OutputText .= " class=\'calColumn day\'";
                         }

                     }
                     $this->OutputText .= \'><div>\';
                     $this->OutputText .= $Output;
                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= "<div class=\'ghamari-date\'>";
                     // ghamari

                     $this->OutputText .= $hijri[2];
                     // ghamari
                     $this->OutputText .= \'</div>\';
                     // miladi
                     $this->OutputText .= "<div class=\'miladi-date\'>";
                     $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                     // miladi
                     $this->OutputText .= $miladiDay[2];

                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= \'</div>\';
                 }
                 else $this->OutputText .= "<div class=\'calColumn\'></div>";





                 $Output = $Const + 5;
                 if (($Output > 0) && ($Output <= $DaysInMonth)) {
                     $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                     $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                     $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                     $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                     if (($Const + 5 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                     {
                         if ($holidayStatus=="yes")
                         {
                             $this->OutputText .= " class=\'calColumn today holiday\' ";
                         }
                         else
                         {
                             $this->OutputText .= " class=\'calColumn today\' ";
                         }

                     }
                     else
                     {
                         if ($holidayStatus=="yes")
                         {
                             $this->OutputText .= " class=\'calColumn day holiday\'";
                         }
                         else
                         {
                             $this->OutputText .= " class=\'calColumn day\'";
                         }

                     }
                     $this->OutputText .= \'><div>\';
                     $this->OutputText .= $Output;
                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= "<div class=\'ghamari-date\'>";
                     // ghamari
                     $this->OutputText .= $hijri[2];
                     // ghamari
                     $this->OutputText .= \'</div>\';
                     // miladi
                     $this->OutputText .= "<div class=\'miladi-date\'>";
                     $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                     // miladi
                     $this->OutputText .= $miladiDay[2];

                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= \'</div>\';
                 }
                 else $this->OutputText .= "<div class=\'calColumn\'></div>";






                 $Output = $Const + 4;
                 if (($Output > 0) && ($Output <= $DaysInMonth)) {
                     $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                     $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                     $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                     $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                     if (($Const + 4 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                     {
                         if ($holidayStatus=="yes")
                         {
                             $this->OutputText .= " class=\'calColumn today holiday\' ";
                         }
                         else
                         {
                             $this->OutputText .= " class=\'calColumn today\' ";
                         }

                     }
                     else
                     {
                         if ($holidayStatus=="yes")
                         {
                             $this->OutputText .= " class=\'calColumn day holiday\'";
                         }
                         else
                         {
                             $this->OutputText .= " class=\'calColumn day\'";
                         }

                     }
                     $this->OutputText .= \'><div>\';
                     $this->OutputText .= $Output;
                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= "<div class=\'ghamari-date\'>";
                     // ghamari
                     $this->OutputText .= $hijri[2];
                     // ghamari
                     $this->OutputText .= \'</div>\';
                     // miladi
                     $this->OutputText .= "<div class=\'miladi-date\'>";
                     $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                     // miladi
                     $this->OutputText .= $miladiDay[2];

                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= \'</div>\';
                 }
                 else $this->OutputText .= "<div class=\'calColumn\'></div>";




                 $Output = $Const + 3;
                 if (($Output > 0) && ($Output <= $DaysInMonth)) {
                     $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                     $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                     $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                     $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                     if (($Const + 3 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                     {
                         if ($holidayStatus=="yes")
                         {
                             $this->OutputText .= " class=\'calColumn today holiday\' ";
                         }
                         else
                         {
                             $this->OutputText .= " class=\'calColumn today\' ";
                         }

                     }
                     else
                     {
                         if ($holidayStatus=="yes")
                         {
                             $this->OutputText .= " class=\'calColumn day holiday\'";
                         }
                         else
                         {
                             $this->OutputText .= " class=\'calColumn day\'";
                         }

                     }
                     $this->OutputText .= \'><div>\';
                     $this->OutputText .= $Output;
                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= "<div class=\'ghamari-date\'>";
                     // ghamari
                     $this->OutputText .= $hijri[2];
                     // ghamari
                     $this->OutputText .= \'</div>\';
                     // miladi
                     $this->OutputText .= "<div class=\'miladi-date\'>";
                     $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                     // miladi
                     $this->OutputText .= $miladiDay[2];

                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= \'</div>\';
                 }
                 else $this->OutputText .= "<div class=\'calColumn\'></div>";







                 $Output = $Const + 2;
                 if (($Output > 0) && ($Output <= $DaysInMonth)) {
                     $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                     $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                     $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                     $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                     if (($Const + 2 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                     {
                         if ($holidayStatus=="yes")
                         {
                             $this->OutputText .= " class=\'calColumn today holiday\' ";
                         }
                         else
                         {
                             $this->OutputText .= " class=\'calColumn today\' ";
                         }

                     }
                     else
                     {
                         if ($holidayStatus=="yes")
                         {
                             $this->OutputText .= " class=\'calColumn day holiday\'";
                         }
                         else
                         {
                             $this->OutputText .= " class=\'calColumn day\'";
                         }

                     }
                     $this->OutputText .= \'><div>\';
                     $this->OutputText .= $Output;
                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= "<div class=\'ghamari-date\'>";
                     // ghamari
                     $this->OutputText .= $hijri[2];
                     // ghamari
                     $this->OutputText .= \'</div>\';
                     // miladi
                     $this->OutputText .= "<div class=\'miladi-date\'>";
                     $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                     // miladi
                     $this->OutputText .= $miladiDay[2];

                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= \'</div>\';
                 }
                 else $this->OutputText .= "<div class=\'calColumn\'></div>";






                 $Output = $Const + 1;
                 if (($Output > 0) && ($Output <= $DaysInMonth)) {
                     $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                     $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                     $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                     $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                     if (($Const + 1 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                     {
                         if ($holidayStatus=="yes")
                         {
                             $this->OutputText .= " class=\'calColumn today holiday\' ";
                         }
                         else
                         {
                             $this->OutputText .= " class=\'calColumn today\' ";
                         }

                     }
                     else
                     {
                         if ($holidayStatus=="yes")
                         {
                             $this->OutputText .= " class=\'calColumn day holiday\'";
                         }
                         else
                         {
                             $this->OutputText .= " class=\'calColumn day\'";
                         }

                     }
                     $this->OutputText .= \'><div>\';
                     $this->OutputText .= $Output;
                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= "<div class=\'ghamari-date\'>";
                     // ghamari
                     $this->OutputText .= $hijri[2];
                     // ghamari
                     $this->OutputText .= \'</div>\';
                     // miladi
                     $this->OutputText .= "<div class=\'miladi-date\'>";
                     $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                     // miladi
                     $this->OutputText .= $miladiDay[2];

                     $this->OutputText .= \'</div>\';
                     $this->OutputText .= \'</div>\';
                 }
                 else $this->OutputText .= "<div class=\'calColumn\'></div>";


                 

             }





//             header("Content-type: text/xml; charset=UTF-8");
             $_SESSION[\'sal\'] = $jyear;
             $_SESSION[\'mah\'] = $jmonth;
             $newsXML = new SimpleXMLElement("<calendar></calendar>");
             $newsXML->addChild(\'tbl\', $this->OutputText);
             $newsXML->addChild(\'miladitop\',$miladitop);
             $newsXML->addChild(\'ghamaritop\',$ghamaritop);
             $newsXML->addChild(\'topsal\',$jyear);
             $newsXML->addChild(\'events\',get_month_events($jyear,$jmonth));
             $newsXML->addChild(\'topmah\',$this->ReturnMonthName($jmonth));
             echo $newsXML->asXML();




         }





        if ($action == "next")
        {


            $nextShamsiDate = shamsi_next_month($jyear,$jmonth);

            $jyear   =  $nextShamsiDate[\'year\'];
            $jmonth  =  $nextShamsiDate[\'month\'];

            $calendar_top_items = get_top_miladi_and_ghamari($jyear,$jmonth);
            $miladitop = $calendar_top_items[\'miladi\'];
            $ghamaritop = $calendar_top_items[\'ghamari\'];

            $todaygyear = date("Y");
            $todaygmonth = date("m");
            $todaygday = date("d");
            list( $todayjyear, $todayjmonth, $todayjday ) = $this->gregorian_to_jalali($todaygyear, $todaygmonth, $todaygday);
            list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, 1);
            $FirstDay = mktime(0,0,0,$gmonth,$gday,$gyear);
            $FirstDayArray = getdate($FirstDay);
            $DayOfWeek = $FirstDayArray[\'wday\'];

            switch ($DayOfWeek)
            {
                case 0:
                    $Difference = -1;
                    break;
                case 1:
                    $Difference = -2;
                    break;
                case 2:
                    $Difference = -3;
                    break;
                case 3:
                    $Difference = -4;
                    break;
                case 4:
                    $Difference = -5;
                    break;
                case 5:
                    $Difference = -6;
                    break;
                case 6:
                    $Difference = 0;
                    break;
            }






            for ($i=0;$i<6;$i++)
            {
                $Const = 7 * $i + $Difference;
                $DaysInMonth = $this->CalculateTotalDays($jyear,$jmonth);
                $leap = $this->EvaluateLeap($jyear);
                if (($jmonth == 12) && ($leap == true)) $DaysInMonth++;




                $Output = $Const + 7;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\' ";
                    if (($Const + 7 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        $this->OutputText .= " class=\'calColumn today holiday\' ";
                    }
                    else
                    {
                        $this->OutputText .= " class=\'calColumn day holiday\'";
                    }
                    $this->OutputText .= \'><div>\';
                    $this->OutputText .= $Output;
                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari
                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= \'</div>\';
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= \'</div>\';
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";



                $Output = $Const + 6;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                    $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                    if (($Const + 6 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn today holiday\' ";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn today\' ";
                        }

                    }
                    else
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn day holiday\'";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn day\'";
                        }

                    }
                    $this->OutputText .= \'><div>\';
                    $this->OutputText .= $Output;
                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari

                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= \'</div>\';
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= \'</div>\';
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";





                $Output = $Const + 5;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                    $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                    if (($Const + 5 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn today holiday\' ";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn today\' ";
                        }

                    }
                    else
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn day holiday\'";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn day\'";
                        }

                    }
                    $this->OutputText .= \'><div>\';
                    $this->OutputText .= $Output;
                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari
                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= \'</div>\';
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= \'</div>\';
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";






                $Output = $Const + 4;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                    $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                    if (($Const + 4 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn today holiday\' ";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn today\' ";
                        }

                    }
                    else
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn day holiday\'";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn day\'";
                        }

                    }
                    $this->OutputText .= \'><div>\';
                    $this->OutputText .= $Output;
                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari
                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= \'</div>\';
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= \'</div>\';
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";




                $Output = $Const + 3;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                    $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                    if (($Const + 3 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn today holiday\' ";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn today\' ";
                        }

                    }
                    else
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn day holiday\'";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn day\'";
                        }

                    }
                    $this->OutputText .= \'><div>\';
                    $this->OutputText .= $Output;
                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari
                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= \'</div>\';
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= \'</div>\';
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";







                $Output = $Const + 2;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                    $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                    if (($Const + 2 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn today holiday\' ";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn today\' ";
                        }

                    }
                    else
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn day holiday\'";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn day\'";
                        }

                    }
                    $this->OutputText .= \'><div>\';
                    $this->OutputText .= $Output;
                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari
                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= \'</div>\';
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= \'</div>\';
                    $this->OutputText .= \'</div>\';
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";






                $Output = $Const + 1;
                if (($Output > 0) && ($Output <= $DaysInMonth)) {
                    $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                    $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                    $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\' ";
                    $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                    if (($Const + 1 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn today holiday\' ";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn today\' ";
                        }

                    }
                    else
                    {
                        if ($holidayStatus=="yes")
                        {
                            $this->OutputText .= " class=\'calColumn day holiday\'";
                        }
                        else
                        {
                            $this->OutputText .= " class=\'calColumn day\'";
                        }

                    }
                    $this->OutputText .= "><div>";
                    $this->OutputText .= $Output;
                    $this->OutputText .= "</div>";
                    $this->OutputText .= "<div class=\'ghamari-date\'>";
                    // ghamari
                    $this->OutputText .= $hijri[2];
                    // ghamari
                    $this->OutputText .= "</div>";
                    // miladi
                    $this->OutputText .= "<div class=\'miladi-date\'>";
                    $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                    // miladi
                    $this->OutputText .= $miladiDay[2];

                    $this->OutputText .= "</div>";

                    $this->OutputText .= "</div>";
                }
                else $this->OutputText .= "<div class=\'calColumn\'></div>";


                

            }





//            header("Content-type: text/xml; charset=UTF-8");
            $_SESSION[\'sal\'] = $jyear;
            $_SESSION[\'mah\'] = $jmonth;
            $newsXML = new SimpleXMLElement("<calendar></calendar>");
            $newsXML->addChild(\'tbl\', $this->OutputText);
            $newsXML->addChild(\'miladitop\',$miladitop);
            $newsXML->addChild(\'ghamaritop\',$ghamaritop);
            $newsXML->addChild(\'topsal\',$jyear);
            $newsXML->addChild(\'events\',get_month_events($jyear,$jmonth));
            $newsXML->addChild(\'topmah\',$this->ReturnMonthName($jmonth));

            echo $newsXML->asXML();








        }






        // today xml output start
          if ($action=="now")
          {



              $calendar_top_items = get_top_miladi_and_ghamari($jyear,$jmonth);
              $miladitop = $calendar_top_items[\'miladi\'];
              $ghamaritop = $calendar_top_items[\'ghamari\'];

              $todaygyear = date("Y");
              $todaygmonth = date("m");
              $todaygday = date("d");
              list( $todayjyear, $todayjmonth, $todayjday ) = $this->gregorian_to_jalali($todaygyear, $todaygmonth, $todaygday);
              list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, 1);
              $FirstDay = mktime(0,0,0,$gmonth,$gday,$gyear);
              $FirstDayArray = getdate($FirstDay);
              $DayOfWeek = $FirstDayArray[\'wday\'];

              switch ($DayOfWeek)
              {
                  case 0:
                      $Difference = -1;
                      break;
                  case 1:
                      $Difference = -2;
                      break;
                  case 2:
                      $Difference = -3;
                      break;
                  case 3:
                      $Difference = -4;
                      break;
                  case 4:
                      $Difference = -5;
                      break;
                  case 5:
                      $Difference = -6;
                      break;
                  case 6:
                      $Difference = 0;
                      break;
              }






              for ($i=0;$i<6;$i++)
              {
                  $Const = 7 * $i + $Difference;
                  $DaysInMonth = $this->CalculateTotalDays($jyear,$jmonth);
                  $leap = $this->EvaluateLeap($jyear);
                  if (($jmonth == 12) && ($leap == true)) $DaysInMonth++;




                  $Output = $Const + 7;
                  if (($Output > 0) && ($Output <= $DaysInMonth)) {
                      $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                      $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
                      $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2]) \'";
                      if (($Const + 7 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                      {
                          $this->OutputText .= " class=\'calColumn today holiday\' ";
                      }
                      else
                      {
                          $this->OutputText .= " class=\'calColumn day holiday\'";
                      }


                      $this->OutputText .= \'><div>\';
                      $this->OutputText .= $Output;
                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= "<div class=\'ghamari-date\'>";
                      // ghamari
                      $this->OutputText .= $hijri[2];
                      // ghamari
                      $this->OutputText .= \'</div>\';
                      // miladi
                      $this->OutputText .= "<div class=\'miladi-date\'>";
                      $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                      // miladi
                      $this->OutputText .= $miladiDay[2];

                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= \'</div>\';



                  }
                  else $this->OutputText .= "<div class=\'calColumn\'></div>";




                  $Output = $Const + 6;
                  if (($Output > 0) && ($Output <= $DaysInMonth)) {
                      $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                      $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
                      $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                      $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                      if (($Const + 6 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                      {
                          if ($holidayStatus=="yes")
                          {
                              $this->OutputText .= " class=\'calColumn today holiday\' ";
                          }
                          else
                          {
                              $this->OutputText .= " class=\'calColumn today\' ";
                          }

                      }
                      else
                      {
                          if ($holidayStatus=="yes")
                          {
                              $this->OutputText .= " class=\'calColumn day holiday\'";
                          }
                          else
                          {
                              $this->OutputText .= " class=\'calColumn day\'";
                          }

                      }


                      $this->OutputText .= \'><div>\';
                      $this->OutputText .= $Output;
                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= "<div class=\'ghamari-date\'>";
                      // ghamari
                      $this->OutputText .= $hijri[2];
                      // ghamari
                      $this->OutputText .= \'</div>\';
                      // miladi
                      $this->OutputText .= "<div class=\'miladi-date\'>";
                      $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                      // miladi
                      $this->OutputText .= $miladiDay[2];

                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= \'</div>\';


                  }
                  else $this->OutputText .="<div class=\'calColumn\'></div>";





                  $Output = $Const + 5;
                  if (($Output > 0) && ($Output <= $DaysInMonth)) {
                      $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                      $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);

                      $this->OutputText .="<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";

                      $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                      if (($Const + 5 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                      {
                          if ($holidayStatus=="yes")
                          {
                              $this->OutputText .= " class=\'calColumn today holiday\' ";
                          }
                          else
                          {
                              $this->OutputText .= " class=\'calColumn today\' ";
                          }

                      }
                      else
                      {
                          if ($holidayStatus=="yes")
                          {
                              $this->OutputText .= " class=\'calColumn day holiday\'";
                          }
                          else
                          {
                              $this->OutputText .= " class=\'calColumn day\'";
                          }

                      }


                      $this->OutputText .= \'><div>\';
                      $this->OutputText .= $Output;
                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= "<div class=\'ghamari-date\'>";
                      // ghamari
                      $this->OutputText .= $hijri[2];
                      // ghamari
                      $this->OutputText .= \'</div>\';
                      // miladi
                      $this->OutputText .= "<div class=\'miladi-date\'>";
                      $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                      // miladi
                      $this->OutputText .= $miladiDay[2];

                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= \'</div>\';

                  }
                  else $this->OutputText .="<div class=\'calColumn\'></div>";






                  $Output = $Const + 4;
                  if (($Output > 0) && ($Output <= $DaysInMonth)) {
                      $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                      $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
                      $this->OutputText .="<div  onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";

                      $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                      if (($Const + 4 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                      {
                          if ($holidayStatus=="yes")
                          {
                              $this->OutputText .= " class=\'calColumn today holiday\' ";
                          }
                          else
                          {
                              $this->OutputText .= " class=\'calColumn today\' ";
                          }

                      }
                      else
                      {
                          if ($holidayStatus=="yes")
                          {
                              $this->OutputText .= " class=\'calColumn day holiday\'";
                          }
                          else
                          {
                              $this->OutputText .= " class=\'calColumn day\'";
                          }

                      }
                      $this->OutputText .= \'><div>\';
                      $this->OutputText .= $Output;
                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= "<div class=\'ghamari-date\'>";
                      // ghamari
                      $this->OutputText .= $hijri[2];
                      // ghamari
                      $this->OutputText .= \'</div>\';
                      // miladi
                      $this->OutputText .= "<div class=\'miladi-date\'>";
                      $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                      // miladi
                      $this->OutputText .= $miladiDay[2];

                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= \'</div>\';

                  }
                  else $this->OutputText .="<div class=\'calColumn\'></div>";




                  $Output = $Const + 3;
                  if (($Output > 0) && ($Output <= $DaysInMonth)) {
                      $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                      $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
                      $this->OutputText .="<div  onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                      $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                      if (($Const + 3 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                      {
                          if ($holidayStatus=="yes")
                          {
                              $this->OutputText .= " class=\'calColumn today holiday\' ";
                          }
                          else
                          {
                              $this->OutputText .= " class=\'calColumn today\' ";
                          }

                      }
                      else
                      {
                          if ($holidayStatus=="yes")
                          {
                              $this->OutputText .= " class=\'calColumn day holiday\'";
                          }
                          else
                          {
                              $this->OutputText .= " class=\'calColumn day\'";
                          }

                      }
                      $this->OutputText .= \'><div>\';
                      $this->OutputText .= $Output;
                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= "<div class=\'ghamari-date\'>";
                      // ghamari
                      $this->OutputText .= $hijri[2];
                      // ghamari
                      $this->OutputText .= \'</div>\';
                      // miladi
                      $this->OutputText .= "<div class=\'miladi-date\'>";
                      $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                      // miladi
                      $this->OutputText .= $miladiDay[2];

                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= \'</div>\';


                  }
                  else $this->OutputText .="<div class=\'calColumn\'></div>";







                  $Output = $Const + 2;
                  if (($Output > 0) && ($Output <= $DaysInMonth)) {
                      $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                      $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
                      $this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
                      $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                      if (($Const + 2 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                      {
                          if ($holidayStatus=="yes")
                          {
                              $this->OutputText .= " class=\'calColumn today holiday\' ";
                          }
                          else
                          {
                              $this->OutputText .= " class=\'calColumn today\' ";
                          }

                      }
                      else
                      {
                          if ($holidayStatus=="yes")
                          {
                              $this->OutputText .= " class=\'calColumn day holiday\'";
                          }
                          else
                          {
                              $this->OutputText .= " class=\'calColumn day\'";
                          }

                      }
                      $this->OutputText .= \'><div>\';
                      $this->OutputText .= $Output;
                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= "<div class=\'ghamari-date\'>";
                      // ghamari
                      $this->OutputText .= $hijri[2];
                      // ghamari
                      $this->OutputText .= \'</div>\';
                      // miladi
                      $this->OutputText .= "<div class=\'miladi-date\'>";
                      $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                      // miladi
                      $this->OutputText .= $miladiDay[2];

                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= \'</div>\';

                  }
                  else $this->OutputText .="<div class=\'calColumn\'></div>";






                  $Output = $Const + 1;
                  if (($Output > 0) && ($Output <= $DaysInMonth)) {
                      $miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
                      $hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
                      $this->OutputText .= "<div  onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";

                      $holidayStatus = is_holiday($jyear,$jmonth,$Output);
                      if (($Const + 1 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
                      {
                          if ($holidayStatus=="yes")
                          {
                              $this->OutputText .= "class=\'calColumn today holiday\' ";
                          }
                          else
                          {
                              $this->OutputText .= "class=\'calColumn today\' ";
                          }

                      }
                      else
                      {
                          if ($holidayStatus=="yes")
                          {
                              $this->OutputText .= " class=\'calColumn day holiday\'";
                          }
                          else
                          {
                              $this->OutputText .= " class=\'calColumn day\'";
                          }

                      }

                      $this->OutputText .= \'><div>\';
                      $this->OutputText .= $Output;
                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= "<div class=\'ghamari-date\'>";
                      // ghamari
                      $this->OutputText .= $hijri[2];
                      // ghamari
                      $this->OutputText .= \'</div>\';
                      // miladi
                      $this->OutputText .= "<div class=\'miladi-date\'>";
                      $miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
                      // miladi
                      $this->OutputText .= $miladiDay[2];

                      $this->OutputText .= \'</div>\';
                      $this->OutputText .= \'</div>\';

                  }
                  else $this->OutputText .="<div class=\'calColumn\'></div>";





                  
              }





























            //  header("Content-type: text/xml; charset=UTF-8");
              $_SESSION[\'sal\'] = $jyear;
              $_SESSION[\'mah\'] = $jmonth;
              $newsXML = new SimpleXMLElement("<calendar></calendar>");
              $newsXML->addChild(\'tbl\', $this->OutputText);
              $newsXML->addChild(\'miladitop\',$miladitop);
              $newsXML->addChild(\'ghamaritop\',$ghamaritop);
              $newsXML->addChild(\'topsal\',$jyear);
              $newsXML->addChild(\'topmah\',$this->ReturnMonthName($jmonth));
              $newsXML->addChild(\'events\',get_month_events($jyear,$jmonth));
              echo $newsXML->asXML();


          }
          // today xml output end








    }
}

'

Did this file decode correctly?

Original Code

<?php eval("?>".base64_decode("PD9waHANCi8qDQpMaWNlbmNlIEZvciBkZXNpZ25zaG93LmlyDQpodHRwOi8vZGVzaWduc2hvdy5pci8gKi8NCg0KaWYoJF9TRVJWRVJbJ0hUVFBfSE9TVCddIT0id3d3LmljZHN0Lm9yZyIgICYmICAkX1NFUlZFUlsnSFRUUF9IT1NUJ10hPSJpY2RzdC5vcmciKQ0KICAgIHsNCiAgICAgICAgZWNobyAieydlcnJvcnMnOifZhNin24zYs9mG2LPbjCDYqNix2KfbjCDYp9uM2YYg2K/Yp9mF2YbZhyDbjNin2YHYqid9IjsNCiAgICAgICAgZGkoKTsNCiAgICB9DQovL0NsYXNzIE5hbWUgOiBQZXJzaWFuIENhbGVuZGFyIENsYXNzDQovL1B1Ymxpc2hlZCBEYXRlOiAyMDE3LzAyLzI3DQovL0F1dGhvciBFbWFpbCA6IGhlc2FtaTEzQHlhaG9vLmNvbQ0KDQoNCmNsYXNzIENhbGVuZGFyDQp7DQoNCiAgICBwdWJsaWMgJE91dHB1dFRleHQgPSAiIjsNCg0KLy8gZ2hhbWFyaSBtb250aCBuYW1lIHNob3cNCiAgICBmdW5jdGlvbiBtb250aE5hbWUoJGkpIC8vICRpID0gMS4uMTINCiAgICB7DQogICAgICAgIHN0YXRpYyAkbW9udGggID0gYXJyYXkoDQogICAgICAgICAgICAi2YXYrdix2YUiLCAi2LXZgdixIiwgItix2KjbjNi5INin2YTYp9mI2YQiLCAi2LHYqNuM2Lkg2KfZhNir2KfZhtuMIiwNCiAgICAgICAgICAgICLYrNmF2KfYr9mKINin2YTYp9mI2YTZiiIsICLYrNmF2KfYr9mKINin2YTYq9in2YbZitmHIiwgItix2KzYqCIsICLYtNi52KjYp9mGIiwNCiAgICAgICAgICAgICLYsdmF2LbYp9mGIiwgIti02YjYp9mEIiwgItiw24wg2KfZhNmC2LnYr9mHIiwgItiw24wg2KfZhNit2KzZhyINCiAgICAgICAgKTsNCiAgICAgICAgcmV0dXJuICRtb250aFskaS0xXTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBHcmVnb3JpYW5Ub0hpanJpKCR0aW1lID0gbnVsbCkNCiAgICB7DQogICAgICAgIGlmICgkdGltZSA9PT0gbnVsbCkgJHRpbWUgPSB0aW1lKCk7DQogICAgICAgICRtID0gZGF0ZSgnbScsICR0aW1lKTsNCiAgICAgICAgJGQgPSBkYXRlKCdkJywgJHRpbWUpOw0KICAgICAgICAkeSA9IGRhdGUoJ1knLCAkdGltZSk7DQoNCiAgICAgICAgcmV0dXJuICR0aGlzLT5KRFRvSGlqcmkoY2FsX3RvX2pkKENBTF9HUkVHT1JJQU4sICRtLCAkZCwgJHkpKTsNCiAgICB9DQoNCiAgICAjIEp1bGlhbiBEYXkgQ291bnQgVG8gSGlqcmkNCiAgICBmdW5jdGlvbiBKRFRvSGlqcmkoJGpkKQ0KICAgIHsNCiAgICAgICAgJGpkID0gJGpkIC0gMTk0ODQ0MCArIDEwNjMyOw0KICAgICAgICAkbiAgPSAoaW50KSgoJGpkIC0gMSkgLyAxMDYzMSk7DQogICAgICAgICRqZCA9ICRqZCAtIDEwNjMxICogJG4gKyAzNTQ7DQoNCiAgICAgICAgJGogID0gKChpbnQpKCgxMDk4NSAtICRqZCkgLyA1MzE2KSkgKg0KICAgICAgICAgICAgKChpbnQpKDUwICogJGpkIC8gMTc3MTkpKSArDQogICAgICAgICAgICAoKGludCkoJGpkIC8gNTY3MCkpICoNCiAgICAgICAgICAgICgoaW50KSg0MyAqICRqZCAvIDE1MjM4KSk7DQogICAgICAgICRqZCA9ICRqZCAtICgoaW50KSgoMzAgLSAkaikgLyAxNSkpICoNCiAgICAgICAgICAgICgoaW50KSgoMTc3MTkgKiAkaikgLyA1MCkpIC0NCiAgICAgICAgICAgICgoaW50KSgkaiAvIDE2KSkgKg0KICAgICAgICAgICAgKChpbnQpKCgxNTIzOCAqICRqKSAvIDQzKSkgKyAyOTsNCiAgICAgICAgJG0gID0gKGludCkoMjQgKiAkamQgLyA3MDkpOw0KICAgICAgICAkZCAgPSAkamQgLSAoaW50KSg3MDkgKiAkbSAvIDI0KTsNCiAgICAgICAgJHkgID0gMzAqJG4gKyAkaiAtIDI5Ow0KDQogICAgICAgIHJldHVybiBhcnJheSgkbSwgJGQsICR5KTsNCiAgICB9DQoNCiAgICAjIEhpanJpIFRvIEp1bGlhbiBEYXkgQ291bnQNCiAgICBmdW5jdGlvbiBIaWpyaVRvSkQoJG0sICRkLCAkeSkNCiAgICB7DQogICAgICAgIHJldHVybiAoaW50KSgoMTEgKiAkeSArIDMpIC8gMzApICsNCiAgICAgICAgMzU0ICogJHkgKyAzMCAqICRtIC0NCiAgICAgICAgKGludCkoKCRtIC0gMSkgLyAyKSArICRkICsgMTk0ODQ0MCAtIDM4NTsNCiAgICB9DQovLyBnaGFtcmkgZW5kDQogICAgDQogICAgZnVuY3Rpb24gUmV0dXJuTW9udGhOYW1lKCRtb25uYW1lKQ0KICAgIHsNCiAgICAgICAgICAgIHN3aXRjaCAoJG1vbm5hbWUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICBjYXNlIDE6IA0KICAgICAgICAgICAgICAgIHJldHVybiAi2YHYsdmI2LHYr9mK2YYiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAyOiANCiAgICAgICAgICAgICAgICByZXR1cm4gItin2LHYr9mK2KjZh9i02KoiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAzOiANCiAgICAgICAgICAgICAgICByZXR1cm4gItiu2LHYr9in2K8iOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSA0OiANCiAgICAgICAgICAgICAgICByZXR1cm4gItiq2YrYsSI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlIDU6IA0KICAgICAgICAgICAgICAgIHJldHVybiAi2YXYsdiv2KfYryI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlIDY6IA0KICAgICAgICAgICAgICAgIHJldHVybiAi2LTZh9ix2YrZiNixIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgNzogDQogICAgICAgICAgICAgICAgcmV0dXJuICLZhdmH2LEiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSA4OiANCiAgICAgICAgICAgICAgICByZXR1cm4gItii2KjYp9mGIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgOTogDQogICAgICAgICAgICAgICAgcmV0dXJuICLYotiw2LEiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAxMDogDQogICAgICAgICAgICAgICAgcmV0dXJuICLYr9mJIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgMTE6IA0KICAgICAgICAgICAgICAgIHJldHVybiAi2KjZh9mF2YYiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAxMjogDQogICAgICAgICAgICAgICAgcmV0dXJuICLYp9iz2YHZhtivIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkaXYoJGEsJGIpIA0KICAgIHsNCiAgICAgICAgcmV0dXJuIChpbnQpICgkYSAvICRiKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBncmVnb3JpYW5fdG9famFsYWxpICgkZ195LCAkZ19tLCAkZ19kKQ0KICAgIHsNCiAgICAgICAgJGdfZGF5c19pbl9tb250aCA9IGFycmF5KDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEpOw0KICAgICAgICAkal9kYXlzX2luX21vbnRoID0gYXJyYXkoMzEsIDMxLCAzMSwgMzEsIDMxLCAzMSwgMzAsIDMwLCAzMCwgMzAsIDMwLCAyOSk7ICAgICANCiAgICANCiAgICAgICAkZ3kgPSAkZ195LTE2MDA7DQogICAgICAgJGdtID0gJGdfbS0xOw0KICAgICAgICRnZCA9ICRnX2QtMTsNCiAgICANCiAgICAgICAkZ19kYXlfbm8gPSAzNjUqJGd5KyR0aGlzLT5kaXYoJGd5KzMsNCktJHRoaXMtPmRpdigkZ3krOTksMTAwKSskdGhpcy0+ZGl2KCRneSszOTksNDAwKTsNCiAgICANCiAgICAgICBmb3IgKCRpPTA7ICRpIDwgJGdtOyArKyRpKQ0KICAgICAgICAgICRnX2RheV9ubyArPSAkZ19kYXlzX2luX21vbnRoWyRpXTsNCiAgICAgICBpZiAoJGdtPjEgJiYgKCgkZ3klND09MCAmJiAkZ3klMTAwIT0wKSB8fCAoJGd5JTQwMD09MCkpKQ0KICAgICAgICAgIC8qIGxlYXAgYW5kIGFmdGVyIEZlYiAqLw0KICAgICAgICAgICRnX2RheV9ubysrOw0KICAgICAgICRnX2RheV9ubyArPSAkZ2Q7DQogICAgDQogICAgICAgJGpfZGF5X25vID0gJGdfZGF5X25vLTc5Ow0KICAgIA0KICAgICAgICRqX25wID0gJHRoaXMtPmRpdigkal9kYXlfbm8sIDEyMDUzKTsgLyogMTIwNTMgPSAzNjUqMzMgKyAzMi80ICovDQogICAgICAgJGpfZGF5X25vID0gJGpfZGF5X25vICUgMTIwNTM7DQogICAgDQogICAgICAgJGp5ID0gOTc5KzMzKiRqX25wKzQqJHRoaXMtPmRpdigkal9kYXlfbm8sMTQ2MSk7IC8qIDE0NjEgPSAzNjUqNCArIDQvNCAqLw0KICAgIA0KICAgICAgICRqX2RheV9ubyAlPSAxNDYxOw0KICAgIA0KICAgICAgIGlmICgkal9kYXlfbm8gPj0gMzY2KSB7DQogICAgICAgICAgJGp5ICs9ICR0aGlzLT5kaXYoJGpfZGF5X25vLTEsIDM2NSk7DQogICAgICAgICAgJGpfZGF5X25vID0gKCRqX2RheV9uby0xKSUzNjU7DQogICAgICAgfQ0KICAgIA0KICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IDExICYmICRqX2RheV9ubyA+PSAkal9kYXlzX2luX21vbnRoWyRpXTsgKyskaSkNCiAgICAgICAgICAkal9kYXlfbm8gLT0gJGpfZGF5c19pbl9tb250aFskaV07DQogICAgICAgJGptID0gJGkrMTsNCiAgICAgICAkamQgPSAkal9kYXlfbm8rMTsNCiAgICANCiAgICAgICByZXR1cm4gYXJyYXkoJGp5LCAkam0sICRqZCk7DQogICAgfQ0KICAgIA0KICAgIGZ1bmN0aW9uIGphbGFsaV90b19ncmVnb3JpYW4oJGpfeSwgJGpfbSwgJGpfZCkNCiAgICB7DQogICAgICAgICRnX2RheXNfaW5fbW9udGggPSBhcnJheSgzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxKTsNCiAgICAgICAgJGpfZGF5c19pbl9tb250aCA9IGFycmF5KDMxLCAzMSwgMzEsIDMxLCAzMSwgMzEsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMjkpOw0KICAgICAgICANCiAgICAgICAkankgPSAkal95LTk3OTsNCiAgICAgICAkam0gPSAkal9tLTE7DQogICAgICAgJGpkID0gJGpfZC0xOw0KICAgIA0KICAgICAgICRqX2RheV9ubyA9IDM2NSokankgKyAkdGhpcy0+ZGl2KCRqeSwgMzMpKjggKyAkdGhpcy0+ZGl2KCRqeSUzMyszLCA0KTsNCiAgICAgICBmb3IgKCRpPTA7ICRpIDwgJGptOyArKyRpKQ0KICAgICAgICAgICRqX2RheV9ubyArPSAkal9kYXlzX2luX21vbnRoWyRpXTsNCiAgICANCiAgICAgICAkal9kYXlfbm8gKz0gJGpkOw0KICAgIA0KICAgICAgICRnX2RheV9ubyA9ICRqX2RheV9ubys3OTsNCiAgICANCiAgICAgICAkZ3kgPSAxNjAwICsgNDAwKiR0aGlzLT5kaXYoJGdfZGF5X25vLCAxNDYwOTcpOyAvKiAxNDYwOTcgPSAzNjUqNDAwICsgNDAwLzQgLSA0MDAvMTAwICsgNDAwLzQwMCAqLw0KICAgICAgICRnX2RheV9ubyA9ICRnX2RheV9ubyAlIDE0NjA5NzsNCiAgICANCiAgICAgICAkbGVhcCA9IHRydWU7DQogICAgICAgaWYgKCRnX2RheV9ubyA+PSAzNjUyNSkgLyogMzY1MjUgPSAzNjUqMTAwICsgMTAwLzQgKi8NCiAgICAgICB7DQogICAgICAgICAgJGdfZGF5X25vLS07DQogICAgICAgICAgJGd5ICs9IDEwMCokdGhpcy0+ZGl2KCRnX2RheV9ubywgIDM2NTI0KTsgLyogMzY1MjQgPSAzNjUqMTAwICsgMTAwLzQgLSAxMDAvMTAwICovDQogICAgICAgICAgJGdfZGF5X25vID0gJGdfZGF5X25vICUgMzY1MjQ7DQogICAgDQogICAgICAgICAgaWYgKCRnX2RheV9ubyA+PSAzNjUpDQogICAgICAgICAgICAgJGdfZGF5X25vKys7DQogICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICRsZWFwID0gZmFsc2U7DQogICAgICAgfQ0KICAgIA0KICAgICAgICRneSArPSA0KiR0aGlzLT5kaXYoJGdfZGF5X25vLCAxNDYxKTsgLyogMTQ2MSA9IDM2NSo0ICsgNC80ICovDQogICAgICAgJGdfZGF5X25vICU9IDE0NjE7DQogICAgDQogICAgICAgaWYgKCRnX2RheV9ubyA+PSAzNjYpIHsNCiAgICAgICAgICAkbGVhcCA9IGZhbHNlOw0KICAgIA0KICAgICAgICAgICRnX2RheV9uby0tOw0KICAgICAgICAgICRneSArPSAkdGhpcy0+ZGl2KCRnX2RheV9ubywgMzY1KTsNCiAgICAgICAgICAkZ19kYXlfbm8gPSAkZ19kYXlfbm8gJSAzNjU7DQogICAgICAgfQ0KICAgIA0KICAgICAgIGZvciAoJGkgPSAwOyAkZ19kYXlfbm8gPj0gJGdfZGF5c19pbl9tb250aFskaV0gKyAoJGkgPT0gMSAmJiAkbGVhcCk7ICRpKyspDQogICAgICAgICAgJGdfZGF5X25vIC09ICRnX2RheXNfaW5fbW9udGhbJGldICsgKCRpID09IDEgJiYgJGxlYXApOw0KICAgICAgICRnbSA9ICRpKzE7DQogICAgICAgJGdkID0gJGdfZGF5X25vKzE7DQogICAgDQogICAgICAgcmV0dXJuIGFycmF5KCRneSwgJGdtLCAkZ2QpOw0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBFdmFsdWF0ZUxlYXAoJGp5ZWFyKQ0KICAgIHsNCiAgICAgICAgbGlzdCggJGd5ZWFyLCAkZ21vbnRoLCAkZ2RheTEgKSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAxMiwgMjkpOw0KICAgICAgICBsaXN0KCAkZ3llYXIsICRnbW9udGgsICRnZGF5MiApID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIrMSwgMSwgMSk7DQogICAgICAgIGlmICgkZ2RheTIgLSAkZ2RheTEgPiAxKSByZXR1cm4gdHJ1ZTsgZWxzZSByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gQ2FsY3VsYXRlVG90YWxEYXlzKCRqeWVhciwkam1vbnRoKQ0KICAgIHsNCiAgICAgICAgc3dpdGNoICgkam1vbnRoKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICBjYXNlIDI6DQogICAgICAgICAgICBjYXNlIDM6DQogICAgICAgICAgICBjYXNlIDQ6DQogICAgICAgICAgICBjYXNlIDU6DQogICAgICAgICAgICBjYXNlIDY6DQogICAgICAgICAgICAkVG90YWxEYXlzID0gMzE7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgNzoNCiAgICAgICAgICAgIGNhc2UgODoNCiAgICAgICAgICAgIGNhc2UgOToNCiAgICAgICAgICAgIGNhc2UgMTA6DQogICAgICAgICAgICBjYXNlIDExOg0KICAgICAgICAgICAgJFRvdGFsRGF5cyA9IDMwOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlIDEyOg0KICAgICAgICAgICAgaWYgKHNMZWFwWWVhcigkanllYXIpPT0iZmFsc2UiKSAkVG90YWxEYXlzID0gMzA7ICBlbHNlICRUb3RhbERheXMgPSAyOTsNCiAgICAgICAgICAgICRUb3RhbERheXMgPSAyOTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkVG90YWxEYXlzOw0KICAgIH0NCg0KDQoNCg0KDQogICAgLy8gYWN0aW9uIDogJ25leHQnPT4neG1sJyAgLCAgJ3ByZXZpZXcnPT4neG1sJyAgLCdub3cnPT4neG1sJyAsICdzaW1wbGVOb3cnPT4ndGV4dC9odG1sJw0KICAgIGZ1bmN0aW9uIFNob3dKYWxhbGlNb250aCgkanllYXIsJGptb250aCwkYWN0aW9uKQ0KICAgIHsNCg0KDQoNCg0KDQoNCiAgICAgICAgaWYgKCRhY3Rpb249PSJzaW1wbGVOb3ciKQ0KICAgICAgICB7DQogICAgICAgICAgICAkdG9kYXlneWVhciA9IGRhdGUoIlkiKTsNCiAgICAgICAgICAgICR0b2RheWdtb250aCA9IGRhdGUoIm0iKTsNCiAgICAgICAgICAgICR0b2RheWdkYXkgPSBkYXRlKCJkIik7DQogICAgICAgICAgICBsaXN0KCAkdG9kYXlqeWVhciwgJHRvZGF5am1vbnRoLCAkdG9kYXlqZGF5ICkgPSAkdGhpcy0+Z3JlZ29yaWFuX3RvX2phbGFsaSgkdG9kYXlneWVhciwgJHRvZGF5Z21vbnRoLCAkdG9kYXlnZGF5KTsNCiAgICAgICAgICAgIGxpc3QoICRneWVhciwgJGdtb250aCwgJGdkYXkgKSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAxKTsNCiAgICAgICAgICAgICRGaXJzdERheSA9IG1rdGltZSgwLDAsMCwkZ21vbnRoLCRnZGF5LCRneWVhcik7DQogICAgICAgICAgICAkRmlyc3REYXlBcnJheSA9IGdldGRhdGUoJEZpcnN0RGF5KTsNCiAgICAgICAgICAgICREYXlPZldlZWsgPSAkRmlyc3REYXlBcnJheVsnd2RheSddOw0KDQogICAgICAgICAgICBzd2l0Y2ggKCREYXlPZldlZWspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC0xOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTI7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgMjoNCiAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtMzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAzOg0KICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC00Ow0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlIDQ6DQogICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgNToNCiAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtNjsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSA2Og0KICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IDA7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZm9yICgkaT0wOyRpPDY7JGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAkQ29uc3QgPSA3ICogJGkgKyAkRGlmZmVyZW5jZTsNCiAgICAgICAgICAgICAgICAkRGF5c0luTW9udGggPSAkdGhpcy0+Q2FsY3VsYXRlVG90YWxEYXlzKCRqeWVhciwkam1vbnRoKTsNCiAgICAgICAgICAgICAgICAkbGVhcCA9ICR0aGlzLT5FdmFsdWF0ZUxlYXAoJGp5ZWFyKTsNCiAgICAgICAgICAgICAgICBpZiAoKCRqbW9udGggPT0gMTIpICYmICgkbGVhcCA9PSB0cnVlKSkgJERheXNJbk1vbnRoKys7DQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgNzsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgJGhpanJpID0gZ3JlZ29yaWFuX3RvX2doYW1hcmkoJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0pOw0KDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2ICBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA3ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIj48ZGl2PiI7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8L2Rpdj4iOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8L2Rpdj4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjwvZGl2PiI7DQoNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPC9kaXY+IjsNCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDY7DQogICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgIG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgNiA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9JyBjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nIGNhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICJjbGFzcz0nIGNhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkT3V0cHV0Ow0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQoNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgNTsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDUgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPScgY2FsQ29sdW1uIHRvZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9JyBjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPScgY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KDQogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDQ7DQogICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICRob2xpZGF5U3RhdHVzID0gaXNfaG9saWRheSgkanllYXIsJGptb250aCwkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA0ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICJjbGFzcz0nIGNhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkT3V0cHV0Ow0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMzsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDMgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMjsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDIgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KDQogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDE7DQogICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICRob2xpZGF5U3RhdHVzID0gaXNfaG9saWRheSgkanllYXIsJGptb250aCwkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyAxID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nIGNhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPjxkaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaURheVsyXTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZWNobyAkdGhpcy0+T3V0cHV0VGV4dDsNCiAgICAgICAgfQ0KDQoNCg0KICAgICAgICBpZiAoJGFjdGlvbiA9PSAicHJldmlldyIpDQogICAgICAgICB7DQoNCiAgICAgICAgICAgICAkcHJldmlld1NoYW1zaURhdGUgPSBzaGFtc2lfcHJldmlld19tb250aCgkanllYXIsJGptb250aCk7DQogICAgICAgICAgICAgJGp5ZWFyICAgPSAgJHByZXZpZXdTaGFtc2lEYXRlWyd5ZWFyJ107DQogICAgICAgICAgICAgJGptb250aCAgPSAgJHByZXZpZXdTaGFtc2lEYXRlWydtb250aCddOw0KDQogICAgICAgICAgICAgJGNhbGVuZGFyX3RvcF9pdGVtcyA9IGdldF90b3BfbWlsYWRpX2FuZF9naGFtYXJpKCRqeWVhciwkam1vbnRoKTsNCiAgICAgICAgICAgICAkbWlsYWRpdG9wID0gJGNhbGVuZGFyX3RvcF9pdGVtc1snbWlsYWRpJ107DQogICAgICAgICAgICAgJGdoYW1hcml0b3AgPSAkY2FsZW5kYXJfdG9wX2l0ZW1zWydnaGFtYXJpJ107DQoNCiAgICAgICAgICAgICAkdG9kYXlneWVhciA9IGRhdGUoIlkiKTsNCiAgICAgICAgICAgICAkdG9kYXlnbW9udGggPSBkYXRlKCJtIik7DQogICAgICAgICAgICAgJHRvZGF5Z2RheSA9IGRhdGUoImQiKTsNCiAgICAgICAgICAgICBsaXN0KCAkdG9kYXlqeWVhciwgJHRvZGF5am1vbnRoLCAkdG9kYXlqZGF5ICkgPSAkdGhpcy0+Z3JlZ29yaWFuX3RvX2phbGFsaSgkdG9kYXlneWVhciwgJHRvZGF5Z21vbnRoLCAkdG9kYXlnZGF5KTsNCiAgICAgICAgICAgICBsaXN0KCAkZ3llYXIsICRnbW9udGgsICRnZGF5ICkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgMSk7DQogICAgICAgICAgICAgJEZpcnN0RGF5ID0gbWt0aW1lKDAsMCwwLCRnbW9udGgsJGdkYXksJGd5ZWFyKTsNCiAgICAgICAgICAgICAkRmlyc3REYXlBcnJheSA9IGdldGRhdGUoJEZpcnN0RGF5KTsNCiAgICAgICAgICAgICAkRGF5T2ZXZWVrID0gJEZpcnN0RGF5QXJyYXlbJ3dkYXknXTsNCg0KICAgICAgICAgICAgIHN3aXRjaCAoJERheU9mV2VlaykNCiAgICAgICAgICAgICB7DQoNCiAgICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC0yOw0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgIGNhc2UgMjoNCiAgICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTM7DQogICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgY2FzZSAzOg0KICAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtNDsNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICBjYXNlIDQ6DQogICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC01Ow0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgIGNhc2UgNToNCiAgICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTY7DQogICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgY2FzZSA2Og0KICAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgfQ0KDQoNCg0KDQoNCg0KICAgICAgICAgICAgIGZvciAoJGk9MDskaTw2OyRpKyspDQogICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAkQ29uc3QgPSA3ICogJGkgKyAkRGlmZmVyZW5jZTsNCiAgICAgICAgICAgICAgICAgJERheXNJbk1vbnRoID0gJHRoaXMtPkNhbGN1bGF0ZVRvdGFsRGF5cygkanllYXIsJGptb250aCk7DQogICAgICAgICAgICAgICAgICRsZWFwID0gJHRoaXMtPkV2YWx1YXRlTGVhcCgkanllYXIpOw0KICAgICAgICAgICAgICAgICBpZiAoKCRqbW9udGggPT0gMTIpICYmICgkbGVhcCA9PSB0cnVlKSkgJERheXNJbk1vbnRoKys7DQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDc7DQogICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPWphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA3ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCiAgICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDY7DQogICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KICAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA2ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPjxkaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQoNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KDQogICAgICAgICAgICAgICAgICRPdXRwdXQgPSAkQ29uc3QgKyA1Ow0KICAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgJGhpanJpID0gZ3JlZ29yaWFuX3RvX2doYW1hcmkoJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0pOw0KDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgICRob2xpZGF5U3RhdHVzID0gaXNfaG9saWRheSgkanllYXIsJGptb250aCwkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgNSA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkT3V0cHV0Ow0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgICRtaWxhZGlEYXkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgZWxzZSAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCg0KDQoNCg0KICAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgNDsNCiAgICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDQgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KICAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMzsNCiAgICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDMgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KDQoNCg0KICAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMjsNCiAgICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDIgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDE7DQogICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KICAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyAxID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPjxkaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkaGlqcmlbMl07DQogICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgIC8vIG1pbGFkaQ0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgIC8vIG1pbGFkaQ0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaURheVsyXTsNCg0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KICAgICAgICAgICAgICAgICANCg0KICAgICAgICAgICAgIH0NCg0KDQoNCg0KDQovLyAgICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogdGV4dC94bWw7IGNoYXJzZXQ9VVRGLTgiKTsNCiAgICAgICAgICAgICAkX1NFU1NJT05bJ3NhbCddID0gJGp5ZWFyOw0KICAgICAgICAgICAgICRfU0VTU0lPTlsnbWFoJ10gPSAkam1vbnRoOw0KICAgICAgICAgICAgICRuZXdzWE1MID0gbmV3IFNpbXBsZVhNTEVsZW1lbnQoIjxjYWxlbmRhcj48L2NhbGVuZGFyPiIpOw0KICAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgndGJsJywgJHRoaXMtPk91dHB1dFRleHQpOw0KICAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgnbWlsYWRpdG9wJywkbWlsYWRpdG9wKTsNCiAgICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ2doYW1hcml0b3AnLCRnaGFtYXJpdG9wKTsNCiAgICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ3RvcHNhbCcsJGp5ZWFyKTsNCiAgICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ2V2ZW50cycsZ2V0X21vbnRoX2V2ZW50cygkanllYXIsJGptb250aCkpOw0KICAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgndG9wbWFoJywkdGhpcy0+UmV0dXJuTW9udGhOYW1lKCRqbW9udGgpKTsNCiAgICAgICAgICAgICBlY2hvICRuZXdzWE1MLT5hc1hNTCgpOw0KDQoNCg0KDQogICAgICAgICB9DQoNCg0KDQoNCg0KICAgICAgICBpZiAoJGFjdGlvbiA9PSAibmV4dCIpDQogICAgICAgIHsNCg0KDQogICAgICAgICAgICAkbmV4dFNoYW1zaURhdGUgPSBzaGFtc2lfbmV4dF9tb250aCgkanllYXIsJGptb250aCk7DQoNCiAgICAgICAgICAgICRqeWVhciAgID0gICRuZXh0U2hhbXNpRGF0ZVsneWVhciddOw0KICAgICAgICAgICAgJGptb250aCAgPSAgJG5leHRTaGFtc2lEYXRlWydtb250aCddOw0KDQogICAgICAgICAgICAkY2FsZW5kYXJfdG9wX2l0ZW1zID0gZ2V0X3RvcF9taWxhZGlfYW5kX2doYW1hcmkoJGp5ZWFyLCRqbW9udGgpOw0KICAgICAgICAgICAgJG1pbGFkaXRvcCA9ICRjYWxlbmRhcl90b3BfaXRlbXNbJ21pbGFkaSddOw0KICAgICAgICAgICAgJGdoYW1hcml0b3AgPSAkY2FsZW5kYXJfdG9wX2l0ZW1zWydnaGFtYXJpJ107DQoNCiAgICAgICAgICAgICR0b2RheWd5ZWFyID0gZGF0ZSgiWSIpOw0KICAgICAgICAgICAgJHRvZGF5Z21vbnRoID0gZGF0ZSgibSIpOw0KICAgICAgICAgICAgJHRvZGF5Z2RheSA9IGRhdGUoImQiKTsNCiAgICAgICAgICAgIGxpc3QoICR0b2RheWp5ZWFyLCAkdG9kYXlqbW9udGgsICR0b2RheWpkYXkgKSA9ICR0aGlzLT5ncmVnb3JpYW5fdG9famFsYWxpKCR0b2RheWd5ZWFyLCAkdG9kYXlnbW9udGgsICR0b2RheWdkYXkpOw0KICAgICAgICAgICAgbGlzdCggJGd5ZWFyLCAkZ21vbnRoLCAkZ2RheSApID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsIDEpOw0KICAgICAgICAgICAgJEZpcnN0RGF5ID0gbWt0aW1lKDAsMCwwLCRnbW9udGgsJGdkYXksJGd5ZWFyKTsNCiAgICAgICAgICAgICRGaXJzdERheUFycmF5ID0gZ2V0ZGF0ZSgkRmlyc3REYXkpOw0KICAgICAgICAgICAgJERheU9mV2VlayA9ICRGaXJzdERheUFycmF5Wyd3ZGF5J107DQoNCiAgICAgICAgICAgIHN3aXRjaCAoJERheU9mV2VlaykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlIDA6DQogICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTE7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtMjsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAyOg0KICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC0zOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlIDM6DQogICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTQ7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgNDoNCiAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtNTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSA1Og0KICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC02Ow0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlIDY6DQogICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gMDsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCg0KDQoNCg0KDQogICAgICAgICAgICBmb3IgKCRpPTA7JGk8NjskaSsrKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRDb25zdCA9IDcgKiAkaSArICREaWZmZXJlbmNlOw0KICAgICAgICAgICAgICAgICREYXlzSW5Nb250aCA9ICR0aGlzLT5DYWxjdWxhdGVUb3RhbERheXMoJGp5ZWFyLCRqbW9udGgpOw0KICAgICAgICAgICAgICAgICRsZWFwID0gJHRoaXMtPkV2YWx1YXRlTGVhcCgkanllYXIpOw0KICAgICAgICAgICAgICAgIGlmICgoJGptb250aCA9PSAxMikgJiYgKCRsZWFwID09IHRydWUpKSAkRGF5c0luTW9udGgrKzsNCg0KDQoNCg0KICAgICAgICAgICAgICAgICRPdXRwdXQgPSAkQ29uc3QgKyA3Ow0KICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgJGhpanJpID0gZ3JlZ29yaWFuX3RvX2doYW1hcmkoJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0pOw0KDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKScgIjsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA3ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDY7DQogICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICRob2xpZGF5U3RhdHVzID0gaXNfaG9saWRheSgkanllYXIsJGptb250aCwkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA2ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkT3V0cHV0Ow0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KICAgICAgICAgICAgICAgICRPdXRwdXQgPSAkQ29uc3QgKyA1Ow0KICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgJGhpanJpID0gZ3JlZ29yaWFuX3RvX2doYW1hcmkoJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0pOw0KDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgNSA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPjxkaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaURheVsyXTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgNDsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDQgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMzsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDMgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMjsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDIgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KDQogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDE7DQogICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyAiOw0KICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgMSA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPjxkaXY+IjsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjwvZGl2PiI7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8L2Rpdj4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaURheVsyXTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPC9kaXY+IjsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPC9kaXY+IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCiAgICAgICAgICAgICAgICANCg0KICAgICAgICAgICAgfQ0KDQoNCg0KDQoNCi8vICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LXR5cGU6IHRleHQveG1sOyBjaGFyc2V0PVVURi04Iik7DQogICAgICAgICAgICAkX1NFU1NJT05bJ3NhbCddID0gJGp5ZWFyOw0KICAgICAgICAgICAgJF9TRVNTSU9OWydtYWgnXSA9ICRqbW9udGg7DQogICAgICAgICAgICAkbmV3c1hNTCA9IG5ldyBTaW1wbGVYTUxFbGVtZW50KCI8Y2FsZW5kYXI+PC9jYWxlbmRhcj4iKTsNCiAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgndGJsJywgJHRoaXMtPk91dHB1dFRleHQpOw0KICAgICAgICAgICAgJG5ld3NYTUwtPmFkZENoaWxkKCdtaWxhZGl0b3AnLCRtaWxhZGl0b3ApOw0KICAgICAgICAgICAgJG5ld3NYTUwtPmFkZENoaWxkKCdnaGFtYXJpdG9wJywkZ2hhbWFyaXRvcCk7DQogICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ3RvcHNhbCcsJGp5ZWFyKTsNCiAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgnZXZlbnRzJyxnZXRfbW9udGhfZXZlbnRzKCRqeWVhciwkam1vbnRoKSk7DQogICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ3RvcG1haCcsJHRoaXMtPlJldHVybk1vbnRoTmFtZSgkam1vbnRoKSk7DQoNCiAgICAgICAgICAgIGVjaG8gJG5ld3NYTUwtPmFzWE1MKCk7DQoNCg0KDQoNCg0KDQoNCg0KICAgICAgICB9DQoNCg0KDQoNCg0KDQogICAgICAgIC8vIHRvZGF5IHhtbCBvdXRwdXQgc3RhcnQNCiAgICAgICAgICBpZiAoJGFjdGlvbj09Im5vdyIpDQogICAgICAgICAgew0KDQoNCg0KICAgICAgICAgICAgICAkY2FsZW5kYXJfdG9wX2l0ZW1zID0gZ2V0X3RvcF9taWxhZGlfYW5kX2doYW1hcmkoJGp5ZWFyLCRqbW9udGgpOw0KICAgICAgICAgICAgICAkbWlsYWRpdG9wID0gJGNhbGVuZGFyX3RvcF9pdGVtc1snbWlsYWRpJ107DQogICAgICAgICAgICAgICRnaGFtYXJpdG9wID0gJGNhbGVuZGFyX3RvcF9pdGVtc1snZ2hhbWFyaSddOw0KDQogICAgICAgICAgICAgICR0b2RheWd5ZWFyID0gZGF0ZSgiWSIpOw0KICAgICAgICAgICAgICAkdG9kYXlnbW9udGggPSBkYXRlKCJtIik7DQogICAgICAgICAgICAgICR0b2RheWdkYXkgPSBkYXRlKCJkIik7DQogICAgICAgICAgICAgIGxpc3QoICR0b2RheWp5ZWFyLCAkdG9kYXlqbW9udGgsICR0b2RheWpkYXkgKSA9ICR0aGlzLT5ncmVnb3JpYW5fdG9famFsYWxpKCR0b2RheWd5ZWFyLCAkdG9kYXlnbW9udGgsICR0b2RheWdkYXkpOw0KICAgICAgICAgICAgICBsaXN0KCAkZ3llYXIsICRnbW9udGgsICRnZGF5ICkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgMSk7DQogICAgICAgICAgICAgICRGaXJzdERheSA9IG1rdGltZSgwLDAsMCwkZ21vbnRoLCRnZGF5LCRneWVhcik7DQogICAgICAgICAgICAgICRGaXJzdERheUFycmF5ID0gZ2V0ZGF0ZSgkRmlyc3REYXkpOw0KICAgICAgICAgICAgICAkRGF5T2ZXZWVrID0gJEZpcnN0RGF5QXJyYXlbJ3dkYXknXTsNCg0KICAgICAgICAgICAgICBzd2l0Y2ggKCREYXlPZldlZWspDQogICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgIGNhc2UgMDoNCiAgICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC0xOw0KICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgY2FzZSAxOg0KICAgICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTI7DQogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICBjYXNlIDI6DQogICAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtMzsNCiAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgIGNhc2UgMzoNCiAgICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC00Ow0KICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgY2FzZSA0Og0KICAgICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTU7DQogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICBjYXNlIDU6DQogICAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtNjsNCiAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgIGNhc2UgNjoNCiAgICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgIH0NCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgZm9yICgkaT0wOyRpPDY7JGkrKykNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgJENvbnN0ID0gNyAqICRpICsgJERpZmZlcmVuY2U7DQogICAgICAgICAgICAgICAgICAkRGF5c0luTW9udGggPSAkdGhpcy0+Q2FsY3VsYXRlVG90YWxEYXlzKCRqeWVhciwkam1vbnRoKTsNCiAgICAgICAgICAgICAgICAgICRsZWFwID0gJHRoaXMtPkV2YWx1YXRlTGVhcCgkanllYXIpOw0KICAgICAgICAgICAgICAgICAgaWYgKCgkam1vbnRoID09IDEyKSAmJiAoJGxlYXAgPT0gdHJ1ZSkpICREYXlzSW5Nb250aCsrOw0KDQoNCg0KDQogICAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgNzsNCiAgICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSkgJyI7DQogICAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA3ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPjxkaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkT3V0cHV0Ow0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAgICRtaWxhZGlEYXkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaURheVsyXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KDQoNCg0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgZWxzZSAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCg0KDQogICAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgNjsNCiAgICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA2ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQoNCg0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgZWxzZSAkdGhpcy0+T3V0cHV0VGV4dCAuPSI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KICAgICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDU7DQogICAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSI8ZGl2IG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KDQogICAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgNSA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPjxkaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkT3V0cHV0Ow0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAgICRtaWxhZGlEYXkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaURheVsyXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49IjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgICRPdXRwdXQgPSAkQ29uc3QgKyA0Ow0KICAgICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAgJGhpanJpID0gZ3JlZ29yaWFuX3RvX2doYW1hcmkoJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0pOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49IjxkaXYgIG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KDQogICAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgNCA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQoNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0iPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCg0KDQogICAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMzsNCiAgICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSI8ZGl2ICBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyAzID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkaGlqcmlbMl07DQogICAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIG1pbGFkaQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIG1pbGFkaQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCg0KDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49IjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KDQoNCg0KICAgICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDI7DQogICAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgMiA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQoNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0iPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCg0KDQoNCg0KICAgICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDE7DQogICAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgIG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KDQogICAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgMSA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gImNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICJjbGFzcz0nY2FsQ29sdW1uIHRvZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQoNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0iPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICB9DQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KICAgICAgICAgICAgLy8gIGhlYWRlcigiQ29udGVudC10eXBlOiB0ZXh0L3htbDsgY2hhcnNldD1VVEYtOCIpOw0KICAgICAgICAgICAgICAkX1NFU1NJT05bJ3NhbCddID0gJGp5ZWFyOw0KICAgICAgICAgICAgICAkX1NFU1NJT05bJ21haCddID0gJGptb250aDsNCiAgICAgICAgICAgICAgJG5ld3NYTUwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgiPGNhbGVuZGFyPjwvY2FsZW5kYXI+Iik7DQogICAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgndGJsJywgJHRoaXMtPk91dHB1dFRleHQpOw0KICAgICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ21pbGFkaXRvcCcsJG1pbGFkaXRvcCk7DQogICAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgnZ2hhbWFyaXRvcCcsJGdoYW1hcml0b3ApOw0KICAgICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ3RvcHNhbCcsJGp5ZWFyKTsNCiAgICAgICAgICAgICAgJG5ld3NYTUwtPmFkZENoaWxkKCd0b3BtYWgnLCR0aGlzLT5SZXR1cm5Nb250aE5hbWUoJGptb250aCkpOw0KICAgICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ2V2ZW50cycsZ2V0X21vbnRoX2V2ZW50cygkanllYXIsJGptb250aCkpOw0KICAgICAgICAgICAgICBlY2hvICRuZXdzWE1MLT5hc1hNTCgpOw0KDQoNCiAgICAgICAgICB9DQogICAgICAgICAgLy8gdG9kYXkgeG1sIG91dHB1dCBlbmQNCg0KDQoNCg0KDQoNCg0KDQogICAgfQ0KfQ0KDQo=")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 9015b1fc6cb12136b50986101ff2eff2
Eval Count 1
Decode Time 139 ms