Научная статья на тему 'Исследование адаптивности программного обеспечения на основе применения математических моделей функционально избыточных дискретных систем'

Исследование адаптивности программного обеспечения на основе применения математических моделей функционально избыточных дискретных систем Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
146
21
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
МАТЕМАТИЧЕСКАЯ МОДЕЛЬ АДАПТИВНОЙ ПРОГРАММЫ / MATHEMATICAL MODEL OF ADAPTIVE PROGRAM / АВТОМАТНАЯ МОДЕЛЬ ПРОГРАММНОЙ СИСТЕМЫ / FINITE-STATE-MACHINE MODEL OF PROGRAM SYSTEM / АДАПТИВНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ / ADAPTIVE SOFTWARE / ФУНКЦИОНАЛЬНАЯ ИЗБЫТОЧНОСТЬ / FUNCTIONAL REDUNDANCY / УНИВЕРСАЛЬНЫЙ АВТОМАТ / UNIVERSAL AUTOMATA / ВОССТАНАВЛИВАЮЩАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ / RECREATIONAL SEQUENCE

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Шульга Т. Э., Сластихина М. Д.

Излагаются принципы использования математических моделей функционально избыточных дискретных систем при исследовании адаптивности программного обеспечения. В качестве модели дискретной системы рассматриваются полиномы специального вида, в качестве модели функционально избыточной дискретной системы универсальные автоматы, заданные такими полиномами. Предполагается, что программная система проектируется на основе принципов автоматного программирования. В качестве примера адаптивной программной системы рассматривается система отслеживания программных ошибок.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

USING MATHEMATICAL MODELS FOR FUNCTIONALLY REDUNDANT DISCRETE SYSTEMS IN THE STUDY OF SOFTWARE АDAPTABI1ITY

The paper is dedicated to the issues of software аdaptabi1ity. A mathematical model is proposed for functionally redundant discrete systems. We use polynomials of a special form for the mathematical model of discrete systems. To simulate functionally redundant discrete systems, we use universal automata that are given by such polynomials. The proposed principles for mathematical modeling of functionally redundant discrete systems can be applied for the study of software аdaptabi1ity provided the software is designed by meqans of the finite-state-machine model. An example of the software for program debugging is analyzed.

Текст научной работы на тему «Исследование адаптивности программного обеспечения на основе применения математических моделей функционально избыточных дискретных систем»

УДК 519.71

Т.Э. Шульга, М.Д. Сластихина

ИССЛЕДОВАНИЕ АДАПТИВНОСТИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ НА ОСНОВЕ ПРИМЕНЕНИЯ МАТЕМАТИЧЕСКИХ МОДЕЛЕЙ ФУНКЦИОНАЛЬНО ИЗБЫТОЧНЫХ ДИСКРЕТНЫХ СИСТЕМ

Излагаются принципы использования математических моделей функционально избыточных дискретных систем при исследовании адаптивности программного обеспечения. В качестве модели дискретной системы рассматриваются полиномы специального вида, в качестве модели функционально избыточной дискретной системы - универсальные автоматы, заданные такими полиномами. Предполагается, что

программная система проектируется на основе принципов автоматного программирования. В качестве примера адаптивной программной системы рассматривается система отслеживания программных ошибок.

Математическая модель адаптивной программы, автоматная модель программной системы, адаптивное программное обеспечение, функциональная избыточность, универсальный автомат, восстанавливающая последовательность

T.E. Shulga, M.D. Slastihina

USING MATHEMATICAL MODELS FOR FUNCTIONALLY REDUNDANT DISCRETE SYSTEMS IN THE STUDY OF SOFTWARE ADAPTABI1ITY

The paper is dedicated to the issues of software аdaptabi1ity. A mathematical model is proposed for functionally redundant discrete systems. We use polynomials of a special form for the mathematical model of discrete systems. To simulate functionally redundant discrete systems, we use universal automata that are given by such polynomials. The proposed principles for mathematical modeling of functionally redundant discrete systems can be applied for the study of software аdaptabi1ity provided the software is designed by meqans of the finite-state-machine model. An example of the software for program debugging is analyzed.

Mathematical model of adaptive program, finite-state-machine model of program system, adaptive software, functional redundancy , universal automata, recreational sequence

Введение

Одним из важнейших требований к современным техническим и программным системам является требование адаптивности. В целом сегодня адаптивность оценивается не только как свойство аппаратного обеспечения, но и как комплекс взаимодействия аппаратной части, программного обеспечения (ПО) и человеческих ресурсов [1-3]. В соответствии с международным стандартом ISO/IEC 9126-1:2001 и его российским аналогом ГОСТ Р ИСО/МЭК 9126-93 Информационная технология. Оценка программной продукции. Характеристики качества и руководства по их применению адаптируемость (аdaptabi1ity) относится к основным характеристикам качества программного продукта (ПП) и понимается как атрибуты программного обеспечения, относящиеся к удобству его адаптации к различным конкретным условиям эксплуатации, без применения других действий или способов, кроме тех, что предусмотрены для этого в рассматриваемом программном обеспечении. Иными словами, адаптивный ПП должен иметь возможности настройки для адаптации к новым условиям работы: файлы конфигурации, окна настроек приложения, выбор расположения файлов данных, выбор строки подключения к базе данных, выбор расположения результирующих файлов и т.п.

Важнейшими требованиями при разработке любой программной системы являются требования к ее функциональности. Очевидно, что любой вид адаптивности ПО достигается за счет избыточной функциональности. Следует отметить, что любая дополнительная функциональность ПО порождает дополнительные связи внутри системы, которые могут усложнять интерфейс пользователя и ведут к необходимости внесения в систему дополнительной информации. Сложность разработки функционально избыточных систем и большие затраты на их разработку приводят к тому, что даже если потребитель приобретает ПО с искусственно ограниченной функциональностью (т.е. без избыточной функциональности), она все равно оплачивает такую функциональность за счет более высокой стоимости остальной функциональности [4]. Заметим также, что функциональная избыточность программной системы может использоваться не только в целях ее адаптации при изменениях требований к системе, но и для повышения надежности ее функционирования. Например, в качестве источников обеспечения безопасности информационных систем можно рассматривать программную, информационную и временную избыточность [5].

Для решения задач разработки и эффективного использования адаптивного ПО специалисты в области программной инженерии все чаще обращают к современной интерпретации классической теории управления [3]. В данной статье продемонстрировано, каким образом для решения последней задачи могут быть использованы математические модели функционально избыточных дискретных

159

систем [6], а именно модель полиномов с рациональными коэффициентами [7, 8]. При этом предполагается, что программная система может быть спроектирована на основе принципов автоматного программирования [9, 10]. В качестве примера адаптивной программной системы рассматривается система отслеживания программных ошибок.

Полиномиальная модель дискретной системы

Введем используемую в данной статье терминологию для описания функционально избыточных дискретных систем.

Под дискретной понимается система, находящаяся в любой момент времени в одном из состояний и переходящая из состояния в состояние под воздействием входных сигналов в определенные моменты времени. При этом предполагается, что множества состояний системы и входных сигналов конечны.

В качестве базовой математической модели дискретной системы будем рассматривать конечный детерминированный автомат [11]

А=(Х, Б, 8), (1)

где 3 ={5!, ... , 5т} - конечное множество внутренних состояний; Х={х... , хп } - конечное множество входных сигналов; 8:ХхБ- функция переходов.

Пронумеруем состояния автомата натуральными числами 3 ={0, 1,..., т-1} и представим функцию переходов данного автомата в виде обобщенных подстановок:

8

5о = 0

5! = 1

5т-1 = т■

50 51 ... 5 т-1

х е X

(2)

Обозначим 5 = (0,1,...,т), 5х = (5о,^1,...,5т-1). Для краткости также будем использовать запись подстановки (2) в виде 8х (5) = 5х.

Заметим также, что поведение автомата (1) может быть описано функцией 8: Б X X* ® Б, где X - множество слов алфавита X.

В [7] показано, что данная модель системы эквивалента модели системы, задаваемой полиномами с рациональными коэффициентами следующего вида:

8(5) = 0)(х) + «1(х)5 + а 2 (х)5 +... + ат-Х(х)5т- =: / (5)

(3)

где ак (х): X ® Q , где Q - множество рациональных чисел, к = 0,(т -1), х е X.

Иными словами, для каждой подстановки вида (2) можно построить эквивалентный ей полином вида (3) и наоборот. При этом для вычисления степени и коэффициентов полинома по заданной подстановки используется следующая формула:

т-1 ^ т-1 5 _I ^

/ (5) =

п

^ к-I

к=0 V,I=0,1Фк к 1

к ■

(4)

Так как любая подстановка вида (2) может быть задана полиномом вида (3), любой автомат вида (1) может быть задан семейством полиномов данного вида.

Приведем пример моделирования системы с помощью полиномов. Пусть задано семейство подстановок, моделирующих поведение системы с тремя состояния {0,1,2} и двумя входными сигналами х1, х2:

8

(0 1 1 0

2 ^ 2

8

(0 1

2 ^ 1

Подставим данные из первой перестановки в формулу (4) и получим

т-1 ( т-1 5 _

/1(5)=X П 5к -1

к=0 V 1=0,1 Фк

к - I

5к =

(5 - 1)(5 - 2) 1 + (5 - 0)(5 - 2) 0 + (5 - 0)(5 - 1) 2 = 5 2 - 35 + 2 +_

(0 -1)(0 - 2) (1 - 0)(1 - 2) (2 - 0)(2 -1) 2 2

Подставим данные из второй перестановки в формулу (4) и получим

^ - 1 2 = 352

5 +1.

2

2

= (х - 1)(х - 2) 1 + (х - 0)(х - 2) 2 + (х - 0)(х -1) 1 = 2 (0 -1)(0 - 2) (1 - 0)(1 - 2) (2 - 0)(2 -1)

х2 - 3х + 2 £2 - 2х ^ s2 - х 2 „ -+-2 +-1 =-£2 + 2х +1.

2 -1 2

Таким образом, поведение заданной системы моделируется с помощью семейства полиномов:

3 5

/(£) = 3 £2 - - £ +1, ¿(£) = -£2 + 2х +1.

Моделирование дискретной системы с помощью полиномов позволяет применять хорошо развитый алгебраический аппарат при исследовании поведения системы, в том числе и при исследовании функциональной избыточности системы.

Задача анализа функционально избыточной дискретной системы

Под функциональной избыточностью понимают наличие таких модулей системы (универсальных), которые могут реализовать поведение других модулей (но не дублируют их). Функциональная избыточность обеспечивается за счет некоторого временного ресурса, который необходим для подачи на вход универсального модуля последовательности сигналов. Такую последовательность называют восстанавливающей последовательностью. Из данного определения следует, что функциональное избыточность - относительная характеристика. Очевидно, что не каждая система обладает необходимой функциональной избыточностью относительно заданного множества модулей. Более того, среди систем, обладающих функциональной избыточностью, не каждая обладает необходимым временным резервом для ее использования.

Дадим формальное определение функциональной избыточности дискретной системы. Пусть поведение системы А моделируется автоматом A=(X,S,8), Х={х1,х2,...,х„}, а поведение системы В -автоматом В = (X,Д, 8), Х={х1,х2,...,х„}. Без ограничения общности будем считать 8' (х) Ф 8ч (х),...,8'к (х) Ф 8х (х),8[+1 (х) = 8х+1 (х),...,8х' (х) = 8х (х). Система А является функционально избыточной относительно системы В (или иными словами модуль А является универсальным относительно модуля В), если (V., I = 1, К) (3?г- е X ) такое, что 8'х (х) = 81 (х) . Последовательность и

будем называть восстанавливающей последовательностью для преобразования 8'х (или для входного сигнала х/).

В качестве математической модели адаптивных дискретных систем будем использовать модель универсального автомата-перечислителя [11], который определяется следующим образом.

Пусть задано семейство автоматов {А/ = (Хг.,£,8г))}е/, |Д| = т. Автомат А = (Х,Д,8) называется универсальным для семейства автоматов {А }/е/, если

("х е X/.)("/ е Г)&х е (х) = 8(г)(s)), где х = (0,..., т -1),

т.е. для любого входного сигнала х любого автомата из семейства {А.} существует последовательность входных сигналов автомата А, индуцирующая преобразование, эквивалентное преобразованию, индуцируемому сигналом х автомата из семейства {А. }е/.

При исследовании функциональной избыточности любой дискретной системы можно выделить два типа задач: задачу синтеза (проектирование функциональной избыточности на этапе создания системы) и задачу анализа (выявление наличия функциональной избыточности в уже созданной системе). В данной работе рассматривается внимание задача анализа, которая на формальном уровне заключается в нахождении класса автоматов, для которых заданный является универсальным.

Если система смоделирована семейством полиномов вида (3), то для решения задачи анализа универсального автомата можно использовать метод, приведенный в [8], который схематично можно представить следующим образом.

Метод 1.

Вход: Автомат А = {X,Д,8} вида (1), заданный полиномами {/1,/2,...,/„}вида (3).

Выход: семейство А/ = {А. ={Xг.,Д,8. },| / = {1.А}}, где X., - множество входных символов автомата А., Д - множество состояний (одинаково для всех автоматов), 8. = , /}- )|| ] = {1../}} tj, -

восстанавливающие последовательности, fj - полиномы, соответствующие реакции автомата А на

введение i-й восстанавливающей последовательности.

1. Строим порождающее множество полиномов F, p=|F|.

2. Обозначим F* [ 1]=F.

3. Для i от 1 до p-1

Для каждого I в F* [i]

Для каждого J в F F*[i+1]= F*[i+1]u{IuJ}

4. Семейство автоматов AI ={};

Для i от 1 до p-1

X = ^ ^2,..., xi };

Для k от J в F* [i] строим автомат AmeK = {X, S, J};

AI = AI ^ Аек .

Комплекс программ для разработки и исследования адаптивности ПО

Чтобы использовать представленную выше полиномиальную модель и соответствующий метод анализа функциональной избыточности для программных систем, необходимо, чтобы эта программная система была спроектирована на основе принципов автоматного программирования. Основной принцип автоматного программирования - представление алгоритма программы в виде конечного автомата. Основным объектом автоматной программы является состояние — группа строк этой программы, в которой ожидается локальное событие. Локальным событием в автоматной программе можно считать положительный результат (не нулевое значение) вычисления некоторого логического выражения. Локальное событие обычно обозначают некоторым символом и отождествляют с буквой входного алфавита конечного автомата. В конкретном состоянии может ожидаться не одно, а несколько локальных событий, из которых наступает всегда только одно. На этапе проектирования требуется явно определить все состояния (обычно их нумеруют и/или обозначают каким-либо образом) и применять для их различения только одну многозначную управляющую переменную. После определения всех состояний программы необходимо явно определить и все возможные переходы между состояниями.

В ходе исследований было разработан комплекс программ State Machine Generator [12], которое позволяет сгенерировать исходный код автоматной программы по заданному графу переходов, а также решить для него задачу синтеза и анализа адаптивной программной системы. Общая схема функционирования данного комплекса представлена на рис. 1.

Исследование адаптивности системы отслеживания программных ошибок

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

В качестве примера для исследования адаптивности программных систем рассмотрим систему отслеживания программных ошибок Bug Detector. В ней происходит отслеживание ошибок после ее обнаружения тестировщиком некого программного продукта. Данная система может применяться в отделах тестирования для контроля процесса исправления ошибок. Система Bug Detector была разработана на основе принципов автоматного программирования. В качестве состояний автомата, являющегося ее моделью, были использованы типовые состояния ошибки ПП со следующей нумерацией и обозначениями:

1. Submitted (ошибка на рассмотрении тестировщиком ПП):

2. Assigned (ошибка на исправлении разработчиком тестируемого ПП);

3. Fixed (ошибка исправлена разработчиком тестируемого ПП);

4. Verified (ошибка исправление ошибки подтверждено тестировщиком);

5. Reopened (ошибка не исправлена);

6. Closed (ошибка в ПП устранена);

7. Deferred (ошибка отложена);

8. To Be Declined (возможно, информация об ошибке ложная, требуется дополнительное тестирование);

9. Declined (информация об ошибке ложная).

Заметим, что фактически в разрабатываемой системе Bug Detector будет 10 состояний, и под состоянием с номером 0 и обозначением Error понимается состояние ошибки самой программной си-

стемы. В него происходит переход из любого состояния системы, если в нем произошло любое непредусмотренные заранее логическое событие.

В графическом редакторе комплекса программ State Machine Generator был построен автомат, моделирующий процесс обработки ошибки. Для этого в графическом редакторе были добавлены состояния ошибки в виде узлов графа и операции, выполняемые над ошибкой, в виде дуг графа (рис. 2). С целью обеспечения наглядности состояние с номером 0 не представлено на этом графе.

С помощью комплекса State Machine Generator на основе графического изображения автомата был также сгенерирован исходный код программной системы.

Исследуем систему Bug Detector на наличие в ней функциональной избыточности. Для этого решим задачу анализа для автомата, представленного на рис. 2, т.е. построим класс автоматов, для которых он является универсальным. Функции переходов рассматриваемого автомата могут быть

представлены полиномами fi (s),i = x1v..,x9 , где s - состояния автомата, а каждому входному сигналу

системы соответствует свой полином. Степень и коэффициенты этих полиномов вычисляются по следующей схеме:

1. Для каждого входного сигнала формируется подстановка вида (2). Например, для входного сигнала x2 эта подстановка выглядит следующим образом:

* ( ) = (0 12345678 9/ V0 2 0 0 0 0 0 0 0 0/

2. Элементы каждой подстановки последовательно подставляются в формулу (4) и затем вычисляются значения коэффициентов в полиноме вида (3) за счет приведения подобных при каждом члене полинома.

Приведем полиномы, моделирующие переходы из состояния в состояние системы Bug Detector:

/Xl(s) = 0,00045s9 - 0,0184s8 + 0,312s7 - 2,873s6 + 5,59s5 - 50,374s4 + 93,25s3 - 88,234s2 + 31,35s;

/X2(s) = -0,00005s9 + 0,0022s8 - 0,041s7 + 0,428s6 - 2,71s5 + 10,65s4 - 25,24s3 + 32,92s 2

- 18s;

/X3(s) = 0,0003s9 - 0,0134s8 + 0,23s7 - 2,346s6 + 14,14s5 - 51,88s4 + 111,627s3 - 125,76s2 + 54s;

/x#(s) = -0,0022s9 + 0,089s8 - 1,49s7 + 13,62s6 - 73,383s5 + 236,38s4 - 438,25s3 + 419,91s2

- 156,87s;

/x5(s) = -0,0022s9 + 0,089s8 - 1,49s7 + 13,62s6 - 73,383s5 + 236,38s4 - 438,25s3 + 419,91s2

- 156,87s;

/x6(s) = 0,0033s9 - 0,13s8 + 2,23s7 - 20,35s6 + 109,4s5 - 351,23s4 + 647,37s3 - 612,3s2 + 219s;

/Xy(s) = 0,0023s9 - 0,092s8 + 1,57s7 - 14,61s6 + 79,88s5 - 259,86s4 + 182,04s3 - 453,43s 2 + 157,5s;

/x8(s) = 0,002s9 - 0,084s8 + 1,48s7 - 14,26s6 + 80,93s5 - 274,27s4 + 534,72s3 - 539,38s 2 + 210,86s;

/x9(s) = 0,0021s9 - 0,08s8 + 1,327s7 - 11,734s6 + 61,4s5 - 192,73s4 + 351,28s3 - 335,45s 2 + 126s.

На основе полученных таким образом полиномов, используя метод 1, найдем решение задачи анализа автомата. В данном примере этим решением является класс автоматов А, содержащий 386 автоматов, для которых автомат, изображенный на рис. 2, является универсальным. Таким образом, найдено семейство систем, моделируемых автоматами класса А, для которых рассматриваемая система Bug Detector является функционально избыточной.

Приведем пример использования данной функциональной избыточности: пусть в системе Bug Detector появится входной сигнал нового типа исправить ошибку и пометить как проверенную, переводящий автомат на рис. 2 из состояния Assign в состояние Closed. Этому входному сигналу соответствует следующий полином:

/'(s) = -0,00012s9 + 0,0055s8 - 0,102s7 + 1,07s6 - 6,78s5 + 26,62s4 - 63,12s3 + 82,303s2 - 45s;

Заметим, что при решении задачи анализа было выявлено, что полином f'(s) можно заменить эквивалентным ему преобразованием, а именно fx (fx (s)) (которое соответствует подаче вос-

станавливающей последовательности сигналов c номерами Х2 и x3 на вход системы Bug Detector).

Таким образом, можно адаптировать систему Bug Detector к новым внешним условиям, не изменяя ее, а лишь настроив подачу восстанавливающих последовательностей.

Рис. 1. Блок-схема функционирования комплекса программ State Machine Generator

Рис. 2. Граф переходов автомата, моделирующего типовой процесс обработки программной ошибки

Таким образом, в данной статье показано, каким образом можно применять полиномиальную модель дискретных систем, методы теории универсальных автоматов и комплекс программ State Machine Generator при исследовании адаптивности программных систем.

ЛИТЕРАТУРА

1. Рассел С., Норвиг П. Искусственный интеллект: современный подход (AIMA) = Artificial Intelligence: A Modern Approach (AIMA). 2-е изд. М.: Вильямс, 2007. 1424 c.

2. Гурьянов В.И. Самосборка программного обеспечения как паттерн проектирования // Программные продукты и системы. 2008. № 1. С. 62-64.

3. Черняк Л. Адаптируемость и адаптивность // Открытые системы. 2004. Вып. 9. http://www.osp.ru/os/2004/09/184560/ (дата обращения 04.08.2015)

4. Критерии выбора и принципы организации информационной системы для автоматизации деятельности производственных предприятий / В.Н. Брыль, А.Г. Прядко, Г.Г. Ягудаев, Л.И. Бернер // Вестник Московского автомобильно-дорожного государственного технического университета (МАДИ). 2008. № 4. С. 88-92.

5. Липаев В.В. Программно-технологическая безопасность информационных систем. М.: МИФИ, 1997. 144 с.

6. Сытник А.А., Шульга Т.Э. Об алгоритмической неразрешимости задач математического моделирования функционально избыточных дискретных систем // Вестник СГТУ. 2011. № 2 (60). Т. 4. С. 213-219.

7. Фатьянова М.Д. Задание автоматов с помощью семейства полиномов с рациональными коэффициентами // Наука и общество. Сер. Информационные технологии. 2011. С. 113-116.

8. Сластихина М.Д. Числовые модели адаптивных систем специального класса // Вестник Воронежского государственного университета. 2015. № 3.

9. Поликарпова Н., Шалыто А. Автоматное программирование. М., 2009. 176 с.

10. Шульга Т.Э. Автоматное проектирование адаптивных программ // Наука и общество. 2011. № 1. С. 46-51.

11. Медведев Ю.Т. О классе событий, допускающих представление в конченом автомате // Автоматы: пер. с англ. М., 1956. С. 385-401.

12. Сытник А.А. Перечислимость при восстановлении поведения автоматов // Доклады Академии наук. 1993. Т. 238. С. 25.

13. Шульга Т.Э., Сластихина М.Д., Иванов Е.А. Свидетельство о государственной регистрации программ для ЭВМ № 2014619043 State Machine Generator от 8 сентября 2014 г. Правообладатель Федерального государственного бюджетное образовательное учреждение высшего профессионального образования Саратовский государственный технический университет имени Гагарина Ю.А.

Сластихина Мария Дмитриевна -

аспирант, ассистент кафедры «Прикладная информатика и программная инженерия» Саратовского государственного технического университета имени Гагарина Ю.А.

Шульга Татьяна Эриковна -

доктор физико-математических наук, доцент, заведующий кафедрой «Прикладная информатика и программная инженерия» Саратовского государственного технического университета имени Гагарина Ю.А.

Mariya D. Slastikhina -

Postgraduate, Assistant

Department Applied Informatics and Software

Engineering

Yuri Gagarin State Technical University of Saratov

Tatyana E. Shulga -

Dr. Sc., Associate Professor

Head Department: Applied Informatics and Software Engineering

Yuri Gagarin State Technical University of Saratov

Статья поступила в редакцию 12.05.15, принята к опубликованию 15.09.15

i Надоели баннеры? Вы всегда можете отключить рекламу.