@alfresco/adf-process-services-cloud 8.1.0-16500060130 → 8.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 (186) hide show
  1. package/bundles/assets/adf-process-services-cloud/i18n/de.json +0 -3
  2. package/bundles/assets/adf-process-services-cloud/i18n/es.json +0 -3
  3. package/bundles/assets/adf-process-services-cloud/i18n/fr.json +0 -3
  4. package/bundles/assets/adf-process-services-cloud/i18n/it.json +0 -3
  5. package/bundles/assets/adf-process-services-cloud/i18n/pl.json +0 -3
  6. package/bundles/assets/adf-process-services-cloud/i18n/pt.json +0 -3
  7. package/fesm2022/adf-process-services-cloud.mjs +490 -410
  8. package/fesm2022/adf-process-services-cloud.mjs.map +1 -1
  9. package/lib/app/services/apps-process-cloud.service.d.ts +2 -2
  10. package/lib/form/components/widgets/display-rich-text/display-rich-text.widget.scss +0 -1
  11. package/lib/process/start-process/components/start-process-cloud.component.d.ts +0 -1
  12. package/lib/process/start-process/components/start-process-cloud.component.scss +4 -0
  13. package/lib/process/start-process/services/start-process-cloud.service.d.ts +1 -0
  14. package/lib/process-services-cloud.module.d.ts +2 -1
  15. package/lib/screen/components/screen-cloud/screen-cloud.component.d.ts +1 -1
  16. package/lib/screen/public-api.d.ts +3 -1
  17. package/lib/screen/services/provide-screen.d.ts +37 -0
  18. package/lib/{services → screen/services}/screen-rendering.service.d.ts +29 -0
  19. package/lib/services/public-api.d.ts +0 -1
  20. package/lib/task/task-filters/components/base-task-filters-cloud.component.d.ts +1 -1
  21. package/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.d.ts +1 -1
  22. package/lib/task/task-list/components/base-task-list-cloud.component.d.ts +1 -1
  23. package/package.json +4 -6
  24. package/esm2022/adf-process-services-cloud.mjs +0 -5
  25. package/esm2022/lib/app/app-list-cloud.module.mjs +0 -20
  26. package/esm2022/lib/app/components/app-details-cloud/app-details-cloud.component.mjs +0 -67
  27. package/esm2022/lib/app/components/app-list-cloud/app-list-cloud.component.mjs +0 -125
  28. package/esm2022/lib/app/models/application-instance.model.mjs +0 -24
  29. package/esm2022/lib/app/public-api.mjs +0 -22
  30. package/esm2022/lib/app/services/apps-process-cloud.service.mjs +0 -97
  31. package/esm2022/lib/common/date-range-filter/date-range-filter.component.mjs +0 -163
  32. package/esm2022/lib/common/date-range-filter/date-range-filter.service.mjs +0 -97
  33. package/esm2022/lib/common/index.mjs +0 -18
  34. package/esm2022/lib/common/interface/environment.interface.mjs +0 -18
  35. package/esm2022/lib/common/interface/index.mjs +0 -18
  36. package/esm2022/lib/common/interface/public-api.mjs +0 -18
  37. package/esm2022/lib/common/public-api.mjs +0 -19
  38. package/esm2022/lib/form/components/cloud-form-rendering.service.mjs +0 -57
  39. package/esm2022/lib/form/components/form-cloud-custom-outcomes.component.mjs +0 -31
  40. package/esm2022/lib/form/components/form-cloud.component.mjs +0 -420
  41. package/esm2022/lib/form/components/form-definition-selector-cloud.component.mjs +0 -53
  42. package/esm2022/lib/form/components/spinner/form-spinner.component.mjs +0 -35
  43. package/esm2022/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.mjs +0 -249
  44. package/esm2022/lib/form/components/widgets/attach-file/file-properties-table/file-properties-table-cloud.component.mjs +0 -136
  45. package/esm2022/lib/form/components/widgets/data-table/data-table-adapter.widget.mjs +0 -107
  46. package/esm2022/lib/form/components/widgets/data-table/data-table.widget.mjs +0 -120
  47. package/esm2022/lib/form/components/widgets/data-table/helpers/data-table-path-parser.helper.mjs +0 -122
  48. package/esm2022/lib/form/components/widgets/date/date-cloud.widget.mjs +0 -189
  49. package/esm2022/lib/form/components/widgets/display-external-property/display-external-property.widget.mjs +0 -85
  50. package/esm2022/lib/form/components/widgets/display-rich-text/display-rich-text.widget.mjs +0 -80
  51. package/esm2022/lib/form/components/widgets/dropdown/dropdown-cloud.widget.mjs +0 -464
  52. package/esm2022/lib/form/components/widgets/dropdown/validators.mjs +0 -29
  53. package/esm2022/lib/form/components/widgets/file-viewer/file-viewer.widget.mjs +0 -46
  54. package/esm2022/lib/form/components/widgets/group/group-cloud.widget.mjs +0 -82
  55. package/esm2022/lib/form/components/widgets/people/people-cloud.widget.mjs +0 -91
  56. package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer-wrapper/properties-viewer-wrapper.component.mjs +0 -81
  57. package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer.widget.mjs +0 -53
  58. package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.schema.mjs +0 -86
  59. package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.mjs +0 -116
  60. package/esm2022/lib/form/components/widgets/upload/upload-cloud.widget.mjs +0 -187
  61. package/esm2022/lib/form/form-cloud.module.mjs +0 -99
  62. package/esm2022/lib/form/models/form-cloud-representation.model.mjs +0 -48
  63. package/esm2022/lib/form/models/task-variable-cloud.model.mjs +0 -28
  64. package/esm2022/lib/form/public-api.mjs +0 -44
  65. package/esm2022/lib/form/services/content-cloud-node-selector.service.mjs +0 -120
  66. package/esm2022/lib/form/services/display-mode.service.mjs +0 -146
  67. package/esm2022/lib/form/services/form-cloud.service.interface.mjs +0 -18
  68. package/esm2022/lib/form/services/form-cloud.service.mjs +0 -201
  69. package/esm2022/lib/form/services/form-definition-selector-cloud.service.interface.mjs +0 -18
  70. package/esm2022/lib/form/services/form-definition-selector-cloud.service.mjs +0 -51
  71. package/esm2022/lib/form/services/form-utils.service.mjs +0 -37
  72. package/esm2022/lib/form/services/process-cloud-content.service.mjs +0 -71
  73. package/esm2022/lib/form/services/spinner/form-cloud-spinner.service.mjs +0 -52
  74. package/esm2022/lib/group/components/group-cloud.component.mjs +0 -423
  75. package/esm2022/lib/group/group-cloud.module.mjs +0 -33
  76. package/esm2022/lib/group/models/identity-group.model.mjs +0 -18
  77. package/esm2022/lib/group/public-api.mjs +0 -21
  78. package/esm2022/lib/group/services/identity-group.service.mjs +0 -89
  79. package/esm2022/lib/models/application-version.model.mjs +0 -21
  80. package/esm2022/lib/models/constant-values.type.mjs +0 -18
  81. package/esm2022/lib/models/data-column-custom-data.mjs +0 -18
  82. package/esm2022/lib/models/date-cloud-filter.model.mjs +0 -31
  83. package/esm2022/lib/models/date-format-cloud.model.mjs +0 -18
  84. package/esm2022/lib/models/engine-event-cloud.model.mjs +0 -18
  85. package/esm2022/lib/models/filter-cloud-model.mjs +0 -128
  86. package/esm2022/lib/models/process-definition-cloud.model.mjs +0 -32
  87. package/esm2022/lib/models/process-instance-variable.model.mjs +0 -18
  88. package/esm2022/lib/models/process-variable-filter.model.mjs +0 -18
  89. package/esm2022/lib/models/task-cloud.model.mjs +0 -23
  90. package/esm2022/lib/models/task-list-sorting.model.mjs +0 -40
  91. package/esm2022/lib/models/variable-definition.mjs +0 -18
  92. package/esm2022/lib/people/components/people-cloud.component.mjs +0 -498
  93. package/esm2022/lib/people/models/identity-user.model.mjs +0 -18
  94. package/esm2022/lib/people/people-cloud.module.mjs +0 -33
  95. package/esm2022/lib/people/public-api.mjs +0 -21
  96. package/esm2022/lib/people/services/identity-user.service.mjs +0 -119
  97. package/esm2022/lib/process/process-cloud.module.mjs +0 -40
  98. package/esm2022/lib/process/process-filters/components/edit-process-filter/edit-process-filter-cloud.component.mjs +0 -801
  99. package/esm2022/lib/process/process-filters/components/process-filter-dialog/process-filter-dialog-cloud.component.mjs +0 -58
  100. package/esm2022/lib/process/process-filters/components/process-filters/process-filters-cloud.component.mjs +0 -292
  101. package/esm2022/lib/process/process-filters/models/process-filter-cloud.model.mjs +0 -170
  102. package/esm2022/lib/process/process-filters/process-filters-cloud.module.mjs +0 -44
  103. package/esm2022/lib/process/process-filters/public-api.mjs +0 -23
  104. package/esm2022/lib/process/process-filters/services/process-filter-cloud.service.mjs +0 -408
  105. package/esm2022/lib/process/process-header/components/process-header-cloud.component.mjs +0 -137
  106. package/esm2022/lib/process/process-header/process-header-cloud.module.mjs +0 -33
  107. package/esm2022/lib/process/process-header/public-api.mjs +0 -19
  108. package/esm2022/lib/process/process-list/components/process-list-cloud.component.mjs +0 -593
  109. package/esm2022/lib/process/process-list/datatable/process-list-datatable-adapter.mjs +0 -31
  110. package/esm2022/lib/process/process-list/models/perocess-instance-cloud-view.model.mjs +0 -18
  111. package/esm2022/lib/process/process-list/models/process-cloud-preferences.mjs +0 -24
  112. package/esm2022/lib/process/process-list/models/process-cloud-preset.model.mjs +0 -37
  113. package/esm2022/lib/process/process-list/models/process-cloud-query-request.model.mjs +0 -107
  114. package/esm2022/lib/process/process-list/models/process-list-sorting.model.mjs +0 -40
  115. package/esm2022/lib/process/process-list/process-list-cloud.module.mjs +0 -45
  116. package/esm2022/lib/process/process-list/public-api.mjs +0 -25
  117. package/esm2022/lib/process/process-list/services/process-list-cloud.service.mjs +0 -253
  118. package/esm2022/lib/process/process-list/services/process-task-list-cloud.service.mjs +0 -109
  119. package/esm2022/lib/process/public-api.mjs +0 -23
  120. package/esm2022/lib/process/services/process-cloud.service.mjs +0 -105
  121. package/esm2022/lib/process/start-process/components/start-process-cloud.component.mjs +0 -465
  122. package/esm2022/lib/process/start-process/models/process-instance-cloud.model.mjs +0 -18
  123. package/esm2022/lib/process/start-process/models/process-payload-cloud.model.mjs +0 -26
  124. package/esm2022/lib/process/start-process/models/process-with-form-payload-cloud.model.mjs +0 -26
  125. package/esm2022/lib/process/start-process/public-api.mjs +0 -21
  126. package/esm2022/lib/process/start-process/services/start-process-cloud.service.mjs +0 -125
  127. package/esm2022/lib/process-services-cloud.module.mjs +0 -98
  128. package/esm2022/lib/providers.mjs +0 -45
  129. package/esm2022/lib/screen/components/screen-cloud/screen-cloud.component.mjs +0 -186
  130. package/esm2022/lib/screen/models/screen-cloud.model.mjs +0 -18
  131. package/esm2022/lib/screen/public-api.mjs +0 -18
  132. package/esm2022/lib/services/base-cloud.service.mjs +0 -83
  133. package/esm2022/lib/services/cloud-token.service.mjs +0 -23
  134. package/esm2022/lib/services/form-fields.interfaces.mjs +0 -55
  135. package/esm2022/lib/services/local-preference-cloud.service.mjs +0 -122
  136. package/esm2022/lib/services/notification-cloud.service.mjs +0 -45
  137. package/esm2022/lib/services/preference-cloud.interface.mjs +0 -18
  138. package/esm2022/lib/services/public-api.mjs +0 -28
  139. package/esm2022/lib/services/screen-rendering.service.mjs +0 -30
  140. package/esm2022/lib/services/task-list-cloud.service.interface.mjs +0 -18
  141. package/esm2022/lib/services/user-preference-cloud.service.mjs +0 -105
  142. package/esm2022/lib/services/variable-mapper.sevice.mjs +0 -77
  143. package/esm2022/lib/services/web-socket.service.mjs +0 -146
  144. package/esm2022/lib/task/models/start-task-cloud-request.model.mjs +0 -32
  145. package/esm2022/lib/task/models/task-details-cloud.model.mjs +0 -26
  146. package/esm2022/lib/task/models/task.model.mjs +0 -23
  147. package/esm2022/lib/task/public-api.mjs +0 -26
  148. package/esm2022/lib/task/services/task-cloud.service.mjs +0 -272
  149. package/esm2022/lib/task/task-cloud.module.mjs +0 -45
  150. package/esm2022/lib/task/task-filters/components/base-task-filters-cloud.component.mjs +0 -59
  151. package/esm2022/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.mjs +0 -467
  152. package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-service-task-filter/edit-service-task-filter-cloud.component.mjs +0 -205
  153. package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-task-filter/edit-task-filter-cloud.component.mjs +0 -317
  154. package/esm2022/lib/task/task-filters/components/service-task-filters/service-task-filters-cloud.component.mjs +0 -146
  155. package/esm2022/lib/task/task-filters/components/task-assignment-filter/task-assignment-filter.component.mjs +0 -142
  156. package/esm2022/lib/task/task-filters/components/task-filter-dialog/task-filter-dialog-cloud.component.mjs +0 -72
  157. package/esm2022/lib/task/task-filters/components/task-filters/task-filters-cloud.component.mjs +0 -255
  158. package/esm2022/lib/task/task-filters/models/filter-cloud.model.mjs +0 -207
  159. package/esm2022/lib/task/task-filters/public-api.mjs +0 -27
  160. package/esm2022/lib/task/task-filters/services/service-task-filter-cloud.service.mjs +0 -283
  161. package/esm2022/lib/task/task-filters/services/task-filter-cloud.service.mjs +0 -392
  162. package/esm2022/lib/task/task-filters/task-filters-cloud.module.mjs +0 -56
  163. package/esm2022/lib/task/task-form/components/task-form-cloud/task-form-cloud.component.mjs +0 -231
  164. package/esm2022/lib/task/task-form/components/user-task-cloud/complete-task/complete-task.directive.mjs +0 -89
  165. package/esm2022/lib/task/task-form/components/user-task-cloud/user-task-cloud.component.mjs +0 -309
  166. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/claim-task/claim-task-cloud.directive.mjs +0 -101
  167. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/unclaim-task/unclaim-task-cloud.directive.mjs +0 -87
  168. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/user-task-cloud-buttons.component.mjs +0 -85
  169. package/esm2022/lib/task/task-form/public-api.mjs +0 -21
  170. package/esm2022/lib/task/task-form/task-form.module.mjs +0 -36
  171. package/esm2022/lib/task/task-header/components/task-header-cloud.component.mjs +0 -280
  172. package/esm2022/lib/task/task-header/public-api.mjs +0 -19
  173. package/esm2022/lib/task/task-header/task-header-cloud.module.mjs +0 -33
  174. package/esm2022/lib/task/task-list/components/base-task-list-cloud.component.mjs +0 -331
  175. package/esm2022/lib/task/task-list/components/service-task-list/service-task-list-cloud.component.mjs +0 -115
  176. package/esm2022/lib/task/task-list/components/task-list/datatable/task-list-datatable-adapter.mjs +0 -31
  177. package/esm2022/lib/task/task-list/components/task-list/task-list-cloud.component.mjs +0 -389
  178. package/esm2022/lib/task/task-list/models/service-task-cloud.model.mjs +0 -18
  179. package/esm2022/lib/task/task-list/models/task-cloud-view.model.mjs +0 -18
  180. package/esm2022/lib/task/task-list/public-api.mjs +0 -23
  181. package/esm2022/lib/task/task-list/services/service-task-list-cloud.service.mjs +0 -115
  182. package/esm2022/lib/task/task-list/services/task-list-cloud.service.mjs +0 -178
  183. package/esm2022/lib/task/task-list/task-list-cloud.module.mjs +0 -35
  184. package/esm2022/lib/types.mjs +0 -18
  185. package/esm2022/public-api.mjs +0 -40
  186. /package/lib/screen/{models → components/screen-cloud}/screen-cloud.model.d.ts +0 -0
@@ -1,464 +0,0 @@
1
- /*!
2
- * @license
3
- * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- */
17
- import { AppConfigService, ErrorMessageModel, ErrorWidgetComponent, FormFieldEvent, FormFieldTypes, FormService, SelectFilterInputComponent, WidgetComponent } from '@alfresco/adf-core';
18
- import { AsyncPipe, NgFor, NgIf } from '@angular/common';
19
- import { Component, DestroyRef, inject, ViewEncapsulation } from '@angular/core';
20
- import { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';
21
- import { MatFormFieldModule } from '@angular/material/form-field';
22
- import { MatSelectModule } from '@angular/material/select';
23
- import { TranslatePipe } from '@ngx-translate/core';
24
- import { BehaviorSubject } from 'rxjs';
25
- import { filter, map } from 'rxjs/operators';
26
- import { FormCloudService } from '../../../services/form-cloud.service';
27
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
28
- import { FormUtilsService } from '../../../services/form-utils.service';
29
- import { defaultValueValidator } from './validators';
30
- import * as i0 from "@angular/core";
31
- import * as i1 from "@angular/forms";
32
- import * as i2 from "@angular/material/form-field";
33
- import * as i3 from "@angular/material/select";
34
- import * as i4 from "@angular/material/core";
35
- export const DEFAULT_OPTION = {
36
- id: 'empty',
37
- name: 'Choose one...'
38
- };
39
- export const HIDE_FILTER_LIMIT = 5;
40
- /* eslint-disable @angular-eslint/component-selector */
41
- export class DropdownCloudWidgetComponent extends WidgetComponent {
42
- constructor() {
43
- super(...arguments);
44
- this.formService = inject(FormService);
45
- this.formCloudService = inject(FormCloudService);
46
- this.appConfig = inject(AppConfigService);
47
- this.formUtilsService = inject(FormUtilsService);
48
- this.destroyRef = inject(DestroyRef);
49
- this.typeId = 'DropdownCloudWidgetComponent';
50
- this.showInputFilter = false;
51
- this.isRestApiFailed = false;
52
- this.variableOptionsFailed = false;
53
- this.previewState = false;
54
- this.dropdownControl = new FormControl(undefined);
55
- this.list$ = new BehaviorSubject([]);
56
- this.filter$ = new BehaviorSubject('');
57
- this.defaultVariableOptionId = 'id';
58
- this.defaultVariableOptionLabel = 'name';
59
- this.defaultVariableOptionPath = 'data';
60
- }
61
- get showRequiredMessage() {
62
- return this.dropdownControl.touched && this.dropdownControl.errors?.required && !this.isRestApiFailed && !this.variableOptionsFailed;
63
- }
64
- get isReadOnlyType() {
65
- return this.field.type === 'readonly';
66
- }
67
- get isLinkedWidget() {
68
- return !!this.linkedWidgetId;
69
- }
70
- get linkedWidgetId() {
71
- return this.field?.rule?.ruleOn;
72
- }
73
- get isReadOnlyForm() {
74
- return !!this.field?.form?.readOnly;
75
- }
76
- get hasRestUrl() {
77
- return !!this.field?.restUrl;
78
- }
79
- get isValidRestConfig() {
80
- return this.isRestOptionType && this.hasRestUrl;
81
- }
82
- get isRestOptionType() {
83
- return this.field?.optionType === 'rest';
84
- }
85
- get isVariableOptionType() {
86
- return this.field?.optionType === 'variable';
87
- }
88
- ngOnInit() {
89
- this.setupDropdown();
90
- this.formService.onFormVariableChanged.subscribe(({ field }) => {
91
- if (field.id === this.field.id) {
92
- this.setupDropdown();
93
- }
94
- });
95
- }
96
- updateReactiveFormControl() {
97
- this.setFormControlValue();
98
- this.updateFormControlState();
99
- this.handleErrors();
100
- }
101
- compareDropdownValues(opt1, opt2) {
102
- if (!opt1 || !opt2) {
103
- return false;
104
- }
105
- if (typeof opt1 === 'string' && typeof opt2 === 'object') {
106
- return opt1 === opt2.id || opt1 === opt2.name;
107
- }
108
- if (typeof opt1 === 'object' && typeof opt2 === 'string') {
109
- return opt1.id === opt2 || opt1.name === opt2;
110
- }
111
- if (typeof opt1 === 'object' && typeof opt2 === 'object') {
112
- return opt1.id === opt2.id || opt1.name === opt2.name;
113
- }
114
- return opt1 === opt2;
115
- }
116
- selectionChangedForField(field) {
117
- const formFieldValueChangedEvent = new FormFieldEvent(field.form, field);
118
- this.formService.formFieldValueChanged.next(formFieldValueChangedEvent);
119
- this.onFieldChanged(field);
120
- }
121
- setupDropdown() {
122
- this.setPreviewState();
123
- this.checkFieldOptionsSource();
124
- this.updateOptions();
125
- this.setFormControlValue();
126
- this.updateFormControlState();
127
- this.subscribeToInputChanges();
128
- this.initFilter();
129
- this.handleErrors();
130
- }
131
- subscribeToInputChanges() {
132
- this.dropdownControl.valueChanges
133
- .pipe(filter(() => !!this.field), takeUntilDestroyed(this.destroyRef))
134
- .subscribe((value) => {
135
- this.setOptionValue(value, this.field);
136
- this.handleErrors();
137
- this.selectionChangedForField(this.field);
138
- });
139
- }
140
- setFormControlValue() {
141
- if (Array.isArray(this.field.value)) {
142
- this.dropdownControl.setValue(this.field?.value, { emitEvent: false });
143
- }
144
- else if (this.field?.value && typeof this.field?.value === 'object') {
145
- this.dropdownControl.setValue({ id: this.field?.value.id, name: this.field?.value.name }, { emitEvent: false });
146
- }
147
- else if (this.field.value === null) {
148
- this.dropdownControl.setValue(this.field?.value, { emitEvent: false });
149
- }
150
- else {
151
- this.dropdownControl.setValue({ id: this.field?.value, name: '' }, { emitEvent: false });
152
- }
153
- }
154
- updateFormControlState() {
155
- this.updateDropdownValidationRules();
156
- this.updateDropdownReadonlyRules();
157
- this.dropdownControl.updateValueAndValidity({ emitEvent: false });
158
- }
159
- updateDropdownValidationRules() {
160
- this.dropdownControl.setValidators([]);
161
- if (!this.field?.isVisible) {
162
- return;
163
- }
164
- if (this.isRequired()) {
165
- this.dropdownControl.addValidators([Validators.required]);
166
- if (this.field.hasEmptyValue) {
167
- this.dropdownControl.addValidators([defaultValueValidator(this.field)]);
168
- }
169
- }
170
- }
171
- updateDropdownReadonlyRules() {
172
- if (this.field?.readOnly || this.readOnly) {
173
- this.dropdownControl.disable({ emitEvent: false });
174
- }
175
- else {
176
- this.dropdownControl.enable({ emitEvent: false });
177
- }
178
- }
179
- handleErrors() {
180
- if (this.dropdownControl.valid) {
181
- this.field.validationSummary = new ErrorMessageModel('');
182
- this.field.markAsValid();
183
- return;
184
- }
185
- if (this.dropdownControl.invalid && this.dropdownControl.errors.required) {
186
- this.field.validationSummary = new ErrorMessageModel({ message: 'FORM.FIELD.REQUIRED' });
187
- this.field.markAsInvalid();
188
- }
189
- }
190
- initFilter() {
191
- this.filter$
192
- .pipe(filter((search) => search !== undefined), map((search) => search ? this.field.options.filter(({ name }) => name.toLowerCase().includes(search.toLowerCase())) : this.field.options), takeUntilDestroyed(this.destroyRef))
193
- .subscribe((result) => this.list$.next(result));
194
- }
195
- checkFieldOptionsSource() {
196
- switch (true) {
197
- case this.isReadOnlyForm:
198
- break;
199
- case this.isValidRestConfig && !this.isLinkedWidget:
200
- this.persistFieldOptionsFromRestApi();
201
- break;
202
- case this.isLinkedWidget:
203
- this.loadFieldOptionsForLinkedWidget();
204
- break;
205
- case this.isVariableOptionType:
206
- this.persistFieldOptionsFromVariable();
207
- break;
208
- default:
209
- break;
210
- }
211
- }
212
- persistFieldOptionsFromVariable() {
213
- const optionsPath = this.field?.variableConfig?.optionsPath ?? this.defaultVariableOptionPath;
214
- const variableName = this.field?.variableConfig?.variableName;
215
- const processVariables = this.field?.form?.processVariables;
216
- const formVariables = this.field?.form?.variables;
217
- const dropdownOptions = this.getOptionsFromVariable(processVariables, formVariables, variableName);
218
- if (dropdownOptions) {
219
- const formVariableOptions = this.getOptionsFromPath(dropdownOptions, optionsPath);
220
- this.updateOptions(formVariableOptions);
221
- this.resetInvalidValue();
222
- this.field.updateForm();
223
- }
224
- else {
225
- this.handleError(`${variableName} not found`);
226
- this.resetOptions();
227
- this.variableOptionsFailed = true;
228
- }
229
- }
230
- getOptionsFromPath(data, path) {
231
- const optionsId = this.field?.variableConfig?.optionsId ?? this.defaultVariableOptionId;
232
- const optionsLabel = this.field?.variableConfig?.optionsLabel ?? this.defaultVariableOptionLabel;
233
- const properties = path.split('.');
234
- const currentProperty = properties.shift();
235
- if (!Object.prototype.hasOwnProperty.call(data, currentProperty)) {
236
- this.handleError(`${currentProperty} not found in ${JSON.stringify(data)}`);
237
- this.variableOptionsFailed = true;
238
- return [];
239
- }
240
- const nestedData = data[currentProperty];
241
- if (Array.isArray(nestedData)) {
242
- return this.getOptionsFromArray(nestedData, optionsId, optionsLabel);
243
- }
244
- return this.getOptionsFromPath(nestedData, properties.join('.'));
245
- }
246
- getOptionsFromArray(nestedData, id, label) {
247
- const options = nestedData.map((item) => this.createOption(item, id, label));
248
- const hasInvalidOption = options.some((option) => !option);
249
- if (hasInvalidOption) {
250
- this.variableOptionsFailed = true;
251
- return [];
252
- }
253
- this.variableOptionsFailed = false;
254
- return options;
255
- }
256
- createOption(item, id, label) {
257
- const option = {
258
- id: item[id],
259
- name: item[label]
260
- };
261
- if (!option.id || !option.name) {
262
- this.handleError(`'id' or 'label' is not properly defined`);
263
- return undefined;
264
- }
265
- return option;
266
- }
267
- getOptionsFromVariable(processVariables, formVariables, variableName) {
268
- const processVariableDropdownOptions = this.getVariableValueByName(processVariables, variableName);
269
- const formVariableDropdownOptions = this.getVariableValueByName(formVariables, variableName);
270
- return processVariableDropdownOptions ?? formVariableDropdownOptions;
271
- }
272
- getVariableValueByName(variables, variableName) {
273
- return variables?.find((variable) => variable?.name === `variables.${variableName}` || variable?.name === variableName)
274
- ?.value;
275
- }
276
- persistFieldOptionsFromRestApi() {
277
- if (this.isValidRestConfig) {
278
- this.resetRestApiErrorMessage();
279
- const bodyParam = this.buildBodyParam();
280
- this.formCloudService
281
- .getRestWidgetData(this.field.form.id, this.field.id, bodyParam)
282
- .pipe(takeUntilDestroyed(this.destroyRef))
283
- .subscribe({
284
- next: (result) => {
285
- this.resetRestApiErrorMessage();
286
- this.updateOptions(result);
287
- this.field.updateForm();
288
- this.resetInvalidValue();
289
- },
290
- error: (err) => {
291
- this.resetRestApiOptions();
292
- this.handleError(err);
293
- }
294
- });
295
- }
296
- }
297
- buildBodyParam() {
298
- const bodyParam = Object.assign({});
299
- if (this.isLinkedWidget) {
300
- const parentWidgetValue = this.getParentWidgetValue();
301
- const parentWidgetId = this.linkedWidgetId;
302
- bodyParam[parentWidgetId] = parentWidgetValue;
303
- }
304
- return this.formUtilsService.getRestUrlVariablesMap(this.field.form, this.field.restUrl, bodyParam);
305
- }
306
- loadFieldOptionsForLinkedWidget() {
307
- const parentWidgetValue = this.getParentWidgetValue();
308
- this.parentValueChanged(parentWidgetValue);
309
- this.formService.formFieldValueChanged
310
- .pipe(filter((event) => this.isFormFieldEventOfTypeDropdown(event) && this.isParentFormFieldEvent(event)), takeUntilDestroyed(this.destroyRef))
311
- .subscribe((event) => {
312
- const valueOfParentWidget = event.field.value;
313
- this.parentValueChanged(valueOfParentWidget);
314
- });
315
- }
316
- getParentWidgetValue() {
317
- const parentWidgetId = this.linkedWidgetId;
318
- const parentWidget = this.getFormFieldById(parentWidgetId);
319
- return parentWidget?.value;
320
- }
321
- parentValueChanged(value) {
322
- if (value && !this.isNoneValueSelected(value)) {
323
- this.isValidRestConfig ? this.persistFieldOptionsFromRestApi() : this.persistFieldOptionsFromManualList(value);
324
- }
325
- else if (this.isNoneValueSelected(value)) {
326
- this.resetRestApiErrorMessage();
327
- this.resetOptions();
328
- this.resetInvalidValue();
329
- }
330
- else {
331
- this.updateOptions([]);
332
- this.resetInvalidValue();
333
- }
334
- }
335
- isNoneValueSelected(value) {
336
- return value === undefined;
337
- }
338
- getFormFieldById(fieldId) {
339
- return this.field.form.getFormFields().filter((field) => field.id === fieldId)[0];
340
- }
341
- persistFieldOptionsFromManualList(value) {
342
- if (this.hasRuleEntries()) {
343
- const rulesEntries = this.field.rule.entries;
344
- rulesEntries.forEach((ruleEntry) => {
345
- if (ruleEntry.key === value) {
346
- this.updateOptions(ruleEntry.options);
347
- this.resetInvalidValue();
348
- this.field.updateForm();
349
- }
350
- });
351
- }
352
- }
353
- resetInvalidValue() {
354
- if (!this.isValidValue()) {
355
- this.resetValue();
356
- }
357
- }
358
- resetValue() {
359
- this.field.value = '';
360
- this.selectionChangedForField(this.field);
361
- this.updateOptions();
362
- this.field.updateForm();
363
- }
364
- isValidValue() {
365
- return this.field.value && this.isSelectedValueInOptions();
366
- }
367
- isSelectedValueInOptions() {
368
- if (Array.isArray(this.field.value)) {
369
- const optionIdList = [...this.field.options].map((option) => option.id);
370
- const fieldValueIds = this.field.value.map((valueOption) => valueOption.id);
371
- return fieldValueIds.every((valueOptionId) => optionIdList.includes(valueOptionId));
372
- }
373
- else {
374
- if (this.field?.value && typeof this.field?.value === 'object') {
375
- return [...this.field.options].map((option) => option.id).includes(this.field.value.id);
376
- }
377
- else {
378
- return [...this.field.options].map((option) => option.id).includes(this.field.value);
379
- }
380
- }
381
- }
382
- hasRuleEntries() {
383
- return !!this.field.rule.entries.length;
384
- }
385
- resetOptions() {
386
- this.updateOptions([]);
387
- }
388
- isParentFormFieldEvent(event) {
389
- return event.field.id === this.linkedWidgetId;
390
- }
391
- isFormFieldEventOfTypeDropdown(event) {
392
- return event.field.type === FormFieldTypes.DROPDOWN;
393
- }
394
- setOptionValue(option, field) {
395
- if (Array.isArray(option) || field.hasMultipleValues) {
396
- field.value = option;
397
- return;
398
- }
399
- let optionValue = '';
400
- if (option.id === DEFAULT_OPTION.id) {
401
- optionValue = undefined;
402
- }
403
- else if (option.name !== field.value) {
404
- optionValue = option.id;
405
- }
406
- else {
407
- optionValue = option.name;
408
- }
409
- field.value = optionValue;
410
- }
411
- setPreviewState() {
412
- this.previewState = this.formCloudService.getPreviewState();
413
- }
414
- handleError(error) {
415
- if (!this.previewState) {
416
- this.widgetError.emit(error);
417
- }
418
- }
419
- updateOptions(options) {
420
- if (!this.field) {
421
- return;
422
- }
423
- if (options) {
424
- this.field.options = options;
425
- }
426
- this.list$.next(this.field.options);
427
- this.showInputFilter = this.field.options.length > this.appConfig.get('form.dropDownFilterLimit', HIDE_FILTER_LIMIT);
428
- }
429
- resetRestApiErrorMessage() {
430
- this.isRestApiFailed = false;
431
- this.restApiHostName = '';
432
- }
433
- resetRestApiOptions() {
434
- this.updateOptions([]);
435
- this.resetValue();
436
- this.isRestApiFailed = true;
437
- this.restApiHostName = this.getRestUrlHostName();
438
- }
439
- getRestUrlHostName() {
440
- try {
441
- return new URL(this.field?.restUrl).hostname;
442
- }
443
- catch {
444
- return this.field?.restUrl;
445
- }
446
- }
447
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropdownCloudWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
448
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DropdownCloudWidgetComponent, isStandalone: true, selector: "dropdown-cloud-widget", usesInheritance: true, ngImport: i0, template: "<div\n class=\"adf-dropdown-widget {{field.className}}\"\n [class.adf-invalid]=\"dropdownControl.invalid && dropdownControl.touched\"\n [class.adf-readonly]=\"field.readOnly\"\n [class.adf-left-label-input-container]=\"field.leftLabels\"\n>\n <div *ngIf=\"field.leftLabels\">\n <label class=\"adf-label adf-left-label\" [attr.for]=\"field.id\">\n {{ field.name | translate }}<span class=\"adf-asterisk\" [style.visibility]=\"isRequired() ? 'visible' : 'hidden'\">*</span>\n </label>\n </div>\n <div>\n <mat-form-field class=\"adf-form-field-input\">\n @if ( (field.name || this.field?.required) && !field.leftLabels) { <mat-label class=\"adf-label\" [attr.for]=\"field.id\">{{ field.name | translate }}</mat-label> }\n <mat-select\n class=\"adf-select\"\n [formControl]=\"dropdownControl\"\n [id]=\"field.id\"\n [compareWith]=\"compareDropdownValues\"\n [title]=\"field.tooltip\"\n panelClass=\"adf-select-filter\"\n [multiple]=\"field.hasMultipleValues\"\n [disabled]=\"field.readOnly\"\n [required]=\"field.required \"\n >\n <adf-select-filter-input *ngIf=\"showInputFilter\" (change)=\"filter$.next($event)\" />\n\n <mat-option *ngFor=\"let opt of list$ | async\" [value]=\"opt\" [id]=\"opt.id\">{{opt.name}}</mat-option>\n <mat-option id=\"readonlyOption\" *ngIf=\"isReadOnlyType\" [value]=\"field.value\">{{field.value}}</mat-option>\n </mat-select>\n </mat-form-field>\n <div class=\"adf-error-messages-container\" *ngIf=\"!previewState && !field.readOnly\">\n <error-widget\n class=\"adf-dropdown-required-message\"\n *ngIf=\"showRequiredMessage\"\n required=\"{{ 'FORM.FIELD.REQUIRED' | translate }}\"\n />\n <error-widget\n class=\"adf-dropdown-failed-message\"\n *ngIf=\"isRestApiFailed\"\n required=\"{{ 'FORM.FIELD.REST_API_FAILED' | translate: { hostname: restApiHostName } }}\"\n />\n <error-widget\n class=\"adf-dropdown-failed-message\"\n *ngIf=\"variableOptionsFailed\"\n required=\"{{ 'FORM.FIELD.VARIABLE_DROPDOWN_OPTIONS_FAILED' | translate }}\"\n />\n </div>\n </div>\n</div>\n", styles: [".adf-dropdown-widget{width:100%}.adf-dropdown-widget .adf-select{padding-top:0;width:100%}.adf-dropdown-widget .adf-select-filter{font-size:var(--theme-body-1-font-size)}.adf-dropdown-widget-select{width:100%}.adf-dropdown-widget-dropdown-required-message .adf-error-container,.adf-dropdown-widget-dropdown-failed-message .adf-error-container{margin-top:1px}.adf-dropdown-widget .mat-mdc-select-arrow-wrapper{height:auto}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i3.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: ErrorWidgetComponent, selector: "error-widget", inputs: ["error", "required"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: SelectFilterInputComponent, selector: "adf-select-filter-input", outputs: ["change"] }], encapsulation: i0.ViewEncapsulation.None }); }
449
- }
450
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropdownCloudWidgetComponent, decorators: [{
451
- type: Component,
452
- args: [{ selector: 'dropdown-cloud-widget', encapsulation: ViewEncapsulation.None, standalone: true, imports: [
453
- NgIf,
454
- NgFor,
455
- AsyncPipe,
456
- ReactiveFormsModule,
457
- MatFormFieldModule,
458
- MatSelectModule,
459
- ErrorWidgetComponent,
460
- TranslatePipe,
461
- SelectFilterInputComponent
462
- ], template: "<div\n class=\"adf-dropdown-widget {{field.className}}\"\n [class.adf-invalid]=\"dropdownControl.invalid && dropdownControl.touched\"\n [class.adf-readonly]=\"field.readOnly\"\n [class.adf-left-label-input-container]=\"field.leftLabels\"\n>\n <div *ngIf=\"field.leftLabels\">\n <label class=\"adf-label adf-left-label\" [attr.for]=\"field.id\">\n {{ field.name | translate }}<span class=\"adf-asterisk\" [style.visibility]=\"isRequired() ? 'visible' : 'hidden'\">*</span>\n </label>\n </div>\n <div>\n <mat-form-field class=\"adf-form-field-input\">\n @if ( (field.name || this.field?.required) && !field.leftLabels) { <mat-label class=\"adf-label\" [attr.for]=\"field.id\">{{ field.name | translate }}</mat-label> }\n <mat-select\n class=\"adf-select\"\n [formControl]=\"dropdownControl\"\n [id]=\"field.id\"\n [compareWith]=\"compareDropdownValues\"\n [title]=\"field.tooltip\"\n panelClass=\"adf-select-filter\"\n [multiple]=\"field.hasMultipleValues\"\n [disabled]=\"field.readOnly\"\n [required]=\"field.required \"\n >\n <adf-select-filter-input *ngIf=\"showInputFilter\" (change)=\"filter$.next($event)\" />\n\n <mat-option *ngFor=\"let opt of list$ | async\" [value]=\"opt\" [id]=\"opt.id\">{{opt.name}}</mat-option>\n <mat-option id=\"readonlyOption\" *ngIf=\"isReadOnlyType\" [value]=\"field.value\">{{field.value}}</mat-option>\n </mat-select>\n </mat-form-field>\n <div class=\"adf-error-messages-container\" *ngIf=\"!previewState && !field.readOnly\">\n <error-widget\n class=\"adf-dropdown-required-message\"\n *ngIf=\"showRequiredMessage\"\n required=\"{{ 'FORM.FIELD.REQUIRED' | translate }}\"\n />\n <error-widget\n class=\"adf-dropdown-failed-message\"\n *ngIf=\"isRestApiFailed\"\n required=\"{{ 'FORM.FIELD.REST_API_FAILED' | translate: { hostname: restApiHostName } }}\"\n />\n <error-widget\n class=\"adf-dropdown-failed-message\"\n *ngIf=\"variableOptionsFailed\"\n required=\"{{ 'FORM.FIELD.VARIABLE_DROPDOWN_OPTIONS_FAILED' | translate }}\"\n />\n </div>\n </div>\n</div>\n", styles: [".adf-dropdown-widget{width:100%}.adf-dropdown-widget .adf-select{padding-top:0;width:100%}.adf-dropdown-widget .adf-select-filter{font-size:var(--theme-body-1-font-size)}.adf-dropdown-widget-select{width:100%}.adf-dropdown-widget-dropdown-required-message .adf-error-container,.adf-dropdown-widget-dropdown-failed-message .adf-error-container{margin-top:1px}.adf-dropdown-widget .mat-mdc-select-arrow-wrapper{height:auto}\n"] }]
463
- }] });
464
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tY2xvdWQud2lkZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3Byb2Nlc3Mtc2VydmljZXMtY2xvdWQvc3JjL2xpYi9mb3JtL2NvbXBvbmVudHMvd2lkZ2V0cy9kcm9wZG93bi9kcm9wZG93bi1jbG91ZC53aWRnZXQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvcHJvY2Vzcy1zZXJ2aWNlcy1jbG91ZC9zcmMvbGliL2Zvcm0vY29tcG9uZW50cy93aWRnZXRzL2Ryb3Bkb3duL2Ryb3Bkb3duLWNsb3VkLndpZGdldC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFDSCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixjQUFjLEVBR2QsY0FBYyxFQUNkLFdBQVcsRUFHWCwwQkFBMEIsRUFDMUIsZUFBZSxFQUNsQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBVSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFB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QUFTLDZDQUNULG1CQUFtQixzaEJBQ25CLGtCQUFrQiwwU0FDbEIsZUFBZSxvckJBQ2Ysb0JBQW9CLG1GQUNwQixhQUFhLGtEQUNiLDBCQUEwQjs7NEZBR3JCLDRCQUE0QjtrQkFsQnhDLFNBQVM7K0JBQ0ksdUJBQXVCLGlCQUdsQixpQkFBaUIsQ0FBQyxJQUFJLGNBQ3pCLElBQUksV0FDUDt3QkFDTCxJQUFJO3dCQUNKLEtBQUs7d0JBQ0wsU0FBUzt3QkFDVCxtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsZUFBZTt3QkFDZixvQkFBb0I7d0JBQ3BCLGFBQWE7d0JBQ2IsMEJBQTBCO3FCQUM3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgICBBcHBDb25maWdTZXJ2aWNlLFxuICAgIEVycm9yTWVzc2FnZU1vZGVsLFxuICAgIEVycm9yV2lkZ2V0Q29tcG9uZW50LFxuICAgIEZvcm1GaWVsZEV2ZW50LFxuICAgIEZvcm1GaWVsZE1vZGVsLFxuICAgIEZvcm1GaWVsZE9wdGlvbixcbiAgICBGb3JtRmllbGRUeXBlcyxcbiAgICBGb3JtU2VydmljZSxcbiAgICBSZWFjdGl2ZUZvcm1XaWRnZXQsXG4gICAgUnVsZUVudHJ5LFxuICAgIFNlbGVjdEZpbHRlcklucHV0Q29tcG9uZW50LFxuICAgIFdpZGdldENvbXBvbmVudFxufSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIERlc3Ryb3lSZWYsIGluamVjdCwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVGFza1ZhcmlhYmxlQ2xvdWQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvdGFzay12YXJpYWJsZS1jbG91ZC5tb2RlbCc7XG5pbXBvcnQgeyBGb3JtQ2xvdWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZm9ybS1jbG91ZC5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtLXV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgZGVmYXVsdFZhbHVlVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3JzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1BUSU9OID0ge1xuICAgIGlkOiAnZW1wdHknLFxuICAgIG5hbWU6ICdDaG9vc2Ugb25lLi4uJ1xufTtcbmV4cG9ydCBjb25zdCBISURFX0ZJTFRFUl9MSU1JVCA9IDU7XG5cbi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3IgKi9cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdkcm9wZG93bi1jbG91ZC13aWRnZXQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kcm9wZG93bi1jbG91ZC53aWRnZXQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZHJvcGRvd24tY2xvdWQud2lkZ2V0LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBOZ0ZvcixcbiAgICAgICAgQXN5bmNQaXBlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICAgICAgRXJyb3JXaWRnZXRDb21wb25lbnQsXG4gICAgICAgIFRyYW5zbGF0ZVBpcGUsXG4gICAgICAgIFNlbGVjdEZpbHRlcklucHV0Q29tcG9uZW50XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBEcm9wZG93bkNsb3VkV2lkZ2V0Q29tcG9uZW50IGV4dGVuZHMgV2lkZ2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBSZWFjdGl2ZUZvcm1XaWRnZXQge1xuICAgIHB1YmxpYyBmb3JtU2VydmljZSA9IGluamVjdChGb3JtU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtQ2xvdWRTZXJ2aWNlID0gaW5qZWN0KEZvcm1DbG91ZFNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwQ29uZmlnID0gaW5qZWN0KEFwcENvbmZpZ1NlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybVV0aWxzU2VydmljZSA9IGluamVjdChGb3JtVXRpbHNTZXJ2aWNlKTtcbiAgICBwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICB0eXBlSWQgPSAnRHJvcGRvd25DbG91ZFdpZGdldENvbXBvbmVudCc7XG4gICAgc2hvd0lucHV0RmlsdGVyID0gZmFsc2U7XG4gICAgaXNSZXN0QXBpRmFpbGVkID0gZmFsc2U7XG4gICAgdmFyaWFibGVPcHRpb25zRmFpbGVkID0gZmFsc2U7XG4gICAgcHJldmlld1N0YXRlID0gZmFsc2U7XG4gICAgcmVzdEFwaUhvc3ROYW1lOiBzdHJpbmc7XG4gICAgZHJvcGRvd25Db250cm9sID0gbmV3IEZvcm1Db250cm9sPEZvcm1GaWVsZE9wdGlvbiB8IEZvcm1GaWVsZE9wdGlvbltdPih1bmRlZmluZWQpO1xuXG4gICAgbGlzdCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZvcm1GaWVsZE9wdGlvbltdPihbXSk7XG4gICAgZmlsdGVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRWYXJpYWJsZU9wdGlvbklkID0gJ2lkJztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRWYXJpYWJsZU9wdGlvbkxhYmVsID0gJ25hbWUnO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFZhcmlhYmxlT3B0aW9uUGF0aCA9ICdkYXRhJztcblxuICAgIGdldCBzaG93UmVxdWlyZWRNZXNzYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wZG93bkNvbnRyb2wudG91Y2hlZCAmJiB0aGlzLmRyb3Bkb3duQ29udHJvbC5lcnJvcnM/LnJlcXVpcmVkICYmICF0aGlzLmlzUmVzdEFwaUZhaWxlZCAmJiAhdGhpcy52YXJpYWJsZU9wdGlvbnNGYWlsZWQ7XG4gICAgfVxuXG4gICAgZ2V0IGlzUmVhZE9ubHlUeXBlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZC50eXBlID09PSAncmVhZG9ubHknO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzTGlua2VkV2lkZ2V0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmxpbmtlZFdpZGdldElkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGxpbmtlZFdpZGdldElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkPy5ydWxlPy5ydWxlT247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXNSZWFkT25seUZvcm0oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZmllbGQ/LmZvcm0/LnJlYWRPbmx5O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGhhc1Jlc3RVcmwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZmllbGQ/LnJlc3RVcmw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXNWYWxpZFJlc3RDb25maWcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUmVzdE9wdGlvblR5cGUgJiYgdGhpcy5oYXNSZXN0VXJsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzUmVzdE9wdGlvblR5cGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkPy5vcHRpb25UeXBlID09PSAncmVzdCc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXNWYXJpYWJsZU9wdGlvblR5cGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkPy5vcHRpb25UeXBlID09PSAndmFyaWFibGUnO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNldHVwRHJvcGRvd24oKTtcblxuICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLm9uRm9ybVZhcmlhYmxlQ2hhbmdlZC5zdWJzY3JpYmUoKHsgZmllbGQgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkLmlkID09PSB0aGlzLmZpZWxkLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR1cERyb3Bkb3duKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZVJlYWN0aXZlRm9ybUNvbnRyb2woKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0Rm9ybUNvbnRyb2xWYWx1ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1Db250cm9sU3RhdGUoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcnMoKTtcbiAgICB9XG5cbiAgICBjb21wYXJlRHJvcGRvd25WYWx1ZXMob3B0MTogRm9ybUZpZWxkT3B0aW9uIHwgc3RyaW5nLCBvcHQyOiBGb3JtRmllbGRPcHRpb24gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFvcHQxIHx8ICFvcHQyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9wdDEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBvcHQyID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIG9wdDEgPT09IG9wdDIuaWQgfHwgb3B0MSA9PT0gb3B0Mi5uYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHQxID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb3B0MiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHQxLmlkID09PSBvcHQyIHx8IG9wdDEubmFtZSA9PT0gb3B0MjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0MSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9wdDIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0MS5pZCA9PT0gb3B0Mi5pZCB8fCBvcHQxLm5hbWUgPT09IG9wdDIubmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHQxID09PSBvcHQyO1xuICAgIH1cblxuICAgIHNlbGVjdGlvbkNoYW5nZWRGb3JGaWVsZChmaWVsZDogRm9ybUZpZWxkTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm9ybUZpZWxkVmFsdWVDaGFuZ2VkRXZlbnQgPSBuZXcgRm9ybUZpZWxkRXZlbnQoZmllbGQuZm9ybSwgZmllbGQpO1xuICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLmZvcm1GaWVsZFZhbHVlQ2hhbmdlZC5uZXh0KGZvcm1GaWVsZFZhbHVlQ2hhbmdlZEV2ZW50KTtcbiAgICAgICAgdGhpcy5vbkZpZWxkQ2hhbmdlZChmaWVsZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cERyb3Bkb3duKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFByZXZpZXdTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMuY2hlY2tGaWVsZE9wdGlvbnNTb3VyY2UoKTtcbiAgICAgICAgdGhpcy51cGRhdGVPcHRpb25zKCk7XG5cbiAgICAgICAgdGhpcy5zZXRGb3JtQ29udHJvbFZhbHVlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybUNvbnRyb2xTdGF0ZSgpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvSW5wdXRDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuaW5pdEZpbHRlcigpO1xuICAgICAgICB0aGlzLmhhbmRsZUVycm9ycygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3Vic2NyaWJlVG9JbnB1dENoYW5nZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25Db250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+ICEhdGhpcy5maWVsZCksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZSh2YWx1ZSwgdGhpcy5maWVsZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWRGb3JGaWVsZCh0aGlzLmZpZWxkKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Rm9ybUNvbnRyb2xWYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5maWVsZC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Db250cm9sLnNldFZhbHVlKHRoaXMuZmllbGQ/LnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWVsZD8udmFsdWUgJiYgdHlwZW9mIHRoaXMuZmllbGQ/LnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bkNvbnRyb2wuc2V0VmFsdWUoeyBpZDogdGhpcy5maWVsZD8udmFsdWUuaWQsIG5hbWU6IHRoaXMuZmllbGQ/LnZhbHVlLm5hbWUgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmllbGQudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Db250cm9sLnNldFZhbHVlKHRoaXMuZmllbGQ/LnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duQ29udHJvbC5zZXRWYWx1ZSh7IGlkOiB0aGlzLmZpZWxkPy52YWx1ZSwgbmFtZTogJycgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVGb3JtQ29udHJvbFN0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZURyb3Bkb3duVmFsaWRhdGlvblJ1bGVzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlRHJvcGRvd25SZWFkb25seVJ1bGVzKCk7XG4gICAgICAgIHRoaXMuZHJvcGRvd25Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRHJvcGRvd25WYWxpZGF0aW9uUnVsZXMoKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25Db250cm9sLnNldFZhbGlkYXRvcnMoW10pO1xuXG4gICAgICAgIGlmICghdGhpcy5maWVsZD8uaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Db250cm9sLmFkZFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkLmhhc0VtcHR5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duQ29udHJvbC5hZGRWYWxpZGF0b3JzKFtkZWZhdWx0VmFsdWVWYWxpZGF0b3IodGhpcy5maWVsZCldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRHJvcGRvd25SZWFkb25seVJ1bGVzKCkge1xuICAgICAgICBpZiAodGhpcy5maWVsZD8ucmVhZE9ubHkgfHwgdGhpcy5yZWFkT25seSkge1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bkNvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duQ29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVFcnJvcnMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRyb3Bkb3duQ29udHJvbC52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5maWVsZC52YWxpZGF0aW9uU3VtbWFyeSA9IG5ldyBFcnJvck1lc3NhZ2VNb2RlbCgnJyk7XG4gICAgICAgICAgICB0aGlzLmZpZWxkLm1hcmtBc1ZhbGlkKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kcm9wZG93bkNvbnRyb2wuaW52YWxpZCAmJiB0aGlzLmRyb3Bkb3duQ29udHJvbC5lcnJvcnMucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmllbGQudmFsaWRhdGlvblN1bW1hcnkgPSBuZXcgRXJyb3JNZXNzYWdlTW9kZWwoeyBtZXNzYWdlOiAnRk9STS5GSUVMRC5SRVFVSVJFRCcgfSk7XG4gICAgICAgICAgICB0aGlzLmZpZWxkLm1hcmtBc0ludmFsaWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEZpbHRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXIkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKHNlYXJjaCkgPT4gc2VhcmNoICE9PSB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgIG1hcCgoc2VhcmNoKSA9PlxuICAgICAgICAgICAgICAgICAgICBzZWFyY2ggPyB0aGlzLmZpZWxkLm9wdGlvbnMuZmlsdGVyKCh7IG5hbWUgfSkgPT4gbmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaC50b0xvd2VyQ2FzZSgpKSkgOiB0aGlzLmZpZWxkLm9wdGlvbnNcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHRoaXMubGlzdCQubmV4dChyZXN1bHQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrRmllbGRPcHRpb25zU291cmNlKCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgICAgICAgIGNhc2UgdGhpcy5pc1JlYWRPbmx5Rm9ybTpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgdGhpcy5pc1ZhbGlkUmVzdENvbmZpZyAmJiAhdGhpcy5pc0xpbmtlZFdpZGdldDpcbiAgICAgICAgICAgICAgICB0aGlzLnBlcnNpc3RGaWVsZE9wdGlvbnNGcm9tUmVzdEFwaSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIHRoaXMuaXNMaW5rZWRXaWRnZXQ6XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkRmllbGRPcHRpb25zRm9yTGlua2VkV2lkZ2V0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgdGhpcy5pc1ZhcmlhYmxlT3B0aW9uVHlwZTpcbiAgICAgICAgICAgICAgICB0aGlzLnBlcnNpc3RGaWVsZE9wdGlvbnNGcm9tVmFyaWFibGUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGVyc2lzdEZpZWxkT3B0aW9uc0Zyb21WYXJpYWJsZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1BhdGggPSB0aGlzLmZpZWxkPy52YXJpYWJsZUNvbmZpZz8ub3B0aW9uc1BhdGggPz8gdGhpcy5kZWZhdWx0VmFyaWFibGVPcHRpb25QYXRoO1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWUgPSB0aGlzLmZpZWxkPy52YXJpYWJsZUNvbmZpZz8udmFyaWFibGVOYW1lO1xuICAgICAgICBjb25zdCBwcm9jZXNzVmFyaWFibGVzID0gdGhpcy5maWVsZD8uZm9ybT8ucHJvY2Vzc1ZhcmlhYmxlcztcbiAgICAgICAgY29uc3QgZm9ybVZhcmlhYmxlcyA9IHRoaXMuZmllbGQ/LmZvcm0/LnZhcmlhYmxlcztcblxuICAgICAgICBjb25zdCBkcm9wZG93bk9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnNGcm9tVmFyaWFibGUocHJvY2Vzc1ZhcmlhYmxlcywgZm9ybVZhcmlhYmxlcywgdmFyaWFibGVOYW1lKTtcblxuICAgICAgICBpZiAoZHJvcGRvd25PcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtVmFyaWFibGVPcHRpb25zOiBGb3JtRmllbGRPcHRpb25bXSA9IHRoaXMuZ2V0T3B0aW9uc0Zyb21QYXRoKGRyb3Bkb3duT3B0aW9ucywgb3B0aW9uc1BhdGgpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVPcHRpb25zKGZvcm1WYXJpYWJsZU9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5yZXNldEludmFsaWRWYWx1ZSgpO1xuICAgICAgICAgICAgdGhpcy5maWVsZC51cGRhdGVGb3JtKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGAke3ZhcmlhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0T3B0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZU9wdGlvbnNGYWlsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPcHRpb25zRnJvbVBhdGgoZGF0YTogYW55LCBwYXRoOiBzdHJpbmcpOiBGb3JtRmllbGRPcHRpb25bXSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNJZCA9IHRoaXMuZmllbGQ/LnZhcmlhYmxlQ29uZmlnPy5vcHRpb25zSWQgPz8gdGhpcy5kZWZhdWx0VmFyaWFibGVPcHRpb25JZDtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0xhYmVsID0gdGhpcy5maWVsZD8udmFyaWFibGVDb25maWc/Lm9wdGlvbnNMYWJlbCA/PyB0aGlzLmRlZmF1bHRWYXJpYWJsZU9wdGlvbkxhYmVsO1xuXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQcm9wZXJ0eSA9IHByb3BlcnRpZXMuc2hpZnQoKTtcblxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBjdXJyZW50UHJvcGVydHkpKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGAke2N1cnJlbnRQcm9wZXJ0eX0gbm90IGZvdW5kIGluICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCk7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlT3B0aW9uc0ZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXN0ZWREYXRhID0gZGF0YVtjdXJyZW50UHJvcGVydHldO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5lc3RlZERhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb25zRnJvbUFycmF5KG5lc3RlZERhdGEsIG9wdGlvbnNJZCwgb3B0aW9uc0xhYmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldE9wdGlvbnNGcm9tUGF0aChuZXN0ZWREYXRhLCBwcm9wZXJ0aWVzLmpvaW4oJy4nKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPcHRpb25zRnJvbUFycmF5KG5lc3RlZERhdGE6IGFueVtdLCBpZDogc3RyaW5nLCBsYWJlbDogc3RyaW5nKTogRm9ybUZpZWxkT3B0aW9uW10ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gbmVzdGVkRGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuY3JlYXRlT3B0aW9uKGl0ZW0sIGlkLCBsYWJlbCkpO1xuICAgICAgICBjb25zdCBoYXNJbnZhbGlkT3B0aW9uID0gb3B0aW9ucy5zb21lKChvcHRpb24pID0+ICFvcHRpb24pO1xuXG4gICAgICAgIGlmIChoYXNJbnZhbGlkT3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlT3B0aW9uc0ZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhcmlhYmxlT3B0aW9uc0ZhaWxlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU9wdGlvbihpdGVtOiBhbnksIGlkOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcpOiBGb3JtRmllbGRPcHRpb24ge1xuICAgICAgICBjb25zdCBvcHRpb246IEZvcm1GaWVsZE9wdGlvbiA9IHtcbiAgICAgICAgICAgIGlkOiBpdGVtW2lkXSxcbiAgICAgICAgICAgIG5hbWU6IGl0ZW1bbGFiZWxdXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCFvcHRpb24uaWQgfHwgIW9wdGlvbi5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGAnaWQnIG9yICdsYWJlbCcgaXMgbm90IHByb3Blcmx5IGRlZmluZWRgKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3B0aW9uc0Zyb21WYXJpYWJsZShcbiAgICAgICAgcHJvY2Vzc1ZhcmlhYmxlczogVGFza1ZhcmlhYmxlQ2xvdWRbXSxcbiAgICAgICAgZm9ybVZhcmlhYmxlczogVGFza1ZhcmlhYmxlQ2xvdWRbXSxcbiAgICAgICAgdmFyaWFibGVOYW1lOiBzdHJpbmdcbiAgICApOiBUYXNrVmFyaWFibGVDbG91ZCB7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NWYXJpYWJsZURyb3Bkb3duT3B0aW9uczogVGFza1ZhcmlhYmxlQ2xvdWQgPSB0aGlzLmdldFZhcmlhYmxlVmFsdWVCeU5hbWUocHJvY2Vzc1ZhcmlhYmxlcywgdmFyaWFibGVOYW1lKTtcbiAgICAgICAgY29uc3QgZm9ybVZhcmlhYmxlRHJvcGRvd25PcHRpb25zOiBUYXNrVmFyaWFibGVDbG91ZCA9IHRoaXMuZ2V0VmFyaWFibGVWYWx1ZUJ5TmFtZShmb3JtVmFyaWFibGVzLCB2YXJpYWJsZU5hbWUpO1xuXG4gICAgICAgIHJldHVybiBwcm9jZXNzVmFyaWFibGVEcm9wZG93bk9wdGlvbnMgPz8gZm9ybVZhcmlhYmxlRHJvcGRvd25PcHRpb25zO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmFyaWFibGVWYWx1ZUJ5TmFtZSh2YXJpYWJsZXM6IFRhc2tWYXJpYWJsZUNsb3VkW10sIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlcz8uZmluZCgodmFyaWFibGU6IFRhc2tWYXJpYWJsZUNsb3VkKSA9PiB2YXJpYWJsZT8ubmFtZSA9PT0gYHZhcmlhYmxlcy4ke3ZhcmlhYmxlTmFtZX1gIHx8IHZhcmlhYmxlPy5uYW1lID09PSB2YXJpYWJsZU5hbWUpXG4gICAgICAgICAgICA/LnZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGVyc2lzdEZpZWxkT3B0aW9uc0Zyb21SZXN0QXBpKCkge1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkUmVzdENvbmZpZykge1xuICAgICAgICAgICAgdGhpcy5yZXNldFJlc3RBcGlFcnJvck1lc3NhZ2UoKTtcbiAgICAgICAgICAgIGNvbnN0IGJvZHlQYXJhbSA9IHRoaXMuYnVpbGRCb2R5UGFyYW0oKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNsb3VkU2VydmljZVxuICAgICAgICAgICAgICAgIC5nZXRSZXN0V2lkZ2V0RGF0YSh0aGlzLmZpZWxkLmZvcm0uaWQsIHRoaXMuZmllbGQuaWQsIGJvZHlQYXJhbSlcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogKHJlc3VsdDogRm9ybUZpZWxkT3B0aW9uW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRSZXN0QXBpRXJyb3JNZXNzYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbnMocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGQudXBkYXRlRm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEludmFsaWRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldFJlc3RBcGlPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRCb2R5UGFyYW0oKTogYW55IHtcbiAgICAgICAgY29uc3QgYm9keVBhcmFtID0gT2JqZWN0LmFzc2lnbih7fSk7XG4gICAgICAgIGlmICh0aGlzLmlzTGlua2VkV2lkZ2V0KSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRXaWRnZXRWYWx1ZSA9IHRoaXMuZ2V0UGFyZW50V2lkZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFdpZGdldElkID0gdGhpcy5saW5rZWRXaWRnZXRJZDtcbiAgICAgICAgICAgIGJvZHlQYXJhbVtwYXJlbnRXaWRnZXRJZF0gPSBwYXJlbnRXaWRnZXRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1VdGlsc1NlcnZpY2UuZ2V0UmVzdFVybFZhcmlhYmxlc01hcCh0aGlzLmZpZWxkLmZvcm0sIHRoaXMuZmllbGQucmVzdFVybCwgYm9keVBhcmFtKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRGaWVsZE9wdGlvbnNGb3JMaW5rZWRXaWRnZXQoKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFdpZGdldFZhbHVlID0gdGhpcy5nZXRQYXJlbnRXaWRnZXRWYWx1ZSgpO1xuICAgICAgICB0aGlzLnBhcmVudFZhbHVlQ2hhbmdlZChwYXJlbnRXaWRnZXRWYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5mb3JtU2VydmljZS5mb3JtRmllbGRWYWx1ZUNoYW5nZWRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoZXZlbnQ6IEZvcm1GaWVsZEV2ZW50KSA9PiB0aGlzLmlzRm9ybUZpZWxkRXZlbnRPZlR5cGVEcm9wZG93bihldmVudCkgJiYgdGhpcy5pc1BhcmVudEZvcm1GaWVsZEV2ZW50KGV2ZW50KSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBGb3JtRmllbGRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlT2ZQYXJlbnRXaWRnZXQgPSBldmVudC5maWVsZC52YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFZhbHVlQ2hhbmdlZCh2YWx1ZU9mUGFyZW50V2lkZ2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyZW50V2lkZ2V0VmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGFyZW50V2lkZ2V0SWQgPSB0aGlzLmxpbmtlZFdpZGdldElkO1xuICAgICAgICBjb25zdCBwYXJlbnRXaWRnZXQgPSB0aGlzLmdldEZvcm1GaWVsZEJ5SWQocGFyZW50V2lkZ2V0SWQpO1xuICAgICAgICByZXR1cm4gcGFyZW50V2lkZ2V0Py52YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcmVudFZhbHVlQ2hhbmdlZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhdGhpcy5pc05vbmVWYWx1ZVNlbGVjdGVkKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkUmVzdENvbmZpZyA/IHRoaXMucGVyc2lzdEZpZWxkT3B0aW9uc0Zyb21SZXN0QXBpKCkgOiB0aGlzLnBlcnNpc3RGaWVsZE9wdGlvbnNGcm9tTWFudWFsTGlzdCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc05vbmVWYWx1ZVNlbGVjdGVkKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldFJlc3RBcGlFcnJvck1lc3NhZ2UoKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRPcHRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0SW52YWxpZFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbnMoW10pO1xuICAgICAgICAgICAgdGhpcy5yZXNldEludmFsaWRWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc05vbmVWYWx1ZVNlbGVjdGVkKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGb3JtRmllbGRCeUlkKGZpZWxkSWQpOiBGb3JtRmllbGRNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkLmZvcm0uZ2V0Rm9ybUZpZWxkcygpLmZpbHRlcigoZmllbGQ6IEZvcm1GaWVsZE1vZGVsKSA9PiBmaWVsZC5pZCA9PT0gZmllbGRJZClbMF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwZXJzaXN0RmllbGRPcHRpb25zRnJvbU1hbnVhbExpc3QodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5oYXNSdWxlRW50cmllcygpKSB7XG4gICAgICAgICAgICBjb25zdCBydWxlc0VudHJpZXMgPSB0aGlzLmZpZWxkLnJ1bGUuZW50cmllcztcbiAgICAgICAgICAgIHJ1bGVzRW50cmllcy5mb3JFYWNoKChydWxlRW50cnk6IFJ1bGVFbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChydWxlRW50cnkua2V5ID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbnMocnVsZUVudHJ5Lm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0SW52YWxpZFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGQudXBkYXRlRm9ybSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldEludmFsaWRWYWx1ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRWYWx1ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0VmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRWYWx1ZSgpIHtcbiAgICAgICAgdGhpcy5maWVsZC52YWx1ZSA9ICcnO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWRGb3JGaWVsZCh0aGlzLmZpZWxkKTtcbiAgICAgICAgdGhpcy51cGRhdGVPcHRpb25zKCk7XG4gICAgICAgIHRoaXMuZmllbGQudXBkYXRlRm9ybSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZC52YWx1ZSAmJiB0aGlzLmlzU2VsZWN0ZWRWYWx1ZUluT3B0aW9ucygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNTZWxlY3RlZFZhbHVlSW5PcHRpb25zKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZpZWxkLnZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uSWRMaXN0ID0gWy4uLnRoaXMuZmllbGQub3B0aW9uc10ubWFwKChvcHRpb24pID0+IG9wdGlvbi5pZCk7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlSWRzID0gdGhpcy5maWVsZC52YWx1ZS5tYXAoKHZhbHVlT3B0aW9uKSA9PiB2YWx1ZU9wdGlvbi5pZCk7XG4gICAgICAgICAgICByZXR1cm4gZmllbGRWYWx1ZUlkcy5ldmVyeSgodmFsdWVPcHRpb25JZCkgPT4gb3B0aW9uSWRMaXN0LmluY2x1ZGVzKHZhbHVlT3B0aW9uSWQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkPy52YWx1ZSAmJiB0eXBlb2YgdGhpcy5maWVsZD8udmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi50aGlzLmZpZWxkLm9wdGlvbnNdLm1hcCgob3B0aW9uKSA9PiBvcHRpb24uaWQpLmluY2x1ZGVzKHRoaXMuZmllbGQudmFsdWUuaWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWy4uLnRoaXMuZmllbGQub3B0aW9uc10ubWFwKChvcHRpb24pID0+IG9wdGlvbi5pZCkuaW5jbHVkZXModGhpcy5maWVsZC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc1J1bGVFbnRyaWVzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpZWxkLnJ1bGUuZW50cmllcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldE9wdGlvbnMoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlT3B0aW9ucyhbXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1BhcmVudEZvcm1GaWVsZEV2ZW50KGV2ZW50OiBGb3JtRmllbGRFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXZlbnQuZmllbGQuaWQgPT09IHRoaXMubGlua2VkV2lkZ2V0SWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0Zvcm1GaWVsZEV2ZW50T2ZUeXBlRHJvcGRvd24oZXZlbnQ6IEZvcm1GaWVsZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBldmVudC5maWVsZC50eXBlID09PSBGb3JtRmllbGRUeXBlcy5EUk9QRE9XTjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldE9wdGlvblZhbHVlKG9wdGlvbjogRm9ybUZpZWxkT3B0aW9uIHwgRm9ybUZpZWxkT3B0aW9uW10sIGZpZWxkOiBGb3JtRmllbGRNb2RlbCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb24pIHx8IGZpZWxkLmhhc011bHRpcGxlVmFsdWVzKSB7XG4gICAgICAgICAgICBmaWVsZC52YWx1ZSA9IG9wdGlvbjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcHRpb25WYWx1ZTogc3RyaW5nID0gJyc7XG4gICAgICAgIGlmIChvcHRpb24uaWQgPT09IERFRkFVTFRfT1BUSU9OLmlkKSB7XG4gICAgICAgICAgICBvcHRpb25WYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb24ubmFtZSAhPT0gZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgIG9wdGlvblZhbHVlID0gb3B0aW9uLmlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9uVmFsdWUgPSBvcHRpb24ubmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkLnZhbHVlID0gb3B0aW9uVmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRQcmV2aWV3U3RhdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJldmlld1N0YXRlID0gdGhpcy5mb3JtQ2xvdWRTZXJ2aWNlLmdldFByZXZpZXdTdGF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMucHJldmlld1N0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLndpZGdldEVycm9yLmVtaXQoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVPcHRpb25zKG9wdGlvbnM/OiBGb3JtRmllbGRPcHRpb25bXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saXN0JC5uZXh0KHRoaXMuZmllbGQub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2hvd0lucHV0RmlsdGVyID0gdGhpcy5maWVsZC5vcHRpb25zLmxlbmd0aCA+IHRoaXMuYXBwQ29uZmlnLmdldDxudW1iZXI+KCdmb3JtLmRyb3BEb3duRmlsdGVyTGltaXQnLCBISURFX0ZJTFRFUl9MSU1JVCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldFJlc3RBcGlFcnJvck1lc3NhZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNSZXN0QXBpRmFpbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzdEFwaUhvc3ROYW1lID0gJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldFJlc3RBcGlPcHRpb25zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbnMoW10pO1xuICAgICAgICB0aGlzLnJlc2V0VmFsdWUoKTtcbiAgICAgICAgdGhpcy5pc1Jlc3RBcGlGYWlsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlc3RBcGlIb3N0TmFtZSA9IHRoaXMuZ2V0UmVzdFVybEhvc3ROYW1lKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSZXN0VXJsSG9zdE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKHRoaXMuZmllbGQ/LnJlc3RVcmwpLmhvc3RuYW1lO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpZWxkPy5yZXN0VXJsO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdlxuICAgIGNsYXNzPVwiYWRmLWRyb3Bkb3duLXdpZGdldCB7e2ZpZWxkLmNsYXNzTmFtZX19XCJcbiAgICBbY2xhc3MuYWRmLWludmFsaWRdPVwiZHJvcGRvd25Db250cm9sLmludmFsaWQgJiYgZHJvcGRvd25Db250cm9sLnRvdWNoZWRcIlxuICAgIFtjbGFzcy5hZGYtcmVhZG9ubHldPVwiZmllbGQucmVhZE9ubHlcIlxuICAgIFtjbGFzcy5hZGYtbGVmdC1sYWJlbC1pbnB1dC1jb250YWluZXJdPVwiZmllbGQubGVmdExhYmVsc1wiXG4+XG4gICAgPGRpdiAqbmdJZj1cImZpZWxkLmxlZnRMYWJlbHNcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiYWRmLWxhYmVsIGFkZi1sZWZ0LWxhYmVsXCIgW2F0dHIuZm9yXT1cImZpZWxkLmlkXCI+XG4gICAgICAgICAgICB7eyBmaWVsZC5uYW1lIHwgdHJhbnNsYXRlIH19PHNwYW4gY2xhc3M9XCJhZGYtYXN0ZXJpc2tcIiBbc3R5bGUudmlzaWJpbGl0eV09XCJpc1JlcXVpcmVkKCkgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1wiPio8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiYWRmLWZvcm0tZmllbGQtaW5wdXRcIj5cbiAgICAgICAgICAgIEBpZiAoIChmaWVsZC5uYW1lIHx8IHRoaXMuZmllbGQ/LnJlcXVpcmVkKSAmJiAhZmllbGQubGVmdExhYmVscykgeyAgPG1hdC1sYWJlbCBjbGFzcz1cImFkZi1sYWJlbFwiIFthdHRyLmZvcl09XCJmaWVsZC5pZFwiPnt7IGZpZWxkLm5hbWUgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD4gfVxuICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFkZi1zZWxlY3RcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJkcm9wZG93bkNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5pZFwiXG4gICAgICAgICAgICAgICAgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVEcm9wZG93blZhbHVlc1wiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImZpZWxkLnRvb2x0aXBcIlxuICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M9XCJhZGYtc2VsZWN0LWZpbHRlclwiXG4gICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImZpZWxkLmhhc011bHRpcGxlVmFsdWVzXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQucmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZCBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxhZGYtc2VsZWN0LWZpbHRlci1pbnB1dCAqbmdJZj1cInNob3dJbnB1dEZpbHRlclwiIChjaGFuZ2UpPVwiZmlsdGVyJC5uZXh0KCRldmVudClcIiAvPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBsaXN0JCB8IGFzeW5jXCIgW3ZhbHVlXT1cIm9wdFwiIFtpZF09XCJvcHQuaWRcIj57e29wdC5uYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gaWQ9XCJyZWFkb25seU9wdGlvblwiICpuZ0lmPVwiaXNSZWFkT25seVR5cGVcIiBbdmFsdWVdPVwiZmllbGQudmFsdWVcIj57e2ZpZWxkLnZhbHVlfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtZXJyb3ItbWVzc2FnZXMtY29udGFpbmVyXCIgKm5nSWY9XCIhcHJldmlld1N0YXRlICYmICFmaWVsZC5yZWFkT25seVwiPlxuICAgICAgICAgICAgPGVycm9yLXdpZGdldFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWRmLWRyb3Bkb3duLXJlcXVpcmVkLW1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1JlcXVpcmVkTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ7eyAnRk9STS5GSUVMRC5SRVFVSVJFRCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxlcnJvci13aWRnZXRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFkZi1kcm9wZG93bi1mYWlsZWQtbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc1Jlc3RBcGlGYWlsZWRcIlxuICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwie3sgJ0ZPUk0uRklFTEQuUkVTVF9BUElfRkFJTEVEJyB8IHRyYW5zbGF0ZTogeyBob3N0bmFtZTogcmVzdEFwaUhvc3ROYW1lIH0gfX1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxlcnJvci13aWRnZXRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFkZi1kcm9wZG93bi1mYWlsZWQtbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ2YXJpYWJsZU9wdGlvbnNGYWlsZWRcIlxuICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwie3sgJ0ZPUk0uRklFTEQuVkFSSUFCTEVfRFJPUERPV05fT1BUSU9OU19GQUlMRUQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -1,29 +0,0 @@
1
- /*!
2
- * @license
3
- * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- */
17
- import { DEFAULT_OPTION } from './dropdown-cloud.widget';
18
- export const defaultValueValidator = (filed) => (control) => {
19
- const optionsWithNoDefaultValue = filed.options.filter((dropdownOption) => {
20
- const isDefaultValue = dropdownOption.id === DEFAULT_OPTION.id;
21
- return !isDefaultValue;
22
- });
23
- const isSomeOptionSelected = optionsWithNoDefaultValue.some((dropdownOption) => {
24
- const isOptionSelected = dropdownOption.id === control.value?.id;
25
- return isOptionSelected;
26
- });
27
- return isSomeOptionSelected ? null : { required: true };
28
- };
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9wcm9jZXNzLXNlcnZpY2VzLWNsb3VkL3NyYy9saWIvZm9ybS9jb21wb25lbnRzL3dpZGdldHMvZHJvcGRvd24vdmFsaWRhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQzlCLENBQUMsS0FBcUIsRUFBZSxFQUFFLENBQ3ZDLENBQUMsT0FBd0IsRUFBMkIsRUFBRTtJQUNsRCxNQUFNLHlCQUF5QixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUU7UUFDdEUsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLEVBQUUsS0FBSyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBRS9ELE9BQU8sQ0FBQyxjQUFjLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLG9CQUFvQixHQUFHLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFO1FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcsY0FBYyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUVqRSxPQUFPLGdCQUFnQixDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM1RCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZvcm1GaWVsZE1vZGVsIH0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb3JlJztcbmltcG9ydCB7IFZhbGlkYXRvckZuLCBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBERUZBVUxUX09QVElPTiB9IGZyb20gJy4vZHJvcGRvd24tY2xvdWQud2lkZ2V0JztcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRWYWx1ZVZhbGlkYXRvciA9XG4gICAgKGZpbGVkOiBGb3JtRmllbGRNb2RlbCk6IFZhbGlkYXRvckZuID0+XG4gICAgKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1dpdGhOb0RlZmF1bHRWYWx1ZSA9IGZpbGVkLm9wdGlvbnMuZmlsdGVyKChkcm9wZG93bk9wdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNEZWZhdWx0VmFsdWUgPSBkcm9wZG93bk9wdGlvbi5pZCA9PT0gREVGQVVMVF9PUFRJT04uaWQ7XG5cbiAgICAgICAgICAgIHJldHVybiAhaXNEZWZhdWx0VmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGlzU29tZU9wdGlvblNlbGVjdGVkID0gb3B0aW9uc1dpdGhOb0RlZmF1bHRWYWx1ZS5zb21lKChkcm9wZG93bk9wdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNPcHRpb25TZWxlY3RlZCA9IGRyb3Bkb3duT3B0aW9uLmlkID09PSBjb250cm9sLnZhbHVlPy5pZDtcblxuICAgICAgICAgICAgcmV0dXJuIGlzT3B0aW9uU2VsZWN0ZWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpc1NvbWVPcHRpb25TZWxlY3RlZCA/IG51bGwgOiB7IHJlcXVpcmVkOiB0cnVlIH07XG4gICAgfTtcbiJdfQ==