@qbs-origin/origin-form 0.5.0

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 (182) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/action-step-handler.mjs +163 -0
  3. package/esm2022/lib/auth-client.service.mjs +69 -0
  4. package/esm2022/lib/enums/label.keys.mjs +721 -0
  5. package/esm2022/lib/form-css.helper.mjs +367 -0
  6. package/esm2022/lib/formly/baseFormlyControlComponent.mjs +52 -0
  7. package/esm2022/lib/formly/baseFormlyStepComponent.mjs +59 -0
  8. package/esm2022/lib/formly/custom-section-separator.component.mjs +32 -0
  9. package/esm2022/lib/formly/form-section-separator.component.mjs +36 -0
  10. package/esm2022/lib/formly/formly-action.mjs +56 -0
  11. package/esm2022/lib/formly/formly-checkbox/formly-checkbox.component.mjs +52 -0
  12. package/esm2022/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.mjs +261 -0
  13. package/esm2022/lib/formly/formly-download-documents/formly-download-documents.component.mjs +126 -0
  14. package/esm2022/lib/formly/formly-enrol-card/formly-enrol-card.component.mjs +120 -0
  15. package/esm2022/lib/formly/formly-field-stepper/formly-field-stepper.component.mjs +762 -0
  16. package/esm2022/lib/formly/formly-generate-documents/formly-generate-documents.component.mjs +57 -0
  17. package/esm2022/lib/formly/formly-identification.component.mjs +84 -0
  18. package/esm2022/lib/formly/formly-open-banking/formly-open-banking.component.mjs +590 -0
  19. package/esm2022/lib/formly/formly-paragraph/formly-paragraph.component.mjs +35 -0
  20. package/esm2022/lib/formly/formly-radio/formly-radio-component.mjs +49 -0
  21. package/esm2022/lib/formly/formly-row-fille.mjs +12 -0
  22. package/esm2022/lib/formly/formly-scan-id/formly-scan-id.component.mjs +284 -0
  23. package/esm2022/lib/formly/formly-sign/formly-sign.component.mjs +173 -0
  24. package/esm2022/lib/formly/formly-upload-documents/formly-upload-documents.component.mjs +198 -0
  25. package/esm2022/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.mjs +124 -0
  26. package/esm2022/lib/formly/formly-view-documents/formly-view-documents.component.mjs +245 -0
  27. package/esm2022/lib/formly/formly-view-offers/formly-view-offers.component.mjs +160 -0
  28. package/esm2022/lib/model-population.helper.mjs +265 -0
  29. package/esm2022/lib/models/application-type.model.mjs +12 -0
  30. package/esm2022/lib/models/application.model.mjs +30 -0
  31. package/esm2022/lib/models/auth/users.model.mjs +2 -0
  32. package/esm2022/lib/models/dictionary.model.mjs +20 -0
  33. package/esm2022/lib/models/flux.model.mjs +105 -0
  34. package/esm2022/lib/models/forms.model.mjs +572 -0
  35. package/esm2022/lib/models/label-info.model.mjs +2 -0
  36. package/esm2022/lib/models/label.model.mjs +2 -0
  37. package/esm2022/lib/models/language.model.mjs +3 -0
  38. package/esm2022/lib/models/list.model.mjs +2 -0
  39. package/esm2022/lib/models/partner.model.mjs +3 -0
  40. package/esm2022/lib/models/treeview.model.mjs +15 -0
  41. package/esm2022/lib/origin-form-auth.service.mjs +40 -0
  42. package/esm2022/lib/origin-form-config.model.mjs +2 -0
  43. package/esm2022/lib/origin-form-token.interceptor.mjs +35 -0
  44. package/esm2022/lib/origin-form.component.mjs +2391 -0
  45. package/esm2022/lib/origin-form.module.mjs +479 -0
  46. package/esm2022/lib/origin-form.service.mjs +14 -0
  47. package/esm2022/lib/others/check-list.database.mjs +55 -0
  48. package/esm2022/lib/others/config-service.mjs +42 -0
  49. package/esm2022/lib/others/dictionary-label-info.mjs +3 -0
  50. package/esm2022/lib/others/environment-type.mjs +21 -0
  51. package/esm2022/lib/others/external-link.directive.mjs +49 -0
  52. package/esm2022/lib/others/flux-helper.mjs +1397 -0
  53. package/esm2022/lib/others/picker.component.mjs +119 -0
  54. package/esm2022/lib/others/translation.pipe.mjs +21 -0
  55. package/esm2022/lib/others/translations-helper.mjs +258 -0
  56. package/esm2022/lib/others/utils.mjs +272 -0
  57. package/esm2022/lib/services/applicationData.service.mjs +145 -0
  58. package/esm2022/lib/services/auth-http.service.mjs +80 -0
  59. package/esm2022/lib/services/dialog.service.mjs +56 -0
  60. package/esm2022/lib/services/dictionary.service.mjs +198 -0
  61. package/esm2022/lib/services/forms.service.mjs +47 -0
  62. package/esm2022/lib/services/labels.service.mjs +29 -0
  63. package/esm2022/lib/services/language.service.mjs +24 -0
  64. package/esm2022/lib/services/open-banking.service.mjs +194 -0
  65. package/esm2022/lib/services/origin-form-signalr-handler.service.mjs +107 -0
  66. package/esm2022/lib/services/origin-form-signalr.service.mjs +105 -0
  67. package/esm2022/lib/services/otp.service.mjs +28 -0
  68. package/esm2022/lib/services/proxy.service.mjs +79 -0
  69. package/esm2022/lib/services/scroll-to-error.service.mjs +369 -0
  70. package/esm2022/lib/services/translation.service.mjs +27 -0
  71. package/esm2022/lib/shared-components/confirmation.component.mjs +34 -0
  72. package/esm2022/lib/shared-components/dictionaries-tree.component.mjs +301 -0
  73. package/esm2022/lib/shared-components/grid.component.mjs +241 -0
  74. package/esm2022/lib/shared-components/treeview/treeview.component.mjs +224 -0
  75. package/esm2022/lib/theme-css.mjs +2254 -0
  76. package/esm2022/lib/theme-injector.service.mjs +26 -0
  77. package/esm2022/public-api.mjs +4 -0
  78. package/esm2022/qbs-origin-origin-form.mjs +5 -0
  79. package/fesm2022/qbs-origin-origin-form.mjs +15215 -0
  80. package/fesm2022/qbs-origin-origin-form.mjs.map +1 -0
  81. package/index.d.ts +5 -0
  82. package/lib/action-step-handler.d.ts +49 -0
  83. package/lib/auth-client.service.d.ts +17 -0
  84. package/lib/enums/label.keys.d.ts +720 -0
  85. package/lib/form-css.helper.d.ts +28 -0
  86. package/lib/formly/baseFormlyControlComponent.d.ts +25 -0
  87. package/lib/formly/baseFormlyStepComponent.d.ts +29 -0
  88. package/lib/formly/custom-section-separator.component.d.ts +6 -0
  89. package/lib/formly/form-section-separator.component.d.ts +10 -0
  90. package/lib/formly/formly-action.d.ts +13 -0
  91. package/lib/formly/formly-checkbox/formly-checkbox.component.d.ts +15 -0
  92. package/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.d.ts +45 -0
  93. package/lib/formly/formly-download-documents/formly-download-documents.component.d.ts +22 -0
  94. package/lib/formly/formly-enrol-card/formly-enrol-card.component.d.ts +114 -0
  95. package/lib/formly/formly-field-stepper/formly-field-stepper.component.d.ts +79 -0
  96. package/lib/formly/formly-generate-documents/formly-generate-documents.component.d.ts +17 -0
  97. package/lib/formly/formly-identification.component.d.ts +19 -0
  98. package/lib/formly/formly-open-banking/formly-open-banking.component.d.ts +119 -0
  99. package/lib/formly/formly-paragraph/formly-paragraph.component.d.ts +10 -0
  100. package/lib/formly/formly-radio/formly-radio-component.d.ts +15 -0
  101. package/lib/formly/formly-row-fille.d.ts +6 -0
  102. package/lib/formly/formly-scan-id/formly-scan-id.component.d.ts +41 -0
  103. package/lib/formly/formly-sign/formly-sign.component.d.ts +36 -0
  104. package/lib/formly/formly-upload-documents/formly-upload-documents.component.d.ts +25 -0
  105. package/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.d.ts +79 -0
  106. package/lib/formly/formly-view-documents/formly-view-documents.component.d.ts +33 -0
  107. package/lib/formly/formly-view-offers/formly-view-offers.component.d.ts +23 -0
  108. package/lib/model-population.helper.d.ts +8 -0
  109. package/lib/models/application-type.model.d.ts +27 -0
  110. package/lib/models/application.model.d.ts +107 -0
  111. package/lib/models/auth/users.model.d.ts +20 -0
  112. package/lib/models/dictionary.model.d.ts +77 -0
  113. package/lib/models/flux.model.d.ts +101 -0
  114. package/lib/models/forms.model.d.ts +504 -0
  115. package/lib/models/label-info.model.d.ts +10 -0
  116. package/lib/models/label.model.d.ts +4 -0
  117. package/lib/models/language.model.d.ts +5 -0
  118. package/lib/models/list.model.d.ts +8 -0
  119. package/lib/models/partner.model.d.ts +12 -0
  120. package/lib/models/treeview.model.d.ts +17 -0
  121. package/lib/origin-form-auth.service.d.ts +15 -0
  122. package/lib/origin-form-config.model.d.ts +12 -0
  123. package/lib/origin-form-token.interceptor.d.ts +12 -0
  124. package/lib/origin-form.component.d.ts +231 -0
  125. package/lib/origin-form.module.d.ts +84 -0
  126. package/lib/origin-form.service.d.ts +6 -0
  127. package/lib/others/check-list.database.d.ts +16 -0
  128. package/lib/others/config-service.d.ts +22 -0
  129. package/lib/others/dictionary-label-info.d.ts +6 -0
  130. package/lib/others/environment-type.d.ts +8 -0
  131. package/lib/others/external-link.directive.d.ts +12 -0
  132. package/lib/others/flux-helper.d.ts +115 -0
  133. package/lib/others/picker.component.d.ts +36 -0
  134. package/lib/others/translation.pipe.d.ts +10 -0
  135. package/lib/others/translations-helper.d.ts +31 -0
  136. package/lib/others/utils.d.ts +37 -0
  137. package/lib/services/applicationData.service.d.ts +35 -0
  138. package/lib/services/auth-http.service.d.ts +21 -0
  139. package/lib/services/dialog.service.d.ts +20 -0
  140. package/lib/services/dictionary.service.d.ts +89 -0
  141. package/lib/services/forms.service.d.ts +17 -0
  142. package/lib/services/labels.service.d.ts +13 -0
  143. package/lib/services/language.service.d.ts +14 -0
  144. package/lib/services/open-banking.service.d.ts +137 -0
  145. package/lib/services/origin-form-signalr-handler.service.d.ts +29 -0
  146. package/lib/services/origin-form-signalr.service.d.ts +24 -0
  147. package/lib/services/otp.service.d.ts +22 -0
  148. package/lib/services/proxy.service.d.ts +29 -0
  149. package/lib/services/scroll-to-error.service.d.ts +54 -0
  150. package/lib/services/translation.service.d.ts +10 -0
  151. package/lib/shared-components/confirmation.component.d.ts +77 -0
  152. package/lib/shared-components/dictionaries-tree.component.d.ts +51 -0
  153. package/lib/shared-components/grid.component.d.ts +138 -0
  154. package/lib/shared-components/treeview/treeview.component.d.ts +121 -0
  155. package/lib/theme-css.d.ts +2 -0
  156. package/lib/theme-injector.service.d.ts +8 -0
  157. package/package.json +42 -0
  158. package/public-api.d.ts +3 -0
  159. package/schematics-compiled/collection.json +10 -0
  160. package/schematics-compiled/ng-add/index.d.ts +2 -0
  161. package/schematics-compiled/ng-add/index.js +67 -0
  162. package/schematics-compiled/ng-add/index.js.map +1 -0
  163. package/schematics-compiled/ng-add/schema.json +8 -0
  164. package/src/lib/assets/fonts/Figtree-Bold.ttf +0 -0
  165. package/src/lib/assets/fonts/Figtree-Light.ttf +0 -0
  166. package/src/lib/assets/fonts/Figtree-Regular.ttf +0 -0
  167. package/src/lib/assets/fonts/Sora-ExtraBold.ttf +0 -0
  168. package/src/lib/assets/fonts/Sora-Light.ttf +0 -0
  169. package/src/lib/assets/fonts/Sora-Regular.ttf +0 -0
  170. package/src/lib/assets/fonts/ttrounds-bold-webfont.woff +0 -0
  171. package/src/lib/assets/fonts/ttrounds-bold-webfont.woff2 +0 -0
  172. package/src/lib/assets/fonts/ttrounds-regular-webfont.woff +0 -0
  173. package/src/lib/assets/fonts/ttrounds-regular-webfont.woff2 +0 -0
  174. package/src/lib/assets/fonts/ttrounds-thin-webfont.woff +0 -0
  175. package/src/lib/assets/fonts/ttrounds-thin-webfont.woff2 +0 -0
  176. package/src/lib/assets/images/flag/icon-flag-de.svg +10 -0
  177. package/src/lib/assets/images/flag/icon-flag-en.svg +1 -0
  178. package/src/lib/assets/images/flag/icon-flag-es.svg +11 -0
  179. package/src/lib/assets/images/flag/icon-flag-fr.svg +1 -0
  180. package/src/lib/assets/images/flag/icon-flag-ro.svg +11 -0
  181. package/src/lib/assets/images/flag/origin-form/new-id-card.png +0 -0
  182. package/src/lib/assets/images/flag/origin-form/old-id-card.png +0 -0
@@ -0,0 +1,241 @@
1
+ import { Component, ContentChildren, EventEmitter, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
2
+ import { FormControl } from '@angular/forms';
3
+ import { MatPaginator } from '@angular/material/paginator';
4
+ import { MatSort } from '@angular/material/sort';
5
+ import { MatTableDataSource } from '@angular/material/table';
6
+ import { merge } from 'rxjs';
7
+ import { LabelKeys } from '../enums/label.keys';
8
+ import { ConfirmationComponent } from './confirmation.component';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/material/dialog";
11
+ import * as i2 from "@angular/router";
12
+ import * as i3 from "@angular/common";
13
+ import * as i4 from "@angular/forms";
14
+ import * as i5 from "@angular/material/input";
15
+ import * as i6 from "@angular/material/form-field";
16
+ import * as i7 from "@angular/material/slide-toggle";
17
+ import * as i8 from "@angular/material/button";
18
+ import * as i9 from "@angular/material/icon";
19
+ import * as i10 from "@angular/material/paginator";
20
+ import * as i11 from "@angular/material/sort";
21
+ import * as i12 from "@angular/material/table";
22
+ export class GridComponent {
23
+ constructor(dialog, router, cdr) {
24
+ this.dialog = dialog;
25
+ this.router = router;
26
+ this.cdr = cdr;
27
+ this.commonKeys = LabelKeys.common;
28
+ this.columns = [];
29
+ this.config = {};
30
+ this.reload = new EventEmitter();
31
+ this.delete = new EventEmitter();
32
+ this.duplicate = new EventEmitter();
33
+ this.open = new EventEmitter();
34
+ this.paginator = Object.create(null);
35
+ this.sort = Object.create(null);
36
+ this.dataSource = null;
37
+ this.filterField = new FormControl('');
38
+ this.stateToggle = new FormControl('');
39
+ }
40
+ ngOnChanges(changes) {
41
+ if (this.async === false && changes['data']) {
42
+ this.refreshUI();
43
+ }
44
+ }
45
+ ngAfterContentInit() {
46
+ this.dataColumns = this.columns.map((i) => i.id);
47
+ this.async = !this.isNumber(this.count);
48
+ if (!this.async) {
49
+ this.dataSource = new MatTableDataSource(this.data);
50
+ }
51
+ }
52
+ ngAfterViewInit() {
53
+ if (this.config.pages ?? true) {
54
+ this.initPaginator();
55
+ if (this.sort && this.sort.sortChange) {
56
+ this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0));
57
+ merge(this.sort.sortChange, this.paginator.page).subscribe(() => {
58
+ this.refresh();
59
+ });
60
+ }
61
+ }
62
+ if (!this.async && this.dataSource) {
63
+ this.dataSource.paginator = this.paginator;
64
+ this.dataSource.sort = this.sort;
65
+ }
66
+ const filter = new URL(location.href).searchParams.get('filter');
67
+ if (filter) {
68
+ this.filterField.setValue(filter);
69
+ this.filter();
70
+ }
71
+ }
72
+ refreshUI() {
73
+ this.dataSource = new MatTableDataSource(this.data);
74
+ this.initPaginator();
75
+ this.cdr.detectChanges();
76
+ }
77
+ initPaginator() {
78
+ if (this.paginator && this.paginator._intl) {
79
+ this.paginator._intl.getRangeLabel = (page, pageSize, length) => {
80
+ if (!this.async && !this.dataSource.filter && this.count) {
81
+ length = this.count;
82
+ this.paginator.length = this.count;
83
+ }
84
+ this.paginator._intl.itemsPerPageLabel =
85
+ this.commonKeys.pagination.perPage;
86
+ const separator = this.commonKeys.pagination.of;
87
+ if (length === 0 || pageSize === 0) {
88
+ return `0 ${separator} 0`;
89
+ }
90
+ length = Math.max(length, 0);
91
+ const startIndex = page * pageSize;
92
+ const endIndex = startIndex < length
93
+ ? Math.min(startIndex + pageSize, length)
94
+ : startIndex + pageSize;
95
+ return `${startIndex + 1} - ${endIndex} ${separator} ${length}`;
96
+ };
97
+ }
98
+ }
99
+ refresh() {
100
+ this.reload.emit({
101
+ page: this.paginator.pageIndex + 1,
102
+ pageSize: this.paginator.pageSize,
103
+ sort: this.sort.active,
104
+ sortDirection: this.sort.direction,
105
+ filter: this.filterField.value ?? '',
106
+ state: this.config.stateFilter ? !!this.stateToggle.value : null,
107
+ });
108
+ }
109
+ filter() {
110
+ const filter = this.filterField.value ?? '';
111
+ const params = new URLSearchParams(window.location.search);
112
+ if (filter)
113
+ params.set('filter', filter);
114
+ else
115
+ params.delete('filter');
116
+ window.history.replaceState({}, '', window.location.pathname +
117
+ (params.has('filter') ? '?' : '') +
118
+ params.toString());
119
+ if (!this.async && this.dataSource) {
120
+ this.dataSource.filter = filter.trim().toLowerCase();
121
+ }
122
+ else {
123
+ this.refresh();
124
+ }
125
+ }
126
+ toggleState() {
127
+ this.refresh();
128
+ }
129
+ clickDelete(item) {
130
+ const dialog = this.dialog.open(ConfirmationComponent, {
131
+ data: { item: item, text: 'common.confirmation.delete' },
132
+ width: '100%',
133
+ maxWidth: 'min(95vw, 430px)',
134
+ });
135
+ dialog.afterClosed().subscribe((result) => {
136
+ if (result?.event === 'submit') {
137
+ this.delete.emit(result.item);
138
+ }
139
+ });
140
+ }
141
+ clickDuplicate(item) {
142
+ this.duplicate.emit({ item: item });
143
+ }
144
+ buttonClick(column, element) {
145
+ if (column.route) {
146
+ const route = column.route.replace('{id}', element[this.config.PK ?? 'id']);
147
+ if (column.newTab === true) {
148
+ this.openInNewTab(route);
149
+ }
150
+ else {
151
+ this.router.navigate([route]);
152
+ }
153
+ }
154
+ }
155
+ openInNewTab(route) {
156
+ let baseUrl = window.location.href.replace(this.router.url, '');
157
+ window.open(baseUrl + route, '_blank');
158
+ }
159
+ clickOpen(id) {
160
+ this.open.emit({ id });
161
+ }
162
+ isNumber(val) {
163
+ return typeof val === 'number';
164
+ }
165
+ isDate(val) {
166
+ const datePatterns = [
167
+ /^\d{4}-\d{2}-\d{2}$/,
168
+ /^\d{2}\/\d{2}\/\d{4}$/,
169
+ /^\d{2}-\d{2}-\d{4}$/,
170
+ /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?$/,
171
+ ];
172
+ if (typeof val === 'string' &&
173
+ datePatterns.some((pattern) => pattern.test(val))) {
174
+ const date = new Date(val);
175
+ return date instanceof Date && !isNaN(date.valueOf());
176
+ }
177
+ return false;
178
+ }
179
+ typeOf(val) {
180
+ return typeof val;
181
+ }
182
+ getObjectValues(key, row) {
183
+ let keys = key.split('.', 2);
184
+ let value = row[keys[0]];
185
+ // Check if value exists and is an array before calling map
186
+ if (!value || !Array.isArray(value)) {
187
+ // If the key contains a dot but it's not for nested properties,
188
+ // try to access it directly as a property name with dot
189
+ if (row.hasOwnProperty(key)) {
190
+ return row[key];
191
+ }
192
+ return '';
193
+ }
194
+ return value
195
+ .map((i) => keys[1].includes('.')
196
+ ? this.getObjectValues(keys[1], i[keys[1]])
197
+ : i[keys[1]])
198
+ .join(', ');
199
+ }
200
+ getTemplateRef(templateKey) {
201
+ if (!templateKey || !this.templates) {
202
+ return null;
203
+ }
204
+ return (this.templates.find((t) => {
205
+ const localNames = t._declarationTContainer?.localNames || [];
206
+ return localNames.includes(templateKey);
207
+ }) || null);
208
+ }
209
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GridComponent, deps: [{ token: i1.MatDialog }, { token: i2.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
210
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GridComponent, selector: "shared-grid", inputs: { data: "data", count: "count", columns: "columns", config: "config" }, outputs: { reload: "reload", delete: "delete", duplicate: "duplicate", open: "open" }, queries: [{ propertyName: "templates", predicate: TemplateRef }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"count !== 0 && (config.filter ?? true)\" class=\"row justify-content-between m-b-8\">\n <div class=\"col-12 col-md-5 col-lg-4 col-xl-3 p-l-0\">\n <mat-form-field appearance=\"outline\" class=\"w-100 hide-hint custom-field\">\n <input matInput [formControl]=\"filterField\" (keyup)=\"filter()\"\n placeholder=\"{{ commonKeys.actions.filter }}\" />\n </mat-form-field>\n </div>\n <div *ngIf=\"config.stateFilter\" class=\"col-12 col-md-5 col-lg-4 col-xl-3\">\n {{ commonKeys.actions.includeInactive }}\n <mat-slide-toggle [formControl]=\"stateToggle\" (click)=\"toggleState()\" class=\"m-l-4 m-t-10\"></mat-slide-toggle>\n </div>\n <div class=\"col\"></div>\n</div>\n\n<ng-container *ngIf=\"count === 0; else grid\">\n {{ commonKeys.pagination.noItems }}\n</ng-container>\n\n<ng-template #grid>\n <div class=\"table-responsive m-t-20\">\n <table mat-table [dataSource]=\"dataSource || (data | async)!\" matSort matSortActive=\"{{ config.sort ?? 'id' }}\"\n matSortDisableClear [matSortDirection]=\"config.sortDirection ?? 'asc'\" class=\"w-100\">\n <ng-container *ngFor=\"let column of columns\" matColumnDef=\"{{ column.id }}\">\n\n <ng-container *ngIf=\"!column.templateKey; else templateCell\">\n <ng-container *ngIf=\"column.route === undefined; else routeHeader\">\n <ng-container *ngIf=\"column.sortable === true; else unsortable\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef class=\"f-s-16 f-w-700\">\n {{ column.title }}{{ column.label }}\n </th>\n </ng-container>\n <ng-template #unsortable>\n <th mat-header-cell *matHeaderCellDef class=\"f-s-16 f-w-700\">\n {{ column.title }}{{ column.label }}\n </th>\n </ng-template>\n\n <td mat-cell *matCellDef=\"let element\" class=\"f-s-14\">\n <ng-container *ngIf=\"isDate(element[column.id]); else second\">\n {{ element[column.id] | date : \"dd.MM.yyyy hh:mm\" }}\n </ng-container>\n <ng-template #second>\n <ng-container *ngIf=\"typeOf(element[column.id]) === 'boolean'; else third\">\n <ng-container *ngIf=\"element[column.id] === true; else disabled\">\n <mat-icon>\n <i-tabler name=\"check\" class=\"icon-18\"></i-tabler>\n </mat-icon>\n </ng-container>\n <ng-template #disabled>\n <i-tabler name=\"x\" class=\"icon-18\"></i-tabler>\n </ng-template>\n </ng-container>\n </ng-template>\n <ng-template #third>\n <ng-container *ngIf=\"column.id.includes('.'); else fourth\">\n {{ getObjectValues(column.id, element) }}\n </ng-container>\n </ng-template>\n <ng-template #fourth>\n {{ element[column.id] }}\n </ng-template>\n </td>\n </ng-container>\n\n <ng-template #routeHeader>\n <th width=\"1\" mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element\" class=\"f-s-14 text-right\">\n <button *ngIf=\"column.id != 'delete' && column.id != 'open'\" mat-stroked-button\n (click)=\"buttonClick(column, element)\">\n <mat-icon *ngIf=\"column.icon\" class=\"m-0\">\n <i-tabler name=\"{{ column.icon }}\" class=\"icon-18\"></i-tabler>\n </mat-icon>\n <span *ngIf=\"column.icon && (column.title || column.label)\">&nbsp;</span>\n <span>{{ column.title }}{{ column.label }}</span>\n </button>\n <button *ngIf=\"column.id == 'open'\" mat-stroked-button (click)=\"clickOpen(element)\">\n <mat-icon *ngIf=\"column.icon\" class=\"m-0\">\n <i-tabler name=\"{{ column.icon }}\" class=\"icon-18\"></i-tabler>\n </mat-icon>\n </button>\n </td>\n </ng-template>\n </ng-container>\n\n <ng-template #templateCell>\n <th mat-header-cell *matHeaderCellDef class=\"f-s-16 f-w-700\">\n {{ column.title }}{{ column.label }}\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"f-s-14\">\n <ng-container *ngTemplateOutlet=\"\n getTemplateRef(column.templateKey);\n context: { $implicit: row }\n \">\n </ng-container>\n </td>\n </ng-template>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"dataColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: dataColumns\"></tr>\n </table>\n\n <mat-paginator [length]=\"async ? (count | async) : count\" [pageSizeOptions]=\"[10, 25, 100]\">\n </mat-paginator>\n </div>\n</ng-template>", styles: [".mdc-button{min-width:0px}::ng-deep .custom-field .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:9px;padding-bottom:9px;min-height:40px}.mdc-data-table__cell,.mdc-data-table__header-cell{padding:0 4px}.table-responsive td,.table-responsive mat-cell{white-space:nowrap;padding:4px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.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: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: i11.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i11.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i12.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i12.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i12.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i12.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i12.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.DatePipe, name: "date" }] }); }
211
+ }
212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GridComponent, decorators: [{
213
+ type: Component,
214
+ args: [{ selector: 'shared-grid', template: "<div *ngIf=\"count !== 0 && (config.filter ?? true)\" class=\"row justify-content-between m-b-8\">\n <div class=\"col-12 col-md-5 col-lg-4 col-xl-3 p-l-0\">\n <mat-form-field appearance=\"outline\" class=\"w-100 hide-hint custom-field\">\n <input matInput [formControl]=\"filterField\" (keyup)=\"filter()\"\n placeholder=\"{{ commonKeys.actions.filter }}\" />\n </mat-form-field>\n </div>\n <div *ngIf=\"config.stateFilter\" class=\"col-12 col-md-5 col-lg-4 col-xl-3\">\n {{ commonKeys.actions.includeInactive }}\n <mat-slide-toggle [formControl]=\"stateToggle\" (click)=\"toggleState()\" class=\"m-l-4 m-t-10\"></mat-slide-toggle>\n </div>\n <div class=\"col\"></div>\n</div>\n\n<ng-container *ngIf=\"count === 0; else grid\">\n {{ commonKeys.pagination.noItems }}\n</ng-container>\n\n<ng-template #grid>\n <div class=\"table-responsive m-t-20\">\n <table mat-table [dataSource]=\"dataSource || (data | async)!\" matSort matSortActive=\"{{ config.sort ?? 'id' }}\"\n matSortDisableClear [matSortDirection]=\"config.sortDirection ?? 'asc'\" class=\"w-100\">\n <ng-container *ngFor=\"let column of columns\" matColumnDef=\"{{ column.id }}\">\n\n <ng-container *ngIf=\"!column.templateKey; else templateCell\">\n <ng-container *ngIf=\"column.route === undefined; else routeHeader\">\n <ng-container *ngIf=\"column.sortable === true; else unsortable\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef class=\"f-s-16 f-w-700\">\n {{ column.title }}{{ column.label }}\n </th>\n </ng-container>\n <ng-template #unsortable>\n <th mat-header-cell *matHeaderCellDef class=\"f-s-16 f-w-700\">\n {{ column.title }}{{ column.label }}\n </th>\n </ng-template>\n\n <td mat-cell *matCellDef=\"let element\" class=\"f-s-14\">\n <ng-container *ngIf=\"isDate(element[column.id]); else second\">\n {{ element[column.id] | date : \"dd.MM.yyyy hh:mm\" }}\n </ng-container>\n <ng-template #second>\n <ng-container *ngIf=\"typeOf(element[column.id]) === 'boolean'; else third\">\n <ng-container *ngIf=\"element[column.id] === true; else disabled\">\n <mat-icon>\n <i-tabler name=\"check\" class=\"icon-18\"></i-tabler>\n </mat-icon>\n </ng-container>\n <ng-template #disabled>\n <i-tabler name=\"x\" class=\"icon-18\"></i-tabler>\n </ng-template>\n </ng-container>\n </ng-template>\n <ng-template #third>\n <ng-container *ngIf=\"column.id.includes('.'); else fourth\">\n {{ getObjectValues(column.id, element) }}\n </ng-container>\n </ng-template>\n <ng-template #fourth>\n {{ element[column.id] }}\n </ng-template>\n </td>\n </ng-container>\n\n <ng-template #routeHeader>\n <th width=\"1\" mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element\" class=\"f-s-14 text-right\">\n <button *ngIf=\"column.id != 'delete' && column.id != 'open'\" mat-stroked-button\n (click)=\"buttonClick(column, element)\">\n <mat-icon *ngIf=\"column.icon\" class=\"m-0\">\n <i-tabler name=\"{{ column.icon }}\" class=\"icon-18\"></i-tabler>\n </mat-icon>\n <span *ngIf=\"column.icon && (column.title || column.label)\">&nbsp;</span>\n <span>{{ column.title }}{{ column.label }}</span>\n </button>\n <button *ngIf=\"column.id == 'open'\" mat-stroked-button (click)=\"clickOpen(element)\">\n <mat-icon *ngIf=\"column.icon\" class=\"m-0\">\n <i-tabler name=\"{{ column.icon }}\" class=\"icon-18\"></i-tabler>\n </mat-icon>\n </button>\n </td>\n </ng-template>\n </ng-container>\n\n <ng-template #templateCell>\n <th mat-header-cell *matHeaderCellDef class=\"f-s-16 f-w-700\">\n {{ column.title }}{{ column.label }}\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"f-s-14\">\n <ng-container *ngTemplateOutlet=\"\n getTemplateRef(column.templateKey);\n context: { $implicit: row }\n \">\n </ng-container>\n </td>\n </ng-template>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"dataColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: dataColumns\"></tr>\n </table>\n\n <mat-paginator [length]=\"async ? (count | async) : count\" [pageSizeOptions]=\"[10, 25, 100]\">\n </mat-paginator>\n </div>\n</ng-template>", styles: [".mdc-button{min-width:0px}::ng-deep .custom-field .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:9px;padding-bottom:9px;min-height:40px}.mdc-data-table__cell,.mdc-data-table__header-cell{padding:0 4px}.table-responsive td,.table-responsive mat-cell{white-space:nowrap;padding:4px}\n"] }]
215
+ }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.Router }, { type: i0.ChangeDetectorRef }], propDecorators: { data: [{
216
+ type: Input
217
+ }], count: [{
218
+ type: Input
219
+ }], columns: [{
220
+ type: Input
221
+ }], config: [{
222
+ type: Input
223
+ }], reload: [{
224
+ type: Output
225
+ }], delete: [{
226
+ type: Output
227
+ }], duplicate: [{
228
+ type: Output
229
+ }], open: [{
230
+ type: Output
231
+ }], paginator: [{
232
+ type: ViewChild,
233
+ args: [MatPaginator]
234
+ }], sort: [{
235
+ type: ViewChild,
236
+ args: [MatSort]
237
+ }], templates: [{
238
+ type: ContentChildren,
239
+ args: [TemplateRef]
240
+ }] } });
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL3NoYXJlZC1jb21wb25lbnRzL2dyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9zaGFyZWQtY29tcG9uZW50cy9ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFJTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUdOLFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFpQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxLQUFLLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFFekMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQU9qRSxNQUFNLE9BQU8sYUFBYTtJQWlEeEIsWUFDUyxNQUFpQixFQUNoQixNQUFjLEVBQ2QsR0FBc0I7UUFGdkIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFqRHpCLGVBQVUsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBSTVCLFlBQU8sR0FTVixFQUFFLENBQUM7UUFDQSxXQUFNLEdBUVgsRUFBRSxDQUFD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LElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNmO2FBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFDRCxjQUFjLENBQUMsV0FBK0I7UUFDNUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLENBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN4QixNQUFNLFVBQVUsR0FBSSxDQUFTLENBQUMsc0JBQXNCLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQztZQUN2RSxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUNYLENBQUM7SUFDSixDQUFDOytHQWxRVSxhQUFhO21HQUFiLGFBQWEsb1BBMENQLFdBQVcsd0VBRmpCLFlBQVksdUVBQ1osT0FBTyxxRUN2RXBCLHc0SkF5R2M7OzRGRDNFRCxhQUFhO2tCQUx6QixTQUFTOytCQUNFLGFBQWE7bUlBU2QsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBVUcsTUFBTTtzQkFBZCxLQUFLO2dCQVVJLE1BQU07c0JBQWYsTUFBTTtnQkFRRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBR2tCLFNBQVM7c0JBQWpDLFNBQVM7dUJBQUMsWUFBWTtnQkFDSCxJQUFJO3NCQUF2QixTQUFTO3VCQUFDLE9BQU87Z0JBQ1ksU0FBUztzQkFBdEMsZUFBZTt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRTb3J0LCBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBtZXJnZSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IExhYmVsS2V5cyB9IGZyb20gJy4uL2VudW1zL2xhYmVsLmtleXMnO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9jb25maXJtYXRpb24uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2hhcmVkLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dyaWQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgR3JpZENvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlc1xue1xuICBwdWJsaWMgY29tbW9uS2V5cyA9IExhYmVsS2V5cy5jb21tb247XG5cbiAgQElucHV0KCkgZGF0YTogYW55O1xuICBASW5wdXQoKSBjb3VudDogYW55O1xuICBASW5wdXQoKSBjb2x1bW5zOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICBsYWJlbD86IHN0cmluZztcbiAgICByb3V0ZT86IHN0cmluZztcbiAgICBpY29uPzogc3RyaW5nO1xuICAgIHNvcnRhYmxlPzogYm9vbGVhbjtcbiAgICBuZXdUYWI/OiBib29sZWFuO1xuICAgIHRlbXBsYXRlS2V5Pzogc3RyaW5nO1xuICB9W10gPSBbXTtcbiAgQElucHV0KCkgY29uZmlnOiB7XG4gICAgUEs/OiBzdHJpbmc7XG4gICAgaGVhZGVyPzogYm9vbGVhbjtcbiAgICBmaWx0ZXI/OiBib29sZWFuO1xuICAgIHNvcnQ/OiBzdHJpbmc7XG4gICAgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb247XG4gICAgcGFnZXM/OiBib29sZWFuO1xuICAgIHN0YXRlRmlsdGVyPzogYm9vbGVhbjtcbiAgfSA9IHt9O1xuXG4gIEBPdXRwdXQoKSByZWxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBwYWdlOiBudW1iZXI7XG4gICAgcGFnZVNpemU6IG51bWJlcjtcbiAgICBzb3J0OiBzdHJpbmc7XG4gICAgc29ydERpcmVjdGlvbjogc3RyaW5nO1xuICAgIGZpbHRlcjogc3RyaW5nO1xuICAgIHN0YXRlOiBib29sZWFuIHwgbnVsbDtcbiAgfT4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpdGVtOiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpIGR1cGxpY2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpdGVtOiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpIG9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IGFueSB9PigpO1xuXG4gIGFzeW5jOiBib29sZWFuO1xuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcikgcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3IgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBAVmlld0NoaWxkKE1hdFNvcnQpIHNvcnQ6IE1hdFNvcnQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSB0ZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgZGF0YVNvdXJjZTogYW55ID0gbnVsbDtcbiAgZGF0YUNvbHVtbnM6IHN0cmluZ1tdO1xuICBmaWx0ZXJGaWVsZCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gIHN0YXRlVG9nZ2xlID0gbmV3IEZvcm1Db250cm9sKCcnKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hc3luYyA9PT0gZmFsc2UgJiYgY2hhbmdlc1snZGF0YSddKSB7XG4gICAgICB0aGlzLnJlZnJlc2hVSSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFDb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCgoaSkgPT4gaS5pZCk7XG4gICAgdGhpcy5hc3luYyA9ICF0aGlzLmlzTnVtYmVyKHRoaXMuY291bnQpO1xuICAgIGlmICghdGhpcy5hc3luYykge1xuICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcucGFnZXMgPz8gdHJ1ZSkge1xuICAgICAgdGhpcy5pbml0UGFnaW5hdG9yKCk7XG4gICAgICBpZiAodGhpcy5zb3J0ICYmIHRoaXMuc29ydC5zb3J0Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMuc29ydC5zb3J0Q2hhbmdlLnN1YnNjcmliZSgoKSA9PiAodGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gMCkpO1xuICAgICAgICBtZXJnZSh0aGlzLnNvcnQuc29ydENoYW5nZSwgdGhpcy5wYWdpbmF0b3IucGFnZSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5hc3luYyAmJiB0aGlzLmRhdGFTb3VyY2UpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXIgPSBuZXcgVVJMKGxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ2ZpbHRlcicpO1xuICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgIHRoaXMuZmlsdGVyRmllbGQuc2V0VmFsdWUoZmlsdGVyKTtcbiAgICAgIHRoaXMuZmlsdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcmVmcmVzaFVJKCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5kYXRhKTtcbiAgICB0aGlzLmluaXRQYWdpbmF0b3IoKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBpbml0UGFnaW5hdG9yKCkge1xuICAgIGlmICh0aGlzLnBhZ2luYXRvciAmJiB0aGlzLnBhZ2luYXRvci5faW50bCkge1xuICAgICAgdGhpcy5wYWdpbmF0b3IuX2ludGwuZ2V0UmFuZ2VMYWJlbCA9IChcbiAgICAgICAgcGFnZTogbnVtYmVyLFxuICAgICAgICBwYWdlU2l6ZTogbnVtYmVyLFxuICAgICAgICBsZW5ndGg6IG51bWJlclxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hc3luYyAmJiAhdGhpcy5kYXRhU291cmNlLmZpbHRlciAmJiB0aGlzLmNvdW50KSB7XG4gICAgICAgICAgbGVuZ3RoID0gdGhpcy5jb3VudDtcbiAgICAgICAgICB0aGlzLnBhZ2luYXRvci5sZW5ndGggPSB0aGlzLmNvdW50O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFnaW5hdG9yLl9pbnRsLml0ZW1zUGVyUGFnZUxhYmVsID0gXG4gICAgICAgICAgdGhpcy5jb21tb25LZXlzLnBhZ2luYXRpb24ucGVyUGFnZVxuICAgICAgICBcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gXG4gICAgICAgICAgdGhpcy5jb21tb25LZXlzLnBhZ2luYXRpb24ub2Y7XG4gICAgICAgIFxuICAgICAgICBpZiAobGVuZ3RoID09PSAwIHx8IHBhZ2VTaXplID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGAwICR7c2VwYXJhdG9yfSAwYDtcbiAgICAgICAgfVxuICAgICAgICBsZW5ndGggPSBNYXRoLm1heChsZW5ndGgsIDApO1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gcGFnZSAqIHBhZ2VTaXplO1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9XG4gICAgICAgICAgc3RhcnRJbmRleCA8IGxlbmd0aFxuICAgICAgICAgICAgPyBNYXRoLm1pbihzdGFydEluZGV4ICsgcGFnZVNpemUsIGxlbmd0aClcbiAgICAgICAgICAgIDogc3RhcnRJbmRleCArIHBhZ2VTaXplO1xuICAgICAgICByZXR1cm4gYCR7c3RhcnRJbmRleCArIDF9IC0gJHtlbmRJbmRleH0gJHtzZXBhcmF0b3J9ICR7bGVuZ3RofWA7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5yZWxvYWQuZW1pdCh7XG4gICAgICBwYWdlOiB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggKyAxLFxuICAgICAgcGFnZVNpemU6IHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplLFxuICAgICAgc29ydDogdGhpcy5zb3J0LmFjdGl2ZSxcbiAgICAgIHNvcnREaXJlY3Rpb246IHRoaXMuc29ydC5kaXJlY3Rpb24sXG4gICAgICBmaWx0ZXI6IHRoaXMuZmlsdGVyRmllbGQudmFsdWUgPz8gJycsXG4gICAgICBzdGF0ZTogdGhpcy5jb25maWcuc3RhdGVGaWx0ZXIgPyAhIXRoaXMuc3RhdGVUb2dnbGUudmFsdWUgOiBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgZmlsdGVyKCkge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZmlsdGVyRmllbGQudmFsdWUgPz8gJyc7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICBpZiAoZmlsdGVyKSBwYXJhbXMuc2V0KCdmaWx0ZXInLCBmaWx0ZXIpO1xuICAgIGVsc2UgcGFyYW1zLmRlbGV0ZSgnZmlsdGVyJyk7XG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKFxuICAgICAge30sXG4gICAgICAnJyxcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArXG4gICAgICAgIChwYXJhbXMuaGFzKCdmaWx0ZXInKSA/ICc/JyA6ICcnKSArXG4gICAgICAgIHBhcmFtcy50b1N0cmluZygpXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuYXN5bmMgJiYgdGhpcy5kYXRhU291cmNlKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gZmlsdGVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVTdGF0ZSgpIHtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIGNsaWNrRGVsZXRlKGl0ZW06IGFueSkge1xuICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7IGl0ZW06IGl0ZW0sIHRleHQ6ICdjb21tb24uY29uZmlybWF0aW9uLmRlbGV0ZScgfSxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBtYXhXaWR0aDogJ21pbig5NXZ3LCA0MzBweCknLFxuICAgIH0pO1xuICAgIGRpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0Py5ldmVudCA9PT0gJ3N1Ym1pdCcpIHtcbiAgICAgICAgdGhpcy5kZWxldGUuZW1pdChyZXN1bHQuaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbGlja0R1cGxpY2F0ZShpdGVtOiBhbnkpIHtcbiAgICB0aGlzLmR1cGxpY2F0ZS5lbWl0KHsgaXRlbTogaXRlbSB9KTtcbiAgfVxuXG4gIGJ1dHRvbkNsaWNrKGNvbHVtbjogYW55LCBlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY29sdW1uLnJvdXRlKSB7XG4gICAgICBjb25zdCByb3V0ZSA9IGNvbHVtbi5yb3V0ZS5yZXBsYWNlKFxuICAgICAgICAne2lkfScsXG4gICAgICAgIGVsZW1lbnRbdGhpcy5jb25maWcuUEsgPz8gJ2lkJ11cbiAgICAgICk7XG4gICAgICBpZiAoY29sdW1uLm5ld1RhYiA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLm9wZW5Jbk5ld1RhYihyb3V0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcm91dGVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvcGVuSW5OZXdUYWIocm91dGU6IHN0cmluZykge1xuICAgIGxldCBiYXNlVXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSh0aGlzLnJvdXRlci51cmwsICcnKTtcbiAgICB3aW5kb3cub3BlbihiYXNlVXJsICsgcm91dGUsICdfYmxhbmsnKTtcbiAgfVxuXG4gIGNsaWNrT3BlbihpZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vcGVuLmVtaXQoeyBpZCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNOdW1iZXIodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XG4gIH1cblxuICBwdWJsaWMgaXNEYXRlKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0ZVBhdHRlcm5zID0gW1xuICAgICAgL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLFxuICAgICAgL15cXGR7Mn1cXC9cXGR7Mn1cXC9cXGR7NH0kLyxcbiAgICAgIC9eXFxkezJ9LVxcZHsyfS1cXGR7NH0kLyxcbiAgICAgIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT8oPzpafFsrLV1cXGR7Mn06XFxkezJ9KT8kLyxcbiAgICBdO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmXG4gICAgICBkYXRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KHZhbCkpXG4gICAgKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsKTtcbiAgICAgIHJldHVybiBkYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oZGF0ZS52YWx1ZU9mKCkpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgdHlwZU9mKHZhbDogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPYmplY3RWYWx1ZXMoa2V5OiBzdHJpbmcsIHJvdzogYW55KTogYW55IHtcbiAgICBsZXQga2V5czogc3RyaW5nW10gPSBrZXkuc3BsaXQoJy4nLCAyKTtcbiAgICBsZXQgdmFsdWU6IGFueSA9IHJvd1trZXlzWzBdXTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiB2YWx1ZSBleGlzdHMgYW5kIGlzIGFuIGFycmF5IGJlZm9yZSBjYWxsaW5nIG1hcFxuICAgIGlmICghdmFsdWUgfHwgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyBJZiB0aGUga2V5IGNvbnRhaW5zIGEgZG90IGJ1dCBpdCdzIG5vdCBmb3IgbmVzdGVkIHByb3BlcnRpZXMsXG4gICAgICAvLyB0cnkgdG8gYWNjZXNzIGl0IGRpcmVjdGx5IGFzIGEgcHJvcGVydHkgbmFtZSB3aXRoIGRvdFxuICAgICAgaWYgKHJvdy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHJldHVybiByb3dba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHZhbHVlXG4gICAgICAubWFwKChpOiB7IFt4OiBzdHJpbmddOiBhbnkgfSk6IGFueSA9PlxuICAgICAgICBrZXlzWzFdLmluY2x1ZGVzKCcuJylcbiAgICAgICAgICA/IHRoaXMuZ2V0T2JqZWN0VmFsdWVzKGtleXNbMV0sIGlba2V5c1sxXV0pXG4gICAgICAgICAgOiBpW2tleXNbMV1dXG4gICAgICApXG4gICAgICAuam9pbignLCAnKTtcbiAgfVxuICBnZXRUZW1wbGF0ZVJlZih0ZW1wbGF0ZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xuICAgIGlmICghdGVtcGxhdGVLZXkgfHwgIXRoaXMudGVtcGxhdGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudGVtcGxhdGVzLmZpbmQoKHQpID0+IHtcbiAgICAgICAgY29uc3QgbG9jYWxOYW1lcyA9ICh0IGFzIGFueSkuX2RlY2xhcmF0aW9uVENvbnRhaW5lcj8ubG9jYWxOYW1lcyB8fCBbXTtcbiAgICAgICAgcmV0dXJuIGxvY2FsTmFtZXMuaW5jbHVkZXModGVtcGxhdGVLZXkpO1xuICAgICAgfSkgfHwgbnVsbFxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJjb3VudCAhPT0gMCAmJiAoY29uZmlnLmZpbHRlciA/PyB0cnVlKVwiIGNsYXNzPVwicm93IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG0tYi04XCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTUgY29sLWxnLTQgY29sLXhsLTMgcC1sLTBcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctMTAwIGhpZGUtaGludCBjdXN0b20tZmllbGRcIj5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZmlsdGVyRmllbGRcIiAoa2V5dXApPVwiZmlsdGVyKClcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7IGNvbW1vbktleXMuYWN0aW9ucy5maWx0ZXIgfX1cIiAvPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiY29uZmlnLnN0YXRlRmlsdGVyXCIgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTUgY29sLWxnLTQgY29sLXhsLTNcIj5cbiAgICB7eyBjb21tb25LZXlzLmFjdGlvbnMuaW5jbHVkZUluYWN0aXZlIH19XG4gICAgPG1hdC1zbGlkZS10b2dnbGUgW2Zvcm1Db250cm9sXT1cInN0YXRlVG9nZ2xlXCIgKGNsaWNrKT1cInRvZ2dsZVN0YXRlKClcIiBjbGFzcz1cIm0tbC00IG0tdC0xMFwiPjwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2xcIj48L2Rpdj5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY291bnQgPT09IDA7IGVsc2UgZ3JpZFwiPlxuICB7eyBjb21tb25LZXlzLnBhZ2luYXRpb24ubm9JdGVtcyB9fVxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjZ3JpZD5cbiAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmUgbS10LTIwXCI+XG4gICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlIHx8IChkYXRhIHwgYXN5bmMpIVwiIG1hdFNvcnQgbWF0U29ydEFjdGl2ZT1cInt7IGNvbmZpZy5zb3J0ID8/ICdpZCcgfX1cIlxuICAgICAgbWF0U29ydERpc2FibGVDbGVhciBbbWF0U29ydERpcmVjdGlvbl09XCJjb25maWcuc29ydERpcmVjdGlvbiA/PyAnYXNjJ1wiIGNsYXNzPVwidy0xMDBcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCIgbWF0Q29sdW1uRGVmPVwie3sgY29sdW1uLmlkIH19XCI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2x1bW4udGVtcGxhdGVLZXk7IGVsc2UgdGVtcGxhdGVDZWxsXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5yb3V0ZSA9PT0gdW5kZWZpbmVkOyBlbHNlIHJvdXRlSGVhZGVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlID09PSB0cnVlOyBlbHNlIHVuc29ydGFibGVcIj5cbiAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJmLXMtMTYgZi13LTcwMFwiPlxuICAgICAgICAgICAgICAgIHt7IGNvbHVtbi50aXRsZSB9fXt7IGNvbHVtbi5sYWJlbCB9fVxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3Vuc29ydGFibGU+XG4gICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJmLXMtMTYgZi13LTcwMFwiPlxuICAgICAgICAgICAgICAgIHt7IGNvbHVtbi50aXRsZSB9fXt7IGNvbHVtbi5sYWJlbCB9fVxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cImYtcy0xNFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNEYXRlKGVsZW1lbnRbY29sdW1uLmlkXSk7IGVsc2Ugc2Vjb25kXCI+XG4gICAgICAgICAgICAgICAge3sgZWxlbWVudFtjb2x1bW4uaWRdIHwgZGF0ZSA6IFwiZGQuTU0ueXl5eSBoaDptbVwiIH19XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NlY29uZD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHlwZU9mKGVsZW1lbnRbY29sdW1uLmlkXSkgPT09ICdib29sZWFuJzsgZWxzZSB0aGlyZFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVsZW1lbnRbY29sdW1uLmlkXSA9PT0gdHJ1ZTsgZWxzZSBkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPGktdGFibGVyIG5hbWU9XCJjaGVja1wiIGNsYXNzPVwiaWNvbi0xOFwiPjwvaS10YWJsZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgIDxpLXRhYmxlciBuYW1lPVwieFwiIGNsYXNzPVwiaWNvbi0xOFwiPjwvaS10YWJsZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RoaXJkPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4uaWQuaW5jbHVkZXMoJy4nKTsgZWxzZSBmb3VydGhcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGdldE9iamVjdFZhbHVlcyhjb2x1bW4uaWQsIGVsZW1lbnQpIH19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZm91cnRoPlxuICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbY29sdW1uLmlkXSB9fVxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcm91dGVIZWFkZXI+XG4gICAgICAgICAgICA8dGggd2lkdGg9XCIxXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwiZi1zLTE0IHRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImNvbHVtbi5pZCAhPSAnZGVsZXRlJyAmJiBjb2x1bW4uaWQgIT0gJ29wZW4nXCIgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1dHRvbkNsaWNrKGNvbHVtbiwgZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb2x1bW4uaWNvblwiIGNsYXNzPVwibS0wXCI+XG4gICAgICAgICAgICAgICAgICA8aS10YWJsZXIgbmFtZT1cInt7IGNvbHVtbi5pY29uIH19XCIgY2xhc3M9XCJpY29uLTE4XCI+PC9pLXRhYmxlcj5cbiAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uLmljb24gJiYgKGNvbHVtbi50aXRsZSB8fCBjb2x1bW4ubGFiZWwpXCI+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvbHVtbi50aXRsZSB9fXt7IGNvbHVtbi5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJjb2x1bW4uaWQgPT0gJ29wZW4nXCIgbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJjbGlja09wZW4oZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb2x1bW4uaWNvblwiIGNsYXNzPVwibS0wXCI+XG4gICAgICAgICAgICAgICAgICA8aS10YWJsZXIgbmFtZT1cInt7IGNvbHVtbi5pY29uIH19XCIgY2xhc3M9XCJpY29uLTE4XCI+PC9pLXRhYmxlcj5cbiAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUNlbGw+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cImYtcy0xNiBmLXctNzAwXCI+XG4gICAgICAgICAgICB7eyBjb2x1bW4udGl0bGUgfX17eyBjb2x1bW4ubGFiZWwgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cImYtcy0xNFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGdldFRlbXBsYXRlUmVmKGNvbHVtbi50ZW1wbGF0ZUtleSk7XG4gICAgICAgICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IHJvdyB9XG4gICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRhdGFDb2x1bW5zXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkYXRhQ29sdW1uc1wiPjwvdHI+XG4gICAgPC90YWJsZT5cblxuICAgIDxtYXQtcGFnaW5hdG9yIFtsZW5ndGhdPVwiYXN5bmMgPyAoY291bnQgfCBhc3luYykgOiBjb3VudFwiIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzEwLCAyNSwgMTAwXVwiPlxuICAgIDwvbWF0LXBhZ2luYXRvcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==
@@ -0,0 +1,224 @@
1
+ import { SelectionModel } from '@angular/cdk/collections';
2
+ import { FlatTreeControl } from '@angular/cdk/tree';
3
+ import { MatTreeFlatDataSource, MatTreeFlattener, } from '@angular/material/tree';
4
+ import { Component, EventEmitter, Input, Output, } from '@angular/core';
5
+ import { LabelKeys } from '../../enums/label.keys';
6
+ import { ItemFlatNode } from '../../models/treeview.model';
7
+ import { ChecklistDatabase } from '../../others/check-list.database';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "../../others/check-list.database";
10
+ import * as i2 from "../../others/translation.pipe";
11
+ import * as i3 from "@angular/common";
12
+ import * as i4 from "@angular/material/input";
13
+ import * as i5 from "@angular/material/form-field";
14
+ import * as i6 from "@angular/material/checkbox";
15
+ import * as i7 from "@angular/material/tree";
16
+ import * as i8 from "@angular/material/button";
17
+ import * as i9 from "@angular/material/icon";
18
+ export class AppTreeviewComponent {
19
+ constructor(database, translate) {
20
+ this.database = database;
21
+ this.translate = translate;
22
+ this.allowAddItems = false;
23
+ this.autoSelectDescendants = true;
24
+ this.allowFilter = false;
25
+ this.selectionChanged = new EventEmitter();
26
+ this.isInit = true;
27
+ /** Map from flat node to nested node. This helps us finding the nested node to be modified */
28
+ this.flatNodeMap = new Map();
29
+ /** Map from nested node to flattened node. This helps us to keep the same object for selection */
30
+ this.nestedNodeMap = new Map();
31
+ this.selectedParent = null;
32
+ this.newItemName = '';
33
+ this.checklistSelection = new SelectionModel(true);
34
+ this.commonKeys = LabelKeys.common;
35
+ this.getLevel = (node) => node.level;
36
+ this.isExpandable = (node) => node.expandable;
37
+ this.getChildren = (node) => node.children;
38
+ this.hasChild = (_, _nodeData) => _nodeData.expandable;
39
+ this.hasNoContent = (_, _nodeData) => _nodeData.name === '';
40
+ /**
41
+ * Transformer to convert nested node to flat node. Record the nodes in maps for later use.
42
+ */
43
+ this.transformer = (node, level) => {
44
+ this.isInit = true;
45
+ const existingNode = this.nestedNodeMap.get(node);
46
+ const flatNode = existingNode && existingNode.name === node.name
47
+ ? existingNode
48
+ : new ItemFlatNode();
49
+ flatNode.name = node.name;
50
+ flatNode.level = level;
51
+ flatNode.canSelect = node.canSelect;
52
+ flatNode.data = node.data;
53
+ flatNode.isSelected = node.isSelected;
54
+ flatNode.expandable = !!node.children?.length;
55
+ flatNode.hideArrow = node.hideArrow;
56
+ this.flatNodeMap.set(flatNode, node);
57
+ this.nestedNodeMap.set(node, flatNode);
58
+ if (flatNode.isSelected === true) {
59
+ this.checklistSelection.select(flatNode);
60
+ }
61
+ this.isInit = false;
62
+ return flatNode;
63
+ };
64
+ this.treeFlattener = new MatTreeFlattener(this.transformer, this.getLevel, this.isExpandable, this.getChildren);
65
+ this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable);
66
+ this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
67
+ database.dataChange.subscribe((data) => {
68
+ this.dataSource.data = data;
69
+ });
70
+ this.checklistSelection.changed.subscribe((node) => {
71
+ if (this.isInit === false) {
72
+ this.selectionChanged.next(node);
73
+ }
74
+ });
75
+ }
76
+ /** Whether all the descendants of the node are selected. */
77
+ descendantsAllSelected(node) {
78
+ const descendants = this.treeControl.getDescendants(node);
79
+ const descAllSelected = descendants.length > 0 &&
80
+ descendants.every((child) => {
81
+ return this.checklistSelection.isSelected(child);
82
+ });
83
+ return descAllSelected;
84
+ }
85
+ /** Whether part of the descendants are selected */
86
+ descendantsPartiallySelected(node) {
87
+ const descendants = this.treeControl.getDescendants(node);
88
+ const result = descendants.some((child) => this.checklistSelection.isSelected(child));
89
+ return result && !this.descendantsAllSelected(node);
90
+ }
91
+ /** Toggle the to-do item selection. Select/deselect all the descendants node */
92
+ selectionToggle(node) {
93
+ if (!node.canSelect) {
94
+ return;
95
+ }
96
+ this.checklistSelection.toggle(node);
97
+ if (this.autoSelectDescendants) {
98
+ const descendants = this.treeControl.getDescendants(node);
99
+ if (this.checklistSelection.isSelected(node)) {
100
+ this.checklistSelection.select(...descendants);
101
+ }
102
+ else {
103
+ this.checklistSelection.deselect(...descendants);
104
+ }
105
+ this.checkAllParentsSelection(node);
106
+ }
107
+ }
108
+ leafItemSelectionToggle(node) {
109
+ if (!node.canSelect) {
110
+ return;
111
+ }
112
+ if (!this.allowCheckItems) {
113
+ this.selectedNode = node;
114
+ this.selectionChanged.next(node);
115
+ }
116
+ else {
117
+ this.checklistSelection.toggle(node);
118
+ if (this.autoSelectDescendants) {
119
+ this.checkAllParentsSelection(node);
120
+ }
121
+ }
122
+ }
123
+ /* Checks all the parents when a leaf node is selected/unselected */
124
+ checkAllParentsSelection(node) {
125
+ let parent = this.getParentNode(node);
126
+ while (parent) {
127
+ this.checkRootNodeSelection(parent);
128
+ parent = this.getParentNode(parent);
129
+ }
130
+ }
131
+ /** Check root node checked state and change it accordingly */
132
+ checkRootNodeSelection(node) {
133
+ const nodeSelected = this.checklistSelection.isSelected(node);
134
+ const descendants = this.treeControl.getDescendants(node);
135
+ const descAllSelected = descendants.length > 0 &&
136
+ descendants.every((child) => {
137
+ return this.checklistSelection.isSelected(child);
138
+ });
139
+ if (nodeSelected && !descAllSelected) {
140
+ this.checklistSelection.deselect(node);
141
+ }
142
+ else if (!nodeSelected && descAllSelected) {
143
+ this.checklistSelection.select(node);
144
+ }
145
+ }
146
+ /* Get the parent node of a node */
147
+ getParentNode(node) {
148
+ const currentLevel = this.getLevel(node);
149
+ if (currentLevel < 1) {
150
+ return null;
151
+ }
152
+ const startIndex = this.treeControl.dataNodes.indexOf(node) - 1;
153
+ for (let i = startIndex; i >= 0; i--) {
154
+ const currentNode = this.treeControl.dataNodes[i];
155
+ if (this.getLevel(currentNode) < currentLevel) {
156
+ return currentNode;
157
+ }
158
+ }
159
+ return null;
160
+ }
161
+ initialize(data) {
162
+ this.database.initialize(data);
163
+ }
164
+ getSelectedNodes() {
165
+ let selectedNodes = [];
166
+ if (!this.allowCheckItems) {
167
+ selectedNodes.push(this.selectedNode);
168
+ }
169
+ else {
170
+ this.treeControl.dataNodes.forEach((n) => {
171
+ if (this.checklistSelection.isSelected(n)) {
172
+ n.isSelected = true;
173
+ selectedNodes.push(n);
174
+ }
175
+ });
176
+ }
177
+ return selectedNodes;
178
+ }
179
+ /** Select the category so we can insert the new item. */
180
+ addNewItem(node) {
181
+ const parentNode = this.flatNodeMap.get(node);
182
+ this.database.insertItem(parentNode, '');
183
+ this.treeControl.expand(node);
184
+ }
185
+ /** Save the node to database */
186
+ saveNode(node, itemValue) {
187
+ const nestedNode = this.flatNodeMap.get(node);
188
+ this.database.updateItem(nestedNode, itemValue);
189
+ }
190
+ filterText(text) {
191
+ this.database.filter(text);
192
+ this.expandAll();
193
+ }
194
+ expandAll() {
195
+ this.treeControl.expandAll();
196
+ }
197
+ expandNode(nodeIndex) {
198
+ if (this.treeControl.dataNodes &&
199
+ this.treeControl.dataNodes.length > nodeIndex) {
200
+ this.treeControl.expand(this.treeControl.dataNodes[nodeIndex]);
201
+ }
202
+ }
203
+ applyFilter(event) {
204
+ const filterValue = event.target.value;
205
+ return this.filterText(filterValue);
206
+ }
207
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppTreeviewComponent, deps: [{ token: i1.ChecklistDatabase }, { token: i2.TranslatePipe }], target: i0.ɵɵFactoryTarget.Component }); }
208
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppTreeviewComponent, selector: "app-treeview", inputs: { allowAddItems: "allowAddItems", autoSelectDescendants: "autoSelectDescendants", allowCheckItems: "allowCheckItems", allowFilter: "allowFilter" }, outputs: { selectionChanged: "selectionChanged" }, providers: [ChecklistDatabase], ngImport: i0, template: "<mat-form-field class=\"full-width p-10\"\n *ngIf=\"allowFilter\"\n appearance=\"outline\">\n <mat-label> {{ commonKeys.actions.filter | translate }}</mat-label>\n <input matInput\n minlength=\"1\"\n (keyup)=\"applyFilter($event)\"\n placeholder=\"{{ commonKeys.actions.filter }}\"\n #input />\n</mat-form-field>\n\n<!--<cdk-virtual-scroll-viewport itemSize=\"30\" class=\"dictionary-viewport\">-->\n<mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <!-- Leaf Nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node\"\n matTreeNodePadding>\n <button mat-icon-button disabled></button>\n <!-- Node Content -->\n <ng-container>\n <!-- Checkbox for Selectable Nodes when checkboxes are allowed -->\n <ng-container *ngIf=\"node.canSelect && allowCheckItems\">\n <mat-checkbox class=\"checklist-leaf-node\"\n [checked]=\"checklistSelection.isSelected(node)\"\n (change)=\"leafItemSelectionToggle(node)\"\n color=\"primary\">\n {{ node.name }}\n </mat-checkbox>\n </ng-container>\n <!-- Clickable Label for Selectable Nodes when checkboxes are not allowed -->\n <ng-container *ngIf=\"node.canSelect && !allowCheckItems\">\n <mat-label class=\"mdc-label\"\n style=\"cursor: pointer\"\n (click)=\"leafItemSelectionToggle(node)\">\n {{ node.name }}\n </mat-label>\n </ng-container>\n <!-- Non-clickable Label for Non-selectable Nodes -->\n <ng-container *ngIf=\"!node.canSelect\">\n <mat-label class=\"mdc-label\">\n {{ node.name }}\n </mat-label>\n </ng-container>\n </ng-container>\n </mat-tree-node>\n\n <!-- Nodes with Children -->\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\"\n matTreeNodePadding>\n <!-- Expand/Collapse Button -->\n <button mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.name\"\n *ngIf=\"!node.hideArrow\">\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <!-- Node Content -->\n <ng-container>\n <!-- Checkbox for Selectable Nodes when checkboxes are allowed -->\n <ng-container *ngIf=\"node.canSelect && allowCheckItems\">\n <mat-checkbox [checked]=\"checklistSelection.isSelected(node)\"\n (change)=\"selectionToggle(node)\"\n color=\"primary\">\n {{ node.name }}\n </mat-checkbox>\n </ng-container>\n <!-- Clickable Label for Selectable Nodes when checkboxes are not allowed -->\n <ng-container *ngIf=\"node.canSelect && !allowCheckItems\">\n <mat-label class=\"mdc-label\"\n style=\"cursor: pointer\"\n (click)=\"leafItemSelectionToggle(node)\">\n {{ node.name }}\n </mat-label>\n </ng-container>\n <!-- Non-clickable Label for Non-selectable Nodes -->\n <ng-container *ngIf=\"!node.canSelect\">\n <mat-label class=\"mdc-label\">\n {{ node.name }}\n </mat-label>\n </ng-container>\n </ng-container>\n <!-- Add New Item Button -->\n <button mat-icon-button (click)=\"addNewItem(node)\" *ngIf=\"allowAddItems\">\n <mat-icon>add</mat-icon>\n </button>\n </mat-tree-node>\n</mat-tree>\n<!--</cdk-virtual-scroll-viewport>-->\n", styles: [".dictionary-viewport{height:400px;width:100%}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.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: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i7.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i7.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i7.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i7.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i7.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] }); }
209
+ }
210
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppTreeviewComponent, decorators: [{
211
+ type: Component,
212
+ args: [{ selector: 'app-treeview', providers: [ChecklistDatabase], template: "<mat-form-field class=\"full-width p-10\"\n *ngIf=\"allowFilter\"\n appearance=\"outline\">\n <mat-label> {{ commonKeys.actions.filter | translate }}</mat-label>\n <input matInput\n minlength=\"1\"\n (keyup)=\"applyFilter($event)\"\n placeholder=\"{{ commonKeys.actions.filter }}\"\n #input />\n</mat-form-field>\n\n<!--<cdk-virtual-scroll-viewport itemSize=\"30\" class=\"dictionary-viewport\">-->\n<mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <!-- Leaf Nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node\"\n matTreeNodePadding>\n <button mat-icon-button disabled></button>\n <!-- Node Content -->\n <ng-container>\n <!-- Checkbox for Selectable Nodes when checkboxes are allowed -->\n <ng-container *ngIf=\"node.canSelect && allowCheckItems\">\n <mat-checkbox class=\"checklist-leaf-node\"\n [checked]=\"checklistSelection.isSelected(node)\"\n (change)=\"leafItemSelectionToggle(node)\"\n color=\"primary\">\n {{ node.name }}\n </mat-checkbox>\n </ng-container>\n <!-- Clickable Label for Selectable Nodes when checkboxes are not allowed -->\n <ng-container *ngIf=\"node.canSelect && !allowCheckItems\">\n <mat-label class=\"mdc-label\"\n style=\"cursor: pointer\"\n (click)=\"leafItemSelectionToggle(node)\">\n {{ node.name }}\n </mat-label>\n </ng-container>\n <!-- Non-clickable Label for Non-selectable Nodes -->\n <ng-container *ngIf=\"!node.canSelect\">\n <mat-label class=\"mdc-label\">\n {{ node.name }}\n </mat-label>\n </ng-container>\n </ng-container>\n </mat-tree-node>\n\n <!-- Nodes with Children -->\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\"\n matTreeNodePadding>\n <!-- Expand/Collapse Button -->\n <button mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.name\"\n *ngIf=\"!node.hideArrow\">\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <!-- Node Content -->\n <ng-container>\n <!-- Checkbox for Selectable Nodes when checkboxes are allowed -->\n <ng-container *ngIf=\"node.canSelect && allowCheckItems\">\n <mat-checkbox [checked]=\"checklistSelection.isSelected(node)\"\n (change)=\"selectionToggle(node)\"\n color=\"primary\">\n {{ node.name }}\n </mat-checkbox>\n </ng-container>\n <!-- Clickable Label for Selectable Nodes when checkboxes are not allowed -->\n <ng-container *ngIf=\"node.canSelect && !allowCheckItems\">\n <mat-label class=\"mdc-label\"\n style=\"cursor: pointer\"\n (click)=\"leafItemSelectionToggle(node)\">\n {{ node.name }}\n </mat-label>\n </ng-container>\n <!-- Non-clickable Label for Non-selectable Nodes -->\n <ng-container *ngIf=\"!node.canSelect\">\n <mat-label class=\"mdc-label\">\n {{ node.name }}\n </mat-label>\n </ng-container>\n </ng-container>\n <!-- Add New Item Button -->\n <button mat-icon-button (click)=\"addNewItem(node)\" *ngIf=\"allowAddItems\">\n <mat-icon>add</mat-icon>\n </button>\n </mat-tree-node>\n</mat-tree>\n<!--</cdk-virtual-scroll-viewport>-->\n", styles: [".dictionary-viewport{height:400px;width:100%}\n"] }]
213
+ }], ctorParameters: () => [{ type: i1.ChecklistDatabase }, { type: i2.TranslatePipe }], propDecorators: { allowAddItems: [{
214
+ type: Input
215
+ }], autoSelectDescendants: [{
216
+ type: Input
217
+ }], allowCheckItems: [{
218
+ type: Input
219
+ }], allowFilter: [{
220
+ type: Input
221
+ }], selectionChanged: [{
222
+ type: Output
223
+ }] } });
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9zaGFyZWQtY29tcG9uZW50cy90cmVldmlldy90cmVldmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL3NoYXJlZC1jb21wb25lbnRzL3RyZWV2aWV3L3RyZWV2aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixnQkFBZ0IsR0FDakIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7O0FBU3JFLE1BQU0sT0FBTyxvQkFBb0I7SUFtQi9CLFlBQ1UsUUFBMkIsRUFDM0IsU0FBd0I7UUFEeEIsYUFBUSxHQUFSLFFBQVEsQ0FBbUI7UUFDM0IsY0FBUyxHQUFULFNBQVMsQ0FBZTtRQXBCekIsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsMEJBQXFCLEdBQVksSUFBSSxDQUFDO1FBRXRDLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzVCLHFCQUFnQixHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNELFdBQU0sR0FBWSxJQUFJLENB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QUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFZO1FBQ3RCLE1BQU0sV0FBVyxHQUFJLEtBQUssQ0FBQyxNQUEyQixDQUFDLEtBQUssQ0FBQztRQUM3RCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEMsQ0FBQzsrR0F6T1Usb0JBQW9CO21HQUFwQixvQkFBb0Isc1BBRnBCLENBQUMsaUJBQWlCLENBQUMsMEJDckJoQyxnaEhBeUZBOzs0RkRsRWEsb0JBQW9CO2tCQU5oQyxTQUFTOytCQUNFLGNBQWMsYUFHYixDQUFDLGlCQUFpQixDQUFDO2tIQUdyQixhQUFhO3NCQUFyQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgRmxhdFRyZWVDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RyZWUnO1xuaW1wb3J0IHtcbiAgTWF0VHJlZUZsYXREYXRhU291cmNlLFxuICBNYXRUcmVlRmxhdHRlbmVyLFxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90cmVlJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExhYmVsS2V5cyB9IGZyb20gJy4uLy4uL2VudW1zL2xhYmVsLmtleXMnO1xuaW1wb3J0IHsgSXRlbUZsYXROb2RlLCBJdGVtTm9kZSB9IGZyb20gJy4uLy4uL21vZGVscy90cmVldmlldy5tb2RlbCc7XG5pbXBvcnQgeyBDaGVja2xpc3REYXRhYmFzZSB9IGZyb20gJy4uLy4uL290aGVycy9jaGVjay1saXN0LmRhdGFiYXNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9vdGhlcnMvdHJhbnNsYXRpb24ucGlwZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC10cmVldmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi90cmVldmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi90cmVldmlldy5jb21wb25lbnQuc2NzcycsXG4gIHByb3ZpZGVyczogW0NoZWNrbGlzdERhdGFiYXNlXSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwVHJlZXZpZXdDb21wb25lbnQge1xuICBASW5wdXQoKSBhbGxvd0FkZEl0ZW1zOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGF1dG9TZWxlY3REZXNjZW5kYW50czogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGFsbG93Q2hlY2tJdGVtczogYm9vbGVhbjtcbiAgQElucHV0KCkgYWxsb3dGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwcml2YXRlIGlzSW5pdDogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgc2VsZWN0ZWROb2RlOiBJdGVtRmxhdE5vZGU7XG4gIC8qKiBNYXAgZnJvbSBmbGF0IG5vZGUgdG8gbmVzdGVkIG5vZGUuIFRoaXMgaGVscHMgdXMgZmluZGluZyB0aGUgbmVzdGVkIG5vZGUgdG8gYmUgbW9kaWZpZWQgKi9cbiAgZmxhdE5vZGVNYXAgPSBuZXcgTWFwPEl0ZW1GbGF0Tm9kZSwgSXRlbU5vZGU+KCk7XG4gIC8qKiBNYXAgZnJvbSBuZXN0ZWQgbm9kZSB0byBmbGF0dGVuZWQgbm9kZS4gVGhpcyBoZWxwcyB1cyB0byBrZWVwIHRoZSBzYW1lIG9iamVjdCBmb3Igc2VsZWN0aW9uICovXG4gIG5lc3RlZE5vZGVNYXAgPSBuZXcgTWFwPEl0ZW1Ob2RlLCBJdGVtRmxhdE5vZGU+KCk7XG4gIHNlbGVjdGVkUGFyZW50OiBJdGVtRmxhdE5vZGUgfCBudWxsID0gbnVsbDtcbiAgbmV3SXRlbU5hbWUgPSAnJztcbiAgdHJlZUNvbnRyb2w6IEZsYXRUcmVlQ29udHJvbDxJdGVtRmxhdE5vZGU+O1xuICB0cmVlRmxhdHRlbmVyOiBNYXRUcmVlRmxhdHRlbmVyPEl0ZW1Ob2RlLCBJdGVtRmxhdE5vZGU+O1xuICBkYXRhU291cmNlOiBNYXRUcmVlRmxhdERhdGFTb3VyY2U8SXRlbU5vZGUsIEl0ZW1GbGF0Tm9kZT47XG4gIGNoZWNrbGlzdFNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxJdGVtRmxhdE5vZGU+KHRydWUpO1xuICBjb21tb25LZXlzID0gTGFiZWxLZXlzLmNvbW1vbjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogQ2hlY2tsaXN0RGF0YWJhc2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVBpcGVcbiAgKSB7XG4gICAgdGhpcy50cmVlRmxhdHRlbmVyID0gbmV3IE1hdFRyZWVGbGF0dGVuZXIoXG4gICAgICB0aGlzLnRyYW5zZm9ybWVyLFxuICAgICAgdGhpcy5nZXRMZXZlbCxcbiAgICAgIHRoaXMuaXNFeHBhbmRhYmxlLFxuICAgICAgdGhpcy5nZXRDaGlsZHJlblxuICAgICk7XG4gICAgdGhpcy50cmVlQ29udHJvbCA9IG5ldyBGbGF0VHJlZUNvbnRyb2w8SXRlbUZsYXROb2RlPihcbiAgICAgIHRoaXMuZ2V0TGV2ZWwsXG4gICAgICB0aGlzLmlzRXhwYW5kYWJsZVxuICAgICk7XG4gICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRyZWVGbGF0RGF0YVNvdXJjZShcbiAgICAgIHRoaXMudHJlZUNvbnRyb2wsXG4gICAgICB0aGlzLnRyZWVGbGF0dGVuZXJcbiAgICApO1xuXG4gICAgZGF0YWJhc2UuZGF0YUNoYW5nZS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gZGF0YTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmNoYW5nZWQuc3Vic2NyaWJlKChub2RlKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0luaXQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5uZXh0KG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0TGV2ZWwgPSAobm9kZTogSXRlbUZsYXROb2RlKSA9PiBub2RlLmxldmVsO1xuICBpc0V4cGFuZGFibGUgPSAobm9kZTogSXRlbUZsYXROb2RlKSA9PiBub2RlLmV4cGFuZGFibGU7XG4gIGdldENoaWxkcmVuID0gKG5vZGU6IEl0ZW1Ob2RlKTogSXRlbU5vZGVbXSA9PiBub2RlLmNoaWxkcmVuO1xuICBoYXNDaGlsZCA9IChfOiBudW1iZXIsIF9ub2RlRGF0YTogSXRlbUZsYXROb2RlKSA9PiBfbm9kZURhdGEuZXhwYW5kYWJsZTtcbiAgaGFzTm9Db250ZW50ID0gKF86IG51bWJlciwgX25vZGVEYXRhOiBJdGVtRmxhdE5vZGUpID0+IF9ub2RlRGF0YS5uYW1lID09PSAnJztcblxuICAvKipcbiAgICogVHJhbnNmb3JtZXIgdG8gY29udmVydCBuZXN0ZWQgbm9kZSB0byBmbGF0IG5vZGUuIFJlY29yZCB0aGUgbm9kZXMgaW4gbWFwcyBmb3IgbGF0ZXIgdXNlLlxuICAgKi9cbiAgdHJhbnNmb3JtZXIgPSAobm9kZTogSXRlbU5vZGUsIGxldmVsOiBudW1iZXIpID0+IHtcbiAgICB0aGlzLmlzSW5pdCA9IHRydWU7XG5cbiAgICBjb25zdCBleGlzdGluZ05vZGUgPSB0aGlzLm5lc3RlZE5vZGVNYXAuZ2V0KG5vZGUpO1xuICAgIGNvbnN0IGZsYXROb2RlID1cbiAgICAgIGV4aXN0aW5nTm9kZSAmJiBleGlzdGluZ05vZGUubmFtZSA9PT0gbm9kZS5uYW1lXG4gICAgICAgID8gZXhpc3RpbmdOb2RlXG4gICAgICAgIDogbmV3IEl0ZW1GbGF0Tm9kZSgpO1xuICAgIGZsYXROb2RlLm5hbWUgPSBub2RlLm5hbWU7XG4gICAgZmxhdE5vZGUubGV2ZWwgPSBsZXZlbDtcbiAgICBmbGF0Tm9kZS5jYW5TZWxlY3QgPSBub2RlLmNhblNlbGVjdDtcbiAgICBmbGF0Tm9kZS5kYXRhID0gbm9kZS5kYXRhO1xuICAgIGZsYXROb2RlLmlzU2VsZWN0ZWQgPSBub2RlLmlzU2VsZWN0ZWQ7XG4gICAgZmxhdE5vZGUuZXhwYW5kYWJsZSA9ICEhbm9kZS5jaGlsZHJlbj8ubGVuZ3RoO1xuICAgIGZsYXROb2RlLmhpZGVBcnJvdyA9IG5vZGUuaGlkZUFycm93O1xuICAgIHRoaXMuZmxhdE5vZGVNYXAuc2V0KGZsYXROb2RlLCBub2RlKTtcbiAgICB0aGlzLm5lc3RlZE5vZGVNYXAuc2V0KG5vZGUsIGZsYXROb2RlKTtcblxuICAgIGlmIChmbGF0Tm9kZS5pc1NlbGVjdGVkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3QoZmxhdE5vZGUpO1xuICAgIH1cbiAgICB0aGlzLmlzSW5pdCA9IGZhbHNlO1xuICAgIHJldHVybiBmbGF0Tm9kZTtcbiAgfTtcblxuICAvKiogV2hldGhlciBhbGwgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBub2RlIGFyZSBzZWxlY3RlZC4gKi9cbiAgZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlOiBJdGVtRmxhdE5vZGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSk7XG4gICAgY29uc3QgZGVzY0FsbFNlbGVjdGVkID1cbiAgICAgIGRlc2NlbmRhbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGRlc2NlbmRhbnRzLmV2ZXJ5KChjaGlsZCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChjaGlsZCk7XG4gICAgICB9KTtcbiAgICByZXR1cm4gZGVzY0FsbFNlbGVjdGVkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgcGFydCBvZiB0aGUgZGVzY2VuZGFudHMgYXJlIHNlbGVjdGVkICovXG4gIGRlc2NlbmRhbnRzUGFydGlhbGx5U2VsZWN0ZWQobm9kZTogSXRlbUZsYXROb2RlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGRlc2NlbmRhbnRzLnNvbWUoKGNoaWxkKSA9PlxuICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChjaGlsZClcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQgJiYgIXRoaXMuZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlKTtcbiAgfVxuXG4gIC8qKiBUb2dnbGUgdGhlIHRvLWRvIGl0ZW0gc2VsZWN0aW9uLiBTZWxlY3QvZGVzZWxlY3QgYWxsIHRoZSBkZXNjZW5kYW50cyBub2RlICovXG4gIHNlbGVjdGlvblRvZ2dsZShub2RlOiBJdGVtRmxhdE5vZGUpOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUuY2FuU2VsZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZShub2RlKTtcbiAgICBpZiAodGhpcy5hdXRvU2VsZWN0RGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcbiAgICAgIGlmICh0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpKSB7XG4gICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdCguLi5kZXNjZW5kYW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdCguLi5kZXNjZW5kYW50cyk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoZWNrQWxsUGFyZW50c1NlbGVjdGlvbihub2RlKTtcbiAgICB9XG4gIH1cblxuICBsZWFmSXRlbVNlbGVjdGlvblRvZ2dsZShub2RlOiBJdGVtRmxhdE5vZGUpOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUuY2FuU2VsZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5hbGxvd0NoZWNrSXRlbXMpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gbm9kZTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5uZXh0KG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi50b2dnbGUobm9kZSk7XG4gICAgICBpZiAodGhpcy5hdXRvU2VsZWN0RGVzY2VuZGFudHMpIHtcbiAgICAgICAgdGhpcy5jaGVja0FsbFBhcmVudHNTZWxlY3Rpb24obm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogQ2hlY2tzIGFsbCB0aGUgcGFyZW50cyB3aGVuIGEgbGVhZiBub2RlIGlzIHNlbGVjdGVkL3Vuc2VsZWN0ZWQgKi9cbiAgY2hlY2tBbGxQYXJlbnRzU2VsZWN0aW9uKG5vZGU6IEl0ZW1GbGF0Tm9kZSk6IHZvaWQge1xuICAgIGxldCBwYXJlbnQ6IEl0ZW1GbGF0Tm9kZSB8IG51bGwgPSB0aGlzLmdldFBhcmVudE5vZGUobm9kZSk7XG4gICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgdGhpcy5jaGVja1Jvb3ROb2RlU2VsZWN0aW9uKHBhcmVudCk7XG4gICAgICBwYXJlbnQgPSB0aGlzLmdldFBhcmVudE5vZGUocGFyZW50KTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2hlY2sgcm9vdCBub2RlIGNoZWNrZWQgc3RhdGUgYW5kIGNoYW5nZSBpdCBhY2NvcmRpbmdseSAqL1xuICBjaGVja1Jvb3ROb2RlU2VsZWN0aW9uKG5vZGU6IEl0ZW1GbGF0Tm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGVTZWxlY3RlZCA9IHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSk7XG4gICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpO1xuICAgIGNvbnN0IGRlc2NBbGxTZWxlY3RlZCA9XG4gICAgICBkZXNjZW5kYW50cy5sZW5ndGggPiAwICYmXG4gICAgICBkZXNjZW5kYW50cy5ldmVyeSgoY2hpbGQpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQoY2hpbGQpO1xuICAgICAgfSk7XG4gICAgaWYgKG5vZGVTZWxlY3RlZCAmJiAhZGVzY0FsbFNlbGVjdGVkKSB7XG4gICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdChub2RlKTtcbiAgICB9IGVsc2UgaWYgKCFub2RlU2VsZWN0ZWQgJiYgZGVzY0FsbFNlbGVjdGVkKSB7XG4gICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyogR2V0IHRoZSBwYXJlbnQgbm9kZSBvZiBhIG5vZGUgKi9cbiAgZ2V0UGFyZW50Tm9kZShub2RlOiBJdGVtRmxhdE5vZGUpOiBJdGVtRmxhdE5vZGUgfCBudWxsIHtcbiAgICBjb25zdCBjdXJyZW50TGV2ZWwgPSB0aGlzLmdldExldmVsKG5vZGUpO1xuXG4gICAgaWYgKGN1cnJlbnRMZXZlbCA8IDEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5pbmRleE9mKG5vZGUpIC0gMTtcblxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgY3VycmVudE5vZGUgPSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXTtcblxuICAgICAgaWYgKHRoaXMuZ2V0TGV2ZWwoY3VycmVudE5vZGUpIDwgY3VycmVudExldmVsKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpbml0aWFsaXplKGRhdGE6IEl0ZW1Ob2RlW10pIHtcbiAgICB0aGlzLmRhdGFiYXNlLmluaXRpYWxpemUoZGF0YSk7XG4gIH1cblxuICBnZXRTZWxlY3RlZE5vZGVzKCk6IEl0ZW1GbGF0Tm9kZVtdIHtcbiAgICBsZXQgc2VsZWN0ZWROb2RlczogSXRlbUZsYXROb2RlW10gPSBbXTtcbiAgICBpZiAoIXRoaXMuYWxsb3dDaGVja0l0ZW1zKSB7XG4gICAgICBzZWxlY3RlZE5vZGVzLnB1c2godGhpcy5zZWxlY3RlZE5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5mb3JFYWNoKChuKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG4pKSB7XG4gICAgICAgICAgbi5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZWxlY3RlZE5vZGVzLnB1c2gobik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0ZWROb2RlcztcbiAgfVxuXG4gIC8qKiBTZWxlY3QgdGhlIGNhdGVnb3J5IHNvIHdlIGNhbiBpbnNlcnQgdGhlIG5ldyBpdGVtLiAqL1xuICBhZGROZXdJdGVtKG5vZGU6IEl0ZW1GbGF0Tm9kZSkge1xuICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLmZsYXROb2RlTWFwLmdldChub2RlKTtcbiAgICB0aGlzLmRhdGFiYXNlLmluc2VydEl0ZW0ocGFyZW50Tm9kZSEsICcnKTtcbiAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZChub2RlKTtcbiAgfVxuXG4gIC8qKiBTYXZlIHRoZSBub2RlIHRvIGRhdGFiYXNlICovXG4gIHNhdmVOb2RlKG5vZGU6IEl0ZW1GbGF0Tm9kZSwgaXRlbVZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBuZXN0ZWROb2RlID0gdGhpcy5mbGF0Tm9kZU1hcC5nZXQobm9kZSk7XG4gICAgdGhpcy5kYXRhYmFzZS51cGRhdGVJdGVtKG5lc3RlZE5vZGUhLCBpdGVtVmFsdWUpO1xuICB9XG5cbiAgZmlsdGVyVGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLmRhdGFiYXNlLmZpbHRlcih0ZXh0KTtcbiAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICB9XG5cbiAgZXhwYW5kQWxsKCkge1xuICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kQWxsKCk7XG4gIH1cblxuICBleHBhbmROb2RlKG5vZGVJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMgJiZcbiAgICAgIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmxlbmd0aCA+IG5vZGVJbmRleFxuICAgICkge1xuICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQodGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbbm9kZUluZGV4XSk7XG4gICAgfVxuICB9XG5cbiAgYXBwbHlGaWx0ZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIHJldHVybiB0aGlzLmZpbHRlclRleHQoZmlsdGVyVmFsdWUpO1xuICB9XG59XG4iLCI8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoIHAtMTBcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWxsb3dGaWx0ZXJcIlxuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gIDxtYXQtbGFiZWw+IHt7IGNvbW1vbktleXMuYWN0aW9ucy5maWx0ZXIgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICBtaW5sZW5ndGg9XCIxXCJcbiAgICAgICAgIChrZXl1cCk9XCJhcHBseUZpbHRlcigkZXZlbnQpXCJcbiAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgY29tbW9uS2V5cy5hY3Rpb25zLmZpbHRlciB9fVwiXG4gICAgICAgICAjaW5wdXQgLz5cbjwvbWF0LWZvcm0tZmllbGQ+XG5cbjwhLS08Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IGl0ZW1TaXplPVwiMzBcIiBjbGFzcz1cImRpY3Rpb25hcnktdmlld3BvcnRcIj4tLT5cbjxtYXQtdHJlZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCI+XG4gIDwhLS0gTGVhZiBOb2RlcyAtLT5cbiAgPG1hdC10cmVlLW5vZGUgKm1hdFRyZWVOb2RlRGVmPVwibGV0IG5vZGVcIlxuICAgICAgICAgICAgICAgICBtYXRUcmVlTm9kZVBhZGRpbmc+XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gZGlzYWJsZWQ+PC9idXR0b24+XG4gICAgPCEtLSBOb2RlIENvbnRlbnQgLS0+XG4gICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgIDwhLS0gQ2hlY2tib3ggZm9yIFNlbGVjdGFibGUgTm9kZXMgd2hlbiBjaGVja2JveGVzIGFyZSBhbGxvd2VkIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGUuY2FuU2VsZWN0ICYmIGFsbG93Q2hlY2tJdGVtc1wiPlxuICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwiY2hlY2tsaXN0LWxlYWYtbm9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwibGVhZkl0ZW1TZWxlY3Rpb25Ub2dnbGUobm9kZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgIHt7IG5vZGUubmFtZSB9fVxuICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPCEtLSBDbGlja2FibGUgTGFiZWwgZm9yIFNlbGVjdGFibGUgTm9kZXMgd2hlbiBjaGVja2JveGVzIGFyZSBub3QgYWxsb3dlZCAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub2RlLmNhblNlbGVjdCAmJiAhYWxsb3dDaGVja0l0ZW1zXCI+XG4gICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJtZGMtbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibGVhZkl0ZW1TZWxlY3Rpb25Ub2dnbGUobm9kZSlcIj5cbiAgICAgICAgICB7eyBub2RlLm5hbWUgfX1cbiAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwhLS0gTm9uLWNsaWNrYWJsZSBMYWJlbCBmb3IgTm9uLXNlbGVjdGFibGUgTm9kZXMgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW5vZGUuY2FuU2VsZWN0XCI+XG4gICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJtZGMtbGFiZWxcIj5cbiAgICAgICAgICB7eyBub2RlLm5hbWUgfX1cbiAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9tYXQtdHJlZS1ub2RlPlxuXG4gIDwhLS0gTm9kZXMgd2l0aCBDaGlsZHJlbiAtLT5cbiAgPG1hdC10cmVlLW5vZGUgKm1hdFRyZWVOb2RlRGVmPVwibGV0IG5vZGU7IHdoZW46IGhhc0NoaWxkXCJcbiAgICAgICAgICAgICAgICAgbWF0VHJlZU5vZGVQYWRkaW5nPlxuICAgIDwhLS0gRXhwYW5kL0NvbGxhcHNlIEJ1dHRvbiAtLT5cbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgbWF0VHJlZU5vZGVUb2dnbGVcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1RvZ2dsZSAnICsgbm9kZS5uYW1lXCJcbiAgICAgICAgICAgICpuZ0lmPVwiIW5vZGUuaGlkZUFycm93XCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yXCI+XG4gICAgICAgIHt7IHRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyAnZXhwYW5kX21vcmUnIDogJ2NoZXZyb25fcmlnaHQnIH19XG4gICAgICA8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDwhLS0gTm9kZSBDb250ZW50IC0tPlxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8IS0tIENoZWNrYm94IGZvciBTZWxlY3RhYmxlIE5vZGVzIHdoZW4gY2hlY2tib3hlcyBhcmUgYWxsb3dlZCAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub2RlLmNhblNlbGVjdCAmJiBhbGxvd0NoZWNrSXRlbXNcIj5cbiAgICAgICAgPG1hdC1jaGVja2JveCBbY2hlY2tlZF09XCJjaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3Rpb25Ub2dnbGUobm9kZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgIHt7IG5vZGUubmFtZSB9fVxuICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPCEtLSBDbGlja2FibGUgTGFiZWwgZm9yIFNlbGVjdGFibGUgTm9kZXMgd2hlbiBjaGVja2JveGVzIGFyZSBub3QgYWxsb3dlZCAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub2RlLmNhblNlbGVjdCAmJiAhYWxsb3dDaGVja0l0ZW1zXCI+XG4gICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJtZGMtbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibGVhZkl0ZW1TZWxlY3Rpb25Ub2dnbGUobm9kZSlcIj5cbiAgICAgICAgICB7eyBub2RlLm5hbWUgfX1cbiAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwhLS0gTm9uLWNsaWNrYWJsZSBMYWJlbCBmb3IgTm9uLXNlbGVjdGFibGUgTm9kZXMgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW5vZGUuY2FuU2VsZWN0XCI+XG4gICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJtZGMtbGFiZWxcIj5cbiAgICAgICAgICB7eyBub2RlLm5hbWUgfX1cbiAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIEFkZCBOZXcgSXRlbSBCdXR0b24gLS0+XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImFkZE5ld0l0ZW0obm9kZSlcIiAqbmdJZj1cImFsbG93QWRkSXRlbXNcIj5cbiAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC10cmVlLW5vZGU+XG48L21hdC10cmVlPlxuPCEtLTwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0Pi0tPlxuIl19