@talrace/ngx-noder 0.0.17 → 0.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +72 -9
  2. package/assets/i18n/noder.en.json +93 -0
  3. package/assets/i18n/noder.es.json +93 -0
  4. package/assets/i18n/noder.ru.json +93 -0
  5. package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +21 -21
  6. package/esm2022/lib/apart-components/add-link-mobile/add-link-mobile.component.mjs +5 -3
  7. package/esm2022/lib/apart-components/confirm-dialog/confirm-dialog.component.mjs +5 -3
  8. package/esm2022/lib/apart-components/editor-search/editor-search-dialog.component.mjs +14 -3
  9. package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +17 -14
  10. package/esm2022/lib/apart-components/editor-title-mobile/editor-title-mobile.component.mjs +5 -3
  11. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/color-picker/color-picker.component.mjs +3 -3
  12. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +3 -3
  13. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/format/format.component.mjs +3 -3
  14. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/numbering/numbering.component.mjs +3 -3
  15. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +4 -3
  16. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.mjs +4 -3
  17. package/esm2022/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.mjs +2 -2
  18. package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +18 -16
  19. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar.module.mjs +8 -13
  20. package/esm2022/lib/apart-components/insert-table-mobile/insert-table-mobile.component.mjs +5 -3
  21. package/esm2022/lib/apart-components/text-format-mobile/text-format-mobile.component.mjs +14 -3
  22. package/esm2022/lib/editor/components/edges/edge.component.mjs +48 -6
  23. package/esm2022/lib/editor/components/edges/edges.mjs +7 -29
  24. package/esm2022/lib/editor/components/external-element/models/external-element.model.mjs +4 -4
  25. package/esm2022/lib/editor/components/table/overlay-menu/overlay-menu.component.mjs +29 -19
  26. package/esm2022/lib/editor/editor.module.mjs +28 -4
  27. package/esm2022/lib/editor/execution/editor.mjs +2 -1
  28. package/esm2022/lib/editor/gadgets/scrollbar.mjs +11 -6
  29. package/esm2022/lib/translate/noder-translate.loader.mjs +22 -0
  30. package/esm2022/public-api.mjs +2 -1
  31. package/fesm2022/talrace-ngx-noder.mjs +241 -168
  32. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  33. package/lib/apart-components/add-link-dialog/add-link-dialog.component.d.ts +1 -10
  34. package/lib/apart-components/editor-title/editor-title.component.d.ts +5 -3
  35. package/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.d.ts +3 -1
  36. package/lib/apart-components/editor-toolbar/editor-toolbar.module.d.ts +23 -23
  37. package/lib/editor/components/edges/edge.component.d.ts +10 -3
  38. package/lib/editor/components/edges/edges.d.ts +0 -2
  39. package/lib/editor/components/external-element/models/external-element.model.d.ts +3 -3
  40. package/lib/editor/components/table/overlay-menu/overlay-menu.component.d.ts +3 -1
  41. package/lib/editor/editor.module.d.ts +2 -1
  42. package/lib/editor/gadgets/scrollbar.d.ts +1 -0
  43. package/lib/translate/noder-translate.loader.d.ts +11 -0
  44. package/package.json +3 -1
  45. package/public-api.d.ts +1 -0
  46. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/heading/heading.component.mjs +0 -22
  47. package/lib/apart-components/editor-toolbar/components/buttons/heading/heading.component.d.ts +0 -8
package/README.md CHANGED
@@ -14,6 +14,64 @@ Run this command to add ngx-noder package to your project
14
14
  npm i @talrace/ngx-noder
15
15
  ```
16
16
 
17
+ ### Translation
18
+
19
+ NgxNoder uses @ngx-translate for its translations. Its should be included to list of static application assets and application should import TranslateModule. NgxNoder translates are loaded by NoderTranslateLoader.
20
+
21
+ angular.json
22
+
23
+ ```typescript
24
+ "assets": [
25
+ ...
26
+ { "glob": "**/*", "input": "node_modules/@talrace/ngx-noder/assets", "output": "assets" }
27
+ ],
28
+ ```
29
+
30
+ app.module.ts
31
+
32
+ ```typescript
33
+ import { TranslateModule } from '@ngx-translate/core';
34
+
35
+ @NgModule({
36
+ imports: [
37
+ ...
38
+ TranslateModule.forRoot()
39
+ ],
40
+ ...
41
+ })
42
+ ```
43
+
44
+ NgxNoder translates loading
45
+
46
+ app.module.ts (if application do not have own translations, preferred language can be set by the 'use' method of TranslateService)
47
+
48
+ ```typescript
49
+ import { NoderTranslateLoader } from '@talrace/ngx-noder';
50
+ import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
51
+
52
+ @NgModule({
53
+ imports: [
54
+ ...
55
+ TranslateModule.forRoot({ loader: { provide: TranslateLoader, useClass: NoderTranslateLoader } })
56
+ ],
57
+ ...
58
+ })
59
+ ```
60
+
61
+ service or state where translation is controlled (if application have own translations)
62
+
63
+ ```typescript
64
+ import { NoderTranslateLoader } from '@talrace/ngx-noder';
65
+ import { TranslateService } from '@ngx-translate/core';
66
+ ...
67
+ constructor(private translateService: TranslateService, private noderTranslateLoader: NoderTranslateLoader) {}
68
+ ...
69
+ this.noderTranslateLoader
70
+ .getTranslation(language)
71
+ .pipe(take(1))
72
+ .subscribe(x => this.translateService.setTranslation(language, x, true))
73
+ ```
74
+
17
75
  ### Editor
18
76
 
19
77
  Import editor module. This is basic module and provides creating, editing and viewing document functionality.
@@ -98,6 +156,15 @@ export class SomeModule {}
98
156
 
99
157
  Example of full-featured NgxNoder with toolbar, header, custom search and receiving commands from editor.
100
158
 
159
+ angular.json
160
+
161
+ ```typescript
162
+ "assets": [
163
+ ...
164
+ { "glob": "**/*", "input": "node_modules/@talrace/ngx-noder/assets", "output": "assets" }
165
+ ],
166
+ ```
167
+
101
168
  app.module.ts
102
169
 
103
170
  ```typescript
@@ -111,6 +178,8 @@ import {
111
178
  EditorToolbarModule
112
179
  } from '@talrace/ngx-noder';
113
180
  import { NgModule } from '@angular/core';
181
+ import { NoderTranslateLoader } from '@talrace/ngx-noder';
182
+ import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
114
183
 
115
184
  @NgModule({
116
185
  declarations: [AppComponent],
@@ -124,7 +193,8 @@ import { NgModule } from '@angular/core';
124
193
  EditorSearchDialogComponent,
125
194
  EditorTitleComponent,
126
195
  EditorTitleMobileComponent,
127
- EditorToolbarModule
196
+ EditorToolbarModule,
197
+ TranslateModule.forRoot({ loader: { provide: TranslateLoader, useClass: NoderTranslateLoader } })
128
198
 
129
199
  ],
130
200
  providers: [EditorService, ElementApiService, ImageUploadService],
@@ -233,7 +303,6 @@ import { ActivatedRoute } from '@angular/router';
233
303
  import { BehaviorSubject, filter, Observable, Subject, take, takeUntil, tap } from 'rxjs';
234
304
  import {
235
305
  AddLinkDialogComponent,
236
- AddLinkDialogOptions,
237
306
  AddLinkMobileComponent,
238
307
  BreakTypes,
239
308
  CommandsService,
@@ -418,14 +487,8 @@ export class AppComponent extends DestroyComponent {
418
487
  if (this.isMobile) {
419
488
  this.editorService.openSidenav(AddLinkMobileComponent);
420
489
  } else {
421
- const data = new AddLinkDialogOptions({
422
- textPlaceholder: 'Text',
423
- linkPlaceholder: 'Link',
424
- title: 'Add Link'
425
- });
426
-
427
490
  this.dialog
428
- .open(AddLinkDialogComponent, { panelClass: 'add-link-dialog', data })
491
+ .open(AddLinkDialogComponent, { panelClass: 'add-link-dialog' })
429
492
  .afterClosed()
430
493
  .subscribe((result: any) => {
431
494
  if (result) {
@@ -0,0 +1,93 @@
1
+ {
2
+ "NODER": {
3
+ "COMPLEX_LABEL": {
4
+ "INSERT_COLUMNS_TO_THE_LEFT": "Insert {{ count }} columns to the left",
5
+ "INSERT_COLUMNS_TO_THE_RIGHT": "Insert {{ count }} columns to the right",
6
+ "INSERT_ROWS_ABOVE": "Insert {{ count }} rows above",
7
+ "INSERT_ROWS_BELOW": "Insert {{ count }} rows below",
8
+ "OF_COUNTER": "{{ current }} of {{ total }}",
9
+ "REMOVE_COLUMNS": "Remove {{ count }} columns",
10
+ "REMOVE_ROWS": "Remove {{ count }} rows"
11
+ },
12
+ "LABEL": {
13
+ "ADD_LINK": "Add Link",
14
+ "ALIGN": "Align",
15
+ "ALIGNMENT": "Alignment",
16
+ "APPLY": "Apply",
17
+ "BOLD": "Bold",
18
+ "BULLETED_AND_NUMBERED_LIST": "Bulleted & Numbered List",
19
+ "BULLETS_AND_NUMBERING": "Bullets & Numbering",
20
+ "BULLET_LIST_MENU": "Bullet List Menu",
21
+ "CANCEL": "Cancel",
22
+ "CENTER": "Center",
23
+ "CLOSE": "Close",
24
+ "COLUMNS": "Columns",
25
+ "CONFIRMATION": "Confirmation",
26
+ "COPY": "Copy",
27
+ "CUT": "Cut",
28
+ "DELETE": "Delete",
29
+ "DOUBLE_CLICK_TO_RENAME": "Double click to rename",
30
+ "EDIT": "Edit",
31
+ "EDIT_DOCUMENT": "Edit document",
32
+ "EVEN_PAGES_FOOTER": "Even Pages Footer",
33
+ "EVEN_PAGES_HEADER": "Even Pages Header",
34
+ "FILE": "File",
35
+ "FILL_OR_PRINT_DOCUMENT": "Fill or print document",
36
+ "FIRST_PAGE_FOOTER": "First Page Footer",
37
+ "FIRST_PAGE_HEADER": "First Page Header",
38
+ "FONT": "Font",
39
+ "FOOTER": "Footer",
40
+ "FORMAT": "Format",
41
+ "HEADER": "Header",
42
+ "HEADERS_AND_FOOTERS": "Headers & Footers",
43
+ "IMAGE": "Image",
44
+ "INSERT": "Insert",
45
+ "INSERT_COLUMN_TO_THE_LEFT": "Insert column to the left",
46
+ "INSERT_COLUMN_TO_THE_RIGHT": "Insert column to the right",
47
+ "INSERT_FORMAT": "Insert Format",
48
+ "INSERT_LINK": "Insert Link",
49
+ "INSERT_ROW_ABOVE": "Insert row above",
50
+ "INSERT_ROW_BELOW": "Insert row below",
51
+ "INSERT_TABLE": "Insert Table",
52
+ "ITALIC": "Italic",
53
+ "LAYOUT": "Layout",
54
+ "LEFT": "Left",
55
+ "LINK": "Link",
56
+ "LINK_OPTIONS": "Link Options",
57
+ "NEW": "New",
58
+ "NONE": "None",
59
+ "NUMBERED_LIST_MENU": "Numbered List Menu",
60
+ "ODD_PAGES_FOOTER": "Odd Pages Footer",
61
+ "ODD_PAGES_HEADER": "Odd Pages Header",
62
+ "OPEN_FROM": "Open From",
63
+ "PAGE_BREAK": "Page Break",
64
+ "PASTE": "Paste",
65
+ "PRINT": "Print",
66
+ "QUICK_SELECT": "Quick Select",
67
+ "READ_OR_PRINT_DOCUMENT": "Read or print document",
68
+ "REDO": "Redo",
69
+ "REMOVE_COLUMN": "Remove column",
70
+ "REMOVE_ROW": "Remove row",
71
+ "RENAME": "Rename",
72
+ "REPLACE": "Replace",
73
+ "REPLACE_WITH": "Replace with",
74
+ "RIGHT": "Right",
75
+ "ROWS": "Rows",
76
+ "SAVE_AS": "Save As",
77
+ "SEARCH_FOR": "Search for",
78
+ "SELECT_ALL": "Select All",
79
+ "TABLE": "Table",
80
+ "TABLE_OPTIONS": "Table Options",
81
+ "TEXT": "Text",
82
+ "TEXT_FORMAT": "Text Format",
83
+ "TEXT_STYLE": "Text Style",
84
+ "THE_COLUMN_IS_REQUIRED": "The Columns is required",
85
+ "THE_LINK_IS_REQUIRED": "The Link is required",
86
+ "THE_ROW_IS_REQUIRED": "The Rows is required",
87
+ "THE_TEXT_IS_REQUIRED": "The Text is required",
88
+ "UNDERLINED": "Underlined",
89
+ "UNDO": "Undo",
90
+ "UNTITLED_DOCUMENT": "Untitled document"
91
+ }
92
+ }
93
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "NODER": {
3
+ "COMPLEX_LABEL": {
4
+ "INSERT_COLUMNS_TO_THE_LEFT": "Inserte {{ count }} columnas a la izquierda",
5
+ "INSERT_COLUMNS_TO_THE_RIGHT": "Inserte {{ count }} columnas a la derecha",
6
+ "INSERT_ROWS_ABOVE": "Inserte {{ count }} filas arriba",
7
+ "INSERT_ROWS_BELOW": "Inserte {{ count }} filas debajo",
8
+ "OF_COUNTER": "{{ current }} de {{ total }}",
9
+ "REMOVE_COLUMNS": "Eliminar columnas {{ count }} ",
10
+ "REMOVE_ROWS": "Eliminar {{ count }} filas"
11
+ },
12
+ "LABEL": {
13
+ "ADD_LINK": "Añadir Enlace",
14
+ "ALIGN": "Alinear",
15
+ "ALIGNMENT": "Alineación",
16
+ "APPLY": "Aplicar",
17
+ "BOLD": "Negrita",
18
+ "BULLETED_AND_NUMBERED_LIST": "Lista Numerada y con Viñetas",
19
+ "BULLETS_AND_NUMBERING": "Viñetas y Numeración",
20
+ "BULLET_LIST_MENU": "Menú de Lista de Viñetas",
21
+ "CANCEL": "Cancelar",
22
+ "CENTER": "Centro",
23
+ "CLOSE": "Cerrar",
24
+ "COLUMNS": "Columnas",
25
+ "CONFIRMATION": "Confirmación",
26
+ "COPY": "Copia",
27
+ "CUT": "Corte",
28
+ "DELETE": "Suprimir",
29
+ "DOUBLE_CLICK_TO_RENAME": "Haga doble clic para cambiar el nombre",
30
+ "EDIT": "Editar",
31
+ "EDIT_DOCUMENT": "Editar documento",
32
+ "EVEN_PAGES_FOOTER": "Pie de Página Uniforme",
33
+ "EVEN_PAGES_HEADER": "Encabezado de Páginas Pares",
34
+ "FILE": "Archivo",
35
+ "FILL_OR_PRINT_DOCUMENT": "Rellenar o imprimir documento",
36
+ "FIRST_PAGE_FOOTER": "Pie de Página de la Primera Página",
37
+ "FIRST_PAGE_HEADER": "Encabezado de la Primera Página",
38
+ "FONT": "Fuente",
39
+ "FOOTER": "Pie de página",
40
+ "FORMAT": "Formato",
41
+ "HEADER": "Cabecera",
42
+ "HEADERS_AND_FOOTERS": "Encabezados y Pies de página",
43
+ "IMAGE": "Imagen",
44
+ "INSERT": "Insertar",
45
+ "INSERT_COLUMN_TO_THE_LEFT": "Insertar columna a la izquierda",
46
+ "INSERT_COLUMN_TO_THE_RIGHT": "Insertar columna a la derecha",
47
+ "INSERT_FORMAT": "Formato de Inserción",
48
+ "INSERT_LINK": "Insertar Enlace",
49
+ "INSERT_ROW_ABOVE": "Insertar fila arriba",
50
+ "INSERT_ROW_BELOW": "Insertar fila debajo",
51
+ "INSERT_TABLE": "Insertar Tabla",
52
+ "ITALIC": "Cursiva",
53
+ "LAYOUT": "Maquetación",
54
+ "LEFT": "Izquierda",
55
+ "LINK": "Enlace",
56
+ "LINK_OPTIONS": "Opciones de Enlace",
57
+ "NEW": "Nuevo",
58
+ "NONE": "Ninguna",
59
+ "NUMBERED_LIST_MENU": "Menú de Lista Numerada",
60
+ "ODD_PAGES_FOOTER": "Pie de Página de Páginas Impares",
61
+ "ODD_PAGES_HEADER": "Encabezado de Páginas Impares",
62
+ "OPEN_FROM": "Abierto Desde",
63
+ "PAGE_BREAK": "Salto de Página",
64
+ "PASTE": "Pasta",
65
+ "PRINT": "Imprimir",
66
+ "QUICK_SELECT": "Selección Rápida",
67
+ "READ_OR_PRINT_DOCUMENT": "Leer o imprimir documento",
68
+ "REDO": "Rehacer",
69
+ "REMOVE_COLUMN": "Eliminar columna",
70
+ "REMOVE_ROW": "Eliminar fila",
71
+ "RENAME": "Renombrar",
72
+ "REPLACE": "Reemplazar",
73
+ "REPLACE_WITH": "Reemplazar con",
74
+ "RIGHT": "Correcto",
75
+ "ROWS": "Filas",
76
+ "SAVE_AS": "Guardar Como",
77
+ "SEARCH_FOR": "Buscar por",
78
+ "SELECT_ALL": "Seleccionar Todo",
79
+ "TABLE": "Cuadro",
80
+ "TABLE_OPTIONS": "Opciones de Tabla",
81
+ "TEXT": "Texto",
82
+ "TEXT_FORMAT": "Formato de Texto",
83
+ "TEXT_STYLE": "Estilo de Texto",
84
+ "THE_COLUMN_IS_REQUIRED": "Las Columnas son obligatorias",
85
+ "THE_LINK_IS_REQUIRED": "El Enlace es obligatorio",
86
+ "THE_ROW_IS_REQUIRED": "Se requieren las filas",
87
+ "THE_TEXT_IS_REQUIRED": "El Texto es obligatorio",
88
+ "UNDERLINED": "Subrayado",
89
+ "UNDO": "Deshacer",
90
+ "UNTITLED_DOCUMENT": "Documento sin título"
91
+ }
92
+ }
93
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "NODER": {
3
+ "COMPLEX_LABEL": {
4
+ "INSERT_COLUMNS_TO_THE_LEFT": "Вставить {{ count }} столбцов слева",
5
+ "INSERT_COLUMNS_TO_THE_RIGHT": "Вставить {{ count }} столбцов справа",
6
+ "INSERT_ROWS_ABOVE": "Вставить {{ count }} строк выше",
7
+ "INSERT_ROWS_BELOW": "Вставить {{ count }} строк ниже",
8
+ "OF_COUNTER": "{{ current }} из {{ total }}",
9
+ "REMOVE_COLUMNS": "Удалить {{ count }} столбцов",
10
+ "REMOVE_ROWS": "Удалить {{ count }} строк"
11
+ },
12
+ "LABEL": {
13
+ "ADD_LINK": "Добавить ссылку",
14
+ "ALIGN": "Выровнять",
15
+ "ALIGNMENT": "Выравнивание",
16
+ "APPLY": "Применить",
17
+ "BOLD": "Жирный шрифт",
18
+ "BULLETED_AND_NUMBERED_LIST": "Маркированный и нумерованный список",
19
+ "BULLETS_AND_NUMBERING": "Маркеры и нумерация",
20
+ "BULLET_LIST_MENU": "Меню маркированного списка",
21
+ "CANCEL": "Отмена",
22
+ "CENTER": "По центру",
23
+ "CLOSE": "Закрыть",
24
+ "COLUMNS": "Столбцы",
25
+ "CONFIRMATION": "Подтверждение",
26
+ "COPY": "Копировать",
27
+ "CUT": "Вырезать",
28
+ "DELETE": "Удалить",
29
+ "DOUBLE_CLICK_TO_RENAME": "Дважды щелкните, чтобы переименовать",
30
+ "EDIT": "Редактировать",
31
+ "EDIT_DOCUMENT": "Редактировать документ",
32
+ "EVEN_PAGES_FOOTER": "Нижний колонтитул четных страниц",
33
+ "EVEN_PAGES_HEADER": "Верхний колонтитул четных страниц",
34
+ "FILE": "Файл",
35
+ "FILL_OR_PRINT_DOCUMENT": "Заполнить или распечатать документ",
36
+ "FIRST_PAGE_FOOTER": "Нижний колонтитул первой страницы",
37
+ "FIRST_PAGE_HEADER": "Верхний колонтитул первой страницы",
38
+ "FONT": "Шрифт",
39
+ "FOOTER": "Нижний колонтитул",
40
+ "FORMAT": "Формат",
41
+ "HEADER": "Верхний колонтитул",
42
+ "HEADERS_AND_FOOTERS": "Верхние и нижние колонтитулы",
43
+ "IMAGE": "Изображение",
44
+ "INSERT": "Вставить",
45
+ "INSERT_COLUMN_TO_THE_LEFT": "Вставить столбец слева",
46
+ "INSERT_COLUMN_TO_THE_RIGHT": "Вставить столбец справа",
47
+ "INSERT_FORMAT": "Вставить формат",
48
+ "INSERT_LINK": "Вставить ссылку",
49
+ "INSERT_ROW_ABOVE": "Вставить строку выше",
50
+ "INSERT_ROW_BELOW": "Вставить строку ниже",
51
+ "INSERT_TABLE": "Вставить таблицу",
52
+ "ITALIC": "Курсив",
53
+ "LAYOUT": "Макет",
54
+ "LEFT": "По левому краю",
55
+ "LINK": "Ссылка",
56
+ "LINK_OPTIONS": "Параметры ссылки",
57
+ "NEW": "Новый",
58
+ "NONE": "Нет",
59
+ "NUMBERED_LIST_MENU": "Меню нумерованного списка",
60
+ "ODD_PAGES_FOOTER": "Нижний колонтитул нечетных страниц",
61
+ "ODD_PAGES_HEADER": "Верхний колонтитул нечетных страниц",
62
+ "OPEN_FROM": "Открыть из",
63
+ "PAGE_BREAK": "Разрыв страницы",
64
+ "PASTE": "Вставить",
65
+ "PRINT": "Печать",
66
+ "QUICK_SELECT": "Быстрый выбор",
67
+ "READ_OR_PRINT_DOCUMENT": "Прочитать или распечатать документ",
68
+ "REDO": "Повторить",
69
+ "REMOVE_COLUMN": "Удалить столбец",
70
+ "REMOVE_ROW": "Удалить строку",
71
+ "RENAME": "Переименовать",
72
+ "REPLACE": "Заменить",
73
+ "REPLACE_WITH": "Заменить на",
74
+ "RIGHT": "По правому краю",
75
+ "ROWS": "Строки",
76
+ "SAVE_AS": "Сохранить как",
77
+ "SEARCH_FOR": "Поиск",
78
+ "SELECT_ALL": "Выбрать все",
79
+ "TABLE": "Таблица",
80
+ "TABLE_OPTIONS": "Параметры таблицы",
81
+ "TEXT": "Текст",
82
+ "TEXT_FORMAT": "Текстовый формат",
83
+ "TEXT_STYLE": "Стиль текста",
84
+ "THE_COLUMN_IS_REQUIRED": "Столбцы обязательны",
85
+ "THE_LINK_IS_REQUIRED": "Ссылка обязательна",
86
+ "THE_ROW_IS_REQUIRED": "Строки обязательны",
87
+ "THE_TEXT_IS_REQUIRED": "Текст обязателен",
88
+ "UNDERLINED": "Подчеркнутый",
89
+ "UNDO": "Отменить",
90
+ "UNTITLED_DOCUMENT": "Документ без названия"
91
+ }
92
+ }
93
+ }
@@ -1,11 +1,12 @@
1
- import { ChangeDetectionStrategy, Component, HostBinding, HostListener, Inject } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, HostBinding, HostListener } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { ReactiveFormsModule, Validators } from '@angular/forms';
4
- import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
4
+ import { MatDialogModule } from '@angular/material/dialog';
5
5
  import { MatButtonModule } from '@angular/material/button';
6
6
  import { MatFormFieldModule } from '@angular/material/form-field';
7
7
  import { MatIconModule } from '@angular/material/icon';
8
8
  import { MatInputModule } from '@angular/material/input';
9
+ import { TranslateModule } from '@ngx-translate/core';
9
10
  import { ValidationHelper } from './validation.helper';
10
11
  import * as i0 from "@angular/core";
11
12
  import * as i1 from "@angular/material/dialog";
@@ -14,23 +15,16 @@ import * as i3 from "@angular/material/button";
14
15
  import * as i4 from "@angular/material/form-field";
15
16
  import * as i5 from "@angular/material/icon";
16
17
  import * as i6 from "@angular/material/input";
17
- export class AddLinkDialogOptions {
18
- constructor(fields) {
19
- if (fields) {
20
- Object.assign(this, fields);
21
- }
22
- }
23
- }
18
+ import * as i7 from "@ngx-translate/core";
24
19
  export class AddLinkDialogComponent {
25
- constructor(dialogRef, data, fb) {
20
+ constructor(dialogRef, fb) {
26
21
  this.dialogRef = dialogRef;
27
- this.data = data;
28
22
  this.fb = fb;
29
23
  this.modal = true;
30
24
  dialogRef.disableClose = true;
31
25
  this.form = this.fb.group({
32
- text: [data.text],
33
- link: [data.link, [Validators.required, ValidationHelper.urlValidator]]
26
+ text: ['', Validators.required],
27
+ link: ['', [Validators.required, ValidationHelper.urlValidator]]
34
28
  });
35
29
  }
36
30
  onClose() {
@@ -51,16 +45,22 @@ export class AddLinkDialogComponent {
51
45
  }
52
46
  this.dialogRef.close({ text: this.form.controls.text.value, link: this.form.controls.link.value });
53
47
  }
54
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddLinkDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
55
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddLinkDialogComponent, isStandalone: true, selector: "app-nod-add-link-dialog", host: { listeners: { "keydown.esc": "onClose()", "keydown.enter": "onApply()" }, properties: { "class.noder-modal": "this.modal" } }, ngImport: i0, template: "<div mat-dialog-title>{{ data.title }}</div>\n<div\n mat-dialog-content\n [formGroup]=\"form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ data.textPlaceholder }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.text\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ data.linkPlaceholder }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.link\"\n required />\n <mat-error>The {{ data.linkPlaceholder }} is required.</mat-error>\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n Cancel\n </button>\n <button\n mat-raised-button\n color=\"primary\"\n class=\"apply-btn\"\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n Apply\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:300px;width:430px;overflow:hidden}:host ::ng-deep .mdc-text-field--outlined{--mdc-outlined-text-field-container-shape: 12px;height:48px}:host ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:12px}.mat-mdc-dialog-title{font-weight:600;padding-top:5px}mat-form-field{width:100%}.mat-mdc-dialog-content{padding-top:10px!important;padding-bottom:0}.mat-mdc-dialog-actions{display:flex;justify-content:center;padding-top:5px;height:40px;margin-bottom:30px}.mat-mdc-dialog-actions button{width:30%;height:100%;letter-spacing:1px;border-radius:8px;text-transform:uppercase}.mat-mdc-dialog-actions button .apply-btn{font-weight:400}.mat-mdc-dialog-actions button .mat-icon{font-size:24px;height:24px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
48
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddLinkDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
49
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddLinkDialogComponent, isStandalone: true, selector: "app-nod-add-link-dialog", host: { listeners: { "keydown.esc": "onClose()", "keydown.enter": "onApply()" }, properties: { "class.noder-modal": "this.modal" } }, ngImport: i0, template: "<div mat-dialog-title>{{ 'NODER.LABEL.ADD_LINK' | translate }}</div>\n<div\n mat-dialog-content\n [formGroup]=\"form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.TEXT' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.text\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_TEXT_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.LINK' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.link\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_LINK_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n {{ 'NODER.LABEL.CANCEL' | translate }}\n </button>\n <button\n mat-raised-button\n color=\"primary\"\n class=\"apply-btn\"\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n {{ 'NODER.LABEL.APPLY' | translate }}\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:300px;width:430px;overflow:hidden}:host ::ng-deep .mdc-text-field--outlined{--mdc-outlined-text-field-container-shape: 12px;height:48px}:host ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:12px}.mat-mdc-dialog-title{font-weight:600;padding-top:5px}mat-form-field{width:100%}.mat-mdc-dialog-content{padding-top:10px!important;padding-bottom:0}.mat-mdc-dialog-actions{display:flex;justify-content:center;padding-top:5px;height:40px;margin-bottom:30px}.mat-mdc-dialog-actions button{width:30%;height:100%;letter-spacing:1px;border-radius:8px;text-transform:uppercase}.mat-mdc-dialog-actions button .apply-btn{font-weight:400}.mat-mdc-dialog-actions button .mat-icon{font-size:24px;height:24px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
56
50
  }
57
51
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddLinkDialogComponent, decorators: [{
58
52
  type: Component,
59
- args: [{ standalone: true, imports: [CommonModule, MatButtonModule, MatDialogModule, MatFormFieldModule, MatIconModule, MatInputModule, ReactiveFormsModule], selector: 'app-nod-add-link-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div mat-dialog-title>{{ data.title }}</div>\n<div\n mat-dialog-content\n [formGroup]=\"form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ data.textPlaceholder }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.text\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ data.linkPlaceholder }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.link\"\n required />\n <mat-error>The {{ data.linkPlaceholder }} is required.</mat-error>\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n Cancel\n </button>\n <button\n mat-raised-button\n color=\"primary\"\n class=\"apply-btn\"\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n Apply\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:300px;width:430px;overflow:hidden}:host ::ng-deep .mdc-text-field--outlined{--mdc-outlined-text-field-container-shape: 12px;height:48px}:host ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:12px}.mat-mdc-dialog-title{font-weight:600;padding-top:5px}mat-form-field{width:100%}.mat-mdc-dialog-content{padding-top:10px!important;padding-bottom:0}.mat-mdc-dialog-actions{display:flex;justify-content:center;padding-top:5px;height:40px;margin-bottom:30px}.mat-mdc-dialog-actions button{width:30%;height:100%;letter-spacing:1px;border-radius:8px;text-transform:uppercase}.mat-mdc-dialog-actions button .apply-btn{font-weight:400}.mat-mdc-dialog-actions button .mat-icon{font-size:24px;height:24px}\n"] }]
60
- }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: AddLinkDialogOptions, decorators: [{
61
- type: Inject,
62
- args: [MAT_DIALOG_DATA]
63
- }] }, { type: i2.FormBuilder }], propDecorators: { modal: [{
53
+ args: [{ standalone: true, imports: [
54
+ CommonModule,
55
+ MatButtonModule,
56
+ MatDialogModule,
57
+ MatFormFieldModule,
58
+ MatIconModule,
59
+ MatInputModule,
60
+ ReactiveFormsModule,
61
+ TranslateModule
62
+ ], selector: 'app-nod-add-link-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div mat-dialog-title>{{ 'NODER.LABEL.ADD_LINK' | translate }}</div>\n<div\n mat-dialog-content\n [formGroup]=\"form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.TEXT' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.text\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_TEXT_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.LINK' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.link\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_LINK_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n {{ 'NODER.LABEL.CANCEL' | translate }}\n </button>\n <button\n mat-raised-button\n color=\"primary\"\n class=\"apply-btn\"\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n {{ 'NODER.LABEL.APPLY' | translate }}\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:300px;width:430px;overflow:hidden}:host ::ng-deep .mdc-text-field--outlined{--mdc-outlined-text-field-container-shape: 12px;height:48px}:host ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:12px}.mat-mdc-dialog-title{font-weight:600;padding-top:5px}mat-form-field{width:100%}.mat-mdc-dialog-content{padding-top:10px!important;padding-bottom:0}.mat-mdc-dialog-actions{display:flex;justify-content:center;padding-top:5px;height:40px;margin-bottom:30px}.mat-mdc-dialog-actions button{width:30%;height:100%;letter-spacing:1px;border-radius:8px;text-transform:uppercase}.mat-mdc-dialog-actions button .apply-btn{font-weight:400}.mat-mdc-dialog-actions button .mat-icon{font-size:24px;height:24px}\n"] }]
63
+ }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: i2.FormBuilder }], propDecorators: { modal: [{
64
64
  type: HostBinding,
65
65
  args: ['class.noder-modal']
66
66
  }], onClose: [{
@@ -70,4 +70,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
70
70
  type: HostListener,
71
71
  args: ['keydown.enter']
72
72
  }] } });
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWxpbmstZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1ub2Rlci9zcmMvbGliL2FwYXJ0LWNvbXBvbmVudHMvYWRkLWxpbmstZGlhbG9nL2FkZC1saW5rLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9kZXIvc3JjL2xpYi9hcGFydC1jb21wb25lbnRzL2FkZC1saW5rLWRpYWxvZy9hZGQtbGluay1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF1QyxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7QUFFdkQsTUFBTSxPQUFPLG9CQUFvQjtJQU83QixZQUFtQixNQUFzQztRQUNyRCxJQUFJLE1BQU0sRUFBRTtZQUNSLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQy9C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dGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dNb2R1bGUsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcblxuaW1wb3J0IHsgVmFsaWRhdGlvbkhlbHBlciB9IGZyb20gJy4vdmFsaWRhdGlvbi5oZWxwZXInO1xuXG5leHBvcnQgY2xhc3MgQWRkTGlua0RpYWxvZ09wdGlvbnMge1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICAgIHB1YmxpYyB0ZXh0OiBzdHJpbmc7XG4gICAgcHVibGljIHRleHRQbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgIHB1YmxpYyBsaW5rOiBzdHJpbmc7XG4gICAgcHVibGljIGxpbmtQbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGZpZWxkcz86IFBhcnRpYWw8QWRkTGlua0RpYWxvZ09wdGlvbnM+KSB7XG4gICAgICAgIGlmIChmaWVsZHMpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZmllbGRzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdERpYWxvZ01vZHVsZSwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gICAgc2VsZWN0b3I6ICdhcHAtbm9kLWFkZC1saW5rLWRpYWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICdhZGQtbGluay1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydhZGQtbGluay1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBBZGRMaW5rRGlhbG9nQ29tcG9uZW50IHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm5vZGVyLW1vZGFsJykgbW9kYWwgPSB0cnVlO1xuXG4gICAgZm9ybTogRm9ybUdyb3VwPHsgdGV4dDogRm9ybUNvbnRyb2w8c3RyaW5nPjsgbGluazogRm9ybUNvbnRyb2w8c3RyaW5nPiB9PjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8QWRkTGlua0RpYWxvZ0NvbXBvbmVudD4sXG4gICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogQWRkTGlua0RpYWxvZ09wdGlvbnMsXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyXG4gICAgKSB7XG4gICAgICAgIGRpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIHRleHQ6IFtkYXRhLnRleHRdLFxuICAgICAgICAgICAgbGluazogW2RhdGEubGluaywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRpb25IZWxwZXIudXJsVmFsaWRhdG9yXV1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lc2MnKVxuICAgIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lbnRlcicpXG4gICAgb25BcHBseSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb3JtLmNvbnRyb2xzLnRleHQudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy50ZXh0LnNldFZhbHVlKHRoaXMuZm9ybS5jb250cm9scy50ZXh0LnZhbHVlLnRyaW0oKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZm9ybS5jb250cm9scy50ZXh0LnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMudGV4dC5zZXRWYWx1ZSh0aGlzLmZvcm0uY29udHJvbHMubGluay52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZm9ybS5jb250cm9scy5saW5rLnZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmxpbmsuc2V0VmFsdWUoJ2h0dHA6Ly8nICsgdGhpcy5mb3JtLmNvbnRyb2xzLmxpbmsudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyB0ZXh0OiB0aGlzLmZvcm0uY29udHJvbHMudGV4dC52YWx1ZSwgbGluazogdGhpcy5mb3JtLmNvbnRyb2xzLmxpbmsudmFsdWUgfSk7XG4gICAgfVxufVxuIiwiPGRpdiBtYXQtZGlhbG9nLXRpdGxlPnt7IGRhdGEudGl0bGUgfX08L2Rpdj5cbjxkaXZcbiAgICBtYXQtZGlhbG9nLWNvbnRlbnRcbiAgICBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyBkYXRhLnRleHRQbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9scy50ZXh0XCIgLz5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7IGRhdGEubGlua1BsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtLmNvbnRyb2xzLmxpbmtcIlxuICAgICAgICAgICAgcmVxdWlyZWQgLz5cbiAgICAgICAgPG1hdC1lcnJvcj5UaGUge3sgZGF0YS5saW5rUGxhY2Vob2xkZXIgfX0gaXMgcmVxdWlyZWQuPC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbjwvZGl2PlxuPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvblxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJvbkNsb3NlKClcIj5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICBmb250U2V0PVwibm9kZXItaWNvblwiXG4gICAgICAgICAgICBmb250SWNvbj1cImljb24tY2FuY2VsLXRoaW5cIiAvPlxuICAgICAgICBDYW5jZWxcbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgIGNsYXNzPVwiYXBwbHktYnRuXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiXG4gICAgICAgIChjbGljayk9XCJvbkFwcGx5KClcIj5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICBmb250U2V0PVwibm9kZXItaWNvblwiXG4gICAgICAgICAgICBmb250SWNvbj1cImljb24tZG9uZS10aGluXCIgLz5cbiAgICAgICAgQXBwbHlcbiAgICA8L2J1dHRvbj5cbjwvZGl2PlxuIl19
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWxpbmstZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1ub2Rlci9zcmMvbGliL2FwYXJ0LWNvbXBvbmVudHMvYWRkLWxpbmstZGlhbG9nL2FkZC1saW5rLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9kZXIvc3JjL2xpYi9hcGFydC1jb21wb25lbnRzL2FkZC1saW5rLWRpYWxvZy9hZGQtbGluay1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXVDLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7QUFtQnZELE1BQU0sT0FBTyxzQkFBc0I7SUFLL0IsWUFBbUIsU0FBK0MsRUFBVSxFQUFlO1FBQXhFLGNBQVMsR0FBVCxTQUFTLENBQXNDO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUp6RCxVQUFLLEdBQUcsSUFBSSxDQUFDO1FBSzNDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDdEIsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDL0IsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNuRSxDQUFDLENBQUM7SUFDUCxDQUFDO0lBR0QsT0FBTztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUdELE9BQU87UUFDSCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ25CLE9BQU87U0FDVjtRQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUMxRTtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25FO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMvRTtRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7K0dBckNRLHNCQUFzQjttR0FBdEIsc0JBQXNCLHlOQzdCbkMsczNDQTBDQSxtMUJEM0JRLFlBQVksOEJBQ1osZUFBZSwyTkFDZixlQUFlLHliQUNmLGtCQUFrQix1WUFDbEIsYUFBYSxtTEFDYixjQUFjLDBXQUNkLG1CQUFtQixtbENBQ25CLGVBQWU7OzRGQU9WLHNCQUFzQjtrQkFqQmxDLFNBQVM7aUNBQ00sSUFBSSxXQUNQO3dCQUNMLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsYUFBYTt3QkFDYixjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsZUFBZTtxQkFDbEIsWUFDUyx5QkFBeUIsbUJBR2xCLHVCQUF1QixDQUFDLE1BQU07MkdBR2IsS0FBSztzQkFBdEMsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBYWhDLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxhQUFhO2dCQU0zQixPQUFPO3NCQUROLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbmltcG9ydCB7IFZhbGlkYXRpb25IZWxwZXIgfSBmcm9tICcuL3ZhbGlkYXRpb24uaGVscGVyJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgICAgICBNYXREaWFsb2dNb2R1bGUsXG4gICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcbiAgICAgICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZVxuICAgIF0sXG4gICAgc2VsZWN0b3I6ICdhcHAtbm9kLWFkZC1saW5rLWRpYWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICdhZGQtbGluay1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydhZGQtbGluay1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBBZGRMaW5rRGlhbG9nQ29tcG9uZW50IHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm5vZGVyLW1vZGFsJykgbW9kYWwgPSB0cnVlO1xuXG4gICAgZm9ybTogRm9ybUdyb3VwPHsgdGV4dDogRm9ybUNvbnRyb2w8c3RyaW5nPjsgbGluazogRm9ybUNvbnRyb2w8c3RyaW5nPiB9PjtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxBZGRMaW5rRGlhbG9nQ29tcG9uZW50PiwgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICAgICAgZGlhbG9nUmVmLmRpc2FibGVDbG9zZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgdGV4dDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIGxpbms6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRpb25IZWxwZXIudXJsVmFsaWRhdG9yXV1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lc2MnKVxuICAgIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lbnRlcicpXG4gICAgb25BcHBseSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb3JtLmNvbnRyb2xzLnRleHQudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy50ZXh0LnNldFZhbHVlKHRoaXMuZm9ybS5jb250cm9scy50ZXh0LnZhbHVlLnRyaW0oKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZm9ybS5jb250cm9scy50ZXh0LnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMudGV4dC5zZXRWYWx1ZSh0aGlzLmZvcm0uY29udHJvbHMubGluay52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZm9ybS5jb250cm9scy5saW5rLnZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmxpbmsuc2V0VmFsdWUoJ2h0dHA6Ly8nICsgdGhpcy5mb3JtLmNvbnRyb2xzLmxpbmsudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyB0ZXh0OiB0aGlzLmZvcm0uY29udHJvbHMudGV4dC52YWx1ZSwgbGluazogdGhpcy5mb3JtLmNvbnRyb2xzLmxpbmsudmFsdWUgfSk7XG4gICAgfVxufVxuIiwiPGRpdiBtYXQtZGlhbG9nLXRpdGxlPnt7ICdOT0RFUi5MQUJFTC5BRERfTElOSycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbjxkaXZcbiAgICBtYXQtZGlhbG9nLWNvbnRlbnRcbiAgICBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyAnTk9ERVIuTEFCRUwuVEVYVCcgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm0uY29udHJvbHMudGV4dFwiXG4gICAgICAgICAgICByZXF1aXJlZCAvPlxuICAgICAgICA8bWF0LWVycm9yPnt7ICdOT0RFUi5MQUJFTC5USEVfVEVYVF9JU19SRVFVSVJFRCcgfCB0cmFuc2xhdGUgfX0uPC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyAnTk9ERVIuTEFCRUwuTElOSycgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm0uY29udHJvbHMubGlua1wiXG4gICAgICAgICAgICByZXF1aXJlZCAvPlxuICAgICAgICA8bWF0LWVycm9yPnt7ICdOT0RFUi5MQUJFTC5USEVfTElOS19JU19SRVFVSVJFRCcgfCB0cmFuc2xhdGUgfX0uPC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbjwvZGl2PlxuPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvblxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJvbkNsb3NlKClcIj5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICBmb250U2V0PVwibm9kZXItaWNvblwiXG4gICAgICAgICAgICBmb250SWNvbj1cImljb24tY2FuY2VsLXRoaW5cIiAvPlxuICAgICAgICB7eyAnTk9ERVIuTEFCRUwuQ0FOQ0VMJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgY2xhc3M9XCJhcHBseS1idG5cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQXBwbHkoKVwiPlxuICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgIGZvbnRTZXQ9XCJub2Rlci1pY29uXCJcbiAgICAgICAgICAgIGZvbnRJY29uPVwiaWNvbi1kb25lLXRoaW5cIiAvPlxuICAgICAgICB7eyAnTk9ERVIuTEFCRUwuQVBQTFknIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==