<?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+