<?php
//начиная с конца, разбиваем число на элементы массива, до трех символов в каждом элементе
function spellNumber( $number )
{
$count = 1 ;
for ( $i = 0 ; $count != 0 ; $i ++ )
{
$number = $number ;
$regexp = '/[0-9]{1,3}$/ui' ;
$parts [ ] = ( $string ) ;
}
// видимо, ликвидирую лиший пустой элемент на конце
return $parts ;
}
// ну это, значит, мы готовимся к тому, что бы выбрать падежи - соотносим группы слов с элементами массива
function formAndMerge ( $array )
{
global $number ;
$ruble = array ( 'рубль' , 'рубля' , 'рублей' ) ; $thousand = array ( 'тысяча' , 'тысячи' , 'тысяч' ) ; $million = array ( 'миллион' , 'миллиона' , 'миллионов' ) ; $billion = array ( 'миллиард' , 'миллиарда' , 'миллиардов' ) ;
foreach ( $array as $key => $value )
{
if ( $key == 0 )
{
$ShapeSelection = wordShapeSelection( $ruble , $array [ 0 ] ) ;
// тут же заносим намбер перед "рублями"
/* в конце уже понял, что с нулями я проебался.
Т.к. отображение $number у меня уже было приявязано к отображению "рублей", пришлось
творить такую хуйню*/
if ( $ShapeSelection == NULL )
{
$ShapeSelection = "({$number} ) рублей" ;
}
else
{
$ShapeSelection = "({$number} ) {$ShapeSelection} " ;
}
}
elseif ( $key == 1 )
{
$ShapeSelection = wordShapeSelection( $thousand , $array [ 1 ] ) ;
}
elseif ( $key == 2 )
{
$ShapeSelection = wordShapeSelection( $million , $array [ 2 ] ) ;
}
elseif ( $key == 3 )
{
$ShapeSelection = wordShapeSelection( $billion , $array [ 3 ] ) ;
}
$formAndMerge [ ] = $ShapeSelection ;
}
return $formAndMerge ;
}
/*сначала находим, если есть, 11-19, потом - остальные варианты
+ боремся с нулями, возвращаем все в предыдущую функцию*/
function wordShapeSelection( $magnitude1 , $magnitude2 )
{
$regexp1 = '/1[0-9]$/ui' ;
$regexp2 = '/[^1]?[2-4]$/ui' ;
$regexp3 = '/[^1]?[1]$/ui' ;
$regexp4 = '/000$/ui' ;
{
$ShapeSelection = $magnitude1 [ 2 ] ;
}
{
$ShapeSelection = $magnitude1 [ 1 ] ;
}
{
$ShapeSelection = $magnitude1 [ 0 ] ;
}
{
$ShapeSelection = '' ;
}
else
{
$ShapeSelection = $magnitude1 [ 2 ] ;
}
return $ShapeSelection ;
}
/*собс-но, самое главное - по колличеству символов в элементах массивов,
и наличию или отсутствию 1 на позиции намбер one подбираем пропись*/
function smallNumberToText( $parts )
{
0 => '' , 10 => 'десять' , 100 => 'сто' ,
1 => 'один' , 11 => 'одиннадцать' , 20 => 'двадцать' , 200 => 'двести' ,
2 => 'два' , 12 => 'двенадцать' , 30 => 'тридцать' , 300 => 'триста' ,
3 => 'три' , 13 => 'тринадцать' , 40 => 'сорок' , 400 => 'четыреста' ,
4 => 'четыре' , 14 => 'четырнадцать' , 50 => 'пятьдесят' , 500 => 'пятьсот' ,
5 => 'пять' , 15 => 'пятнадцать' , 60 => 'шестьдесят' , 600 => 'шестьсот' ,
6 => 'шесть' , 16 => 'шестнадцать' , 70 => 'семьдесят' , 700 => 'семьсот' ,
7 => 'семь' , 17 => 'семнадцать' , 80 => 'восемьдесят' , 800 => 'восемьсот' ,
8 => 'восемь' , 18 => 'восемнадцать' , 90 => 'девяносто' , 900 => 'девятьсот' ,
9 => 'девять' , 19 => 'девятнадцать'
) ;
1 => 'одна' , 2 => 'две'
) ;
foreach ( $parts as $key => $value )
{
/*В добавок ко всему, забыл про "одна" "две" - добавлял уже в конце. Не придумал ничего
умнее, чтем вводить $keyForFeminine и все эти AND и OR
*/
$keyForFeminine = $key ;
$inputData = $value ;
$regexp = '//ui' ;
$charecters = preg_split ( '//u' , $inputData ,- 1 , PREG_SPLIT_NO_EMPTY
) ; if ( $strlen == 3 )
{
/*Пришлось ставить интегер и из массива убирать "ноль" потому что я хуй знает,
что тут делать с предуперждением Notice: Undefined index: 000 и др.
при нулях в $number. При этом, я особо и не понял, почему с интегером заработало:(
*/
$key = ( integer) "{$charecters[0]} 00" ;
$recipe1 = $spelling [ $key ] ;
if ( $charecters [ 1 ] == 1 )
{
$key = "1{$charecters[2]} " ;
$recipe2 = $spelling [ $key ] ;
$recipe3 = null ;
}
else
{
$key = ( integer) "{$charecters[1]} 0" ;
$recipe2 = $spelling [ $key ] ;
if ( $keyForFeminine == 1 && ( $charecters [ 2 ] == 1 || $charecters [ 2 ] == 2 ) )
{
$key = "{$charecters[2]} " ;
$recipe3 = $femaleSpelling [ $key ] ;
}
else
{
$key = "{$charecters[2]} " ;
$recipe3 = $spelling [ $key ] ;
}
}
}
elseif ( $strlen == 2 )
{
$recipe1 = null ;
if ( $charecters [ 0 ] == 1 )
{
$key = "1{$charecters[1]} " ;
$recipe2 = $spelling [ $key ] ;
$recipe3 = null ;
}
else
{
$key = "{$charecters[0]} 0" ;
$recipe2 = $spelling [ $key ] ;
if ( $keyForFeminine == 1 && ( $charecters [ 1 ] == 1 || $charecters [ 1 ] == 2 ) )
{
$key = "{$charecters[1]} " ;
$recipe3 = $femaleSpelling [ $key ] ;
}
else
{
$key = "{$charecters[1]} " ;
$recipe3 = $spelling [ $key ] ;
}
}
}
elseif ( $strlen == 1 )
{
$recipe1 = null ;
$recipe2 = null ;
if ( $keyForFeminine == 1 && ( $charecters [ 0 ] == 1 || $charecters [ 0 ] == 2 ) )
{
$key = "{$charecters[0]} " ;
$recipe3 = $femaleSpelling [ $key ] ;
}
else
{
$key = "{$charecters[0]} " ;
$recipe3 = $spelling [ $key ] ;
}
}
$recipes = "{$recipe1} {$recipe2} {$recipe3} " ;
$recipesArray [ ] = ( $recipes ) ;
}
return $recipesArray ;
}
// тут вот вводим для проверочки
$number = 7000008 ;
$parts = spellNumber( $number ) ;
$formAndMerge = formAndMerge( $parts ) ;
$recipesArray = smallNumberToText( $parts ) ;
// на выходе из функций имеем три массива одинакового размера с соответсвием данных по номерам элементов.
// объединяем необходимые массивы через for - нехорошо, наверно. Но как еще мне их объединить, что бы одно другое не сожрало?
for ( $i = 0 ; $i < $score ; $i ++ )
{
$reverseResult [ $i ] = ( "$recipesArray [$i ] $formAndMerge [$i ]" ) ;
}
// резворачиваем содержимое для нормального отображения, да и все
$finish = "На вашем счету {$text} " ;
echo $finish ;
PD9waHAKIAplcnJvcl9yZXBvcnRpbmcoLTEpOwptYl9pbnRlcm5hbF9lbmNvZGluZygndXRmLTgnKTsKLy/QvdCw0YfQuNC90LDRjyDRgSDQutC+0L3RhtCwLCDRgNCw0LfQsdC40LLQsNC10Lwg0YfQuNGB0LvQviDQvdCwINGN0LvQtdC80LXQvdGC0Ysg0LzQsNGB0YHQuNCy0LAsINC00L4g0YLRgNC10YUg0YHQuNC80LLQvtC70L7QsiDQsiDQutCw0LbQtNC+0Lwg0Y3Qu9C10LzQtdC90YLQtQpmdW5jdGlvbiBzcGVsbE51bWJlcigkbnVtYmVyKSAKewoJICRwYXJ0cz1hcnJheSgpOwoJICRhcnJheT1hcnJheSgpOwoJICRjb3VudD0xOwoJIGZvciAoJGk9MDskY291bnQhPTA7JGkrKykKCSB7CgkJJG51bWJlcj0kbnVtYmVyOwoJCSRyZWdleHA9Jy9bMC05XXsxLDN9JC91aSc7CgkJJGNvdW50PXByZWdfbWF0Y2goJHJlZ2V4cCwgJG51bWJlciwgJGFycmF5KTsKCQkkc3RyaW5nPWltcGxvZGUoJycsJGFycmF5KTsKCQkkcGFydHNbXT0oJHN0cmluZyk7CgkJJG51bWJlcj1wcmVnX3JlcGxhY2UoJHJlZ2V4cCwnJywkbnVtYmVyKTsKCSB9CgkgLy8g0LLQuNC00LjQvNC+LCDQu9C40LrQstC40LTQuNGA0YPRjiDQu9C40YjQuNC5INC/0YPRgdGC0L7QuSDRjdC70LXQvNC10L3RgiDQvdCwINC60L7QvdGG0LUKCSAkcGFydHM9YXJyYXlfZGlmZigkcGFydHMsIGFycmF5KCcnKSk7CgkgcmV0dXJuICRwYXJ0czsKIH0KLy8g0L3RgyDRjdGC0L4sINC30L3QsNGH0LjRgiwg0LzRiyDQs9C+0YLQvtCy0LjQvNGB0Y8g0Log0YLQvtC80YMsINGH0YLQviDQsdGLINCy0YvQsdGA0LDRgtGMINC/0LDQtNC10LbQuCAtINGB0L7QvtGC0L3QvtGB0LjQvCDQs9GA0YPQv9C/0Ysg0YHQu9C+0LIg0YEg0Y3Qu9C10LzQtdC90YLQsNC80Lgg0LzQsNGB0YHQuNCy0LAgCmZ1bmN0aW9uIGZvcm1BbmRNZXJnZSAoJGFycmF5KSAKewoJZ2xvYmFsICRudW1iZXI7IAoJJHJ1YmxlPWFycmF5KCfRgNGD0LHQu9GMJywn0YDRg9Cx0LvRjycsJ9GA0YPQsdC70LXQuScpOwoJJHRob3VzYW5kPWFycmF5KCfRgtGL0YHRj9GH0LAnLCfRgtGL0YHRj9GH0LgnLCfRgtGL0YHRj9GHJyk7CgkkbWlsbGlvbj1hcnJheSgn0LzQuNC70LvQuNC+0L0nLCfQvNC40LvQu9C40L7QvdCwJywn0LzQuNC70LvQuNC+0L3QvtCyJyk7CgkkYmlsbGlvbj1hcnJheSgn0LzQuNC70LvQuNCw0YDQtCcsJ9C80LjQu9C70LjQsNGA0LTQsCcsJ9C80LjQu9C70LjQsNGA0LTQvtCyJyk7CgkKCSRmb3JtQW5kTWVyZ2U9YXJyYXkoKTsKIGZvcmVhY2ggKCRhcnJheSBhcyAka2V5PT4kdmFsdWUpCiB7CgkgaWYgKCRrZXk9PTApCgkJewoJCQkkU2hhcGVTZWxlY3Rpb249d29yZFNoYXBlU2VsZWN0aW9uKCRydWJsZSwgJGFycmF5WzBdKTsKCQkJLy8g0YLRg9GCINC20LUg0LfQsNC90L7RgdC40Lwg0L3QsNC80LHQtdGAINC/0LXRgNC10LQgItGA0YPQsdC70Y/QvNC4IgkKCQkJLyog0LIg0LrQvtC90YbQtSDRg9C20LUg0L/QvtC90Y/Quywg0YfRgtC+INGBINC90YPQu9GP0LzQuCDRjyDQv9GA0L7QtdCx0LDQu9GB0Y8uIArQoi7Qui4g0L7RgtC+0LHRgNCw0LbQtdC90LjQtSAkbnVtYmVyINGDINC80LXQvdGPINGD0LbQtSDQsdGL0LvQviDQv9GA0LjRj9Cy0Y/Qt9Cw0L3QviDQuiDQvtGC0L7QsdGA0LDQttC10L3QuNGOICLRgNGD0LHQu9C10LkiLCDQv9GA0LjRiNC70L7RgdGMIArRgtCy0L7RgNC40YLRjCDRgtCw0LrRg9GOINGF0YPQudC90Y4qLwoJCQkJaWYgKCRTaGFwZVNlbGVjdGlvbj09TlVMTCkKCQkJCXsKCQkJCQkkU2hhcGVTZWxlY3Rpb249Iih7JG51bWJlcn0pINGA0YPQsdC70LXQuSI7CgkJCQl9CgkJCQllbHNlIAoJCQkJewoJCQkJCSRTaGFwZVNlbGVjdGlvbj0iKHskbnVtYmVyfSkgeyRTaGFwZVNlbGVjdGlvbn0iOyAKCQkJCX0KCQl9CgkgZWxzZWlmICgka2V5PT0xKQoJCXsKCQkJJFNoYXBlU2VsZWN0aW9uPXdvcmRTaGFwZVNlbGVjdGlvbigkdGhvdXNhbmQsICRhcnJheVsxXSk7CgkJfQoJZWxzZWlmICgka2V5PT0yKQoJCXsKCQkJJFNoYXBlU2VsZWN0aW9uPXdvcmRTaGFwZVNlbGVjdGlvbigkbWlsbGlvbiwgJGFycmF5WzJdKTsKCQl9CgllbHNlaWYgKCRrZXk9PTMpCgkJewoJCQkkU2hhcGVTZWxlY3Rpb249d29yZFNoYXBlU2VsZWN0aW9uKCRiaWxsaW9uLCAkYXJyYXlbM10pOwoJCX0KCQkkZm9ybUFuZE1lcmdlW109JFNoYXBlU2VsZWN0aW9uOwoJCQogfQogcmV0dXJuICRmb3JtQW5kTWVyZ2U7Cn0KLyrRgdC90LDRh9Cw0LvQsCDQvdCw0YXQvtC00LjQvCwg0LXRgdC70Lgg0LXRgdGC0YwsIDExLTE5LCDQv9C+0YLQvtC8ICAtINC+0YHRgtCw0LvRjNC90YvQtSDQstCw0YDQuNCw0L3RgtGLIAorINCx0L7RgNC10LzRgdGPINGBINC90YPQu9GP0LzQuCwg0LLQvtC30LLRgNCw0YnQsNC10Lwg0LLRgdC1INCyINC/0YDQtdC00YvQtNGD0YnRg9GOINGE0YPQvdC60YbQuNGOKi8KZnVuY3Rpb24gd29yZFNoYXBlU2VsZWN0aW9uKCRtYWduaXR1ZGUxLCAkbWFnbml0dWRlMikgCnsKCQoJJHJlZ2V4cDE9Jy8xWzAtOV0kL3VpJzsKCSRyZWdleHAyPScvW14xXT9bMi00XSQvdWknOyAKCSRyZWdleHAzPScvW14xXT9bMV0kL3VpJzsgCgkkcmVnZXhwND0nLzAwMCQvdWknOwoJaWYgKHByZWdfbWF0Y2goJHJlZ2V4cDEsICRtYWduaXR1ZGUyKSkKCQl7CgkJCSRTaGFwZVNlbGVjdGlvbj0kbWFnbml0dWRlMVsyXTsKCQl9CgllbHNlaWYgKHByZWdfbWF0Y2goJHJlZ2V4cDIsICRtYWduaXR1ZGUyKSkKCQl7CgkJCSRTaGFwZVNlbGVjdGlvbj0kbWFnbml0dWRlMVsxXTsKCQl9CgllbHNlaWYgKHByZWdfbWF0Y2goJHJlZ2V4cDMsICRtYWduaXR1ZGUyKSkKCQl7CgkJCSRTaGFwZVNlbGVjdGlvbj0kbWFnbml0dWRlMVswXTsKCQl9CgllbHNlaWYgKHByZWdfbWF0Y2goJHJlZ2V4cDQsICRtYWduaXR1ZGUyKSkKCQl7CgkJCSRTaGFwZVNlbGVjdGlvbj0nJzsKCQl9CgllbHNlIAoJCXsKCQkJJFNoYXBlU2VsZWN0aW9uPSRtYWduaXR1ZGUxWzJdOwoJCX0KCXJldHVybiAkU2hhcGVTZWxlY3Rpb247Cn0KLyrRgdC+0LHRgS3QvdC+LCDRgdCw0LzQvtC1INCz0LvQsNCy0L3QvtC1IC0g0L/QviDQutC+0LvQu9C40YfQtdGB0YLQstGDINGB0LjQvNCy0L7Qu9C+0LIg0LIg0Y3Qu9C10LzQtdC90YLQsNGFINC80LDRgdGB0LjQstC+0LIsIArQuCDQvdCw0LvQuNGH0LjRjiDQuNC70Lgg0L7RgtGB0YPRgtGB0YLQstC40Y4gMSDQvdCwINC/0L7Qt9C40YbQuNC4INC90LDQvNCx0LXRgCBvbmUg0L/QvtC00LHQuNGA0LDQtdC8INC/0YDQvtC/0LjRgdGMKi8KZnVuY3Rpb24gc21hbGxOdW1iZXJUb1RleHQoJHBhcnRzKSAKewogCgkgJHNwZWxsaW5nID0gYXJyYXkoCiAgICAgICAgMCAgID0+ICAnJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICA9PiAgJ9C00LXRgdGP0YLRjCcsICAgICAgIDEwMCA9PiAgJ9GB0YLQvicsCiAgICAgICAgMSAgID0+ICAn0L7QtNC40L0nLCAgICAgICAgIDExICA9PiAgJ9C+0LTQuNC90L3QsNC00YbQsNGC0YwnLCAgICAgIDIwICA9PiAgJ9C00LLQsNC00YbQsNGC0YwnLCAgICAgMjAwID0+ICAn0LTQstC10YHRgtC4JywKICAgICAgICAyICAgPT4gICfQtNCy0LAnLCAgICAgICAgICAxMiAgPT4gICfQtNCy0LXQvdCw0LTRhtCw0YLRjCcsICAgICAgIDMwICA9PiAgJ9GC0YDQuNC00YbQsNGC0YwnLCAgICAgMzAwID0+ICAn0YLRgNC40YHRgtCwJywKICAgICAgICAzICAgPT4gICfRgtGA0LgnLCAgICAgICAgICAxMyAgPT4gICfRgtGA0LjQvdCw0LTRhtCw0YLRjCcsICAgICAgIDQwICA9PiAgJ9GB0L7RgNC+0LonLCAgICAgICAgNDAwID0+ICAn0YfQtdGC0YvRgNC10YHRgtCwJywKICAgICAgICA0ICAgPT4gICfRh9C10YLRi9GA0LUnLCAgICAgICAxNCAgPT4gICfRh9C10YLRi9GA0L3QsNC00YbQsNGC0YwnLCAgICAgNTAgID0+ICAn0L/Rj9GC0YzQtNC10YHRj9GCJywgICAgNTAwID0+ICAn0L/Rj9GC0YzRgdC+0YInLAogICAgICAgIDUgICA9PiAgJ9C/0Y/RgtGMJywgICAgICAgICAxNSAgPT4gICfQv9GP0YLQvdCw0LTRhtCw0YLRjCcsICAgICAgIDYwICA9PiAgJ9GI0LXRgdGC0YzQtNC10YHRj9GCJywgICA2MDAgPT4gICfRiNC10YHRgtGM0YHQvtGCJywKICAgICAgICA2ICAgPT4gICfRiNC10YHRgtGMJywgICAgICAgIDE2ICA9PiAgJ9GI0LXRgdGC0L3QsNC00YbQsNGC0YwnLCAgICAgIDcwICA9PiAgJ9GB0LXQvNGM0LTQtdGB0Y/RgicsICAgIDcwMCA9PiAgJ9GB0LXQvNGM0YHQvtGCJywgICAgCiAgICAgICAgNyAgID0+ICAn0YHQtdC80YwnLCAgICAgICAgIDE3ICA9PiAgJ9GB0LXQvNC90LDQtNGG0LDRgtGMJywgICAgICAgODAgID0+ICAn0LLQvtGB0LXQvNGM0LTQtdGB0Y/RgicsICAgODAwID0+ICAn0LLQvtGB0LXQvNGM0YHQvtGCJywKICAgICAgICA4ICAgPT4gICfQstC+0YHQtdC80YwnLCAgICAgICAxOCAgPT4gICfQstC+0YHQtdC80L3QsNC00YbQsNGC0YwnLCAgICAgOTAgID0+ICAn0LTQtdCy0Y/QvdC+0YHRgtC+JywgICAgIDkwMCA9PiAgJ9C00LXQstGP0YLRjNGB0L7RgicsCiAgICAgICAgOSAgID0+ICAn0LTQtdCy0Y/RgtGMJywgICAgICAgMTkgID0+ICAn0LTQtdCy0Y/RgtC90LDQtNGG0LDRgtGMJyAgICAgCiAgICApOwogCiAgICAkZmVtYWxlU3BlbGxpbmcgPSBhcnJheSgKICAgICAgICAxICAgPT4gICfQvtC00L3QsCcsICAgICAgICAyICAgPT4gICfQtNCy0LUnCiAgICApOwoJJHJlY2lwZXNBcnJheT1hcnJheSgpOwoJZm9yZWFjaCAoJHBhcnRzIGFzICRrZXkgPT4gJHZhbHVlKQoJewovKtCSINC00L7QsdCw0LLQvtC6INC60L4g0LLRgdC10LzRgywg0LfQsNCx0YvQuyDQv9GA0L4gItC+0LTQvdCwIiAi0LTQstC1IiAtINC00L7QsdCw0LLQu9GP0LsgINGD0LbQtSDQsiDQutC+0L3RhtC1LiDQndC1INC/0YDQuNC00YPQvNCw0Lsg0L3QuNGH0LXQs9C+CtGD0LzQvdC10LUsINGH0YLQtdC8INCy0LLQvtC00LjRgtGMICRrZXlGb3JGZW1pbmluZSDQuCDQstGB0LUg0Y3RgtC4IEFORCDQuCBPUgoqLwoJCSRrZXlGb3JGZW1pbmluZT0ka2V5OwoJCSRpbnB1dERhdGE9JHZhbHVlOwoJCSRyZWdleHA9Jy8vdWknOwoJCSRzdHJsZW49bWJfc3RybGVuKCRpbnB1dERhdGEpOwoJCSRjaGFyZWN0ZXJzPXByZWdfc3BsaXQoJy8vdScsJGlucHV0RGF0YSwtMSxQUkVHX1NQTElUX05PX0VNUFRZKTsKCQlpZiAoJHN0cmxlbj09MykKCQl7Ci8q0J/RgNC40YjQu9C+0YHRjCDRgdGC0LDQstC40YLRjCDQuNC90YLQtdCz0LXRgCDQuCDQuNC3INC80LDRgdGB0LjQstCwINGD0LHQuNGA0LDRgtGMICLQvdC+0LvRjCIg0L/QvtGC0L7QvNGDINGH0YLQviDRjyDRhdGD0Lkg0LfQvdCw0LXRgiwgCtGH0YLQviDRgtGD0YIg0LTQtdC70LDRgtGMINGBINC/0YDQtdC00YPQv9C10YDQttC00LXQvdC40LXQvCBOb3RpY2U6IFVuZGVmaW5lZCBpbmRleDogMDAwINC4INC00YAuIArQv9GA0Lgg0L3Rg9C70Y/RhSDQsiAkbnVtYmVyLiDQn9GA0Lgg0Y3RgtC+0LwsINGPINC+0YHQvtCx0L4g0Lgg0L3QtSDQv9C+0L3Rj9C7LCDQv9C+0YfQtdC80YMg0YEg0LjQvdGC0LXQs9C10YDQvtC8INC30LDRgNCw0LHQvtGC0LDQu9C+OiggCiovCgoJCQkka2V5PShpbnRlZ2VyKSJ7JGNoYXJlY3RlcnNbMF19MDAiOwoJCQkkcmVjaXBlMT0gJHNwZWxsaW5nWyRrZXldOwoJCQkJaWYgKCRjaGFyZWN0ZXJzWzFdPT0xKQoJCQkJewoJCQkJCSRrZXk9IjF7JGNoYXJlY3RlcnNbMl19IjsKCQkJCQkkcmVjaXBlMj0kc3BlbGxpbmdbJGtleV07CgkJCQkJJHJlY2lwZTM9bnVsbDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkka2V5PShpbnRlZ2VyKSJ7JGNoYXJlY3RlcnNbMV19MCI7CgkJCQkJJHJlY2lwZTI9JHNwZWxsaW5nWyRrZXldOwoJCQkJCWlmICgka2V5Rm9yRmVtaW5pbmU9PTEgICYmICgkY2hhcmVjdGVyc1syXT09MSAgfHwgJGNoYXJlY3RlcnNbMl09PTIpKQoJCQkJCXsKCQkJCQkJJGtleT0ieyRjaGFyZWN0ZXJzWzJdfSI7CgkJCQkJCSRyZWNpcGUzPSRmZW1hbGVTcGVsbGluZ1ska2V5XTsKCQkJCQl9CgkJCQkJZWxzZSAKCQkJCQl7CgkJCQkJCSRrZXk9InskY2hhcmVjdGVyc1syXX0iOwoJCQkJCQkkcmVjaXBlMz0kc3BlbGxpbmdbJGtleV07CgkJCQkJfQoJCQkJfQoJCX0KCQllbHNlaWYgKCRzdHJsZW49PTIpCgkJewoJCQkkcmVjaXBlMT1udWxsOwoJCQkJaWYgKCRjaGFyZWN0ZXJzWzBdPT0xKQoJCQkJewoJCQkJCSRrZXk9IjF7JGNoYXJlY3RlcnNbMV19IjsKCQkJCQkkcmVjaXBlMj0kc3BlbGxpbmdbJGtleV07CgkJCQkJJHJlY2lwZTM9bnVsbDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkKCQkJCQkka2V5PSJ7JGNoYXJlY3RlcnNbMF19MCI7CgkJCQkJJHJlY2lwZTI9JHNwZWxsaW5nWyRrZXldOwoJCQkJCWlmICgka2V5Rm9yRmVtaW5pbmU9PTEgICYmICgkY2hhcmVjdGVyc1sxXT09MSAgfHwgJGNoYXJlY3RlcnNbMV09PTIpKQoJCQkJCXsKCQkJCQkJJGtleT0ieyRjaGFyZWN0ZXJzWzFdfSI7CgkJCQkJCSRyZWNpcGUzPSRmZW1hbGVTcGVsbGluZ1ska2V5XTsKCQkJCQl9CgkJCQkJZWxzZSAKCQkJCQl7CgkJCQkJCSRrZXk9InskY2hhcmVjdGVyc1sxXX0iOwoJCQkJCQkkcmVjaXBlMz0kc3BlbGxpbmdbJGtleV07CgkJCQkJfQoJCQkJfQoJCX0KCQllbHNlaWYgKCRzdHJsZW49PTEpCgkJewoJCQkkcmVjaXBlMT1udWxsOwoJCQkkcmVjaXBlMj1udWxsOwoJCQlpZiAoJGtleUZvckZlbWluaW5lPT0xICYmICgkY2hhcmVjdGVyc1swXT09MSAgfHwgJGNoYXJlY3RlcnNbMF09PTIpKQoJCQl7CgkJCQkka2V5PSJ7JGNoYXJlY3RlcnNbMF19IjsKCQkJCSRyZWNpcGUzPSRmZW1hbGVTcGVsbGluZ1ska2V5XTsKCQkJfQoJCQllbHNlIAoJCQl7CgkJCQkka2V5PSJ7JGNoYXJlY3RlcnNbMF19IjsKCQkJCSRyZWNpcGUzPSRzcGVsbGluZ1ska2V5XTsKCQkJfQoJCQkKCQl9CQoJCSRyZWNpcGVzPSJ7JHJlY2lwZTF9IHskcmVjaXBlMn0geyRyZWNpcGUzfSI7CgkJJHJlY2lwZXNBcnJheVtdPSgkcmVjaXBlcyk7Cgl9CglyZXR1cm4gJHJlY2lwZXNBcnJheTsKfQovLyDRgtGD0YIg0LLQvtGCINCy0LLQvtC00LjQvCDQtNC70Y8g0L/RgNC+0LLQtdGA0L7Rh9C60LgKJG51bWJlcj03MDAwMDA4OwogCiRwYXJ0cz1zcGVsbE51bWJlcigkbnVtYmVyKTsKJGZvcm1BbmRNZXJnZT1mb3JtQW5kTWVyZ2UoJHBhcnRzKTsKJHJlY2lwZXNBcnJheT1zbWFsbE51bWJlclRvVGV4dCgkcGFydHMpOwokc2NvcmU9Y291bnQoJHBhcnRzKTsKJHJldmVyc2VSZXN1bHQ9YXJyYXkoKTsgCi8vINC90LAg0LLRi9GF0L7QtNC1INC40Lcg0YTRg9C90LrRhtC40LkgINC40LzQtdC10Lwg0YLRgNC4INC80LDRgdGB0LjQstCwINC+0LTQuNC90LDQutC+0LLQvtCz0L4g0YDQsNC30LzQtdGA0LAg0YEg0YHQvtC+0YLQstC10YLRgdCy0LjQtdC8INC00LDQvdC90YvRhSDQv9C+INC90L7QvNC10YDQsNC8INGN0LvQtdC80LXQvdGC0L7Qsi4KLy8g0L7QsdGK0LXQtNC40L3Rj9C10Lwg0L3QtdC+0LHRhdC+0LTQuNC80YvQtSDQvNCw0YHRgdC40LLRiyDRh9C10YDQtdC3IGZvciAtINC90LXRhdC+0YDQvtGI0L4sINC90LDQstC10YDQvdC+LiDQndC+INC60LDQuiDQtdGJ0LUg0LzQvdC1INC40YUg0L7QsdGK0LXQtNC40L3QuNGC0YwsINGH0YLQviDQsdGLINC+0LTQvdC+INC00YDRg9Cz0L7QtSDQvdC1INGB0L7QttGA0LDQu9C+Pwpmb3IgKCRpPTA7JGk8JHNjb3JlOyRpKyspIAogIHsKCQkkcmV2ZXJzZVJlc3VsdFskaV09KCIkcmVjaXBlc0FycmF5WyRpXSAkZm9ybUFuZE1lcmdlWyRpXSIpOwogIH0KICAvLyDRgNC10LfQstC+0YDQsNGH0LjQstCw0LXQvCDRgdC+0LTQtdGA0LbQuNC80L7QtSDQtNC70Y8g0L3QvtGA0LzQsNC70YzQvdC+0LPQviDQvtGC0L7QsdGA0LDQttC10L3QuNGPLCDQtNCwINC4INCy0YHQtQoJJHJlc3VsdD1hcnJheV9yZXZlcnNlKCRyZXZlcnNlUmVzdWx0KTsgCgkkdGV4dD1pbXBsb2RlKCcgJywgJHJlc3VsdCk7CgkkZmluaXNoPSLQndCwINCy0LDRiNC10Lwg0YHRh9C10YLRgyB7JHRleHR9IjsKCWVjaG8gJGZpbmlzaDs=