@valtimo/dossier 11.0.0 → 11.1.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 (166) hide show
  1. package/esm2022/lib/components/dossier-assign-user/dossier-assign-user.component.mjs +98 -0
  2. package/esm2022/lib/{dossier-bulk-assign-modal → components/dossier-bulk-assign-modal}/dossier-bulk-assign-modal.component.mjs +2 -2
  3. package/esm2022/lib/components/dossier-detail/dossier-detail.component.mjs +191 -0
  4. package/esm2022/lib/components/dossier-detail/tab/audit/audit.component.mjs +76 -0
  5. package/esm2022/lib/{dossier-detail → components/dossier-detail}/tab/contact-moments/contact-moments.component.mjs +1 -1
  6. package/esm2022/lib/components/dossier-detail/tab/documenten-api-documents/documenten-api-documents.component.mjs +146 -0
  7. package/esm2022/lib/{dossier-detail → components/dossier-detail}/tab/documents/documents.component.mjs +1 -1
  8. package/esm2022/lib/components/dossier-detail/tab/formio/formio.component.mjs +61 -0
  9. package/esm2022/lib/components/dossier-detail/tab/notes/notes.component.mjs +166 -0
  10. package/esm2022/lib/components/dossier-detail/tab/object-type/object-type.component.mjs +121 -0
  11. package/esm2022/lib/{dossier-detail → components/dossier-detail}/tab/progress/progress.component.mjs +1 -1
  12. package/esm2022/lib/components/dossier-detail/tab/s3-documents/s3-documents.component.mjs +136 -0
  13. package/esm2022/lib/components/dossier-detail/tab/summary/summary.component.mjs +134 -0
  14. package/esm2022/lib/components/dossier-detail/tab/zaakobjecten/zaakobjecten.component.mjs +112 -0
  15. package/esm2022/lib/components/dossier-list/dossier-list.component.mjs +370 -0
  16. package/esm2022/lib/components/dossier-list-actions/dossier-list-actions.component.mjs +84 -0
  17. package/esm2022/lib/{dossier-process-start-modal → components/dossier-process-start-modal}/dossier-process-start-modal.component.mjs +1 -2
  18. package/esm2022/lib/components/dossier-supporting-process-start-modal/dossier-supporting-process-start-modal.component.mjs +116 -0
  19. package/esm2022/lib/components/dossier-update/dossier-update.component.mjs +113 -0
  20. package/esm2022/lib/constants/case-tab-token.mjs +19 -0
  21. package/esm2022/lib/constants/index.mjs +3 -0
  22. package/esm2022/lib/constants/tab.mjs +42 -0
  23. package/esm2022/lib/dossier-routing.module.mjs +14 -4
  24. package/esm2022/lib/dossier.module.mjs +33 -27
  25. package/esm2022/lib/models/dossier-detail-tab.model.mjs +27 -0
  26. package/esm2022/lib/models/index.mjs +3 -1
  27. package/esm2022/lib/models/tab-api.model.mjs +23 -0
  28. package/esm2022/lib/models/tabs.model.mjs +32 -28
  29. package/esm2022/lib/permissions/dossier-detail.permissions.mjs +55 -0
  30. package/esm2022/lib/permissions/index.mjs +2 -2
  31. package/esm2022/lib/pipes/index.mjs +17 -0
  32. package/esm2022/lib/pipes/tab-translate/index.mjs +18 -0
  33. package/esm2022/lib/pipes/tab-translate/tab-translate-pipe.module.mjs +33 -0
  34. package/esm2022/lib/pipes/tab-translate/tab-translate.pipe.mjs +41 -0
  35. package/esm2022/lib/services/dossier-list-pagination.service.mjs +2 -2
  36. package/esm2022/lib/services/dossier-tab-api.service.mjs +23 -0
  37. package/esm2022/lib/services/dossier-tab.service.mjs +130 -0
  38. package/esm2022/lib/services/dossier.service.mjs +58 -0
  39. package/esm2022/lib/services/index.mjs +4 -2
  40. package/esm2022/public_api.mjs +13 -15
  41. package/fesm2022/valtimo-dossier.mjs +1321 -1023
  42. package/fesm2022/valtimo-dossier.mjs.map +1 -1
  43. package/lib/components/dossier-assign-user/dossier-assign-user.component.d.ts.map +1 -0
  44. package/lib/{dossier-bulk-assign-modal → components/dossier-bulk-assign-modal}/dossier-bulk-assign-modal.component.d.ts +1 -1
  45. package/lib/components/dossier-bulk-assign-modal/dossier-bulk-assign-modal.component.d.ts.map +1 -0
  46. package/lib/{dossier-detail → components/dossier-detail}/dossier-detail.component.d.ts +10 -10
  47. package/lib/components/dossier-detail/dossier-detail.component.d.ts.map +1 -0
  48. package/lib/components/dossier-detail/tab/audit/audit.component.d.ts.map +1 -0
  49. package/lib/components/dossier-detail/tab/contact-moments/contact-moments.component.d.ts.map +1 -0
  50. package/lib/{dossier-detail → components/dossier-detail}/tab/documenten-api-documents/documenten-api-documents.component.d.ts +1 -1
  51. package/lib/components/dossier-detail/tab/documenten-api-documents/documenten-api-documents.component.d.ts.map +1 -0
  52. package/lib/components/dossier-detail/tab/documents/documents.component.d.ts.map +1 -0
  53. package/lib/components/dossier-detail/tab/formio/formio.component.d.ts +20 -0
  54. package/lib/components/dossier-detail/tab/formio/formio.component.d.ts.map +1 -0
  55. package/lib/{dossier-detail → components/dossier-detail}/tab/notes/notes.component.d.ts +3 -3
  56. package/lib/components/dossier-detail/tab/notes/notes.component.d.ts.map +1 -0
  57. package/lib/{dossier-detail → components/dossier-detail}/tab/object-type/object-type.component.d.ts +2 -2
  58. package/lib/components/dossier-detail/tab/object-type/object-type.component.d.ts.map +1 -0
  59. package/lib/components/dossier-detail/tab/progress/progress.component.d.ts.map +1 -0
  60. package/lib/{dossier-detail → components/dossier-detail}/tab/s3-documents/s3-documents.component.d.ts +1 -1
  61. package/lib/components/dossier-detail/tab/s3-documents/s3-documents.component.d.ts.map +1 -0
  62. package/lib/components/dossier-detail/tab/summary/summary.component.d.ts.map +1 -0
  63. package/lib/{dossier-detail → components/dossier-detail}/tab/zaakobjecten/zaakobjecten.component.d.ts +2 -2
  64. package/lib/components/dossier-detail/tab/zaakobjecten/zaakobjecten.component.d.ts.map +1 -0
  65. package/lib/{dossier-list → components/dossier-list}/dossier-list.component.d.ts +1 -1
  66. package/lib/components/dossier-list/dossier-list.component.d.ts.map +1 -0
  67. package/lib/{dossier-list-actions → components/dossier-list-actions}/dossier-list-actions.component.d.ts +1 -1
  68. package/lib/components/dossier-list-actions/dossier-list-actions.component.d.ts.map +1 -0
  69. package/lib/components/dossier-process-start-modal/dossier-process-start-modal.component.d.ts.map +1 -0
  70. package/lib/components/dossier-supporting-process-start-modal/dossier-supporting-process-start-modal.component.d.ts.map +1 -0
  71. package/lib/{dossier-update → components/dossier-update}/dossier-update.component.d.ts +1 -1
  72. package/lib/components/dossier-update/dossier-update.component.d.ts.map +1 -0
  73. package/lib/constants/case-tab-token.d.ts +5 -0
  74. package/lib/constants/case-tab-token.d.ts.map +1 -0
  75. package/lib/constants/index.d.ts +3 -0
  76. package/lib/constants/index.d.ts.map +1 -0
  77. package/lib/constants/tab.d.ts +7 -0
  78. package/lib/constants/tab.d.ts.map +1 -0
  79. package/lib/dossier-routing.module.d.ts.map +1 -1
  80. package/lib/dossier.module.d.ts +33 -31
  81. package/lib/dossier.module.d.ts.map +1 -1
  82. package/lib/models/dossier-detail-tab.model.d.ts +18 -0
  83. package/lib/models/dossier-detail-tab.model.d.ts.map +1 -0
  84. package/lib/models/index.d.ts +2 -0
  85. package/lib/models/index.d.ts.map +1 -1
  86. package/lib/models/tab-api.model.d.ts +13 -0
  87. package/lib/models/tab-api.model.d.ts.map +1 -0
  88. package/lib/models/tabs.model.d.ts +11 -10
  89. package/lib/models/tabs.model.d.ts.map +1 -1
  90. package/lib/permissions/{dossier.permissions.d.ts → dossier-detail.permissions.d.ts} +1 -1
  91. package/lib/permissions/dossier-detail.permissions.d.ts.map +1 -0
  92. package/lib/permissions/index.d.ts +1 -1
  93. package/lib/permissions/index.d.ts.map +1 -1
  94. package/lib/pipes/index.d.ts +2 -0
  95. package/lib/pipes/index.d.ts.map +1 -0
  96. package/lib/pipes/tab-translate/index.d.ts +3 -0
  97. package/lib/pipes/tab-translate/index.d.ts.map +1 -0
  98. package/lib/pipes/tab-translate/tab-translate-pipe.module.d.ts +9 -0
  99. package/lib/pipes/tab-translate/tab-translate-pipe.module.d.ts.map +1 -0
  100. package/lib/pipes/tab-translate/tab-translate.pipe.d.ts +13 -0
  101. package/lib/pipes/tab-translate/tab-translate.pipe.d.ts.map +1 -0
  102. package/lib/services/dossier-list-pagination.service.d.ts +1 -1
  103. package/lib/services/dossier-list-pagination.service.d.ts.map +1 -1
  104. package/lib/services/dossier-tab-api.service.d.ts +15 -0
  105. package/lib/services/dossier-tab-api.service.d.ts.map +1 -0
  106. package/lib/services/dossier-tab.service.d.ts +31 -0
  107. package/lib/services/dossier-tab.service.d.ts.map +1 -0
  108. package/lib/{dossier.service.d.ts → services/dossier.service.d.ts} +1 -1
  109. package/lib/services/dossier.service.d.ts.map +1 -0
  110. package/lib/services/index.d.ts +3 -1
  111. package/lib/services/index.d.ts.map +1 -1
  112. package/package.json +1 -1
  113. package/public_api.d.ts +12 -14
  114. package/public_api.d.ts.map +1 -1
  115. package/esm2022/lib/dossier-assign-user/dossier-assign-user.component.mjs +0 -98
  116. package/esm2022/lib/dossier-detail/dossier-detail.component.mjs +0 -175
  117. package/esm2022/lib/dossier-detail/tab/audit/audit.component.mjs +0 -76
  118. package/esm2022/lib/dossier-detail/tab/documenten-api-documents/documenten-api-documents.component.mjs +0 -146
  119. package/esm2022/lib/dossier-detail/tab/notes/notes.component.mjs +0 -166
  120. package/esm2022/lib/dossier-detail/tab/object-type/object-type.component.mjs +0 -121
  121. package/esm2022/lib/dossier-detail/tab/s3-documents/s3-documents.component.mjs +0 -136
  122. package/esm2022/lib/dossier-detail/tab/summary/summary.component.mjs +0 -130
  123. package/esm2022/lib/dossier-detail/tab/zaakobjecten/zaakobjecten.component.mjs +0 -112
  124. package/esm2022/lib/dossier-detail-tab-enum.mjs +0 -26
  125. package/esm2022/lib/dossier-list/dossier-list.component.mjs +0 -371
  126. package/esm2022/lib/dossier-list-actions/dossier-list-actions.component.mjs +0 -84
  127. package/esm2022/lib/dossier-supporting-process-start-modal/dossier-supporting-process-start-modal.component.mjs +0 -116
  128. package/esm2022/lib/dossier-update/dossier-update.component.mjs +0 -113
  129. package/esm2022/lib/dossier.config.mjs +0 -29
  130. package/esm2022/lib/dossier.service.mjs +0 -58
  131. package/esm2022/lib/permissions/dossier.permissions.mjs +0 -55
  132. package/esm2022/lib/tab.service.mjs +0 -80
  133. package/lib/dossier-assign-user/dossier-assign-user.component.d.ts.map +0 -1
  134. package/lib/dossier-bulk-assign-modal/dossier-bulk-assign-modal.component.d.ts.map +0 -1
  135. package/lib/dossier-detail/dossier-detail.component.d.ts.map +0 -1
  136. package/lib/dossier-detail/tab/audit/audit.component.d.ts.map +0 -1
  137. package/lib/dossier-detail/tab/contact-moments/contact-moments.component.d.ts.map +0 -1
  138. package/lib/dossier-detail/tab/documenten-api-documents/documenten-api-documents.component.d.ts.map +0 -1
  139. package/lib/dossier-detail/tab/documents/documents.component.d.ts.map +0 -1
  140. package/lib/dossier-detail/tab/notes/notes.component.d.ts.map +0 -1
  141. package/lib/dossier-detail/tab/object-type/object-type.component.d.ts.map +0 -1
  142. package/lib/dossier-detail/tab/progress/progress.component.d.ts.map +0 -1
  143. package/lib/dossier-detail/tab/s3-documents/s3-documents.component.d.ts.map +0 -1
  144. package/lib/dossier-detail/tab/summary/summary.component.d.ts.map +0 -1
  145. package/lib/dossier-detail/tab/zaakobjecten/zaakobjecten.component.d.ts.map +0 -1
  146. package/lib/dossier-detail-tab-enum.d.ts +0 -10
  147. package/lib/dossier-detail-tab-enum.d.ts.map +0 -1
  148. package/lib/dossier-list/dossier-list.component.d.ts.map +0 -1
  149. package/lib/dossier-list-actions/dossier-list-actions.component.d.ts.map +0 -1
  150. package/lib/dossier-process-start-modal/dossier-process-start-modal.component.d.ts.map +0 -1
  151. package/lib/dossier-supporting-process-start-modal/dossier-supporting-process-start-modal.component.d.ts.map +0 -1
  152. package/lib/dossier-update/dossier-update.component.d.ts.map +0 -1
  153. package/lib/dossier.config.d.ts +0 -4
  154. package/lib/dossier.config.d.ts.map +0 -1
  155. package/lib/dossier.service.d.ts.map +0 -1
  156. package/lib/permissions/dossier.permissions.d.ts.map +0 -1
  157. package/lib/tab.service.d.ts +0 -21
  158. package/lib/tab.service.d.ts.map +0 -1
  159. /package/lib/{dossier-assign-user → components/dossier-assign-user}/dossier-assign-user.component.d.ts +0 -0
  160. /package/lib/{dossier-detail → components/dossier-detail}/tab/audit/audit.component.d.ts +0 -0
  161. /package/lib/{dossier-detail → components/dossier-detail}/tab/contact-moments/contact-moments.component.d.ts +0 -0
  162. /package/lib/{dossier-detail → components/dossier-detail}/tab/documents/documents.component.d.ts +0 -0
  163. /package/lib/{dossier-detail → components/dossier-detail}/tab/progress/progress.component.d.ts +0 -0
  164. /package/lib/{dossier-detail → components/dossier-detail}/tab/summary/summary.component.d.ts +0 -0
  165. /package/lib/{dossier-process-start-modal → components/dossier-process-start-modal}/dossier-process-start-modal.component.d.ts +0 -0
  166. /package/lib/{dossier-supporting-process-start-modal → components/dossier-supporting-process-start-modal}/dossier-supporting-process-start-modal.component.d.ts +0 -0
@@ -0,0 +1,370 @@
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 { Component, ViewChild } from '@angular/core';
17
+ import { CarbonListComponent, } from '@valtimo/components';
18
+ import { DossierListTab, } from '@valtimo/config';
19
+ import { AdvancedDocumentSearchRequestImpl, } from '@valtimo/document';
20
+ import { Tabs } from 'carbon-components-angular';
21
+ import { isEqual } from 'lodash';
22
+ import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, forkJoin, map, of, switchMap, take, tap, } from 'rxjs';
23
+ import { DossierListActionsComponent } from '../dossier-list-actions/dossier-list-actions.component';
24
+ import { CAN_CREATE_CASE_PERMISSION, DOSSIER_DETAIL_PERMISSION_RESOURCE } from '../../permissions';
25
+ import { DossierColumnService, DossierListAssigneeService, DossierListPaginationService, DossierListSearchService, DossierListService, DossierParameterService, } from '../../services';
26
+ import * as i0 from "@angular/core";
27
+ import * as i1 from "../../services";
28
+ import * as i2 from "@valtimo/components";
29
+ import * as i3 from "@valtimo/config";
30
+ import * as i4 from "@valtimo/document";
31
+ import * as i5 from "@angular/router";
32
+ import * as i6 from "@ngx-translate/core";
33
+ import * as i7 from "@valtimo/access-control";
34
+ import * as i8 from "@angular/common";
35
+ import * as i9 from "carbon-components-angular";
36
+ import * as i10 from "../dossier-bulk-assign-modal/dossier-bulk-assign-modal.component";
37
+ import * as i11 from "../dossier-list-actions/dossier-list-actions.component";
38
+ export class DossierListComponent {
39
+ constructor(assigneeService, breadcrumbService, bulkAssignService, columnService, configService, documentService, listService, pageTitleService, paginationService, parameterService, route, router, searchService, translateService, permissionService) {
40
+ this.assigneeService = assigneeService;
41
+ this.breadcrumbService = breadcrumbService;
42
+ this.bulkAssignService = bulkAssignService;
43
+ this.columnService = columnService;
44
+ this.configService = configService;
45
+ this.documentService = documentService;
46
+ this.listService = listService;
47
+ this.pageTitleService = pageTitleService;
48
+ this.paginationService = paginationService;
49
+ this.parameterService = parameterService;
50
+ this.route = route;
51
+ this.router = router;
52
+ this.searchService = searchService;
53
+ this.translateService = translateService;
54
+ this.permissionService = permissionService;
55
+ this.activeTab = null;
56
+ this.loadingFields = true;
57
+ this.loadingPagination = true;
58
+ this.loadingSearchFields = true;
59
+ this.loadingAssigneeFilter = true;
60
+ this.loadingDocumentItems = true;
61
+ this.visibleDossierTabs = null;
62
+ this.defaultTabs = [
63
+ DossierListTab.ALL,
64
+ DossierListTab.MINE,
65
+ DossierListTab.OPEN,
66
+ ];
67
+ this.tableTranslations = {
68
+ select: {
69
+ single: 'dossier.select.single',
70
+ multiple: 'dossier.select.multiple',
71
+ },
72
+ pagination: {
73
+ itemsPerPage: 'dossier.pagination.itemsPerPage',
74
+ totalItem: 'dossier.pagination.totalItem',
75
+ totalItems: 'dossier.pagination.totalItems',
76
+ },
77
+ };
78
+ this.noResultsMessage$ = new BehaviorSubject({
79
+ description: 'dossier.noResults.ALL.description',
80
+ isSearchResult: false,
81
+ title: 'dossier.noResults.ALL.title',
82
+ });
83
+ this.showAssignModal$ = new BehaviorSubject(false);
84
+ this.showChangePageModal$ = new BehaviorSubject(false);
85
+ this.showChangeTabModal$ = new BehaviorSubject(false);
86
+ this.searchFields$ = this.searchService.documentSearchFields$.pipe(tap(() => {
87
+ this.loadingSearchFields = false;
88
+ }));
89
+ this.documentDefinitionName$ = this.listService.documentDefinitionName$;
90
+ this.canCreateDocument$ = this.documentDefinitionName$.pipe(switchMap(documentDefinitionName => this.permissionService.requestPermission(CAN_CREATE_CASE_PERMISSION, {
91
+ resource: DOSSIER_DETAIL_PERMISSION_RESOURCE.jsonSchemaDocumentDefinition,
92
+ identifier: documentDefinitionName,
93
+ })));
94
+ this.selectedDocumentIds$ = new BehaviorSubject([]);
95
+ this.schema$ = this.listService.documentDefinitionName$.pipe(switchMap(documentDefinitionName => this.documentService.getDocumentDefinition(documentDefinitionName)), map(documentDefinition => documentDefinition?.schema), tap(schema => {
96
+ if (schema?.title) {
97
+ this.pageTitleService.setCustomPageTitle(schema?.title, true);
98
+ }
99
+ }));
100
+ this.searchFieldValues$ = this.parameterService.searchFieldValues$;
101
+ this.assigneeFilter$ = this.assigneeService.assigneeFilter$.pipe(tap(assigneeFilter => (this.activeTab = assigneeFilter)));
102
+ this.paginationChange$ = new BehaviorSubject(null);
103
+ this.tabChange$ = new BehaviorSubject(null);
104
+ this._pagination$ = this.paginationService.pagination$.pipe(tap(pagination => {
105
+ this.pagination = pagination;
106
+ this.loadingPagination = false;
107
+ }));
108
+ this._hasEnvColumnConfig$ = this.listService.hasEnvColumnConfig$;
109
+ this._hasApiColumnConfig$ = new BehaviorSubject(false);
110
+ this._canHaveAssignee$ = this.assigneeService.canHaveAssignee$;
111
+ this._columns$ = this.listService.documentDefinitionName$.pipe(switchMap(documentDefinitionName => this.columnService.getDefinitionColumns(documentDefinitionName)), map(res => {
112
+ this._hasApiColumnConfig$.next(res.hasApiConfig);
113
+ return res.columns;
114
+ }), tap(columns => {
115
+ this.listService.documentDefinitionName$.pipe(take(1)).subscribe(_ => {
116
+ this.paginationService.setPagination(columns);
117
+ });
118
+ }));
119
+ this.fields$ = combineLatest([
120
+ this._canHaveAssignee$,
121
+ this._columns$,
122
+ this._hasEnvColumnConfig$,
123
+ this._hasApiColumnConfig$,
124
+ this.translateService.stream('key'),
125
+ ]).pipe(tap(([canHaveAssignee]) => {
126
+ this.canHaveAssignee = canHaveAssignee;
127
+ }), map(([canHaveAssignee, columns, hasEnvConfig, hasApiConfig]) => {
128
+ const filteredAssigneeColumns = this.assigneeService.filterAssigneeColumns(columns, canHaveAssignee);
129
+ const listFields = this.columnService.mapDefinitionColumnsToListFields(filteredAssigneeColumns, hasEnvConfig, hasApiConfig);
130
+ const fieldsToReturn = this.assigneeService.addAssigneeListField(columns, listFields, canHaveAssignee);
131
+ return fieldsToReturn;
132
+ }), tap(listFields => {
133
+ const defaultListField = listFields.find(field => field.default);
134
+ // set default sort state if no pagination query parameters for sorting are available
135
+ this.parameterService.queryPaginationParams$
136
+ .pipe(take(1))
137
+ .subscribe(queryPaginationParams => {
138
+ if (defaultListField && !queryPaginationParams?.sort?.isSorting) {
139
+ const sortDirection = typeof defaultListField.default === 'string' ? defaultListField.default : 'DESC';
140
+ this.paginationService.sortChanged({
141
+ isSorting: true,
142
+ state: { name: defaultListField.key, direction: sortDirection },
143
+ });
144
+ }
145
+ });
146
+ }), tap(() => {
147
+ this.loadingFields = false;
148
+ }));
149
+ this._documentSearchRequest$ = combineLatest([this._pagination$, this.listService.documentDefinitionName$]).pipe(filter(([pagination]) => !!pagination), map(([pagination, documentDefinitionName]) => {
150
+ const page = pagination.page - 1;
151
+ return new AdvancedDocumentSearchRequestImpl(documentDefinitionName, page >= 0 ? page : 0, pagination.size, pagination.sort);
152
+ }));
153
+ this.documentItems$ = this.listService.checkRefresh$.pipe(switchMap(() => combineLatest([
154
+ this._documentSearchRequest$,
155
+ this.assigneeFilter$,
156
+ this.searchFieldValues$,
157
+ this.listService.forceRefresh$,
158
+ this._hasEnvColumnConfig$,
159
+ this._hasApiColumnConfig$,
160
+ ])), distinctUntilChanged(([prevSearchRequest, prevAssigneeFilter, prevSearchFieldValues, prevForceRefresh], [currSearchRequest, currAssigneeFilter, currSearchFieldValues, currForceRefresh]) => isEqual({
161
+ ...prevSearchRequest,
162
+ assignee: prevAssigneeFilter,
163
+ ...prevSearchFieldValues,
164
+ forceRefresh: prevForceRefresh,
165
+ }, {
166
+ ...currSearchRequest,
167
+ assignee: currAssigneeFilter,
168
+ ...currSearchFieldValues,
169
+ forceRefresh: currForceRefresh,
170
+ })), switchMap(([documentSearchRequest, assigneeFilter, searchValues, _, hasEnvColumnConfig, hasApiColumnConfig,]) => {
171
+ const obsEnv = of(hasEnvColumnConfig);
172
+ const obsApi = of(hasApiColumnConfig);
173
+ if ((Object.keys(searchValues) || []).length > 0) {
174
+ return forkJoin({
175
+ documents: hasEnvColumnConfig || !hasApiColumnConfig
176
+ ? this.documentService.getDocumentsSearch(documentSearchRequest, 'AND', assigneeFilter, this.searchService.mapSearchValuesToFilters(searchValues))
177
+ : this.documentService.getSpecifiedDocumentsSearch(documentSearchRequest, 'AND', assigneeFilter, this.searchService.mapSearchValuesToFilters(searchValues)),
178
+ hasEnvColumnConfig: obsEnv,
179
+ hasApiColumnConfig: obsApi,
180
+ isSearchResult: of(true),
181
+ });
182
+ }
183
+ return forkJoin({
184
+ documents: hasEnvColumnConfig || !hasApiColumnConfig
185
+ ? this.documentService.getDocumentsSearch(documentSearchRequest, 'AND', assigneeFilter)
186
+ : this.documentService.getSpecifiedDocumentsSearch(documentSearchRequest, 'AND', assigneeFilter),
187
+ hasEnvColumnConfig: obsEnv,
188
+ hasApiColumnConfig: obsApi,
189
+ isSearchResult: of(false),
190
+ });
191
+ }), map((res) => {
192
+ this.paginationService.setCollectionSize(res.documents);
193
+ this.paginationService.checkPage(res.documents);
194
+ this.updateNoResultsMessage(res.isSearchResult);
195
+ return this.listService.mapDocuments(res.documents, res.hasEnvColumnConfig, res.hasApiColumnConfig);
196
+ }), tap(() => {
197
+ this.loadingAssigneeFilter = false;
198
+ this.loadingDocumentItems = false;
199
+ }));
200
+ }
201
+ ngOnInit() {
202
+ this.setVisibleTabs();
203
+ this.openDocumentDefinitionNameSubscription();
204
+ }
205
+ ngOnDestroy() {
206
+ this._documentDefinitionNameSubscription?.unsubscribe();
207
+ this.pageTitleService.enableReset();
208
+ }
209
+ trackByIndex(index) {
210
+ return index;
211
+ }
212
+ search(searchFieldValues) {
213
+ this.searchService.search(searchFieldValues);
214
+ }
215
+ rowClick(document) {
216
+ this.listService.documentDefinitionName$.pipe(take(1)).subscribe(documentDefinitionName => {
217
+ this.breadcrumbService.cacheQueryParams(`/dossiers/${documentDefinitionName}`, this.route.snapshot.queryParams);
218
+ this.router.navigate([
219
+ `/dossiers/${documentDefinitionName}/document/${document.id}`,
220
+ ]);
221
+ });
222
+ }
223
+ tabChange(tab) {
224
+ if (!this.activeTab) {
225
+ this.activeTab = tab;
226
+ this.updateNoResultsMessage(false);
227
+ return;
228
+ }
229
+ if (this.activeTab.toLowerCase() === tab.toLowerCase()) {
230
+ return;
231
+ }
232
+ if (this.carbonList.model.selectedRowsCount()) {
233
+ this.showChangeTabModal$.next(true);
234
+ this.tabChange$.next(tab);
235
+ return;
236
+ }
237
+ this.onChangeTabConfirm(tab);
238
+ }
239
+ onChangeTabCancel() {
240
+ if (!this.tabsComponent) {
241
+ return;
242
+ }
243
+ const prevTab = this.tabsComponent.tabs.find((tab) => tab.id === this.activeTab);
244
+ if (!prevTab) {
245
+ return;
246
+ }
247
+ this.tabsComponent.tabs.find((tab) => tab.active).active = false;
248
+ prevTab.active = true;
249
+ }
250
+ pageChange(page) {
251
+ if (this.carbonList?.model.selectedRowsCount()) {
252
+ this.showChangePageModal$.next(true);
253
+ this.paginationChange$.next({ page, size: this.pagination.size });
254
+ return;
255
+ }
256
+ this.paginationService.pageChange(page);
257
+ }
258
+ pageSizeChange(size) {
259
+ if (this.carbonList?.model.selectedRowsCount()) {
260
+ this.showChangePageModal$.next(true);
261
+ this.paginationChange$.next({ page: this.pagination.page, size });
262
+ return;
263
+ }
264
+ this.paginationService.pageSizeChange(size);
265
+ }
266
+ sortChanged(newSortState) {
267
+ this.paginationService.sortChanged(newSortState);
268
+ }
269
+ onChangeTabConfirm(tab) {
270
+ this.loadingAssigneeFilter = true;
271
+ this.activeTab = tab;
272
+ this.updateNoResultsMessage(false);
273
+ this.paginationService.setPage(1);
274
+ this.assigneeService.setAssigneeFilter(tab);
275
+ }
276
+ showAssignModal() {
277
+ this.selectedDocumentIds$.next(this.carbonList.selectedItems.map((document) => document.id));
278
+ this.showAssignModal$.next(true);
279
+ }
280
+ onCloseEvent(assigneeId, documentIds) {
281
+ this.showAssignModal$.next(false);
282
+ if (!assigneeId) {
283
+ return;
284
+ }
285
+ this.bulkAssignService.bulkAssign(assigneeId, documentIds).subscribe(() => {
286
+ this.forceRefresh();
287
+ });
288
+ }
289
+ onChangePageConfirm(pagination) {
290
+ if (pagination.size !== this.pagination.size) {
291
+ this.paginationService.pageSizeChange(pagination.size);
292
+ return;
293
+ }
294
+ this.paginationService.pageChange(pagination.page);
295
+ }
296
+ startDossier() {
297
+ this.listActionsComponent.startDossier();
298
+ }
299
+ forceRefresh() {
300
+ this.listService.forceRefresh();
301
+ }
302
+ openDocumentDefinitionNameSubscription() {
303
+ this._documentDefinitionNameSubscription = this.route.params
304
+ .pipe(map((params) => params?.documentDefinitionName), filter(docDefName => !!docDefName), distinctUntilChanged())
305
+ .subscribe(documentDefinitonName => {
306
+ if (this._previousDocumentDefinitionName) {
307
+ this.parameterService.clearParameters();
308
+ this.parameterService.clearSearchFieldValues();
309
+ }
310
+ this._previousDocumentDefinitionName = documentDefinitonName;
311
+ this.setLoading();
312
+ this.paginationService.clearPagination();
313
+ this.assigneeService.resetAssigneeFilter();
314
+ this.listService.setDocumentDefinitionName(documentDefinitonName);
315
+ });
316
+ }
317
+ setLoading() {
318
+ this.loadingFields = true;
319
+ this.loadingPagination = true;
320
+ this.loadingSearchFields = true;
321
+ this.loadingAssigneeFilter = true;
322
+ this.loadingDocumentItems = true;
323
+ }
324
+ setVisibleTabs() {
325
+ this.visibleDossierTabs = this.configService.config?.visibleDossierListTabs || null;
326
+ }
327
+ updateNoResultsMessage(isSearchResult) {
328
+ this.noResultsMessage$.next(isSearchResult
329
+ ? {
330
+ description: 'dossier.noResults.search.description',
331
+ isSearchResult,
332
+ title: 'dossier.noResults.search.title',
333
+ }
334
+ : {
335
+ description: `dossier.noResults.${this.activeTab ?? 'ALL'}.description`,
336
+ isSearchResult,
337
+ title: `dossier.noResults.${this.activeTab ?? 'ALL'}.title`,
338
+ });
339
+ }
340
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DossierListComponent, deps: [{ token: i1.DossierListAssigneeService }, { token: i2.BreadcrumbService }, { token: i1.DossierBulkAssignService }, { token: i1.DossierColumnService }, { token: i3.ConfigService }, { token: i4.DocumentService }, { token: i1.DossierListService }, { token: i2.PageTitleService }, { token: i1.DossierListPaginationService }, { token: i1.DossierParameterService }, { token: i5.ActivatedRoute }, { token: i5.Router }, { token: i1.DossierListSearchService }, { token: i6.TranslateService }, { token: i7.PermissionService }], target: i0.ɵɵFactoryTarget.Component }); }
341
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DossierListComponent, selector: "valtimo-dossier-list", providers: [
342
+ DossierListService,
343
+ DossierColumnService,
344
+ DossierListAssigneeService,
345
+ DossierParameterService,
346
+ DossierListPaginationService,
347
+ DossierListSearchService,
348
+ ], viewQueries: [{ propertyName: "carbonList", first: true, predicate: CarbonListComponent, descendants: true }, { propertyName: "listActionsComponent", first: true, predicate: DossierListActionsComponent, descendants: true }, { propertyName: "tabsComponent", first: true, predicate: Tabs, 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<ng-container\n *ngIf=\"{\n fields: fields$ | async,\n documentItems: documentItems$ | async,\n noResultsMessage: noResultsMessage$ | async,\n searchFields: searchFields$ | async,\n schema: schema$ | async,\n showAssignModal: showAssignModal$ | async,\n selectedDocumentIds: selectedDocumentIds$ | async,\n loaded:\n !loadingFields &&\n !loadingPagination &&\n !loadingSearchFields &&\n !loadingAssigneeFilter &&\n !loadingDocumentItems\n } as obs\"\n>\n <div class=\"main-content pt-0\">\n <div class=\"container-fluid\">\n <div class=\"col-12 px-0 mb-5\">\n <valtimo-dossier-list-actions\n [loading]=\"!obs.loaded\"\n (formFlowComplete)=\"forceRefresh()\"\n ></valtimo-dossier-list-actions>\n <ng-container *ngTemplateOutlet=\"searchFields; context: {obs: obs}\"></ng-container>\n\n <ng-container *ngIf=\"obs.loaded; else loading\">\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"bulkAssignModal; context: {obs: obs}\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"changePageModal\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"changeTabModal\"></ng-container>\n</ng-container>\n\n<ng-template #searchFields let-obs=\"obs\">\n <div class=\"mb-3\">\n <valtimo-search-fields\n [searchFields]=\"obs.searchFields\"\n (doSearch)=\"search($event)\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [defaultValues]=\"searchFieldValues$ | async\"\n [inputDisabled]=\"!obs.loaded\"\n ></valtimo-search-fields>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-carbon-list\n [fields]=\"obs.fields\"\n [header]=\"false\"\n [initialSortState]=\"pagination.sort\"\n [items]=\"obs.documentItems\"\n [pagination]=\"pagination\"\n paginationIdentifier=\"dossierList\"\n [showSelectionColumn]=\"canHaveAssignee\"\n [tableTranslations]=\"tableTranslations\"\n (paginationClicked)=\"pageChange($event)\"\n (paginationSet)=\"pageSizeChange($event)\"\n (rowClicked)=\"rowClick($event)\"\n (sortChanged)=\"sortChanged($event)\"\n >\n <ng-container carbonToolbarActions>\n <button cdsButton=\"primary\" (click)=\"showAssignModal()\">\n {{ 'dossier.bulkAssign.assign' | translate }}\n </button>\n </ng-container>\n\n <div carbonToolbarContent>\n <ng-container *ngTemplateOutlet=\"dossierListActions\"></ng-container>\n </div>\n\n <valtimo-no-results\n [action]=\"obs.noResultsMessage.isSearchResult ? null : dossierListActions\"\n [description]=\"obs.noResultsMessage.description | translate\"\n [title]=\"obs.noResultsMessage.title | translate\"\n ></valtimo-no-results>\n\n <div tabs *ngIf=\"canHaveAssignee\">\n <ng-container *ngTemplateOutlet=\"tabs\"></ng-container>\n </div>\n </valtimo-carbon-list>\n</ng-template>\n\n<ng-template #tabs>\n <ng-container *ngIf=\"assigneeFilter$ | async as assigneeFilter\">\n <cds-tabs\n *ngIf=\"!visibleDossierTabs; else configuredTabs\"\n type=\"contained\"\n data-carbon-theme=\"g10\"\n class=\"dossier-list-tabs\"\n >\n <cds-tab\n *ngFor=\"let tab of defaultTabs; trackBy: trackByIndex\"\n [active]=\"assigneeFilter === tab\"\n heading=\"{{ 'dossier.tabs.' + tab | translate }}\"\n [id]=\"tab\"\n (selected)=\"tabChange(tab)\"\n ></cds-tab>\n </cds-tabs>\n </ng-container>\n</ng-template>\n\n<ng-template #configuredTabs>\n <ng-container *ngIf=\"assigneeFilter$ | async as assigneeFilter\">\n <cds-tabs type=\"contained\" class=\"dossier-list-tabs\">\n <cds-tab\n *ngFor=\"let tab of visibleDossierTabs; trackBy: trackByIndex\"\n [active]=\"assigneeFilter === tab\"\n heading=\"{{ 'dossier.tabs.' + tab | translate }}\"\n [id]=\"tab\"\n (selected)=\"tabChange(tab)\"\n ></cds-tab>\n </cds-tabs>\n </ng-container>\n</ng-template>\n\n<ng-template #loading\n ><valtimo-carbon-list [loading]=\"true\">\n <div tabs *ngIf=\"canHaveAssignee\">\n <ng-container *ngTemplateOutlet=\"tabs\"></ng-container>\n </div> </valtimo-carbon-list\n></ng-template>\n\n<ng-template #bulkAssignModal let-obs=\"obs\">\n <valtimo-dossier-bulk-assign-modal\n [documentIds]=\"obs.selectedDocumentIds\"\n [open]=\"obs.showAssignModal\"\n (closeEvent)=\"onCloseEvent($event, obs.selectedDocumentIds)\"\n ></valtimo-dossier-bulk-assign-modal>\n</ng-template>\n\n<ng-template #changePageModal>\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"dossier.changePageModal.confirm\"\n contentTranslationKey=\"dossier.changePageModal.content\"\n [outputOnConfirm]=\"paginationChange$ | async\"\n [showModalSubject$]=\"showChangePageModal$\"\n titleTranslationKey=\"dossier.changePageModal.title\"\n (confirmEvent)=\"onChangePageConfirm($event)\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #changeTabModal>\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"dossier.changeTabModal.confirm\"\n contentTranslationKey=\"dossier.changeTabModal.content\"\n [outputOnConfirm]=\"tabChange$ | async\"\n [showModalSubject$]=\"showChangeTabModal$\"\n titleTranslationKey=\"dossier.changeTabModal.title\"\n (cancelEvent)=\"onChangeTabCancel()\"\n (confirmEvent)=\"onChangeTabConfirm($event)\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #dossierListActions>\n <button\n cdsButton=\"primary\"\n [disabled]=\"listActionsComponent?.disableStartDossierButton$ | async\"\n (click)=\"startDossier()\"\n >\n {{ 'Start Dossier' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n</ng-template>\n", styles: [".dossier-list-tabs cds-tab{display:none}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.SearchFieldsComponent, selector: "valtimo-search-fields", inputs: ["loading", "searchFields", "documentDefinitionName", "setValuesSubject$", "defaultValues", "inputDisabled"], outputs: ["doSearch"] }, { kind: "directive", type: i9.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i9.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i2.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm"], outputs: ["confirmEvent", "cancelEvent"] }, { kind: "component", type: i9.Tabs, selector: "cds-tabs, ibm-tabs", inputs: ["position", "cacheActive", "followFocus", "isNavigation", "ariaLabel", "ariaLabelledby", "type", "theme", "skeleton"] }, { kind: "component", type: i9.Tab, selector: "cds-tab, ibm-tab", inputs: ["heading", "title", "context", "active", "disabled", "tabIndex", "id", "cacheActive"], outputs: ["selected"] }, { kind: "component", type: i2.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "header", "initialSortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { kind: "component", type: i2.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title"] }, { kind: "component", type: i10.DossierBulkAssignModalComponent, selector: "valtimo-dossier-bulk-assign-modal", inputs: ["documentIds", "open"], outputs: ["closeEvent"] }, { kind: "component", type: i11.DossierListActionsComponent, selector: "valtimo-dossier-list-actions", inputs: ["loading"], outputs: ["formFlowComplete"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] }); }
349
+ }
350
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DossierListComponent, decorators: [{
351
+ type: Component,
352
+ args: [{ selector: 'valtimo-dossier-list', providers: [
353
+ DossierListService,
354
+ DossierColumnService,
355
+ DossierListAssigneeService,
356
+ DossierParameterService,
357
+ DossierListPaginationService,
358
+ DossierListSearchService,
359
+ ], 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 fields: fields$ | async,\n documentItems: documentItems$ | async,\n noResultsMessage: noResultsMessage$ | async,\n searchFields: searchFields$ | async,\n schema: schema$ | async,\n showAssignModal: showAssignModal$ | async,\n selectedDocumentIds: selectedDocumentIds$ | async,\n loaded:\n !loadingFields &&\n !loadingPagination &&\n !loadingSearchFields &&\n !loadingAssigneeFilter &&\n !loadingDocumentItems\n } as obs\"\n>\n <div class=\"main-content pt-0\">\n <div class=\"container-fluid\">\n <div class=\"col-12 px-0 mb-5\">\n <valtimo-dossier-list-actions\n [loading]=\"!obs.loaded\"\n (formFlowComplete)=\"forceRefresh()\"\n ></valtimo-dossier-list-actions>\n <ng-container *ngTemplateOutlet=\"searchFields; context: {obs: obs}\"></ng-container>\n\n <ng-container *ngIf=\"obs.loaded; else loading\">\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"bulkAssignModal; context: {obs: obs}\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"changePageModal\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"changeTabModal\"></ng-container>\n</ng-container>\n\n<ng-template #searchFields let-obs=\"obs\">\n <div class=\"mb-3\">\n <valtimo-search-fields\n [searchFields]=\"obs.searchFields\"\n (doSearch)=\"search($event)\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [defaultValues]=\"searchFieldValues$ | async\"\n [inputDisabled]=\"!obs.loaded\"\n ></valtimo-search-fields>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-carbon-list\n [fields]=\"obs.fields\"\n [header]=\"false\"\n [initialSortState]=\"pagination.sort\"\n [items]=\"obs.documentItems\"\n [pagination]=\"pagination\"\n paginationIdentifier=\"dossierList\"\n [showSelectionColumn]=\"canHaveAssignee\"\n [tableTranslations]=\"tableTranslations\"\n (paginationClicked)=\"pageChange($event)\"\n (paginationSet)=\"pageSizeChange($event)\"\n (rowClicked)=\"rowClick($event)\"\n (sortChanged)=\"sortChanged($event)\"\n >\n <ng-container carbonToolbarActions>\n <button cdsButton=\"primary\" (click)=\"showAssignModal()\">\n {{ 'dossier.bulkAssign.assign' | translate }}\n </button>\n </ng-container>\n\n <div carbonToolbarContent>\n <ng-container *ngTemplateOutlet=\"dossierListActions\"></ng-container>\n </div>\n\n <valtimo-no-results\n [action]=\"obs.noResultsMessage.isSearchResult ? null : dossierListActions\"\n [description]=\"obs.noResultsMessage.description | translate\"\n [title]=\"obs.noResultsMessage.title | translate\"\n ></valtimo-no-results>\n\n <div tabs *ngIf=\"canHaveAssignee\">\n <ng-container *ngTemplateOutlet=\"tabs\"></ng-container>\n </div>\n </valtimo-carbon-list>\n</ng-template>\n\n<ng-template #tabs>\n <ng-container *ngIf=\"assigneeFilter$ | async as assigneeFilter\">\n <cds-tabs\n *ngIf=\"!visibleDossierTabs; else configuredTabs\"\n type=\"contained\"\n data-carbon-theme=\"g10\"\n class=\"dossier-list-tabs\"\n >\n <cds-tab\n *ngFor=\"let tab of defaultTabs; trackBy: trackByIndex\"\n [active]=\"assigneeFilter === tab\"\n heading=\"{{ 'dossier.tabs.' + tab | translate }}\"\n [id]=\"tab\"\n (selected)=\"tabChange(tab)\"\n ></cds-tab>\n </cds-tabs>\n </ng-container>\n</ng-template>\n\n<ng-template #configuredTabs>\n <ng-container *ngIf=\"assigneeFilter$ | async as assigneeFilter\">\n <cds-tabs type=\"contained\" class=\"dossier-list-tabs\">\n <cds-tab\n *ngFor=\"let tab of visibleDossierTabs; trackBy: trackByIndex\"\n [active]=\"assigneeFilter === tab\"\n heading=\"{{ 'dossier.tabs.' + tab | translate }}\"\n [id]=\"tab\"\n (selected)=\"tabChange(tab)\"\n ></cds-tab>\n </cds-tabs>\n </ng-container>\n</ng-template>\n\n<ng-template #loading\n ><valtimo-carbon-list [loading]=\"true\">\n <div tabs *ngIf=\"canHaveAssignee\">\n <ng-container *ngTemplateOutlet=\"tabs\"></ng-container>\n </div> </valtimo-carbon-list\n></ng-template>\n\n<ng-template #bulkAssignModal let-obs=\"obs\">\n <valtimo-dossier-bulk-assign-modal\n [documentIds]=\"obs.selectedDocumentIds\"\n [open]=\"obs.showAssignModal\"\n (closeEvent)=\"onCloseEvent($event, obs.selectedDocumentIds)\"\n ></valtimo-dossier-bulk-assign-modal>\n</ng-template>\n\n<ng-template #changePageModal>\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"dossier.changePageModal.confirm\"\n contentTranslationKey=\"dossier.changePageModal.content\"\n [outputOnConfirm]=\"paginationChange$ | async\"\n [showModalSubject$]=\"showChangePageModal$\"\n titleTranslationKey=\"dossier.changePageModal.title\"\n (confirmEvent)=\"onChangePageConfirm($event)\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #changeTabModal>\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"dossier.changeTabModal.confirm\"\n contentTranslationKey=\"dossier.changeTabModal.content\"\n [outputOnConfirm]=\"tabChange$ | async\"\n [showModalSubject$]=\"showChangeTabModal$\"\n titleTranslationKey=\"dossier.changeTabModal.title\"\n (cancelEvent)=\"onChangeTabCancel()\"\n (confirmEvent)=\"onChangeTabConfirm($event)\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #dossierListActions>\n <button\n cdsButton=\"primary\"\n [disabled]=\"listActionsComponent?.disableStartDossierButton$ | async\"\n (click)=\"startDossier()\"\n >\n {{ 'Start Dossier' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n</ng-template>\n", styles: [".dossier-list-tabs cds-tab{display:none}\n"] }]
360
+ }], ctorParameters: function () { return [{ type: i1.DossierListAssigneeService }, { type: i2.BreadcrumbService }, { type: i1.DossierBulkAssignService }, { type: i1.DossierColumnService }, { type: i3.ConfigService }, { type: i4.DocumentService }, { type: i1.DossierListService }, { type: i2.PageTitleService }, { type: i1.DossierListPaginationService }, { type: i1.DossierParameterService }, { type: i5.ActivatedRoute }, { type: i5.Router }, { type: i1.DossierListSearchService }, { type: i6.TranslateService }, { type: i7.PermissionService }]; }, propDecorators: { carbonList: [{
361
+ type: ViewChild,
362
+ args: [CarbonListComponent]
363
+ }], listActionsComponent: [{
364
+ type: ViewChild,
365
+ args: [DossierListActionsComponent]
366
+ }], tabsComponent: [{
367
+ type: ViewChild,
368
+ args: [Tabs]
369
+ }] } });
370
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci9zcmMvbGliL2NvbXBvbmVudHMvZG9zc2llci1saXN0L2Rvc3NpZXItbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2Rvc3NpZXIvc3JjL2xpYi9jb21wb25lbnRzL2Rvc3NpZXItbGlzdC9kb3NzaWVyLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxPQUFPLEVBQUMsU0FBUyxFQUFxQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFJdEUsT0FBTyxFQUVMLG1CQUFtQixHQU1wQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFLTCxjQUFjLEdBSWYsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBRUwsaUNBQWlDLEdBS2xDLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFNLElBQUksRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixRQUFRLEVBQ1IsR0FBRyxFQUVILEVBQUUsRUFFRixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBQ25HLE9BQU8sRUFBQywwQkFBMEIsRUFBRSxrQ0FBa0MsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pHLE9BQU8sRUFFTCxvQkFBb0IsRUFDcEIsMEJBQTBCLEVBQzFCLDRCQUE0QixFQUM1Qix3QkFB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SUFBSSxDQUN6QixjQUFjO1lBQ1osQ0FBQyxDQUFDO2dCQUNFLFdBQVcsRUFBRSxzQ0FBc0M7Z0JBQ25ELGNBQWM7Z0JBQ2QsS0FBSyxFQUFFLGdDQUFnQzthQUN4QztZQUNILENBQUMsQ0FBQztnQkFDRSxXQUFXLEVBQUUscUJBQXFCLElBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxjQUFjO2dCQUN2RSxjQUFjO2dCQUNkLEtBQUssRUFBRSxxQkFBcUIsSUFBSSxDQUFDLFNBQVMsSUFBSSxLQUFLLFFBQVE7YUFDNUQsQ0FDTixDQUFDO0lBQ0osQ0FBQzsrR0FoZVUsb0JBQW9CO21HQUFwQixvQkFBb0IsK0NBVHBCO1lBQ1Qsa0JBQWtCO1lBQ2xCLG9CQUFvQjtZQUNwQiwwQkFBMEI7WUFDMUIsdUJBQXVCO1lBQ3ZCLDRCQUE0QjtZQUM1Qix3QkFBd0I7U0FDekIsc0VBR1UsbUJBQW1CLHVGQUNuQiwyQkFBMkIsZ0ZBQzNCLElBQUksZ0RDM0ZqQixxOE1BMkxBOzs0RkRuR2Esb0JBQW9CO2tCQWJoQyxTQUFTOytCQUNFLHNCQUFzQixhQUdyQjt3QkFDVCxrQkFBa0I7d0JBQ2xCLG9CQUFvQjt3QkFDcEIsMEJBQTBCO3dCQUMxQix1QkFBdUI7d0JBQ3ZCLDRCQUE0Qjt3QkFDNUIsd0JBQXdCO3FCQUN6Qjs4akJBRytCLFVBQVU7c0JBQXpDLFNBQVM7dUJBQUMsbUJBQW1CO2dCQUNVLG9CQUFvQjtzQkFBM0QsU0FBUzt1QkFBQywyQkFBMkI7Z0JBQ3JCLGFBQWE7c0JBQTdCLFNBQVM7dUJBQUMsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIzIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge0NvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBQYXJhbXMsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1Blcm1pc3Npb25TZXJ2aWNlfSBmcm9tICdAdmFsdGltby9hY2Nlc3MtY29udHJvbCc7XG5pbXBvcnQge1xuICBCcmVhZGNydW1iU2VydmljZSxcbiAgQ2FyYm9uTGlzdENvbXBvbmVudCxcbiAgQ2FyYm9uTGlzdFRyYW5zbGF0aW9ucyxcbiAgQ2FyYm9uUGFnaW5hdGlvblNlbGVjdGlvbixcbiAgTGlzdEZpZWxkLFxuICBQYWdlVGl0bGVTZXJ2aWNlLFxuICBQYWdpbmF0aW9uLFxufSBmcm9tICdAdmFsdGltby9jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIEFzc2lnbmVlRmlsdGVyLFxuICBDb25maWdTZXJ2aWNlLFxuICBEZWZpbml0aW9uQ29sdW1uLFxuICBEaXJlY3Rpb24sXG4gIERvc3NpZXJMaXN0VGFiLFxuICBTZWFyY2hGaWVsZCxcbiAgU2VhcmNoRmllbGRWYWx1ZXMsXG4gIFNvcnRTdGF0ZSxcbn0gZnJvbSAnQHZhbHRpbW8vY29uZmlnJztcbmltcG9ydCB7XG4gIEFkdmFuY2VkRG9jdW1lbnRTZWFyY2hSZXF1ZXN0LFxuICBBZHZhbmNlZERvY3VtZW50U2VhcmNoUmVxdWVzdEltcGwsXG4gIERvY3VtZW50LFxuICBEb2N1bWVudHMsXG4gIERvY3VtZW50U2VydmljZSxcbiAgU3BlY2lmaWVkRG9jdW1lbnRzLFxufSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge1RhYiwgVGFic30gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG5pbXBvcnQge2lzRXF1YWx9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZvcmtKb2luLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBTdWJzY3JpcHRpb24sXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7RG9zc2llckxpc3RBY3Rpb25zQ29tcG9uZW50fSBmcm9tICcuLi9kb3NzaWVyLWxpc3QtYWN0aW9ucy9kb3NzaWVyLWxpc3QtYWN0aW9ucy5jb21wb25lbnQnO1xuaW1wb3J0IHtDQU5fQ1JFQVRFX0NBU0VfUEVSTUlTU0lPTiwgRE9TU0lFUl9ERVRBSUxfUEVSTUlTU0lPTl9SRVNPVVJDRX0gZnJvbSAnLi4vLi4vcGVybWlzc2lvbnMnO1xuaW1wb3J0IHtcbiAgRG9zc2llckJ1bGtBc3NpZ25TZXJ2aWNlLFxuICBEb3NzaWVyQ29sdW1uU2VydmljZSxcbiAgRG9zc2llckxpc3RBc3NpZ25lZVNlcnZpY2UsXG4gIERvc3NpZXJMaXN0UGFnaW5hdGlvblNlcnZpY2UsXG4gIERvc3NpZXJMaXN0U2VhcmNoU2VydmljZSxcbiAgRG9zc2llckxpc3RTZXJ2aWNlLFxuICBEb3NzaWVyUGFyYW1ldGVyU2VydmljZSxcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgRGVmYXVsdFRhYnMgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLWRvc3NpZXItbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kb3NzaWVyLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb3NzaWVyLWxpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgRG9zc2llckxpc3RTZXJ2aWNlLFxuICAgIERvc3NpZXJDb2x1bW5TZXJ2aWNlLFxuICAgIERvc3NpZXJMaXN0QXNzaWduZWVTZXJ2aWNlLFxuICAgIERvc3NpZXJQYXJhbWV0ZXJTZXJ2aWNlLFxuICAgIERvc3NpZXJMaXN0UGFnaW5hdGlvblNlcnZpY2UsXG4gICAgRG9zc2llckxpc3RTZWFyY2hTZXJ2aWNlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEb3NzaWVyTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZChDYXJib25MaXN0Q29tcG9uZW50KSBjYXJib25MaXN0OiBDYXJib25MaXN0Q29tcG9uZW50PERvY3VtZW50PjtcbiAgQFZpZXdDaGlsZChEb3NzaWVyTGlzdEFjdGlvbnNDb21wb25lbnQpIGxpc3RBY3Rpb25zQ29tcG9uZW50OiBEb3NzaWVyTGlzdEFjdGlvbnNDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoVGFicykgdGFic0NvbXBvbmVudDogVGFicztcblxuICBwdWJsaWMgYWN0aXZlVGFiOiBEb3NzaWVyTGlzdFRhYiA9IG51bGw7XG4gIHB1YmxpYyBsb2FkaW5nRmllbGRzID0gdHJ1ZTtcbiAgcHVibGljIGxvYWRpbmdQYWdpbmF0aW9uID0gdHJ1ZTtcbiAgcHVibGljIGxvYWRpbmdTZWFyY2hGaWVsZHMgPSB0cnVlO1xuICBwdWJsaWMgbG9hZGluZ0Fzc2lnbmVlRmlsdGVyID0gdHJ1ZTtcbiAgcHVibGljIGxvYWRpbmdEb2N1bWVudEl0ZW1zID0gdHJ1ZTtcbiAgcHVibGljIHBhZ2luYXRpb24hOiBQYWdpbmF0aW9uO1xuICBwdWJsaWMgY2FuSGF2ZUFzc2lnbmVlITogYm9vbGVhbjtcbiAgcHVibGljIHZpc2libGVEb3NzaWVyVGFiczogQXJyYXk8RG9zc2llckxpc3RUYWI+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRUYWJzOiBEb3NzaWVyTGlzdFRhYltdID0gW1xuICAgIERvc3NpZXJMaXN0VGFiLkFMTCxcbiAgICBEb3NzaWVyTGlzdFRhYi5NSU5FLFxuICAgIERvc3NpZXJMaXN0VGFiLk9QRU4sXG4gIF07XG5cbiAgcHVibGljIHJlYWRvbmx5IHRhYmxlVHJhbnNsYXRpb25zOiBDYXJib25MaXN0VHJhbnNsYXRpb25zID0ge1xuICAgIHNlbGVjdDoge1xuICAgICAgc2luZ2xlOiAnZG9zc2llci5zZWxlY3Quc2luZ2xlJyxcbiAgICAgIG11bHRpcGxlOiAnZG9zc2llci5zZWxlY3QubXVsdGlwbGUnLFxuICAgIH0sXG4gICAgcGFnaW5hdGlvbjoge1xuICAgICAgaXRlbXNQZXJQYWdlOiAnZG9zc2llci5wYWdpbmF0aW9uLml0ZW1zUGVyUGFnZScsXG4gICAgICB0b3RhbEl0ZW06ICdkb3NzaWVyLnBhZ2luYXRpb24udG90YWxJdGVtJyxcbiAgICAgIHRvdGFsSXRlbXM6ICdkb3NzaWVyLnBhZ2luYXRpb24udG90YWxJdGVtcycsXG4gICAgfSxcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbm9SZXN1bHRzTWVzc2FnZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGlzU2VhcmNoUmVzdWx0OiBib29sZWFuO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gIH0+KHtcbiAgICBkZXNjcmlwdGlvbjogJ2Rvc3NpZXIubm9SZXN1bHRzLkFMTC5kZXNjcmlwdGlvbicsXG4gICAgaXNTZWFyY2hSZXN1bHQ6IGZhbHNlLFxuICAgIHRpdGxlOiAnZG9zc2llci5ub1Jlc3VsdHMuQUxMLnRpdGxlJyxcbiAgfSk7XG4gIHB1YmxpYyByZWFkb25seSBzaG93QXNzaWduTW9kYWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBzaG93Q2hhbmdlUGFnZU1vZGFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgc2hvd0NoYW5nZVRhYk1vZGFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHB1YmxpYyByZWFkb25seSBzZWFyY2hGaWVsZHMkOiBPYnNlcnZhYmxlPEFycmF5PFNlYXJjaEZpZWxkPiB8IG51bGw+ID1cbiAgICB0aGlzLnNlYXJjaFNlcnZpY2UuZG9jdW1lbnRTZWFyY2hGaWVsZHMkLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdTZWFyY2hGaWVsZHMgPSBmYWxzZTtcbiAgICAgIH0pXG4gICAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgPSB0aGlzLmxpc3RTZXJ2aWNlLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkO1xuXG4gIHB1YmxpYyByZWFkb25seSBjYW5DcmVhdGVEb2N1bWVudCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUoXG4gICAgc3dpdGNoTWFwKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT5cbiAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UucmVxdWVzdFBlcm1pc3Npb24oQ0FOX0NSRUFURV9DQVNFX1BFUk1JU1NJT04sIHtcbiAgICAgICAgcmVzb3VyY2U6IERPU1NJRVJfREVUQUlMX1BFUk1JU1NJT05fUkVTT1VSQ0UuanNvblNjaGVtYURvY3VtZW50RGVmaW5pdGlvbixcbiAgICAgICAgaWRlbnRpZmllcjogZG9jdW1lbnREZWZpbml0aW9uTmFtZSxcbiAgICAgIH0pXG4gICAgKVxuICApO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0ZWREb2N1bWVudElkcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZ1tdPihbXSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHNjaGVtYSQgPSB0aGlzLmxpc3RTZXJ2aWNlLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUoXG4gICAgc3dpdGNoTWFwKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT5cbiAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldERvY3VtZW50RGVmaW5pdGlvbihkb2N1bWVudERlZmluaXRpb25OYW1lKVxuICAgICksXG4gICAgbWFwKGRvY3VtZW50RGVmaW5pdGlvbiA9PiBkb2N1bWVudERlZmluaXRpb24/LnNjaGVtYSksXG4gICAgdGFwKHNjaGVtYSA9PiB7XG4gICAgICBpZiAoc2NoZW1hPy50aXRsZSkge1xuICAgICAgICB0aGlzLnBhZ2VUaXRsZVNlcnZpY2Uuc2V0Q3VzdG9tUGFnZVRpdGxlKHNjaGVtYT8udGl0bGUsIHRydWUpO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHNlYXJjaEZpZWxkVmFsdWVzJCA9IHRoaXMucGFyYW1ldGVyU2VydmljZS5zZWFyY2hGaWVsZFZhbHVlcyQ7XG4gIHB1YmxpYyByZWFkb25seSBhc3NpZ25lZUZpbHRlciQ6IE9ic2VydmFibGU8QXNzaWduZWVGaWx0ZXI+ID1cbiAgICB0aGlzLmFzc2lnbmVlU2VydmljZS5hc3NpZ25lZUZpbHRlciQucGlwZShcbiAgICAgIHRhcChhc3NpZ25lZUZpbHRlciA9PiAodGhpcy5hY3RpdmVUYWIgPSBhc3NpZ25lZUZpbHRlciBhcyBEb3NzaWVyTGlzdFRhYikpXG4gICAgKTtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2luYXRpb25DaGFuZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDYXJib25QYWdpbmF0aW9uU2VsZWN0aW9uIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSB0YWJDaGFuZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEb3NzaWVyTGlzdFRhYiB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wYWdpbmF0aW9uJCA9IHRoaXMucGFnaW5hdGlvblNlcnZpY2UucGFnaW5hdGlvbiQucGlwZShcbiAgICB0YXAocGFnaW5hdGlvbiA9PiB7XG4gICAgICB0aGlzLnBhZ2luYXRpb24gPSBwYWdpbmF0aW9uO1xuICAgICAgdGhpcy5sb2FkaW5nUGFnaW5hdGlvbiA9IGZhbHNlO1xuICAgIH0pXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhc0VudkNvbHVtbkNvbmZpZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmxpc3RTZXJ2aWNlLmhhc0VudkNvbHVtbkNvbmZpZyQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhc0FwaUNvbHVtbkNvbmZpZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2FuSGF2ZUFzc2lnbmVlJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuYXNzaWduZWVTZXJ2aWNlLmNhbkhhdmVBc3NpZ25lZSQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbHVtbnMkOiBPYnNlcnZhYmxlPEFycmF5PERlZmluaXRpb25Db2x1bW4+PiA9XG4gICAgdGhpcy5saXN0U2VydmljZS5kb2N1bWVudERlZmluaXRpb25OYW1lJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT5cbiAgICAgICAgdGhpcy5jb2x1bW5TZXJ2aWNlLmdldERlZmluaXRpb25Db2x1bW5zKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUpXG4gICAgICApLFxuICAgICAgbWFwKHJlcyA9PiB7XG4gICAgICAgIHRoaXMuX2hhc0FwaUNvbHVtbkNvbmZpZyQubmV4dChyZXMuaGFzQXBpQ29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlcy5jb2x1bW5zO1xuICAgICAgfSksXG4gICAgICB0YXAoY29sdW1ucyA9PiB7XG4gICAgICAgIHRoaXMubGlzdFNlcnZpY2UuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5zZXRQYWdpbmF0aW9uKGNvbHVtbnMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZmllbGRzJDogT2JzZXJ2YWJsZTxBcnJheTxMaXN0RmllbGQ+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuX2NhbkhhdmVBc3NpZ25lZSQsXG4gICAgdGhpcy5fY29sdW1ucyQsXG4gICAgdGhpcy5faGFzRW52Q29sdW1uQ29uZmlnJCxcbiAgICB0aGlzLl9oYXNBcGlDb2x1bW5Db25maWckLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIHRhcCgoW2NhbkhhdmVBc3NpZ25lZV0pID0+IHtcbiAgICAgIHRoaXMuY2FuSGF2ZUFzc2lnbmVlID0gY2FuSGF2ZUFzc2lnbmVlO1xuICAgIH0pLFxuICAgIG1hcCgoW2NhbkhhdmVBc3NpZ25lZSwgY29sdW1ucywgaGFzRW52Q29uZmlnLCBoYXNBcGlDb25maWddKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJlZEFzc2lnbmVlQ29sdW1ucyA9IHRoaXMuYXNzaWduZWVTZXJ2aWNlLmZpbHRlckFzc2lnbmVlQ29sdW1ucyhcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAgY2FuSGF2ZUFzc2lnbmVlXG4gICAgICApO1xuICAgICAgY29uc3QgbGlzdEZpZWxkcyA9IHRoaXMuY29sdW1uU2VydmljZS5tYXBEZWZpbml0aW9uQ29sdW1uc1RvTGlzdEZpZWxkcyhcbiAgICAgICAgZmlsdGVyZWRBc3NpZ25lZUNvbHVtbnMsXG4gICAgICAgIGhhc0VudkNvbmZpZyxcbiAgICAgICAgaGFzQXBpQ29uZmlnXG4gICAgICApO1xuICAgICAgY29uc3QgZmllbGRzVG9SZXR1cm4gPSB0aGlzLmFzc2lnbmVlU2VydmljZS5hZGRBc3NpZ25lZUxpc3RGaWVsZChcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAgbGlzdEZpZWxkcyxcbiAgICAgICAgY2FuSGF2ZUFzc2lnbmVlXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gZmllbGRzVG9SZXR1cm47XG4gICAgfSksXG4gICAgdGFwKGxpc3RGaWVsZHMgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdExpc3RGaWVsZCA9IGxpc3RGaWVsZHMuZmluZChmaWVsZCA9PiBmaWVsZC5kZWZhdWx0KTtcbiAgICAgIC8vIHNldCBkZWZhdWx0IHNvcnQgc3RhdGUgaWYgbm8gcGFnaW5hdGlvbiBxdWVyeSBwYXJhbWV0ZXJzIGZvciBzb3J0aW5nIGFyZSBhdmFpbGFibGVcbiAgICAgIHRoaXMucGFyYW1ldGVyU2VydmljZS5xdWVyeVBhZ2luYXRpb25QYXJhbXMkXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUocXVlcnlQYWdpbmF0aW9uUGFyYW1zID0+IHtcbiAgICAgICAgICBpZiAoZGVmYXVsdExpc3RGaWVsZCAmJiAhcXVlcnlQYWdpbmF0aW9uUGFyYW1zPy5zb3J0Py5pc1NvcnRpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnREaXJlY3Rpb24gPVxuICAgICAgICAgICAgICB0eXBlb2YgZGVmYXVsdExpc3RGaWVsZC5kZWZhdWx0ID09PSAnc3RyaW5nJyA/IGRlZmF1bHRMaXN0RmllbGQuZGVmYXVsdCA6ICdERVNDJztcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2Uuc29ydENoYW5nZWQoe1xuICAgICAgICAgICAgICBpc1NvcnRpbmc6IHRydWUsXG4gICAgICAgICAgICAgIHN0YXRlOiB7bmFtZTogZGVmYXVsdExpc3RGaWVsZC5rZXksIGRpcmVjdGlvbjogc29ydERpcmVjdGlvbiBhcyBEaXJlY3Rpb259LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KSxcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nRmllbGRzID0gZmFsc2U7XG4gICAgfSlcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudFNlYXJjaFJlcXVlc3QkOiBPYnNlcnZhYmxlPEFkdmFuY2VkRG9jdW1lbnRTZWFyY2hSZXF1ZXN0PiA9XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5fcGFnaW5hdGlvbiQsIHRoaXMubGlzdFNlcnZpY2UuZG9jdW1lbnREZWZpbml0aW9uTmFtZSRdKS5waXBlKFxuICAgICAgZmlsdGVyKChbcGFnaW5hdGlvbl0pID0+ICEhcGFnaW5hdGlvbiksXG4gICAgICBtYXAoKFtwYWdpbmF0aW9uLCBkb2N1bWVudERlZmluaXRpb25OYW1lXSkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlID0gcGFnaW5hdGlvbi5wYWdlIC0gMTtcblxuICAgICAgICByZXR1cm4gbmV3IEFkdmFuY2VkRG9jdW1lbnRTZWFyY2hSZXF1ZXN0SW1wbChcbiAgICAgICAgICBkb2N1bWVudERlZmluaXRpb25OYW1lLFxuICAgICAgICAgIHBhZ2UgPj0gMCA/IHBhZ2UgOiAwLFxuICAgICAgICAgIHBhZ2luYXRpb24uc2l6ZSxcbiAgICAgICAgICBwYWdpbmF0aW9uLnNvcnRcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnRJdGVtcyQ6IE9ic2VydmFibGU8YW55W10+ID0gdGhpcy5saXN0U2VydmljZS5jaGVja1JlZnJlc2gkLnBpcGUoXG4gICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5fZG9jdW1lbnRTZWFyY2hSZXF1ZXN0JCxcbiAgICAgICAgdGhpcy5hc3NpZ25lZUZpbHRlciQsXG4gICAgICAgIHRoaXMuc2VhcmNoRmllbGRWYWx1ZXMkLFxuICAgICAgICB0aGlzLmxpc3RTZXJ2aWNlLmZvcmNlUmVmcmVzaCQsXG4gICAgICAgIHRoaXMuX2hhc0VudkNvbHVtbkNvbmZpZyQsXG4gICAgICAgIHRoaXMuX2hhc0FwaUNvbHVtbkNvbmZpZyQsXG4gICAgICBdKVxuICAgICksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoXG4gICAgICAoXG4gICAgICAgIFtwcmV2U2VhcmNoUmVxdWVzdCwgcHJldkFzc2lnbmVlRmlsdGVyLCBwcmV2U2VhcmNoRmllbGRWYWx1ZXMsIHByZXZGb3JjZVJlZnJlc2hdLFxuICAgICAgICBbY3VyclNlYXJjaFJlcXVlc3QsIGN1cnJBc3NpZ25lZUZpbHRlciwgY3VyclNlYXJjaEZpZWxkVmFsdWVzLCBjdXJyRm9yY2VSZWZyZXNoXVxuICAgICAgKSA9PlxuICAgICAgICBpc0VxdWFsKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnByZXZTZWFyY2hSZXF1ZXN0LFxuICAgICAgICAgICAgYXNzaWduZWU6IHByZXZBc3NpZ25lZUZpbHRlcixcbiAgICAgICAgICAgIC4uLnByZXZTZWFyY2hGaWVsZFZhbHVlcyxcbiAgICAgICAgICAgIGZvcmNlUmVmcmVzaDogcHJldkZvcmNlUmVmcmVzaCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmN1cnJTZWFyY2hSZXF1ZXN0LFxuICAgICAgICAgICAgYXNzaWduZWU6IGN1cnJBc3NpZ25lZUZpbHRlcixcbiAgICAgICAgICAgIC4uLmN1cnJTZWFyY2hGaWVsZFZhbHVlcyxcbiAgICAgICAgICAgIGZvcmNlUmVmcmVzaDogY3VyckZvcmNlUmVmcmVzaCxcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICApLFxuICAgIHN3aXRjaE1hcChcbiAgICAgIChbXG4gICAgICAgIGRvY3VtZW50U2VhcmNoUmVxdWVzdCxcbiAgICAgICAgYXNzaWduZWVGaWx0ZXIsXG4gICAgICAgIHNlYXJjaFZhbHVlcyxcbiAgICAgICAgXyxcbiAgICAgICAgaGFzRW52Q29sdW1uQ29uZmlnLFxuICAgICAgICBoYXNBcGlDb2x1bW5Db25maWcsXG4gICAgICBdKSA9PiB7XG4gICAgICAgIGNvbnN0IG9ic0VudjogT2JzZXJ2YWJsZTxib29sZWFuPiA9IG9mKGhhc0VudkNvbHVtbkNvbmZpZyk7XG4gICAgICAgIGNvbnN0IG9ic0FwaTogT2JzZXJ2YWJsZTxib29sZWFuPiA9IG9mKGhhc0FwaUNvbHVtbkNvbmZpZyk7XG5cbiAgICAgICAgaWYgKChPYmplY3Qua2V5cyhzZWFyY2hWYWx1ZXMpIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGZvcmtKb2luKHtcbiAgICAgICAgICAgIGRvY3VtZW50czpcbiAgICAgICAgICAgICAgaGFzRW52Q29sdW1uQ29uZmlnIHx8ICFoYXNBcGlDb2x1bW5Db25maWdcbiAgICAgICAgICAgICAgICA/IHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldERvY3VtZW50c1NlYXJjaChcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRTZWFyY2hSZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgICAnQU5EJyxcbiAgICAgICAgICAgICAgICAgICAgYXNzaWduZWVGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5tYXBTZWFyY2hWYWx1ZXNUb0ZpbHRlcnMoc2VhcmNoVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0U3BlY2lmaWVkRG9jdW1lbnRzU2VhcmNoKFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudFNlYXJjaFJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgICdBTkQnLFxuICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZUZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLm1hcFNlYXJjaFZhbHVlc1RvRmlsdGVycyhzZWFyY2hWYWx1ZXMpXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgaGFzRW52Q29sdW1uQ29uZmlnOiBvYnNFbnYsXG4gICAgICAgICAgICBoYXNBcGlDb2x1bW5Db25maWc6IG9ic0FwaSxcbiAgICAgICAgICAgIGlzU2VhcmNoUmVzdWx0OiBvZih0cnVlKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JrSm9pbih7XG4gICAgICAgICAgZG9jdW1lbnRzOlxuICAgICAgICAgICAgaGFzRW52Q29sdW1uQ29uZmlnIHx8ICFoYXNBcGlDb2x1bW5Db25maWdcbiAgICAgICAgICAgICAgPyB0aGlzLmRvY3VtZW50U2VydmljZS5nZXREb2N1bWVudHNTZWFyY2goXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFNlYXJjaFJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAnQU5EJyxcbiAgICAgICAgICAgICAgICAgIGFzc2lnbmVlRmlsdGVyXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldFNwZWNpZmllZERvY3VtZW50c1NlYXJjaChcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50U2VhcmNoUmVxdWVzdCxcbiAgICAgICAgICAgICAgICAgICdBTkQnLFxuICAgICAgICAgICAgICAgICAgYXNzaWduZWVGaWx0ZXJcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgIGhhc0VudkNvbHVtbkNvbmZpZzogb2JzRW52LFxuICAgICAgICAgIGhhc0FwaUNvbHVtbkNvbmZpZzogb2JzQXBpLFxuICAgICAgICAgIGlzU2VhcmNoUmVzdWx0OiBvZihmYWxzZSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICksXG4gICAgbWFwKFxuICAgICAgKHJlczoge1xuICAgICAgICBkb2N1bWVudHM6IERvY3VtZW50cyB8IFNwZWNpZmllZERvY3VtZW50cztcbiAgICAgICAgaGFzRW52Q29sdW1uQ29uZmlnOiBib29sZWFuO1xuICAgICAgICBoYXNBcGlDb2x1bW5Db25maWc6IGJvb2xlYW47XG4gICAgICAgIGlzU2VhcmNoUmVzdWx0OiBib29sZWFuO1xuICAgICAgfSkgPT4ge1xuICAgICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnNldENvbGxlY3Rpb25TaXplKHJlcy5kb2N1bWVudHMpO1xuICAgICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmNoZWNrUGFnZShyZXMuZG9jdW1lbnRzKTtcbiAgICAgICAgdGhpcy51cGRhdGVOb1Jlc3VsdHNNZXNzYWdlKHJlcy5pc1NlYXJjaFJlc3VsdCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdFNlcnZpY2UubWFwRG9jdW1lbnRzKFxuICAgICAgICAgIHJlcy5kb2N1bWVudHMsXG4gICAgICAgICAgcmVzLmhhc0VudkNvbHVtbkNvbmZpZyxcbiAgICAgICAgICByZXMuaGFzQXBpQ29sdW1uQ29uZmlnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgKSxcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nQXNzaWduZWVGaWx0ZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMubG9hZGluZ0RvY3VtZW50SXRlbXMgPSBmYWxzZTtcbiAgICB9KVxuICApO1xuXG4gIHByaXZhdGUgX3ByZXZpb3VzRG9jdW1lbnREZWZpbml0aW9uTmFtZSE6IHN0cmluZztcbiAgcHJpdmF0ZSBfZG9jdW1lbnREZWZpbml0aW9uTmFtZVN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFzc2lnbmVlU2VydmljZTogRG9zc2llckxpc3RBc3NpZ25lZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBicmVhZGNydW1iU2VydmljZTogQnJlYWRjcnVtYlNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBidWxrQXNzaWduU2VydmljZTogRG9zc2llckJ1bGtBc3NpZ25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29sdW1uU2VydmljZTogRG9zc2llckNvbHVtblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRTZXJ2aWNlOiBEb2N1bWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsaXN0U2VydmljZTogRG9zc2llckxpc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnZVRpdGxlU2VydmljZTogUGFnZVRpdGxlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2luYXRpb25TZXJ2aWNlOiBEb3NzaWVyTGlzdFBhZ2luYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyYW1ldGVyU2VydmljZTogRG9zc2llclBhcmFtZXRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlYXJjaFNlcnZpY2U6IERvc3NpZXJMaXN0U2VhcmNoU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uU2VydmljZTogUGVybWlzc2lvblNlcnZpY2VcbiAgKSB7fVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldFZpc2libGVUYWJzKCk7XG4gICAgdGhpcy5vcGVuRG9jdW1lbnREZWZpbml0aW9uTmFtZVN1YnNjcmlwdGlvbigpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2RvY3VtZW50RGVmaW5pdGlvbk5hbWVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5wYWdlVGl0bGVTZXJ2aWNlLmVuYWJsZVJlc2V0KCk7XG4gIH1cblxuICBwdWJsaWMgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2goc2VhcmNoRmllbGRWYWx1ZXM6IFNlYXJjaEZpZWxkVmFsdWVzKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaChzZWFyY2hGaWVsZFZhbHVlcyk7XG4gIH1cblxuICBwdWJsaWMgcm93Q2xpY2soZG9jdW1lbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubGlzdFNlcnZpY2UuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PiB7XG4gICAgICB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLmNhY2hlUXVlcnlQYXJhbXMoXG4gICAgICAgIGAvZG9zc2llcnMvJHtkb2N1bWVudERlZmluaXRpb25OYW1lfWAsXG4gICAgICAgIHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNcbiAgICAgICk7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXG4gICAgICAgIGAvZG9zc2llcnMvJHtkb2N1bWVudERlZmluaXRpb25OYW1lfS9kb2N1bWVudC8ke2RvY3VtZW50LmlkfWAsXG4gICAgICBdKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB0YWJDaGFuZ2UodGFiOiBEb3NzaWVyTGlzdFRhYik6IHZvaWQge1xuICAgIGlmICghdGhpcy5hY3RpdmVUYWIpIHtcbiAgICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiO1xuICAgICAgdGhpcy51cGRhdGVOb1Jlc3VsdHNNZXNzYWdlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVUYWIudG9Mb3dlckNhc2UoKSA9PT0gdGFiLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYXJib25MaXN0Lm1vZGVsLnNlbGVjdGVkUm93c0NvdW50KCkpIHtcbiAgICAgIHRoaXMuc2hvd0NoYW5nZVRhYk1vZGFsJC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy50YWJDaGFuZ2UkLm5leHQodGFiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ2hhbmdlVGFiQ29uZmlybSh0YWIpO1xuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlVGFiQ2FuY2VsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50YWJzQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJldlRhYjogVGFiIHwgdW5kZWZpbmVkID0gdGhpcy50YWJzQ29tcG9uZW50LnRhYnMuZmluZChcbiAgICAgICh0YWI6IFRhYikgPT4gdGFiLmlkID09PSB0aGlzLmFjdGl2ZVRhYlxuICAgICk7XG5cbiAgICBpZiAoIXByZXZUYWIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnRhYnNDb21wb25lbnQudGFicy5maW5kKCh0YWI6IFRhYikgPT4gdGFiLmFjdGl2ZSkuYWN0aXZlID0gZmFsc2U7XG4gICAgcHJldlRhYi5hY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIHBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FyYm9uTGlzdD8ubW9kZWwuc2VsZWN0ZWRSb3dzQ291bnQoKSkge1xuICAgICAgdGhpcy5zaG93Q2hhbmdlUGFnZU1vZGFsJC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5wYWdpbmF0aW9uQ2hhbmdlJC5uZXh0KHtwYWdlLCBzaXplOiB0aGlzLnBhZ2luYXRpb24uc2l6ZX0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnBhZ2VDaGFuZ2UocGFnZSk7XG4gIH1cblxuICBwdWJsaWMgcGFnZVNpemVDaGFuZ2Uoc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FyYm9uTGlzdD8ubW9kZWwuc2VsZWN0ZWRSb3dzQ291bnQoKSkge1xuICAgICAgdGhpcy5zaG93Q2hhbmdlUGFnZU1vZGFsJC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5wYWdpbmF0aW9uQ2hhbmdlJC5uZXh0KHtwYWdlOiB0aGlzLnBhZ2luYXRpb24ucGFnZSwgc2l6ZX0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnBhZ2VTaXplQ2hhbmdlKHNpemUpO1xuICB9XG5cbiAgcHVibGljIHNvcnRDaGFuZ2VkKG5ld1NvcnRTdGF0ZTogU29ydFN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5zb3J0Q2hhbmdlZChuZXdTb3J0U3RhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZVRhYkNvbmZpcm0odGFiOiBEb3NzaWVyTGlzdFRhYik6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZ0Fzc2lnbmVlRmlsdGVyID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjtcbiAgICB0aGlzLnVwZGF0ZU5vUmVzdWx0c01lc3NhZ2UoZmFsc2UpO1xuICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2Uuc2V0UGFnZSgxKTtcbiAgICB0aGlzLmFzc2lnbmVlU2VydmljZS5zZXRBc3NpZ25lZUZpbHRlcih0YWIpO1xuICB9XG5cbiAgcHVibGljIHNob3dBc3NpZ25Nb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkRG9jdW1lbnRJZHMkLm5leHQoXG4gICAgICB0aGlzLmNhcmJvbkxpc3Quc2VsZWN0ZWRJdGVtcy5tYXAoKGRvY3VtZW50OiBEb2N1bWVudCkgPT4gZG9jdW1lbnQuaWQpXG4gICAgKTtcbiAgICB0aGlzLnNob3dBc3NpZ25Nb2RhbCQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsb3NlRXZlbnQoYXNzaWduZWVJZDogbnVsbCB8IHN0cmluZywgZG9jdW1lbnRJZHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5zaG93QXNzaWduTW9kYWwkLm5leHQoZmFsc2UpO1xuICAgIGlmICghYXNzaWduZWVJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVsa0Fzc2lnblNlcnZpY2UuYnVsa0Fzc2lnbihhc3NpZ25lZUlkLCBkb2N1bWVudElkcykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZm9yY2VSZWZyZXNoKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25DaGFuZ2VQYWdlQ29uZmlybShwYWdpbmF0aW9uOiBDYXJib25QYWdpbmF0aW9uU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKHBhZ2luYXRpb24uc2l6ZSAhPT0gdGhpcy5wYWdpbmF0aW9uLnNpemUpIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UucGFnZVNpemVDaGFuZ2UocGFnaW5hdGlvbi5zaXplKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnBhZ2VDaGFuZ2UocGFnaW5hdGlvbi5wYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGFydERvc3NpZXIoKTogdm9pZCB7XG4gICAgdGhpcy5saXN0QWN0aW9uc0NvbXBvbmVudC5zdGFydERvc3NpZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBmb3JjZVJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5saXN0U2VydmljZS5mb3JjZVJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkRvY3VtZW50RGVmaW5pdGlvbk5hbWVTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGUucGFyYW1zXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChwYXJhbXM6IFBhcmFtcykgPT4gcGFyYW1zPy5kb2N1bWVudERlZmluaXRpb25OYW1lKSxcbiAgICAgICAgZmlsdGVyKGRvY0RlZk5hbWUgPT4gISFkb2NEZWZOYW1lKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShkb2N1bWVudERlZmluaXRvbk5hbWUgPT4ge1xuICAgICAgICBpZiAodGhpcy5fcHJldmlvdXNEb2N1bWVudERlZmluaXRpb25OYW1lKSB7XG4gICAgICAgICAgdGhpcy5wYXJhbWV0ZXJTZXJ2aWNlLmNsZWFyUGFyYW1ldGVycygpO1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVyU2VydmljZS5jbGVhclNlYXJjaEZpZWxkVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcHJldmlvdXNEb2N1bWVudERlZmluaXRpb25OYW1lID0gZG9jdW1lbnREZWZpbml0b25OYW1lO1xuICAgICAgICB0aGlzLnNldExvYWRpbmcoKTtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5jbGVhclBhZ2luYXRpb24oKTtcbiAgICAgICAgdGhpcy5hc3NpZ25lZVNlcnZpY2UucmVzZXRBc3NpZ25lZUZpbHRlcigpO1xuICAgICAgICB0aGlzLmxpc3RTZXJ2aWNlLnNldERvY3VtZW50RGVmaW5pdGlvbk5hbWUoZG9jdW1lbnREZWZpbml0b25OYW1lKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRMb2FkaW5nKCk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZ0ZpZWxkcyA9IHRydWU7XG4gICAgdGhpcy5sb2FkaW5nUGFnaW5hdGlvbiA9IHRydWU7XG4gICAgdGhpcy5sb2FkaW5nU2VhcmNoRmllbGRzID0gdHJ1ZTtcbiAgICB0aGlzLmxvYWRpbmdBc3NpZ25lZUZpbHRlciA9IHRydWU7XG4gICAgdGhpcy5sb2FkaW5nRG9jdW1lbnRJdGVtcyA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNldFZpc2libGVUYWJzKCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZURvc3NpZXJUYWJzID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZz8udmlzaWJsZURvc3NpZXJMaXN0VGFicyB8fCBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVOb1Jlc3VsdHNNZXNzYWdlKGlzU2VhcmNoUmVzdWx0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5ub1Jlc3VsdHNNZXNzYWdlJC5uZXh0KFxuICAgICAgaXNTZWFyY2hSZXN1bHRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ2Rvc3NpZXIubm9SZXN1bHRzLnNlYXJjaC5kZXNjcmlwdGlvbicsXG4gICAgICAgICAgICBpc1NlYXJjaFJlc3VsdCxcbiAgICAgICAgICAgIHRpdGxlOiAnZG9zc2llci5ub1Jlc3VsdHMuc2VhcmNoLnRpdGxlJyxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBkb3NzaWVyLm5vUmVzdWx0cy4ke3RoaXMuYWN0aXZlVGFiID8/ICdBTEwnfS5kZXNjcmlwdGlvbmAsXG4gICAgICAgICAgICBpc1NlYXJjaFJlc3VsdCxcbiAgICAgICAgICAgIHRpdGxlOiBgZG9zc2llci5ub1Jlc3VsdHMuJHt0aGlzLmFjdGl2ZVRhYiA/PyAnQUxMJ30udGl0bGVgLFxuICAgICAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJ7XG4gICAgZmllbGRzOiBmaWVsZHMkIHwgYXN5bmMsXG4gICAgZG9jdW1lbnRJdGVtczogZG9jdW1lbnRJdGVtcyQgfCBhc3luYyxcbiAgICBub1Jlc3VsdHNNZXNzYWdlOiBub1Jlc3VsdHNNZXNzYWdlJCB8IGFzeW5jLFxuICAgIHNlYXJjaEZpZWxkczogc2VhcmNoRmllbGRzJCB8IGFzeW5jLFxuICAgIHNjaGVtYTogc2NoZW1hJCB8IGFzeW5jLFxuICAgIHNob3dBc3NpZ25Nb2RhbDogc2hvd0Fzc2lnbk1vZGFsJCB8IGFzeW5jLFxuICAgIHNlbGVjdGVkRG9jdW1lbnRJZHM6IHNlbGVjdGVkRG9jdW1lbnRJZHMkIHwgYXN5bmMsXG4gICAgbG9hZGVkOlxuICAgICAgIWxvYWRpbmdGaWVsZHMgJiZcbiAgICAgICFsb2FkaW5nUGFnaW5hdGlvbiAmJlxuICAgICAgIWxvYWRpbmdTZWFyY2hGaWVsZHMgJiZcbiAgICAgICFsb2FkaW5nQXNzaWduZWVGaWx0ZXIgJiZcbiAgICAgICFsb2FkaW5nRG9jdW1lbnRJdGVtc1xuICB9IGFzIG9ic1wiXG4+XG4gIDxkaXYgY2xhc3M9XCJtYWluLWNvbnRlbnQgcHQtMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgcHgtMCBtYi01XCI+XG4gICAgICAgIDx2YWx0aW1vLWRvc3NpZXItbGlzdC1hY3Rpb25zXG4gICAgICAgICAgW2xvYWRpbmddPVwiIW9icy5sb2FkZWRcIlxuICAgICAgICAgIChmb3JtRmxvd0NvbXBsZXRlKT1cImZvcmNlUmVmcmVzaCgpXCJcbiAgICAgICAgPjwvdmFsdGltby1kb3NzaWVyLWxpc3QtYWN0aW9ucz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlYXJjaEZpZWxkczsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvYnMubG9hZGVkOyBlbHNlIGxvYWRpbmdcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdDsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnVsa0Fzc2lnbk1vZGFsOyBjb250ZXh0OiB7b2JzOiBvYnN9XCI+PC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoYW5nZVBhZ2VNb2RhbFwiPjwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaGFuZ2VUYWJNb2RhbFwiPjwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjc2VhcmNoRmllbGRzIGxldC1vYnM9XCJvYnNcIj5cbiAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICA8dmFsdGltby1zZWFyY2gtZmllbGRzXG4gICAgICBbc2VhcmNoRmllbGRzXT1cIm9icy5zZWFyY2hGaWVsZHNcIlxuICAgICAgKGRvU2VhcmNoKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgIFtkb2N1bWVudERlZmluaXRpb25OYW1lXT1cImRvY3VtZW50RGVmaW5pdGlvbk5hbWUkIHwgYXN5bmNcIlxuICAgICAgW2RlZmF1bHRWYWx1ZXNdPVwic2VhcmNoRmllbGRWYWx1ZXMkIHwgYXN5bmNcIlxuICAgICAgW2lucHV0RGlzYWJsZWRdPVwiIW9icy5sb2FkZWRcIlxuICAgID48L3ZhbHRpbW8tc2VhcmNoLWZpZWxkcz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3QgbGV0LW9icz1cIm9ic1wiPlxuICA8dmFsdGltby1jYXJib24tbGlzdFxuICAgIFtmaWVsZHNdPVwib2JzLmZpZWxkc1wiXG4gICAgW2hlYWRlcl09XCJmYWxzZVwiXG4gICAgW2luaXRpYWxTb3J0U3RhdGVdPVwicGFnaW5hdGlvbi5zb3J0XCJcbiAgICBbaXRlbXNdPVwib2JzLmRvY3VtZW50SXRlbXNcIlxuICAgIFtwYWdpbmF0aW9uXT1cInBhZ2luYXRpb25cIlxuICAgIHBhZ2luYXRpb25JZGVudGlmaWVyPVwiZG9zc2llckxpc3RcIlxuICAgIFtzaG93U2VsZWN0aW9uQ29sdW1uXT1cImNhbkhhdmVBc3NpZ25lZVwiXG4gICAgW3RhYmxlVHJhbnNsYXRpb25zXT1cInRhYmxlVHJhbnNsYXRpb25zXCJcbiAgICAocGFnaW5hdGlvbkNsaWNrZWQpPVwicGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAocGFnaW5hdGlvblNldCk9XCJwYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAocm93Q2xpY2tlZCk9XCJyb3dDbGljaygkZXZlbnQpXCJcbiAgICAoc29ydENoYW5nZWQpPVwic29ydENoYW5nZWQoJGV2ZW50KVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyIGNhcmJvblRvb2xiYXJBY3Rpb25zPlxuICAgICAgPGJ1dHRvbiBjZHNCdXR0b249XCJwcmltYXJ5XCIgKGNsaWNrKT1cInNob3dBc3NpZ25Nb2RhbCgpXCI+XG4gICAgICAgIHt7ICdkb3NzaWVyLmJ1bGtBc3NpZ24uYXNzaWduJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNhcmJvblRvb2xiYXJDb250ZW50PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRvc3NpZXJMaXN0QWN0aW9uc1wiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPHZhbHRpbW8tbm8tcmVzdWx0c1xuICAgICAgW2FjdGlvbl09XCJvYnMubm9SZXN1bHRzTWVzc2FnZS5pc1NlYXJjaFJlc3VsdCA/IG51bGwgOiBkb3NzaWVyTGlzdEFjdGlvbnNcIlxuICAgICAgW2Rlc2NyaXB0aW9uXT1cIm9icy5ub1Jlc3VsdHNNZXNzYWdlLmRlc2NyaXB0aW9uIHwgdHJhbnNsYXRlXCJcbiAgICAgIFt0aXRsZV09XCJvYnMubm9SZXN1bHRzTWVzc2FnZS50aXRsZSB8IHRyYW5zbGF0ZVwiXG4gICAgPjwvdmFsdGltby1uby1yZXN1bHRzPlxuXG4gICAgPGRpdiB0YWJzICpuZ0lmPVwiY2FuSGF2ZUFzc2lnbmVlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFic1wiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L3ZhbHRpbW8tY2FyYm9uLWxpc3Q+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RhYnM+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJhc3NpZ25lZUZpbHRlciQgfCBhc3luYyBhcyBhc3NpZ25lZUZpbHRlclwiPlxuICAgIDxjZHMtdGFic1xuICAgICAgKm5nSWY9XCIhdmlzaWJsZURvc3NpZXJUYWJzOyBlbHNlIGNvbmZpZ3VyZWRUYWJzXCJcbiAgICAgIHR5cGU9XCJjb250YWluZWRcIlxuICAgICAgZGF0YS1jYXJib24tdGhlbWU9XCJnMTBcIlxuICAgICAgY2xhc3M9XCJkb3NzaWVyLWxpc3QtdGFic1wiXG4gICAgPlxuICAgICAgPGNkcy10YWJcbiAgICAgICAgKm5nRm9yPVwibGV0IHRhYiBvZiBkZWZhdWx0VGFiczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgICAgW2FjdGl2ZV09XCJhc3NpZ25lZUZpbHRlciA9PT0gdGFiXCJcbiAgICAgICAgaGVhZGluZz1cInt7ICdkb3NzaWVyLnRhYnMuJyArIHRhYiB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIFtpZF09XCJ0YWJcIlxuICAgICAgICAoc2VsZWN0ZWQpPVwidGFiQ2hhbmdlKHRhYilcIlxuICAgICAgPjwvY2RzLXRhYj5cbiAgICA8L2Nkcy10YWJzPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29uZmlndXJlZFRhYnM+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJhc3NpZ25lZUZpbHRlciQgfCBhc3luYyBhcyBhc3NpZ25lZUZpbHRlclwiPlxuICAgIDxjZHMtdGFicyB0eXBlPVwiY29udGFpbmVkXCIgY2xhc3M9XCJkb3NzaWVyLWxpc3QtdGFic1wiPlxuICAgICAgPGNkcy10YWJcbiAgICAgICAgKm5nRm9yPVwibGV0IHRhYiBvZiB2aXNpYmxlRG9zc2llclRhYnM7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgIFthY3RpdmVdPVwiYXNzaWduZWVGaWx0ZXIgPT09IHRhYlwiXG4gICAgICAgIGhlYWRpbmc9XCJ7eyAnZG9zc2llci50YWJzLicgKyB0YWIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBbaWRdPVwidGFiXCJcbiAgICAgICAgKHNlbGVjdGVkKT1cInRhYkNoYW5nZSh0YWIpXCJcbiAgICAgID48L2Nkcy10YWI+XG4gICAgPC9jZHMtdGFicz5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmdcbiAgPjx2YWx0aW1vLWNhcmJvbi1saXN0IFtsb2FkaW5nXT1cInRydWVcIj5cbiAgICA8ZGl2IHRhYnMgKm5nSWY9XCJjYW5IYXZlQXNzaWduZWVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJzXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+IDwvdmFsdGltby1jYXJib24tbGlzdFxuPjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYnVsa0Fzc2lnbk1vZGFsIGxldC1vYnM9XCJvYnNcIj5cbiAgPHZhbHRpbW8tZG9zc2llci1idWxrLWFzc2lnbi1tb2RhbFxuICAgIFtkb2N1bWVudElkc109XCJvYnMuc2VsZWN0ZWREb2N1bWVudElkc1wiXG4gICAgW29wZW5dPVwib2JzLnNob3dBc3NpZ25Nb2RhbFwiXG4gICAgKGNsb3NlRXZlbnQpPVwib25DbG9zZUV2ZW50KCRldmVudCwgb2JzLnNlbGVjdGVkRG9jdW1lbnRJZHMpXCJcbiAgPjwvdmFsdGltby1kb3NzaWVyLWJ1bGstYXNzaWduLW1vZGFsPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjaGFuZ2VQYWdlTW9kYWw+XG4gIDx2YWx0aW1vLWNvbmZpcm1hdGlvbi1tb2RhbFxuICAgIGNvbmZpcm1CdXR0b25UZXh0VHJhbnNsYXRpb25LZXk9XCJkb3NzaWVyLmNoYW5nZVBhZ2VNb2RhbC5jb25maXJtXCJcbiAgICBjb250ZW50VHJhbnNsYXRpb25LZXk9XCJkb3NzaWVyLmNoYW5nZVBhZ2VNb2RhbC5jb250ZW50XCJcbiAgICBbb3V0cHV0T25Db25maXJtXT1cInBhZ2luYXRpb25DaGFuZ2UkIHwgYXN5bmNcIlxuICAgIFtzaG93TW9kYWxTdWJqZWN0JF09XCJzaG93Q2hhbmdlUGFnZU1vZGFsJFwiXG4gICAgdGl0bGVUcmFuc2xhdGlvbktleT1cImRvc3NpZXIuY2hhbmdlUGFnZU1vZGFsLnRpdGxlXCJcbiAgICAoY29uZmlybUV2ZW50KT1cIm9uQ2hhbmdlUGFnZUNvbmZpcm0oJGV2ZW50KVwiXG4gID48L3ZhbHRpbW8tY29uZmlybWF0aW9uLW1vZGFsPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjaGFuZ2VUYWJNb2RhbD5cbiAgPHZhbHRpbW8tY29uZmlybWF0aW9uLW1vZGFsXG4gICAgY29uZmlybUJ1dHRvblRleHRUcmFuc2xhdGlvbktleT1cImRvc3NpZXIuY2hhbmdlVGFiTW9kYWwuY29uZmlybVwiXG4gICAgY29udGVudFRyYW5zbGF0aW9uS2V5PVwiZG9zc2llci5jaGFuZ2VUYWJNb2RhbC5jb250ZW50XCJcbiAgICBbb3V0cHV0T25Db25maXJtXT1cInRhYkNoYW5nZSQgfCBhc3luY1wiXG4gICAgW3Nob3dNb2RhbFN1YmplY3QkXT1cInNob3dDaGFuZ2VUYWJNb2RhbCRcIlxuICAgIHRpdGxlVHJhbnNsYXRpb25LZXk9XCJkb3NzaWVyLmNoYW5nZVRhYk1vZGFsLnRpdGxlXCJcbiAgICAoY2FuY2VsRXZlbnQpPVwib25DaGFuZ2VUYWJDYW5jZWwoKVwiXG4gICAgKGNvbmZpcm1FdmVudCk9XCJvbkNoYW5nZVRhYkNvbmZpcm0oJGV2ZW50KVwiXG4gID48L3ZhbHRpbW8tY29uZmlybWF0aW9uLW1vZGFsPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkb3NzaWVyTGlzdEFjdGlvbnM+XG4gIDxidXR0b25cbiAgICBjZHNCdXR0b249XCJwcmltYXJ5XCJcbiAgICBbZGlzYWJsZWRdPVwibGlzdEFjdGlvbnNDb21wb25lbnQ/LmRpc2FibGVTdGFydERvc3NpZXJCdXR0b24kIHwgYXN5bmNcIlxuICAgIChjbGljayk9XCJzdGFydERvc3NpZXIoKVwiXG4gID5cbiAgICB7eyAnU3RhcnQgRG9zc2llcicgfCB0cmFuc2xhdGUgfX1cblxuICAgIDxzdmcgY2RzSWNvbj1cImFkZFwiIHNpemU9XCIxNlwiIGNsYXNzPVwiY2RzLS1idG5fX2ljb25cIj48L3N2Zz5cbiAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuIl19