database
yes(string)
no(string)
maybe(string)
predicates
run
positive(string)
negative(string)
xpositive(string)
xnegative(string)
ask(string,char)
remember(string,char)
delete_all
clauses
%-----------------------------------------------------------------------------
% описываем технические характеристики сотового телефона
tel("Samsung E1070", 890):- positive("цветной дисплей"),positive("емкий аккумулятор"),
negative("имеет камеру"),
negative("имеет FM-радио"),
negative("имеет Mp3-плеер"),
tel("Nokia 1202", 1000):- positive("цветной дисплей"),positive("емкий аккумулятор"),
negative("имеет камеру"),
negative("имеет FM-радио"),
negative("имеет Mp3-плеер"),
tel("Nokia 1208", 1190):-positive("цветной дисплей"),positive("емкий аккумулятор"),
negative("имеет камеру"),
negative("имеет FM-радио"),
negative("имеет Mp3-плеер"),
tel("Nokia 2630", 2490):-positive("цветной дисплей"),positive("емкий аккумулятор"),
negative ("имеет камеру"),
positive ("имеет FM-радио"),
negative("имеет Mp3-плеер"),
is("только для связи"
), is("развлечения и музыка"
).
tel("LG KP105", 1490):- positive("цветной дисплей"),positive("емкий аккумулятор"),
negative ("имеет камеру"),
positive ("имеет FM-радио"),
negative("имеет Mp3-плеер"),
tel("LG GB110", 2550):- positive("цветной дисплей"),positive("емкий аккумулятор"),
negative ("имеет камеру"),
positive ("имеет FM-радио"),
negative ("имеет Mp3-плеер"),
is("только для связи"
), is("развлечения и музыка"
).
tel("Nokia E52", 12990):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
positive ("имеет камеру"),
positive ("имеет FM-радио"),
positive ("имеет флэш-карту"),
negative("имеет навигацию"),
negative("имеет Mp3-плеер"),
tel("Nokia E66", 11890):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
positive ("имеет камеру"),
positive ("имеет FM-радио"),
positive ("имеет флэш-карту"),
negative ("имеет навигацию"),
negative("имеет Mp3-плеер"),
is("мобильный офис"
), is("помощник в путешествиях"
).
tel("Nokia E63", 13500):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
positive ("имеет камеру"),
positive ("имеет FM-радио"),
positive ("имеет флэш-карту"),
negative ("имеет навигацию"),
negative("имеет Mp3-плеер"),
is("мобильный офис"
), is("помощник в путешествиях"
).
tel("Nokia 5310", 7990):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
positive ("имеет камеру"),
positive ("имеет FM-радио"),
positive ("имеет флэш-карту"),
positive ("имеет Mp3-плеер"),
negative("сенсорный дисплей"),
positive ("имеет дополнительные клавиши управления Mp3-плеером"),
is("развлечения и музыка"
).
tel("Nokia 5530", 7780):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
positive ("имеет камеру"),
positive ("имеет FM-радио"),
positive ("имеет флэш-карту"),
positive ("имеет Mp3-плеер"),
negative ("сенсорный дисплей"),
positive ("имеет дополнительные клавиши управления Mp3-плеером"),
is("развлечения и музыка"
).
tel("Nokia 5800", 8890):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
positive ("имеет камеру"),
positive ("имеет FM-радио"),
positive ("имеет флэш-карту"),
positive ("имеет Mp3-плеер"),
negative ("сенсорный дисплей"),
positive ("имеет дополнительные клавиши управления Mp3-плеером"),
is("развлечения и музыка"
), is("мобильный офис"
),is ("помощник в путешествиях"
).
tel("SonyEricsson W595", 8450):- positive("цветной дисплей"), negative ("емкий аккумулятор"),
positive ("имеет камеру"),
positive ("имеет FM-радио"),
positive ("имеет флэш-карту"),
positive ("имеет Mp3-плеер"),
negative("сенсорный дисплей"),
negative ("имеет дополнительные клавиши управления Mp3-плеером"),
is("развлечения и музыка"
).
tel("SonyEricsson W395", 7890):- positive("цветной дисплей"), negative ("емкий аккумулятор"),
positive ("имеет камеру"),
positive ("имеет FM-радио"),
positive ("имеет флэш-карту"),
positive ("имеет Mp3-плеер"),
negative("сенсорный дисплей"),
negative ("имеет дополнительные клавиши управления Mp3-плеером"),
is("развлечения и музыка"
).
tel("Nokia N86", 24790):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
positive ("имеет камеру"),
positive ("имеет FM-радио"),
positive ("имеет флэш-карту"),
positive ("имеет навигацию"),
positive ("имеет Mp3-плеер"),
negative ("имеет Wi-Fi"),
positive ("имеет дополнительную клавиатуру"),
is("помощник в путешествиях"
), is("мобильный офис"
).
tel("Nokia N97", 27990):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
positive ("имеет камеру"),
positive ("имеет FM-радио"),
positive ("имеет флэш-карту"),
positive ("имеет навигацию"),
positive ("имеет Mp3-плеер"),
negative ("имеет Wi-Fi"),
positive ("имеет дополнительную клавиатуру"),
is("помощник в путешествиях"
), is("мобильный офис"
), is("развлечения и музыка"
).
tel("Такой телефон еще не произведен!!!!", 0).
%-----------------------------------------------------------------------------
is("только для связи"
):-positive
("звонить и отправлять смс"
),!. is("мобильный офис"
):- positive
("смартфон"
),!; negative("слушать музыку"),
positive("звонить и отправлять смс").
is("развлечения и музыка"
):- positive
("слушать музыку"
),!; positive("звонить и отправлять смс"),
negative("смартфон").
is("помощник в путешествиях"
):-positive
("имеет GPS
-навигацию"
). %-----------------------------------------------------------------------------
% работа с динамической базой данных
positive
(X
):-xpositive
(X
),!; xnegative
(X
),!,fail; ask
(X
,'y'). negative
(X
):-xnegative
(X
),!; xpositive
(X
),!,fail; ask
(X
,'n'). ask
(X
,R
):-write(X
," ?
: "
),readchar
(Reply
),write(Reply
,"\n"
), remember(X,Reply),R=Reply.
% проверка присутствия фактов в динамической базе данных
xpositive(X):-yes(X);maybe(X).
xnegative(X):-no(X);maybe(X).
% запоминаем факт в динамической базе данных
remember
(X
,'q'):-asserta(maybe
(X
)).% очищаем память от фактов динамической базы данных
delete_all
:-retract(yes
(_
)),delete_all
.delete_all
:-retract(no
(_
)),delete_all
.delete_all
:-retract(maybe
(_
)),delete_all
.delete_all.
%-----------------------------------------------------------------------------
run:-delete_all,
%repeat,
write("На вопросы отвечать
(y
-да
, n
-нет
, q
-не знаю
).\n"
),
make_selection(X, A, CHOOSE),
continue_selection(CHOOSE, X, A),
write("Завершить работу программы
(y
/n
): "
),readchar
(Z
), Z='y', !.
make_selection
(X
, A
, CHOOSE
) :- tel
(X
,A
), write("Ваш выбор
: "
,X
," цена
: "
,A
,"\n"
), write("Устраивает ли вас цена? \n1
-да
, данная модель меня устраивает\n2
-нет
, покажите модель по дешевле\n3
-нет
, покажите модель по дороже"
), readchar(CHOOSE).
continue_selection
('1', X
, A
) :- !, write("Ваш выбор
: "
,X
," цена
: "
,A
,"\n"
), !.continue_selection
('2', X
, A
) :- !, tel
(X
, Z
), Z
< A
, write("
-->>"
, X
, "
- "
, A
).goal
makewindow(1,10,12," Экспертная система : СОТОВЫЕ ТЕЛЕФОНЫ ",0,0,25,80),
write("
--------------------------------------------"
),nl, run.
ZGF0YWJhc2UKICB5ZXMoc3RyaW5nKQogIG5vKHN0cmluZykKICBtYXliZShzdHJpbmcpCgpwcmVkaWNhdGVzCiAgcmVwZWF0CiAgcnVuCiAgbWFrZV9zZWxlY3Rpb24oc3RyaW5nLCBpbnRlZ2VyLCBpbnRlZ2VyKQogIGNvbnRpbnVlX3NlbGVjdGlvbihpbnRlZ2VyLCBzdHJpbmcsIGludGVnZXIpCiAgdGVsKHN0cmluZyxpbnRlZ2VyKQogIGlzKHN0cmluZykKICBwb3NpdGl2ZShzdHJpbmcpCiAgbmVnYXRpdmUoc3RyaW5nKQogIHhwb3NpdGl2ZShzdHJpbmcpCiAgeG5lZ2F0aXZlKHN0cmluZykKICBhc2soc3RyaW5nLGNoYXIpCiAgcmVtZW1iZXIoc3RyaW5nLGNoYXIpCiAgZGVsZXRlX2FsbApjbGF1c2VzCiAgcmVwZWF0LgogIHJlcGVhdDotcmVwZWF0LgolLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJSDQvtC/0LjRgdGL0LLQsNC10Lwg0YLQtdGF0L3QuNGH0LXRgdC60LjQtSDRhdCw0YDQsNC60YLQtdGA0LjRgdGC0LjQutC4INGB0L7RgtC+0LLQvtCz0L4g0YLQtdC70LXRhNC+0L3QsAogICAgdGVsKCJTYW1zdW5nIEUxMDcwIiwgODkwKTotIHBvc2l0aXZlKCLRhtCy0LXRgtC90L7QuSDQtNC40YHQv9C70LXQuSIpLHBvc2l0aXZlKCLQtdC80LrQuNC5INCw0LrQutGD0LzRg9C70Y/RgtC+0YAiKSwKICAgICAgICAgICBuZWdhdGl2ZSgi0LjQvNC10LXRgiDQutCw0LzQtdGA0YMiKSwKICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUoItC40LzQtdC10YIgRk0t0YDQsNC00LjQviIpLAogICAgICAgICAgIG5lZ2F0aXZlKCLQuNC80LXQtdGCIE1wMy3Qv9C70LXQtdGAIiksCiAgICAgICAgICAgaXMoItGC0L7Qu9GM0LrQviDQtNC70Y8g0YHQstGP0LfQuCIpLgogIAogIHRlbCgiTm9raWEgMTIwMiIsIDEwMDApOi0gcG9zaXRpdmUoItGG0LLQtdGC0L3QvtC5INC00LjRgdC/0LvQtdC5IikscG9zaXRpdmUoItC10LzQutC40Lkg0LDQutC60YPQvNGD0LvRj9GC0L7RgCIpLAogICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSgi0LjQvNC10LXRgiDQutCw0LzQtdGA0YMiKSwKICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUoItC40LzQtdC10YIgRk0t0YDQsNC00LjQviIpLAogICAgICAgICAgIG5lZ2F0aXZlKCLQuNC80LXQtdGCIE1wMy3Qv9C70LXQtdGAIiksCiAgICAgICAgICAgaXMoItGC0L7Qu9GM0LrQviDQtNC70Y8g0YHQstGP0LfQuCIpLgoKICB0ZWwoIk5va2lhIDEyMDgiLCAxMTkwKTotcG9zaXRpdmUoItGG0LLQtdGC0L3QvtC5INC00LjRgdC/0LvQtdC5IikscG9zaXRpdmUoItC10LzQutC40Lkg0LDQutC60YPQvNGD0LvRj9GC0L7RgCIpLAogICAgICAgICAgIG5lZ2F0aXZlKCLQuNC80LXQtdGCINC60LDQvNC10YDRgyIpLAogICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSgi0LjQvNC10LXRgiBGTS3RgNCw0LTQuNC+IiksCiAgICAgICAgICAgbmVnYXRpdmUoItC40LzQtdC10YIgTXAzLdC/0LvQtdC10YAiKSwKICAgICAgICAgICBpcygi0YLQvtC70YzQutC+INC00LvRjyDRgdCy0Y/Qt9C4IikuCgoKCiAgdGVsKCJOb2tpYSAyNjMwIiwgMjQ5MCk6LXBvc2l0aXZlKCLRhtCy0LXRgtC90L7QuSDQtNC40YHQv9C70LXQuSIpLHBvc2l0aXZlKCLQtdC80LrQuNC5INCw0LrQutGD0LzRg9C70Y/RgtC+0YAiKSwKICAgICAgICAgIG5lZ2F0aXZlICgi0LjQvNC10LXRgiDQutCw0LzQtdGA0YMiKSwKICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCIEZNLdGA0LDQtNC40L4iKSwKICAgICAgICAgICBuZWdhdGl2ZSgi0LjQvNC10LXRgiBNcDMt0L/Qu9C10LXRgCIpLAogICAgICAgICAgIGlzKCLRgtC+0LvRjNC60L4g0LTQu9GPINGB0LLRj9C30LgiKSwgaXMoItGA0LDQt9Cy0LvQtdGH0LXQvdC40Y8g0Lgg0LzRg9C30YvQutCwIikuCgogIHRlbCgiTEcgS1AxMDUiLCAxNDkwKTotIHBvc2l0aXZlKCLRhtCy0LXRgtC90L7QuSDQtNC40YHQv9C70LXQuSIpLHBvc2l0aXZlKCLQtdC80LrQuNC5INCw0LrQutGD0LzRg9C70Y/RgtC+0YAiKSwKICAgICAgICAgICBuZWdhdGl2ZSAoItC40LzQtdC10YIg0LrQsNC80LXRgNGDIiksCiAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiBGTS3RgNCw0LTQuNC+IiksCiAgICAgICAgICAgbmVnYXRpdmUoItC40LzQtdC10YIgTXAzLdC/0LvQtdC10YAiKSwKICAgICAgICAgICBpcygi0YLQvtC70YzQutC+INC00LvRjyDRgdCy0Y/Qt9C4IikuCgogIHRlbCgiTEcgR0IxMTAiLCAyNTUwKTotIHBvc2l0aXZlKCLRhtCy0LXRgtC90L7QuSDQtNC40YHQv9C70LXQuSIpLHBvc2l0aXZlKCLQtdC80LrQuNC5INCw0LrQutGD0LzRg9C70Y/RgtC+0YAiKSwKICAgICAgICAgICBuZWdhdGl2ZSAoItC40LzQtdC10YIg0LrQsNC80LXRgNGDIiksCiAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiBGTS3RgNCw0LTQuNC+IiksCiAgICAgICAgICBuZWdhdGl2ZSAoItC40LzQtdC10YIgTXAzLdC/0LvQtdC10YAiKSwKICAgICAgICAgICBpcygi0YLQvtC70YzQutC+INC00LvRjyDRgdCy0Y/Qt9C4IiksIGlzKCLRgNCw0LfQstC70LXRh9C10L3QuNGPINC4INC80YPQt9GL0LrQsCIpLgoKIAogIHRlbCgiTm9raWEgRTUyIiwgMTI5OTApOi0gcG9zaXRpdmUoItGG0LLQtdGC0L3QvtC5INC00LjRgdC/0LvQtdC5IiksIHBvc2l0aXZlICgi0LXQvNC60LjQuSDQsNC60LrRg9C80YPQu9GP0YLQvtGAIiksCiAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCINC60LDQvNC10YDRgyIpLAogICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIgRk0t0YDQsNC00LjQviIpLAogICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiDRhNC70Y3RiC3QutCw0YDRgtGDIiksCiAgICAgICAgICAgbmVnYXRpdmUoItC40LzQtdC10YIg0L3QsNCy0LjQs9Cw0YbQuNGOIiksCiAgICAgICAgICAgbmVnYXRpdmUoItC40LzQtdC10YIgTXAzLdC/0LvQtdC10YAiKSwKICAgICAgICAgICBpcygi0LzQvtCx0LjQu9GM0L3Ri9C5INC+0YTQuNGBIikuCgogIHRlbCgiTm9raWEgRTY2IiwgMTE4OTApOi0gcG9zaXRpdmUoItGG0LLQtdGC0L3QvtC5INC00LjRgdC/0LvQtdC5IiksIHBvc2l0aXZlICgi0LXQvNC60LjQuSDQsNC60LrRg9C80YPQu9GP0YLQvtGAIiksCiAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCINC60LDQvNC10YDRgyIpLAogICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIgRk0t0YDQsNC00LjQviIpLAogICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiDRhNC70Y3RiC3QutCw0YDRgtGDIiksCiAgICAgICAgICAgbmVnYXRpdmUgKCLQuNC80LXQtdGCINC90LDQstC40LPQsNGG0LjRjiIpLAogICAgICAgICAgIG5lZ2F0aXZlKCLQuNC80LXQtdGCIE1wMy3Qv9C70LXQtdGAIiksCiAgICAgICAgICAgaXMoItC80L7QsdC40LvRjNC90YvQuSDQvtGE0LjRgSIpLCAgaXMoItC/0L7QvNC+0YnQvdC40Log0LIg0L/Rg9GC0LXRiNC10YHRgtCy0LjRj9GFIikuCgoKICB0ZWwoIk5va2lhIEU2MyIsIDEzNTAwKTotIHBvc2l0aXZlKCLRhtCy0LXRgtC90L7QuSDQtNC40YHQv9C70LXQuSIpLCBwb3NpdGl2ZSAoItC10LzQutC40Lkg0LDQutC60YPQvNGD0LvRj9GC0L7RgCIpLAogICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiDQutCw0LzQtdGA0YMiKSwKICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCIEZNLdGA0LDQtNC40L4iKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIg0YTQu9GN0Ygt0LrQsNGA0YLRgyIpLAogICAgICAgICAgIG5lZ2F0aXZlICgi0LjQvNC10LXRgiDQvdCw0LLQuNCz0LDRhtC40Y4iKSwKICAgICAgICAgICBuZWdhdGl2ZSgi0LjQvNC10LXRgiBNcDMt0L/Qu9C10LXRgCIpLAogICAgICAgICAgIGlzKCLQvNC+0LHQuNC70YzQvdGL0Lkg0L7RhNC40YEiKSwgIGlzKCLQv9C+0LzQvtGJ0L3QuNC6INCyINC/0YPRgtC10YjQtdGB0YLQstC40Y/RhSIpLgoKICB0ZWwoIk5va2lhIDUzMTAiLCA3OTkwKTotIHBvc2l0aXZlKCLRhtCy0LXRgtC90L7QuSDQtNC40YHQv9C70LXQuSIpLCBwb3NpdGl2ZSAoItC10LzQutC40Lkg0LDQutC60YPQvNGD0LvRj9GC0L7RgCIpLAogICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiDQutCw0LzQtdGA0YMiKSwKICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCIEZNLdGA0LDQtNC40L4iKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIg0YTQu9GN0Ygt0LrQsNGA0YLRgyIpLAogICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiBNcDMt0L/Qu9C10LXRgCIpLAogICAgICAgICAgIG5lZ2F0aXZlKCLRgdC10L3RgdC+0YDQvdGL0Lkg0LTQuNGB0L/Qu9C10LkiKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSDQutC70LDQstC40YjQuCDRg9C/0YDQsNCy0LvQtdC90LjRjyBNcDMt0L/Qu9C10LXRgNC+0LwiKSwKICAgICAgICAgICBpcygi0YDQsNC30LLQu9C10YfQtdC90LjRjyDQuCDQvNGD0LfRi9C60LAiKS4KCiAgdGVsKCJOb2tpYSA1NTMwIiwgNzc4MCk6LSBwb3NpdGl2ZSgi0YbQstC10YLQvdC+0Lkg0LTQuNGB0L/Qu9C10LkiKSwgcG9zaXRpdmUgKCLQtdC80LrQuNC5INCw0LrQutGD0LzRg9C70Y/RgtC+0YAiKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIg0LrQsNC80LXRgNGDIiksCiAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiBGTS3RgNCw0LTQuNC+IiksCiAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCINGE0LvRjdGILdC60LDRgNGC0YMiKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIgTXAzLdC/0LvQtdC10YAiKSwKICAgICAgICAgICBuZWdhdGl2ZSAoItGB0LXQvdGB0L7RgNC90YvQuSDQtNC40YHQv9C70LXQuSIpLAogICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiDQtNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1INC60LvQsNCy0LjRiNC4INGD0L/RgNCw0LLQu9C10L3QuNGPIE1wMy3Qv9C70LXQtdGA0L7QvCIpLAogICAgICAgICAgIGlzKCLRgNCw0LfQstC70LXRh9C10L3QuNGPINC4INC80YPQt9GL0LrQsCIpLgoKICB0ZWwoIk5va2lhIDU4MDAiLCA4ODkwKTotIHBvc2l0aXZlKCLRhtCy0LXRgtC90L7QuSDQtNC40YHQv9C70LXQuSIpLCBwb3NpdGl2ZSAoItC10LzQutC40Lkg0LDQutC60YPQvNGD0LvRj9GC0L7RgCIpLAogICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiDQutCw0LzQtdGA0YMiKSwKICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCIEZNLdGA0LDQtNC40L4iKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIg0YTQu9GN0Ygt0LrQsNGA0YLRgyIpLAogICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiBNcDMt0L/Qu9C10LXRgCIpLAogICAgICAgICAgIG5lZ2F0aXZlICgi0YHQtdC90YHQvtGA0L3Ri9C5INC00LjRgdC/0LvQtdC5IiksCiAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCINC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUg0LrQu9Cw0LLQuNGI0Lgg0YPQv9GA0LDQstC70LXQvdC40Y8gTXAzLdC/0LvQtdC10YDQvtC8IiksCmlzKCLRgNCw0LfQstC70LXRh9C10L3QuNGPINC4INC80YPQt9GL0LrQsCIpLCBpcygi0LzQvtCx0LjQu9GM0L3Ri9C5INC+0YTQuNGBIiksaXMgKCLQv9C+0LzQvtGJ0L3QuNC6INCyINC/0YPRgtC10YjQtdGB0YLQstC40Y/RhSIpLgoKICB0ZWwoIlNvbnlFcmljc3NvbiBXNTk1IiwgODQ1MCk6LSBwb3NpdGl2ZSgi0YbQstC10YLQvdC+0Lkg0LTQuNGB0L/Qu9C10LkiKSwgbmVnYXRpdmUgKCLQtdC80LrQuNC5INCw0LrQutGD0LzRg9C70Y/RgtC+0YAiKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIg0LrQsNC80LXRgNGDIiksCiAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiBGTS3RgNCw0LTQuNC+IiksCiAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCINGE0LvRjdGILdC60LDRgNGC0YMiKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIgTXAzLdC/0LvQtdC10YAiKSwKICAgICAgICAgICBuZWdhdGl2ZSgi0YHQtdC90YHQvtGA0L3Ri9C5INC00LjRgdC/0LvQtdC5IiksCiAgICAgICAgICAgbmVnYXRpdmUgKCLQuNC80LXQtdGCINC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUg0LrQu9Cw0LLQuNGI0Lgg0YPQv9GA0LDQstC70LXQvdC40Y8gTXAzLdC/0LvQtdC10YDQvtC8IiksCiAgICAgICAgICAgaXMoItGA0LDQt9Cy0LvQtdGH0LXQvdC40Y8g0Lgg0LzRg9C30YvQutCwIikuCgogIHRlbCgiU29ueUVyaWNzc29uIFczOTUiLCA3ODkwKTotIHBvc2l0aXZlKCLRhtCy0LXRgtC90L7QuSDQtNC40YHQv9C70LXQuSIpLCBuZWdhdGl2ZSAoItC10LzQutC40Lkg0LDQutC60YPQvNGD0LvRj9GC0L7RgCIpLAogICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiDQutCw0LzQtdGA0YMiKSwKICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCIEZNLdGA0LDQtNC40L4iKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIg0YTQu9GN0Ygt0LrQsNGA0YLRgyIpLAogICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiBNcDMt0L/Qu9C10LXRgCIpLAogICAgICAgICAgIG5lZ2F0aXZlKCLRgdC10L3RgdC+0YDQvdGL0Lkg0LTQuNGB0L/Qu9C10LkiKSwKICAgICAgICAgICBuZWdhdGl2ZSAoItC40LzQtdC10YIg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSDQutC70LDQstC40YjQuCDRg9C/0YDQsNCy0LvQtdC90LjRjyBNcDMt0L/Qu9C10LXRgNC+0LwiKSwKICAgICAgICAgICBpcygi0YDQsNC30LLQu9C10YfQtdC90LjRjyDQuCDQvNGD0LfRi9C60LAiKS4KCiAgdGVsKCJOb2tpYSBOODYiLCAyNDc5MCk6LSBwb3NpdGl2ZSgi0YbQstC10YLQvdC+0Lkg0LTQuNGB0L/Qu9C10LkiKSwgcG9zaXRpdmUgKCLQtdC80LrQuNC5INCw0LrQutGD0LzRg9C70Y/RgtC+0YAiKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIg0LrQsNC80LXRgNGDIiksCiAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiBGTS3RgNCw0LTQuNC+IiksCiAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCINGE0LvRjdGILdC60LDRgNGC0YMiKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIg0L3QsNCy0LjQs9Cw0YbQuNGOIiksCiAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCIE1wMy3Qv9C70LXQtdGAIiksCiAgICAgICAgICAgbmVnYXRpdmUgKCLQuNC80LXQtdGCIFdpLUZpIiksCiAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCINC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdGD0Y4g0LrQu9Cw0LLQuNCw0YLRg9GA0YMiKSwKICAgICAgICAgICBpcygi0L/QvtC80L7RidC90LjQuiDQsiDQv9GD0YLQtdGI0LXRgdGC0LLQuNGP0YUiKSwgaXMoItC80L7QsdC40LvRjNC90YvQuSDQvtGE0LjRgSIpLgoKICB0ZWwoIk5va2lhIE45NyIsIDI3OTkwKTotIHBvc2l0aXZlKCLRhtCy0LXRgtC90L7QuSDQtNC40YHQv9C70LXQuSIpLCBwb3NpdGl2ZSAoItC10LzQutC40Lkg0LDQutC60YPQvNGD0LvRj9GC0L7RgCIpLAogICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiDQutCw0LzQtdGA0YMiKSwKICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUgKCLQuNC80LXQtdGCIEZNLdGA0LDQtNC40L4iKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIg0YTQu9GN0Ygt0LrQsNGA0YLRgyIpLAogICAgICAgICAgIHBvc2l0aXZlICgi0LjQvNC10LXRgiDQvdCw0LLQuNCz0LDRhtC40Y4iKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIgTXAzLdC/0LvQtdC10YAiKSwKICAgICAgICAgICBuZWdhdGl2ZSAoItC40LzQtdC10YIgV2ktRmkiKSwKICAgICAgICAgICBwb3NpdGl2ZSAoItC40LzQtdC10YIg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YPRjiDQutC70LDQstC40LDRgtGD0YDRgyIpLAppcygi0L/QvtC80L7RidC90LjQuiDQsiDQv9GD0YLQtdGI0LXRgdGC0LLQuNGP0YUiKSwgaXMoItC80L7QsdC40LvRjNC90YvQuSDQvtGE0LjRgSIpLCBpcygi0YDQsNC30LLQu9C10YfQtdC90LjRjyDQuCDQvNGD0LfRi9C60LAiKS4KCiAgdGVsKCLQotCw0LrQvtC5INGC0LXQu9C10YTQvtC9INC10YnQtSDQvdC1INC/0YDQvtC40LfQstC10LTQtdC9ISEhISIsIDApLgoKJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgaXMoItGC0L7Qu9GM0LrQviDQtNC70Y8g0YHQstGP0LfQuCIpOi1wb3NpdGl2ZSgi0LfQstC+0L3QuNGC0Ywg0Lgg0L7RgtC/0YDQsNCy0LvRj9GC0Ywg0YHQvNGBIiksIS4KICBpcygi0LzQvtCx0LjQu9GM0L3Ri9C5INC+0YTQuNGBIik6LSBwb3NpdGl2ZSgi0YHQvNCw0YDRgtGE0L7QvSIpLCE7CiAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSgi0YHQu9GD0YjQsNGC0Ywg0LzRg9C30YvQutGDIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZSgi0LfQstC+0L3QuNGC0Ywg0Lgg0L7RgtC/0YDQsNCy0LvRj9GC0Ywg0YHQvNGBIikuCiAgaXMoItGA0LDQt9Cy0LvQtdGH0LXQvdC40Y8g0Lgg0LzRg9C30YvQutCwIik6LSBwb3NpdGl2ZSgi0YHQu9GD0YjQsNGC0Ywg0LzRg9C30YvQutGDIiksITsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlKCLQt9Cy0L7QvdC40YLRjCDQuCDQvtGC0L/RgNCw0LLQu9GP0YLRjCDRgdC80YEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlKCLRgdC80LDRgNGC0YTQvtC9IikuCiAgaXMoItC/0L7QvNC+0YnQvdC40Log0LIg0L/Rg9GC0LXRiNC10YHRgtCy0LjRj9GFIik6LXBvc2l0aXZlKCLQuNC80LXQtdGCIEdQUy3QvdCw0LLQuNCz0LDRhtC40Y4iKS4KJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiUg0YDQsNCx0L7RgtCwINGBINC00LjQvdCw0LzQuNGH0LXRgdC60L7QuSDQsdCw0LfQvtC5INC00LDQvdC90YvRhQogIHBvc2l0aXZlKFgpOi14cG9zaXRpdmUoWCksITsgeG5lZ2F0aXZlKFgpLCEsZmFpbDsgYXNrKFgsJ3knKS4KICBuZWdhdGl2ZShYKToteG5lZ2F0aXZlKFgpLCE7IHhwb3NpdGl2ZShYKSwhLGZhaWw7IGFzayhYLCduJykuCiAgYXNrKFgsUik6LXdyaXRlKFgsIiAgPyAgOiAiKSxyZWFkY2hhcihSZXBseSksd3JpdGUoUmVwbHksIlxuIiksCiAgICAgICAgICAgIHJlbWVtYmVyKFgsUmVwbHkpLFI9UmVwbHkuCiUg0L/RgNC+0LLQtdGA0LrQsCDQv9GA0LjRgdGD0YLRgdGC0LLQuNGPINGE0LDQutGC0L7QsiDQsiDQtNC40L3QsNC80LjRh9C10YHQutC+0Lkg0LHQsNC30LUg0LTQsNC90L3Ri9GFCiAgeHBvc2l0aXZlKFgpOi15ZXMoWCk7bWF5YmUoWCkuCiAgeG5lZ2F0aXZlKFgpOi1ubyhYKTttYXliZShYKS4KJSDQt9Cw0L/QvtC80LjQvdCw0LXQvCDRhNCw0LrRgiDQsiDQtNC40L3QsNC80LjRh9C10YHQutC+0Lkg0LHQsNC30LUg0LTQsNC90L3Ri9GFCiAgcmVtZW1iZXIoWCwneScpOi1hc3NlcnRhKHllcyhYKSkuCiAgcmVtZW1iZXIoWCwnbicpOi1hc3NlcnR6KG5vKFgpKS4KICByZW1lbWJlcihYLCdxJyk6LWFzc2VydGEobWF5YmUoWCkpLgolINC+0YfQuNGJ0LDQtdC8INC/0LDQvNGP0YLRjCDQvtGCINGE0LDQutGC0L7QsiDQtNC40L3QsNC80LjRh9C10YHQutC+0Lkg0LHQsNC30Ysg0LTQsNC90L3Ri9GFCmRlbGV0ZV9hbGw6LXJldHJhY3QoeWVzKF8pKSxkZWxldGVfYWxsLgpkZWxldGVfYWxsOi1yZXRyYWN0KG5vKF8pKSxkZWxldGVfYWxsLgpkZWxldGVfYWxsOi1yZXRyYWN0KG1heWJlKF8pKSxkZWxldGVfYWxsLgpkZWxldGVfYWxsLgolLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KcnVuOi1kZWxldGVfYWxsLAogICAgICAgJXJlcGVhdCwKICAgICAgIHdyaXRlKCLQndCwINCy0L7Qv9GA0L7RgdGLINC+0YLQstC10YfQsNGC0YwgKHkt0LTQsCwgbi3QvdC10YIsIHEt0L3QtSDQt9C90LDRjikuXG4iKSwgICAgIAogICAgICAgICAKICAgIG1ha2Vfc2VsZWN0aW9uKFgsIEEsIENIT09TRSksCiAgICBjb250aW51ZV9zZWxlY3Rpb24oQ0hPT1NFLCBYLCBBKSwKICAgICAgIHdyaXRlKCLQl9Cw0LLQtdGA0YjQuNGC0Ywg0YDQsNCx0L7RgtGDINC/0YDQvtCz0YDQsNC80LzRiyAoeS9uKTogIikscmVhZGNoYXIoWiksCiAgICAgICB3cml0ZShaKSxubCwKICAgICAgIFo9J3knLCAhLgoKbWFrZV9zZWxlY3Rpb24oWCwgQSwgQ0hPT1NFKSA6LSB0ZWwoWCxBKSwgd3JpdGUoItCS0LDRiCDQstGL0LHQvtGAOiAiLFgsIiDRhtC10L3QsDogIixBLCJcbiIpLAogICAgICAgIHdyaXRlKCLQo9GB0YLRgNCw0LjQstCw0LXRgiDQu9C4INCy0LDRgSDRhtC10L3QsD8gXG4xLdC00LAsINC00LDQvdC90LDRjyDQvNC+0LTQtdC70Ywg0LzQtdC90Y8g0YPRgdGC0YDQsNC40LLQsNC10YJcbjIt0L3QtdGCLCDQv9C+0LrQsNC20LjRgtC1INC80L7QtNC10LvRjCDQv9C+INC00LXRiNC10LLQu9C1XG4zLdC90LXRgiwg0L/QvtC60LDQttC40YLQtSDQvNC+0LTQtdC70Ywg0L/QviDQtNC+0YDQvtC20LUiKSwKICAgICAgICByZWFkY2hhcihDSE9PU0UpLgoKY29udGludWVfc2VsZWN0aW9uKCcxJywgWCwgQSkgOi0gICEsIHdyaXRlKCLQktCw0Ygg0LLRi9Cx0L7RgDogIixYLCIg0YbQtdC90LA6ICIsQSwiXG4iKSwgIS4KY29udGludWVfc2VsZWN0aW9uKCcyJywgWCwgQSkgOi0gICEsIHRlbChYLCBaKSwgWiA8IEEsIHdyaXRlKCItLT4+IiwgWCwgIiAtICIsIEEpLgpnb2FsCiAgbWFrZXdpbmRvdygxLDEwLDEyLCIg0K3QutGB0L/QtdGA0YLQvdCw0Y8g0YHQuNGB0YLQtdC80LAgOiDQodCe0KLQntCS0KvQlSDQotCV0JvQldCk0J7QndCrICIsMCwwLDI1LDgwKSwKICB3cml0ZSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKSxubCwKICBydW4uIA==