diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..4cd6402
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,15 @@
+name: Build and Publish
+
+on:
+ push:
+ branches:
+ - master
+ - develop
+ workflow_dispatch:
+
+jobs:
+ build:
+ uses: mikopbx/.github-workflows/.github/workflows/extension-publish.yml@master
+ with:
+ initial_version: "1.113"
+ secrets: inherit
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e43b0f9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.DS_Store
diff --git a/App/Controllers/ModuleSmartIVRController.php b/App/Controllers/ModuleSmartIVRController.php
index c86472c..78976a1 100644
--- a/App/Controllers/ModuleSmartIVRController.php
+++ b/App/Controllers/ModuleSmartIVRController.php
@@ -69,6 +69,11 @@ public function indexAction(): void
];
$this->view->moduleCTI2Installed = PbxExtensionModules::count($parameters)>0;
+ $parameters = [
+ 'conditions'=>'uniqid="ModuleCTIClientV5" and disabled!="1"'
+ ];
+ $this->view->moduleCTI5Installed = PbxExtensionModules::count($parameters)>0;
+
$options = [
'extensions' => $forwardingExtensions
];
diff --git a/App/Forms/ModuleSmartIVRForm.php b/App/Forms/ModuleSmartIVRForm.php
index e4ab257..3088650 100644
--- a/App/Forms/ModuleSmartIVRForm.php
+++ b/App/Forms/ModuleSmartIVRForm.php
@@ -1,11 +1,22 @@
.
+ */
namespace Modules\ModuleSmartIVR\App\Forms;
use Phalcon\Forms\Element\Check;
@@ -15,10 +26,8 @@
use Phalcon\Forms\Element\Text;
use Phalcon\Forms\Form;
-
class ModuleSmartIVRForm extends Form
{
-
public function initialize($entity = null, $options = null)
{
$this->add(new Text('server1chost'));
@@ -28,29 +37,29 @@ public function initialize($entity = null, $options = null)
$this->add(new Text('database'));
$this->add(
new Numeric(
- 'number_of_repeat', [
+ 'number_of_repeat',
+ [
'maxlength' => 2,
'style' => 'width: 80px;',
'defaultValue' => 1,
- ]
+ ]
)
);
// UseSSL
- $checkAr = ['value' => null];
- if ($entity->useSSL) {
- $checkAr = ['checked' => 'checked', 'value' => null];
- }
- $this->add(new Check('useSSL', $checkAr));
+ $this->addCheckBox('useSSL', intval($entity->useSSL) === 1);
// Library
$arrLibraryType = [
'1.0' => $this->translation->_('module_smivr_LibraryVer1'),
'2.0' => $this->translation->_('module_smivr_LibraryVer2'),
+ '5.0' => $this->translation->_('module_smivr_LibraryVer5'),
];
$library = new Select(
- 'library_1c', $arrLibraryType, [
+ 'library_1c',
+ $arrLibraryType,
+ [
'using' => [
'id',
'name',
@@ -58,45 +67,61 @@ public function initialize($entity = null, $options = null)
'useEmpty' => false,
'value' => $entity->library_1c,
'class' => 'ui selection dropdown library-type-select',
- ]
+ ]
);
$this->add($library);
// FailOver Extension
$extension = new Select(
- 'failover_extension', $options['extensions'], [
+ 'failover_extension',
+ $options['extensions'],
+ [
'using' => [
'id',
'name',
],
'useEmpty' => false,
'class' => 'ui selection dropdown search forwarding-select',
- ]
+ ]
);
$this->add($extension);
// Timeout Extension
$extension = new Select(
- 'timeout_extension', $options['extensions'], [
+ 'timeout_extension',
+ $options['extensions'],
+ [
'using' => [
'id',
'name',
],
'useEmpty' => false,
'class' => 'ui selection dropdown search forwarding-select',
- ]
+ ]
);
$this->add($extension);
- // debug_mode
- $checkAr = ['value' => null];
- if ($entity->debug_mode) {
- $checkAr = ['checked' => 'checked', 'value' => null];
- }
- $this->add(new Check('debug_mode', $checkAr));
+ $this->addCheckBox('debug_mode', intval($entity->debug_mode) === 1);
$this->add(new Numeric('last_responsible_time'));
$this->add(new Numeric('last_responsible_duration'));
+ }
+ /**
+ * Adds a checkbox to the form field with the given name.
+ * Can be deleted if the module depends on MikoPBX later than 2024.3.0
+ *
+ * @param string $fieldName The name of the form field.
+ * @param bool $checked Indicates whether the checkbox is checked by default.
+ * @param string $checkedValue The value assigned to the checkbox when it is checked.
+ * @return void
+ */
+ public function addCheckBox(string $fieldName, bool $checked, string $checkedValue = 'on'): void
+ {
+ $checkAr = ['value' => null];
+ if ($checked) {
+ $checkAr = ['checked' => $checkedValue,'value' => $checkedValue];
+ }
+ $this->add(new Check($fieldName, $checkAr));
}
-}
\ No newline at end of file
+}
diff --git a/App/Views/index.volt b/App/Views/index.volt
index d9093d9..5034c64 100644
--- a/App/Views/index.volt
+++ b/App/Views/index.volt
@@ -12,6 +12,11 @@
{{ form.render('library_1c') }}
+ {% if moduleCTI5Installed %}
+
{{ t._("module_smivr_WeGetSettingsFromCTIClientV5") }}
+ {% else %}
+ {{ t._("module_smivr_LibraryVer5NotInstalled") }}
+ {% endif %}
{% if moduleCTI2Installed %}
{{ t._("module_smivr_WeGetSettingsFromCTIClient") }}
{% else %}
diff --git a/Lib/AGICallLogic.php b/Lib/AGICallLogic.php
index 0f9140c..dd63598 100644
--- a/Lib/AGICallLogic.php
+++ b/Lib/AGICallLogic.php
@@ -32,6 +32,8 @@ class AGICallLogic extends PbxExtensionBase
private string $contextInternal = 'internal';
private string $number;
private array $messages = [];
+ private int $maxMessagesCount = 100; // Maximum number of messages to store
+ private int $maxMessageLength = 1024; // Maximum length of each message
private WebService1C $web_service_1C;
private $count_of_repeat_ivr;
private $timeout_extension;
@@ -271,12 +273,17 @@ private function text2speech($arr_text_to_speech): ?string
'logger' => $this->logger,
];
- switch ($ttsSettings->tts_service) {
- case 'Yandex':
+ switch (strtoupper($ttsSettings->tts_service)) {
+ case 'YANDEX':
{
$tts = new YandexTTS($settings);
break;
}
+ case 'MIKO':
+ {
+ $tts = new MikoTTS($settings);
+ break;
+ }
case 'CRT':
{
$tts = new SpeechProTTS($settings);
@@ -306,9 +313,20 @@ private function text2speech($arr_text_to_speech): ?string
*/
public function Verbose($value): void
{
+ // Truncate value if it's a string and too long
+ if (is_string($value) && strlen($value) > $this->maxMessageLength) {
+ $value = substr($value, 0, $this->maxMessageLength) . '... [truncated]';
+ }
+
+ // Add to messages array, keeping only the most recent ones
$this->messages[] = $value;
+ if (count($this->messages) > $this->maxMessagesCount) {
+ array_shift($this->messages);
+ }
+
if ($this->agi !== null) {
- $this->agi->verbose('SMART IVR VERBOSE: ' . escapeshellarg($value), 3);
+ $truncated_value = is_string($value) ? $value : json_encode($value);
+ $this->agi->verbose('SMART IVR VERBOSE: ' . escapeshellarg($truncated_value), 3);
}
}
@@ -397,42 +415,44 @@ private function getIVRPhrase($phraseId, $extension = null): string
}
case 'ConnectionToExtension':
{
- $parameters = [
- 'models' => [
- 'Extensions' => Extensions::class,
- ],
- 'columns' => [
- 'username' => 'Users.username',
- ],
- 'conditions' => 'Extensions.number = :extension: AND Extensions.is_general_user_number=1',
- 'bind' => [
- 'extension' => $extension,
- ],
- 'joins' => [
- 'Users' => [
- 0 => Users::class,
- 1 => 'Users.id=Extensions.userid',
- 2 => 'Users',
- 3 => 'INNER',
+ $userName = $this->web_service_1C->getUserInfoV5($extension);
+ if($userName === null){
+ $parameters = [
+ 'models' => [
+ 'Extensions' => Extensions::class,
],
- ],
- 'limit' => 1,
- ];
- $query = $this->di->get('modelsManager')->createBuilder($parameters)->getQuery();
- $extensions = $query->execute();
- $extensionRecord = null;
- foreach ($extensions as $record) {
- $extensionRecord = $record;
- break;
- }
- $abonentName = '';
- if ($extensionRecord) {
- $abonentName = $extensionRecord->username;
+ 'columns' => [
+ 'username' => 'Users.username',
+ ],
+ 'conditions' => 'Extensions.number = :extension: AND Extensions.is_general_user_number=1',
+ 'bind' => [
+ 'extension' => $extension,
+ ],
+ 'joins' => [
+ 'Users' => [
+ 0 => Users::class,
+ 1 => 'Users.id=Extensions.userid',
+ 2 => 'Users',
+ 3 => 'INNER',
+ ],
+ ],
+ 'limit' => 1,
+ ];
+ $query = $this->di->get('modelsManager')->createBuilder($parameters)->getQuery();
+ $extensions = $query->execute();
+ $extensionRecord = null;
+ foreach ($extensions as $record) {
+ $extensionRecord = $record;
+ break;
+ }
+ if ($extensionRecord) {
+ $userName = $extensionRecord->username;
+ }
}
- if (empty($abonentName)) {
+ if (empty($userName)) {
$resultText = 'Соединяю с номером ' . $extension;
} else {
- $resultText = 'Соединяю с сотрудником ' . $abonentName;
+ $resultText = 'Соединяю с сотрудником ' . $userName;
}
break;
}
diff --git a/Lib/MikoPBXVersion.php b/Lib/MikoPBXVersion.php
new file mode 100644
index 0000000..1d067c7
--- /dev/null
+++ b/Lib/MikoPBXVersion.php
@@ -0,0 +1,102 @@
+.
+ */
+namespace Modules\ModuleSmartIVR\Lib;
+
+use MikoPBX\Common\Models\PbxSettings;
+
+class MikoPBXVersion
+{
+ /**
+ * Return true if current version of PBX based on Phalcon 5+
+ * @return bool
+ */
+ public static function isPhalcon5Version(): bool
+ {
+ $pbxVersion = PbxSettings::getValueByKey('PBXVersion');
+ return version_compare($pbxVersion, '2024.2.30', '>');
+ }
+
+ /**
+ * Return Di interface for the current version of PBX
+ * @return \Phalcon\Di\DiInterface|null
+ */
+ public static function getDefaultDi()
+ {
+ if (self::isPhalcon5Version()) {
+ return \Phalcon\Di\Di::getDefault();
+ } else {
+ return \Phalcon\Di::getDefault();
+ }
+ }
+
+ /**
+ * Return Validation class for the current version of PBX
+ * @return class-string<\Phalcon\Filter\Validation>|class-string<\Phalcon\Validation>
+ */
+ public static function getValidationClass(): string
+ {
+ if (self::isPhalcon5Version()) {
+ return \Phalcon\Filter\Validation::class;
+ } else {
+ return \Phalcon\Validation::class;
+ }
+ }
+
+ /**
+ * Return Uniqueness class for the current version of PBX
+ * @return class-string<\Phalcon\Filter\Validation\Validator\Uniqueness>|class-string<\Phalcon\Validation\Validator\Uniqueness>
+ */
+ public static function getUniquenessClass(): string
+ {
+ if (self::isPhalcon5Version()) {
+ return \Phalcon\Filter\Validation\Validator\Uniqueness::class;
+ } else {
+ return \Phalcon\Validation\Validator\Uniqueness::class;
+ }
+ }
+
+ /**
+ * Return Text class for the current version of PBX
+ *
+ * @return class-string<\MikoPBX\Common\Library\Text>|class-string<\Phalcon\Text>
+ */
+ public static function getTextClass(): string
+ {
+ if (self::isPhalcon5Version()) {
+ return \MikoPBX\Common\Library\Text::class;
+ } else {
+ return \Phalcon\Text::class;
+ }
+ }
+
+ /**
+ * Return Logger class for the current version of PBX
+ *
+ * @return class-string<\Phalcon\Logger\Logger>|class-string<\Phalcon\Logger>
+ */
+ public static function getLoggerClass(): string
+ {
+ if (self::isPhalcon5Version()) {
+ return \Phalcon\Logger\Logger::class;
+ } else {
+ return \Phalcon\Logger::class;
+ }
+ }
+}
diff --git a/Lib/MikoTTS.php b/Lib/MikoTTS.php
new file mode 100644
index 0000000..5e92078
--- /dev/null
+++ b/Lib/MikoTTS.php
@@ -0,0 +1,257 @@
+voices = [
+ 'oksana',
+ 'jane',
+ 'omazh',
+ 'zahar',
+ 'ermil',
+ 'alena',
+ 'filipp',
+ 'marina',
+ ];
+
+ $this->messages = [];
+
+ $this->ttsDir = $settings['ttsDir'];
+ $this->logger = $settings['logger'];
+ }
+
+ /**
+ * Генерация звукового файла
+ *
+ * @param $text - текст для генерации
+ * @param $voice - Голос
+ *
+ * @return string|null - путь к файлу генерации без расширения
+ */
+ public function Synthesize($text, $voice): ?string
+ {
+ if ( ! in_array($voice, $this->voices, true)) {
+ $this->logger->writeInfo("Voice $voice doesn't exist. We will use default jane.");
+ $voice = 'jane';
+ }
+
+ $this->logger->writeInfo('Start synthesis by MIKO TTS');
+ $this->logger->writeInfo($text);
+
+ if (is_array($text) && count($text) > 1) {
+ $result = $this->makeSpeechFromTextArray($text, $voice);
+ } elseif (is_array($text)) {
+ $text = implode($text);
+ $text = urldecode($text);
+ $result = $this->makeSpeechFromText($text, $voice);
+ } else {
+ $result = $this->makeSpeechFromText($text, $voice);
+ }
+ if ( ! empty($result)) {
+ $this->logger->writeInfo("Synthesis result file: $result");
+ } else {
+ $this->logger->writeError('Synthesis failure');
+ $this->messages[] = 'Synthesis by MIKO TTS failure';
+ }
+
+ return $result;
+ }
+
+ /**
+ * Генерирует единый файл записи из массива текстовых фраз.
+ *
+ * @param $arr_text_to_speech - array of phrases
+ * @param $voice
+ *
+ * @return null|string
+ */
+ private function makeSpeechFromTextArray($arr_text_to_speech, $voice): ?string
+ {
+ $this->messages[] = 'We got array of sentences';
+ $trim = 0;
+ $ivr_extension = '.wav';
+ $ivr_filename = md5(implode($arr_text_to_speech) . $voice);
+ $exception = false;
+
+ // Проверим нет ли ранее сгенерированного полного файла записи.
+ $fullFileName = $this->ttsDir . $ivr_filename . $ivr_extension;
+ if (file_exists($fullFileName) && filesize($fullFileName) > 0) {
+ $this->logger->writeInfo(
+ 'TTS found in the cache for: ' . urldecode(
+ implode(
+ ' ',
+ $arr_text_to_speech
+ )
+ ) . ' file: ' . $fullFileName
+ );
+
+ return $this->ttsDir . $ivr_filename;
+ }
+
+ $i = 0; // Порядковый номер фразы в массиве.
+ $extension = 'raw';
+ $soxarg = '-r 8000 -e signed-integer -b 16 -c 1 -t'; // Настройки для работы с raw файлами
+
+ $resultExecArg = ''; // Строка с параметрами SOX для склеивания файла
+ $filesList = [];
+ foreach ($arr_text_to_speech as $text_to_speech) { // Обойдем все фразы в массиве текстов
+ $record_file = $this->makeSpeechFromText($text_to_speech, $voice);
+ if ($record_file === null) { // Ошибка генерации. используем запись по умолчанию
+ $exception = true;
+ break;
+ }
+ if (file_exists("{$record_file}.wav")) {
+ // Для нового варианта API будет этот формат.
+ $extension = 'wav';
+ }
+
+ if ($trim > 0) {
+ $command = "sox {$soxarg} {$extension} {$record_file}.{$extension} /tmp/" . basename(
+ $record_file
+ ) . ".{$extension}";
+ // Нужно тримировать записи
+ if ($i > 0) {
+ $command .= " trim {$trim}";
+ }
+ exec("$command 2>&1");
+ $resultExecArg .= " {$soxarg} {$extension} /tmp/" . basename($record_file) . ".{$extension}";
+ $filesList[] = '/tmp/' . basename($record_file) . ".{$extension}";
+ $filesList[] = "{$record_file}.wav";
+ } else {
+ $resultExecArg .= " $soxarg {$extension} {$record_file}.{$extension}";
+ }
+ $i++;
+ }
+
+ $result_file = null;
+ if ( ! $exception) {
+ $fullFileName = $this->ttsDir . $ivr_filename . $ivr_extension;
+ exec('sox ' . $resultExecArg . ' ' . $fullFileName . ' 2>&1');
+ if (file_exists($fullFileName) && filesize($fullFileName) > 0) {
+ $result_file = $this->ttsDir . $ivr_filename;
+ }
+ }
+ if (count($filesList) > 0) {
+ $command = implode(' ', $filesList);
+ exec("rm -rf $command 2>&1");
+ }
+
+ return $result_file;
+ }
+
+ /**
+ * Генерирует и скачивает в на внешний диск файл с речью.
+ *
+ * @param $text_to_speech - генерируемый текст
+ * @param $voice - голос
+ *
+ * @return null|string
+ *
+ */
+
+ private function makeSpeechFromText($text_to_speech, $voice): ?string
+ {
+ $speech_extension = '.mp3';
+ $result_extension = '.wav';
+ $speech_filename = md5($text_to_speech . $voice);
+ $fullFileName = $this->ttsDir . $speech_filename . $result_extension;
+ $fullFileNameFromService = $this->ttsDir . $speech_filename . $speech_extension;
+
+ // Проверим вдург мы ранее уже генерировали такой файл.
+ if (file_exists($fullFileName) && filesize($fullFileName) > 0) {
+ $this->logger->writeInfo(
+ 'TTS found in the cache for: ' . urldecode($text_to_speech . $voice) . ' file: ' . $fullFileName
+ );
+
+ return $this->ttsDir . $speech_filename;
+ }
+
+ // Файла нет в кеше, будем генерировать новый.
+ $post_vars = [
+ 'lang' => 'ru-RU',
+ 'format' => 'mp3',
+ 'voice' => $voice,
+ 'text' => urldecode($text_to_speech),
+ ];
+
+ $fp = fopen($fullFileNameFromService, 'w');
+ $curl = curl_init();
+
+ $headers = [
+ "Authorization: Key ".PbxSettings::getValueByKey('PBXLicense'),
+ "Content-Type: application/json",
+ "X-Request-ID: ".time(),
+ ];
+ curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
+ curl_setopt($curl, CURLOPT_FILE, $fp);
+ curl_setopt($curl, CURLOPT_TIMEOUT, 10);
+ curl_setopt($curl, CURLOPT_POST, true);
+ curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($post_vars));
+ curl_setopt($curl, CURLOPT_URL, 'https://speech.mikolab.ru/v1/tts/synthesize');
+ curl_exec($curl);
+ $http_code = (int)curl_getinfo($curl, CURLINFO_HTTP_CODE);
+ curl_close($curl);
+ fclose($fp);
+
+ if (200 === $http_code && file_exists($fullFileNameFromService) && filesize($fullFileNameFromService) > 0) {
+ $this->logger->writeInfo(
+ 'Successful generation into: ' . $fullFileNameFromService
+ . ' file size: ' . filesize($fullFileNameFromService)
+ );
+ $soxPath = Util::which('sox');
+ shell_exec("$soxPath -v 0.99 -G '$fullFileNameFromService' -c 1 -r 8000 -b 16 '$fullFileName'");
+
+ if (file_exists($fullFileName)) {
+ // Удалим raw файл.
+ @unlink($fullFileNameFromService);
+
+ // Файл успешно сгененрирован
+ return $this->ttsDir . $speech_filename;
+ }
+ } else {
+ if (file_exists($fullFileNameFromService)) {
+ @unlink($fullFileNameFromService);
+ }
+ }
+ $errorDescription = "TTSConnectionError: when we are trying to get sound from
+ MIKO we got http-code: $http_code" . PHP_EOL ;
+ $this->messages[] = $errorDescription;
+ $this->logger->writeError($errorDescription);
+
+ return null;
+ }
+
+ /**
+ * Return error or verbose messages
+ *
+ * @return mixed
+ */
+ public function getMessages(): array
+ {
+ return $this->messages;
+ }
+}
\ No newline at end of file
diff --git a/Lib/SmartIVRConf.php b/Lib/SmartIVRConf.php
index 2a4993b..8c173d0 100644
--- a/Lib/SmartIVRConf.php
+++ b/Lib/SmartIVRConf.php
@@ -10,7 +10,6 @@
use MikoPBX\Common\Models\Extensions;
use MikoPBX\Common\Models\ModelsBase;
-use MikoPBX\Core\System\Util;
use MikoPBX\Modules\Config\ConfigClass;
use MikoPBX\Core\System\PBX;
use MikoPBX\PBXCoreREST\Lib\PBXApiResult;
diff --git a/Lib/WebService1C.php b/Lib/WebService1C.php
index c4dce08..3e13288 100644
--- a/Lib/WebService1C.php
+++ b/Lib/WebService1C.php
@@ -147,7 +147,7 @@ private function post1cSoapRequest($number, $wslink, $wsfunction, $wsuri, $relog
$errorDescription = 'ConnectionToCRMError: No access to 1C:Enterprise.' . PHP_EOL .
"We use the next params: server:{$this->server_1c_host}," .
"port:{$this->server_1c_port}, login: {$this->login}, " .
- "password: {$this->secret}, method: ${wsfunction}," . PHP_EOL .
+ "password: {$this->secret}, method: $wsfunction," . PHP_EOL .
" url: $url" . PHP_EOL . 'We try POST xml: ' . $xmlDocument;
$this->messages[] = $errorDescription;
$this->logger->writeError($errorDescription);
@@ -156,7 +156,7 @@ private function post1cSoapRequest($number, $wslink, $wsfunction, $wsuri, $relog
return $this->post1cSoapRequest($number, $wslink, $wsfunction, $wsuri, true);
} elseif (in_array($http_code, [401, 403], false)) {
$errorDescription = "ConnectionToCRMError: HTTP code $http_code check username or password 1C:Enterprise.
- Method: ${wsfunction}.";
+ Method: $wsfunction.";
$this->messages[] = $errorDescription;
$this->logger->writeError($errorDescription);
$have_error = true;
@@ -184,6 +184,132 @@ private function post1cSoapRequest($number, $wslink, $wsfunction, $wsuri, $relog
return $result;
}
+ /**
+ * Получение настроек IVR для версии 2.0 / 4.0.
+ * @param string $number
+ * @param int $timeout
+ * @return array|null
+ */
+ private function getIvrDataV2(string $number, int $timeout):?array
+ {
+ $arr_textToSpeech = null;
+ $url = "http://127.0.0.1:8224/getivrtext?number={$number}";
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, $url);
+ curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ $input_json = curl_exec($ch);
+ $input_obj = json_decode($input_json, false);
+ curl_close($ch);
+ if ($input_json !== null
+ && json_last_error() === JSON_ERROR_NONE
+ && property_exists($input_obj,'result')
+ && $input_obj->result==='Success'){
+ $this->tts_settings = $input_obj->data;
+ $this->tts_settings->auth = $this->fillTTSAuthSettings();
+ $arr_textToSpeech = $input_obj->data->texttospeech;
+ } elseif($input_json !== null
+ && json_last_error() === JSON_ERROR_NONE
+ && property_exists($input_obj,'result')
+ && property_exists($input_obj,'cause')
+ && $input_obj->result==='Error') {
+ $errorDescription = 'CRM returns error: '.$input_obj->cause . PHP_EOL .
+ 'Call will be redirected to failover extension';
+ $this->messages[] = $errorDescription;
+ $this->logger->writeError($errorDescription);
+ } else {
+ $errorDescription = 'ConnectionToCRMError: Error parse data from 1C:Enterprise.' . PHP_EOL .
+ 'Call will be redirected to failover extension';
+ $this->messages[] = $errorDescription;
+ $this->logger->writeError($errorDescription);
+ }
+ return $arr_textToSpeech;
+ }
+
+ /**
+ * Получение настроек IVR для версии 5.0.
+ * @param string $number
+ * @param int $timeout
+ * @return array|null
+ */
+ private function getIvrDataV5(string $number, int $timeout):?array
+ {
+ $arr_textToSpeech = null;
+ $url = "http://127.0.0.1:9222/ivr/text?number=$number";
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, $url);
+ curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ $input_json = curl_exec($ch);
+ $input_obj = json_decode($input_json, false);
+ curl_close($ch);
+ if ($input_json !== null
+ && json_last_error() === JSON_ERROR_NONE
+ && property_exists($input_obj,'code')
+ && $input_obj->code===200){
+ $this->tts_settings = $input_obj->result;
+ $this->tts_settings->auth = $this->fillTTSAuthSettings();
+ $arr_textToSpeech = $input_obj->result->texttospeech;
+ } elseif($input_json !== null
+ && json_last_error() === JSON_ERROR_NONE
+ && property_exists($input_obj,'code')
+ && property_exists($input_obj,'ok')
+ && ($input_obj->ok!==true || $input_obj->code!==200) ) {
+ $errorDescription = 'CRM v5.0 returns error: '.$input_obj->code . PHP_EOL .
+ 'Call will be redirected to failover extension';
+ $this->messages[] = $errorDescription;
+ $this->logger->writeError($errorDescription);
+ } else {
+ $errorDescription = 'ConnectionToCRMError: Error parse data from 1C:Enterprise API 5.0.' . PHP_EOL .
+ 'Call will be redirected to failover extension';
+ $this->messages[] = $errorDescription;
+ $this->logger->writeError($errorDescription);
+ }
+ return $arr_textToSpeech;
+ }
+
+ /**
+ * Возвращает имя сотрудника в именительном падеже
+ * @param string $number
+ * @param int $timeout
+ * @return void
+ */
+ public function getUserInfoV5(string $number, int $timeout=2):?string
+ {
+ if ($this->library_1c !== '5.0') {
+ return null;
+ }
+ $userName = null;
+ $url = "http://127.0.0.1:9222/ivr/employee?number=$number";
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, $url);
+ curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ $input_json = curl_exec($ch);
+ $input_obj = json_decode($input_json, false);
+ curl_close($ch);
+
+ if ($input_json !== null
+ && json_last_error() === JSON_ERROR_NONE
+ && property_exists($input_obj,'code')
+ && $input_obj->code===200){
+ $userName = $input_obj->result->presence[0]??$input_obj->result->name;
+ } elseif($input_json !== null
+ && json_last_error() === JSON_ERROR_NONE
+ && property_exists($input_obj,'code')
+ && property_exists($input_obj,'ok')
+ && ($input_obj->ok!==true || $input_obj->code!==200) ) {
+ $errorDescription = 'CRM get username v5.0 returns error: '.$input_obj->code;
+ $this->messages[] = $errorDescription;
+ $this->logger->writeError($errorDescription);
+ } else {
+ $errorDescription = 'ConnectionToCRMError: Error parse data "get username" from 1C:Enterprise API 5.0.';
+ $this->messages[] = $errorDescription;
+ $this->logger->writeError($errorDescription);
+ }
+ return $userName;
+ }
+
/**
* Получаем из 1С IVR меню
*
@@ -197,35 +323,9 @@ public function getIvrMenuText(string $number, int $timeout=5): ?array
$arr_textToSpeech = null;
try {
if ($this->library_1c === '2.0') {
- $url = "http://127.0.0.1:8224/getivrtext?number={$number}";
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- $input_json = curl_exec($ch);
- $input_obj = json_decode($input_json, false);
- curl_close($ch);
- if ($input_json !== null
- && json_last_error() === JSON_ERROR_NONE
- && property_exists($input_obj,'result')
- && $input_obj->result==='Success'){
- $this->tts_settings = $input_obj->data;
- $this->tts_settings->auth = $this->fillTTSAuthSettings();
- $arr_textToSpeech = $input_obj->data->texttospeech;
- } elseif($input_json !== null
- && json_last_error() === JSON_ERROR_NONE
- && property_exists($input_obj,'result')
- && $input_obj->result==='Error') {
- $errorDescription = 'ConnectionToCRMError: '.$input_obj->data . PHP_EOL .
- 'Call will be redirected to failover extension';
- $this->messages[] = $errorDescription;
- $this->logger->writeError($errorDescription);
- } else {
- $errorDescription = 'ConnectionToCRMError: Error parse data from 1C:Enterprise.' . PHP_EOL .
- 'Call will be redirected to failover extension';
- $this->messages[] = $errorDescription;
- $this->logger->writeError($errorDescription);
- }
+ $arr_textToSpeech = $this->getIvrDataV2($number, $timeout);
+ } elseif ($this->library_1c === '5.0') {
+ $arr_textToSpeech = $this->getIvrDataV5($number, $timeout);
} else {
$endpoint = 'MIKO_IVRGenerator4SmartTransfer.1cws';
$ivrLink = "$this->database/ws/$endpoint";
@@ -255,10 +355,10 @@ public function getIvrMenuText(string $number, int $timeout=5): ?array
*/
private function fillTTSAuthSettings()
{
- $tts_service = $this->tts_settings->tts_service;
+ $tts_service = strtoupper($this->tts_settings->tts_service);
$result = [];
switch ($tts_service) {
- case 'Yandex':
+ case 'YANDEX':
{
if (property_exists($this->tts_settings, 'api_key')
&& isset($this->tts_settings->api_key)) {
@@ -266,6 +366,10 @@ private function fillTTSAuthSettings()
}
break;
}
+ case 'MIKO':{
+ $result = '';
+ break;
+ }
case 'CRT':
{
if (property_exists($this->tts_settings, 'auth')
diff --git a/Messages/az.php b/Messages/az.php
index fb942ae..36ad8d9 100644
--- a/Messages/az.php
+++ b/Messages/az.php
@@ -18,8 +18,8 @@
'module_smivr_TimeoutExtForeignKey' => 'Ağıllı marşrutlaşdırma modulunda standart nömrə kimi istifadə olunur',
'module_smivr_FailoverExtForeign' => 'Ağıllı marşrutlaşdırma modulunda təcili yardım nömrəsi kimi istifadə olunur',
'module_smivr_lastResponsibleDuration' => 'Saniyələrin sayı, son məsul şəxsə nə qədər zəng etmək lazımdır',
- 'module_smivr_LibraryVer2' => 'Versiya 2.0',
- 'module_smivr_LibraryVer2NotInstalled' => '1C üçün telefon paneli 2.0 modulunu quraşdırın, onu işə salın və konfiqurasiya edin',
+ 'module_smivr_LibraryVer2' => 'Versiya 2.0/4.0',
+ 'module_smivr_LibraryVer2NotInstalled' => '1C üçün telefon paneli 4.0 modulunu quraşdırın, onu işə salın və konfiqurasiya edin',
'module_smivr_Library1CType' => '1C tərəfində inteqrasiya altsisteminin versiyası',
'module_smivr_Server1CHostPort' => 'Server ünvanı və port 1C',
'module_smivr_UseSSLConnection' => 'SSL istifadə edin',
@@ -41,6 +41,6 @@
'module_smivr_UpdateStatus' => 'Status yeniləməsi',
'module_smivr_UpdateRecord' => 'Modul statusu dəyişdikdə yenilənən obyektlər:
',
'module_smivr_ErrorOnMakeTestIVR' => 'Səs menyusunun sınaq yaradılması zamanı xəta',
- 'module_smivr_WeGetSettingsFromCTIClient' => '“Telefoniya Paneli 2.0 1C üçün” modulundan rabitə kanalı istifadə olunacaq',
+ 'module_smivr_WeGetSettingsFromCTIClient' => '"Telefoniya Paneli 4.0 1C üçün" modulundan rabitə kanalı istifadə olunacaq',
'module_smivr_lastResponsibleTime' => 'Sahibi tapmaq üçün CDR-ni təhlil etmək üçün dəqiqələrin sayı',
];
diff --git a/Messages/cs.php b/Messages/cs.php
index a4e141a..6223896 100644
--- a/Messages/cs.php
+++ b/Messages/cs.php
@@ -1,6 +1,6 @@
'Bude použit komunikační kanál z modulu "Telephony Panel 2.0 for 1C".',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Bude použit komunikační kanál z modulu "Telephony Panel 4.0 for 1C".',
'module_smivr_FailoverExtForeign' => 'Používá se jako nouzové číslo v modulu chytrého směrování',
'module_smivr_TimeoutExtForeignKey' => 'Používá se jako výchozí číslo v modulu chytrého směrování',
'module_smivr_ErrorOnMakeTestIVR' => 'Chyba při generování testovacího hlasového menu',
@@ -28,9 +28,9 @@
'module_smivr_Library1CType' => 'Verze integračního subsystému na straně 1C',
'module_smivr_lastResponsibleDuration' => 'Počet sekund, jak dlouho volat poslední zodpovědné osobě',
'module_smivr_lastResponsibleTime' => 'Počet minut, po které by měla být CDR analyzována, aby se našla odpovědná osoba',
- 'module_smivr_LibraryVer2NotInstalled' => 'Nainstalujte modul telefonního panelu 2.0 pro 1C, povolte jej a nakonfigurujte',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Nainstalujte modul telefonního panelu 4.0 pro 1C, povolte jej a nakonfigurujte',
'module_smivr_EnableDebugMode' => 'Povolit režim ladění modulu',
- 'module_smivr_LibraryVer2' => 'Verze 2.0',
+ 'module_smivr_LibraryVer2' => 'Verze 2.0/4.0',
'module_smivr_LibraryVer1' => 'Verze 1.0',
'SubHeaderModuleSmartIVR' => 'Generování hlasového menu za chodu podle dat CRM systému',
'BreadcrumbModuleSmartIVR' => 'Modul pro inteligentní směrování hovorů (Smart IVR)',
diff --git a/Messages/da.php b/Messages/da.php
index 0608077..06d1fc3 100644
--- a/Messages/da.php
+++ b/Messages/da.php
@@ -1,6 +1,6 @@
'Kommunikationskanalen fra modulet "Telefonipanel 2.0 for 1C" vil blive brugt',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Kommunikationskanalen fra modulet "Telefonipanel 4.0 for 1C" vil blive brugt',
'module_smivr_FailoverExtForeign' => 'Anvendes som nødnummer i smart routing-modul',
'module_smivr_TimeoutExtForeignKey' => 'Bruges som standardnummer i smart routing-modul',
'module_smivr_ErrorOnMakeTestIVR' => 'Fejl under testgenerering af stemmemenuen',
@@ -28,7 +28,7 @@
'module_smivr_Library1CType' => 'Integrationsdelsystemversion på 1C-siden',
'module_smivr_lastResponsibleDuration' => 'Antal sekunder, hvor længe skal du ringe til den sidste ansvarlige',
'module_smivr_lastResponsibleTime' => 'Det antal minutter, som CDR\'en skal analyseres for for at finde den ansvarlige',
- 'module_smivr_LibraryVer2NotInstalled' => 'Installer telefonipanel 2.0-modulet til 1C, aktiver og konfigurer det',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Installer telefonipanel 4.0-modulet til 1C, aktiver og konfigurer det',
'module_smivr_EnableDebugMode' => 'Aktiver modulfejlfindingstilstand',
'module_smivr_LibraryVer1' => 'Version 1.0',
'SubHeaderModuleSmartIVR' => 'Generering af en stemmemenu på farten i henhold til CRM-systemdata',
@@ -42,5 +42,5 @@
*/
'mo_ModuleSmartIVR' => 'Smart routing modul',
'module_smivr_Disconnected1C' => 'Forbindelsesfejl med 1C',
- 'module_smivr_LibraryVer2' => 'Version 2.0',
+ 'module_smivr_LibraryVer2' => 'Version 2.0/4.0',
];
diff --git a/Messages/de.php b/Messages/de.php
index fb89635..828e53b 100644
--- a/Messages/de.php
+++ b/Messages/de.php
@@ -1,6 +1,6 @@
'Es wird der Kommunikationskanal aus dem Modul "Telephony Panel 2.0 for 1C" verwendet',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Es wird der Kommunikationskanal aus dem Modul „Telephony Panel 4.0 für 1C“ verwendet',
'module_smivr_FailoverExtForeign' => 'Wird als Notrufnummer im Smart Routing Modul verwendet',
'module_smivr_TimeoutExtForeignKey' => 'Wird als Standardnummer im Smart-Routing-Modul verwendet',
'module_smivr_ErrorOnMakeTestIVR' => 'Fehler bei der Testgenerierung des Sprachmenüs',
@@ -27,9 +27,9 @@
'module_smivr_Library1CType' => 'Version des Integrationssubsystems auf der 1C-Seite',
'module_smivr_lastResponsibleDuration' => 'Anzahl der Sekunden, wie lange die letzte verantwortliche Person angerufen werden soll',
'module_smivr_lastResponsibleTime' => 'Die Anzahl der Minuten, für die das CDR analysiert werden sollte, um den Verantwortlichen zu finden',
- 'module_smivr_LibraryVer2NotInstalled' => 'Installieren Sie das Telefonie-Panel 2.0-Modul für 1C, aktivieren und konfigurieren Sie es',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Installieren Sie das Telefonie-Panel 4.0-Modul für 1C, aktivieren und konfigurieren Sie es',
'module_smivr_EnableDebugMode' => 'Modul Debug-Modus aktivieren',
- 'module_smivr_LibraryVer2' => 'Version 2.0',
+ 'module_smivr_LibraryVer2' => 'Version 2.0/4.0',
'module_smivr_LibraryVer1' => 'Version 1.0',
'SubHeaderModuleSmartIVR' => 'Generierung eines Sprachmenüs on the fly gemäß CRM-Systemdaten',
'BreadcrumbModuleSmartIVR' => 'Smart Call Routing-Modul (Smart IVR)',
diff --git a/Messages/el.php b/Messages/el.php
index efa86ab..a714fe5 100644
--- a/Messages/el.php
+++ b/Messages/el.php
@@ -4,7 +4,7 @@
'module_smivr_lastResponsibleTime' => 'Ο αριθμός των λεπτών για την ανάλυση του CDR για να βρεθεί ο ιδιοκτήτης',
'module_smivr_FailoverExtForeign' => 'Χρησιμοποιείται ως αριθμός έκτακτης ανάγκης στη μονάδα έξυπνης δρομολόγησης',
'module_smivr_TimeoutExtForeignKey' => 'Χρησιμοποιείται ως προεπιλεγμένος αριθμός στην έξυπνη μονάδα δρομολόγησης',
- 'module_smivr_WeGetSettingsFromCTIClient' => 'Θα χρησιμοποιηθεί το κανάλι επικοινωνίας από τη μονάδα "Telephony Panel 2.0 for 1C"',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Θα χρησιμοποιηθεί το κανάλι επικοινωνίας από τη μονάδα "Telephony Panel 4.0 for 1C".',
'module_smivr_ErrorOnMakeTestIVR' => 'Σφάλμα κατά τη δοκιμαστική δημιουργία του φωνητικού μενού',
'module_smivr_UpdateRecord' => 'Τα αντικείμενα ενημερώθηκαν όταν άλλαξε η κατάσταση της μονάδας:
',
'module_smivr_UpdateStatus' => 'Ενημέρωση κατάστασης',
@@ -30,8 +30,8 @@
'module_smivr_UseSSLConnection' => 'Χρησιμοποιήστε SSL',
'module_smivr_Server1CHostPort' => 'Διεύθυνση διακομιστή και θύρα 1C',
'module_smivr_Library1CType' => 'Έκδοση του υποσυστήματος ενσωμάτωσης στην πλευρά 1C',
- 'module_smivr_LibraryVer2NotInstalled' => 'Εγκαταστήστε τη μονάδα τηλεφωνίας 2.0 για 1C, ενεργοποιήστε την και διαμορφώστε την',
- 'module_smivr_LibraryVer2' => 'Έκδοση 2.0',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Εγκαταστήστε τη μονάδα τηλεφωνίας 4.0 για 1C, ενεργοποιήστε την και διαμορφώστε την',
+ 'module_smivr_LibraryVer2' => 'Έκδοση 2.0/4.0',
'module_smivr_LibraryVer1' => 'Έκδοση 1.0',
'SubHeaderModuleSmartIVR' => 'Δημιουργία φωνητικών μενού on-the-fly σύμφωνα με τα δεδομένα του συστήματος CRM',
'BreadcrumbModuleSmartIVR' => 'Έξυπνη μονάδα δρομολόγησης κλήσεων (Smart IVR)',
diff --git a/Messages/en.php b/Messages/en.php
index 5eab59d..afb7c10 100644
--- a/Messages/en.php
+++ b/Messages/en.php
@@ -11,7 +11,7 @@
'BreadcrumbModuleSmartIVR' => 'The Smart IVR module',
'SubHeaderModuleSmartIVR' => 'Generate a personal IVR menu for each customer on the fly. This module use 1C:Enterprise as CRM.',
'module_smivr_LibraryVer1' => 'Version 1.0',
- 'module_smivr_LibraryVer2' => 'Version 2.0',
+ 'module_smivr_LibraryVer2' => 'Version 2.0/4.0',
'module_smivr_Library1CType' => '1C SmartIVR library',
'module_smivr_Server1CHostPort' => 'Server 1C:Enterprise host and port',
'module_smivr_UseSSLConnection' => 'Use SSL',
@@ -34,13 +34,13 @@
'module_smivr_Disconnected1C' => 'Error on connection to 1С',
'module_smivr_DisconnectedTTS' => 'Error on connection to TTS service',
'module_smivr_UpdateRecord' => 'On module state change we are changing records:',
- 'module_smivr_WeGetSettingsFromCTIClient' => 'The communication channel from the module "Telephony Panel 2.0 for 1C" will be used',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'The communication channel from the module "Telephony Panel 4.0 for 1C" will be used',
'module_smivr_FailoverExtForeign' => 'Used as emergency number in smart routing module',
'module_smivr_TimeoutExtForeignKey' => 'Used as default number in smart routing module',
'module_smivr_ErrorOnMakeTestIVR' => 'Error during test generation of the voice menu',
'module_smivr_ValidateTimeOutExtensionNotEqualTo' => 'Default number is incorrect',
'module_smivr_ValidateFailOverExtensionNotEqualTo' => 'Incorrect emergency number',
- 'module_smivr_LibraryVer2NotInstalled' => 'Install the telephony panel 2.0 module for 1C, enable and configure it',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Install the telephony panel 4.0 module for 1C, enable and configure it',
'module_smivr_lastResponsibleDuration' => 'Number of seconds, how long to call the last person in charge',
'module_smivr_lastResponsibleTime' => 'The number of minutes for which the CDR should be analyzed to find the responsible',
];
diff --git a/Messages/es.php b/Messages/es.php
index 2c4b14c..2fd0a9b 100644
--- a/Messages/es.php
+++ b/Messages/es.php
@@ -1,6 +1,6 @@
'Se utilizará el canal de comunicación del módulo "Telephony Panel 2.0 for 1C"',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Se utilizará el canal de comunicación del módulo "Panel de Telefonía 4.0 para 1C"',
'module_smivr_FailoverExtForeign' => 'Utilizado como número de emergencia en el módulo de enrutamiento inteligente',
'module_smivr_TimeoutExtForeignKey' => 'Utilizado como número predeterminado en el módulo de enrutamiento inteligente',
'module_smivr_ErrorOnMakeTestIVR' => 'Error durante la generación de prueba del menú de voz',
@@ -28,9 +28,9 @@
'module_smivr_Library1CType' => 'Versión del subsistema de integración en el lado 1C',
'module_smivr_lastResponsibleDuration' => 'Número de segundos, cuánto tiempo se debe llamar a la última persona a cargo.',
'module_smivr_lastResponsibleTime' => 'La cantidad de minutos por los que se debe analizar el CDR para encontrar al responsable',
- 'module_smivr_LibraryVer2NotInstalled' => 'Instale el módulo del panel de telefonía 2.0 para 1C, enciéndalo y configúrelo',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Instale el módulo del panel de telefonía 4.0 para 1C, habilítelo y configúrelo',
'module_smivr_EnableDebugMode' => 'Habilitar el modo de depuración del módulo',
- 'module_smivr_LibraryVer2' => 'Versión 2.0',
+ 'module_smivr_LibraryVer2' => 'Versión 2.0/4.0',
'module_smivr_LibraryVer1' => 'Versión 1.0',
'SubHeaderModuleSmartIVR' => 'Generación de un menú de voz sobre la marcha según los datos del sistema CRM',
'BreadcrumbModuleSmartIVR' => 'Módulo de enrutamiento de llamadas inteligente (Smart IVR)',
diff --git a/Messages/fa.php b/Messages/fa.php
new file mode 100644
index 0000000..b3d9bbc
--- /dev/null
+++ b/Messages/fa.php
@@ -0,0 +1 @@
+ '1C-palvelimen osoitetta ei ole täytetty',
+ 'module_smivr_ValidateServer1CPortRange' => '1C-palvelimen portti on määritetty väärin',
+ 'module_smivr_ValidatePubName' => '1C-verkkopalvelun julkaisunimeä ei ole määritetty',
+ 'module_smivr_ValidateNumberOfRepeat' => 'IVR-valikon toistojen määrä on väärä',
+ 'module_smivr_ValidateTimeoutExtension' => 'Oletusnumeroa ei ole määritetty',
+ 'module_smivr_ValidateFailOverExtension' => 'Hätänumeroa ei ole määritetty',
+ 'module_smivr_ValidateFailOverExtensionNotEqualTo' => 'Väärä hätänumero',
+ 'module_smivr_ValidateTimeOutExtensionNotEqualTo' => 'Oletusnumero on väärä',
+ 'module_smivr_Connected' => 'Yhdistetty 1C- ja TTS-palveluun',
+ 'module_smivr_Disconnected' => 'Ei käytössä',
+ 'module_smivr_Disconnected1C' => 'Yhteysvirhe 1C:n kanssa',
+ 'module_smivr_DisconnectedTTS' => 'Virhe yhteyden muodostamisessa TTS-palveluun',
+ 'module_smivr_UpdateStatus' => 'Tilan päivitys',
+ 'module_smivr_UpdateRecord' => 'Kun moduulin tila muuttui, objektit päivitettiin:
',
+ 'module_smivr_ErrorOnMakeTestIVR' => 'Virhe äänivalikon testiluonnissa',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Viestintäkanavaa moduulista "Telephony Panel 4.0 for 1C" käytetään',
+ 'module_smivr_TimeoutExtForeignKey' => 'Käytetään oletusnumerona älykkäässä reititysmoduulissa',
+ 'module_smivr_FailoverExtForeign' => 'Käytetään hätänumerona älykkäässä reititysmoduulissa',
+ 'module_smivr_lastResponsibleTime' => 'Minuuttimäärä, jonka CDR on analysoitava vastuullisen henkilön löytämiseksi',
+ 'module_smivr_lastResponsibleDuration' => 'Sekuntien määrä, kuinka kauan viimeiselle vastuuhenkilölle soitetaan',
+ /**
+ * Copyright © MIKO LLC - All Rights Reserved
+ * Unauthorized copying of this file, via any medium is strictly prohibited
+ * Proprietary and confidential
+ * Written by Alexey Portnov, 2 2019
+ */
+ 'mo_ModuleSmartIVR' => 'Älykäs reititysmoduuli',
+ 'repModuleSmartIVR' => 'Älykäs reititysmoduuli - %represent%',
+ 'BreadcrumbModuleSmartIVR' => 'Älykäs puhelunreititysmoduuli (Smart IVR)',
+ 'SubHeaderModuleSmartIVR' => 'Äänivalikon luominen lennossa CRM-järjestelmän tietojen mukaan',
+ 'module_smivr_LibraryVer1' => 'Versio 1.0',
+ 'module_smivr_LibraryVer2' => 'Versio 2.0/4.0',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Asenna puhelinpaneelin 4.0 moduuli 1C:lle, ota se käyttöön ja määritä se',
+ 'module_smivr_Library1CType' => 'Integrointialijärjestelmän versio 1C-puolella',
+ 'module_smivr_Server1CHostPort' => '1C-palvelimen osoite ja portti',
+ 'module_smivr_UseSSLConnection' => 'Käytä SSL:ää',
+ 'module_smivr_Login' => 'Kirjaudu verkkopalveluun 1C',
+ 'module_smivr_Password' => 'Salasana valtuutusta varten 1C:ssä',
+ 'module_smivr_PublicationName' => 'Julkaisun nimi',
+ 'module_smivr_NumberOfRepeat' => 'IVR-valikon toistojen määrä ennen puhelun siirtämistä oletusnumeroon',
+ 'module_smivr_TimeoutExtension' => 'Oletusnumero',
+ 'module_smivr_FailoverExtension' => 'Numero, johon soitamme 1C:n ja TTS:n tiedonsiirtohäiriöiden sattuessa. Esimerkiksi staattinen IVR-valikko.',
+ 'module_smivr_EnableDebugMode' => 'Ota moduulin virheenkorjaustila käyttöön',
+];
diff --git a/Messages/fr.php b/Messages/fr.php
index 9f5b9bc..c68270e 100644
--- a/Messages/fr.php
+++ b/Messages/fr.php
@@ -1,6 +1,6 @@
'Le canal de communication du module "Telephony Panel 2.0 for 1C" sera utilisé',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Le canal de communication du module "Telephony Panel 4.0 pour 1C" sera utilisé',
'module_smivr_FailoverExtForeign' => 'Utilisé comme numéro d\'urgence dans le module de routage intelligent',
'module_smivr_TimeoutExtForeignKey' => 'Utilisé comme numéro par défaut dans le module de routage intelligent',
'module_smivr_ErrorOnMakeTestIVR' => 'Erreur lors de la génération de test du menu vocal',
@@ -26,11 +26,11 @@
'module_smivr_UseSSLConnection' => 'Utiliser SSL',
'module_smivr_Server1CHostPort' => 'Adresse et port du serveur 1C',
'module_smivr_Library1CType' => 'Version du sous-système d\'intégration côté 1C',
- 'module_smivr_LibraryVer2NotInstalled' => 'Installez le module de panneau de téléphonie 2.0 pour 1C, activez-le et configurez-le',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Installez le module du panneau de téléphonie 4.0 pour 1C, activez-le et configurez-le',
'module_smivr_lastResponsibleDuration' => 'Nombre de secondes, combien de temps pour appeler le dernier responsable',
'module_smivr_lastResponsibleTime' => 'Le nombre de minutes pendant lesquelles le CDR doit être analysé pour trouver le responsable',
'module_smivr_EnableDebugMode' => 'Activer le mode de débogage du module',
- 'module_smivr_LibraryVer2' => 'Version 2.0',
+ 'module_smivr_LibraryVer2' => 'Version 2.0/4.0',
'module_smivr_LibraryVer1' => 'Version 1.0',
'SubHeaderModuleSmartIVR' => 'Génération d\'un menu vocal à la volée en fonction des données du système CRM',
'BreadcrumbModuleSmartIVR' => 'Module de routage d\'appels intelligent (Smart IVR)',
diff --git a/Messages/he.php b/Messages/he.php
new file mode 100644
index 0000000..b3d9bbc
--- /dev/null
+++ b/Messages/he.php
@@ -0,0 +1 @@
+ 'Povezan na uslugu 1C i TTS',
+ 'module_smivr_FailoverExtForeign' => 'Koristi se kao broj za hitne slučajeve u modulu pametnog usmjeravanja',
+ 'module_smivr_lastResponsibleTime' => 'Broj minuta za koje CDR treba analizirati da bi se pronašla odgovorna osoba',
+ 'module_smivr_lastResponsibleDuration' => 'Broj sekundi koliko dugo treba nazvati posljednju zaduženu osobu',
+ /**
+ * Copyright © MIKO LLC - All Rights Reserved
+ * Unauthorized copying of this file, via any medium is strictly prohibited
+ * Proprietary and confidential
+ * Written by Alexey Portnov, 2 2019
+ */
+ 'mo_ModuleSmartIVR' => 'Modul pametnog usmjeravanja',
+ 'repModuleSmartIVR' => 'Modul pametnog usmjeravanja - %represent%',
+ 'BreadcrumbModuleSmartIVR' => 'Modul za pametno usmjeravanje poziva (Smart IVR)',
+ 'SubHeaderModuleSmartIVR' => 'Generiranje glasovnog izbornika u hodu prema podacima CRM sustava',
+ 'module_smivr_LibraryVer1' => 'Verzija 1.0',
+ 'module_smivr_LibraryVer2' => 'Verzija 2.0/4.0',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Instalirajte modul telefonske ploče 4.0 za 1C, omogućite ga i konfigurirajte',
+ 'module_smivr_Library1CType' => 'Verzija integracijskog podsustava na strani 1C',
+ 'module_smivr_Server1CHostPort' => 'Adresa i port 1C poslužitelja',
+ 'module_smivr_UseSSLConnection' => 'Koristite SSL',
+ 'module_smivr_Login' => 'Prijava za web uslugu 1C',
+ 'module_smivr_Password' => 'Lozinka za autorizaciju u 1C',
+ 'module_smivr_PublicationName' => 'Naziv publikacije',
+ 'module_smivr_NumberOfRepeat' => 'Broj ponavljanja IVR izbornika prije prijenosa poziva na zadani broj',
+ 'module_smivr_TimeoutExtension' => 'Zadani broj',
+ 'module_smivr_FailoverExtension' => 'Broj na koji ćemo poslati poziv u slučaju kvara komunikacije s 1C i TTS. Na primjer, statični IVR izbornik.',
+ 'module_smivr_EnableDebugMode' => 'Omogući način otklanjanja pogrešaka modula',
+ 'module_smivr_ValidateServer1CHostEmpty' => 'Adresa poslužitelja 1C nije popunjena',
+ 'module_smivr_ValidateServer1CPortRange' => 'Port poslužitelja 1C je pogrešno naveden',
+ 'module_smivr_ValidatePubName' => 'Naziv publikacije web usluge 1C nije naveden',
+ 'module_smivr_ValidateNumberOfRepeat' => 'Broj ponavljanja IVR izbornika nije točan',
+ 'module_smivr_ValidateTimeoutExtension' => 'Zadani broj nije naveden',
+ 'module_smivr_ValidateFailOverExtension' => 'Broj hitne službe nije naveden',
+ 'module_smivr_ValidateFailOverExtensionNotEqualTo' => 'Netočan broj za hitne slučajeve',
+ 'module_smivr_ValidateTimeOutExtensionNotEqualTo' => 'Zadani broj nije točan',
+ 'module_smivr_Disconnected' => 'Onesposobljeno',
+ 'module_smivr_Disconnected1C' => 'Pogreška veze s 1C',
+ 'module_smivr_DisconnectedTTS' => 'Pogreška pri povezivanju s TTS uslugom',
+ 'module_smivr_UpdateStatus' => 'Ažuriranje statusa',
+ 'module_smivr_UpdateRecord' => 'Kada se status modula promijenio, objekti su ažurirani:
',
+ 'module_smivr_ErrorOnMakeTestIVR' => 'Pogreška tijekom testnog generiranja glasovnog izbornika',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Koristit će se komunikacijski kanal iz modula "Telephony Panel 4.0 for 1C".',
+ 'module_smivr_TimeoutExtForeignKey' => 'Koristi se kao zadani broj u modulu pametnog usmjeravanja',
+];
diff --git a/Messages/hu.php b/Messages/hu.php
new file mode 100644
index 0000000..16919c5
--- /dev/null
+++ b/Messages/hu.php
@@ -0,0 +1,46 @@
+ 'Intelligens hívásirányító modul (Smart IVR)',
+ 'module_smivr_LibraryVer1' => '1.0 verzió',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Telepítse a Telephony Panel 4.0 modult az 1C számára, engedélyezze és konfigurálja azt',
+ 'module_smivr_Library1CType' => 'Az integrációs alrendszer változata az 1C oldalon',
+ 'module_smivr_Password' => 'Jelszó az 1C-ben történő engedélyezéshez',
+ 'module_smivr_NumberOfRepeat' => 'Az IVR menü ismétléseinek száma a hívás alapértelmezett számra történő átirányítása előtt',
+ 'SubHeaderModuleSmartIVR' => 'On-the-fly hangmenü generálás a CRM rendszer adatai alapján',
+ 'module_smivr_LibraryVer2' => '2.0/4.0 verzió',
+ 'module_smivr_Server1CHostPort' => 'Az 1C szerver címe és portja',
+ 'module_smivr_UseSSLConnection' => 'SSL használata',
+ 'module_smivr_Login' => 'Bejelentkezés az 1C webes szolgáltatáshoz',
+ 'module_smivr_PublicationName' => 'A kiadvány neve',
+ /**
+ * Copyright © MIKO LLC - All Rights Reserved
+ * Unauthorized copying of this file, via any medium is strictly prohibited
+ * Proprietary and confidential
+ * Written by Alexey Portnov, 2 2019
+ */
+ 'mo_ModuleSmartIVR' => 'Intelligens útválasztó modul',
+ 'repModuleSmartIVR' => 'Intelligens útválasztási modul – %represent%',
+ 'module_smivr_TimeoutExtension' => 'Alapértelmezett szám',
+ 'module_smivr_FailoverExtension' => 'Az a szám, amelyre 1C és TTS kommunikációs hiba esetén hívunk. Például egy statikus IVR menü.',
+ 'module_smivr_EnableDebugMode' => 'Modul hibakeresési mód engedélyezése',
+ 'module_smivr_ValidateServer1CHostEmpty' => 'Az 1C szerver címe nincs kitöltve',
+ 'module_smivr_ValidateServer1CPortRange' => 'Az 1C szerverport helytelenül van megadva',
+ 'module_smivr_ValidatePubName' => 'Az 1C webszolgáltatás közzétételi neve nincs megadva',
+ 'module_smivr_ValidateNumberOfRepeat' => 'Az IVR menü ismétlődéseinek száma nem megfelelő',
+ 'module_smivr_ValidateTimeoutExtension' => 'Az alapértelmezett szám nincs megadva',
+ 'module_smivr_ValidateFailOverExtension' => 'A segélyhívó szám nincs megadva',
+ 'module_smivr_ValidateFailOverExtensionNotEqualTo' => 'Helytelen segélyhívó szám',
+ 'module_smivr_ValidateTimeOutExtensionNotEqualTo' => 'Az alapértelmezett szám helytelen',
+ 'module_smivr_Connected' => 'Csatlakozva az 1C és a TTS szolgáltatáshoz',
+ 'module_smivr_Disconnected' => 'Tiltva',
+ 'module_smivr_Disconnected1C' => 'Csatlakozási hiba az 1C-vel',
+ 'module_smivr_DisconnectedTTS' => 'Hiba a TTS-szolgáltatáshoz való csatlakozáskor',
+ 'module_smivr_UpdateStatus' => 'Állapotfrissítés',
+ 'module_smivr_UpdateRecord' => 'Amikor a modul állapota megváltozott, az objektumok frissültek:
',
+ 'module_smivr_ErrorOnMakeTestIVR' => 'Hiba a hangmenü tesztgenerálása közben',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'A „Telephony Panel 4.0 for 1C” modul kommunikációs csatornája kerül felhasználásra',
+ 'module_smivr_TimeoutExtForeignKey' => 'Alapértelmezett számként használatos az intelligens útválasztási modulban',
+ 'module_smivr_FailoverExtForeign' => 'Segélyhívószámként használják az intelligens útválasztási modulban',
+ 'module_smivr_lastResponsibleTime' => 'Azon percek száma, ameddig a CDR-t elemezni kell a felelős személy megtalálásához',
+ 'module_smivr_lastResponsibleDuration' => 'A másodpercek száma, ameddig mennyi ideig kell hívni az utolsó felelőst',
+];
diff --git a/Messages/it.php b/Messages/it.php
index 86957f1..6c2e817 100644
--- a/Messages/it.php
+++ b/Messages/it.php
@@ -1,6 +1,6 @@
'Verrà utilizzato il canale di comunicazione del modulo "Pannello di telefonia 2.0 per 1C"',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Verrà utilizzato il canale di comunicazione del modulo "Panel Telefonia 4.0 per 1C".',
'module_smivr_FailoverExtForeign' => 'Utilizzato come numero di emergenza nel modulo di routing intelligente',
'module_smivr_TimeoutExtForeignKey' => 'Utilizzato come numero predefinito nel modulo di routing intelligente',
'module_smivr_ErrorOnMakeTestIVR' => 'Errore durante la generazione del test del menu vocale',
@@ -28,9 +28,9 @@
'module_smivr_Library1CType' => 'Versione del sottosistema di integrazione sul lato 1C',
'module_smivr_lastResponsibleDuration' => 'Numero di secondi, per quanto tempo chiamare l\'ultimo responsabile',
'module_smivr_lastResponsibleTime' => 'Il numero di minuti per i quali il CDR dovrebbe essere analizzato per trovare il responsabile',
- 'module_smivr_LibraryVer2NotInstalled' => 'Installa il modulo della centrale di telefonia 2.0 per 1C, abilitalo e configuralo',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Installare il modulo pannello telefonia 4.0 per 1C, abilitarlo e configurarlo',
'module_smivr_EnableDebugMode' => 'Abilita la modalità di debug del modulo',
- 'module_smivr_LibraryVer2' => 'Versione 2.0',
+ 'module_smivr_LibraryVer2' => 'Versione 2.0/4.0',
'module_smivr_LibraryVer1' => 'Versione 1.0',
'SubHeaderModuleSmartIVR' => 'Generazione al volo di un menu vocale in base ai dati del sistema CRM',
'BreadcrumbModuleSmartIVR' => 'Modulo Smart Call Routing (Smart IVR)',
diff --git a/Messages/ja.php b/Messages/ja.php
index 89882a0..908d463 100644
--- a/Messages/ja.php
+++ b/Messages/ja.php
@@ -1,6 +1,6 @@
'モジュール「TelephonyPanel2.0for1C」の通信チャネルを使用します',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'モジュール「テレフォニー パネル 4.0 for 1C」の通信チャネルが使用されます',
'module_smivr_FailoverExtForeign' => 'スマートルーティングモジュールで緊急番号として使用されます',
'module_smivr_TimeoutExtForeignKey' => 'スマートルーティングモジュールのデフォルト番号として使用',
'module_smivr_ErrorOnMakeTestIVR' => '音声メニューのテスト生成中にエラーが発生しました',
@@ -26,10 +26,10 @@
'module_smivr_UseSSLConnection' => 'SSLを使用する',
'module_smivr_Server1CHostPort' => '1Cサーバーのアドレスとポート',
'module_smivr_Library1CType' => '1C側の統合サブシステムバージョン',
- 'module_smivr_LibraryVer2NotInstalled' => '1C用のテレフォニーパネル2.0モジュールをインストールし、有効にして構成します',
+ 'module_smivr_LibraryVer2NotInstalled' => '1C用のテレフォニーパネル4.0モジュールをインストールし、有効化して設定します',
'module_smivr_lastResponsibleDuration' => '秒数、最後の担当者に電話をかける時間',
'module_smivr_lastResponsibleTime' => '責任者を見つけるためにCDRを分析する必要がある分数',
- 'module_smivr_LibraryVer2' => 'バージョン2.0',
+ 'module_smivr_LibraryVer2' => 'バージョン2.0/4.0',
'module_smivr_LibraryVer1' => 'バージョン1.0',
'SubHeaderModuleSmartIVR' => 'CRMシステムデータに基づくオンザフライでの音声メニューの生成',
'BreadcrumbModuleSmartIVR' => 'スマートコールルーティングモジュール(スマートIVR)',
diff --git a/Messages/ka.php b/Messages/ka.php
index 33c0554..3e0f53e 100644
--- a/Messages/ka.php
+++ b/Messages/ka.php
@@ -4,7 +4,7 @@
'module_smivr_lastResponsibleTime' => 'წუთების რაოდენობა, რომლებზეც CDR უნდა გაანალიზდეს პასუხისმგებლის მოსაძებნად',
'module_smivr_FailoverExtForeign' => 'გამოიყენება როგორც სასწრაფო დახმარების ნომერი ჭკვიანი მარშრუტიზაციის მოდულში',
'module_smivr_TimeoutExtForeignKey' => 'გამოიყენება როგორც ნაგულისხმევი ნომერი ჭკვიანი მარშრუტიზაციის მოდულში',
- 'module_smivr_WeGetSettingsFromCTIClient' => 'გამოყენებული იქნება საკომუნიკაციო არხი მოდულიდან "ტელეფონის პანელი 2.0 1C-ისთვის".',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'გამოყენებული იქნება საკომუნიკაციო არხი მოდულიდან "ტელეფონის პანელი 4.0 1C-ისთვის".',
'module_smivr_ErrorOnMakeTestIVR' => 'შეცდომა ხმოვანი მენიუს ტესტის შექმნისას',
'module_smivr_UpdateRecord' => 'როდესაც მოდულის სტატუსი შეიცვალა, ობიექტები განახლდა:
',
'module_smivr_UpdateStatus' => 'Სტატუსის განახლება',
@@ -30,8 +30,8 @@
'module_smivr_UseSSLConnection' => 'გამოიყენეთ SSL',
'module_smivr_Server1CHostPort' => '1C სერვერის მისამართი და პორტი',
'module_smivr_Library1CType' => 'ინტეგრაციის ქვესისტემის ვერსია 1C მხარეს',
- 'module_smivr_LibraryVer2NotInstalled' => 'დააინსტალირეთ ტელეფონის პანელის 2.0 მოდული 1C-სთვის, ჩართეთ და დააკონფიგურირეთ იგი',
- 'module_smivr_LibraryVer2' => 'ვერსია 2.0',
+ 'module_smivr_LibraryVer2NotInstalled' => 'დააინსტალირეთ ტელეფონის პანელის 4.0 მოდული 1C-სთვის, ჩართეთ და დააკონფიგურირეთ იგი',
+ 'module_smivr_LibraryVer2' => 'ვერსია 2.0/4.0',
'module_smivr_LibraryVer1' => 'ვერსია 1.0',
'SubHeaderModuleSmartIVR' => 'ხმოვანი მენიუს გენერაცია ფრენის დროს CRM სისტემის მონაცემების მიხედვით',
'BreadcrumbModuleSmartIVR' => 'ჭკვიანი ზარის მარშრუტიზაციის მოდული (Smart IVR)',
diff --git a/Messages/languages.php b/Messages/languages.php
new file mode 100644
index 0000000..b3d9bbc
--- /dev/null
+++ b/Messages/languages.php
@@ -0,0 +1 @@
+ 'Slimme routeringsmodule - %represent%',
'SubHeaderModuleSmartIVR' => 'On-the-fly generatie van spraakmenu\'s op basis van CRM-systeemgegevens',
'module_smivr_LibraryVer1' => 'Versie 1.0',
- 'module_smivr_LibraryVer2' => 'Versie 2.0',
- 'module_smivr_LibraryVer2NotInstalled' => 'Installeer de telefoniepaneel 2.0-module voor 1C, schakel deze in en configureer deze',
+ 'module_smivr_LibraryVer2' => 'Versie 2.0/4.0',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Installeer de telefoniepaneel 4.0-module voor 1C, schakel deze in en configureer deze',
'module_smivr_Library1CType' => 'Versie van het integratiesubsysteem aan de 1C-zijde',
'module_smivr_Server1CHostPort' => 'Serveradres en poort 1C',
'module_smivr_UseSSLConnection' => 'Gebruik SSL',
@@ -24,7 +24,7 @@
'module_smivr_DisconnectedTTS' => 'Fout bij het verbinden met de TTS-service',
'module_smivr_UpdateStatus' => 'Status update',
'module_smivr_ErrorOnMakeTestIVR' => 'Fout tijdens het testen van het spraakmenu',
- 'module_smivr_WeGetSettingsFromCTIClient' => 'Er wordt gebruik gemaakt van het communicatiekanaal van de module "Telefoniepaneel 2.0 voor 1C".',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Er wordt gebruik gemaakt van het communicatiekanaal uit de module "Telefoniepaneel 4.0 voor 1C".',
'module_smivr_TimeoutExtForeignKey' => 'Gebruikt als standaardnummer in de slimme routeringsmodule',
'module_smivr_lastResponsibleTime' => 'Het aantal minuten dat de CDR moet worden geanalyseerd om de eigenaar te vinden',
'module_smivr_lastResponsibleDuration' => 'Aantal seconden, hoe lang het duurt om de laatste verantwoordelijke persoon te bellen',
diff --git a/Messages/pl.php b/Messages/pl.php
index cbcba38..7c5deb6 100644
--- a/Messages/pl.php
+++ b/Messages/pl.php
@@ -1,6 +1,6 @@
'Wykorzystany zostanie kanał komunikacyjny z modułu „Panel telefoniczny 2.0 dla 1C”',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Wykorzystany zostanie kanał komunikacyjny z modułu „Panel telefoniczny 4.0 dla 1C”.',
'module_smivr_FailoverExtForeign' => 'Używany jako numer alarmowy w module inteligentnego routingu',
'module_smivr_TimeoutExtForeignKey' => 'Używany jako numer domyślny w module inteligentnego routingu',
'module_smivr_ErrorOnMakeTestIVR' => 'Błąd podczas generowania testowego menu głosowego',
@@ -26,10 +26,10 @@
'module_smivr_Server1CHostPort' => 'Adres i port serwera 1C',
'module_smivr_Library1CType' => 'Wersja podsystemu integracji po stronie 1C',
'module_smivr_lastResponsibleDuration' => 'Liczba sekund, jak długo dzwonić do ostatniej osoby odpowiedzialnej',
- 'module_smivr_LibraryVer2NotInstalled' => 'Zainstaluj moduł panelu telefonicznego 2.0 dla 1C, włącz go i skonfiguruj',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Zainstaluj moduł panelu telefonicznego 4.0 dla 1C, włącz go i skonfiguruj',
'module_smivr_lastResponsibleTime' => 'Liczba minut, przez które należy przeanalizować CDR w celu znalezienia odpowiedzialnego',
'module_smivr_EnableDebugMode' => 'Włącz tryb debugowania modułu',
- 'module_smivr_LibraryVer2' => 'Wersja 2.0',
+ 'module_smivr_LibraryVer2' => 'Wersja 2.0/4.0',
'module_smivr_LibraryVer1' => 'Wersja 1.0',
'SubHeaderModuleSmartIVR' => 'Generowanie menu głosowego w locie na podstawie danych z systemu CRM',
'BreadcrumbModuleSmartIVR' => 'Moduł inteligentnego routingu połączeń (Smart IVR)',
diff --git a/Messages/pt.php b/Messages/pt.php
index bdb2770..df74c01 100644
--- a/Messages/pt.php
+++ b/Messages/pt.php
@@ -1,6 +1,6 @@
'Será utilizado o canal de comunicação do módulo "Painel de Telefonia 2.0 para 1C"',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Será utilizado o canal de comunicação do módulo "Painel Telefônico 4.0 para 1C"',
'module_smivr_FailoverExtForeign' => 'Usado como número de emergência no módulo de roteamento inteligente',
'module_smivr_TimeoutExtForeignKey' => 'Usado como número padrão no módulo de roteamento inteligente',
'module_smivr_ErrorOnMakeTestIVR' => 'Erro durante a geração de teste do menu de voz',
@@ -29,12 +29,12 @@
'module_smivr_lastResponsibleDuration' => 'Número de segundos, quanto tempo para ligar para o último responsável',
'module_smivr_lastResponsibleTime' => 'O número de minutos pelos quais o CDR deve ser analisado para encontrar o responsável',
'module_smivr_EnableDebugMode' => 'Habilitar modo de depuração de módulo',
- 'module_smivr_LibraryVer2' => 'Versão 2.0',
+ 'module_smivr_LibraryVer2' => 'Versão 2.0/4.0',
'module_smivr_LibraryVer1' => 'Versão 1.0',
'SubHeaderModuleSmartIVR' => 'Geração de um menu de voz em tempo real de acordo com os dados do sistema CRM',
'BreadcrumbModuleSmartIVR' => 'Módulo de roteamento de chamada inteligente (IVR inteligente)',
'repModuleSmartIVR' => 'Módulo de roteamento inteligente -% representa%',
- 'module_smivr_LibraryVer2NotInstalled' => 'Instale o módulo do painel de telefonia 2.0 para 1C, habilite e configure-o',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Instale o módulo do painel de telefonia 4.0 para 1C, habilite e configure-o',
/**
* Copyright © MIKO LLC - All Rights Reserved
* Unauthorized copying of this file, via any medium is strictly prohibited
diff --git a/Messages/pt_BR.php b/Messages/pt_BR.php
index 4757eaf..09b0e2e 100644
--- a/Messages/pt_BR.php
+++ b/Messages/pt_BR.php
@@ -4,7 +4,7 @@
'module_smivr_lastResponsibleTime' => 'O número de minutos pelos quais o CDR deve ser analisado para encontrar o responsável',
'module_smivr_FailoverExtForeign' => 'Usado como número de emergência no módulo de roteamento inteligente',
'module_smivr_TimeoutExtForeignKey' => 'Usado como número padrão no módulo de roteamento inteligente',
- 'module_smivr_WeGetSettingsFromCTIClient' => 'Será utilizado o canal de comunicação do módulo "Painel de Telefonia 2.0 para 1C"',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Será utilizado o canal de comunicação do módulo "Painel Telefônico 4.0 para 1C"',
'module_smivr_ErrorOnMakeTestIVR' => 'Erro durante a geração de teste do menu de voz',
'module_smivr_UpdateRecord' => 'Quando o status do módulo mudou, os objetos foram atualizados:
',
'module_smivr_UpdateStatus' => 'Atualização de status',
@@ -30,8 +30,8 @@
'module_smivr_UseSSLConnection' => 'Use SSL',
'module_smivr_Server1CHostPort' => 'Endereço e porta do servidor 1C',
'module_smivr_Library1CType' => 'Versão do subsistema de integração no lado 1C',
- 'module_smivr_LibraryVer2NotInstalled' => 'Instale o módulo do painel de telefonia 2.0 para 1C, habilite e configure-o',
- 'module_smivr_LibraryVer2' => 'Versão 2.0',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Instale o módulo do painel de telefonia 4.0 para 1C, habilite e configure-o',
+ 'module_smivr_LibraryVer2' => 'Versão 2.0/4.0',
'module_smivr_LibraryVer1' => 'Versão 1.0',
'SubHeaderModuleSmartIVR' => 'Geração de um menu de voz em tempo real de acordo com os dados do sistema CRM',
'BreadcrumbModuleSmartIVR' => 'Módulo de roteamento de chamada inteligente (IVR inteligente)',
diff --git a/Messages/ro.php b/Messages/ro.php
index 1274799..b446bdf 100644
--- a/Messages/ro.php
+++ b/Messages/ro.php
@@ -17,8 +17,8 @@
'module_smivr_Connected' => 'Conectat la serviciul 1C și TTS',
'module_smivr_Disconnected' => 'Dezactivat',
'module_smivr_UpdateStatus' => 'Actualizarea stării',
- 'module_smivr_LibraryVer2' => 'Versiunea 2.0',
- 'module_smivr_LibraryVer2NotInstalled' => 'Instalați modulul panoului de telefonie 2.0 pentru 1C, activați-l și configurați-l',
+ 'module_smivr_LibraryVer2' => 'Versiunea 2.0/4.0',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Instalați modulul panoului de telefonie 4.0 pentru 1C, activați-l și configurați-l',
'module_smivr_Library1CType' => 'Versiunea subsistemului de integrare pe partea 1C',
'module_smivr_Server1CHostPort' => 'Adresa serverului și portul 1C',
'module_smivr_UseSSLConnection' => 'Utilizați SSL',
@@ -38,7 +38,7 @@
'module_smivr_DisconnectedTTS' => 'Eroare la conectarea la serviciul TTS',
'module_smivr_UpdateRecord' => 'Obiecte actualizate când starea modulului s-a schimbat:
',
'module_smivr_ErrorOnMakeTestIVR' => 'Eroare la generarea testului a meniului vocal',
- 'module_smivr_WeGetSettingsFromCTIClient' => 'Se va utiliza canalul de comunicare din modulul „Telephony Panel 2.0 for 1C”.',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Se va folosi canalul de comunicare din modulul „Telephony Panel 4.0 for 1C”.',
'module_smivr_TimeoutExtForeignKey' => 'Folosit ca număr implicit în modulul de rutare inteligentă',
'module_smivr_FailoverExtForeign' => 'Folosit ca număr de urgență în modulul de rutare inteligentă',
'module_smivr_lastResponsibleTime' => 'Numărul de minute pentru a analiza CDR-ul pentru a găsi proprietarul',
diff --git a/Messages/ru.php b/Messages/ru.php
index 5874c32..ed48ec6 100644
--- a/Messages/ru.php
+++ b/Messages/ru.php
@@ -13,8 +13,10 @@
'SubHeaderModuleSmartIVR' => 'Генерация голосового меню на лету по данным CRM системы',
'module_smivr_LibraryVer1' => 'Версия 1.0',
- 'module_smivr_LibraryVer2' => 'Версия 2.0',
- 'module_smivr_LibraryVer2NotInstalled' => 'Установите модуль панель телефонии 2.0 для 1С, включите и настройте его',
+ 'module_smivr_LibraryVer2' => 'Версия 2.0/4.0',
+ 'module_smivr_LibraryVer5' => 'Версия 5.0',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Установите модуль "Панель телефонии 4.0 для 1С", включите и настройте его',
+ 'module_smivr_LibraryVer5NotInstalled' => 'Установите модуль "Панель телефонии 5.0 для 1С", включите и настройте его',
'module_smivr_Library1CType' => 'Версия подсистемы интеграции на стороне 1С',
'module_smivr_Server1CHostPort' => 'Адрес и порт сервера 1С',
@@ -46,7 +48,8 @@
'module_smivr_UpdateRecord' => 'При изменении статуса модуля обновлены объекты:
',
'module_smivr_ErrorOnMakeTestIVR' => 'Ошибка при тестовой генерации голосового меню',
- 'module_smivr_WeGetSettingsFromCTIClient'=>'Будет использоваться канал связи из модуля "Панель телефонии 2.0 для 1С"',
+ 'module_smivr_WeGetSettingsFromCTIClient'=>'Будет использоваться канал связи из модуля "Панель телефонии 4.0 для 1С"',
+ 'module_smivr_WeGetSettingsFromCTIClientV5'=>'Будет использоваться канал связи из модуля "Панель телефонии 5.0 для 1С"',
'module_smivr_TimeoutExtForeignKey'=>'Используется как номер по-умолчанию в модуле умной маршрутизации',
'module_smivr_FailoverExtForeign'=>'Используется как аварийный номер в модуле умной маршрутизации',
diff --git a/Messages/sv.php b/Messages/sv.php
index d6bb685..e72b6eb 100644
--- a/Messages/sv.php
+++ b/Messages/sv.php
@@ -1,6 +1,6 @@
'Kommunikationskanalen från modulen "Telefonipanel 2.0 för 1C" kommer att användas',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Kommunikationskanalen från modulen "Telefonipanel 4.0 för 1C" kommer att användas',
'module_smivr_FailoverExtForeign' => 'Används som nödnummer i smart routingmodul',
'module_smivr_TimeoutExtForeignKey' => 'Används som standardnummer i smart routingmodul',
'module_smivr_ErrorOnMakeTestIVR' => 'Fel under testgenerering av röstmenyn',
@@ -24,11 +24,11 @@
'module_smivr_UseSSLConnection' => 'Använd SSL',
'module_smivr_Server1CHostPort' => '1C-serveradress och port',
'module_smivr_Library1CType' => 'Integrationsdelsystemversion på 1C-sidan',
- 'module_smivr_LibraryVer2NotInstalled' => 'Installera telefonipanel 2.0-modulen för 1C, slå på den och konfigurera den',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Installera telefonipanel 4.0-modulen för 1C, aktivera och konfigurera den',
'module_smivr_lastResponsibleDuration' => 'Antal sekunder, hur länge ska man ringa den sista ansvarig',
'module_smivr_lastResponsibleTime' => 'Antalet minuter som CDR bör analyseras för att hitta den ansvarige',
'module_smivr_EnableDebugMode' => 'Aktivera modulfelsökningsläge',
- 'module_smivr_LibraryVer2' => 'Version 2.0',
+ 'module_smivr_LibraryVer2' => 'Version 2.0/4.0',
'module_smivr_LibraryVer1' => 'Version 1.0',
'SubHeaderModuleSmartIVR' => 'Generering av en röstmeny i farten enligt CRM-systemdata',
'BreadcrumbModuleSmartIVR' => 'Smart Call Routing Module (Smart IVR)',
diff --git a/Messages/th.php b/Messages/th.php
new file mode 100644
index 0000000..2546dbf
--- /dev/null
+++ b/Messages/th.php
@@ -0,0 +1,46 @@
+ 'โมดูลการกำหนดเส้นทางอัจฉริยะ',
+ 'module_smivr_Disconnected' => 'พิการ',
+ 'module_smivr_lastResponsibleTime' => 'จำนวนนาทีที่ควรวิเคราะห์ CDR เพื่อค้นหาผู้รับผิดชอบ',
+ 'repModuleSmartIVR' => 'โมดูลการกำหนดเส้นทางอัจฉริยะ - % เป็นตัวแทน%',
+ 'BreadcrumbModuleSmartIVR' => 'โมดูลกำหนดเส้นทางการโทรอัจฉริยะ (Smart IVR)',
+ 'SubHeaderModuleSmartIVR' => 'การสร้างเมนูเสียงได้ทันทีตามข้อมูลระบบ CRM',
+ 'module_smivr_LibraryVer1' => 'เวอร์ชัน 1.0',
+ 'module_smivr_LibraryVer2' => 'เวอร์ชัน 2.0/4.0',
+ 'module_smivr_LibraryVer2NotInstalled' => 'ติดตั้งโมดูลแผงโทรศัพท์ 4.0 สำหรับ 1C เปิดใช้งานและกำหนดค่า',
+ 'module_smivr_Library1CType' => 'เวอร์ชันของระบบย่อยการรวมทางฝั่ง 1C',
+ 'module_smivr_Server1CHostPort' => 'ที่อยู่เซิร์ฟเวอร์ 1C และพอร์ต',
+ 'module_smivr_UseSSLConnection' => 'ใช้ SSL',
+ 'module_smivr_Login' => 'เข้าสู่ระบบบริการเว็บ 1C',
+ 'module_smivr_Password' => 'รหัสผ่านสำหรับการอนุญาตใน 1C',
+ 'module_smivr_PublicationName' => 'ชื่อสิ่งพิมพ์',
+ 'module_smivr_NumberOfRepeat' => 'จำนวนการซ้ำเมนู IVR ก่อนโอนสายไปยังหมายเลขเริ่มต้น',
+ 'module_smivr_TimeoutExtension' => 'หมายเลขเริ่มต้น',
+ 'module_smivr_FailoverExtension' => 'หมายเลขที่เราจะส่งสายในกรณีที่การสื่อสารล้มเหลวกับ 1C และ TTS เช่น เมนู IVR แบบคงที่',
+ 'module_smivr_EnableDebugMode' => 'เปิดใช้งานโหมดแก้ไขข้อบกพร่องของโมดูล',
+ 'module_smivr_ValidateServer1CHostEmpty' => 'ไม่ได้กรอกที่อยู่เซิร์ฟเวอร์ 1C',
+ 'module_smivr_ValidateServer1CPortRange' => 'ระบุพอร์ตเซิร์ฟเวอร์ 1C ไม่ถูกต้อง',
+ 'module_smivr_ValidatePubName' => 'ไม่ได้ระบุชื่อการเผยแพร่ของบริการเว็บ 1C',
+ 'module_smivr_ValidateNumberOfRepeat' => 'จำนวนการทำซ้ำเมนู IVR ไม่ถูกต้อง',
+ 'module_smivr_ValidateTimeoutExtension' => 'ไม่ได้ระบุหมายเลขเริ่มต้น',
+ 'module_smivr_ValidateFailOverExtension' => 'ไม่ได้ระบุหมายเลขฉุกเฉิน',
+ 'module_smivr_ValidateFailOverExtensionNotEqualTo' => 'หมายเลขฉุกเฉินไม่ถูกต้อง',
+ 'module_smivr_ValidateTimeOutExtensionNotEqualTo' => 'หมายเลขเริ่มต้นไม่ถูกต้อง',
+ 'module_smivr_Connected' => 'เชื่อมต่อกับบริการ 1C และ TTS',
+ 'module_smivr_Disconnected1C' => 'ข้อผิดพลาดในการเชื่อมต่อกับ 1C',
+ 'module_smivr_DisconnectedTTS' => 'เกิดข้อผิดพลาดในการเชื่อมต่อกับบริการ TTS',
+ 'module_smivr_UpdateStatus' => 'อัพเดทสถานะ',
+ 'module_smivr_UpdateRecord' => 'เมื่อสถานะของโมดูลเปลี่ยนไป ออบเจ็กต์ได้รับการอัปเดต:
',
+ 'module_smivr_ErrorOnMakeTestIVR' => 'เกิดข้อผิดพลาดระหว่างการทดสอบการสร้างเมนูเสียง',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'จะใช้ช่องทางการสื่อสารจากโมดูล "แผงโทรศัพท์ 4.0 สำหรับ 1C"',
+ 'module_smivr_TimeoutExtForeignKey' => 'ใช้เป็นหมายเลขเริ่มต้นในโมดูลเส้นทางอัจฉริยะ',
+ 'module_smivr_FailoverExtForeign' => 'ใช้เป็นหมายเลขฉุกเฉินในโมดูลเส้นทางอัจฉริยะ',
+ 'module_smivr_lastResponsibleDuration' => 'จำนวนวินาทีระยะเวลาในการโทรหาผู้รับผิดชอบคนสุดท้าย',
+];
diff --git a/Messages/tr.php b/Messages/tr.php
index ef92d78..74b1c47 100644
--- a/Messages/tr.php
+++ b/Messages/tr.php
@@ -1,6 +1,6 @@
'"Telephony Panel 2.0 for 1C" modülünden gelen iletişim kanalı kullanılacaktır.',
+ 'module_smivr_WeGetSettingsFromCTIClient' => '"1C için Telefon Paneli 4.0" modülündeki iletişim kanalı kullanılacaktır',
'module_smivr_FailoverExtForeign' => 'Akıllı yönlendirme modülünde acil durum numarası olarak kullanılır',
'module_smivr_TimeoutExtForeignKey' => 'Akıllı yönlendirme modülünde varsayılan numara olarak kullanılır',
'module_smivr_ErrorOnMakeTestIVR' => 'Ses menüsünün test üretimi sırasında hata',
@@ -24,11 +24,11 @@
'module_smivr_UseSSLConnection' => 'SSL kullan',
'module_smivr_Server1CHostPort' => '1C sunucu adresi ve bağlantı noktası',
'module_smivr_Library1CType' => '1C tarafında entegrasyon alt sistemi sürümü',
- 'module_smivr_LibraryVer2NotInstalled' => '1C için telefon paneli 2.0 modülünü kurun, açın ve yapılandırın',
+ 'module_smivr_LibraryVer2NotInstalled' => '1C için telefon paneli 4.0 modülünü kurun, etkinleştirin ve yapılandırın',
'module_smivr_lastResponsibleDuration' => 'Saniye sayısı, en son sorumlu kişinin aranacağı süre',
'module_smivr_lastResponsibleTime' => 'Sorumluyu bulmak için CDR\'nin analiz edilmesi gereken dakika sayısı',
'module_smivr_EnableDebugMode' => 'Modül hata ayıklama modunu etkinleştir',
- 'module_smivr_LibraryVer2' => 'Sürüm 2.0',
+ 'module_smivr_LibraryVer2' => 'Sürüm 2.0/4.0',
'module_smivr_LibraryVer1' => 'Sürüm 1.0',
'SubHeaderModuleSmartIVR' => 'CRM sistem verilerine göre anında sesli menü oluşturma',
'BreadcrumbModuleSmartIVR' => 'Akıllı Çağrı Yönlendirme Modülü (Akıllı IVR)',
diff --git a/Messages/uk.php b/Messages/uk.php
index 9f54455..00200dc 100644
--- a/Messages/uk.php
+++ b/Messages/uk.php
@@ -1,6 +1,6 @@
'Використовуватиметься канал зв\'язку з модуля "Панель телефонії 2.0 для 1С"',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Використовуватиметься канал зв\'язку з модуля "Панель телефонії 4.0 для 1С"',
'module_smivr_FailoverExtForeign' => 'Використовується як аварійний номер у модулі розумної маршрутизації',
'module_smivr_TimeoutExtForeignKey' => 'Використовується як номер за замовчуванням у модулі розумної маршрутизації',
'module_smivr_ErrorOnMakeTestIVR' => 'Помилка під час тестової генерації голосового меню',
@@ -25,11 +25,11 @@
'module_smivr_UseSSLConnection' => 'Використовувати SSL',
'module_smivr_Server1CHostPort' => 'Адреса та порт сервера 1С',
'module_smivr_Library1CType' => 'Версія підсистеми інтеграції на боці 1С',
- 'module_smivr_LibraryVer2NotInstalled' => 'Встановіть модуль панель телефонії 2.0 для 1С, увімкніть та налаштуйте його',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Встановіть модуль панелі телефонії 4.0 для 1С, увімкніть і налаштуйте його',
'module_smivr_lastResponsibleDuration' => 'Кількість секунд, як довго дзвонити останньому відповідальному',
'module_smivr_lastResponsibleTime' => 'Кількість хвилин, за яку слід аналізувати CDR для пошуку відповідального',
'module_smivr_EnableDebugMode' => 'Увімкнути режим налагодження модуля',
- 'module_smivr_LibraryVer2' => 'Версія 2.0',
+ 'module_smivr_LibraryVer2' => 'Версія 2.0/4.0',
'module_smivr_LibraryVer1' => 'Версія 1.0',
'SubHeaderModuleSmartIVR' => 'Генерація голосового меню на льоту за даними CRM системи',
'module_smivr_ValidateTimeoutExtension' => 'Не вказано номер за замовчуванням',
diff --git a/Messages/vi.php b/Messages/vi.php
index cb394a9..e1fdd2a 100644
--- a/Messages/vi.php
+++ b/Messages/vi.php
@@ -1,6 +1,6 @@
'Kênh giao tiếp từ mô-đun "Bảng điện thoại 2.0 cho 1C" sẽ được sử dụng',
+ 'module_smivr_WeGetSettingsFromCTIClient' => 'Kênh liên lạc từ module "Telephony Panel 4.0 for 1C" sẽ được sử dụng',
'module_smivr_FailoverExtForeign' => 'Được sử dụng làm số khẩn cấp trong mô-đun định tuyến thông minh',
'module_smivr_TimeoutExtForeignKey' => 'Được sử dụng làm số mặc định trong mô-đun định tuyến thông minh',
'module_smivr_ErrorOnMakeTestIVR' => 'Lỗi trong khi tạo thử nghiệm menu thoại',
@@ -26,7 +26,7 @@
'module_smivr_UseSSLConnection' => 'Sử dụng SSL',
'module_smivr_Server1CHostPort' => 'Địa chỉ máy chủ 1C và cổng',
'module_smivr_Library1CType' => 'Phiên bản hệ thống con tích hợp ở phía 1C',
- 'module_smivr_LibraryVer2NotInstalled' => 'Cài đặt mô-đun bảng điện thoại 2.0 cho 1C, bật và cấu hình nó',
+ 'module_smivr_LibraryVer2NotInstalled' => 'Cài đặt mô-đun bảng điện thoại 4.0 cho 1C, kích hoạt và định cấu hình nó',
'module_smivr_lastResponsibleDuration' => 'Số giây, bao lâu để gọi cho người phụ trách cuối cùng',
'module_smivr_lastResponsibleTime' => 'Số phút CDR cần được phân tích để tìm ra người chịu trách nhiệm',
'module_smivr_EnableDebugMode' => 'Bật chế độ gỡ lỗi mô-đun',
@@ -42,5 +42,5 @@
* Written by Alexey Portnov, 2 2019
*/
'mo_ModuleSmartIVR' => 'Mô-đun định tuyến thông minh',
- 'module_smivr_LibraryVer2' => 'Phiên bản 2.0',
+ 'module_smivr_LibraryVer2' => 'Phiên bản 2.0/4.0',
];
diff --git a/Messages/zh_Hans.php b/Messages/zh_Hans.php
index dfa6f85..3544ae2 100644
--- a/Messages/zh_Hans.php
+++ b/Messages/zh_Hans.php
@@ -1,6 +1,6 @@
'将使用模块“Telephony Panel 2.0 for 1C”的通信通道',
+ 'module_smivr_WeGetSettingsFromCTIClient' => '将使用模块“Telephony Panel 4.0 for 1C”的通信通道',
'module_smivr_FailoverExtForeign' => '在智能路由模块中用作紧急号码',
'module_smivr_TimeoutExtForeignKey' => '在智能路由模块中用作默认号码',
'module_smivr_ErrorOnMakeTestIVR' => '语音菜单的测试生成过程中出错',
@@ -27,9 +27,9 @@
'module_smivr_Library1CType' => '1C侧集成子系统版本',
'module_smivr_lastResponsibleDuration' => '秒数,呼叫最后一个负责人需要多长时间',
'module_smivr_lastResponsibleTime' => '应分析 CDR 以找到负责人的分钟数',
- 'module_smivr_LibraryVer2NotInstalled' => '安装1C的电话面板2.0模块,启用并配置',
+ 'module_smivr_LibraryVer2NotInstalled' => '安装1C的电话面板4.0模块,启用并配置它',
'module_smivr_EnableDebugMode' => '启用模块调试模式',
- 'module_smivr_LibraryVer2' => '2.0版',
+ 'module_smivr_LibraryVer2' => '2.0/4.0版本',
'SubHeaderModuleSmartIVR' => '根据 CRM 系统数据即时生成语音菜单',
'module_smivr_Disconnected1C' => '1C 连接错误',
'BreadcrumbModuleSmartIVR' => '智能呼叫路由模块(智能 IVR)',
diff --git a/Setup/PbxExtensionSetup.php b/Setup/PbxExtensionSetup.php
index d13d307..cb97801 100644
--- a/Setup/PbxExtensionSetup.php
+++ b/Setup/PbxExtensionSetup.php
@@ -9,10 +9,8 @@
namespace Modules\ModuleSmartIVR\Setup;
use MikoPBX\Common\Models\Extensions;
-use MikoPBX\Core\System\Util;
-use Modules\ModuleSmartIVR\Models\{ModuleSmartIVR};
+use Modules\ModuleSmartIVR\Models\ModuleSmartIVR;
use MikoPBX\Modules\Setup\PbxExtensionSetupBase;
-use Throwable;
class PbxExtensionSetup extends PbxExtensionSetupBase
{
diff --git a/composer.json b/composer.json
index c59dc12..9970a76 100644
--- a/composer.json
+++ b/composer.json
@@ -2,6 +2,7 @@
"name": "mikopbx/modulesmartivr",
"description": "ModuleSmartIVR",
"require": {
+ "php": "^7.4 || ^8.0",
"mikopbx/core": ">=2020.2.757"
},
"autoload": {
@@ -28,7 +29,7 @@
"wiki": "https://wiki.mikopbx.com",
"issues": "https://github.com/mikopbx/Core/issues",
"source": "https://github.com/mikopbx/Core",
- "forum": "https://qa.askozia.ru",
+ "forum": "https://qa.mikopbx.ru",
"chat": "https://t.me/mikopbx_dev"
},
"authors": [
@@ -41,7 +42,7 @@
{
"name": "Nikolay Beketov",
"email": "nbek@miko.ru",
- "homepage": "http://facebook.com/jorikfon",
+ "homepage": "https://www.linkedin.com/in/nikolay-beketov",
"role": "Developer"
}
],
@@ -54,7 +55,7 @@
"config": {
"sort-packages": true,
"platform": {
- "php": "7.4.6"
+ "php": "^7.4 || ^8.0"
}
}
}
diff --git a/module.json b/module.json
index 299f72f..80aaf5e 100644
--- a/module.json
+++ b/module.json
@@ -3,5 +3,10 @@
"moduleUniqueID":"ModuleSmartIVR",
"support_email": "help@miko.ru",
"version": "%ModuleVersion%",
- "min_pbx_version": "2020.2.757"
+ "min_pbx_version": "2020.2.757",
+ "release_settings": {
+ "publish_release": true,
+ "changelog_enabled": true,
+ "create_github_release": true
+ }
}
\ No newline at end of file
diff --git a/public/assets/js/module-smartivr-index.js b/public/assets/js/module-smartivr-index.js
index 0a51f00..08591d8 100644
--- a/public/assets/js/module-smartivr-index.js
+++ b/public/assets/js/module-smartivr-index.js
@@ -15,6 +15,7 @@ var moduleSmartIVR = {
$LibrarySelect: $('#library_1c'),
$onlyFirstGeneration: $('.only-first-generation'),
$onlySecondGeneration: $('.only-second-generation'),
+ $onlyFiveGeneration: $('.only-five-generation'),
$moduleStatus: $('#status'),
$dirrtyField: null,
$submitButton: $('#submitbutton'),
@@ -72,257 +73,185 @@ var moduleSmartIVR = {
}]
}
},
- initialize: function () {
- function initialize() {
- moduleSmartIVR.cbChangeLibraryType();
- moduleSmartIVR.checkStatusToggle();
- window.addEventListener('ModuleStatusChanged', moduleSmartIVR.checkStatusToggle);
- moduleSmartIVR.$forwardingSelect.dropdown(Extensions.getDropdownSettingsWithoutEmpty());
- moduleSmartIVR.$LibrarySelect.dropdown({
- onChange: moduleSmartIVR.cbChangeLibraryType
- });
- moduleSmartIVR.initializeForm();
- }
-
- return initialize;
- }(),
-
+ initialize: function initialize() {
+ moduleSmartIVR.cbChangeLibraryType();
+ moduleSmartIVR.checkStatusToggle();
+ window.addEventListener('ModuleStatusChanged', moduleSmartIVR.checkStatusToggle);
+ moduleSmartIVR.$forwardingSelect.dropdown(Extensions.getDropdownSettingsWithoutEmpty());
+ moduleSmartIVR.$LibrarySelect.dropdown({
+ onChange: moduleSmartIVR.cbChangeLibraryType
+ });
+ moduleSmartIVR.initializeForm();
+ },
/**
* Изменение версии библиотеки
*/
- cbChangeLibraryType: function () {
- function cbChangeLibraryType() {
- if (moduleSmartIVR.$formObj.form('get value', 'library_1c') === '2.0') {
- moduleSmartIVR.$onlyFirstGeneration.hide();
- moduleSmartIVR.$onlySecondGeneration.show();
- moduleSmartIVR.$formObj.form('set value', 'isPT1C', '');
- } else {
- moduleSmartIVR.$onlySecondGeneration.hide();
- moduleSmartIVR.$onlyFirstGeneration.show();
- moduleSmartIVR.$formObj.form('set value', 'isPT1C', true);
- }
-
- if (moduleSmartIVR.$dirrtyField === null) {
- moduleSmartIVR.$dirrtyField = $('#dirrty');
- } else {
- moduleSmartIVR.$dirrtyField.val(Math.random());
- moduleSmartIVR.$dirrtyField.trigger('change');
- }
+ cbChangeLibraryType: function cbChangeLibraryType() {
+ if (moduleSmartIVR.$formObj.form('get value', 'library_1c') === '1.0') {
+ moduleSmartIVR.$onlySecondGeneration.hide();
+ moduleSmartIVR.$onlyFirstGeneration.show();
+ moduleSmartIVR.$onlyFiveGeneration.hide();
+ moduleSmartIVR.$formObj.form('set value', 'isPT1C', true);
+ } else if (moduleSmartIVR.$formObj.form('get value', 'library_1c') === '5.0') {
+ moduleSmartIVR.$onlySecondGeneration.hide();
+ moduleSmartIVR.$onlyFirstGeneration.hide();
+ moduleSmartIVR.$onlyFiveGeneration.show();
+ moduleSmartIVR.$formObj.form('set value', 'isPT1C', '');
+ } else {
+ moduleSmartIVR.$onlyFirstGeneration.hide();
+ moduleSmartIVR.$onlySecondGeneration.show();
+ moduleSmartIVR.$onlyFiveGeneration.hide();
+ moduleSmartIVR.$formObj.form('set value', 'isPT1C', '');
}
-
- return cbChangeLibraryType;
- }(),
-
+ if (moduleSmartIVR.$dirrtyField === null) {
+ moduleSmartIVR.$dirrtyField = $('#dirrty');
+ } else {
+ moduleSmartIVR.$dirrtyField.val(Math.random());
+ moduleSmartIVR.$dirrtyField.trigger('change');
+ }
+ },
/**
* Изменение статуса кнопок при изменении статуса модуля
*/
- checkStatusToggle: function () {
- function checkStatusToggle() {
- if (moduleSmartIVR.$statusToggle.checkbox('is checked')) {
- if (!moduleSmartIVR.$submitButton.hasClass('disabled')) {
- moduleSmartIVR.$submitButton.click();
- }
-
- moduleSmartIVR.testConnection();
- } else {
- moduleSmartIVR.changeStatus('Disconnected');
+ checkStatusToggle: function checkStatusToggle() {
+ if (moduleSmartIVR.$statusToggle.checkbox('is checked')) {
+ if (!moduleSmartIVR.$submitButton.hasClass('disabled')) {
+ moduleSmartIVR.$submitButton.click();
}
+ moduleSmartIVR.testConnection();
+ } else {
+ moduleSmartIVR.changeStatus('Disconnected');
}
-
- return checkStatusToggle;
- }(),
-
+ },
/**
* Тестирование соединения с 1С
*/
- testConnection: function () {
- function testConnection() {
- if (!moduleSmartIVR.$formObj.form('is valid')) {
- return;
- }
-
- var formData = moduleSmartIVR.$formObj.form('get values');
-
- if (formData.moduleCTI2Installed === '' && formData.isPT1C === 'false') {
- return;
- }
-
- moduleSmartIVR.changeStatus('Updating');
- $('.message.ajax.debug').remove();
- $.api({
- url: "".concat(Config.pbxUrl, "/pbxcore/api/modules/ModuleSmartIVR/check"),
- on: 'now',
- timeout: 15000,
- successTest: function () {
- function successTest(response) {
- return response !== undefined && Object.keys(response).length > 0 && response.result !== undefined && response.result === true;
- }
-
- return successTest;
- }(),
- onSuccess: function () {
- function onSuccess() {
- moduleSmartIVR.changeStatus('Connected');
- }
-
- return onSuccess;
- }(),
- onResponse: function () {
- function onResponse(response) {
- $('.message.ajax.debug').remove(); // Debug mode
-
- if (moduleSmartIVR.$debugToggle.checkbox('is checked') && moduleSmartIVR.$submitButton.hasClass('disabled') && typeof response.messages !== 'undefined') {
- var visualErrorString = JSON.stringify(response.messages, null, 2);
-
- if (typeof visualErrorString === 'string' && visualErrorString !== '[]') {
- visualErrorString = visualErrorString.replace(/\\n/g, '
');
-
- if (Object.keys(response).length > 0 && response.result === true) {
- moduleSmartIVR.$formObj.after("\t\t\n\t\t\t\t\t\t\t\t\t
".concat(visualErrorString, "
\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t
"));
- } else {
- moduleSmartIVR.$formObj.after("\n\t\t\t\t\t\t\t\t\t
".concat(visualErrorString, "
\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t
"));
- }
- }
- }
- }
-
- return onResponse;
- }(),
- onFailure: function () {
- function onFailure(response) {
- if (response !== undefined && Object.keys(response).length > 0 && response.result !== undefined && response.result === false && typeof response.data !== 'undefined') {
- var visualErrorString = '';
-
- if (typeof response.messages === 'string') {
- visualErrorString = response.messages;
- } else if (Array.isArray(response.messages)) {
- $.each(response.messages, function (index, value) {
- visualErrorString += "".concat(value, "
");
- });
- } else {
- visualErrorString = JSON.stringify(response.data, null, '\t');
- }
-
- if (visualErrorString.indexOf('TTSConnectionError') >= 0) {
- moduleSmartIVR.changeStatus('DisconnectedTTS');
- } else if (visualErrorString.indexOf('ConnectionToCRMError') >= 0) {
- moduleSmartIVR.changeStatus('Disconnected1C');
- } else {
- moduleSmartIVR.changeStatus('Disconnected');
- }
+ testConnection: function testConnection() {
+ if (!moduleSmartIVR.$formObj.form('is valid')) {
+ return;
+ }
+ var formData = moduleSmartIVR.$formObj.form('get values');
+ if (formData.moduleCTI2Installed === '' && formData.isPT1C === 'false') {
+ return;
+ }
+ moduleSmartIVR.changeStatus('Updating');
+ $('.message.ajax.debug').remove();
+ $.api({
+ url: "".concat(Config.pbxUrl, "/pbxcore/api/modules/ModuleSmartIVR/check"),
+ on: 'now',
+ timeout: 15000,
+ successTest: function successTest(response) {
+ return response !== undefined && Object.keys(response).length > 0 && response.result !== undefined && response.result === true;
+ },
+ onSuccess: function onSuccess() {
+ moduleSmartIVR.changeStatus('Connected');
+ },
+ onResponse: function onResponse(response) {
+ $('.message.ajax.debug').remove();
+ // Debug mode
+ if (moduleSmartIVR.$debugToggle.checkbox('is checked') && moduleSmartIVR.$submitButton.hasClass('disabled') && typeof response.messages !== 'undefined') {
+ var visualErrorString = JSON.stringify(response.messages, null, 2);
+ if (typeof visualErrorString === 'string' && visualErrorString !== '[]') {
+ visualErrorString = visualErrorString.replace(/\\n/g, '
');
+ if (Object.keys(response).length > 0 && response.result === true) {
+ moduleSmartIVR.$formObj.after("\t\t\n\t\t\t\t\t\t\t\t\t
".concat(visualErrorString, "
\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t
"));
} else {
- moduleSmartIVR.changeStatus('Disconnected');
+ moduleSmartIVR.$formObj.after("\n\t\t\t\t\t\t\t\t\t
".concat(visualErrorString, "
\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t
"));
}
}
-
- return onFailure;
- }()
- });
- }
-
- return testConnection;
- }(),
-
+ }
+ },
+ onFailure: function onFailure(response) {
+ if (response !== undefined && Object.keys(response).length > 0 && response.result !== undefined && response.result === false && typeof response.data !== 'undefined') {
+ var visualErrorString = '';
+ if (typeof response.messages === 'string') {
+ visualErrorString = response.messages;
+ } else if (Array.isArray(response.messages)) {
+ $.each(response.messages, function (index, value) {
+ visualErrorString += "".concat(value, "
");
+ });
+ } else {
+ visualErrorString = JSON.stringify(response.data, null, '\t');
+ }
+ if (visualErrorString.indexOf('TTSConnectionError') >= 0) {
+ moduleSmartIVR.changeStatus('DisconnectedTTS');
+ } else if (visualErrorString.indexOf('ConnectionToCRMError') >= 0) {
+ moduleSmartIVR.changeStatus('Disconnected1C');
+ } else {
+ moduleSmartIVR.changeStatus('Disconnected');
+ }
+ } else {
+ moduleSmartIVR.changeStatus('Disconnected');
+ }
+ }
+ });
+ },
/**
* Применение настроек модуля после изменения данных формы
*/
- applyConfigurationChanges: function () {
- function applyConfigurationChanges() {
- $.api({
- url: "".concat(Config.pbxUrl, "/pbxcore/api/modules/ModuleSmartIVR/reload"),
- on: 'now',
- successTest: function () {
- function successTest(response) {
- return response !== undefined && Object.keys(response).length > 0 && response.result !== undefined && response.result === true;
- }
-
- return successTest;
- }(),
- onSuccess: function () {
- function onSuccess() {
- moduleSmartIVR.checkStatusToggle();
- }
-
- return onSuccess;
- }()
- });
- }
-
- return applyConfigurationChanges;
- }(),
- cbBeforeSendForm: function () {
- function cbBeforeSendForm(settings) {
- var result = settings;
- result.data = moduleSmartIVR.$formObj.form('get values');
- return result;
- }
-
- return cbBeforeSendForm;
- }(),
- cbAfterSendForm: function () {
- function cbAfterSendForm() {
- moduleSmartIVR.changeStatus('Disconnected');
- moduleSmartIVR.applyConfigurationChanges();
- }
-
- return cbAfterSendForm;
- }(),
- initializeForm: function () {
- function initializeForm() {
- Form.$formObj = moduleSmartIVR.$formObj;
- Form.url = "".concat(globalRootUrl, "module-smart-i-v-r/save");
- Form.validateRules = moduleSmartIVR.validateRules;
- Form.cbBeforeSendForm = moduleSmartIVR.cbBeforeSendForm;
- Form.cbAfterSendForm = moduleSmartIVR.cbAfterSendForm;
- Form.initialize();
- }
-
- return initializeForm;
- }(),
-
+ applyConfigurationChanges: function applyConfigurationChanges() {
+ $.api({
+ url: "".concat(Config.pbxUrl, "/pbxcore/api/modules/ModuleSmartIVR/reload"),
+ on: 'now',
+ successTest: function successTest(response) {
+ return response !== undefined && Object.keys(response).length > 0 && response.result !== undefined && response.result === true;
+ },
+ onSuccess: function onSuccess() {
+ moduleSmartIVR.checkStatusToggle();
+ }
+ });
+ },
+ cbBeforeSendForm: function cbBeforeSendForm(settings) {
+ var result = settings;
+ result.data = moduleSmartIVR.$formObj.form('get values');
+ return result;
+ },
+ cbAfterSendForm: function cbAfterSendForm() {
+ moduleSmartIVR.changeStatus('Disconnected');
+ moduleSmartIVR.applyConfigurationChanges();
+ },
+ initializeForm: function initializeForm() {
+ Form.$formObj = moduleSmartIVR.$formObj;
+ Form.url = "".concat(globalRootUrl, "module-smart-i-v-r/save");
+ Form.validateRules = moduleSmartIVR.validateRules;
+ Form.cbBeforeSendForm = moduleSmartIVR.cbBeforeSendForm;
+ Form.cbAfterSendForm = moduleSmartIVR.cbAfterSendForm;
+ Form.initialize();
+ },
/**
* Обновление статуса модуля
* @param status
*/
- changeStatus: function () {
- function changeStatus(status) {
- switch (status) {
- case 'Connected':
- moduleSmartIVR.$moduleStatus.removeClass('grey').removeClass('red').addClass('green');
- moduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_Connected);
- break;
-
- case 'Disconnected':
- moduleSmartIVR.$moduleStatus.removeClass('green').removeClass('red').addClass('grey');
- moduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_Disconnected);
- break;
-
- case 'Disconnected1C':
- moduleSmartIVR.$moduleStatus.removeClass('green').removeClass('grey').addClass('red');
- moduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_Disconnected1C);
- break;
-
- case 'DisconnectedTTS':
- moduleSmartIVR.$moduleStatus.removeClass('green').removeClass('grey').addClass('red');
- moduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_DisconnectedTTS);
- break;
-
- case 'Updating':
- moduleSmartIVR.$moduleStatus.removeClass('green').removeClass('red').addClass('grey');
- moduleSmartIVR.$moduleStatus.html("".concat(globalTranslate.module_smivr_UpdateStatus));
- break;
-
- default:
- moduleSmartIVR.$moduleStatus.removeClass('green').removeClass('red').addClass('grey');
- moduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_Disconnected);
- break;
- }
+ changeStatus: function changeStatus(status) {
+ switch (status) {
+ case 'Connected':
+ moduleSmartIVR.$moduleStatus.removeClass('grey').removeClass('red').addClass('green');
+ moduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_Connected);
+ break;
+ case 'Disconnected':
+ moduleSmartIVR.$moduleStatus.removeClass('green').removeClass('red').addClass('grey');
+ moduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_Disconnected);
+ break;
+ case 'Disconnected1C':
+ moduleSmartIVR.$moduleStatus.removeClass('green').removeClass('grey').addClass('red');
+ moduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_Disconnected1C);
+ break;
+ case 'DisconnectedTTS':
+ moduleSmartIVR.$moduleStatus.removeClass('green').removeClass('grey').addClass('red');
+ moduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_DisconnectedTTS);
+ break;
+ case 'Updating':
+ moduleSmartIVR.$moduleStatus.removeClass('green').removeClass('red').addClass('grey');
+ moduleSmartIVR.$moduleStatus.html("".concat(globalTranslate.module_smivr_UpdateStatus));
+ break;
+ default:
+ moduleSmartIVR.$moduleStatus.removeClass('green').removeClass('red').addClass('grey');
+ moduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_Disconnected);
+ break;
}
-
- return changeStatus;
- }()
+ }
};
$(document).ready(function () {
moduleSmartIVR.initialize();
});
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9tb2R1bGUtc21hcnRpdnItaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlU21hcnRJVlIiLCIkZm9ybU9iaiIsIiQiLCIkc3RhdHVzVG9nZ2xlIiwiJGZvcndhcmRpbmdTZWxlY3QiLCIkTGlicmFyeVNlbGVjdCIsIiRvbmx5Rmlyc3RHZW5lcmF0aW9uIiwiJG9ubHlTZWNvbmRHZW5lcmF0aW9uIiwiJG1vZHVsZVN0YXR1cyIsIiRkaXJydHlGaWVsZCIsIiRzdWJtaXRCdXR0b24iLCIkZGVidWdUb2dnbGUiLCJ2YWxpZGF0ZVJ1bGVzIiwibnVtYmVyX29mX3JlcGVhdCIsImlkZW50aWZpZXIiLCJydWxlcyIsInR5cGUiLCJwcm9tcHQiLCJnbG9iYWxUcmFuc2xhdGUiLCJtb2R1bGVfc21pdnJfVmFsaWRhdGVOdW1iZXJPZlJlcGVhdCIsInRpbWVPdXRFeHRlbnNpb24iLCJtb2R1bGVfc21pdnJfVmFsaWRhdGVUaW1lb3V0RXh0ZW5zaW9uIiwibW9kdWxlX3NtaXZyX1ZhbGlkYXRlVGltZU91dEV4dGVuc2lvbk5vdEVxdWFsVG8iLCJmYWlsT3ZlckV4dGVuc2lvbiIsIm1vZHVsZV9zbWl2cl9WYWxpZGF0ZUZhaWxPdmVyRXh0ZW5zaW9uIiwibW9kdWxlX3NtaXZyX1ZhbGlkYXRlRmFpbE92ZXJFeHRlbnNpb25Ob3RFcXVhbFRvIiwic2VydmVyMWNob3N0IiwiZGVwZW5kcyIsIm1vZHVsZV9zbWl2cl9WYWxpZGF0ZVNlcnZlcjFDSG9zdEVtcHR5Iiwic2VydmVyMWNwb3J0IiwibW9kdWxlX3NtaXZyX1ZhbGlkYXRlU2VydmVyMUNQb3J0UmFuZ2UiLCJkYXRhYmFzZSIsIm1vZHVsZV9zbWl2cl9WYWxpZGF0ZVB1Yk5hbWUiLCJpbml0aWFsaXplIiwiY2JDaGFuZ2VMaWJyYXJ5VHlwZSIsImNoZWNrU3RhdHVzVG9nZ2xlIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsImRyb3Bkb3duIiwiRXh0ZW5zaW9ucyIsImdldERyb3Bkb3duU2V0dGluZ3NXaXRob3V0RW1wdHkiLCJvbkNoYW5nZSIsImluaXRpYWxpemVGb3JtIiwiZm9ybSIsImhpZGUiLCJzaG93IiwidmFsIiwiTWF0aCIsInJhbmRvbSIsInRyaWdnZXIiLCJjaGVja2JveCIsImhhc0NsYXNzIiwiY2xpY2siLCJ0ZXN0Q29ubmVjdGlvbiIsImNoYW5nZVN0YXR1cyIsImZvcm1EYXRhIiwibW9kdWxlQ1RJMkluc3RhbGxlZCIsImlzUFQxQyIsInJlbW92ZSIsImFwaSIsInVybCIsIkNvbmZpZyIsInBieFVybCIsIm9uIiwidGltZW91dCIsInN1Y2Nlc3NUZXN0IiwicmVzcG9uc2UiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwicmVzdWx0Iiwib25TdWNjZXNzIiwib25SZXNwb25zZSIsIm1lc3NhZ2VzIiwidmlzdWFsRXJyb3JTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwicmVwbGFjZSIsImFmdGVyIiwib25GYWlsdXJlIiwiZGF0YSIsIkFycmF5IiwiaXNBcnJheSIsImVhY2giLCJpbmRleCIsInZhbHVlIiwiaW5kZXhPZiIsImFwcGx5Q29uZmlndXJhdGlvbkNoYW5nZXMiLCJjYkJlZm9yZVNlbmRGb3JtIiwic2V0dGluZ3MiLCJjYkFmdGVyU2VuZEZvcm0iLCJGb3JtIiwiZ2xvYmFsUm9vdFVybCIsInN0YXR1cyIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJodG1sIiwibW9kdWxlX3NtaXZyX0Nvbm5lY3RlZCIsIm1vZHVsZV9zbWl2cl9EaXNjb25uZWN0ZWQiLCJtb2R1bGVfc21pdnJfRGlzY29ubmVjdGVkMUMiLCJtb2R1bGVfc21pdnJfRGlzY29ubmVjdGVkVFRTIiwibW9kdWxlX3NtaXZyX1VwZGF0ZVN0YXR1cyIsImRvY3VtZW50IiwicmVhZHkiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7Ozs7QUFPQTtBQUNBLElBQU1BLGNBQWMsR0FBRztBQUN0QkMsRUFBQUEsUUFBUSxFQUFFQyxDQUFDLENBQUMsd0JBQUQsQ0FEVztBQUV0QkMsRUFBQUEsYUFBYSxFQUFFRCxDQUFDLENBQUMsdUJBQUQsQ0FGTTtBQUd0QkUsRUFBQUEsaUJBQWlCLEVBQUVGLENBQUMsQ0FBQyxvQkFBRCxDQUhFO0FBSXRCRyxFQUFBQSxjQUFjLEVBQUVILENBQUMsQ0FBQyxhQUFELENBSks7QUFLdEJJLEVBQUFBLG9CQUFvQixFQUFFSixDQUFDLENBQUMsd0JBQUQsQ0FMRDtBQU10QkssRUFBQUEscUJBQXFCLEVBQUVMLENBQUMsQ0FBQyx5QkFBRCxDQU5GO0FBT3RCTSxFQUFBQSxhQUFhLEVBQUVOLENBQUMsQ0FBQyxTQUFELENBUE07QUFRdEJPLEVBQUFBLFlBQVksRUFBRSxJQVJRO0FBU3RCQyxFQUFBQSxhQUFhLEVBQUVSLENBQUMsQ0FBQyxlQUFELENBVE07QUFVdEJTLEVBQUFBLFlBQVksRUFBRVQsQ0FBQyxDQUFDLG9CQUFELENBVk87QUFZdEJVLEVBQUFBLGFBQWEsRUFBRTtBQUNkQyxJQUFBQSxnQkFBZ0IsRUFBRTtBQUNqQkMsTUFBQUEsVUFBVSxFQUFFLGtCQURLO0FBRWpCQyxNQUFBQSxLQUFLLEVBQUUsQ0FDTjtBQUNDQyxRQUFBQSxJQUFJLEVBQUUsZ0JBRFA7QUFFQ0MsUUFBQUEsTUFBTSxFQUFFQyxlQUFlLENBQUNDO0FBRnpCLE9BRE07QUFGVSxLQURKO0FBVWRDLElBQUFBLGdCQUFnQixFQUFFO0FBQ2pCTixNQUFBQSxVQUFVLEVBQUUsbUJBREs7QUFFakJDLE1BQUFBLEtBQUssRUFBRSxDQUNOO0FBQ0NDLFFBQUFBLElBQUksRUFBRSxPQURQO0FBRUNDLFFBQUFBLE1BQU0sRUFBRUMsZUFBZSxDQUFDRztBQUZ6QixPQURNLEVBS047QUFDQ0wsUUFBQUEsSUFBSSx3QkFETDtBQUVDQyxRQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQ0k7QUFGekIsT0FMTTtBQUZVLEtBVko7QUF1QmRDLElBQUFBLGlCQUFpQixFQUFFO0FBQ2xCVCxNQUFBQSxVQUFVLEVBQUUsb0JBRE07QUFFbEJDLE1BQUFBLEtBQUssRUFBRSxDQUNOO0FBQ0NDLFFBQUFBLElBQUksRUFBRSxPQURQO0FBRUNDLFFBQUFBLE1BQU0sRUFBRUMsZUFBZSxDQUFDTTtBQUZ6QixPQURNLEVBS047QUFDQ1IsUUFBQUEsSUFBSSx3QkFETDtBQUVDQyxRQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQ087QUFGekIsT0FMTTtBQUZXLEtBdkJMO0FBb0NkQyxJQUFBQSxZQUFZLEVBQUU7QUFDYlosTUFBQUEsVUFBVSxFQUFFLGNBREM7QUFFYmEsTUFBQUEsT0FBTyxFQUFFLFFBRkk7QUFHYlosTUFBQUEsS0FBSyxFQUFFLENBQ047QUFDQ0MsUUFBQUEsSUFBSSxFQUFFLE9BRFA7QUFFQ0MsUUFBQUEsTUFBTSxFQUFFQyxlQUFlLENBQUNVO0FBRnpCLE9BRE07QUFITSxLQXBDQTtBQThDZEMsSUFBQUEsWUFBWSxFQUFFO0FBQ2JmLE1BQUFBLFVBQVUsRUFBRSxjQURDO0FBRWJhLE1BQUFBLE9BQU8sRUFBRSxRQUZJO0FBR2JaLE1BQUFBLEtBQUssRUFBRSxDQUNOO0FBQ0NDLFFBQUFBLElBQUksRUFBRSxtQkFEUDtBQUVDQyxRQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQ1k7QUFGekIsT0FETTtBQUhNLEtBOUNBO0FBd0RkQyxJQUFBQSxRQUFRLEVBQUU7QUFDVGpCLE1BQUFBLFVBQVUsRUFBRSxVQURIO0FBRVRhLE1BQUFBLE9BQU8sRUFBRSxRQUZBO0FBR1RaLE1BQUFBLEtBQUssRUFBRSxDQUNOO0FBQ0NDLFFBQUFBLElBQUksRUFBRSxPQURQO0FBRUNDLFFBQUFBLE1BQU0sRUFBRUMsZUFBZSxDQUFDYztBQUZ6QixPQURNO0FBSEU7QUF4REksR0FaTztBQStFdEJDLEVBQUFBLFVBL0VzQjtBQUFBLDBCQStFVDtBQUNaakMsTUFBQUEsY0FBYyxDQUFDa0MsbUJBQWY7QUFDQWxDLE1BQUFBLGNBQWMsQ0FBQ21DLGlCQUFmO0FBQ0FDLE1BQUFBLE1BQU0sQ0FBQ0MsZ0JBQVAsQ0FBd0IscUJBQXhCLEVBQStDckMsY0FBYyxDQUFDbUMsaUJBQTlEO0FBQ0FuQyxNQUFBQSxjQUFjLENBQUNJLGlCQUFmLENBQWlDa0MsUUFBakMsQ0FBMENDLFVBQVUsQ0FBQ0MsK0JBQVgsRUFBMUM7QUFDQXhDLE1BQUFBLGNBQWMsQ0FBQ0ssY0FBZixDQUE4QmlDLFFBQTlCLENBQXVDO0FBQUNHLFFBQUFBLFFBQVEsRUFBRXpDLGNBQWMsQ0FBQ2tDO0FBQTFCLE9BQXZDO0FBQ0FsQyxNQUFBQSxjQUFjLENBQUMwQyxjQUFmO0FBQ0E7O0FBdEZxQjtBQUFBOztBQXVGdEI7OztBQUdBUixFQUFBQSxtQkExRnNCO0FBQUEsbUNBMEZBO0FBQ3JCLFVBQUlsQyxjQUFjLENBQUNDLFFBQWYsQ0FBd0IwQyxJQUF4QixDQUE2QixXQUE3QixFQUEwQyxZQUExQyxNQUE0RCxLQUFoRSxFQUF1RTtBQUN0RTNDLFFBQUFBLGNBQWMsQ0FBQ00sb0JBQWYsQ0FBb0NzQyxJQUFwQztBQUNBNUMsUUFBQUEsY0FBYyxDQUFDTyxxQkFBZixDQUFxQ3NDLElBQXJDO0FBQ0E3QyxRQUFBQSxjQUFjLENBQUNDLFFBQWYsQ0FBd0IwQyxJQUF4QixDQUE2QixXQUE3QixFQUEwQyxRQUExQyxFQUFvRCxFQUFwRDtBQUVBLE9BTEQsTUFLTztBQUNOM0MsUUFBQUEsY0FBYyxDQUFDTyxxQkFBZixDQUFxQ3FDLElBQXJDO0FBQ0E1QyxRQUFBQSxjQUFjLENBQUNNLG9CQUFmLENBQW9DdUMsSUFBcEM7QUFDQTdDLFFBQUFBLGNBQWMsQ0FBQ0MsUUFBZixDQUF3QjBDLElBQXhCLENBQTZCLFdBQTdCLEVBQTBDLFFBQTFDLEVBQW9ELElBQXBEO0FBQ0E7O0FBQ0QsVUFBSTNDLGNBQWMsQ0FBQ1MsWUFBZixLQUE4QixJQUFsQyxFQUF1QztBQUN0Q1QsUUFBQUEsY0FBYyxDQUFDUyxZQUFmLEdBQTRCUCxDQUFDLENBQUMsU0FBRCxDQUE3QjtBQUNBLE9BRkQsTUFFTztBQUNORixRQUFBQSxjQUFjLENBQUNTLFlBQWYsQ0FBNEJxQyxHQUE1QixDQUFnQ0MsSUFBSSxDQUFDQyxNQUFMLEVBQWhDO0FBQ0FoRCxRQUFBQSxjQUFjLENBQUNTLFlBQWYsQ0FBNEJ3QyxPQUE1QixDQUFvQyxRQUFwQztBQUNBO0FBRUQ7O0FBNUdxQjtBQUFBOztBQThHdEI7OztBQUdBZCxFQUFBQSxpQkFqSHNCO0FBQUEsaUNBaUhGO0FBQ25CLFVBQUluQyxjQUFjLENBQUNHLGFBQWYsQ0FBNkIrQyxRQUE3QixDQUFzQyxZQUF0QyxDQUFKLEVBQXlEO0FBQ3hELFlBQUksQ0FBQ2xELGNBQWMsQ0FBQ1UsYUFBZixDQUE2QnlDLFFBQTdCLENBQXNDLFVBQXRDLENBQUwsRUFBd0Q7QUFDdkRuRCxVQUFBQSxjQUFjLENBQUNVLGFBQWYsQ0FBNkIwQyxLQUE3QjtBQUNBOztBQUNEcEQsUUFBQUEsY0FBYyxDQUFDcUQsY0FBZjtBQUNBLE9BTEQsTUFLTztBQUNOckQsUUFBQUEsY0FBYyxDQUFDc0QsWUFBZixDQUE0QixjQUE1QjtBQUNBO0FBQ0Q7O0FBMUhxQjtBQUFBOztBQTJIdEI7OztBQUdBRCxFQUFBQSxjQTlIc0I7QUFBQSw4QkE4SEw7QUFDaEIsVUFBSSxDQUFFckQsY0FBYyxDQUFDQyxRQUFmLENBQXdCMEMsSUFBeEIsQ0FBNkIsVUFBN0IsQ0FBTixFQUFpRDtBQUNoRDtBQUNBOztBQUNELFVBQU1ZLFFBQVEsR0FBR3ZELGNBQWMsQ0FBQ0MsUUFBZixDQUF3QjBDLElBQXhCLENBQTZCLFlBQTdCLENBQWpCOztBQUNBLFVBQUlZLFFBQVEsQ0FBQ0MsbUJBQVQsS0FBK0IsRUFBL0IsSUFDQUQsUUFBUSxDQUFDRSxNQUFULEtBQWtCLE9BRHRCLEVBQzhCO0FBQzdCO0FBQ0E7O0FBQ0R6RCxNQUFBQSxjQUFjLENBQUNzRCxZQUFmLENBQTRCLFVBQTVCO0FBQ0FwRCxNQUFBQSxDQUFDLENBQUMscUJBQUQsQ0FBRCxDQUF5QndELE1BQXpCO0FBQ0F4RCxNQUFBQSxDQUFDLENBQUN5RCxHQUFGLENBQU07QUFDTEMsUUFBQUEsR0FBRyxZQUFLQyxNQUFNLENBQUNDLE1BQVosOENBREU7QUFFTEMsUUFBQUEsRUFBRSxFQUFFLEtBRkM7QUFHTEMsUUFBQUEsT0FBTyxFQUFFLEtBSEo7QUFJTEMsUUFBQUEsV0FKSztBQUFBLCtCQUlPQyxRQUpQLEVBSWlCO0FBQ3JCLG1CQUFPQSxRQUFRLEtBQUtDLFNBQWIsSUFDSEMsTUFBTSxDQUFDQyxJQUFQLENBQVlILFFBQVosRUFBc0JJLE1BQXRCLEdBQStCLENBRDVCLElBRUhKLFFBQVEsQ0FBQ0ssTUFBVCxLQUFvQkosU0FGakIsSUFHSEQsUUFBUSxDQUFDSyxNQUFULEtBQW9CLElBSHhCO0FBSUE7O0FBVEk7QUFBQTtBQVVMQyxRQUFBQSxTQVZLO0FBQUEsK0JBVU87QUFDWHhFLFlBQUFBLGNBQWMsQ0FBQ3NELFlBQWYsQ0FBNEIsV0FBNUI7QUFDQTs7QUFaSTtBQUFBO0FBYUxtQixRQUFBQSxVQWJLO0FBQUEsOEJBYU1QLFFBYk4sRUFhZ0I7QUFDcEJoRSxZQUFBQSxDQUFDLENBQUMscUJBQUQsQ0FBRCxDQUF5QndELE1BQXpCLEdBRG9CLENBRXBCOztBQUNBLGdCQUFJMUQsY0FBYyxDQUFDVyxZQUFmLENBQTRCdUMsUUFBNUIsQ0FBcUMsWUFBckMsS0FDQWxELGNBQWMsQ0FBQ1UsYUFBZixDQUE2QnlDLFFBQTdCLENBQXNDLFVBQXRDLENBREEsSUFFQSxPQUFRZSxRQUFRLENBQUNRLFFBQWpCLEtBQStCLFdBRm5DLEVBR0U7QUFDRCxrQkFBSUMsaUJBQWlCLEdBQUdDLElBQUksQ0FBQ0MsU0FBTCxDQUFlWCxRQUFRLENBQUNRLFFBQXhCLEVBQWtDLElBQWxDLEVBQXdDLENBQXhDLENBQXhCOztBQUVBLGtCQUFJLE9BQU9DLGlCQUFQLEtBQTZCLFFBQTdCLElBQXlDQSxpQkFBaUIsS0FBRyxJQUFqRSxFQUF1RTtBQUN0RUEsZ0JBQUFBLGlCQUFpQixHQUFHQSxpQkFBaUIsQ0FBQ0csT0FBbEIsQ0FBMEIsTUFBMUIsRUFBa0MsT0FBbEMsQ0FBcEI7O0FBRUEsb0JBQUlWLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZSCxRQUFaLEVBQXNCSSxNQUF0QixHQUErQixDQUEvQixJQUFvQ0osUUFBUSxDQUFDSyxNQUFULEtBQW9CLElBQTVELEVBQWtFO0FBQ2pFdkUsa0JBQUFBLGNBQWMsQ0FBQ0MsUUFBZixDQUNFOEUsS0FERixtSEFFdUNKLGlCQUZ2QztBQUlBLGlCQUxELE1BS087QUFDTjNFLGtCQUFBQSxjQUFjLENBQUNDLFFBQWYsQ0FDRThFLEtBREYsNkdBRXVDSixpQkFGdkM7QUFJQTtBQUNEO0FBQ0Q7QUFDRDs7QUF0Q0k7QUFBQTtBQXVDTEssUUFBQUEsU0F2Q0s7QUFBQSw2QkF1Q0tkLFFBdkNMLEVBdUNlO0FBQ25CLGdCQUFJQSxRQUFRLEtBQUtDLFNBQWIsSUFDQUMsTUFBTSxDQUFDQyxJQUFQLENBQVlILFFBQVosRUFBc0JJLE1BQXRCLEdBQStCLENBRC9CLElBRUFKLFFBQVEsQ0FBQ0ssTUFBVCxLQUFvQkosU0FGcEIsSUFHQUQsUUFBUSxDQUFDSyxNQUFULEtBQW9CLEtBSHBCLElBSUEsT0FBUUwsUUFBUSxDQUFDZSxJQUFqQixLQUEyQixXQUovQixFQUtFO0FBQ0Qsa0JBQUlOLGlCQUFpQixHQUFHLEVBQXhCOztBQUNBLGtCQUFJLE9BQVFULFFBQVEsQ0FBQ1EsUUFBakIsS0FBK0IsUUFBbkMsRUFBNkM7QUFDNUNDLGdCQUFBQSxpQkFBaUIsR0FBR1QsUUFBUSxDQUFDUSxRQUE3QjtBQUNBLGVBRkQsTUFFTyxJQUFJUSxLQUFLLENBQUNDLE9BQU4sQ0FBY2pCLFFBQVEsQ0FBQ1EsUUFBdkIsQ0FBSixFQUFzQztBQUM1Q3hFLGdCQUFBQSxDQUFDLENBQUNrRixJQUFGLENBQU9sQixRQUFRLENBQUNRLFFBQWhCLEVBQTBCLFVBQUNXLEtBQUQsRUFBUUMsS0FBUixFQUFrQjtBQUMzQ1gsa0JBQUFBLGlCQUFpQixjQUFPVyxLQUFQLFVBQWpCO0FBQ0EsaUJBRkQ7QUFHQSxlQUpNLE1BSUE7QUFDTlgsZ0JBQUFBLGlCQUFpQixHQUFHQyxJQUFJLENBQUNDLFNBQUwsQ0FBZVgsUUFBUSxDQUFDZSxJQUF4QixFQUE4QixJQUE5QixFQUFvQyxJQUFwQyxDQUFwQjtBQUNBOztBQUNELGtCQUFJTixpQkFBaUIsQ0FBQ1ksT0FBbEIsQ0FBMEIsb0JBQTFCLEtBQW1ELENBQXZELEVBQTBEO0FBQ3pEdkYsZ0JBQUFBLGNBQWMsQ0FBQ3NELFlBQWYsQ0FBNEIsaUJBQTVCO0FBQ0EsZUFGRCxNQUVPLElBQUlxQixpQkFBaUIsQ0FBQ1ksT0FBbEIsQ0FBMEIsc0JBQTFCLEtBQXFELENBQXpELEVBQTREO0FBQ2xFdkYsZ0JBQUFBLGNBQWMsQ0FBQ3NELFlBQWYsQ0FBNEIsZ0JBQTVCO0FBQ0EsZUFGTSxNQUVBO0FBQ050RCxnQkFBQUEsY0FBYyxDQUFDc0QsWUFBZixDQUE0QixjQUE1QjtBQUNBO0FBQ0QsYUF2QkQsTUF1Qk87QUFDTnRELGNBQUFBLGNBQWMsQ0FBQ3NELFlBQWYsQ0FBNEIsY0FBNUI7QUFDQTtBQUNEOztBQWxFSTtBQUFBO0FBQUEsT0FBTjtBQW9FQTs7QUE3TXFCO0FBQUE7O0FBOE10Qjs7O0FBR0FrQyxFQUFBQSx5QkFqTnNCO0FBQUEseUNBaU5NO0FBQzNCdEYsTUFBQUEsQ0FBQyxDQUFDeUQsR0FBRixDQUFNO0FBQ0xDLFFBQUFBLEdBQUcsWUFBS0MsTUFBTSxDQUFDQyxNQUFaLCtDQURFO0FBRUxDLFFBQUFBLEVBQUUsRUFBRSxLQUZDO0FBR0xFLFFBQUFBLFdBSEs7QUFBQSwrQkFHT0MsUUFIUCxFQUdpQjtBQUNyQixtQkFBT0EsUUFBUSxLQUFLQyxTQUFiLElBQ0hDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZSCxRQUFaLEVBQXNCSSxNQUF0QixHQUErQixDQUQ1QixJQUVISixRQUFRLENBQUNLLE1BQVQsS0FBb0JKLFNBRmpCLElBR0hELFFBQVEsQ0FBQ0ssTUFBVCxLQUFvQixJQUh4QjtBQUlBOztBQVJJO0FBQUE7QUFTTEMsUUFBQUEsU0FUSztBQUFBLCtCQVNPO0FBQ1h4RSxZQUFBQSxjQUFjLENBQUNtQyxpQkFBZjtBQUNBOztBQVhJO0FBQUE7QUFBQSxPQUFOO0FBYUE7O0FBL05xQjtBQUFBO0FBZ090QnNELEVBQUFBLGdCQWhPc0I7QUFBQSw4QkFnT0xDLFFBaE9LLEVBZ09LO0FBQzFCLFVBQU1uQixNQUFNLEdBQUdtQixRQUFmO0FBQ0FuQixNQUFBQSxNQUFNLENBQUNVLElBQVAsR0FBY2pGLGNBQWMsQ0FBQ0MsUUFBZixDQUF3QjBDLElBQXhCLENBQTZCLFlBQTdCLENBQWQ7QUFDQSxhQUFPNEIsTUFBUDtBQUNBOztBQXBPcUI7QUFBQTtBQXFPdEJvQixFQUFBQSxlQXJPc0I7QUFBQSwrQkFxT0o7QUFDakIzRixNQUFBQSxjQUFjLENBQUNzRCxZQUFmLENBQTRCLGNBQTVCO0FBQ0F0RCxNQUFBQSxjQUFjLENBQUN3Rix5QkFBZjtBQUNBOztBQXhPcUI7QUFBQTtBQXlPdEI5QyxFQUFBQSxjQXpPc0I7QUFBQSw4QkF5T0w7QUFDaEJrRCxNQUFBQSxJQUFJLENBQUMzRixRQUFMLEdBQWdCRCxjQUFjLENBQUNDLFFBQS9CO0FBQ0EyRixNQUFBQSxJQUFJLENBQUNoQyxHQUFMLGFBQWNpQyxhQUFkO0FBQ0FELE1BQUFBLElBQUksQ0FBQ2hGLGFBQUwsR0FBcUJaLGNBQWMsQ0FBQ1ksYUFBcEM7QUFDQWdGLE1BQUFBLElBQUksQ0FBQ0gsZ0JBQUwsR0FBd0J6RixjQUFjLENBQUN5RixnQkFBdkM7QUFDQUcsTUFBQUEsSUFBSSxDQUFDRCxlQUFMLEdBQXVCM0YsY0FBYyxDQUFDMkYsZUFBdEM7QUFDQUMsTUFBQUEsSUFBSSxDQUFDM0QsVUFBTDtBQUNBOztBQWhQcUI7QUFBQTs7QUFpUHRCOzs7O0FBSUFxQixFQUFBQSxZQXJQc0I7QUFBQSwwQkFxUFR3QyxNQXJQUyxFQXFQRDtBQUNwQixjQUFRQSxNQUFSO0FBQ0MsYUFBSyxXQUFMO0FBQ0M5RixVQUFBQSxjQUFjLENBQUNRLGFBQWYsQ0FDRXVGLFdBREYsQ0FDYyxNQURkLEVBRUVBLFdBRkYsQ0FFYyxLQUZkLEVBR0VDLFFBSEYsQ0FHVyxPQUhYO0FBSUFoRyxVQUFBQSxjQUFjLENBQUNRLGFBQWYsQ0FBNkJ5RixJQUE3QixDQUFrQy9FLGVBQWUsQ0FBQ2dGLHNCQUFsRDtBQUNBOztBQUNELGFBQUssY0FBTDtBQUNDbEcsVUFBQUEsY0FBYyxDQUFDUSxhQUFmLENBQ0V1RixXQURGLENBQ2MsT0FEZCxFQUVFQSxXQUZGLENBRWMsS0FGZCxFQUdFQyxRQUhGLENBR1csTUFIWDtBQUlBaEcsVUFBQUEsY0FBYyxDQUFDUSxhQUFmLENBQTZCeUYsSUFBN0IsQ0FBa0MvRSxlQUFlLENBQUNpRix5QkFBbEQ7QUFDQTs7QUFDRCxhQUFLLGdCQUFMO0FBQ0NuRyxVQUFBQSxjQUFjLENBQUNRLGFBQWYsQ0FDRXVGLFdBREYsQ0FDYyxPQURkLEVBRUVBLFdBRkYsQ0FFYyxNQUZkLEVBR0VDLFFBSEYsQ0FHVyxLQUhYO0FBSUFoRyxVQUFBQSxjQUFjLENBQUNRLGFBQWYsQ0FBNkJ5RixJQUE3QixDQUFrQy9FLGVBQWUsQ0FBQ2tGLDJCQUFsRDtBQUNBOztBQUNELGFBQUssaUJBQUw7QUFDQ3BHLFVBQUFBLGNBQWMsQ0FBQ1EsYUFBZixDQUNFdUYsV0FERixDQUNjLE9BRGQsRUFFRUEsV0FGRixDQUVjLE1BRmQsRUFHRUMsUUFIRixDQUdXLEtBSFg7QUFJQWhHLFVBQUFBLGNBQWMsQ0FBQ1EsYUFBZixDQUE2QnlGLElBQTdCLENBQWtDL0UsZUFBZSxDQUFDbUYsNEJBQWxEO0FBQ0E7O0FBQ0QsYUFBSyxVQUFMO0FBQ0NyRyxVQUFBQSxjQUFjLENBQUNRLGFBQWYsQ0FDRXVGLFdBREYsQ0FDYyxPQURkLEVBRUVBLFdBRkYsQ0FFYyxLQUZkLEVBR0VDLFFBSEYsQ0FHVyxNQUhYO0FBSUFoRyxVQUFBQSxjQUFjLENBQUNRLGFBQWYsQ0FBNkJ5RixJQUE3QixpREFBeUUvRSxlQUFlLENBQUNvRix5QkFBekY7QUFDQTs7QUFDRDtBQUNDdEcsVUFBQUEsY0FBYyxDQUFDUSxhQUFmLENBQ0V1RixXQURGLENBQ2MsT0FEZCxFQUVFQSxXQUZGLENBRWMsS0FGZCxFQUdFQyxRQUhGLENBR1csTUFIWDtBQUlBaEcsVUFBQUEsY0FBYyxDQUFDUSxhQUFmLENBQTZCeUYsSUFBN0IsQ0FBa0MvRSxlQUFlLENBQUNpRix5QkFBbEQ7QUFDQTtBQTFDRjtBQTRDQTs7QUFsU3FCO0FBQUE7QUFBQSxDQUF2QjtBQXFTQWpHLENBQUMsQ0FBQ3FHLFFBQUQsQ0FBRCxDQUFZQyxLQUFaLENBQWtCLFlBQU07QUFDdkJ4RyxFQUFBQSxjQUFjLENBQUNpQyxVQUFmO0FBQ0EsQ0FGRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgwqkgTUlLTyBMTEMgLSBBbGwgUmlnaHRzIFJlc2VydmVkXG4gKiBVbmF1dGhvcml6ZWQgY29weWluZyBvZiB0aGlzIGZpbGUsIHZpYSBhbnkgbWVkaXVtIGlzIHN0cmljdGx5IHByb2hpYml0ZWRcbiAqIFByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWxcbiAqIFdyaXR0ZW4gYnkgQWxleGV5IFBvcnRub3YsIDIgMjAxOVxuICovXG5cbi8qIGdsb2JhbCBnbG9iYWxSb290VXJsLGdsb2JhbFRyYW5zbGF0ZSwgRXh0ZW5zaW9ucywgRm9ybSwgQ29uZmlnLCBVc2VyTWVzc2FnZSAqL1xuY29uc3QgbW9kdWxlU21hcnRJVlIgPSB7XG5cdCRmb3JtT2JqOiAkKCcjbW9kdWxlLXNtYXJ0LWl2ci1mb3JtJyksXG5cdCRzdGF0dXNUb2dnbGU6ICQoJyNtb2R1bGUtc3RhdHVzLXRvZ2dsZScpLFxuXHQkZm9yd2FyZGluZ1NlbGVjdDogJCgnLmZvcndhcmRpbmctc2VsZWN0JyksXG5cdCRMaWJyYXJ5U2VsZWN0OiAkKCcjbGlicmFyeV8xYycpLFxuXHQkb25seUZpcnN0R2VuZXJhdGlvbjogJCgnLm9ubHktZmlyc3QtZ2VuZXJhdGlvbicpLFxuXHQkb25seVNlY29uZEdlbmVyYXRpb246ICQoJy5vbmx5LXNlY29uZC1nZW5lcmF0aW9uJyksXG5cdCRtb2R1bGVTdGF0dXM6ICQoJyNzdGF0dXMnKSxcblx0JGRpcnJ0eUZpZWxkOiBudWxsLFxuXHQkc3VibWl0QnV0dG9uOiAkKCcjc3VibWl0YnV0dG9uJyksXG5cdCRkZWJ1Z1RvZ2dsZTogJCgnI2RlYnVnLW1vZGUtdG9nZ2xlJyksXG5cblx0dmFsaWRhdGVSdWxlczoge1xuXHRcdG51bWJlcl9vZl9yZXBlYXQ6IHtcblx0XHRcdGlkZW50aWZpZXI6ICdudW1iZXJfb2ZfcmVwZWF0Jyxcblx0XHRcdHJ1bGVzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAnaW50ZWdlclsxLi4xMF0nLFxuXHRcdFx0XHRcdHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLm1vZHVsZV9zbWl2cl9WYWxpZGF0ZU51bWJlck9mUmVwZWF0LFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHRpbWVPdXRFeHRlbnNpb246IHtcblx0XHRcdGlkZW50aWZpZXI6ICd0aW1lb3V0X2V4dGVuc2lvbicsXG5cdFx0XHRydWxlczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ2VtcHR5Jyxcblx0XHRcdFx0XHRwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5tb2R1bGVfc21pdnJfVmFsaWRhdGVUaW1lb3V0RXh0ZW5zaW9uLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogYGRpZmZlcmVudFtleHRlbnNpb25dYCxcblx0XHRcdFx0XHRwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5tb2R1bGVfc21pdnJfVmFsaWRhdGVUaW1lT3V0RXh0ZW5zaW9uTm90RXF1YWxUbyxcblx0XHRcdFx0fVxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdGZhaWxPdmVyRXh0ZW5zaW9uOiB7XG5cdFx0XHRpZGVudGlmaWVyOiAnZmFpbG92ZXJfZXh0ZW5zaW9uJyxcblx0XHRcdHJ1bGVzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiAnZW1wdHknLFxuXHRcdFx0XHRcdHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLm1vZHVsZV9zbWl2cl9WYWxpZGF0ZUZhaWxPdmVyRXh0ZW5zaW9uLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogYGRpZmZlcmVudFtleHRlbnNpb25dYCxcblx0XHRcdFx0XHRwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5tb2R1bGVfc21pdnJfVmFsaWRhdGVGYWlsT3ZlckV4dGVuc2lvbk5vdEVxdWFsVG8sXG5cdFx0XHRcdH1cblx0XHRcdF0sXG5cdFx0fSxcblx0XHRzZXJ2ZXIxY2hvc3Q6IHtcblx0XHRcdGlkZW50aWZpZXI6ICdzZXJ2ZXIxY2hvc3QnLFxuXHRcdFx0ZGVwZW5kczogJ2lzUFQxQycsXG5cdFx0XHRydWxlczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ2VtcHR5Jyxcblx0XHRcdFx0XHRwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5tb2R1bGVfc21pdnJfVmFsaWRhdGVTZXJ2ZXIxQ0hvc3RFbXB0eSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHRzZXJ2ZXIxY3BvcnQ6IHtcblx0XHRcdGlkZW50aWZpZXI6ICdzZXJ2ZXIxY3BvcnQnLFxuXHRcdFx0ZGVwZW5kczogJ2lzUFQxQycsXG5cdFx0XHRydWxlczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ2ludGVnZXJbMC4uNjU1MzVdJyxcblx0XHRcdFx0XHRwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5tb2R1bGVfc21pdnJfVmFsaWRhdGVTZXJ2ZXIxQ1BvcnRSYW5nZSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHRkYXRhYmFzZToge1xuXHRcdFx0aWRlbnRpZmllcjogJ2RhdGFiYXNlJyxcblx0XHRcdGRlcGVuZHM6ICdpc1BUMUMnLFxuXHRcdFx0cnVsZXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGU6ICdlbXB0eScsXG5cdFx0XHRcdFx0cHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUubW9kdWxlX3NtaXZyX1ZhbGlkYXRlUHViTmFtZSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fVxuXHR9LFxuXHRpbml0aWFsaXplKCkge1xuXHRcdG1vZHVsZVNtYXJ0SVZSLmNiQ2hhbmdlTGlicmFyeVR5cGUoKTtcblx0XHRtb2R1bGVTbWFydElWUi5jaGVja1N0YXR1c1RvZ2dsZSgpO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdNb2R1bGVTdGF0dXNDaGFuZ2VkJywgbW9kdWxlU21hcnRJVlIuY2hlY2tTdGF0dXNUb2dnbGUpO1xuXHRcdG1vZHVsZVNtYXJ0SVZSLiRmb3J3YXJkaW5nU2VsZWN0LmRyb3Bkb3duKEV4dGVuc2lvbnMuZ2V0RHJvcGRvd25TZXR0aW5nc1dpdGhvdXRFbXB0eSgpKTtcblx0XHRtb2R1bGVTbWFydElWUi4kTGlicmFyeVNlbGVjdC5kcm9wZG93bih7b25DaGFuZ2U6IG1vZHVsZVNtYXJ0SVZSLmNiQ2hhbmdlTGlicmFyeVR5cGV9KTtcblx0XHRtb2R1bGVTbWFydElWUi5pbml0aWFsaXplRm9ybSgpO1xuXHR9LFxuXHQvKipcblx0ICog0JjQt9C80LXQvdC10L3QuNC1INCy0LXRgNGB0LjQuCDQsdC40LHQu9C40L7RgtC10LrQuFxuXHQgKi9cblx0Y2JDaGFuZ2VMaWJyYXJ5VHlwZSgpIHtcblx0XHRpZiAobW9kdWxlU21hcnRJVlIuJGZvcm1PYmouZm9ybSgnZ2V0IHZhbHVlJywgJ2xpYnJhcnlfMWMnKSA9PT0gJzIuMCcpIHtcblx0XHRcdG1vZHVsZVNtYXJ0SVZSLiRvbmx5Rmlyc3RHZW5lcmF0aW9uLmhpZGUoKTtcblx0XHRcdG1vZHVsZVNtYXJ0SVZSLiRvbmx5U2Vjb25kR2VuZXJhdGlvbi5zaG93KCk7XG5cdFx0XHRtb2R1bGVTbWFydElWUi4kZm9ybU9iai5mb3JtKCdzZXQgdmFsdWUnLCAnaXNQVDFDJywgJycpO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1vZHVsZVNtYXJ0SVZSLiRvbmx5U2Vjb25kR2VuZXJhdGlvbi5oaWRlKCk7XG5cdFx0XHRtb2R1bGVTbWFydElWUi4kb25seUZpcnN0R2VuZXJhdGlvbi5zaG93KCk7XG5cdFx0XHRtb2R1bGVTbWFydElWUi4kZm9ybU9iai5mb3JtKCdzZXQgdmFsdWUnLCAnaXNQVDFDJywgdHJ1ZSk7XG5cdFx0fVxuXHRcdGlmIChtb2R1bGVTbWFydElWUi4kZGlycnR5RmllbGQ9PT1udWxsKXtcblx0XHRcdG1vZHVsZVNtYXJ0SVZSLiRkaXJydHlGaWVsZD0kKCcjZGlycnR5Jyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1vZHVsZVNtYXJ0SVZSLiRkaXJydHlGaWVsZC52YWwoTWF0aC5yYW5kb20oKSk7XG5cdFx0XHRtb2R1bGVTbWFydElWUi4kZGlycnR5RmllbGQudHJpZ2dlcignY2hhbmdlJyk7XG5cdFx0fVxuXG5cdH1cblx0LFxuXHQvKipcblx0ICog0JjQt9C80LXQvdC10L3QuNC1INGB0YLQsNGC0YPRgdCwINC60L3QvtC/0L7QuiDQv9GA0Lgg0LjQt9C80LXQvdC10L3QuNC4INGB0YLQsNGC0YPRgdCwINC80L7QtNGD0LvRj1xuXHQgKi9cblx0Y2hlY2tTdGF0dXNUb2dnbGUoKSB7XG5cdFx0aWYgKG1vZHVsZVNtYXJ0SVZSLiRzdGF0dXNUb2dnbGUuY2hlY2tib3goJ2lzIGNoZWNrZWQnKSkge1xuXHRcdFx0aWYgKCFtb2R1bGVTbWFydElWUi4kc3VibWl0QnV0dG9uLmhhc0NsYXNzKCdkaXNhYmxlZCcpKSB7XG5cdFx0XHRcdG1vZHVsZVNtYXJ0SVZSLiRzdWJtaXRCdXR0b24uY2xpY2soKTtcblx0XHRcdH1cblx0XHRcdG1vZHVsZVNtYXJ0SVZSLnRlc3RDb25uZWN0aW9uKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1vZHVsZVNtYXJ0SVZSLmNoYW5nZVN0YXR1cygnRGlzY29ubmVjdGVkJyk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICog0KLQtdGB0YLQuNGA0L7QstCw0L3QuNC1INGB0L7QtdC00LjQvdC10L3QuNGPINGBIDHQoVxuXHQgKi9cblx0dGVzdENvbm5lY3Rpb24oKSB7XG5cdFx0aWYgKCEobW9kdWxlU21hcnRJVlIuJGZvcm1PYmouZm9ybSgnaXMgdmFsaWQnKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZm9ybURhdGEgPSBtb2R1bGVTbWFydElWUi4kZm9ybU9iai5mb3JtKCdnZXQgdmFsdWVzJyk7XG5cdFx0aWYgKGZvcm1EYXRhLm1vZHVsZUNUSTJJbnN0YWxsZWQ9PT0nJ1xuXHRcdFx0JiYgZm9ybURhdGEuaXNQVDFDPT09J2ZhbHNlJyl7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdG1vZHVsZVNtYXJ0SVZSLmNoYW5nZVN0YXR1cygnVXBkYXRpbmcnKTtcblx0XHQkKCcubWVzc2FnZS5hamF4LmRlYnVnJykucmVtb3ZlKCk7XG5cdFx0JC5hcGkoe1xuXHRcdFx0dXJsOiBgJHtDb25maWcucGJ4VXJsfS9wYnhjb3JlL2FwaS9tb2R1bGVzL01vZHVsZVNtYXJ0SVZSL2NoZWNrYCxcblx0XHRcdG9uOiAnbm93Jyxcblx0XHRcdHRpbWVvdXQ6IDE1MDAwLFxuXHRcdFx0c3VjY2Vzc1Rlc3QocmVzcG9uc2UpIHtcblx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID4gMFxuXHRcdFx0XHRcdCYmIHJlc3BvbnNlLnJlc3VsdCAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0JiYgcmVzcG9uc2UucmVzdWx0ID09PSB0cnVlO1xuXHRcdFx0fSxcblx0XHRcdG9uU3VjY2VzcygpIHtcblx0XHRcdFx0bW9kdWxlU21hcnRJVlIuY2hhbmdlU3RhdHVzKCdDb25uZWN0ZWQnKTtcblx0XHRcdH0sXG5cdFx0XHRvblJlc3BvbnNlKHJlc3BvbnNlKSB7XG5cdFx0XHRcdCQoJy5tZXNzYWdlLmFqYXguZGVidWcnKS5yZW1vdmUoKTtcblx0XHRcdFx0Ly8gRGVidWcgbW9kZVxuXHRcdFx0XHRpZiAobW9kdWxlU21hcnRJVlIuJGRlYnVnVG9nZ2xlLmNoZWNrYm94KCdpcyBjaGVja2VkJylcblx0XHRcdFx0XHQmJiBtb2R1bGVTbWFydElWUi4kc3VibWl0QnV0dG9uLmhhc0NsYXNzKCdkaXNhYmxlZCcpXG5cdFx0XHRcdFx0JiYgdHlwZW9mIChyZXNwb25zZS5tZXNzYWdlcykgIT09ICd1bmRlZmluZWQnXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGxldCB2aXN1YWxFcnJvclN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlLm1lc3NhZ2VzLCBudWxsLCAyKTtcblxuXHRcdFx0XHRcdGlmICh0eXBlb2YgdmlzdWFsRXJyb3JTdHJpbmcgPT09ICdzdHJpbmcnICYmIHZpc3VhbEVycm9yU3RyaW5nIT09J1tdJykge1xuXHRcdFx0XHRcdFx0dmlzdWFsRXJyb3JTdHJpbmcgPSB2aXN1YWxFcnJvclN0cmluZy5yZXBsYWNlKC9cXFxcbi9nLCAnPGJyLz4nKTtcblxuXHRcdFx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggPiAwICYmIHJlc3BvbnNlLnJlc3VsdCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0XHRtb2R1bGVTbWFydElWUi4kZm9ybU9ialxuXHRcdFx0XHRcdFx0XHRcdC5hZnRlcihgPGRpdiBjbGFzcz1cInVpIHN1Y2Nlc3MgbWVzc2FnZSBhamF4IGRlYnVnXCI+XHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0PHByZSBzdHlsZT0nd2hpdGUtc3BhY2U6IHByZS13cmFwJz4ke3Zpc3VhbEVycm9yU3RyaW5nfTwvcHJlPlx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5gKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG1vZHVsZVNtYXJ0SVZSLiRmb3JtT2JqXG5cdFx0XHRcdFx0XHRcdFx0LmFmdGVyKGA8ZGl2IGNsYXNzPVwidWkgZXJyb3IgbWVzc2FnZSBhamF4IGRlYnVnXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8cHJlIHN0eWxlPSd3aGl0ZS1zcGFjZTogcHJlLXdyYXAnPiR7dmlzdWFsRXJyb3JTdHJpbmd9PC9wcmU+XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PmApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG9uRmFpbHVyZShyZXNwb25zZSkge1xuXHRcdFx0XHRpZiAocmVzcG9uc2UgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdCYmIE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggPiAwXG5cdFx0XHRcdFx0JiYgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQmJiByZXNwb25zZS5yZXN1bHQgPT09IGZhbHNlXG5cdFx0XHRcdFx0JiYgdHlwZW9mIChyZXNwb25zZS5kYXRhKSAhPT0gJ3VuZGVmaW5lZCdcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0bGV0IHZpc3VhbEVycm9yU3RyaW5nID0gJyc7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAocmVzcG9uc2UubWVzc2FnZXMpID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdFx0dmlzdWFsRXJyb3JTdHJpbmcgPSByZXNwb25zZS5tZXNzYWdlcztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2UubWVzc2FnZXMpKSB7XG5cdFx0XHRcdFx0XHQkLmVhY2gocmVzcG9uc2UubWVzc2FnZXMsIChpbmRleCwgdmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdFx0dmlzdWFsRXJyb3JTdHJpbmcgKz0gYCR7dmFsdWV9IDxicj5gO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHZpc3VhbEVycm9yU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UuZGF0YSwgbnVsbCwgJ1xcdCcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodmlzdWFsRXJyb3JTdHJpbmcuaW5kZXhPZignVFRTQ29ubmVjdGlvbkVycm9yJykgPj0gMCkge1xuXHRcdFx0XHRcdFx0bW9kdWxlU21hcnRJVlIuY2hhbmdlU3RhdHVzKCdEaXNjb25uZWN0ZWRUVFMnKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHZpc3VhbEVycm9yU3RyaW5nLmluZGV4T2YoJ0Nvbm5lY3Rpb25Ub0NSTUVycm9yJykgPj0gMCkge1xuXHRcdFx0XHRcdFx0bW9kdWxlU21hcnRJVlIuY2hhbmdlU3RhdHVzKCdEaXNjb25uZWN0ZWQxQycpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRtb2R1bGVTbWFydElWUi5jaGFuZ2VTdGF0dXMoJ0Rpc2Nvbm5lY3RlZCcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtb2R1bGVTbWFydElWUi5jaGFuZ2VTdGF0dXMoJ0Rpc2Nvbm5lY3RlZCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXHQvKipcblx0ICog0J/RgNC40LzQtdC90LXQvdC40LUg0L3QsNGB0YLRgNC+0LXQuiDQvNC+0LTRg9C70Y8g0L/QvtGB0LvQtSDQuNC30LzQtdC90LXQvdC40Y8g0LTQsNC90L3Ri9GFINGE0L7RgNC80Ytcblx0ICovXG5cdGFwcGx5Q29uZmlndXJhdGlvbkNoYW5nZXMoKSB7XG5cdFx0JC5hcGkoe1xuXHRcdFx0dXJsOiBgJHtDb25maWcucGJ4VXJsfS9wYnhjb3JlL2FwaS9tb2R1bGVzL01vZHVsZVNtYXJ0SVZSL3JlbG9hZGAsXG5cdFx0XHRvbjogJ25vdycsXG5cdFx0XHRzdWNjZXNzVGVzdChyZXNwb25zZSkge1xuXHRcdFx0XHRyZXR1cm4gcmVzcG9uc2UgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdCYmIE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggPiAwXG5cdFx0XHRcdFx0JiYgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQmJiByZXNwb25zZS5yZXN1bHQgPT09IHRydWU7XG5cdFx0XHR9LFxuXHRcdFx0b25TdWNjZXNzKCkge1xuXHRcdFx0XHRtb2R1bGVTbWFydElWUi5jaGVja1N0YXR1c1RvZ2dsZSgpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblx0Y2JCZWZvcmVTZW5kRm9ybShzZXR0aW5ncykge1xuXHRcdGNvbnN0IHJlc3VsdCA9IHNldHRpbmdzO1xuXHRcdHJlc3VsdC5kYXRhID0gbW9kdWxlU21hcnRJVlIuJGZvcm1PYmouZm9ybSgnZ2V0IHZhbHVlcycpO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cdGNiQWZ0ZXJTZW5kRm9ybSgpIHtcblx0XHRtb2R1bGVTbWFydElWUi5jaGFuZ2VTdGF0dXMoJ0Rpc2Nvbm5lY3RlZCcpO1xuXHRcdG1vZHVsZVNtYXJ0SVZSLmFwcGx5Q29uZmlndXJhdGlvbkNoYW5nZXMoKTtcblx0fSxcblx0aW5pdGlhbGl6ZUZvcm0oKSB7XG5cdFx0Rm9ybS4kZm9ybU9iaiA9IG1vZHVsZVNtYXJ0SVZSLiRmb3JtT2JqO1xuXHRcdEZvcm0udXJsID0gYCR7Z2xvYmFsUm9vdFVybH1tb2R1bGUtc21hcnQtaS12LXIvc2F2ZWA7XG5cdFx0Rm9ybS52YWxpZGF0ZVJ1bGVzID0gbW9kdWxlU21hcnRJVlIudmFsaWRhdGVSdWxlcztcblx0XHRGb3JtLmNiQmVmb3JlU2VuZEZvcm0gPSBtb2R1bGVTbWFydElWUi5jYkJlZm9yZVNlbmRGb3JtO1xuXHRcdEZvcm0uY2JBZnRlclNlbmRGb3JtID0gbW9kdWxlU21hcnRJVlIuY2JBZnRlclNlbmRGb3JtO1xuXHRcdEZvcm0uaW5pdGlhbGl6ZSgpO1xuXHR9LFxuXHQvKipcblx0ICog0J7QsdC90L7QstC70LXQvdC40LUg0YHRgtCw0YLRg9GB0LAg0LzQvtC00YPQu9GPXG5cdCAqIEBwYXJhbSBzdGF0dXNcblx0ICovXG5cdGNoYW5nZVN0YXR1cyhzdGF0dXMpIHtcblx0XHRzd2l0Y2ggKHN0YXR1cykge1xuXHRcdFx0Y2FzZSAnQ29ubmVjdGVkJzpcblx0XHRcdFx0bW9kdWxlU21hcnRJVlIuJG1vZHVsZVN0YXR1c1xuXHRcdFx0XHRcdC5yZW1vdmVDbGFzcygnZ3JleScpXG5cdFx0XHRcdFx0LnJlbW92ZUNsYXNzKCdyZWQnKVxuXHRcdFx0XHRcdC5hZGRDbGFzcygnZ3JlZW4nKTtcblx0XHRcdFx0bW9kdWxlU21hcnRJVlIuJG1vZHVsZVN0YXR1cy5odG1sKGdsb2JhbFRyYW5zbGF0ZS5tb2R1bGVfc21pdnJfQ29ubmVjdGVkKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdEaXNjb25uZWN0ZWQnOlxuXHRcdFx0XHRtb2R1bGVTbWFydElWUi4kbW9kdWxlU3RhdHVzXG5cdFx0XHRcdFx0LnJlbW92ZUNsYXNzKCdncmVlbicpXG5cdFx0XHRcdFx0LnJlbW92ZUNsYXNzKCdyZWQnKVxuXHRcdFx0XHRcdC5hZGRDbGFzcygnZ3JleScpO1xuXHRcdFx0XHRtb2R1bGVTbWFydElWUi4kbW9kdWxlU3RhdHVzLmh0bWwoZ2xvYmFsVHJhbnNsYXRlLm1vZHVsZV9zbWl2cl9EaXNjb25uZWN0ZWQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ0Rpc2Nvbm5lY3RlZDFDJzpcblx0XHRcdFx0bW9kdWxlU21hcnRJVlIuJG1vZHVsZVN0YXR1c1xuXHRcdFx0XHRcdC5yZW1vdmVDbGFzcygnZ3JlZW4nKVxuXHRcdFx0XHRcdC5yZW1vdmVDbGFzcygnZ3JleScpXG5cdFx0XHRcdFx0LmFkZENsYXNzKCdyZWQnKTtcblx0XHRcdFx0bW9kdWxlU21hcnRJVlIuJG1vZHVsZVN0YXR1cy5odG1sKGdsb2JhbFRyYW5zbGF0ZS5tb2R1bGVfc21pdnJfRGlzY29ubmVjdGVkMUMpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ0Rpc2Nvbm5lY3RlZFRUUyc6XG5cdFx0XHRcdG1vZHVsZVNtYXJ0SVZSLiRtb2R1bGVTdGF0dXNcblx0XHRcdFx0XHQucmVtb3ZlQ2xhc3MoJ2dyZWVuJylcblx0XHRcdFx0XHQucmVtb3ZlQ2xhc3MoJ2dyZXknKVxuXHRcdFx0XHRcdC5hZGRDbGFzcygncmVkJyk7XG5cdFx0XHRcdG1vZHVsZVNtYXJ0SVZSLiRtb2R1bGVTdGF0dXMuaHRtbChnbG9iYWxUcmFuc2xhdGUubW9kdWxlX3NtaXZyX0Rpc2Nvbm5lY3RlZFRUUyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnVXBkYXRpbmcnOlxuXHRcdFx0XHRtb2R1bGVTbWFydElWUi4kbW9kdWxlU3RhdHVzXG5cdFx0XHRcdFx0LnJlbW92ZUNsYXNzKCdncmVlbicpXG5cdFx0XHRcdFx0LnJlbW92ZUNsYXNzKCdyZWQnKVxuXHRcdFx0XHRcdC5hZGRDbGFzcygnZ3JleScpO1xuXHRcdFx0XHRtb2R1bGVTbWFydElWUi4kbW9kdWxlU3RhdHVzLmh0bWwoYDxpIGNsYXNzPVwic3Bpbm5lciBsb2FkaW5nIGljb25cIj48L2k+JHtnbG9iYWxUcmFuc2xhdGUubW9kdWxlX3NtaXZyX1VwZGF0ZVN0YXR1c31gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRtb2R1bGVTbWFydElWUi4kbW9kdWxlU3RhdHVzXG5cdFx0XHRcdFx0LnJlbW92ZUNsYXNzKCdncmVlbicpXG5cdFx0XHRcdFx0LnJlbW92ZUNsYXNzKCdyZWQnKVxuXHRcdFx0XHRcdC5hZGRDbGFzcygnZ3JleScpO1xuXHRcdFx0XHRtb2R1bGVTbWFydElWUi4kbW9kdWxlU3RhdHVzLmh0bWwoZ2xvYmFsVHJhbnNsYXRlLm1vZHVsZV9zbWl2cl9EaXNjb25uZWN0ZWQpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH0sXG59O1xuXG4kKGRvY3VtZW50KS5yZWFkeSgoKSA9PiB7XG5cdG1vZHVsZVNtYXJ0SVZSLmluaXRpYWxpemUoKTtcbn0pO1xuXG4iXX0=
\ No newline at end of file
+//# sourceMappingURL=module-smartivr-index.js.map
\ No newline at end of file
diff --git a/public/assets/js/module-smartivr-index.js.map b/public/assets/js/module-smartivr-index.js.map
new file mode 100644
index 0000000..1cfe00d
--- /dev/null
+++ b/public/assets/js/module-smartivr-index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"module-smartivr-index.js","names":["moduleSmartIVR","$formObj","$","$statusToggle","$forwardingSelect","$LibrarySelect","$onlyFirstGeneration","$onlySecondGeneration","$onlyFiveGeneration","$moduleStatus","$dirrtyField","$submitButton","$debugToggle","validateRules","number_of_repeat","identifier","rules","type","prompt","globalTranslate","module_smivr_ValidateNumberOfRepeat","timeOutExtension","module_smivr_ValidateTimeoutExtension","module_smivr_ValidateTimeOutExtensionNotEqualTo","failOverExtension","module_smivr_ValidateFailOverExtension","module_smivr_ValidateFailOverExtensionNotEqualTo","server1chost","depends","module_smivr_ValidateServer1CHostEmpty","server1cport","module_smivr_ValidateServer1CPortRange","database","module_smivr_ValidatePubName","initialize","cbChangeLibraryType","checkStatusToggle","window","addEventListener","dropdown","Extensions","getDropdownSettingsWithoutEmpty","onChange","initializeForm","form","hide","show","val","Math","random","trigger","checkbox","hasClass","click","testConnection","changeStatus","formData","moduleCTI2Installed","isPT1C","remove","api","url","concat","Config","pbxUrl","on","timeout","successTest","response","undefined","Object","keys","length","result","onSuccess","onResponse","messages","visualErrorString","JSON","stringify","replace","after","onFailure","data","Array","isArray","each","index","value","indexOf","applyConfigurationChanges","cbBeforeSendForm","settings","cbAfterSendForm","Form","globalRootUrl","status","removeClass","addClass","html","module_smivr_Connected","module_smivr_Disconnected","module_smivr_Disconnected1C","module_smivr_DisconnectedTTS","module_smivr_UpdateStatus","document","ready"],"sources":["src/module-smartivr-index.js"],"sourcesContent":["/*\n * Copyright © MIKO LLC - All Rights Reserved\n * Unauthorized copying of this file, via any medium is strictly prohibited\n * Proprietary and confidential\n * Written by Alexey Portnov, 2 2019\n */\n\n/* global globalRootUrl,globalTranslate, Extensions, Form, Config, UserMessage */\nconst moduleSmartIVR = {\n\t$formObj: $('#module-smart-ivr-form'),\n\t$statusToggle: $('#module-status-toggle'),\n\t$forwardingSelect: $('.forwarding-select'),\n\t$LibrarySelect: $('#library_1c'),\n\t$onlyFirstGeneration: $('.only-first-generation'),\n\t$onlySecondGeneration: $('.only-second-generation'),\n\t$onlyFiveGeneration: $('.only-five-generation'),\n\t$moduleStatus: $('#status'),\n\t$dirrtyField: null,\n\t$submitButton: $('#submitbutton'),\n\t$debugToggle: $('#debug-mode-toggle'),\n\n\tvalidateRules: {\n\t\tnumber_of_repeat: {\n\t\t\tidentifier: 'number_of_repeat',\n\t\t\trules: [\n\t\t\t\t{\n\t\t\t\t\ttype: 'integer[1..10]',\n\t\t\t\t\tprompt: globalTranslate.module_smivr_ValidateNumberOfRepeat,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\ttimeOutExtension: {\n\t\t\tidentifier: 'timeout_extension',\n\t\t\trules: [\n\t\t\t\t{\n\t\t\t\t\ttype: 'empty',\n\t\t\t\t\tprompt: globalTranslate.module_smivr_ValidateTimeoutExtension,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: `different[extension]`,\n\t\t\t\t\tprompt: globalTranslate.module_smivr_ValidateTimeOutExtensionNotEqualTo,\n\t\t\t\t}\n\t\t\t],\n\t\t},\n\t\tfailOverExtension: {\n\t\t\tidentifier: 'failover_extension',\n\t\t\trules: [\n\t\t\t\t{\n\t\t\t\t\ttype: 'empty',\n\t\t\t\t\tprompt: globalTranslate.module_smivr_ValidateFailOverExtension,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: `different[extension]`,\n\t\t\t\t\tprompt: globalTranslate.module_smivr_ValidateFailOverExtensionNotEqualTo,\n\t\t\t\t}\n\t\t\t],\n\t\t},\n\t\tserver1chost: {\n\t\t\tidentifier: 'server1chost',\n\t\t\tdepends: 'isPT1C',\n\t\t\trules: [\n\t\t\t\t{\n\t\t\t\t\ttype: 'empty',\n\t\t\t\t\tprompt: globalTranslate.module_smivr_ValidateServer1CHostEmpty,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tserver1cport: {\n\t\t\tidentifier: 'server1cport',\n\t\t\tdepends: 'isPT1C',\n\t\t\trules: [\n\t\t\t\t{\n\t\t\t\t\ttype: 'integer[0..65535]',\n\t\t\t\t\tprompt: globalTranslate.module_smivr_ValidateServer1CPortRange,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tdatabase: {\n\t\t\tidentifier: 'database',\n\t\t\tdepends: 'isPT1C',\n\t\t\trules: [\n\t\t\t\t{\n\t\t\t\t\ttype: 'empty',\n\t\t\t\t\tprompt: globalTranslate.module_smivr_ValidatePubName,\n\t\t\t\t},\n\t\t\t],\n\t\t}\n\t},\n\tinitialize() {\n\t\tmoduleSmartIVR.cbChangeLibraryType();\n\t\tmoduleSmartIVR.checkStatusToggle();\n\t\twindow.addEventListener('ModuleStatusChanged', moduleSmartIVR.checkStatusToggle);\n\t\tmoduleSmartIVR.$forwardingSelect.dropdown(Extensions.getDropdownSettingsWithoutEmpty());\n\t\tmoduleSmartIVR.$LibrarySelect.dropdown({onChange: moduleSmartIVR.cbChangeLibraryType});\n\t\tmoduleSmartIVR.initializeForm();\n\t},\n\t/**\n\t * Изменение версии библиотеки\n\t */\n\tcbChangeLibraryType() {\n\t\tif (moduleSmartIVR.$formObj.form('get value', 'library_1c') === '1.0') {\n\t\t\tmoduleSmartIVR.$onlySecondGeneration.hide();\n\t\t\tmoduleSmartIVR.$onlyFirstGeneration.show();\n\t\t\tmoduleSmartIVR.$onlyFiveGeneration.hide();\n\t\t\tmoduleSmartIVR.$formObj.form('set value', 'isPT1C', true);\n\t\t} else if(moduleSmartIVR.$formObj.form('get value', 'library_1c') === '5.0'){\n\t\t\tmoduleSmartIVR.$onlySecondGeneration.hide();\n\t\t\tmoduleSmartIVR.$onlyFirstGeneration.hide();\n\t\t\tmoduleSmartIVR.$onlyFiveGeneration.show();\n\t\t\tmoduleSmartIVR.$formObj.form('set value', 'isPT1C', '');\n\t\t} else {\n\t\t\tmoduleSmartIVR.$onlyFirstGeneration.hide();\n\t\t\tmoduleSmartIVR.$onlySecondGeneration.show();\n\t\t\tmoduleSmartIVR.$onlyFiveGeneration.hide();\n\t\t\tmoduleSmartIVR.$formObj.form('set value', 'isPT1C', '');\n\t\t}\n\t\tif (moduleSmartIVR.$dirrtyField===null){\n\t\t\tmoduleSmartIVR.$dirrtyField=$('#dirrty');\n\t\t} else {\n\t\t\tmoduleSmartIVR.$dirrtyField.val(Math.random());\n\t\t\tmoduleSmartIVR.$dirrtyField.trigger('change');\n\t\t}\n\t}\n\t,\n\t/**\n\t * Изменение статуса кнопок при изменении статуса модуля\n\t */\n\tcheckStatusToggle() {\n\t\tif (moduleSmartIVR.$statusToggle.checkbox('is checked')) {\n\t\t\tif (!moduleSmartIVR.$submitButton.hasClass('disabled')) {\n\t\t\t\tmoduleSmartIVR.$submitButton.click();\n\t\t\t}\n\t\t\tmoduleSmartIVR.testConnection();\n\t\t} else {\n\t\t\tmoduleSmartIVR.changeStatus('Disconnected');\n\t\t}\n\t},\n\t/**\n\t * Тестирование соединения с 1С\n\t */\n\ttestConnection() {\n\t\tif (!(moduleSmartIVR.$formObj.form('is valid'))) {\n\t\t\treturn;\n\t\t}\n\t\tconst formData = moduleSmartIVR.$formObj.form('get values');\n\t\tif (formData.moduleCTI2Installed===''\n\t\t\t&& formData.isPT1C==='false'){\n\t\t\treturn;\n\t\t}\n\t\tmoduleSmartIVR.changeStatus('Updating');\n\t\t$('.message.ajax.debug').remove();\n\t\t$.api({\n\t\t\turl: `${Config.pbxUrl}/pbxcore/api/modules/ModuleSmartIVR/check`,\n\t\t\ton: 'now',\n\t\t\ttimeout: 15000,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined\n\t\t\t\t\t&& Object.keys(response).length > 0\n\t\t\t\t\t&& response.result !== undefined\n\t\t\t\t\t&& response.result === true;\n\t\t\t},\n\t\t\tonSuccess() {\n\t\t\t\tmoduleSmartIVR.changeStatus('Connected');\n\t\t\t},\n\t\t\tonResponse(response) {\n\t\t\t\t$('.message.ajax.debug').remove();\n\t\t\t\t// Debug mode\n\t\t\t\tif (moduleSmartIVR.$debugToggle.checkbox('is checked')\n\t\t\t\t\t&& moduleSmartIVR.$submitButton.hasClass('disabled')\n\t\t\t\t\t&& typeof (response.messages) !== 'undefined'\n\t\t\t\t) {\n\t\t\t\t\tlet visualErrorString = JSON.stringify(response.messages, null, 2);\n\n\t\t\t\t\tif (typeof visualErrorString === 'string' && visualErrorString!=='[]') {\n\t\t\t\t\t\tvisualErrorString = visualErrorString.replace(/\\\\n/g, '
');\n\n\t\t\t\t\t\tif (Object.keys(response).length > 0 && response.result === true) {\n\t\t\t\t\t\t\tmoduleSmartIVR.$formObj\n\t\t\t\t\t\t\t\t.after(`\t\t\n\t\t\t\t\t\t\t\t\t
${visualErrorString}\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t
`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmoduleSmartIVR.$formObj\n\t\t\t\t\t\t\t\t.after(`\n\t\t\t\t\t\t\t\t\t
${visualErrorString}\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t
`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tif (response !== undefined\n\t\t\t\t\t&& Object.keys(response).length > 0\n\t\t\t\t\t&& response.result !== undefined\n\t\t\t\t\t&& response.result === false\n\t\t\t\t\t&& typeof (response.data) !== 'undefined'\n\t\t\t\t) {\n\t\t\t\t\tlet visualErrorString = '';\n\t\t\t\t\tif (typeof (response.messages) === 'string') {\n\t\t\t\t\t\tvisualErrorString = response.messages;\n\t\t\t\t\t} else if (Array.isArray(response.messages)) {\n\t\t\t\t\t\t$.each(response.messages, (index, value) => {\n\t\t\t\t\t\t\tvisualErrorString += `${value}
`;\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvisualErrorString = JSON.stringify(response.data, null, '\\t');\n\t\t\t\t\t}\n\t\t\t\t\tif (visualErrorString.indexOf('TTSConnectionError') >= 0) {\n\t\t\t\t\t\tmoduleSmartIVR.changeStatus('DisconnectedTTS');\n\t\t\t\t\t} else if (visualErrorString.indexOf('ConnectionToCRMError') >= 0) {\n\t\t\t\t\t\tmoduleSmartIVR.changeStatus('Disconnected1C');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmoduleSmartIVR.changeStatus('Disconnected');\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmoduleSmartIVR.changeStatus('Disconnected');\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\t/**\n\t * Применение настроек модуля после изменения данных формы\n\t */\n\tapplyConfigurationChanges() {\n\t\t$.api({\n\t\t\turl: `${Config.pbxUrl}/pbxcore/api/modules/ModuleSmartIVR/reload`,\n\t\t\ton: 'now',\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined\n\t\t\t\t\t&& Object.keys(response).length > 0\n\t\t\t\t\t&& response.result !== undefined\n\t\t\t\t\t&& response.result === true;\n\t\t\t},\n\t\t\tonSuccess() {\n\t\t\t\tmoduleSmartIVR.checkStatusToggle();\n\t\t\t},\n\t\t});\n\t},\n\tcbBeforeSendForm(settings) {\n\t\tconst result = settings;\n\t\tresult.data = moduleSmartIVR.$formObj.form('get values');\n\t\treturn result;\n\t},\n\tcbAfterSendForm() {\n\t\tmoduleSmartIVR.changeStatus('Disconnected');\n\t\tmoduleSmartIVR.applyConfigurationChanges();\n\t},\n\tinitializeForm() {\n\t\tForm.$formObj = moduleSmartIVR.$formObj;\n\t\tForm.url = `${globalRootUrl}module-smart-i-v-r/save`;\n\t\tForm.validateRules = moduleSmartIVR.validateRules;\n\t\tForm.cbBeforeSendForm = moduleSmartIVR.cbBeforeSendForm;\n\t\tForm.cbAfterSendForm = moduleSmartIVR.cbAfterSendForm;\n\t\tForm.initialize();\n\t},\n\t/**\n\t * Обновление статуса модуля\n\t * @param status\n\t */\n\tchangeStatus(status) {\n\t\tswitch (status) {\n\t\t\tcase 'Connected':\n\t\t\t\tmoduleSmartIVR.$moduleStatus\n\t\t\t\t\t.removeClass('grey')\n\t\t\t\t\t.removeClass('red')\n\t\t\t\t\t.addClass('green');\n\t\t\t\tmoduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_Connected);\n\t\t\t\tbreak;\n\t\t\tcase 'Disconnected':\n\t\t\t\tmoduleSmartIVR.$moduleStatus\n\t\t\t\t\t.removeClass('green')\n\t\t\t\t\t.removeClass('red')\n\t\t\t\t\t.addClass('grey');\n\t\t\t\tmoduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_Disconnected);\n\t\t\t\tbreak;\n\t\t\tcase 'Disconnected1C':\n\t\t\t\tmoduleSmartIVR.$moduleStatus\n\t\t\t\t\t.removeClass('green')\n\t\t\t\t\t.removeClass('grey')\n\t\t\t\t\t.addClass('red');\n\t\t\t\tmoduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_Disconnected1C);\n\t\t\t\tbreak;\n\t\t\tcase 'DisconnectedTTS':\n\t\t\t\tmoduleSmartIVR.$moduleStatus\n\t\t\t\t\t.removeClass('green')\n\t\t\t\t\t.removeClass('grey')\n\t\t\t\t\t.addClass('red');\n\t\t\t\tmoduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_DisconnectedTTS);\n\t\t\t\tbreak;\n\t\t\tcase 'Updating':\n\t\t\t\tmoduleSmartIVR.$moduleStatus\n\t\t\t\t\t.removeClass('green')\n\t\t\t\t\t.removeClass('red')\n\t\t\t\t\t.addClass('grey');\n\t\t\t\tmoduleSmartIVR.$moduleStatus.html(`${globalTranslate.module_smivr_UpdateStatus}`);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tmoduleSmartIVR.$moduleStatus\n\t\t\t\t\t.removeClass('green')\n\t\t\t\t\t.removeClass('red')\n\t\t\t\t\t.addClass('grey');\n\t\t\t\tmoduleSmartIVR.$moduleStatus.html(globalTranslate.module_smivr_Disconnected);\n\t\t\t\tbreak;\n\t\t}\n\t},\n};\n\n$(document).ready(() => {\n\tmoduleSmartIVR.initialize();\n});\n\n"],"mappings":"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","ignoreList":[]}
\ No newline at end of file
diff --git a/public/assets/js/src/module-smartivr-index.js b/public/assets/js/src/module-smartivr-index.js
index ca717b4..9eb2aeb 100644
--- a/public/assets/js/src/module-smartivr-index.js
+++ b/public/assets/js/src/module-smartivr-index.js
@@ -13,6 +13,7 @@ const moduleSmartIVR = {
$LibrarySelect: $('#library_1c'),
$onlyFirstGeneration: $('.only-first-generation'),
$onlySecondGeneration: $('.only-second-generation'),
+ $onlyFiveGeneration: $('.only-five-generation'),
$moduleStatus: $('#status'),
$dirrtyField: null,
$submitButton: $('#submitbutton'),
@@ -97,15 +98,21 @@ const moduleSmartIVR = {
* Изменение версии библиотеки
*/
cbChangeLibraryType() {
- if (moduleSmartIVR.$formObj.form('get value', 'library_1c') === '2.0') {
- moduleSmartIVR.$onlyFirstGeneration.hide();
- moduleSmartIVR.$onlySecondGeneration.show();
- moduleSmartIVR.$formObj.form('set value', 'isPT1C', '');
-
- } else {
+ if (moduleSmartIVR.$formObj.form('get value', 'library_1c') === '1.0') {
moduleSmartIVR.$onlySecondGeneration.hide();
moduleSmartIVR.$onlyFirstGeneration.show();
+ moduleSmartIVR.$onlyFiveGeneration.hide();
moduleSmartIVR.$formObj.form('set value', 'isPT1C', true);
+ } else if(moduleSmartIVR.$formObj.form('get value', 'library_1c') === '5.0'){
+ moduleSmartIVR.$onlySecondGeneration.hide();
+ moduleSmartIVR.$onlyFirstGeneration.hide();
+ moduleSmartIVR.$onlyFiveGeneration.show();
+ moduleSmartIVR.$formObj.form('set value', 'isPT1C', '');
+ } else {
+ moduleSmartIVR.$onlyFirstGeneration.hide();
+ moduleSmartIVR.$onlySecondGeneration.show();
+ moduleSmartIVR.$onlyFiveGeneration.hide();
+ moduleSmartIVR.$formObj.form('set value', 'isPT1C', '');
}
if (moduleSmartIVR.$dirrtyField===null){
moduleSmartIVR.$dirrtyField=$('#dirrty');
@@ -113,7 +120,6 @@ const moduleSmartIVR = {
moduleSmartIVR.$dirrtyField.val(Math.random());
moduleSmartIVR.$dirrtyField.trigger('change');
}
-
}
,
/**