<?php
'visited' => false ,
'shortest_path' => INF,
'chk' => array ( 'time' => 10 , 'transport' => 'bus' ) ,
'gor' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'pet' => array ( 'time' => 10 , 'transport' => 'bus' ) ,
'spo' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'pet' => array ( 'time' => 3 , 'transport' => 'bus' ) ,
'kre' => array ( 'time' => 5 , 'transport' => 'foot' ) ,
'gos' => array ( 'time' => 6 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'chk' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
'vas' => array ( 'time' => 10 , 'transport' => 'bus' ) ,
'sen' => array ( 'time' => 7 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'spo' => array ( 'time' => 10 , 'transport' => 'bus' ) ,
'gos' => array ( 'time' => 7 , 'transport' => 'sub' ) ,
'nov' => array ( 'time' => 11 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'gor' => array ( 'time' => 5 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'dvo' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'gos' => array ( 'time' => 7 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'isa' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'gos' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'let' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'dvo' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'nov' => array ( 'time' => 5 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'vas' => array ( 'time' => 11 , 'transport' => 'foot' ) ,
'isa' => array ( 'time' => 5 , 'transport' => 'foot' ) ,
'ras' => array ( 'time' => 7 , 'transport' => 'bus' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'nov' => array ( 'time' => 7 , 'transport' => 'bus' ) ,
'sen' => array ( 'time' => 3 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'vas' => array ( 'time' => 7 , 'transport' => 'sub' ) ,
'sen' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
'dvo' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'gor' => array ( 'time' => 6 , 'transport' => 'sub' ) ,
'let' => array ( 'time' => 7 , 'transport' => 'foot' ) ,
'vla' => array ( 'time' => 7 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'ras' => array ( 'time' => 3 , 'transport' => 'foot' ) ,
'spo' => array ( 'time' => 7 , 'transport' => 'sub' ) ,
'gos' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
'vla' => array ( 'time' => 4 , 'transport' => 'sub' ) ,
'vit' => array ( 'time' => 2 , 'transport' => 'sub' ) ,
'teh' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'sen' => array ( 'time' => 4 , 'transport' => 'sub' ) ,
'gos' => array ( 'time' => 7 , 'transport' => 'foot' ) ,
'vit' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'sen' => array ( 'time' => 2 , 'transport' => 'sub' ) ,
'teh' => array ( 'time' => 2 , 'transport' => 'sub' ) ,
'vla' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'sen' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
'vit' => array ( 'time' => 2 , 'transport' => 'sub' ) ,
)
)
) ;
function get_shortest_path( $paths , $start_point , $end_point ) // Получаем путь
{
foreach ( $paths as $name => $value ) { // Проверяем есть ли такие точки.
if ( $start_point == $name ) {
$check_start_point = true ;
} elseif ( $end_point == $name ) {
$check_end_point = true ;
}
}
if ( $check_start_point != true ) {
echo "Такой точки не существует " . $start_point ;
return ;
} elseif ( $check_end_point != true ) {
echo "Такой точки не существует " . $end_point ;
return ;
}
$current_point = $start_point ;
$paths [ $current_point ] [ 'shortest_path' ] = 0 ; // делаем длинну пути стартовой точки = 0
while ( $paths [ $end_point ] [ 'visited' ] == false ) { // циклим пока точка до которой мы идем не станет true
$paths [ $current_point ] [ 'visited' ] = true ; // ставим посещение true
foreach ( $paths [ $current_point ] [ 'neighbors' ] as $name => $time_transport ) { // смотрим соседей вершины и длинну пути и присваем if длина пути+пройденый путь меньше чем есть
if ( $paths [ $name ] [ 'visited' ] == false ) {
$time = $time_transport [ 'time' ] ;
if ( $time + $paths [ $current_point ] [ 'shortest_path' ] < $paths [ $name ] [ 'shortest_path' ] ) {
$paths [ $name ] [ 'shortest_path' ] = $time + $paths [ $current_point ] [ 'shortest_path' ] ;
}
}
}
$j = INF; // переменная для сравнения
foreach ( $paths as $name => $value ) { // делаем старт поинт вершину с наименьшем пути
if ( $paths [ $name ] [ 'visited' ] == false ) {
if ( $paths [ $name ] [ 'shortest_path' ] < $j ) {
$j = $paths [ $name ] [ 'shortest_path' ] ;
$current_point = $name ;
}
}
}
}
print_shortest_path( $paths , $start_point , $end_point ) ;
}
function print_shortest_path( $paths , $start_point , $end_point ) // Печатаем путь
{
'sub' => 'Из неё едешь на метро' ,
'foot' => 'Из неё идешь пешком' ,
'bus' => 'Из неё едешь на автобусе'
) ;
$j = INF;
$curent_point = $end_point ;
while ( $paths [ $curent_point ] [ 'shortest_path' ] != 0 ) { // циклим пока не дойдем до начальной точки
$made_path [ ] = $curent_point ;
foreach ( $paths [ $curent_point ] [ 'neighbors' ] as $name => $time_transport ) {
if ( $paths [ $name ] [ 'visited' ] == true ) {
if ( $paths [ $name ] [ 'shortest_path' ] < $j ) {
$transport_name = $time_transport [ 'transport' ] ;
$j = $paths [ $name ] [ 'shortest_path' ] ;
$curent_point = $name ;
}
}
}
}
$made_path [ ] = $start_point ;
echo "Начальная точка: $start_point \n " ;
foreach ( $made_path as $key => $path ) {
if ( $path == 'pet' ) {
continue ;
}
echo $transportName [ $paths [ $made_path [ $key - 1 ] ] [ 'neighbors' ] [ $path ] [ 'transport' ] ]
. " до точки " . $path . " за "
. $paths [ $made_path [ $key - 1 ] ] [ 'neighbors' ] [ $path ] [ 'time' ] . " мин.\n " ;
}
echo "В итоге ты попадешь в точку $end_point за " . $paths [ $end_point ] [ 'shortest_path' ] . " мин.\n " ;
}
$start_point = 'pet' ;
$end_point = 'nov' ;
get_shortest_path( $paths , $start_point , $end_point ) ;
PD9waHAKCiRwYXRocyA9IGFycmF5KAogICAgJ3BldCcgICA9PiAgYXJyYXkoCiAgICAJCSd2aXNpdGVkJyAJCT0+ICBmYWxzZSwKICAgIAkJJ3Nob3J0ZXN0X3BhdGgnID0+ICBJTkYsCiAgICAJCSduZWlnaGJvcnMnICAgICA9PiAgYXJyYXkoCiAgICAgICAgCQknY2hrJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAxMCwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdidXMnKSwKICAgICAgICAJCSdnb3InICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDMsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAJKQogICAgKSwKCiAgICAnY2hrJyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSdwZXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDEwLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2J1cycpLAogICAgICAgIAkJJ3NwbycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgIAkpCiAgICApLAogICAgCiAgICAnZ29yJyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSdwZXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDMsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnYnVzJyksCiAgICAgICAgCQkna3JlJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA1LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdnb3MnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDYsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAJKQogICAgKSwKICAgIAogICAgJ3NwbycgICA9PiAgYXJyYXkoCiAgICAJCSd2aXNpdGVkJyAJCT0+ICBmYWxzZSwKICAgIAkJJ3Nob3J0ZXN0X3BhdGgnID0+ICBJTkYsCiAgICAJCSduZWlnaGJvcnMnICAgICA9PiAgYXJyYXkoCiAgICAgICAgCQknY2hrJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ3ZhcycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMTAsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnYnVzJyksCiAgICAgICAgCQknc2VuJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA3LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgCSkKICAgICksCiAgICAKICAgICd2YXMnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ3NwbycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMTAsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnYnVzJyksCiAgICAgICAgCQknZ29zJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA3LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ25vdicgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMTEsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgCSkKICAgICksCiAgICAKICAgICdrcmUnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ2dvcicgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNSwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAJKQogICAgKSwKICAgIAogICAgJ2xldCcgICA9PiAgYXJyYXkoCiAgICAJCSd2aXNpdGVkJyAJCT0+ICBmYWxzZSwKICAgIAkJJ3Nob3J0ZXN0X3BhdGgnID0+ICBJTkYsCiAgICAJCSduZWlnaGJvcnMnICAgICA9PiAgYXJyYXkoCiAgICAgICAgCQknZHZvJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA2LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdnb3MnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgCSkKICAgICksCiAgICAKICAgICdkdm8nICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ2lzYScgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNiwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAgICAgCQknZ29zJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA2LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdsZXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDYsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgCSkKICAgICksCiAgICAKICAgICdpc2EnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ2R2bycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNiwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAgICAgCQknbm92JyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA1LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgIAkpCiAgICApLAogICAgCiAgICAnbm92JyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSd2YXMnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDExLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdpc2EnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDUsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgICAgIAkJJ3JhcycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdidXMnKSwKICAgIAkpCiAgICApLAogICAgCiAgICAncmFzJyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSdub3YnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnYnVzJyksCiAgICAgICAgCQknc2VuJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgIAkpCiAgICApLAogICAgCiAgICAnZ29zJyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSd2YXMnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAgICAgCQknc2VuJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ2R2bycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNiwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAgICAgCQknZ29yJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA2LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ2xldCcgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAgICAgCQkndmxhJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA3LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwgICAgCiAgICAJKQogICAgKSwKICAgIAogICAgJ3NlbicgICA9PiAgYXJyYXkoCiAgICAJCSd2aXNpdGVkJyAJCT0+ICBmYWxzZSwKICAgIAkJJ3Nob3J0ZXN0X3BhdGgnID0+ICBJTkYsCiAgICAJCSduZWlnaGJvcnMnICAgICA9PiAgYXJyYXkoCiAgICAgICAgCQkncmFzJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdzcG8nICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAgICAgCQknZ29zJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ3ZsYScgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNCwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgICAgICAJCSd2aXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDIsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAgICAgCQkndGVoJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgCSkKICAgICksCiAgICAKICAgICd2bGEnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ3NlbicgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNCwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgICAgICAJCSdnb3MnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgICAgIAkJJ3ZpdCcgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgIAkpCiAgICApLAogICAgCiAgICAndml0JyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSdzZW4nICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDIsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAgICAgCQkndGVoJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAyLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ3ZsYScgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgIAkpCiAgICApLAoKICAgICd0ZWgnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ3NlbicgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgICAgICAJCSd2aXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDIsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksICAKICAgIAkpCiAgICApCik7CgpmdW5jdGlvbiBnZXRfc2hvcnRlc3RfcGF0aCgkcGF0aHMsICRzdGFydF9wb2ludCwgJGVuZF9wb2ludCkgLy8g0J/QvtC70YPRh9Cw0LXQvCDQv9GD0YLRjAogewkKIAkKIAlmb3JlYWNoICgkcGF0aHMgYXMgJG5hbWUgPT4gJHZhbHVlKSB7IC8vINCf0YDQvtCy0LXRgNGP0LXQvCDQtdGB0YLRjCDQu9C4INGC0LDQutC40LUg0YLQvtGH0LrQuC4KIAkJaWYgKCRzdGFydF9wb2ludCA9PSAkbmFtZSkgewogCQkJJGNoZWNrX3N0YXJ0X3BvaW50ID0gdHJ1ZTsKIAkJfWVsc2VpZiAoJGVuZF9wb2ludCA9PSAkbmFtZSkgewogCQkJJGNoZWNrX2VuZF9wb2ludCA9IHRydWU7CiAJCX0KIAl9CiAJaWYgKCRjaGVja19zdGFydF9wb2ludCAhPSB0cnVlKSB7CiAJCWVjaG8gItCi0LDQutC+0Lkg0YLQvtGH0LrQuCDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCICIuJHN0YXJ0X3BvaW50OwogCQlyZXR1cm47CiAJfWVsc2VpZiAoJGNoZWNrX2VuZF9wb2ludCAhPSB0cnVlKSB7CiAJCWVjaG8gItCi0LDQutC+0Lkg0YLQvtGH0LrQuCDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCICIuJGVuZF9wb2ludDsKIAkJcmV0dXJuOwogCX0KIAkKIAkKIAkKIAkkY3VycmVudF9wb2ludCA9ICRzdGFydF9wb2ludDsKIAkkcGF0aHNbJGN1cnJlbnRfcG9pbnRdWydzaG9ydGVzdF9wYXRoJ10gPSAwOyAvLyDQtNC10LvQsNC10Lwg0LTQu9C40L3QvdGDINC/0YPRgtC4INGB0YLQsNGA0YLQvtCy0L7QuSDRgtC+0YfQutC4ID0gMAogCXdoaWxlICgkcGF0aHNbJGVuZF9wb2ludF1bJ3Zpc2l0ZWQnXSA9PSBmYWxzZSkgeyAvLyDRhtC40LrQu9C40Lwg0L/QvtC60LAg0YLQvtGH0LrQsCDQtNC+INC60L7RgtC+0YDQvtC5INC80Ysg0LjQtNC10Lwg0L3QtSDRgdGC0LDQvdC10YIgdHJ1ZQogCQkkcGF0aHNbJGN1cnJlbnRfcG9pbnRdWyd2aXNpdGVkJ10gPSB0cnVlOyAvLyDRgdGC0LDQstC40Lwg0L/QvtGB0LXRidC10L3QuNC1IHRydWUgCiAJCWZvcmVhY2ggKCRwYXRoc1skY3VycmVudF9wb2ludF1bJ25laWdoYm9ycyddIGFzICRuYW1lID0+ICR0aW1lX3RyYW5zcG9ydCkgeyAvLyDRgdC80L7RgtGA0LjQvCDRgdC+0YHQtdC00LXQuSDQstC10YDRiNC40L3RiyDQuCDQtNC70LjQvdC90YMg0L/Rg9GC0Lgg0Lgg0L/RgNC40YHQstCw0LXQvCBpZiDQtNC70LjQvdCwINC/0YPRgtC4K9C/0YDQvtC50LTQtdC90YvQuSDQv9GD0YLRjCDQvNC10L3RjNGI0LUg0YfQtdC8INC10YHRgtGMCgkJCWlmICgkcGF0aHNbJG5hbWVdWyd2aXNpdGVkJ10gPT0gZmFsc2UpIHsKCQkJCSR0aW1lID0gJHRpbWVfdHJhbnNwb3J0Wyd0aW1lJ107CgkJCQlpZiAoJHRpbWUrJHBhdGhzWyRjdXJyZW50X3BvaW50XVsnc2hvcnRlc3RfcGF0aCddIDwgJHBhdGhzWyRuYW1lXVsnc2hvcnRlc3RfcGF0aCddKSB7CgkJCQkJJHBhdGhzWyRuYW1lXVsnc2hvcnRlc3RfcGF0aCddID0gJHRpbWUrJHBhdGhzWyRjdXJyZW50X3BvaW50XVsnc2hvcnRlc3RfcGF0aCddOwoJCQkJfQoJCQl9IAoJCX0KCQkkaiA9IElORjsgLy8g0L/QtdGA0LXQvNC10L3QvdCw0Y8g0LTQu9GPINGB0YDQsNCy0L3QtdC90LjRjwoJCWZvcmVhY2ggKCRwYXRocyBhcyAgJG5hbWUgPT4gJHZhbHVlKSB7IC8vINC00LXQu9Cw0LXQvCDRgdGC0LDRgNGCINC/0L7QuNC90YIg0LLQtdGA0YjQuNC90YMg0YEg0L3QsNC40LzQtdC90YzRiNC10Lwg0L/Rg9GC0LgKCQkJaWYgKCRwYXRoc1skbmFtZV1bJ3Zpc2l0ZWQnXSA9PSBmYWxzZSApIHsKCQkJCWlmICgkcGF0aHNbJG5hbWVdWydzaG9ydGVzdF9wYXRoJ10gPCAkaikgewoJCQkJCSRqID0gJHBhdGhzWyRuYW1lXVsnc2hvcnRlc3RfcGF0aCddOwoJCQkJCSRjdXJyZW50X3BvaW50ID0gJG5hbWU7CgkJCQl9CgkJCX0KCQl9CiAJfQogCXByaW50X3Nob3J0ZXN0X3BhdGgoJHBhdGhzLCAkc3RhcnRfcG9pbnQsICRlbmRfcG9pbnQpOwp9CQkKCmZ1bmN0aW9uIHByaW50X3Nob3J0ZXN0X3BhdGgoJHBhdGhzLCAkc3RhcnRfcG9pbnQsICRlbmRfcG9pbnQpIC8vINCf0LXRh9Cw0YLQsNC10Lwg0L/Rg9GC0YwKewoJJHRyYW5zcG9ydE5hbWUgPSBhcnJheSgKCQkJCSdzdWInID0+ICfQmNC3INC90LXRkSDQtdC00LXRiNGMINC90LAg0LzQtdGC0YDQvicsCgkJCQknZm9vdCcgPT4gJ9CY0Lcg0L3QtdGRINC40LTQtdGI0Ywg0L/QtdGI0LrQvtC8JywKCQkJCSdidXMnID0+ICfQmNC3INC90LXRkSDQtdC00LXRiNGMINC90LAg0LDQstGC0L7QsdGD0YHQtScKCSk7CgkkaiA9IElORjsKCSRjdXJlbnRfcG9pbnQgPSAkZW5kX3BvaW50OwogICAgd2hpbGUgKCRwYXRoc1skY3VyZW50X3BvaW50XVsnc2hvcnRlc3RfcGF0aCddICE9IDApIHsgIC8vINGG0LjQutC70LjQvCDQv9C+0LrQsCDQvdC1INC00L7QudC00LXQvCDQtNC+INC90LDRh9Cw0LvRjNC90L7QuSDRgtC+0YfQutC4CiAgICAJJG1hZGVfcGF0aFtdID0gJGN1cmVudF9wb2ludDsKICAgIAlmb3JlYWNoICgkcGF0aHNbJGN1cmVudF9wb2ludF1bJ25laWdoYm9ycyddIGFzICAkbmFtZSA9PiAkdGltZV90cmFuc3BvcnQpIHsgCgkJCWlmICgkcGF0aHNbJG5hbWVdWyd2aXNpdGVkJ10gPT0gdHJ1ZSApIHsKCQkJCWlmICgkcGF0aHNbJG5hbWVdWydzaG9ydGVzdF9wYXRoJ10gPCAkaikgewoJCQkJCSR0cmFuc3BvcnRfbmFtZSA9ICR0aW1lX3RyYW5zcG9ydFsndHJhbnNwb3J0J107CgkJCQkJJGogPSAkcGF0aHNbJG5hbWVdWydzaG9ydGVzdF9wYXRoJ107CgkJCQkJJGN1cmVudF9wb2ludCA9ICRuYW1lOwoJCQkJfQoJCQl9CgkJfQogICAgfSAKICAgICRtYWRlX3BhdGhbXSA9ICRzdGFydF9wb2ludDsKICAgICRtYWRlX3BhdGggICA9IGFycmF5X3JldmVyc2UgKCRtYWRlX3BhdGgpOwoJZWNobyAi0J3QsNGH0LDQu9GM0L3QsNGPINGC0L7Rh9C60LA6ICRzdGFydF9wb2ludFxuIjsKCWZvcmVhY2ggKCRtYWRlX3BhdGggYXMgJGtleSA9PiAkcGF0aCkgewoJCWlmICgkcGF0aCA9PSAncGV0JykgewoJCQljb250aW51ZTsKCQl9CgkJZWNobyAkdHJhbnNwb3J0TmFtZVskcGF0aHNbJG1hZGVfcGF0aFska2V5LTFdXVsnbmVpZ2hib3JzJ11bJHBhdGhdWyd0cmFuc3BvcnQnXV0KCQkuIiDQtNC+INGC0L7Rh9C60LggIi4kcGF0aC4iINC30LAgIgoJCS4kcGF0aHNbJG1hZGVfcGF0aFska2V5LTFdXVsnbmVpZ2hib3JzJ11bJHBhdGhdWyd0aW1lJ10uIiDQvNC40L0uXG4iOwoJfQoJZWNobyAi0JIg0LjRgtC+0LPQtSDRgtGLINC/0L7Qv9Cw0LTQtdGI0Ywg0LIg0YLQvtGH0LrRgyAkZW5kX3BvaW50INC30LAgIi4kcGF0aHNbJGVuZF9wb2ludF1bJ3Nob3J0ZXN0X3BhdGgnXS4iINC80LjQvS5cbiI7Cn0KCiRzdGFydF9wb2ludCA9ICdwZXQnOwokZW5kX3BvaW50ID0gJ25vdic7CgogZ2V0X3Nob3J0ZXN0X3BhdGgoJHBhdGhzLCRzdGFydF9wb2ludCwgJGVuZF9wb2ludCk7CgoKCQkKCQkKCQkKCQkKIAoJCQoJCQ==