Инструменты пользователя

Инструменты сайта


Боковая панель

odg_assist_5.0:администрирование_odg

Функциональные характеристики ПО “OdgAssist”

Общая информация

Программное обеспечение OdgAssist (EQMS) предназначено для автоматизации и управления документацией в области качества. Под документацией понимаются:

  • бумажные документы – заполняемые формы, бумажные журналы;
  • электронные текстовые документы – инструкции, процедуры и т.д;
  • электронные документы с функцией контроля – отклонения, изменения, CAPA и т.д.

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

Минимальный системные требования для программного комплекса odgAssist

Требования к аппаратному обеспечению сервера:

Параметры сервера/количество пользователей50-100100 -200250-350500
Количество потоков 4 8 12 16
Тактовая частота процессора ( ГГц) От 2,2 От 2,1 От 2,4 От 2,6
Платформа 64x разрядная 64x разрядная 64x разрядная 64x разрядная
Оперативная память (ГБ) 12 16 24 32
Дисковое пространство 250Гб 500Гб 1Тб 1Тб

Рекомендовано использование RAID для обеспечения резервирования и повышения производительности базы данных.

Требования к программному обеспечению сервера:

  • Операционная система: Linux Ubuntu 18.04 | 20.04 | 22.04 | 24.04
  • Сервер базы данных: Postgresql 10 +
  • Виртуальная машина: Open JDK 8 +
  • WEB сервер: Nginx 1.14.0 +
  • Менеджер управления процессами: SuperVisor
  • Интерпретатор языка Python: Python 2.7.15+

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

  • Процессор: 2ГГц
  • Оперативная память 4ГБ
  • Жесткий диск (SATA): 50Гб
  • Операционная система: Windows 8/10
  • Браузер: Google Chrome 87.0.4280.141 +
  • Microsoft Office: Word, Excell 2010 +

+ допустима версия ПО выше указанной

Для обслуживания сервера сотрудниками исполнителя к нему необходим прямой доступ по ssh. Сервер должен иметь доступ в интернет.

Установка odgassist 5.0

Установить приложение можно вручную или автоматически.

Ручная установка приложения:

Для работы приложения odgassist необходимы следующие программы:
-Postgres 12
-Nginx
-Supervisor
-Open jdk 8

Команды для установки требуемого программного обеспечения:
Обновить и установить пакеты программного обеспечения:

sudo apt-get update &&  sudo apt-get -y upgrade;

Установить openjdk:

sudo apt-get -y install openjdk-8-jdk;

Скачать и установить Postgres :

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -;
RELEASE=$(lsb_release -cs) echo "deb http://apt.postgresql.org/pub/repos/apt/ ${RELEASE}"-pgdg main | sudo tee /etc/apt/sources.list.d/pgdg.list;
sudo apt -y install postgresql-12;

Добавить базу данных для odgassist:

sudo -u postgres psql -U postgres -d postgres -c "CREATE DATABASE \"odgassist\" WITH OWNER \"postgres\" ENCODING 'UTF8' LC_COLLATE = 'ru_RU.UTF-8' LC_CTYPE = 'ru_RU.UTF-8' TEMPLATE template0;";
sudo -u postgres psql -U postgres -d postgres -c "ALTER USER postgres PASSWORD '0000'";

Установить nginx:

 apt-get -y install nginx; 

Установить supervisor:

sudo apt-get -y install supervisor;

Добавьте пользователя runner:

sudo useradd -m -p $(openssl rand -base64 12) runner 

Добавьте необходимые директории для работы приложения odgassist:

sudo mkdir /srv/templates && chmod 777 /srv/templates;
sudo mkdir /srv/assist && chmod 777 /srv/assist;
sudo mkdir /srv/assist/export && chmod 777 /srv/assist/export;
sudo mkdir /srv/assist/html && chmod 777 /srv/assist/html;
sudo mkdir /home/dumps && chmod 777 /home/dumps;
sudo mkdir /etc/ssl/cuba && mkdir /etc/ssl/odg;
sudo mkdir /home/runner/cuba && chown runner:runner /home/runner/cuba;

Скачайте необходимые файлы для работы приложения odgassist:

wget https://wiki.odgassist.ru/lib/exe/fetch.php/odg_assist_5.0:app.jar
;
mv odg_assist_5.0:app.jar /home/runner/cuba/app.jar && chown runner:runner /home/runner/cuba/app.jar && chmod +x /home/runner/cuba/app.jar;
wget wget https://wiki.odgassist.ru/lib/exe/fetch.php/odg_assist_5.0:nofileonserver.docx && mv odg_assist_5.0:nofileonserver.docx /srv/assist/nofileonserver.docx && chown runner:runner /srv/assist/nofileonserver.docx ;
chown runner:runner /srv/assist/nofileonserver.docx;

Добавьте в конфигурацию supervisor файл /etc/supervisor/conf.d/cubaodg.conf:

[program:cuba]
command=java -Xms1G -Xmx3G -jar app.jar -port 9090
directory=/home/runner/cuba
stdout_logfile=/var/log/supervisor/cuba.log
stderr_logfile=/var/log/supervisor/cuba.log
autostart=true
user=runner

Обновите конфигурацию supervisor:

sudo supervisorctl reread && sudo supervisorctl update;
sudo supervisorctl status;

Статус приложения cuba должно быть RUNNING

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

Установка в автоматическом режиме.


Будут установлены следующие пакеты:
-Postgres 12 -Nginx -Supervisor -Open jdk 8

Скачайте файл автоматической установки через терминал сервера:

 wget https://wiki.odgassist.ru/lib/exe/fetch.php/odg_assist_5.0:install.sh.gz 


или по ссылке: install.sh.gz

Разархивируйте документ и запустите его в терминале сервера Ubuntu:

gunzip odg_assist_5.0\:install.sh.gz;
chmod +x odg_assist_5.0\:install.sh;
sudo ./odg_assist_5.0\:install.sh;

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

Настройка приложения

После выполнения скрипта перейдите по ссылке:

http://ip_адрес_сервера:9090/app 

Отобразится форма авторизации:

Войдите в систему. Логин admin, пароль: admin.

Для работы приложения требуется добавить лицензионный ключ.
Нажмите пункт меню "Администрирование", подпункт "Свойства приложения".
В фильтре поиска вставьте имя ru.licen.

Щелкните дважды по записи и введите ключ в открывшуюся форму:

KEN9fFDUMzufuFgpI2EzCCyHkjdwT93wMC1LXu7MYRAX5JeyZL6J08fNXVtLdM+pqefODyp5tO7wYo40oI7Ovp9cZ8IAOSbXquJl0QNV5XphS0F1IaFNV/8NFBpK9xOAW/Aye04okELab+cqZXP7Gkrc3wiCQ7NnlOtx6tIDiYU=

Добавить ключ, кол-во конкурентных пользователей:

B8yA7lLZQCcmg9dhqChbKM6LDlzzEuZQ/yVhARRXtyIRJG6WAWULfOCFjbzKRi5Vf4Fm1qR/46+shOw1F8UPJ8cGbwlj/dA6AHzD1+9yHnWlMIuUgBj+7MYuMZcNegCK4tdvto7WC54yiwnPhGlP574Le9joq10mSZifo/kbOII=

После добавления ключа необходимо перезапустить приложение через терминал сервера:
sudo supervisorctl restart cuba

Ознакомится с интерфейсом приложения можно перейдя по ссылке: Описание приложения.

Ссылка на скачивание приложения и необходимых файлов:

odg5

empty file

cubaodg1.zip

install.sh.gz

Все свойства приложения список пополняется периодически: Список

Добавление пользователя


Добавление пользователей осуществляется через пункт меню "Администрирование", подпункт "Пользователи".

В реестре пользователей нажмите "Добавить". В редакторе учетных данных заполните поля.

"Логин" — поле содержит имя пользователя для аутентификации
"Новый пароль" — поле ввода пароля
"Подтверждение пароля" — поле подтверждения пароля
"Полное имя" — поле автоматически заполнится, если заполнены части полного имени: Имя, Отчество, Фамилия
"email" - поле для ввода адреса электронной почты
"Часовой пояс" - в соответствии с которым будут отображаться и вводиться значения типа timestamp "Группа" — группа доступа, по умолчанию Company
"Должность"
"Язык" — язык интерфейса, устанавливаемый для пользователя
"Маска разрешенных IP"- маска разрешенных IP-адресов, с которых возможен вход в систему.
Маска представляет собой список адресов через запятую. Поддерживаются как адреса формата IPv4, так и адреса формата IPv6. В первом случае адрес должен состоять из четырех чисел, разделенных точками, при этом любая часть вместо числа может содержать знак "*", что означает "любое число".
Адрес в формате IPv6 представляет собой восемь групп по четыре шестнадцатеричные цифры, разделенных двоеточием. Любая группа также может быть заменена знаком "*".
Маска может содержать адреса только одного формата. Наличие адресов формата IPv4 и IPv6 одновременно недопустимо. Пример: 192.168.*.*
"Активен" - если данный флаг не установлен, то пользователь не может войти в систему. Пользователь не отображается в списке пользователей для выбора исполнителя задачи.
"Отправлять уведомления" - если флаг установлен, то отправка сообщений пользователю производится.

"Подразделение" - подразделение пользователя.
"Должности" - список дополнительных должностей

"Роли" - Список ролей пользователя

"Замещаемые пользователи" — список замещаемых пользователей.

Замещение пользователей


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

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

Окно настройки "Замещение пользователей".

"Пользователь" - текущий редактируемый пользователь. Он будет замещать другого пользователя.

"Замещаемый пользователь" - замещаемый пользователь.

"Дата начала", "Дата завершения" - необязательный период замещения. Вне периода замещение будет недоступным. Если период не указан, замещение доступно, пока не удалена данная запись таблицы.

Назначенные задания


Пункт меню "Администрирование", подпункт "Назначенные задания".
Подпункт меню позволяет настраивать автоматическое выполнение рутинных задач.
Например, обработка документов, рассылка оповещений пользователям и т.д.

Отправка оповещений о новых задачах.


Описание:
После активации каждой задачи на нее назначается исполнитель. Исполнитель добавляется в список для рассылки оповещений о новых задачах. Рассылка осуществляется всем пользователям из списка каждые 60 секунд.

Настройка:

Нажмите пункт меню "Администрирование", подпункт "Назначенные задания". Заполните поля формы:
Defined By: Bean
Bean Name: cuba_Emailer
Method Nmae: processQueuedEmails()
Sheduling Type: Period
Cron Expression: 60
Singleton: V

Пример содержимого письма:

Отправка оповещений назначенным по задачам


Описание:
Если у пользователя нет просроченных задач, то ему отправляется весь список задач каждый понедельник.
Если есть просроченные задачи или задачи близкие к крайнему сроку, то оповещения отправляются каждое утро в 9:00.

Настройка:
Нажмите пункт меню "Администрирование", подпункт "Назначенные задания". Заполните поля формы:
Defined By: Bean
Bean Name: odgassist5_TasksReportService
Method Nmae: sendTaskStatesToAllUsers
Sheduling Type: Cron
Cron Expression: 0 0 9 * * *

Пример содержимого письма:

 отображение письма оповещения

Отправка оповещений по действиям

Описание:
В список на отправку попадают отчеты:

  • крайний срок выполнения сегодня
  • крайний срок выполнения наступит через ru.od.notify_before_days
  • просроченные действия

ru.od.notify_before_days - параметр, который хранит количество дней. (Уведомить за n дней).
Настройка производится через пункт меню "Администрирование", подпункт "Свойства приложения".
В поле "Поиск по имени свойства" ввести: ru.od.notify_before_days

Настройка:
Нажмите пункт меню "Администрирование", подпункт "Назначенные задания". Заполните поля формы:
Bean Name: odgassist5_TaskReportService
Method Nmae: notifyUserAboutOverdueActions

Описание полей формы настройки "Назначенное задание":

  • Defined by - каким программным объектом реализуется задание. Возможные значения:
    • Bean - задание реализуется методом бина Spring. Дополнительные атрибуты:
    • Bean name - имя бина. Бин отображается в списке и доступен для выбора, только если он объявлен в модуле core и у него есть интерфейс, содержащий подходящие для вызова из задания методы. Бины без интерфейса не поддерживаются.
  • Method name - метод интерфейса бина для выполнения. Метод должен либо не иметь параметров, либо иметь все параметры типа String. Тип результата должен быть либо void, либо String. В последнем случае результат выполнения будет сохранен в таблице выполнений (см. Log finish ниже).
  • Method parameters - параметры выбранного метода. Поддерживаются только параметры типа String.
  • Class - задание представляет собой класс, реализующий интерфейс java.util.concurrent.Callable. Класс должен иметь открытый конструктор без параметров. Дополнительные атрибуты:
    • Class name - имя класса
  • Script - задание представляет собой скрипт Groovy. Скрипт выполняется через Scripting.runGroovyScript(). Дополнительные атрибуты:
    • Script name - имя скрипта.
  • User name - имя пользователя, от имени которого будет выполняться задание. Если не задано, то задание будет выполнено от имени пользователя, указанного в свойстве приложения cuba.jmxUserLogin.
  • Singleton - признак, является ли задание синглтоном, т.е. выполняющимся только на одном сервере системы.
  • Scheduling type - способ планирования задачи:
  • Cron - с помощью Cron-выражения, представляющего собой последовательность из шести полей, разделенных пробелами:
    • секунда, минута, час, день, месяц, день недели. Месяц и день недели могут быть представлены первыми тремя буквами английского названия. Примеры выражений:
0 0 * * * * - начало каждого часа каждого дня.
*/10 * * * * * - каждые 10 секунд.
0 0 8-10 * * * - в 8, 9 и 10 часов каждого дня.
0 0/30 8-10 * * * - 8:00, 8:30, 9:00, 9:30 и 10 часов каждого дня.
0 0 9-17 * * MON-FRI - каждый час с 9 до 17 по рабочим дням.
0 0 0 7 1 ? - каждое Рождество в полночь.
  • Period - с помощью интервала между выполнениями.
  • Fixed Delay - задача будет запускаться с указанной в Period задержкой после окончания предыдущего выполнения.
  • Period - период или задержка запуска задания в секундах если Scheduling type установлен в Period или Fixed Delay.
  • Start date - дата/время первого запуска для Scheduling type = Period. Если не установлено, то задание запускается сразу при старте сервера. Если установлено, то задание запускается в момент startDate + period * N, где N - целое число.

Start date имеет смысл указывать только для "нечастых" заданий - раз в 1 час, 1 сутки и т.п.

  • Timeout - время в секундах, по истечении которого считается, что задание закончило выполнение, независимо от того, есть ли информация о завершении задания, или нет. Если timeout не задан явно, он принимается равным 3 часам.

Для Singleton-задач в кластерном деплойменте рекомендуется всегда устанавливать таймаут в реалистичное значение. Если останавливается узел кластера, выполняющий задачу, то при стандартном значении другие узлы кластера будут ждать 3 часа перед тем, как запустить задачу снова.

  • Time frame - в случае заданного Start date или Cron expression определяет временное окно в секундах, в течение которого будет запущено задание, если время startDate + period * N прошло. Если Time frame не задано явно, оно принимается равным period / 2.

Если Start date не указано, то Time frame не принимается во внимание, т.е. задание будет запущено в любое время после прохождения промежутка времени Period после предыдущего выполнения задания.

  • Start delay - задержка выполнения в секундах после запуска сервера и активации выполнения задач. Используйте данный параметр для тяжелых задач, если вы считаете что они тормозят запуск сервера.
  • Permitted servers - список перечисленных через запятую идентификаторов серверов, на которых возможен запуск данного задания. Если список не задан, то задание может выполняться на любом сервере.

Для синглтон-заданий порядок перечисления серверов указывает их приоритет - первый имеет больший приоритет чем последний. Сервер с большим приоритетом перехватит выполнение синглтона следующим образом: если сервер с большим приоритетом обнаруживает, что предыдущий раз задание было выполнено сервером с меньшим приоритетом, то он запускает задание независимо от того, пройден ли Period или нет. Приоритет серверов работает только в случае Scheduling type равного Period и не указанного атрибута Start date. В противном случае, старт происходит в одно и то же время, и перехват невозможен.

  • Log start - признак регистрации факта запуска задания в таблице SYS_SCHEDULED_EXECUTION, соответствующей сущности ScheduledExecution.

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

  • Log finish - признак регистрации факта завершения задания в таблице SYS_SCHEDULED_EXECUTION, соответствующей сущности ScheduledExecution.

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

  • Description - произвольное текстовое описание задания.

Задание также имеет признак активности, который устанавливается в экране списка заданий. Неактивные задания не запускаются.

End article

Проверка сроков актуальности документов


Рутина по проверке сроков актуальности версий документов.
Выполняется по крону каждый день в 1:30. (время можно изменить).

Действия рутины:
Формируется список всех версий документов у которых дата "Актуален до" закончилась вчерашним днем.
Изменяется статус этих версий на "Архив", сами версии перемещается в архив.
Затем в каждом документе ищется версия документа у которой дата актуальности "сегодня" и если такая есть, то ставит ее как "Текущая версия" документа.
Если у документа срок начала актуальности уже прошел, то рутина его не обработает и потребуется вручную изменить статус такого документа на "Согласован". А предыдущую версию отправить в "Архив".

Если у документа не было текущей версии. Рутина установит "Текущей версией" первую версию документа.

Настройка:

Нажмите пункт меню «Администрирование», подпункт «Назначенные задания». На вкладке «Назначенные задания» найдите запись «odgassist5_DocumentService». Выберите ее и нажмите «Изменить».

Сверьте и отредактируйте при необходимости заполненные параметры согласно изображению выше. Если запись отсутствует, то нажмите кнопку «Добавить» и заполните форму как на изображении выше. После сохранения проверьте, что задание активировано. Если отметка не установлена, то выделите запись и нажмите «Активировать».

Просмотр пользовательских сессий


Нажмите пункт меню "Администрирование", подпункт "Журнал пользовательских сессий". В поле динамических фильтров нажмите "Добавить условие поиска".

После добавления фильтра выберите тип:

Реестр отобразит все сессии. Далее для отображения только активных добавьте фильтр "Завершена"

Также измените тип фильтра "Установлен" и выберите "Нет".

Создание системного пользователя


Логин системного пользователя указывается в local.app.properties Ключ cuba.jmxUserLogin. По умолчанию значение admin

Порядок действий

  1. В запущенном приложении перейти в меню Администрирование - Консоль JMX
  2. В поле Поиск по ObjectName ввести demo и нажать просмотреть MBean
  3. Найти метод createSystemUser()
  4. Нажать запустить
  5. Перейти в Администрирование - Пользователи
  6. Убедиться, что был создан пользователь system
  7. Сбросить пользователю пароль на 00000, чтобы создалась запись WebDavCridentials
  8. Теперь необходимо изменить свойство cuba.jmxUserLogin в файле который находится на сервере. Установит значение system.
  9. Перезапустить приложение.
  10. Чтобы проверить достаточно, например, зарегистрировать тему обучения, и после ее утверждения в журнале изменения сущности убедится, что при изменение объектов на стороне сервера, пользователь указан system
  11. cuba.jmxUserLogin = system

Проверка времени приложения


Создайте тестовую группу, проверьте в свойствах время ее создания.
Если оно отлично от требуемого, но время на сервере настроено верно, то добавьте ключ временной зона в файл конфигурации supervisor.confd/файл_настройки.
Пример:

 
command=java -Xms3G -Xmx3G -jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -XX:+ExitOnOutOfMemoryError -Duser.timezone=Europe/Moscow app.jar -port 9090

Блокировки карточек


Блокировка в UI проверялась только в "Задача на разработку документа" и "Расследование".
Также нужно помнить, что блокировка не снимается автоматически, если пользователь, например, закрыл браузер с открытым редактором записи.
В таком случае она снимется только по окончании таймаута сессии, т.к.
Необходимо правильно завершать работу, нажать "Сохранить без завершения задачи процесса" или "Завершить", только после закрывать браузер.

Настройка блокировки на запись Ссылка на документацию cuba:https://doc.cuba-platform.com/manual-latest-ru/pessimistic_locking.html

Рассмотрим блокировку на примере разработки документов.

Перейти в меню "Администрирование" - "Блокировки"
Чтобы добавить блокировку нужно перейти во вкладку "Настройка"

Нажать кнопку "Создать"

Заполнить поля

  1. Тип блокировки - Сущности
  2. Наименование - Задача на разработку документа (odgassist5_DocumentDevelopmentTask) - поле поддерживает поиск
  3. Таймаут. сек - время которое сущность будет недоступна для редактирование через UI.

Пример заполнения:

Нажать кнопку "ОК".
Для применения изменений нужно нажать "Перезагрузить конфигурацию"

После сообщения о перезагрузки конфигурации необходимо проверить сработала ли настройка. Для этого необходимо открыть задачу на разработку документа 2мя пользователями одновременно.

Делегирование


Версия приложения 2024.02 и выше.
Делегирования записи с одного пользователя на другого в трех реестрах:

  1. Темы
  2. Программы обучения
  3. Разработка документов

Доступность функционала определяется свойством ru.od.enable_reassignation.

Как работает:

  1. Выбираем запись в реестре
  2. Нажимаем на кнопку
  3. Отобразится редактор переназначение
  4. Формируется список из пользователей которые есть в карточке
  5. Заполняем поле С пользователя
  6. Заполняем поле На пользователя
  7. Заполняем поле Причина
  8. Пример заполнения
  9. Нажимаем кнопку Переназначить

Система выполнит поиск всех полей с типами Пользователь
Если значение поля равно "С пользователя", то поменяет "На пользователя"

Список пользователей
Если элемент списка равен "С пользователя", то уберет его из списка, и если нет в списке "На пользователя", то добавит его в список.
Система выполнит поиск всех переменных процесса и проведет аналогичные операции, что описаны выше.
Система переназначит активные задачи С пользователя На пользователя, если такие имеются.

Документ пользователя


Меню: Документы-Документы пользователей
Содержит в себе ссылку на пользователя и документ, а также 2 признака: создавать ознакомление, создать уведомление.

Теперь при любом сохранении версии документа со статусом Согласован:
Будет выполнена попытка создать ознакомление по распределению, указанному в версии документа. Если для пользователя нет записи в *, то она будет создана, ознакомление будет создана, уведомление будет отправлено.
Если для пользователя есть запись в *, то Ознакомление будет создано, если установлен соответствующий признак.
Если ознакомление создано, то Уведомление будет создано, если установлен соответствующий признак.
Будет выполнен поиск в * для соответствующего документа

  1. Среди найденных записей будут найдены те, пользователям которых ознакомление не отправилось на предыдущем этапе и для которых установлен признак создания ознакомлений.
  2. При создании ознакомления, будет выполнена проверка признака на отправку уведомления.

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

Редактирование переменных процесса


Для чего может понадобиться этот функционал
При заполнении карточки события пользователь мог допустить ошибку и указать неправильно ответственного исполнителя.
Это заметили на этапе, где корректировка карточки уже невозможна.

Решение
1. Выберите запись в реестре и нажмите кнопку "Где задача?".

2. Перейдите на вкладку "Статус".

3. На вкладке статус в закладке Variables выберите переменную для корректировки. В примере это исполнитель задач начальника ООК.
Выберите запись и нажмите "Изменить"

4. Откроется окно редактирования значений. Нажмите на иконку "Многоточие". Выберите нового пользователя и реестре пользователей. Старого пользователя удалите.

odg_assist_5.0/администрирование_odg.txt · Последнее изменение: 2024/09/04 11:00 — denis