<?php 
 
 /* http://d...content-available-to-author-only...2.net/ */ 
 
 
     SUBWAY  =>   'едешь на метро' , 
     FOOT    =>   'идешь пешком' , 
     BUS     =>   'едешь на автобусе' 
 ) ; 
 
 $startPoint  =  'pet' ;  // Петроградская 
 $endPoint  =  'vit' ;  // Новая Голландия 
 
     'pet'    =>   'ст. м. Петроградская' , 
     'chk'    =>   'ст. м. Чкаловская' , 
     'gor'    =>   'ст. м. Горьковская' , 
     'spo'    =>   'ст. м. Спортивная' , 
     'vas'    =>   'ст. м. Василеостровская' , 
     'kre'    =>   'Петропавловская крепость' , 
     'let'    =>   'Летний сад' , 
     'dvo'    =>   'Дворцовая площадь' , 
     'isa'    =>   'Исакиевский собор' , 
     'nov'    =>   'Новая Голландия' , 
     'ras'    =>   'Дом Раскольникова' , 
     'gos'    =>   'Гостиный Двор' , 
     'sen'    =>   'Сенная Площадь' , 
     'vla'    =>   'ст. м. Владимирская' , 
     'vit'    =>   'Витебский вокзал' , 
     'teh'    =>   'Технологический Институт' 
 ) ; 
 
         'chk'    =>   canGet( 10 ,  BUS) , 
         'gor'    =>   canGet( 3 ,  SUBWAY) 
     ) , 
 
         'pet'    =>   canGet( 10 ,  BUS) , 
         'spo'    =>   canGet( 3 ,  SUBWAY) 
     ) , 
 
         'pet'    =>   canGet( 3 ,  BUS) , 
         'kre'    =>   canGet( 5 ,  FOOT) , 
         'gos'    =>   canGet( 6 ,  SUBWAY) 
     ) , 
 
         'chk'    =>   canGet( 3 ,  SUBWAY) , 
         'vas'    =>   canGet( 10 ,  BUS) , 
         'sen'    =>   canGet( 7 ,  SUBWAY) 
     ) , 
 
         'spo'    =>   canGet( 10 ,  BUS) , 
         'gos'    =>   canGet( 7 ,  SUBWAY) , 
         'nov'    =>   canGet( 11 ,  FOOT) 
     ) , 
 
         'gor'    =>   canGet( 5 ,  FOOT) 
     ) ,  
 
         'dvo'    =>   canGet( 6 ,  FOOT) , 
         'gos'    =>   canGet( 7 ,  FOOT) 
     ) , 
 
         'isa'    =>   canGet( 6 ,  FOOT) , 
         'gos'    =>   canGet( 6 ,  FOOT) , 
         'let'    =>   canGet( 6 ,  FOOT) 
     ) , 
 
         'dvo'    =>   canGet( 6 ,  FOOT) , 
         'nov'    =>   canGet( 5 ,  FOOT) 
     ) , 
 
         'vas'    =>   canGet( 11 ,  FOOT) , 
         'isa'    =>   canGet( 5 ,  FOOT) , 
         'ras'    =>   canGet( 7 ,  BUS) 
     ) , 
 
         'nov'    =>   canGet( 7 ,  BUS) , 
         'sen'    =>   canGet( 3 ,  FOOT) 
     ) , 
 
         'vas'    =>   canGet( 7 ,  SUBWAY) , 
         'sen'    =>   canGet( 3 ,  SUBWAY) , 
         'dvo'    =>   canGet( 6 ,  FOOT) , 
         'gor'    =>   canGet( 6 ,  SUBWAY) , 
         'let'    =>   canGet( 7 ,  FOOT) , 
         'vla'    =>   canGet( 7 ,  FOOT)         
     ) , 
 
         'ras'    =>   canGet( 3 ,  FOOT) , 
         'spo'    =>   canGet( 7 ,  SUBWAY) , 
         'gos'    =>   canGet( 3 ,  SUBWAY) , 
         'vla'    =>   canGet( 4 ,  SUBWAY) , 
         'vit'    =>   canGet( 2 ,  SUBWAY) , 
         'teh'    =>   canGet( 3 ,  SUBWAY) 
     ) , 
 
         'sen'    =>   canGet( 4 ,  SUBWAY) , 
         'gos'    =>   canGet( 7 ,  FOOT) , 
         'vit'    =>   canGet( 3 ,  SUBWAY) 
     ) , 
 
         'sen'    =>   canGet( 2 ,  SUBWAY) , 
         'teh'    =>   canGet( 2 ,  SUBWAY) , 
         'vla'    =>   canGet( 3 ,  SUBWAY) 
     ) , 
 
         'sen'    =>   canGet( 3 ,  SUBWAY) , 
         'vit'    =>   canGet( 2 ,  SUBWAY)         
     ) 
 ) ; 
 
 /* Чтобы не писать много раз array('time' => ..., 'by' => ...), используем функцию.  
     «canGet» переводится как «можно попасть» */ 
 function  canGet( $time ,  $byWhat )  { 
     return  array ( 'time'      =>   $time ,  'by'  =>   $byWhat ) ;   } 
 
// Текущий путь 
$currentPath         =  [ ] ;  
$currentPath [ ]       =  $startPoint ; 
// Время, затраченное на текущий путь 
$time                =  0 ; 
 
//Самый быстрый путь  
$winPath             =  [ ] ; 
// Его время (по умолчанию рандом большое число) 
$winTime             =  999999 ; 
 
 
// Основная функция расчета, которая проходит по всему усл. графу 
function  oneStep ( $currentPath ,  $startPoint ,  $endPoint ,  $paths ,  $time ) { 
 
    // Обращаемся к глобальным переменным 
    global  $winPath ; 
    global  $winTime ; 
    // Счетчик, который позволяет понять, к какому элементу мы обращаемся (для проверки, не является ли элемент последним) 
    $count  =  0 ; 
 
    // Перебор всех возможных путей 
    foreach  ( $paths [ $startPoint ]  as  $changeStation  =>  $value )  { 
        $count ++; 
 
        // Если мы уже были на станции, на которую собираемся пойти 
        if  (  in_array   (  $changeStation ,  $currentPath )  )  {              // Если эта станция не последняя в текущем списке 
            if  (  !  ( $count  ==  count   ( $paths [ $startPoint ] ) )  ) {                  continue ; 
            } 
            else  { 
                return ; 
            }  
        } 
 
        // Обновляем текущий список и время 
        $currentPath     [ ] =  $changeStation ;     
        $time            +=  $value [ 'time' ] ; 
 
        // Если нашли выигрышный путь 
        if  (  $changeStation  ==  $endPoint  ) { 
            // Время выигрышного путя меньше, чем выигрышнуй путь по умолч. 
            if  ( $winTime  >  $time )  { 
                $winPath     =  $currentPath ; 
                $winTime     =  $time ; 
            } 
 
            // Сбрасываем последнюю переменную, так как мы не "пойдем" на эту станцию 
 
            // Если  это не последний элемент списка 
            if  (  !  ( $count  ==  count   ( $paths [ $startPoint ] ) )  ) {                  continue ; 
            } 
            else  { 
                return ; 
            }  
        } 
 
        oneStep ( $currentPath ,  $changeStation ,  $endPoint ,  $paths ,  $time ) ;  
 
        // После вовзрата из "стека", необходимо отбросить последнюю переменную, так как она записана в текущий путь ($currentPath) 
        // Аналогичным образом сбрасываем время 
        $time    -=  $value [ 'time' ] ; 
    } 
} 
 
oneStep ( $currentPath ,  $startPoint ,  $endPoint ,  $paths ,  $time ) ; 
 
 
// Выводим информацию 
 
// Вспомогательная переменная, которая запоминает предыдущую станцию 
$beforeStation ; 
 
echo  "Чтобы добраться с {$pointNames [$startPoint ]} до {$pointNames [$endPoint ]} за {$winTime}  минут, вам нужно: <br>" ; 
foreach  ( $winPath  as  $count  =>  $value )  { 
 
    if  ( $count  ==  0 )  { 
        $beforeStation  =  $value ; 
        continue ; 
    } 
 
    echo  "От {$pointNames [$beforeStation ]} "  .  
        $transportName [ $paths [ $beforeStation ] [ $value ] [ 'by' ] ]  . 
        " до "  .  $pointNames [ $beforeStation ]  .  " за "  . 
        $paths [ $beforeStation ] [ $value ] [ 'time' ]  .  " минуты.<br>" ; 
 
    $beforeStation  =  $value ; 
} 
 
 
?> 
 
				PD9waHAKIAogZXJyb3JfcmVwb3J0aW5nKC0xKTsKIC8qIGh0dHA6Ly9kLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi4yLm5ldC8gKi8KICAKIGRlZmluZSgnU1VCV0FZJywgJ3N1YicpOwogZGVmaW5lKCdGT09UJywgJ2Zvb3QnKTsKIGRlZmluZSgnQlVTJywgJ2J1cycpOwogIAogJHRyYW5zcG9ydE5hbWUgPSBhcnJheSgKICAgICBTVUJXQVkgID0+ICAn0LXQtNC10YjRjCDQvdCwINC80LXRgtGA0L4nLAogICAgIEZPT1QgICAgPT4gICfQuNC00LXRiNGMINC/0LXRiNC60L7QvCcsCiAgICAgQlVTICAgICA9PiAgJ9C10LTQtdGI0Ywg0L3QsCDQsNCy0YLQvtCx0YPRgdC1JwogKTsKICAKICRzdGFydFBvaW50ID0gJ3BldCc7IC8vINCf0LXRgtGA0L7Qs9GA0LDQtNGB0LrQsNGPCiAkZW5kUG9pbnQgPSAndml0JzsgLy8g0J3QvtCy0LDRjyDQk9C+0LvQu9Cw0L3QtNC40Y8KICAKICRwb2ludE5hbWVzID0gYXJyYXkoCiAgICAgJ3BldCcgICA9PiAgJ9GB0YIuINC8LiDQn9C10YLRgNC+0LPRgNCw0LTRgdC60LDRjycsCiAgICAgJ2NoaycgICA9PiAgJ9GB0YIuINC8LiDQp9C60LDQu9C+0LLRgdC60LDRjycsCiAgICAgJ2dvcicgICA9PiAgJ9GB0YIuINC8LiDQk9C+0YDRjNC60L7QstGB0LrQsNGPJywKICAgICAnc3BvJyAgID0+ICAn0YHRgi4g0LwuINCh0L/QvtGA0YLQuNCy0L3QsNGPJywKICAgICAndmFzJyAgID0+ICAn0YHRgi4g0LwuINCS0LDRgdC40LvQtdC+0YHRgtGA0L7QstGB0LrQsNGPJywKICAgICAna3JlJyAgID0+ICAn0J/QtdGC0YDQvtC/0LDQstC70L7QstGB0LrQsNGPINC60YDQtdC/0L7RgdGC0YwnLAogICAgICdsZXQnICAgPT4gICfQm9C10YLQvdC40Lkg0YHQsNC0JywKICAgICAnZHZvJyAgID0+ICAn0JTQstC+0YDRhtC+0LLQsNGPINC/0LvQvtGJ0LDQtNGMJywKICAgICAnaXNhJyAgID0+ICAn0JjRgdCw0LrQuNC10LLRgdC60LjQuSDRgdC+0LHQvtGAJywKICAgICAnbm92JyAgID0+ICAn0J3QvtCy0LDRjyDQk9C+0LvQu9Cw0L3QtNC40Y8nLAogICAgICdyYXMnICAgPT4gICfQlNC+0Lwg0KDQsNGB0LrQvtC70YzQvdC40LrQvtCy0LAnLAogICAgICdnb3MnICAgPT4gICfQk9C+0YHRgtC40L3Ri9C5INCU0LLQvtGAJywKICAgICAnc2VuJyAgID0+ICAn0KHQtdC90L3QsNGPINCf0LvQvtGJ0LDQtNGMJywKICAgICAndmxhJyAgID0+ICAn0YHRgi4g0LwuINCS0LvQsNC00LjQvNC40YDRgdC60LDRjycsCiAgICAgJ3ZpdCcgICA9PiAgJ9CS0LjRgtC10LHRgdC60LjQuSDQstC+0LrQt9Cw0LsnLAogICAgICd0ZWgnICAgPT4gICfQotC10YXQvdC+0LvQvtCz0LjRh9C10YHQutC40Lkg0JjQvdGB0YLQuNGC0YPRgicKICk7CiAgCiAkcGF0aHMgPSBhcnJheSgKICAgICAncGV0JyAgID0+ICBhcnJheSgKICAgICAgICAgJ2NoaycgICA9PiAgY2FuR2V0KDEwLCBCVVMpLAogICAgICAgICAnZ29yJyAgID0+ICBjYW5HZXQoMywgU1VCV0FZKQogICAgICksCiAgCiAgICAgJ2NoaycgICA9PiAgYXJyYXkoCiAgICAgICAgICdwZXQnICAgPT4gIGNhbkdldCgxMCwgQlVTKSwKICAgICAgICAgJ3NwbycgICA9PiAgY2FuR2V0KDMsIFNVQldBWSkKICAgICApLAogIAogICAgICdnb3InICAgPT4gIGFycmF5KAogICAgICAgICAncGV0JyAgID0+ICBjYW5HZXQoMywgQlVTKSwKICAgICAgICAgJ2tyZScgICA9PiAgY2FuR2V0KDUsIEZPT1QpLAogICAgICAgICAnZ29zJyAgID0+ICBjYW5HZXQoNiwgU1VCV0FZKQogICAgICksCiAgCiAgICAgJ3NwbycgICA9PiAgYXJyYXkoCiAgICAgICAgICdjaGsnICAgPT4gIGNhbkdldCgzLCBTVUJXQVkpLAogICAgICAgICAndmFzJyAgID0+ICBjYW5HZXQoMTAsIEJVUyksCiAgICAgICAgICdzZW4nICAgPT4gIGNhbkdldCg3LCBTVUJXQVkpCiAgICAgKSwKICAKICAgICAndmFzJyAgID0+ICBhcnJheSgKICAgICAgICAgJ3NwbycgICA9PiAgY2FuR2V0KDEwLCBCVVMpLAogICAgICAgICAnZ29zJyAgID0+ICBjYW5HZXQoNywgU1VCV0FZKSwKICAgICAgICAgJ25vdicgICA9PiAgY2FuR2V0KDExLCBGT09UKQogICAgICksCiAgCiAgICAgJ2tyZScgICA9PiAgYXJyYXkoCiAgICAgICAgICdnb3InICAgPT4gIGNhbkdldCg1LCBGT09UKQogICAgICksIAogIAogICAgICdsZXQnICAgPT4gIGFycmF5KAogICAgICAgICAnZHZvJyAgID0+ICBjYW5HZXQoNiwgRk9PVCksCiAgICAgICAgICdnb3MnICAgPT4gIGNhbkdldCg3LCBGT09UKQogICAgICksCiAgCiAgICAgJ2R2bycgICA9PiAgYXJyYXkoCiAgICAgICAgICdpc2EnICAgPT4gIGNhbkdldCg2LCBGT09UKSwKICAgICAgICAgJ2dvcycgICA9PiAgY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICAnbGV0JyAgID0+ICBjYW5HZXQoNiwgRk9PVCkKICAgICApLAogIAogICAgICdpc2EnICAgPT4gIGFycmF5KAogICAgICAgICAnZHZvJyAgID0+ICBjYW5HZXQoNiwgRk9PVCksCiAgICAgICAgICdub3YnICAgPT4gIGNhbkdldCg1LCBGT09UKQogICAgICksCiAgCiAgICAgJ25vdicgICA9PiAgYXJyYXkoCiAgICAgICAgICd2YXMnICAgPT4gIGNhbkdldCgxMSwgRk9PVCksCiAgICAgICAgICdpc2EnICAgPT4gIGNhbkdldCg1LCBGT09UKSwKICAgICAgICAgJ3JhcycgICA9PiAgY2FuR2V0KDcsIEJVUykKICAgICApLAogIAogICAgICdyYXMnICAgPT4gIGFycmF5KAogICAgICAgICAnbm92JyAgID0+ICBjYW5HZXQoNywgQlVTKSwKICAgICAgICAgJ3NlbicgICA9PiAgY2FuR2V0KDMsIEZPT1QpCiAgICAgKSwKICAKICAgICAnZ29zJyAgID0+ICBhcnJheSgKICAgICAgICAgJ3ZhcycgICA9PiAgY2FuR2V0KDcsIFNVQldBWSksCiAgICAgICAgICdzZW4nICAgPT4gIGNhbkdldCgzLCBTVUJXQVkpLAogICAgICAgICAnZHZvJyAgID0+ICBjYW5HZXQoNiwgRk9PVCksCiAgICAgICAgICdnb3InICAgPT4gIGNhbkdldCg2LCBTVUJXQVkpLAogICAgICAgICAnbGV0JyAgID0+ICBjYW5HZXQoNywgRk9PVCksCiAgICAgICAgICd2bGEnICAgPT4gIGNhbkdldCg3LCBGT09UKSAgICAgICAgCiAgICAgKSwKICAKICAgICAnc2VuJyAgID0+ICBhcnJheSgKICAgICAgICAgJ3JhcycgICA9PiAgY2FuR2V0KDMsIEZPT1QpLAogICAgICAgICAnc3BvJyAgID0+ICBjYW5HZXQoNywgU1VCV0FZKSwKICAgICAgICAgJ2dvcycgICA9PiAgY2FuR2V0KDMsIFNVQldBWSksCiAgICAgICAgICd2bGEnICAgPT4gIGNhbkdldCg0LCBTVUJXQVkpLAogICAgICAgICAndml0JyAgID0+ICBjYW5HZXQoMiwgU1VCV0FZKSwKICAgICAgICAgJ3RlaCcgICA9PiAgY2FuR2V0KDMsIFNVQldBWSkKICAgICApLAogIAogICAgICd2bGEnICAgPT4gIGFycmF5KAogICAgICAgICAnc2VuJyAgID0+ICBjYW5HZXQoNCwgU1VCV0FZKSwKICAgICAgICAgJ2dvcycgICA9PiAgY2FuR2V0KDcsIEZPT1QpLAogICAgICAgICAndml0JyAgID0+ICBjYW5HZXQoMywgU1VCV0FZKQogICAgICksCiAgCiAgICAgJ3ZpdCcgICA9PiAgYXJyYXkoCiAgICAgICAgICdzZW4nICAgPT4gIGNhbkdldCgyLCBTVUJXQVkpLAogICAgICAgICAndGVoJyAgID0+ICBjYW5HZXQoMiwgU1VCV0FZKSwKICAgICAgICAgJ3ZsYScgICA9PiAgY2FuR2V0KDMsIFNVQldBWSkKICAgICApLAogIAogICAgICd0ZWgnICAgPT4gIGFycmF5KAogICAgICAgICAnc2VuJyAgID0+ICBjYW5HZXQoMywgU1VCV0FZKSwKICAgICAgICAgJ3ZpdCcgICA9PiAgY2FuR2V0KDIsIFNVQldBWSkgICAgICAgIAogICAgICkKICk7CiAgCiAvKiDQp9GC0L7QsdGLINC90LUg0L/QuNGB0LDRgtGMINC80L3QvtCz0L4g0YDQsNC3IGFycmF5KCd0aW1lJyA9PiAuLi4sICdieScgPT4gLi4uKSwg0LjRgdC/0L7Qu9GM0LfRg9C10Lwg0YTRg9C90LrRhtC40Y4uIAogICAgIMKrY2FuR2V0wrsg0L/QtdGA0LXQstC+0LTQuNGC0YHRjyDQutCw0LogwqvQvNC+0LbQvdC+INC/0L7Qv9Cw0YHRgtGMwrsgKi8KIGZ1bmN0aW9uIGNhbkdldCgkdGltZSwgJGJ5V2hhdCkgewogICAgIHJldHVybiBhcnJheSgndGltZScgICAgID0+ICAkdGltZSwgJ2J5JyA9PiAgJGJ5V2hhdCk7CiB9CgovLyDQotC10LrRg9GJ0LjQuSDQv9GD0YLRjAokY3VycmVudFBhdGggICAgICAgID0gW107IAokY3VycmVudFBhdGhbXSAgICAgID0gJHN0YXJ0UG9pbnQ7Ci8vINCS0YDQtdC80Y8sINC30LDRgtGA0LDRh9C10L3QvdC+0LUg0L3QsCDRgtC10LrRg9GJ0LjQuSDQv9GD0YLRjAokdGltZSAgICAgICAgICAgICAgID0gMDsKCi8v0KHQsNC80YvQuSDQsdGL0YHRgtGA0YvQuSDQv9GD0YLRjCAKJHdpblBhdGggICAgICAgICAgICA9IFtdOwovLyDQldCz0L4g0LLRgNC10LzRjyAo0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4g0YDQsNC90LTQvtC8INCx0L7Qu9GM0YjQvtC1INGH0LjRgdC70L4pCiR3aW5UaW1lICAgICAgICAgICAgPSA5OTk5OTk7CgoKLy8g0J7RgdC90L7QstC90LDRjyDRhNGD0L3QutGG0LjRjyDRgNCw0YHRh9C10YLQsCwg0LrQvtGC0L7RgNCw0Y8g0L/RgNC+0YXQvtC00LjRgiDQv9C+INCy0YHQtdC80YMg0YPRgdC7LiDQs9GA0LDRhNGDCmZ1bmN0aW9uIG9uZVN0ZXAgKCRjdXJyZW50UGF0aCwgJHN0YXJ0UG9pbnQsICRlbmRQb2ludCwgJHBhdGhzLCAkdGltZSl7CgogICAgLy8g0J7QsdGA0LDRidCw0LXQvNGB0Y8g0Log0LPQu9C+0LHQsNC70YzQvdGL0Lwg0L/QtdGA0LXQvNC10L3QvdGL0LwKICAgIGdsb2JhbCAkd2luUGF0aDsKICAgIGdsb2JhbCAkd2luVGltZTsKICAgIC8vINCh0YfQtdGC0YfQuNC6LCDQutC+0YLQvtGA0YvQuSDQv9C+0LfQstC+0LvRj9C10YIg0L/QvtC90Y/RgtGMLCDQuiDQutCw0LrQvtC80YMg0Y3Qu9C10LzQtdC90YLRgyDQvNGLINC+0LHRgNCw0YnQsNC10LzRgdGPICjQtNC70Y8g0L/RgNC+0LLQtdGA0LrQuCwg0L3QtSDRj9Cy0LvRj9C10YLRgdGPINC70Lgg0Y3Qu9C10LzQtdC90YIg0L/QvtGB0LvQtdC00L3QuNC8KQogICAgJGNvdW50ID0gMDsKICAgIAogICAgLy8g0J/QtdGA0LXQsdC+0YAg0LLRgdC10YUg0LLQvtC30LzQvtC20L3Ri9GFINC/0YPRgtC10LkKICAgIGZvcmVhY2ggKCRwYXRoc1skc3RhcnRQb2ludF0gYXMgJGNoYW5nZVN0YXRpb24gPT4gJHZhbHVlKSB7CiAgICAgICAgJGNvdW50Kys7CgogICAgICAgIC8vINCV0YHQu9C4INC80Ysg0YPQttC1INCx0YvQu9C4INC90LAg0YHRgtCw0L3RhtC40LgsINC90LAg0LrQvtGC0L7RgNGD0Y4g0YHQvtCx0LjRgNCw0LXQvNGB0Y8g0L/QvtC50YLQuAogICAgICAgIGlmICggaW5fYXJyYXkgKCAkY2hhbmdlU3RhdGlvbiwgJGN1cnJlbnRQYXRoKSApIHsKICAgICAgICAgICAgLy8g0JXRgdC70Lgg0Y3RgtCwINGB0YLQsNC90YbQuNGPINC90LUg0L/QvtGB0LvQtdC00L3Rj9GPINCyINGC0LXQutGD0YnQtdC8INGB0L/QuNGB0LrQtQogICAgICAgICAgICBpZiAoICEgKCRjb3VudCA9PSBjb3VudCAoJHBhdGhzWyRzdGFydFBvaW50XSkpICl7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfSAKICAgICAgICB9CgogICAgICAgIC8vINCe0LHQvdC+0LLQu9GP0LXQvCDRgtC10LrRg9GJ0LjQuSDRgdC/0LjRgdC+0Log0Lgg0LLRgNC10LzRjwogICAgICAgICRjdXJyZW50UGF0aCAgICBbXT0gJGNoYW5nZVN0YXRpb247ICAgIAogICAgICAgICR0aW1lICAgICAgICAgICArPSAkdmFsdWVbJ3RpbWUnXTsKCiAgICAgICAgLy8g0JXRgdC70Lgg0L3QsNGI0LvQuCDQstGL0LjQs9GA0YvRiNC90YvQuSDQv9GD0YLRjAogICAgICAgIGlmICggJGNoYW5nZVN0YXRpb24gPT0gJGVuZFBvaW50ICl7CiAgICAgICAgICAgIC8vINCS0YDQtdC80Y8g0LLRi9C40LPRgNGL0YjQvdC+0LPQviDQv9GD0YLRjyDQvNC10L3RjNGI0LUsINGH0LXQvCDQstGL0LjQs9GA0YvRiNC90YPQuSDQv9GD0YLRjCDQv9C+INGD0LzQvtC70YcuCiAgICAgICAgICAgIGlmICgkd2luVGltZSA+ICR0aW1lKSB7CiAgICAgICAgICAgICAgICAkd2luUGF0aCAgICA9ICRjdXJyZW50UGF0aDsKICAgICAgICAgICAgICAgICR3aW5UaW1lICAgID0gJHRpbWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vINCh0LHRgNCw0YHRi9Cy0LDQtdC8INC/0L7RgdC70LXQtNC90Y7RjiDQv9C10YDQtdC80LXQvdC90YPRjiwg0YLQsNC6INC60LDQuiDQvNGLINC90LUgItC/0L7QudC00LXQvCIg0L3QsCDRjdGC0YMg0YHRgtCw0L3RhtC40Y4KICAgICAgICAgICAgJGJpZiAgICA9IGFycmF5X3BvcCAoJGN1cnJlbnRQYXRoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vINCV0YHQu9C4ICDRjdGC0L4g0L3QtSDQv9C+0YHQu9C10LTQvdC40Lkg0Y3Qu9C10LzQtdC90YIg0YHQv9C40YHQutCwCiAgICAgICAgICAgIGlmICggISAoJGNvdW50ID09IGNvdW50ICgkcGF0aHNbJHN0YXJ0UG9pbnRdKSkgKXsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9IAogICAgICAgIH0KCiAgICAgICAgb25lU3RlcCAoJGN1cnJlbnRQYXRoLCAkY2hhbmdlU3RhdGlvbiwgJGVuZFBvaW50LCAkcGF0aHMsICR0aW1lKTsgCgogICAgICAgIC8vINCf0L7RgdC70LUg0LLQvtCy0LfRgNCw0YLQsCDQuNC3ICLRgdGC0LXQutCwIiwg0L3QtdC+0LHRhdC+0LTQuNC80L4g0L7RgtCx0YDQvtGB0LjRgtGMINC/0L7RgdC70LXQtNC90Y7RjiDQv9C10YDQtdC80LXQvdC90YPRjiwg0YLQsNC6INC60LDQuiDQvtC90LAg0LfQsNC/0LjRgdCw0L3QsCDQsiDRgtC10LrRg9GJ0LjQuSDQv9GD0YLRjCAoJGN1cnJlbnRQYXRoKQogICAgICAgICRiaWYgICAgPSBhcnJheV9wb3AgKCRjdXJyZW50UGF0aCk7CiAgICAgICAgLy8g0JDQvdCw0LvQvtCz0LjRh9C90YvQvCDQvtCx0YDQsNC30L7QvCDRgdCx0YDQsNGB0YvQstCw0LXQvCDQstGA0LXQvNGPCiAgICAgICAgJHRpbWUgICAtPSAkdmFsdWVbJ3RpbWUnXTsKICAgIH0KfQoKb25lU3RlcCAoJGN1cnJlbnRQYXRoLCAkc3RhcnRQb2ludCwgJGVuZFBvaW50LCAkcGF0aHMsICR0aW1lKTsKCgovLyDQktGL0LLQvtC00LjQvCDQuNC90YTQvtGA0LzQsNGG0LjRjgoKLy8g0JLRgdC/0L7QvNC+0LPQsNGC0LXQu9GM0L3QsNGPINC/0LXRgNC10LzQtdC90L3QsNGPLCDQutC+0YLQvtGA0LDRjyDQt9Cw0L/QvtC80LjQvdCw0LXRgiDQv9GA0LXQtNGL0LTRg9GJ0YPRjiDRgdGC0LDQvdGG0LjRjgokYmVmb3JlU3RhdGlvbjsKCmVjaG8gItCn0YLQvtCx0Ysg0LTQvtCx0YDQsNGC0YzRgdGPINGBIHskcG9pbnROYW1lc1skc3RhcnRQb2ludF19INC00L4geyRwb2ludE5hbWVzWyRlbmRQb2ludF19INC30LAgeyR3aW5UaW1lfSDQvNC40L3Rg9GCLCDQstCw0Lwg0L3Rg9C20L3QvjogPGJyPiI7CmZvcmVhY2ggKCR3aW5QYXRoIGFzICRjb3VudCA9PiAkdmFsdWUpIHsKICAgIAogICAgaWYgKCRjb3VudCA9PSAwKSB7CiAgICAgICAgJGJlZm9yZVN0YXRpb24gPSAkdmFsdWU7CiAgICAgICAgY29udGludWU7CiAgICB9CgogICAgZWNobyAi0J7RgiB7JHBvaW50TmFtZXNbJGJlZm9yZVN0YXRpb25dfSAiIC4gCiAgICAgICAgJHRyYW5zcG9ydE5hbWVbJHBhdGhzWyRiZWZvcmVTdGF0aW9uXVskdmFsdWVdWydieSddXSAuCiAgICAgICAgIiDQtNC+ICIgLiAkcG9pbnROYW1lc1skYmVmb3JlU3RhdGlvbl0gLiAiINC30LAgIiAuCiAgICAgICAgJHBhdGhzWyRiZWZvcmVTdGF0aW9uXVskdmFsdWVdWyd0aW1lJ10gLiAiINC80LjQvdGD0YLRiy48YnI+IjsKCiAgICAkYmVmb3JlU3RhdGlvbiA9ICR2YWx1ZTsKfQoKCj8+