@valtimo-plugins/freemarker 8.1.0 → 8.1.1-V12

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 (70) hide show
  1. package/README.md +0 -1
  2. package/esm2022/lib/models/freemarker-template.mjs +17 -0
  3. package/esm2022/lib/models/index.mjs +17 -0
  4. package/esm2022/lib/plugins/document-generator/assets/document-generator-plugin-logo.mjs +18 -0
  5. package/esm2022/lib/plugins/document-generator/assets/index.mjs +17 -0
  6. package/esm2022/lib/plugins/document-generator/components/document-generator-configuration/document-generator-configuration.component.mjs +77 -0
  7. package/esm2022/lib/plugins/document-generator/components/document-template-add-edit-modal/document-template-add-edit-modal.component.mjs +117 -0
  8. package/esm2022/lib/plugins/document-generator/components/document-template-delete-modal/document-template-delete-modal.component.mjs +42 -0
  9. package/esm2022/lib/plugins/document-generator/components/document-template-editor/document-template-editor.component.mjs +211 -0
  10. package/esm2022/lib/plugins/document-generator/components/document-template-list/document-template-list.component.mjs +126 -0
  11. package/esm2022/lib/plugins/document-generator/components/generate-csv/generate-csv.component.mjs +94 -0
  12. package/esm2022/lib/plugins/document-generator/components/generate-pdf/generate-pdf.component.mjs +94 -0
  13. package/esm2022/lib/plugins/document-generator/document-generator-management-routing.module.mjs +48 -0
  14. package/esm2022/lib/plugins/document-generator/document-generator-plugin-module.mjs +137 -0
  15. package/esm2022/lib/plugins/document-generator/document-generator-plugin.specification.mjs +74 -0
  16. package/esm2022/lib/plugins/document-generator/models/config.mjs +18 -0
  17. package/esm2022/lib/plugins/document-generator/models/index.mjs +17 -0
  18. package/esm2022/lib/plugins/mail-template/assets/index.mjs +17 -0
  19. package/esm2022/lib/plugins/mail-template/assets/mail-template-plugin-logo.mjs +18 -0
  20. package/esm2022/lib/plugins/mail-template/components/generate-mail-content/generate-mail-content.component.mjs +94 -0
  21. package/esm2022/lib/plugins/mail-template/components/generate-mail-file/generate-mail-file.component.mjs +94 -0
  22. package/esm2022/lib/plugins/mail-template/components/mail-template-add-edit-modal/mail-template-add-edit-modal.component.mjs +92 -0
  23. package/esm2022/lib/plugins/mail-template/components/mail-template-configuration/mail-template-configuration.component.mjs +77 -0
  24. package/esm2022/lib/plugins/mail-template/components/mail-template-delete-modal/mail-template-delete-modal.component.mjs +40 -0
  25. package/esm2022/lib/plugins/mail-template/components/mail-template-editor/mail-template-editor.component.mjs +201 -0
  26. package/esm2022/lib/plugins/mail-template/components/mail-template-list/mail-template-list.component.mjs +124 -0
  27. package/esm2022/lib/plugins/mail-template/mail-template-management-routing.module.mjs +48 -0
  28. package/esm2022/lib/plugins/mail-template/mail-template-plugin-module.mjs +154 -0
  29. package/esm2022/lib/plugins/mail-template/mail-template-plugin.specification.mjs +74 -0
  30. package/esm2022/lib/plugins/mail-template/models/config.mjs +17 -0
  31. package/esm2022/lib/plugins/mail-template/models/index.mjs +17 -0
  32. package/esm2022/lib/plugins/text-template/assets/index.mjs +17 -0
  33. package/esm2022/lib/plugins/text-template/assets/text-template-plugin-logo.mjs +18 -0
  34. package/esm2022/lib/plugins/text-template/components/generate-text-file/generate-text-file.component.mjs +94 -0
  35. package/esm2022/lib/plugins/text-template/components/text-template-add-edit-modal/text-template-add-edit-modal.component.mjs +92 -0
  36. package/esm2022/lib/plugins/text-template/components/text-template-configuration/text-template-configuration.component.mjs +77 -0
  37. package/esm2022/lib/plugins/text-template/components/text-template-delete-modal/text-template-delete-modal.component.mjs +42 -0
  38. package/esm2022/lib/plugins/text-template/components/text-template-editor/text-template-editor.component.mjs +189 -0
  39. package/esm2022/lib/plugins/text-template/components/text-template-list/text-template-list.component.mjs +124 -0
  40. package/esm2022/lib/plugins/text-template/models/config.mjs +17 -0
  41. package/esm2022/lib/plugins/text-template/models/index.mjs +17 -0
  42. package/esm2022/lib/plugins/text-template/text-template-management-routing.module.mjs +48 -0
  43. package/esm2022/lib/plugins/text-template/text-template-plugin-module.mjs +149 -0
  44. package/esm2022/lib/plugins/text-template/text-template-plugin.specification.mjs +66 -0
  45. package/esm2022/lib/services/freemarker-template-management.service.mjs +84 -0
  46. package/esm2022/lib/services/index.mjs +17 -0
  47. package/esm2022/public_api.mjs +54 -0
  48. package/esm2022/valtimo-plugins-freemarker.mjs +5 -0
  49. package/fesm2022/valtimo-plugins-freemarker.mjs +448 -468
  50. package/fesm2022/valtimo-plugins-freemarker.mjs.map +1 -1
  51. package/lib/models/freemarker-template.d.ts +11 -11
  52. package/lib/plugins/document-generator/components/document-template-add-edit-modal/document-template-add-edit-modal.component.d.ts +4 -4
  53. package/lib/plugins/document-generator/components/document-template-editor/document-template-editor.component.d.ts +7 -7
  54. package/lib/plugins/document-generator/components/document-template-list/document-template-list.component.d.ts +4 -7
  55. package/lib/plugins/document-generator/components/generate-csv/generate-csv.component.d.ts +7 -7
  56. package/lib/plugins/document-generator/components/generate-pdf/generate-pdf.component.d.ts +7 -7
  57. package/lib/plugins/document-generator/document-generator-plugin-module.d.ts +1 -1
  58. package/lib/plugins/mail-template/components/generate-mail-content/generate-mail-content.component.d.ts +10 -9
  59. package/lib/plugins/mail-template/components/generate-mail-file/generate-mail-file.component.d.ts +10 -9
  60. package/lib/plugins/mail-template/components/mail-template-add-edit-modal/mail-template-add-edit-modal.component.d.ts +2 -2
  61. package/lib/plugins/mail-template/components/mail-template-editor/mail-template-editor.component.d.ts +6 -6
  62. package/lib/plugins/mail-template/components/mail-template-list/mail-template-list.component.d.ts +3 -6
  63. package/lib/plugins/mail-template/mail-template-plugin-module.d.ts +5 -2
  64. package/lib/plugins/text-template/components/generate-text-file/generate-text-file.component.d.ts +10 -9
  65. package/lib/plugins/text-template/components/text-template-add-edit-modal/text-template-add-edit-modal.component.d.ts +2 -2
  66. package/lib/plugins/text-template/components/text-template-editor/text-template-editor.component.d.ts +6 -6
  67. package/lib/plugins/text-template/components/text-template-list/text-template-list.component.d.ts +3 -6
  68. package/lib/plugins/text-template/text-template-plugin-module.d.ts +5 -1
  69. package/lib/services/freemarker-template-management.service.d.ts +9 -10
  70. package/package.json +3 -1
@@ -0,0 +1,211 @@
1
+ /*
2
+ * Copyright 2015-2023 Ritense BV, the Netherlands.
3
+ *
4
+ * Licensed under EUPL, Version 1.2 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
17
+ import { BehaviorSubject, combineLatest, filter, map, of, switchMap, take, tap } from 'rxjs';
18
+ import { CarbonListModule, EditorModule, RenderInPageHeaderDirectiveModule } from '@valtimo/components';
19
+ import { ButtonModule, DialogModule, IconModule, NotificationService, TabsModule } from 'carbon-components-angular';
20
+ import { TranslateModule } from '@ngx-translate/core';
21
+ import { CommonModule } from '@angular/common';
22
+ import { DocumentTemplateDeleteModalComponent } from '../document-template-delete-modal/document-template-delete-modal.component';
23
+ import * as i0 from "@angular/core";
24
+ import * as i1 from "../../../../services";
25
+ import * as i2 from "@angular/router";
26
+ import * as i3 from "@valtimo/components";
27
+ import * as i4 from "carbon-components-angular";
28
+ import * as i5 from "@ngx-translate/core";
29
+ import * as i6 from "@angular/common";
30
+ export class DocumentTemplateEditorComponent {
31
+ constructor(templateService, route, pageTitleService, router, notificationService, translateService, breadcrumbService) {
32
+ this.templateService = templateService;
33
+ this.route = route;
34
+ this.pageTitleService = pageTitleService;
35
+ this.router = router;
36
+ this.notificationService = notificationService;
37
+ this.translateService = translateService;
38
+ this.breadcrumbService = breadcrumbService;
39
+ this.model$ = new BehaviorSubject(null);
40
+ this.template$ = new BehaviorSubject(null);
41
+ this.saveDisabled$ = new BehaviorSubject(true);
42
+ this.editorDisabled$ = new BehaviorSubject(false);
43
+ this.moreDisabled$ = new BehaviorSubject(true);
44
+ this.showDeleteModal$ = new BehaviorSubject(false);
45
+ this.updatedModelValue$ = new BehaviorSubject('');
46
+ this.initialModelValue$ = new BehaviorSubject('');
47
+ this.isValid$ = new BehaviorSubject(true);
48
+ this._caseDefinitionName$ = this.route.params.pipe(map(params => params?.name), filter(caseDefinitionName => !!caseDefinitionName));
49
+ this.templateKey$ = combineLatest([this.route.params, this.route.parent.params]).pipe(map(([params, parentParams]) => params?.templateKey || parentParams?.templateKey), filter(templateKey => !!templateKey));
50
+ this.templateType$ = combineLatest([this.route.params, this.route.parent.params]).pipe(map(([params, parentParams]) => params?.templateType || parentParams?.templateType), filter(templateType => !!templateType));
51
+ }
52
+ ngAfterViewInit() {
53
+ this.initBreadcrumb();
54
+ }
55
+ ngOnInit() {
56
+ this.loadTemplate();
57
+ this.initSaveButtonLogic();
58
+ }
59
+ ngOnDestroy() {
60
+ this.pageTitleService.enableReset();
61
+ this.breadcrumbService.clearThirdBreadcrumb();
62
+ }
63
+ onValid(valid) {
64
+ if (typeof valid === 'boolean') {
65
+ this.isValid$.next(valid);
66
+ }
67
+ }
68
+ onValueChange(value) {
69
+ this.updatedModelValue$.next(value);
70
+ }
71
+ updateTemplate() {
72
+ this.disableEditor();
73
+ this.disableSave();
74
+ this.disableMore();
75
+ combineLatest([this.updatedModelValue$, this._caseDefinitionName$, this.templateKey$, this.templateType$]).pipe(switchMap(([updatedModelValue, caseDefinitionName, templateKey, templateType]) => this.templateService.updateTemplate({
76
+ key: templateKey,
77
+ caseDefinitionName: caseDefinitionName,
78
+ type: templateType,
79
+ content: updatedModelValue,
80
+ })), take(1)).subscribe({
81
+ next: result => {
82
+ this.enableMore();
83
+ this.enableSave();
84
+ this.enableEditor();
85
+ this.showSuccessMessage(result.key);
86
+ this.setModel(result.content);
87
+ this.initialModelValue$.next(result.content);
88
+ this.template$.next(result);
89
+ },
90
+ error: () => {
91
+ this.enableMore();
92
+ this.enableSave();
93
+ this.enableEditor();
94
+ },
95
+ });
96
+ }
97
+ onDelete(templates) {
98
+ this.disableEditor();
99
+ this.disableSave();
100
+ this.disableMore();
101
+ this._caseDefinitionName$.pipe(take(1)).subscribe(caseDefinitionName => this.templateService.deleteTemplates({
102
+ caseDefinitionName,
103
+ type: templates[0]?.type || 'pdf',
104
+ templates
105
+ }).pipe(take(1)).subscribe(_ => this.router.navigate([`/dossier-management/dossier/${caseDefinitionName}`])));
106
+ }
107
+ showDeleteModal() {
108
+ this.showDeleteModal$.next(true);
109
+ }
110
+ loadTemplate() {
111
+ combineLatest([this._caseDefinitionName$, this.templateKey$, this.templateType$]).pipe(tap(([_, key, type]) => {
112
+ this.pageTitleService.setCustomPageTitle(`Document: ${key}.${type}`, true);
113
+ }), switchMap(([caseDefinitionName, key, type]) => this.templateService.getTemplate(caseDefinitionName, type, key)), take(1)).subscribe(result => {
114
+ this.enableMore();
115
+ this.enableSave();
116
+ this.enableEditor();
117
+ this.setModel(result.content);
118
+ this.initialModelValue$.next(result.content);
119
+ this.template$.next(result);
120
+ });
121
+ }
122
+ initSaveButtonLogic() {
123
+ combineLatest([this.updatedModelValue$, this.initialModelValue$, this.isValid$]).subscribe(([updatedValue, initialValue, isValid]) => {
124
+ this.saveDisabled$.next(!isValid || updatedValue === initialValue);
125
+ });
126
+ }
127
+ setModel(content) {
128
+ this.model$.next({
129
+ value: content,
130
+ language: 'freemarker2',
131
+ });
132
+ this.updatedModelValue$.next(content);
133
+ }
134
+ disableMore() {
135
+ this.moreDisabled$.next(true);
136
+ }
137
+ enableMore() {
138
+ this.moreDisabled$.next(false);
139
+ }
140
+ disableSave() {
141
+ this.saveDisabled$.next(true);
142
+ }
143
+ enableSave() {
144
+ this.saveDisabled$.next(false);
145
+ }
146
+ disableEditor() {
147
+ this.editorDisabled$.next(true);
148
+ }
149
+ enableEditor() {
150
+ this.editorDisabled$.next(false);
151
+ }
152
+ onSelectedTabPreview() {
153
+ setTimeout(() => {
154
+ const preview = document.getElementById('preview-iframe');
155
+ if (preview) {
156
+ preview.src = window.URL.createObjectURL(new Blob([""], { type: "text/plain" }));
157
+ combineLatest([this.updatedModelValue$, this.template$]).pipe(take(1), switchMap(([updatedModelValue, template]) => combineLatest([this.templateService.previewTemplate({
158
+ fileName: `${template.key}.${template.type}`,
159
+ content: updatedModelValue,
160
+ }), of(`${template.key}.${template.type}`)]))).subscribe({
161
+ next: ([blob, filename]) => {
162
+ preview.src = URL.createObjectURL(blob);
163
+ },
164
+ error: (err) => {
165
+ console.error("Preview failed:", err);
166
+ const errorBlob = new Blob([`<html><body><h2>Error loading preview</h2><p>See logs for more information</p></body></html>`], { type: 'text/html' });
167
+ preview.src = URL.createObjectURL(errorBlob);
168
+ }
169
+ });
170
+ }
171
+ }, 100);
172
+ }
173
+ initBreadcrumb() {
174
+ this._caseDefinitionName$.subscribe(caseDefinitionName => {
175
+ this.breadcrumbService.setThirdBreadcrumb({
176
+ route: [`/dossier-management/dossier/${caseDefinitionName}`],
177
+ content: caseDefinitionName,
178
+ href: `/dossier-management/dossier/${caseDefinitionName}`,
179
+ });
180
+ });
181
+ }
182
+ showSuccessMessage(key) {
183
+ this.notificationService.showToast({
184
+ caption: this.translateService.instant(`${key} was saved successfully`, {
185
+ key,
186
+ }),
187
+ type: 'success',
188
+ duration: 4000,
189
+ showClose: true,
190
+ title: this.translateService.instant('Saved successfully'),
191
+ });
192
+ }
193
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DocumentTemplateEditorComponent, deps: [{ token: i1.FreemarkerTemplateManagementService }, { token: i2.ActivatedRoute }, { token: i3.PageTitleService }, { token: i2.Router }, { token: i4.NotificationService }, { token: i5.TranslateService }, { token: i3.BreadcrumbService }], target: i0.ɵɵFactoryTarget.Component }); }
194
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DocumentTemplateEditorComponent, isStandalone: true, selector: "ng-component", providers: [NotificationService], ngImport: i0, template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n model: model$ | async,\n updatedModelValue: updatedModelValue$ | async,\n template: template$ | async,\n } as obs\">\n\n <div class=\"template-explanation\">\n @if (obs?.template?.type === 'pdf') {\n <p>\n <strong>PDF Templates</strong> use HTML in combination with\n <a href=\"https://freemarker.apache.org/docs/dgui_quickstart_basics.html\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n FreeMarker\n </a>\n to define placeholders within the HTML structure. The FreeMarker data model is based on nested\n <a href=\"https://docs.valtimo.nl/features/value-resolvers\" target=\"_blank\" rel=\"noopener noreferrer\">\n Valtimo value resolvers\n </a>,\n but uses a slightly different syntax.\n </p>\n <p>\n For example, <code>$&#123;doc.firstName&#125;</code> retrieves the\n <code>firstName</code> value from the case.\n </p>\n <p>\n The notation <code>&lt;#list docs as doc&gt;...&lt;/#list&gt;</code> streams all documents in the\n current case.\n </p>\n } @else {\n <p>\n <strong>CSV Templates</strong> use a semicolon (<code>;</code>) as a separator.\n <a href=\"https://freemarker.apache.org/docs/dgui_quickstart_basics.html\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n FreeMarker\n </a>\n is used to define placeholders within the CSV content. The FreeMarker data model is based on nested\n <a href=\"https://docs.valtimo.nl/features/value-resolvers\" target=\"_blank\" rel=\"noopener noreferrer\">\n Valtimo value resolvers\n </a>,\n but uses a slightly different syntax.\n </p>\n <p>\n For example, <code>$&#123;doc.firstName&#125;</code> retrieves the\n <code>firstName</code> value from the case.\n </p>\n <p>\n The notation <code>&lt;#list docs as doc&gt;...&lt;/#list&gt;</code> streams all documents in the\n current case.\n </p>\n }\n </div>\n\n <cds-tabs type=\"contained\">\n <cds-tab [active]=\"true\" [heading]=\"'Editor'\">\n <valtimo-editor\n [model]=\"obs.model\"\n [disabled]=\"(editorDisabled$ | async) || (readOnly$ | async)\"\n (validEvent)=\"onValid($event)\"\n (valueChangeEvent)=\"onValueChange($event)\"\n [fitPage]=\"true\"\n [fitPageExtraSpace]=\"80\"\n ></valtimo-editor>\n </cds-tab>\n <cds-tab [heading]=\"'Preview'\" (selected)=\"onSelectedTabPreview()\">\n <iframe title=\"Preview\" id=\"preview-iframe\">\n </iframe>\n </cds-tab>\n </cds-tabs>\n\n</ng-container>\n\n<ng-container renderInPageHeader>\n <ng-template>\n <div *ngIf=\"{\n model: model$ | async,\n moreDisabled: moreDisabled$ | async,\n template: template$ | async,\n } as obs\"\n class=\"buttons-container\"\n >\n <cds-overflow-menu class=\"overflow-button\">\n <cds-overflow-menu-option\n [disabled]=\"obs.moreDisabled || (readOnly$ | async)\"\n type=\"danger\"\n (selected)=\"showDeleteModal()\"\n >{{ 'interface.delete' | translate }}\n </cds-overflow-menu-option\n >\n </cds-overflow-menu>\n\n <button\n [disabled]=\"(saveDisabled$ | async) || (readOnly$ | async)\"\n cdsButton=\"primary\"\n size=\"md\"\n (click)=\"updateTemplate()\"\n >\n {{ 'interface.save' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"save\" size=\"16\"></svg>\n </button>\n </div>\n </ng-template>\n</ng-container>\n\n<ng-container *ngIf=\"{templateKey: templateKey$ | async, templateType: templateType$ | async} as obs\">\n <valtimo-document-template-delete-modal\n [deleteRowKeys]=\"[{key: obs.templateKey, type: obs.templateType}]\"\n [showDeleteModal$]=\"showDeleteModal$\"\n (deleteEvent)=\"onDelete($event)\"\n >\n </valtimo-document-template-delete-modal>\n</ng-container>\n", styles: ["::ng-deep .cds--tab-content{background:var(--cds-layer)!important}::ng-deep #preview-iframe{width:100%;height:calc(100vh - 219px)}.loading-container{display:flex;width:100%;justify-content:center}.overflow-button{margin-right:16px}.buttons-container{display:flex;flex-direction:row}.template-explanation{margin-top:16px;margin-bottom:24px}\n/*!\n * Copyright 2015-2023 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: TabsModule }, { kind: "component", type: i4.Tabs, selector: "cds-tabs, ibm-tabs", inputs: ["position", "cacheActive", "followFocus", "isNavigation", "ariaLabel", "ariaLabelledby", "type", "theme", "skeleton"] }, { kind: "component", type: i4.Tab, selector: "cds-tab, ibm-tab", inputs: ["heading", "title", "context", "active", "disabled", "tabIndex", "id", "cacheActive", "tabContent", "templateContext"], outputs: ["selected"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.OverflowMenu, selector: "cds-overflow-menu, ibm-overflow-menu", inputs: ["buttonLabel", "flip", "placement", "open", "customTrigger", "offset", "wrapperClass", "triggerClass"], outputs: ["openChange"] }, { kind: "component", type: i4.OverflowMenuOption, selector: "cds-overflow-menu-option, ibm-overflow-menu-option", inputs: ["divider", "type", "disabled", "href", "target", "innerClass"], outputs: ["selected"] }, { kind: "component", type: DocumentTemplateDeleteModalComponent, selector: "valtimo-document-template-delete-modal", inputs: ["deleteRowKeys", "showDeleteModal$"], outputs: ["deleteEvent"] }, { kind: "ngmodule", type: CarbonListModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: EditorModule }, { kind: "component", type: i3.EditorComponent, selector: "valtimo-editor", inputs: ["editorOptions", "model", "disabled", "formatOnLoad", "widthPx", "heightPx", "heightStyle", "jsonSchema", "fitPage", "fitPageExtraSpace"], outputs: ["validEvent", "valueChangeEvent"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i4.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "ngmodule", type: RenderInPageHeaderDirectiveModule }, { kind: "directive", type: i3.RenderInPageHeaderDirective, selector: "[renderInPageHeader]", inputs: ["fullWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
195
+ }
196
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DocumentTemplateEditorComponent, decorators: [{
197
+ type: Component,
198
+ args: [{ standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [NotificationService], imports: [
199
+ CommonModule,
200
+ TranslateModule,
201
+ TabsModule,
202
+ DialogModule,
203
+ DocumentTemplateDeleteModalComponent,
204
+ CarbonListModule,
205
+ ButtonModule,
206
+ EditorModule,
207
+ IconModule,
208
+ RenderInPageHeaderDirectiveModule,
209
+ ], template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n model: model$ | async,\n updatedModelValue: updatedModelValue$ | async,\n template: template$ | async,\n } as obs\">\n\n <div class=\"template-explanation\">\n @if (obs?.template?.type === 'pdf') {\n <p>\n <strong>PDF Templates</strong> use HTML in combination with\n <a href=\"https://freemarker.apache.org/docs/dgui_quickstart_basics.html\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n FreeMarker\n </a>\n to define placeholders within the HTML structure. The FreeMarker data model is based on nested\n <a href=\"https://docs.valtimo.nl/features/value-resolvers\" target=\"_blank\" rel=\"noopener noreferrer\">\n Valtimo value resolvers\n </a>,\n but uses a slightly different syntax.\n </p>\n <p>\n For example, <code>$&#123;doc.firstName&#125;</code> retrieves the\n <code>firstName</code> value from the case.\n </p>\n <p>\n The notation <code>&lt;#list docs as doc&gt;...&lt;/#list&gt;</code> streams all documents in the\n current case.\n </p>\n } @else {\n <p>\n <strong>CSV Templates</strong> use a semicolon (<code>;</code>) as a separator.\n <a href=\"https://freemarker.apache.org/docs/dgui_quickstart_basics.html\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n FreeMarker\n </a>\n is used to define placeholders within the CSV content. The FreeMarker data model is based on nested\n <a href=\"https://docs.valtimo.nl/features/value-resolvers\" target=\"_blank\" rel=\"noopener noreferrer\">\n Valtimo value resolvers\n </a>,\n but uses a slightly different syntax.\n </p>\n <p>\n For example, <code>$&#123;doc.firstName&#125;</code> retrieves the\n <code>firstName</code> value from the case.\n </p>\n <p>\n The notation <code>&lt;#list docs as doc&gt;...&lt;/#list&gt;</code> streams all documents in the\n current case.\n </p>\n }\n </div>\n\n <cds-tabs type=\"contained\">\n <cds-tab [active]=\"true\" [heading]=\"'Editor'\">\n <valtimo-editor\n [model]=\"obs.model\"\n [disabled]=\"(editorDisabled$ | async) || (readOnly$ | async)\"\n (validEvent)=\"onValid($event)\"\n (valueChangeEvent)=\"onValueChange($event)\"\n [fitPage]=\"true\"\n [fitPageExtraSpace]=\"80\"\n ></valtimo-editor>\n </cds-tab>\n <cds-tab [heading]=\"'Preview'\" (selected)=\"onSelectedTabPreview()\">\n <iframe title=\"Preview\" id=\"preview-iframe\">\n </iframe>\n </cds-tab>\n </cds-tabs>\n\n</ng-container>\n\n<ng-container renderInPageHeader>\n <ng-template>\n <div *ngIf=\"{\n model: model$ | async,\n moreDisabled: moreDisabled$ | async,\n template: template$ | async,\n } as obs\"\n class=\"buttons-container\"\n >\n <cds-overflow-menu class=\"overflow-button\">\n <cds-overflow-menu-option\n [disabled]=\"obs.moreDisabled || (readOnly$ | async)\"\n type=\"danger\"\n (selected)=\"showDeleteModal()\"\n >{{ 'interface.delete' | translate }}\n </cds-overflow-menu-option\n >\n </cds-overflow-menu>\n\n <button\n [disabled]=\"(saveDisabled$ | async) || (readOnly$ | async)\"\n cdsButton=\"primary\"\n size=\"md\"\n (click)=\"updateTemplate()\"\n >\n {{ 'interface.save' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"save\" size=\"16\"></svg>\n </button>\n </div>\n </ng-template>\n</ng-container>\n\n<ng-container *ngIf=\"{templateKey: templateKey$ | async, templateType: templateType$ | async} as obs\">\n <valtimo-document-template-delete-modal\n [deleteRowKeys]=\"[{key: obs.templateKey, type: obs.templateType}]\"\n [showDeleteModal$]=\"showDeleteModal$\"\n (deleteEvent)=\"onDelete($event)\"\n >\n </valtimo-document-template-delete-modal>\n</ng-container>\n", styles: ["::ng-deep .cds--tab-content{background:var(--cds-layer)!important}::ng-deep #preview-iframe{width:100%;height:calc(100vh - 219px)}.loading-container{display:flex;width:100%;justify-content:center}.overflow-button{margin-right:16px}.buttons-container{display:flex;flex-direction:row}.template-explanation{margin-top:16px;margin-bottom:24px}\n/*!\n * Copyright 2015-2023 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
210
+ }], ctorParameters: () => [{ type: i1.FreemarkerTemplateManagementService }, { type: i2.ActivatedRoute }, { type: i3.PageTitleService }, { type: i2.Router }, { type: i4.NotificationService }, { type: i5.TranslateService }, { type: i3.BreadcrumbService }] });
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtdGVtcGxhdGUtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8tcGx1Z2lucy9mcmVlbWFya2VyL3NyYy9saWIvcGx1Z2lucy9kb2N1bWVudC1nZW5lcmF0b3IvY29tcG9uZW50cy9kb2N1bWVudC10ZW1wbGF0ZS1lZGl0b3IvZG9jdW1lbnQtdGVtcGxhdGUtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8tcGx1Z2lucy9mcmVlbWFya2VyL3NyYy9saWIvcGx1Z2lucy9kb2N1bWVudC1nZW5lcmF0b3IvY29tcG9uZW50cy9kb2N1bWVudC10ZW1wbGF0ZS1lZGl0b3IvZG9jdW1lbnQtdGVtcGxhdGUtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFnQix1QkFBdUIsRUFBRSxTQUFTLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFhLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRWxILE9BQU8sRUFFSCxnQkFBZ0IsRUFFaEIsWUFBWSxFQUVaLGlDQUFpQyxFQUNwQyxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNsSCxPQUFPLEVBQUMsZUFBZSxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBR3RFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFP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O3dCQUNaLGVBQWU7d0JBQ2YsVUFBVTt3QkFDVixZQUFZO3dCQUNaLG9DQUFvQzt3QkFDcEMsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLFlBQVk7d0JBQ1osVUFBVTt3QkFDVixpQ0FBaUM7cUJBQ3BDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjMgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIG9mLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZSwgdGFwfSBmcm9tICdyeGpzJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gICAgQnJlYWRjcnVtYlNlcnZpY2UsXG4gICAgQ2FyYm9uTGlzdE1vZHVsZSxcbiAgICBFZGl0b3JNb2RlbCxcbiAgICBFZGl0b3JNb2R1bGUsXG4gICAgUGFnZVRpdGxlU2VydmljZSxcbiAgICBSZW5kZXJJblBhZ2VIZWFkZXJEaXJlY3RpdmVNb2R1bGVcbn0gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge0J1dHRvbk1vZHVsZSwgRGlhbG9nTW9kdWxlLCBJY29uTW9kdWxlLCBOb3RpZmljYXRpb25TZXJ2aWNlLCBUYWJzTW9kdWxlfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7RnJlZW1hcmtlclRlbXBsYXRlTWFuYWdlbWVudFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7VGVtcGxhdGVSZXNwb25zZSwgVGVtcGxhdGVUeXBlfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIERvY3VtZW50VGVtcGxhdGVEZWxldGVNb2RhbENvbXBvbmVudFxufSBmcm9tICcuLi9kb2N1bWVudC10ZW1wbGF0ZS1kZWxldGUtbW9kYWwvZG9jdW1lbnQtdGVtcGxhdGUtZGVsZXRlLW1vZGFsLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RvY3VtZW50LXRlbXBsYXRlLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc3R5bGVVcmxzOiBbJy4vZG9jdW1lbnQtdGVtcGxhdGUtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbTm90aWZpY2F0aW9uU2VydmljZV0sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgVGFic01vZHVsZSxcbiAgICAgICAgRGlhbG9nTW9kdWxlLFxuICAgICAgICBEb2N1bWVudFRlbXBsYXRlRGVsZXRlTW9kYWxDb21wb25lbnQsXG4gICAgICAgIENhcmJvbkxpc3RNb2R1bGUsXG4gICAgICAgIEJ1dHRvbk1vZHVsZSxcbiAgICAgICAgRWRpdG9yTW9kdWxlLFxuICAgICAgICBJY29uTW9kdWxlLFxuICAgICAgICBSZW5kZXJJblBhZ2VIZWFkZXJEaXJlY3RpdmVNb2R1bGUsXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBEb2N1bWVudFRlbXBsYXRlRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHB1YmxpYyByZWFkb25seSBtb2RlbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVkaXRvck1vZGVsIHwgbnVsbD4obnVsbCk7XG4gICAgcHVibGljIHJlYWRvbmx5IHRlbXBsYXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGVtcGxhdGVSZXNwb25zZSB8IG51bGw+KG51bGwpO1xuICAgIHB1YmxpYyByZWFkb25seSBzYXZlRGlzYWJsZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZWRpdG9yRGlzYWJsZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHVibGljIHJlYWRvbmx5IG1vcmVEaXNhYmxlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICAgIHB1YmxpYyByZWFkb25seSBzaG93RGVsZXRlTW9kYWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHVibGljIHJlYWRvbmx5IHVwZGF0ZWRNb2RlbFZhbHVlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gICAgcHVibGljIHJlYWRvbmx5IGluaXRpYWxNb2RlbFZhbHVlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gICAgcHVibGljIHJlYWRvbmx5IGlzVmFsaWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Nhc2VEZWZpbml0aW9uTmFtZSQ6IE9ic2VydmFibGU8c3RyaW5nPiA9XG4gICAgICAgIHRoaXMucm91dGUucGFyYW1zLnBpcGUoXG4gICAgICAgICAgICBtYXAocGFyYW1zID0+IHBhcmFtcz8ubmFtZSksXG4gICAgICAgICAgICBmaWx0ZXIoY2FzZURlZmluaXRpb25OYW1lID0+ICEhY2FzZURlZmluaXRpb25OYW1lKVxuICAgICAgICApO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHRlbXBsYXRlS2V5JDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gY29tYmluZUxhdGVzdChbdGhpcy5yb3V0ZS5wYXJhbXMsIHRoaXMucm91dGUucGFyZW50LnBhcmFtc10pLnBpcGUoXG4gICAgICAgIG1hcCgoW3BhcmFtcywgcGFyZW50UGFyYW1zXSkgPT4gcGFyYW1zPy50ZW1wbGF0ZUtleSB8fCBwYXJlbnRQYXJhbXM/LnRlbXBsYXRlS2V5KSxcbiAgICAgICAgZmlsdGVyKHRlbXBsYXRlS2V5ID0+ICEhdGVtcGxhdGVLZXkpXG4gICAgKTtcblxuICAgIHB1YmxpYyByZWFkb25seSB0ZW1wbGF0ZVR5cGUkOiBPYnNlcnZhYmxlPFRlbXBsYXRlVHlwZT4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnJvdXRlLnBhcmFtcywgdGhpcy5yb3V0ZS5wYXJlbnQucGFyYW1zXSkucGlwZShcbiAgICAgICAgbWFwKChbcGFyYW1zLCBwYXJlbnRQYXJhbXNdKSA9PiBwYXJhbXM/LnRlbXBsYXRlVHlwZSB8fCBwYXJlbnRQYXJhbXM/LnRlbXBsYXRlVHlwZSksXG4gICAgICAgIGZpbHRlcih0ZW1wbGF0ZVR5cGUgPT4gISF0ZW1wbGF0ZVR5cGUpXG4gICAgKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlU2VydmljZTogRnJlZW1hcmtlclRlbXBsYXRlTWFuYWdlbWVudFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VUaXRsZVNlcnZpY2U6IFBhZ2VUaXRsZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJyZWFkY3J1bWJTZXJ2aWNlOiBCcmVhZGNydW1iU2VydmljZSxcbiAgICApIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmluaXRCcmVhZGNydW1iKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvYWRUZW1wbGF0ZSgpO1xuICAgICAgICB0aGlzLmluaXRTYXZlQnV0dG9uTG9naWMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFnZVRpdGxlU2VydmljZS5lbmFibGVSZXNldCgpO1xuICAgICAgICB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLmNsZWFyVGhpcmRCcmVhZGNydW1iKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVmFsaWQodmFsaWQ6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodHlwZW9mIHZhbGlkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCQubmV4dCh2YWxpZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25WYWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlZE1vZGVsVmFsdWUkLm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlRWRpdG9yKCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZVNhdmUoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlTW9yZSgpO1xuXG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMudXBkYXRlZE1vZGVsVmFsdWUkLCB0aGlzLl9jYXNlRGVmaW5pdGlvbk5hbWUkLCB0aGlzLnRlbXBsYXRlS2V5JCwgdGhpcy50ZW1wbGF0ZVR5cGUkXSkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoW3VwZGF0ZWRNb2RlbFZhbHVlLCBjYXNlRGVmaW5pdGlvbk5hbWUsIHRlbXBsYXRlS2V5LCB0ZW1wbGF0ZVR5cGVdKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVTZXJ2aWNlLnVwZGF0ZVRlbXBsYXRlKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHRlbXBsYXRlS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZURlZmluaXRpb25OYW1lOiBjYXNlRGVmaW5pdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0ZW1wbGF0ZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB1cGRhdGVkTW9kZWxWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVNb3JlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVTYXZlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVFZGl0b3IoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dTdWNjZXNzTWVzc2FnZShyZXN1bHQua2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldE1vZGVsKHJlc3VsdC5jb250ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxNb2RlbFZhbHVlJC5uZXh0KHJlc3VsdC5jb250ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlJC5uZXh0KHJlc3VsdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZU1vcmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVNhdmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUVkaXRvcigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRGVsZXRlKHRlbXBsYXRlczogQXJyYXk8YW55Pik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVFZGl0b3IoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlU2F2ZSgpO1xuICAgICAgICB0aGlzLmRpc2FibGVNb3JlKCk7XG5cbiAgICAgICAgdGhpcy5fY2FzZURlZmluaXRpb25OYW1lJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShjYXNlRGVmaW5pdGlvbk5hbWUgPT5cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVTZXJ2aWNlLmRlbGV0ZVRlbXBsYXRlcyh7XG4gICAgICAgICAgICAgICAgY2FzZURlZmluaXRpb25OYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IHRlbXBsYXRlc1swXT8udHlwZSB8fCAncGRmJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZXNcbiAgICAgICAgICAgIH0pLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKF8gPT5cbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYC9kb3NzaWVyLW1hbmFnZW1lbnQvZG9zc2llci8ke2Nhc2VEZWZpbml0aW9uTmFtZX1gXSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd0RlbGV0ZU1vZGFsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dEZWxldGVNb2RhbCQubmV4dCh0cnVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5fY2FzZURlZmluaXRpb25OYW1lJCwgdGhpcy50ZW1wbGF0ZUtleSQsIHRoaXMudGVtcGxhdGVUeXBlJF0pLnBpcGUoXG4gICAgICAgICAgICB0YXAoKFtfLCBrZXksIHR5cGVdKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVTZXJ2aWNlLnNldEN1c3RvbVBhZ2VUaXRsZShgRG9jdW1lbnQ6ICR7a2V5fS4ke3R5cGV9YCwgdHJ1ZSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoW2Nhc2VEZWZpbml0aW9uTmFtZSwga2V5LCB0eXBlXSkgPT4gdGhpcy50ZW1wbGF0ZVNlcnZpY2UuZ2V0VGVtcGxhdGUoY2FzZURlZmluaXRpb25OYW1lLCB0eXBlLCBrZXkpKSxcbiAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZU1vcmUoKTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlU2F2ZSgpO1xuICAgICAgICAgICAgdGhpcy5lbmFibGVFZGl0b3IoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZWwocmVzdWx0LmNvbnRlbnQpO1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsTW9kZWxWYWx1ZSQubmV4dChyZXN1bHQuY29udGVudCk7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlJC5uZXh0KHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFNhdmVCdXR0b25Mb2dpYygpOiB2b2lkIHtcbiAgICAgICAgY29tYmluZUxhdGVzdChbdGhpcy51cGRhdGVkTW9kZWxWYWx1ZSQsIHRoaXMuaW5pdGlhbE1vZGVsVmFsdWUkLCB0aGlzLmlzVmFsaWQkXSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKFt1cGRhdGVkVmFsdWUsIGluaXRpYWxWYWx1ZSwgaXNWYWxpZF0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVEaXNhYmxlZCQubmV4dCghaXNWYWxpZCB8fCB1cGRhdGVkVmFsdWUgPT09IGluaXRpYWxWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRNb2RlbChjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb2RlbCQubmV4dCh7XG4gICAgICAgICAgICB2YWx1ZTogY29udGVudCxcbiAgICAgICAgICAgIGxhbmd1YWdlOiAnZnJlZW1hcmtlcjInLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVkTW9kZWxWYWx1ZSQubmV4dChjb250ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc2FibGVNb3JlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vcmVEaXNhYmxlZCQubmV4dCh0cnVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZU1vcmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9yZURpc2FibGVkJC5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc2FibGVTYXZlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNhdmVEaXNhYmxlZCQubmV4dCh0cnVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZVNhdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2F2ZURpc2FibGVkJC5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc2FibGVFZGl0b3IoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yRGlzYWJsZWQkLm5leHQodHJ1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVFZGl0b3IoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yRGlzYWJsZWQkLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblNlbGVjdGVkVGFiUHJldmlldygpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctaWZyYW1lJykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAocHJldmlldykge1xuICAgICAgICAgICAgICAgIHByZXZpZXcuc3JjID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW1wiXCJdLCB7dHlwZTogXCJ0ZXh0L3BsYWluXCJ9KSk7XG4gICAgICAgICAgICAgICAgY29tYmluZUxhdGVzdChbdGhpcy51cGRhdGVkTW9kZWxWYWx1ZSQsIHRoaXMudGVtcGxhdGUkXSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKChbdXBkYXRlZE1vZGVsVmFsdWUsIHRlbXBsYXRlXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMudGVtcGxhdGVTZXJ2aWNlLnByZXZpZXdUZW1wbGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBgJHt0ZW1wbGF0ZS5rZXl9LiR7dGVtcGxhdGUudHlwZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB1cGRhdGVkTW9kZWxWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApLCBvZihgJHt0ZW1wbGF0ZS5rZXl9LiR7dGVtcGxhdGUudHlwZX1gKV0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IChbYmxvYiwgZmlsZW5hbWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3LnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUHJldmlldyBmYWlsZWQ6XCIsIGVycik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQmxvYiA9IG5ldyBCbG9iKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtgPGh0bWw+PGJvZHk+PGgyPkVycm9yIGxvYWRpbmcgcHJldmlldzwvaDI+PHA+U2VlIGxvZ3MgZm9yIG1vcmUgaW5mb3JtYXRpb248L3A+PC9ib2R5PjwvaHRtbD5gXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogJ3RleHQvaHRtbCd9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlldy5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGVycm9yQmxvYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRCcmVhZGNydW1iKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYXNlRGVmaW5pdGlvbk5hbWUkLnN1YnNjcmliZShjYXNlRGVmaW5pdGlvbk5hbWUgPT4ge1xuICAgICAgICAgICAgdGhpcy5icmVhZGNydW1iU2VydmljZS5zZXRUaGlyZEJyZWFkY3J1bWIoe1xuICAgICAgICAgICAgICAgIHJvdXRlOiBbYC9kb3NzaWVyLW1hbmFnZW1lbnQvZG9zc2llci8ke2Nhc2VEZWZpbml0aW9uTmFtZX1gXSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBjYXNlRGVmaW5pdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgaHJlZjogYC9kb3NzaWVyLW1hbmFnZW1lbnQvZG9zc2llci8ke2Nhc2VEZWZpbml0aW9uTmFtZX1gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2hvd1N1Y2Nlc3NNZXNzYWdlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93VG9hc3Qoe1xuICAgICAgICAgICAgY2FwdGlvbjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYCR7a2V5fSB3YXMgc2F2ZWQgc3VjY2Vzc2Z1bGx5YCwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgZHVyYXRpb246IDQwMDAsXG4gICAgICAgICAgICBzaG93Q2xvc2U6IHRydWUsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1NhdmVkIHN1Y2Nlc3NmdWxseScpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJ7XG4gICAgbW9kZWw6IG1vZGVsJCB8IGFzeW5jLFxuICAgIHVwZGF0ZWRNb2RlbFZhbHVlOiB1cGRhdGVkTW9kZWxWYWx1ZSQgfCBhc3luYyxcbiAgICB0ZW1wbGF0ZTogdGVtcGxhdGUkIHwgYXN5bmMsXG4gIH0gYXMgb2JzXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGVtcGxhdGUtZXhwbGFuYXRpb25cIj5cbiAgICAgICAgQGlmIChvYnM/LnRlbXBsYXRlPy50eXBlID09PSAncGRmJykge1xuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz5QREYgVGVtcGxhdGVzPC9zdHJvbmc+IHVzZSBIVE1MIGluIGNvbWJpbmF0aW9uIHdpdGhcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9mcmVlbWFya2VyLmFwYWNoZS5vcmcvZG9jcy9kZ3VpX3F1aWNrc3RhcnRfYmFzaWNzLmh0bWxcIiB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgRnJlZU1hcmtlclxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICB0byBkZWZpbmUgcGxhY2Vob2xkZXJzIHdpdGhpbiB0aGUgSFRNTCBzdHJ1Y3R1cmUuIFRoZSBGcmVlTWFya2VyIGRhdGEgbW9kZWwgaXMgYmFzZWQgb24gbmVzdGVkXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy52YWx0aW1vLm5sL2ZlYXR1cmVzL3ZhbHVlLXJlc29sdmVyc1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgVmFsdGltbyB2YWx1ZSByZXNvbHZlcnNcbiAgICAgICAgICAgICAgICA8L2E+LFxuICAgICAgICAgICAgICAgIGJ1dCB1c2VzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHN5bnRheC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCA8Y29kZT4kJiMxMjM7ZG9jLmZpcnN0TmFtZSYjMTI1OzwvY29kZT4gcmV0cmlldmVzIHRoZVxuICAgICAgICAgICAgICAgIDxjb2RlPmZpcnN0TmFtZTwvY29kZT4gdmFsdWUgZnJvbSB0aGUgY2FzZS5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIFRoZSBub3RhdGlvbiA8Y29kZT4mbHQ7I2xpc3QgZG9jcyBhcyBkb2MmZ3Q7Li4uJmx0Oy8jbGlzdCZndDs8L2NvZGU+IHN0cmVhbXMgYWxsIGRvY3VtZW50cyBpbiB0aGVcbiAgICAgICAgICAgICAgICBjdXJyZW50IGNhc2UuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz5DU1YgVGVtcGxhdGVzPC9zdHJvbmc+IHVzZSBhIHNlbWljb2xvbiAoPGNvZGU+OzwvY29kZT4pIGFzIGEgc2VwYXJhdG9yLlxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2ZyZWVtYXJrZXIuYXBhY2hlLm9yZy9kb2NzL2RndWlfcXVpY2tzdGFydF9iYXNpY3MuaHRtbFwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPlxuICAgICAgICAgICAgICAgICAgICBGcmVlTWFya2VyXG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIGlzIHVzZWQgdG8gZGVmaW5lIHBsYWNlaG9sZGVycyB3aXRoaW4gdGhlIENTViBjb250ZW50LiBUaGUgRnJlZU1hcmtlciBkYXRhIG1vZGVsIGlzIGJhc2VkIG9uIG5lc3RlZFxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2RvY3MudmFsdGltby5ubC9mZWF0dXJlcy92YWx1ZS1yZXNvbHZlcnNcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIFZhbHRpbW8gdmFsdWUgcmVzb2x2ZXJzXG4gICAgICAgICAgICAgICAgPC9hPixcbiAgICAgICAgICAgICAgICBidXQgdXNlcyBhIHNsaWdodGx5IGRpZmZlcmVudCBzeW50YXguXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgPGNvZGU+JCYjMTIzO2RvYy5maXJzdE5hbWUmIzEyNTs8L2NvZGU+IHJldHJpZXZlcyB0aGVcbiAgICAgICAgICAgICAgICA8Y29kZT5maXJzdE5hbWU8L2NvZGU+IHZhbHVlIGZyb20gdGhlIGNhc2UuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICBUaGUgbm90YXRpb24gPGNvZGU+Jmx0OyNsaXN0IGRvY3MgYXMgZG9jJmd0Oy4uLiZsdDsvI2xpc3QmZ3Q7PC9jb2RlPiBzdHJlYW1zIGFsbCBkb2N1bWVudHMgaW4gdGhlXG4gICAgICAgICAgICAgICAgY3VycmVudCBjYXNlLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICA8Y2RzLXRhYnMgdHlwZT1cImNvbnRhaW5lZFwiPlxuICAgICAgICA8Y2RzLXRhYiBbYWN0aXZlXT1cInRydWVcIiBbaGVhZGluZ109XCInRWRpdG9yJ1wiPlxuICAgICAgICAgICAgPHZhbHRpbW8tZWRpdG9yXG4gICAgICAgICAgICAgICAgICAgIFttb2RlbF09XCJvYnMubW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiKGVkaXRvckRpc2FibGVkJCB8IGFzeW5jKSB8fCAocmVhZE9ubHkkIHwgYXN5bmMpXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbGlkRXZlbnQpPVwib25WYWxpZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlRXZlbnQpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZpdFBhZ2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtmaXRQYWdlRXh0cmFTcGFjZV09XCI4MFwiXG4gICAgICAgICAgICA+PC92YWx0aW1vLWVkaXRvcj5cbiAgICAgICAgPC9jZHMtdGFiPlxuICAgICAgICA8Y2RzLXRhYiBbaGVhZGluZ109XCInUHJldmlldydcIiAoc2VsZWN0ZWQpPVwib25TZWxlY3RlZFRhYlByZXZpZXcoKVwiPlxuICAgICAgICAgICAgPGlmcmFtZSB0aXRsZT1cIlByZXZpZXdcIiBpZD1cInByZXZpZXctaWZyYW1lXCI+XG4gICAgICAgICAgICA8L2lmcmFtZT5cbiAgICAgICAgPC9jZHMtdGFiPlxuICAgIDwvY2RzLXRhYnM+XG5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyIHJlbmRlckluUGFnZUhlYWRlcj5cbiAgICA8bmctdGVtcGxhdGU+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJ7XG4gICAgICAgICAgICAgICAgbW9kZWw6IG1vZGVsJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgIG1vcmVEaXNhYmxlZDogbW9yZURpc2FibGVkJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZSQgfCBhc3luYyxcbiAgICAgICAgICAgICB9IGFzIG9ic1wiXG4gICAgICAgICAgICAgY2xhc3M9XCJidXR0b25zLWNvbnRhaW5lclwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxjZHMtb3ZlcmZsb3ctbWVudSBjbGFzcz1cIm92ZXJmbG93LWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgIDxjZHMtb3ZlcmZsb3ctbWVudS1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvYnMubW9yZURpc2FibGVkIHx8IChyZWFkT25seSQgfCBhc3luYylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2hvd0RlbGV0ZU1vZGFsKClcIlxuICAgICAgICAgICAgICAgID57eyAnaW50ZXJmYWNlLmRlbGV0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2Nkcy1vdmVyZmxvdy1tZW51LW9wdGlvblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvY2RzLW92ZXJmbG93LW1lbnU+XG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIihzYXZlRGlzYWJsZWQkIHwgYXN5bmMpIHx8IChyZWFkT25seSQgfCBhc3luYylcIlxuICAgICAgICAgICAgICAgICAgICBjZHNCdXR0b249XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVRlbXBsYXRlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7ICdpbnRlcmZhY2Uuc2F2ZScgfCB0cmFuc2xhdGUgfX1cblxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiIGNkc0ljb249XCJzYXZlXCIgc2l6ZT1cIjE2XCI+PC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwie3RlbXBsYXRlS2V5OiB0ZW1wbGF0ZUtleSQgfCBhc3luYywgdGVtcGxhdGVUeXBlOiB0ZW1wbGF0ZVR5cGUkIHwgYXN5bmN9IGFzIG9ic1wiPlxuICAgIDx2YWx0aW1vLWRvY3VtZW50LXRlbXBsYXRlLWRlbGV0ZS1tb2RhbFxuICAgICAgICAgICAgW2RlbGV0ZVJvd0tleXNdPVwiW3trZXk6IG9icy50ZW1wbGF0ZUtleSwgdHlwZTogb2JzLnRlbXBsYXRlVHlwZX1dXCJcbiAgICAgICAgICAgIFtzaG93RGVsZXRlTW9kYWwkXT1cInNob3dEZWxldGVNb2RhbCRcIlxuICAgICAgICAgICAgKGRlbGV0ZUV2ZW50KT1cIm9uRGVsZXRlKCRldmVudClcIlxuICAgID5cbiAgICA8L3ZhbHRpbW8tZG9jdW1lbnQtdGVtcGxhdGUtZGVsZXRlLW1vZGFsPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
@@ -0,0 +1,126 @@
1
+ /*
2
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
3
+ *
4
+ * Licensed under EUPL, Version 1.2 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { ChangeDetectionStrategy, Component, ViewChild, } from '@angular/core';
17
+ import { BehaviorSubject, filter, map, switchMap, take } from 'rxjs';
18
+ import { CarbonListComponent, CarbonListModule, ViewType } from '@valtimo/components';
19
+ import { CommonModule } from '@angular/common';
20
+ import { ButtonModule } from 'carbon-components-angular';
21
+ import { TranslateModule } from '@ngx-translate/core';
22
+ import { DocumentTemplateDeleteModalComponent } from '../document-template-delete-modal/document-template-delete-modal.component';
23
+ import { DocumentTemplateAddEditModalComponent } from '../document-template-add-edit-modal/document-template-add-edit-modal.component';
24
+ import * as i0 from "@angular/core";
25
+ import * as i1 from "../../../../services";
26
+ import * as i2 from "@angular/router";
27
+ import * as i3 from "@angular/common";
28
+ import * as i4 from "@valtimo/components";
29
+ import * as i5 from "carbon-components-angular";
30
+ import * as i6 from "@ngx-translate/core";
31
+ export class DocumentTemplateListComponent {
32
+ constructor(templateService, router, route) {
33
+ this.templateService = templateService;
34
+ this.router = router;
35
+ this.route = route;
36
+ this.fields = [
37
+ {
38
+ viewType: ViewType.TEXT,
39
+ key: 'key',
40
+ label: 'Key',
41
+ },
42
+ {
43
+ viewType: ViewType.TEXT,
44
+ key: 'type',
45
+ label: 'Document type',
46
+ },
47
+ {
48
+ viewType: ViewType.BOOLEAN,
49
+ key: 'readOnly',
50
+ label: 'Read only',
51
+ },
52
+ ];
53
+ this._caseDefinitionName$ = this.route.params.pipe(map(params => params?.name), filter(caseDefinitionName => !!caseDefinitionName));
54
+ this.templates$ = new BehaviorSubject(null);
55
+ this.showAddModal$ = new BehaviorSubject(false);
56
+ this.showDeleteModal$ = new BehaviorSubject(false);
57
+ this.selectedRowKeys$ = new BehaviorSubject([]);
58
+ this.loading$ = new BehaviorSubject(true);
59
+ }
60
+ ngOnInit() {
61
+ this.reloadTemplateList();
62
+ }
63
+ openAddModal() {
64
+ this.showAddModal$.next(true);
65
+ }
66
+ onAdd(data) {
67
+ if (!data) {
68
+ this.showAddModal$.next(false);
69
+ return;
70
+ }
71
+ this._caseDefinitionName$.pipe(take(1), switchMap(caseDefinitionName => this.templateService.addTemplate({ caseDefinitionName, ...data }))).subscribe(template => {
72
+ this.showAddModal$.next(false);
73
+ this.gotoDocumentTemplateEditor(template.caseDefinitionName, template.key, template.type);
74
+ });
75
+ }
76
+ showDeleteModal() {
77
+ this.setSelectedTemplateKeys();
78
+ this.showDeleteModal$.next(true);
79
+ }
80
+ onDelete(templates) {
81
+ this.loading$.next(true);
82
+ this._caseDefinitionName$.pipe(take(1), switchMap(caseDefinitionName => this.templateService.deleteTemplates({
83
+ caseDefinitionName,
84
+ type: templates[0]?.type || 'pdf',
85
+ templates
86
+ }))).subscribe(_ => {
87
+ this.reloadTemplateList();
88
+ });
89
+ }
90
+ onRowClick(template) {
91
+ this._caseDefinitionName$.pipe(take(1)).subscribe(caseDefinitionName => this.gotoDocumentTemplateEditor(caseDefinitionName, template.key, template.type));
92
+ }
93
+ gotoDocumentTemplateEditor(caseDefinitionName, key, type) {
94
+ this.router.navigate([`/dossier-management/dossier/${caseDefinitionName}/document-template/${key}/${type}`]);
95
+ }
96
+ reloadTemplateList() {
97
+ this.loading$.next(true);
98
+ this._caseDefinitionName$.pipe(switchMap(caseDefinitionName => this.templateService.getAllDocumentTemplates(caseDefinitionName)), map(templatePage => templatePage.content), take(1)).subscribe(templateListItems => {
99
+ this.templates$.next(templateListItems);
100
+ this.loading$.next(false);
101
+ });
102
+ }
103
+ setSelectedTemplateKeys() {
104
+ this.selectedRowKeys$.next(this.carbonList.selectedItems.map((template) => ({
105
+ key: template.key,
106
+ type: template.type
107
+ })));
108
+ }
109
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DocumentTemplateListComponent, deps: [{ token: i1.FreemarkerTemplateManagementService }, { token: i2.Router }, { token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
110
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DocumentTemplateListComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "carbonList", first: true, predicate: CarbonListComponent, descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-carbon-list\n [header]=\"false\"\n [items]=\"templates$ | async\"\n [fields]=\"fields\"\n [loading]=\"loading$ | async\"\n [showSelectionColumn]=\"true\"\n (rowClicked)=\"onRowClick($event)\"\n>\n <ng-container header> {{ 'Title' }}</ng-container>\n\n <div carbonToolbarContent>\n <ng-container [ngTemplateOutlet]=\"addTemplateButton\"></ng-container>\n </div>\n\n <ng-container carbonToolbarActions>\n <button cdsButton=\"primary\" (click)=\"showDeleteModal()\">\n {{ 'interface.delete' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </ng-container>\n\n <valtimo-no-results\n [action]=\"addTemplateButton\"\n description=\"{{ 'Come back later.' }}\"\n title=\"{{ 'No templates found' }}\"\n ></valtimo-no-results>\n</valtimo-carbon-list>\n\n<valtimo-document-template-add-edit-modal\n [open]=\"showAddModal$ | async\"\n (closeEvent)=\"onAdd($event)\"\n></valtimo-document-template-add-edit-modal>\n\n<ng-container *ngIf=\"{selectedRowKeys: selectedRowKeys$ | async} as obs\">\n <valtimo-document-template-delete-modal\n [deleteRowKeys]=\"obs.selectedRowKeys\"\n [showDeleteModal$]=\"showDeleteModal$\"\n (deleteEvent)=\"onDelete($event)\"\n >\n </valtimo-document-template-delete-modal>\n</ng-container>\n\n<ng-template #addTemplateButton>\n <button cdsButton=\"primary\"\n (click)=\"openAddModal()\">\n {{ 'Add' }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: CarbonListModule }, { kind: "component", type: i4.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "actionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "component", type: i4.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i5.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "component", type: DocumentTemplateDeleteModalComponent, selector: "valtimo-document-template-delete-modal", inputs: ["deleteRowKeys", "showDeleteModal$"], outputs: ["deleteEvent"] }, { kind: "component", type: DocumentTemplateAddEditModalComponent, selector: "valtimo-document-template-add-edit-modal", inputs: ["open", "modalType", "defaultKeyValue", "defaultTypeValue"], outputs: ["closeEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
111
+ }
112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DocumentTemplateListComponent, decorators: [{
113
+ type: Component,
114
+ args: [{ standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
115
+ CommonModule,
116
+ CarbonListModule,
117
+ ButtonModule,
118
+ TranslateModule,
119
+ DocumentTemplateDeleteModalComponent,
120
+ DocumentTemplateAddEditModalComponent
121
+ ], template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-carbon-list\n [header]=\"false\"\n [items]=\"templates$ | async\"\n [fields]=\"fields\"\n [loading]=\"loading$ | async\"\n [showSelectionColumn]=\"true\"\n (rowClicked)=\"onRowClick($event)\"\n>\n <ng-container header> {{ 'Title' }}</ng-container>\n\n <div carbonToolbarContent>\n <ng-container [ngTemplateOutlet]=\"addTemplateButton\"></ng-container>\n </div>\n\n <ng-container carbonToolbarActions>\n <button cdsButton=\"primary\" (click)=\"showDeleteModal()\">\n {{ 'interface.delete' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </ng-container>\n\n <valtimo-no-results\n [action]=\"addTemplateButton\"\n description=\"{{ 'Come back later.' }}\"\n title=\"{{ 'No templates found' }}\"\n ></valtimo-no-results>\n</valtimo-carbon-list>\n\n<valtimo-document-template-add-edit-modal\n [open]=\"showAddModal$ | async\"\n (closeEvent)=\"onAdd($event)\"\n></valtimo-document-template-add-edit-modal>\n\n<ng-container *ngIf=\"{selectedRowKeys: selectedRowKeys$ | async} as obs\">\n <valtimo-document-template-delete-modal\n [deleteRowKeys]=\"obs.selectedRowKeys\"\n [showDeleteModal$]=\"showDeleteModal$\"\n (deleteEvent)=\"onDelete($event)\"\n >\n </valtimo-document-template-delete-modal>\n</ng-container>\n\n<ng-template #addTemplateButton>\n <button cdsButton=\"primary\"\n (click)=\"openAddModal()\">\n {{ 'Add' }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n" }]
122
+ }], ctorParameters: () => [{ type: i1.FreemarkerTemplateManagementService }, { type: i2.Router }, { type: i2.ActivatedRoute }], propDecorators: { carbonList: [{
123
+ type: ViewChild,
124
+ args: [CarbonListComponent]
125
+ }] } });
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtdGVtcGxhdGUtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vLXBsdWdpbnMvZnJlZW1hcmtlci9zcmMvbGliL3BsdWdpbnMvZG9jdW1lbnQtZ2VuZXJhdG9yL2NvbXBvbmVudHMvZG9jdW1lbnQtdGVtcGxhdGUtbGlzdC9kb2N1bWVudC10ZW1wbGF0ZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8tcGx1Z2lucy9mcmVlbWFya2VyL3NyYy9saWIvcGx1Z2lucy9kb2N1bWVudC1nZW5lcmF0b3IvY29tcG9uZW50cy9kb2N1bWVudC10ZW1wbGF0ZS1saXN0L2RvY3VtZW50LXRlbXBsYXRlLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLFNBQVMsR0FBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRixPQUFPLEVBQUMsZUFBZSxFQUFpQixNQUFNLEVBQUUsR0FBRyxFQUF5QixTQUFTLEVBQUUsSUFBSSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXpHLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBZ0IsUUFBUSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFHbEcsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUNILG9DQUFvQyxFQUN2QyxNQUFNLDRFQUE0RSxDQUFDO0FBQ3BGLE9BQU8sRUFDSCxxQ0FBcUMsRUFDeEMsTUFBTSxnRkFBZ0YsQ0FBQzs7Ozs7Ozs7QUFleEYsTUFBTSxPQUFPLDZCQUE2QjtJQWtDdEMsWUFDcUIsZUFBb0QsRUFDcEQsTUFBYyxFQUNkLEtBQXFCO1FBRnJCLG9CQUFlLEdBQWYsZUFBZSxDQUFxQztRQUNwRCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFsQ25DLFdBQU0sR0FBbUI7WUFDNUI7Z0JBQ0ksUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUN2QixHQUFHLEVBQUUsS0FBSztnQkFDVixLQUFLLEVBQUUsS0FBSzthQUNmO1lBQ0Q7Z0JBQ0ksUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUN2QixHQUFHLEVBQUUsTUFBTTtnQkFDWCxLQUFLLEVBQUUsZUFBZTthQUN6QjtZQUNEO2dCQUNJLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTztnQkFDMUIsR0FBRyxFQUFFLFVBQVU7Z0JBQ2YsS0FBSyxFQUFFLFdBQVc7YUFDckI7U0FDSixDQUFDO1FBR2UseUJBQW9CLEdBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDbEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUMzQixNQUFNLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUNyRCxDQUFDO1FBRVUsZUFBVSxHQUFHLElBQUksZUFBZSxDQUE0QixJQUFJLENBQUMsQ0FBQztRQUNsRSxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3BELHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztJQU85RCxDQUFDO0lBRU0sUUFBUTtRQUNYLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTSxZQUFZO1FBQ2YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFVO1FBQ25CLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FDMUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFBQyxrQkFBa0IsRUFBRSxHQUFHLElBQUksRUFBQyxDQUFDLENBQUMsQ0FDbkcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxlQUFlO1FBQ2xCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLFFBQVEsQ0FBQyxTQUFxQjtRQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUMxQixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQztZQUNqRSxrQkFBa0I7WUFDbEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksS0FBSztZQUNqQyxTQUFTO1NBQ1osQ0FBQyxDQUFDLENBQ04sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDWixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxVQUFVLENBQUMsUUFBMEI7UUFDeEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUNuRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQ25GLENBQUM7SUFDTixDQUFDO0lBRU8sMEJBQTBCLENBQUMsa0JBQTBCLEVBQUUsR0FBVyxFQUFFLElBQVk7UUFDcEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQywrQkFBK0Isa0JBQWtCLHNCQUFzQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pILENBQUM7SUFFTyxrQkFBa0I7UUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FDMUIsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFDakcsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUN6QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1YsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsRUFBRTtZQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLHVCQUF1QjtRQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUYsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO1lBQ2pCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtTQUN0QixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1QsQ0FBQzsrR0E5R1EsNkJBQTZCO21HQUE3Qiw2QkFBNkIsb0hBQzNCLG1CQUFtQixnREM5Q2xDLDZ6RUFtRUEsMkNEOUJRLFlBQVksOFZBQ1osZ0JBQWdCLHcxQkFDaEIsWUFBWSxnTUFDWixlQUFlLDRGQUNmLG9DQUFvQyw0SkFDcEMscUNBQXFDOzs0RkFHaEMsNkJBQTZCO2tCQWJ6QyxTQUFTO2lDQUNNLElBQUksbUJBRUMsdUJBQXVCLENBQUMsTUFBTSxXQUN0Qzt3QkFDTCxZQUFZO3dCQUNaLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixlQUFlO3dCQUNmLG9DQUFvQzt3QkFDcEMscUNBQXFDO3FCQUN4QzswSkFHK0IsVUFBVTtzQkFBekMsU0FBUzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7Q2FyYm9uTGlzdENvbXBvbmVudCwgQ2FyYm9uTGlzdE1vZHVsZSwgQ29sdW1uQ29uZmlnLCBWaWV3VHlwZX0gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge0ZyZWVtYXJrZXJUZW1wbGF0ZU1hbmFnZW1lbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1RlbXBsYXRlTGlzdEl0ZW19IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7QnV0dG9uTW9kdWxlfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7XG4gICAgRG9jdW1lbnRUZW1wbGF0ZURlbGV0ZU1vZGFsQ29tcG9uZW50XG59IGZyb20gJy4uL2RvY3VtZW50LXRlbXBsYXRlLWRlbGV0ZS1tb2RhbC9kb2N1bWVudC10ZW1wbGF0ZS1kZWxldGUtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7XG4gICAgRG9jdW1lbnRUZW1wbGF0ZUFkZEVkaXRNb2RhbENvbXBvbmVudFxufSBmcm9tICcuLi9kb2N1bWVudC10ZW1wbGF0ZS1hZGQtZWRpdC1tb2RhbC9kb2N1bWVudC10ZW1wbGF0ZS1hZGQtZWRpdC1tb2RhbC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kb2N1bWVudC10ZW1wbGF0ZS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgQ2FyYm9uTGlzdE1vZHVsZSxcbiAgICAgICAgQnV0dG9uTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIERvY3VtZW50VGVtcGxhdGVEZWxldGVNb2RhbENvbXBvbmVudCxcbiAgICAgICAgRG9jdW1lbnRUZW1wbGF0ZUFkZEVkaXRNb2RhbENvbXBvbmVudFxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgRG9jdW1lbnRUZW1wbGF0ZUxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBWaWV3Q2hpbGQoQ2FyYm9uTGlzdENvbXBvbmVudCkgY2FyYm9uTGlzdDogQ2FyYm9uTGlzdENvbXBvbmVudDtcblxuICAgIHB1YmxpYyBmaWVsZHM6IENvbHVtbkNvbmZpZ1tdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICB2aWV3VHlwZTogVmlld1R5cGUuVEVYVCxcbiAgICAgICAgICAgIGtleTogJ2tleScsXG4gICAgICAgICAgICBsYWJlbDogJ0tleScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZpZXdUeXBlOiBWaWV3VHlwZS5URVhULFxuICAgICAgICAgICAga2V5OiAndHlwZScsXG4gICAgICAgICAgICBsYWJlbDogJ0RvY3VtZW50IHR5cGUnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICB2aWV3VHlwZTogVmlld1R5cGUuQk9PTEVBTixcbiAgICAgICAgICAgIGtleTogJ3JlYWRPbmx5JyxcbiAgICAgICAgICAgIGxhYmVsOiAnUmVhZCBvbmx5JyxcbiAgICAgICAgfSxcbiAgICBdO1xuXG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYXNlRGVmaW5pdGlvbk5hbWUkOiBPYnNlcnZhYmxlPHN0cmluZz4gPVxuICAgICAgICB0aGlzLnJvdXRlLnBhcmFtcy5waXBlKFxuICAgICAgICAgICAgbWFwKHBhcmFtcyA9PiBwYXJhbXM/Lm5hbWUpLFxuICAgICAgICAgICAgZmlsdGVyKGNhc2VEZWZpbml0aW9uTmFtZSA9PiAhIWNhc2VEZWZpbml0aW9uTmFtZSlcbiAgICAgICAgKTtcblxuICAgIHB1YmxpYyByZWFkb25seSB0ZW1wbGF0ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUZW1wbGF0ZUxpc3RJdGVtW10gfCBudWxsPihudWxsKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2hvd0FkZE1vZGFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHB1YmxpYyByZWFkb25seSBzaG93RGVsZXRlTW9kYWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHVibGljIHJlYWRvbmx5IHNlbGVjdGVkUm93S2V5cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFycmF5PGFueT4+KFtdKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVTZXJ2aWNlOiBGcmVlbWFya2VyVGVtcGxhdGVNYW5hZ2VtZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogQWN0aXZhdGVkUm91dGVcbiAgICApIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVsb2FkVGVtcGxhdGVMaXN0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9wZW5BZGRNb2RhbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zaG93QWRkTW9kYWwkLm5leHQodHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQWRkKGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dBZGRNb2RhbCQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jYXNlRGVmaW5pdGlvbk5hbWUkLnBpcGUoXG4gICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKGNhc2VEZWZpbml0aW9uTmFtZSA9PiB0aGlzLnRlbXBsYXRlU2VydmljZS5hZGRUZW1wbGF0ZSh7Y2FzZURlZmluaXRpb25OYW1lLCAuLi5kYXRhfSkpXG4gICAgICAgICkuc3Vic2NyaWJlKHRlbXBsYXRlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0FkZE1vZGFsJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZ290b0RvY3VtZW50VGVtcGxhdGVFZGl0b3IodGVtcGxhdGUuY2FzZURlZmluaXRpb25OYW1lLCB0ZW1wbGF0ZS5rZXksIHRlbXBsYXRlLnR5cGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd0RlbGV0ZU1vZGFsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFNlbGVjdGVkVGVtcGxhdGVLZXlzKCk7XG4gICAgICAgIHRoaXMuc2hvd0RlbGV0ZU1vZGFsJC5uZXh0KHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkRlbGV0ZSh0ZW1wbGF0ZXM6IEFycmF5PGFueT4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLl9jYXNlRGVmaW5pdGlvbk5hbWUkLnBpcGUoXG4gICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKGNhc2VEZWZpbml0aW9uTmFtZSA9PiB0aGlzLnRlbXBsYXRlU2VydmljZS5kZWxldGVUZW1wbGF0ZXMoe1xuICAgICAgICAgICAgICAgIGNhc2VEZWZpbml0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB0ZW1wbGF0ZXNbMF0/LnR5cGUgfHwgJ3BkZicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVzXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICkuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRUZW1wbGF0ZUxpc3QoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUm93Q2xpY2sodGVtcGxhdGU6IFRlbXBsYXRlTGlzdEl0ZW0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2FzZURlZmluaXRpb25OYW1lJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShjYXNlRGVmaW5pdGlvbk5hbWUgPT5cbiAgICAgICAgICAgIHRoaXMuZ290b0RvY3VtZW50VGVtcGxhdGVFZGl0b3IoY2FzZURlZmluaXRpb25OYW1lLCB0ZW1wbGF0ZS5rZXksIHRlbXBsYXRlLnR5cGUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnb3RvRG9jdW1lbnRUZW1wbGF0ZUVkaXRvcihjYXNlRGVmaW5pdGlvbk5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYC9kb3NzaWVyLW1hbmFnZW1lbnQvZG9zc2llci8ke2Nhc2VEZWZpbml0aW9uTmFtZX0vZG9jdW1lbnQtdGVtcGxhdGUvJHtrZXl9LyR7dHlwZX1gXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWxvYWRUZW1wbGF0ZUxpc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5fY2FzZURlZmluaXRpb25OYW1lJC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKGNhc2VEZWZpbml0aW9uTmFtZSA9PiB0aGlzLnRlbXBsYXRlU2VydmljZS5nZXRBbGxEb2N1bWVudFRlbXBsYXRlcyhjYXNlRGVmaW5pdGlvbk5hbWUpKSxcbiAgICAgICAgICAgIG1hcCh0ZW1wbGF0ZVBhZ2UgPT4gdGVtcGxhdGVQYWdlLmNvbnRlbnQpLFxuICAgICAgICAgICAgdGFrZSgxKVxuICAgICAgICApLnN1YnNjcmliZSh0ZW1wbGF0ZUxpc3RJdGVtcyA9PiB7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlcyQubmV4dCh0ZW1wbGF0ZUxpc3RJdGVtcyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFNlbGVjdGVkVGVtcGxhdGVLZXlzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93S2V5cyQubmV4dCh0aGlzLmNhcmJvbkxpc3Quc2VsZWN0ZWRJdGVtcy5tYXAoKHRlbXBsYXRlOiBUZW1wbGF0ZUxpc3RJdGVtKSA9PiAoe1xuICAgICAgICAgICAga2V5OiB0ZW1wbGF0ZS5rZXksXG4gICAgICAgICAgICB0eXBlOiB0ZW1wbGF0ZS50eXBlXG4gICAgICAgIH0pKSk7XG4gICAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjMgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48dmFsdGltby1jYXJib24tbGlzdFxuICAgICAgICBbaGVhZGVyXT1cImZhbHNlXCJcbiAgICAgICAgW2l0ZW1zXT1cInRlbXBsYXRlcyQgfCBhc3luY1wiXG4gICAgICAgIFtmaWVsZHNdPVwiZmllbGRzXCJcbiAgICAgICAgW2xvYWRpbmddPVwibG9hZGluZyQgfCBhc3luY1wiXG4gICAgICAgIFtzaG93U2VsZWN0aW9uQ29sdW1uXT1cInRydWVcIlxuICAgICAgICAocm93Q2xpY2tlZCk9XCJvblJvd0NsaWNrKCRldmVudClcIlxuPlxuICAgIDxuZy1jb250YWluZXIgaGVhZGVyPiB7eyAnVGl0bGUnIH19PC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNhcmJvblRvb2xiYXJDb250ZW50PlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFkZFRlbXBsYXRlQnV0dG9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyIGNhcmJvblRvb2xiYXJBY3Rpb25zPlxuICAgICAgICA8YnV0dG9uIGNkc0J1dHRvbj1cInByaW1hcnlcIiAoY2xpY2spPVwic2hvd0RlbGV0ZU1vZGFsKClcIj5cbiAgICAgICAgICAgIHt7ICdpbnRlcmZhY2UuZGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVxuXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY2RzLS1idG5fX2ljb25cIiBjZHNJY29uPVwidHJhc2gtY2FuXCIgc2l6ZT1cIjE2XCI+PC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPHZhbHRpbW8tbm8tcmVzdWx0c1xuICAgICAgICAgICAgW2FjdGlvbl09XCJhZGRUZW1wbGF0ZUJ1dHRvblwiXG4gICAgICAgICAgICBkZXNjcmlwdGlvbj1cInt7ICdDb21lIGJhY2sgbGF0ZXIuJyB9fVwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdObyB0ZW1wbGF0ZXMgZm91bmQnIH19XCJcbiAgICA+PC92YWx0aW1vLW5vLXJlc3VsdHM+XG48L3ZhbHRpbW8tY2FyYm9uLWxpc3Q+XG5cbjx2YWx0aW1vLWRvY3VtZW50LXRlbXBsYXRlLWFkZC1lZGl0LW1vZGFsXG4gICAgICAgIFtvcGVuXT1cInNob3dBZGRNb2RhbCQgfCBhc3luY1wiXG4gICAgICAgIChjbG9zZUV2ZW50KT1cIm9uQWRkKCRldmVudClcIlxuPjwvdmFsdGltby1kb2N1bWVudC10ZW1wbGF0ZS1hZGQtZWRpdC1tb2RhbD5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIntzZWxlY3RlZFJvd0tleXM6IHNlbGVjdGVkUm93S2V5cyQgfCBhc3luY30gYXMgb2JzXCI+XG4gICAgPHZhbHRpbW8tZG9jdW1lbnQtdGVtcGxhdGUtZGVsZXRlLW1vZGFsXG4gICAgICAgICAgICBbZGVsZXRlUm93S2V5c109XCJvYnMuc2VsZWN0ZWRSb3dLZXlzXCJcbiAgICAgICAgICAgIFtzaG93RGVsZXRlTW9kYWwkXT1cInNob3dEZWxldGVNb2RhbCRcIlxuICAgICAgICAgICAgKGRlbGV0ZUV2ZW50KT1cIm9uRGVsZXRlKCRldmVudClcIlxuICAgID5cbiAgICA8L3ZhbHRpbW8tZG9jdW1lbnQtdGVtcGxhdGUtZGVsZXRlLW1vZGFsPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjYWRkVGVtcGxhdGVCdXR0b24+XG4gICAgPGJ1dHRvbiBjZHNCdXR0b249XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcGVuQWRkTW9kYWwoKVwiPlxuICAgICAgICB7eyAnQWRkJyB9fVxuXG4gICAgICAgIDxzdmcgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiIGNkc0ljb249XCJhZGRcIiBzaXplPVwiMTZcIj48L3N2Zz5cbiAgICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=