@veloceapps/sdk 8.0.0-78 → 8.0.0-79

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. package/README.md +0 -1
  2. package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +5 -5
  3. package/esm2020/core/modules/configuration/services/configuration.service.mjs +3 -3
  4. package/esm2020/core/modules/configuration/services/runtime-context.service.mjs +6 -6
  5. package/esm2020/src/flow-routing.module.mjs +1 -18
  6. package/esm2020/src/pages/product/product.component.mjs +2 -3
  7. package/esm2020/src/pages/remote/remote.component.mjs +5 -6
  8. package/fesm2015/veloceapps-sdk-core.mjs +16 -15
  9. package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
  10. package/fesm2015/veloceapps-sdk.mjs +8 -160
  11. package/fesm2015/veloceapps-sdk.mjs.map +1 -1
  12. package/fesm2020/veloceapps-sdk-core.mjs +9 -9
  13. package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
  14. package/fesm2020/veloceapps-sdk.mjs +6 -161
  15. package/fesm2020/veloceapps-sdk.mjs.map +1 -1
  16. package/package.json +1 -9
  17. package/src/flow-routing.module.d.ts +6 -7
  18. package/esm2020/runtime/components/component-preview/component-preview.component.mjs +0 -125
  19. package/esm2020/runtime/components/index.mjs +0 -5
  20. package/esm2020/runtime/components/section-renderer/section-renderer.component.mjs +0 -67
  21. package/esm2020/runtime/components/ui-runtime/runtime.component.mjs +0 -440
  22. package/esm2020/runtime/components/ui-runtime-preview/runtime-preview.component.mjs +0 -108
  23. package/esm2020/runtime/execution/components/children-placeholder/children-placeholder.component.mjs +0 -60
  24. package/esm2020/runtime/execution/components/context-provider/context-provider.component.mjs +0 -39
  25. package/esm2020/runtime/execution/components/execution-section-renderer/execution-section-renderer.component.mjs +0 -67
  26. package/esm2020/runtime/execution/components/federated/federated.component.mjs +0 -74
  27. package/esm2020/runtime/execution/components/velo-attribute/velo-attribute.component.mjs +0 -60
  28. package/esm2020/runtime/execution/components/velo-multiselect/velo-multiselect.component.mjs +0 -130
  29. package/esm2020/runtime/execution/components/velo-port-checkbox/velo-port-checkbox.component.mjs +0 -72
  30. package/esm2020/runtime/execution/components/velo-port-dropdown/velo-port-dropdown.component.mjs +0 -97
  31. package/esm2020/runtime/execution/components/velo-port-radio/velo-port-radio.component.mjs +0 -142
  32. package/esm2020/runtime/execution/components/velo-type/velo-type.component.mjs +0 -119
  33. package/esm2020/runtime/execution/directives/section-script.directive.mjs +0 -247
  34. package/esm2020/runtime/execution/directives/sf-query.directive.mjs +0 -35
  35. package/esm2020/runtime/execution/directives/velo-attribute.directive.mjs +0 -88
  36. package/esm2020/runtime/execution/directives/velo-port.directive.mjs +0 -376
  37. package/esm2020/runtime/execution/directives/vl-approval.directive.mjs +0 -23
  38. package/esm2020/runtime/execution/directives/vl-document-attachments.directive.mjs +0 -36
  39. package/esm2020/runtime/execution/directives/vl-document-templates.directive.mjs +0 -60
  40. package/esm2020/runtime/execution/directives/vl-quote.directive.mjs +0 -42
  41. package/esm2020/runtime/execution/directives/vl-ramp.directive.mjs +0 -55
  42. package/esm2020/runtime/execution/runtime-execution.module.mjs +0 -133
  43. package/esm2020/runtime/execution/utils/federated.util.mjs +0 -32
  44. package/esm2020/runtime/index.mjs +0 -5
  45. package/esm2020/runtime/runtime.module.mjs +0 -74
  46. package/esm2020/runtime/services/cart.service.mjs +0 -29
  47. package/esm2020/runtime/services/collapsible-state.service.mjs +0 -34
  48. package/esm2020/runtime/services/configuration.service.mjs +0 -119
  49. package/esm2020/runtime/services/current-state.service.mjs +0 -17
  50. package/esm2020/runtime/services/form-scope.service.mjs +0 -30
  51. package/esm2020/runtime/services/index.mjs +0 -4
  52. package/esm2020/runtime/services/product-model-cache.service.mjs +0 -31
  53. package/esm2020/runtime/services/runtime-context.service.mjs +0 -60
  54. package/esm2020/runtime/services/runtime-form.service.mjs +0 -219
  55. package/esm2020/runtime/services/runtime.service.mjs +0 -115
  56. package/esm2020/runtime/services/section-helper.service.mjs +0 -27
  57. package/esm2020/runtime/services/section-scope.service.mjs +0 -36
  58. package/esm2020/runtime/services/section-store.service.mjs +0 -22
  59. package/esm2020/runtime/services/section.service.mjs +0 -117
  60. package/esm2020/runtime/types/bound-data.types.mjs +0 -7
  61. package/esm2020/runtime/types/index.mjs +0 -3
  62. package/esm2020/runtime/types/quote-states.types.mjs +0 -2
  63. package/esm2020/runtime/types/runtime.types.mjs +0 -2
  64. package/esm2020/runtime/types/script-registry.types.mjs +0 -51
  65. package/esm2020/runtime/utils/line-item.util.mjs +0 -270
  66. package/esm2020/runtime/utils/section.utils.mjs +0 -26
  67. package/esm2020/runtime/utils/sections-binder.helper.mjs +0 -105
  68. package/esm2020/runtime/veloceapps-sdk-runtime.mjs +0 -5
  69. package/esm2020/src/pages/legacy-product/legacy-product.component.mjs +0 -137
  70. package/esm2020/src/pages/legacy-product/legacy-product.module.mjs +0 -19
  71. package/fesm2015/veloceapps-sdk-runtime.mjs +0 -3770
  72. package/fesm2015/veloceapps-sdk-runtime.mjs.map +0 -1
  73. package/fesm2020/veloceapps-sdk-runtime.mjs +0 -3767
  74. package/fesm2020/veloceapps-sdk-runtime.mjs.map +0 -1
  75. package/runtime/README.md +0 -5
  76. package/runtime/components/component-preview/component-preview.component.d.ts +0 -27
  77. package/runtime/components/index.d.ts +0 -4
  78. package/runtime/components/section-renderer/section-renderer.component.d.ts +0 -25
  79. package/runtime/components/ui-runtime/runtime.component.d.ts +0 -53
  80. package/runtime/components/ui-runtime-preview/runtime-preview.component.d.ts +0 -27
  81. package/runtime/execution/components/children-placeholder/children-placeholder.component.d.ts +0 -30
  82. package/runtime/execution/components/context-provider/context-provider.component.d.ts +0 -14
  83. package/runtime/execution/components/execution-section-renderer/execution-section-renderer.component.d.ts +0 -25
  84. package/runtime/execution/components/federated/federated.component.d.ts +0 -36
  85. package/runtime/execution/components/velo-attribute/velo-attribute.component.d.ts +0 -19
  86. package/runtime/execution/components/velo-multiselect/velo-multiselect.component.d.ts +0 -35
  87. package/runtime/execution/components/velo-port-checkbox/velo-port-checkbox.component.d.ts +0 -22
  88. package/runtime/execution/components/velo-port-dropdown/velo-port-dropdown.component.d.ts +0 -22
  89. package/runtime/execution/components/velo-port-radio/velo-port-radio.component.d.ts +0 -28
  90. package/runtime/execution/components/velo-type/velo-type.component.d.ts +0 -31
  91. package/runtime/execution/directives/section-script.directive.d.ts +0 -59
  92. package/runtime/execution/directives/sf-query.directive.d.ts +0 -15
  93. package/runtime/execution/directives/velo-attribute.directive.d.ts +0 -26
  94. package/runtime/execution/directives/velo-port.directive.d.ts +0 -74
  95. package/runtime/execution/directives/vl-approval.directive.d.ts +0 -10
  96. package/runtime/execution/directives/vl-document-attachments.directive.d.ts +0 -15
  97. package/runtime/execution/directives/vl-document-templates.directive.d.ts +0 -33
  98. package/runtime/execution/directives/vl-quote.directive.d.ts +0 -14
  99. package/runtime/execution/directives/vl-ramp.directive.d.ts +0 -15
  100. package/runtime/execution/runtime-execution.module.d.ts +0 -25
  101. package/runtime/execution/utils/federated.util.d.ts +0 -6
  102. package/runtime/index.d.ts +0 -4
  103. package/runtime/runtime.module.d.ts +0 -16
  104. package/runtime/services/cart.service.d.ts +0 -15
  105. package/runtime/services/collapsible-state.service.d.ts +0 -15
  106. package/runtime/services/configuration.service.d.ts +0 -20
  107. package/runtime/services/current-state.service.d.ts +0 -8
  108. package/runtime/services/form-scope.service.d.ts +0 -20
  109. package/runtime/services/index.d.ts +0 -3
  110. package/runtime/services/product-model-cache.service.d.ts +0 -14
  111. package/runtime/services/runtime-context.service.d.ts +0 -16
  112. package/runtime/services/runtime-form.service.d.ts +0 -24
  113. package/runtime/services/runtime.service.d.ts +0 -44
  114. package/runtime/services/section-helper.service.d.ts +0 -8
  115. package/runtime/services/section-scope.service.d.ts +0 -14
  116. package/runtime/services/section-store.service.d.ts +0 -11
  117. package/runtime/services/section.service.d.ts +0 -30
  118. package/runtime/types/bound-data.types.d.ts +0 -13
  119. package/runtime/types/index.d.ts +0 -2
  120. package/runtime/types/quote-states.types.d.ts +0 -6
  121. package/runtime/types/runtime.types.d.ts +0 -19
  122. package/runtime/types/script-registry.types.d.ts +0 -13
  123. package/runtime/utils/line-item.util.d.ts +0 -34
  124. package/runtime/utils/section.utils.d.ts +0 -2
  125. package/runtime/utils/sections-binder.helper.d.ts +0 -16
  126. package/src/pages/legacy-product/legacy-product.component.d.ts +0 -37
  127. package/src/pages/legacy-product/legacy-product.module.d.ts +0 -9
@@ -1,440 +0,0 @@
1
- import { HttpErrorResponse } from '@angular/common/http';
2
- import { ChangeDetectorRef, Component, EventEmitter, Inject, Output } from '@angular/core';
3
- import { FormGroup } from '@angular/forms';
4
- import { EntityUtil, OrderByPipe, SalesforceIdUtils, SearchFilterPipe, UUID, } from '@veloceapps/core';
5
- import { ContextService } from '@veloceapps/sdk/core';
6
- import { MessageService } from 'primeng/api';
7
- import { Subject } from 'rxjs';
8
- import { takeUntil } from 'rxjs/operators';
9
- import { CollapsibleStateService } from '../../services/collapsible-state.service';
10
- import { FormScopeService } from '../../services/form-scope.service';
11
- import { RuntimeFormService } from '../../services/runtime-form.service';
12
- import { RuntimeService } from '../../services/runtime.service';
13
- import { SectionHelperService } from '../../services/section-helper.service';
14
- import { SectionsService } from '../../services/section.service';
15
- import { BoundDataType } from '../../types/bound-data.types';
16
- import { LineItemUtil } from '../../utils/line-item.util';
17
- import { getSectionTree } from '../../utils/section.utils';
18
- import { SectionsBinderHelper } from '../../utils/sections-binder.helper';
19
- import * as i0 from "@angular/core";
20
- import * as i1 from "../../services/section.service";
21
- import * as i2 from "../../services/form-scope.service";
22
- import * as i3 from "../../services/collapsible-state.service";
23
- import * as i4 from "../../services/runtime-form.service";
24
- import * as i5 from "../../services/runtime.service";
25
- import * as i6 from "@veloceapps/sdk/core";
26
- import * as i7 from "@veloceapps/core";
27
- import * as i8 from "@angular/common";
28
- import * as i9 from "@angular/forms";
29
- import * as i10 from "@veloceapps/components";
30
- import * as i11 from "../section-renderer/section-renderer.component";
31
- import * as i12 from "primeng/api";
32
- export class RuntimeComponent {
33
- constructor(sectionsService, formScope, collapsibleState, formService, runtimeService, messageService, contextService, orderByPipe, searchFilterPipe, cdr) {
34
- this.sectionsService = sectionsService;
35
- this.formScope = formScope;
36
- this.collapsibleState = collapsibleState;
37
- this.formService = formService;
38
- this.runtimeService = runtimeService;
39
- this.messageService = messageService;
40
- this.contextService = contextService;
41
- this.orderByPipe = orderByPipe;
42
- this.searchFilterPipe = searchFilterPipe;
43
- this.cdr = cdr;
44
- this.messageBucketId = 'ui.runtime';
45
- this.sortedSections = [];
46
- this.staticSections = [];
47
- this.form = new FormGroup({});
48
- this.solutionIsReady = false;
49
- this.unsubscribe = new Subject();
50
- this.solutionUpdated = new EventEmitter();
51
- }
52
- adjustPrice(valueOption, section, solutionLineItem, patch) {
53
- const parentLineItem = section.model && LineItemUtil.findById(section.model.id, [solutionLineItem]);
54
- if (!parentLineItem) {
55
- return;
56
- }
57
- parentLineItem.lineItems = parentLineItem.lineItems.map(lineItem => {
58
- const { productId, chargeItems } = lineItem;
59
- if (productId !== valueOption) {
60
- return lineItem;
61
- }
62
- const chargeItem = chargeItems.shift();
63
- const updatedChargeItem = {
64
- ...chargeItem,
65
- ...patch,
66
- };
67
- return {
68
- ...lineItem,
69
- chargeItems: [updatedChargeItem, ...chargeItems],
70
- };
71
- });
72
- this.updateRuntime(solutionLineItem);
73
- }
74
- ngOnInit() {
75
- this.formScope.formSubmitEvent.pipe(takeUntil(this.unsubscribe)).subscribe((e) => {
76
- try {
77
- this.form.updateValueAndValidity();
78
- const solutionLineItem = EntityUtil.clone(this.solutionLineItem);
79
- const section = this.findSection(e.id);
80
- if (!section) {
81
- throw 'Section not found';
82
- }
83
- const entityType = section.boundData.entityType;
84
- if (entityType === BoundDataType[BoundDataType.PORT] || entityType === BoundDataType[BoundDataType.TYPE]) {
85
- if (e.action === 'patch' && EntityUtil.isPresent(e.valueOption)) {
86
- const valueOption = e['valueOption'];
87
- if (!section.model?.parentId) {
88
- this.collapsibleState.clearState(section.id);
89
- this.updateRuntime(valueOption);
90
- }
91
- else {
92
- const parentLineItem = LineItemUtil.findById(section.model.parentId, [solutionLineItem]);
93
- if (parentLineItem) {
94
- const indx = parentLineItem.lineItems.findIndex(item => item.id === section.model?.id);
95
- parentLineItem.lineItems.splice(indx, 1, valueOption);
96
- this.collapsibleState.clearState(section.id);
97
- this.updateRuntime(solutionLineItem);
98
- }
99
- }
100
- }
101
- }
102
- if (entityType === BoundDataType[BoundDataType.PORT]) {
103
- if (e.action === 'upsert') {
104
- const parentLineItem = section.model && LineItemUtil.findById(section.model.id, [solutionLineItem]);
105
- if (parentLineItem) {
106
- parentLineItem.lineItems.forEach(i => {
107
- if (e.selectedValueOptions &&
108
- e.selectedValueOptions.findIndex(v => v.toLowerCase() === i.type.toLowerCase()) < 0) {
109
- this.updateCardinalityVariable(parentLineItem, i, 0);
110
- }
111
- });
112
- const lineItems = parentLineItem?.lineItems.filter(i => e.selectedValueOptions &&
113
- e.selectedValueOptions.findIndex(v => v.toLowerCase() === i.type.toLowerCase()) > -1);
114
- e.selectedValueOptions?.forEach(v => {
115
- if (lineItems?.findIndex(item => item.type.toLowerCase() === v.toLowerCase()) === -1) {
116
- const lineItem = this.createLineItem(section, v, parentLineItem);
117
- this.updateCardinalityVariable(parentLineItem, lineItem);
118
- lineItems.push(lineItem);
119
- }
120
- });
121
- this.updateRuntime(solutionLineItem);
122
- }
123
- }
124
- if (e.action === 'create') {
125
- const parentLineItem = section.model && LineItemUtil.findById(section.model.id, [solutionLineItem]);
126
- if (parentLineItem) {
127
- const valueOption = e.valueOption;
128
- const lineItem = this.createLineItem(section, valueOption, parentLineItem);
129
- parentLineItem.lineItems.push(lineItem);
130
- this.updateCardinalityVariable(parentLineItem, lineItem);
131
- this.updateRuntime(solutionLineItem);
132
- }
133
- }
134
- if (e.action === 'copy') {
135
- const parentLineItem = section.model && LineItemUtil.findById(section.model.id, [solutionLineItem]);
136
- if (parentLineItem) {
137
- const valueOption = e.valueOption;
138
- const lineItemToCopy = parentLineItem.lineItems.find(li => li.id === valueOption);
139
- if (lineItemToCopy) {
140
- const lineItem = { ...lineItemToCopy, id: '' };
141
- parentLineItem.lineItems.push(lineItem);
142
- this.updateCardinalityVariable(parentLineItem, lineItem);
143
- this.updateRuntime(solutionLineItem);
144
- }
145
- }
146
- }
147
- if (e.action === 'update') {
148
- const parentLineItem = section.model && LineItemUtil.findById(section.model.id, [solutionLineItem]);
149
- if (parentLineItem) {
150
- //Assuming that radio control is the only control, that 'updates' values
151
- const previous = section.model?.lineItems.filter(li => li.port && li.port === section.boundData.name)[0];
152
- if (previous) {
153
- this.updateCardinalityVariable(parentLineItem, previous, 0);
154
- }
155
- const index = parentLineItem.lineItems.findIndex(li => li.id === previous?.id);
156
- const lineItem = {
157
- id: UUID.UUID(),
158
- qty: previous?.qty,
159
- port: previous?.port,
160
- type: EntityUtil.isPresent(e.valueOption) ? e.valueOption : this.form.controls[e.id].value,
161
- cfgStatus: 'New',
162
- parentId: previous?.parentId,
163
- };
164
- this.updateCardinalityVariable(parentLineItem, lineItem);
165
- parentLineItem.lineItems[index] = lineItem;
166
- this.updateRuntime(solutionLineItem);
167
- }
168
- }
169
- if (e.action === 'remove') {
170
- const parentLineItem = section.model && LineItemUtil.findById(section.model.id, [solutionLineItem]);
171
- if (parentLineItem &&
172
- SectionsBinderHelper.isRemoveAllowed(parentLineItem, section.boundData.name, section.model?.qty)) {
173
- const index = parentLineItem.lineItems.findIndex(item => item.type.toLowerCase() === e.valueOption?.toLowerCase());
174
- if (index > -1) {
175
- const removed = parentLineItem.lineItems.splice(index, 1)[0];
176
- this.updateCardinalityVariable(parentLineItem, removed, 0);
177
- this.updateRuntime(solutionLineItem);
178
- }
179
- }
180
- }
181
- if (e.action === 'qtyUpdate') {
182
- const typeSection = e.valueOption
183
- ? SectionHelperService.findSectionForValue(section, e.valueOption)
184
- : undefined;
185
- const typeLineItem = typeSection?.model && LineItemUtil.findById(typeSection.model.id, [solutionLineItem]);
186
- if (typeSection && typeLineItem) {
187
- typeLineItem.qty = +this.form.controls[typeSection.id + 'qty'].value;
188
- typeLineItem.cfgStatus = 'User';
189
- this.updateRuntime(solutionLineItem);
190
- }
191
- }
192
- if (e.action === 'adjustNetPrice') {
193
- const { valueOption, options } = e;
194
- const { amount } = options ?? {};
195
- const priceAdjustment = {
196
- type: 'OVERRIDE_AMOUNT',
197
- explanation: 'Manual net price adjustment',
198
- formula: '',
199
- amount,
200
- };
201
- this.adjustPrice(valueOption, section, solutionLineItem, { priceAdjustment });
202
- }
203
- if (e.action === 'adjustListPrice') {
204
- const { valueOption, options } = e;
205
- const { amount } = options ?? {};
206
- const listPriceAdjustment = {
207
- type: 'OVERRIDE_AMOUNT',
208
- explanation: 'Manual list price adjustment',
209
- formula: '',
210
- amount,
211
- };
212
- this.adjustPrice(valueOption, section, solutionLineItem, { listPriceAdjustment });
213
- }
214
- }
215
- if (entityType === BoundDataType[BoundDataType.TYPE]) {
216
- if (e.action === 'remove') {
217
- const parentLineItem = section.model?.parentId && LineItemUtil.findById(section.model.parentId, [solutionLineItem]);
218
- if (parentLineItem &&
219
- section.model &&
220
- section.model.port &&
221
- SectionsBinderHelper.isRemoveAllowed(parentLineItem, section.model.port, section.model?.qty)) {
222
- const index = parentLineItem.lineItems.findIndex(item => item.id === section.model?.id);
223
- if (index > -1) {
224
- const removed = parentLineItem.lineItems.splice(index, 1)[0];
225
- this.updateCardinalityVariable(parentLineItem, removed, 0);
226
- this.collapsibleState.clearState(section.id);
227
- this.updateRuntime(solutionLineItem);
228
- }
229
- }
230
- }
231
- if (e.action === 'qtyUpdate') {
232
- const typeLineItem = section.model && LineItemUtil.findById(section.model.id, [solutionLineItem]);
233
- if (typeLineItem) {
234
- const qty = +this.form.controls[e.id + 'qty'].value;
235
- if (typeLineItem.parentId) {
236
- const parentLineItem = LineItemUtil.findById(typeLineItem.parentId, [solutionLineItem]);
237
- if (parentLineItem) {
238
- this.updateCardinalityVariable(parentLineItem, typeLineItem, qty);
239
- }
240
- }
241
- typeLineItem.qty = qty;
242
- typeLineItem.cfgStatus = 'User';
243
- this.updateRuntime(solutionLineItem);
244
- }
245
- }
246
- }
247
- if (entityType === BoundDataType[BoundDataType.ATTRIBUTE]) {
248
- if (e.action === 'update') {
249
- const parentLineItem = section.model && LineItemUtil.findById(section.model.id, [solutionLineItem]);
250
- const attribute = parentLineItem?.attributes.find(attr => attr.name.toLowerCase() === section.boundData.name.toLowerCase());
251
- if (attribute) {
252
- //Explicitly set value always win
253
- let value = typeof e.valueOption !== 'undefined' ? e.valueOption : this.form.controls[e.id].value;
254
- if (attribute.type === 'BOOLEAN') {
255
- value = value ? 1 : 0;
256
- }
257
- attribute.value = value;
258
- attribute.cfgStatus = 'User';
259
- this.updateRuntime(solutionLineItem);
260
- }
261
- }
262
- }
263
- }
264
- catch (e) {
265
- console.log(e);
266
- this.messageService.add({ key: this.messageBucketId, summary: `Configuration failed ${e?.message}` });
267
- }
268
- });
269
- this.runtimeService.onSolutionReadyEvent
270
- .pipe(takeUntil(this.unsubscribe))
271
- .subscribe(lineItem => this.onSolutionReady(lineItem));
272
- this.runtimeService.onSolutionUpdatedEvent
273
- .pipe(takeUntil(this.unsubscribe))
274
- .subscribe((data) => {
275
- if (!(data instanceof HttpErrorResponse)) {
276
- return this.handleSolutionUpdate(data);
277
- }
278
- this.handleSolutionFailedUpdate(data);
279
- });
280
- this.runtimeService.onUIRefreshEvent.pipe(takeUntil(this.unsubscribe)).subscribe(() => {
281
- const { uiDefinition } = this.runtimeService.getRuntimeContext() ?? {};
282
- this.runtimeContext.uiDefinition = uiDefinition;
283
- this.formScope.scriptSessionScope = {};
284
- this.startRuntime();
285
- });
286
- }
287
- onSolutionReady(lineItem) {
288
- const context = this.runtimeService.getRuntimeContext();
289
- const configurationContext = this.contextService.resolve();
290
- const mergeContext = {
291
- ...context,
292
- properties: {
293
- ...context.properties,
294
- ...configurationContext.properties,
295
- },
296
- };
297
- const accountId = mergeContext.properties?.AccountId;
298
- if (accountId && accountId.length === 15) {
299
- this.runtimeContext = {
300
- ...mergeContext,
301
- properties: {
302
- ...mergeContext.properties,
303
- AccountId: SalesforceIdUtils.generateId18FromId15(accountId),
304
- },
305
- };
306
- }
307
- else {
308
- this.runtimeContext = mergeContext;
309
- }
310
- this.solutionLineItem = lineItem;
311
- this.runtimeService.setRuntimeContext(this.runtimeContext);
312
- this.startRuntime();
313
- }
314
- handleSolutionUpdate(updatedLineItem) {
315
- this.solutionLineItem = updatedLineItem;
316
- this.processSolution(true);
317
- this.runtimeService.solutionProcessed(this.solutionLineItem);
318
- this.cdr.detectChanges();
319
- }
320
- handleSolutionFailedUpdate(error) {
321
- const hasErrorMessage = EntityUtil.isPresent(error.error) && EntityUtil.isPresent(error.error.message);
322
- const message = hasErrorMessage ? error.error.message : 'Configuration failed';
323
- const { isHandlingConfigurationErrors } = this.runtimeContext.uiDefinition ?? {};
324
- if (isHandlingConfigurationErrors) {
325
- this.messageService.add({ key: this.messageBucketId, summary: message });
326
- }
327
- this.solutionLineItem = {
328
- ...this.solutionLineItem,
329
- messages: [...this.solutionLineItem.messages, `E:${message}`],
330
- };
331
- this.processSolution(true, true);
332
- this.runtimeService.solutionProcessed(this.solutionLineItem);
333
- this.cdr.detectChanges();
334
- }
335
- updateCardinalityVariable(parent, updated, newQuantity) {
336
- const portDomain = updated.port ? parent.portDomains[updated.port] : undefined;
337
- const domainType = portDomain?.domainTypes.find(t => t.name === updated.type);
338
- const cardinality = domainType?.cardinality ?? 0;
339
- let qty;
340
- if (!Number.isFinite(domainType?.cardinality)) {
341
- qty = Number.isFinite(newQuantity) ? newQuantity : updated.qty;
342
- }
343
- else {
344
- qty = EntityUtil.isPresent(newQuantity)
345
- ? cardinality - updated.qty + newQuantity
346
- : cardinality + updated.qty;
347
- }
348
- const cardinalityName = '#CV-' + updated.type + '@' + updated.port;
349
- let cardinalityVariable = parent.attributes.find(a => a.name === cardinalityName);
350
- if (!cardinalityVariable) {
351
- cardinalityVariable = {
352
- id: UUID.UUID(),
353
- name: cardinalityName,
354
- };
355
- parent.attributes.push(cardinalityVariable);
356
- }
357
- cardinalityVariable.value = qty;
358
- cardinalityVariable.cfgStatus = 'User';
359
- }
360
- createLineItem(section, valueOption, parentLineItem) {
361
- return {
362
- qty: +this.form.controls[section.id + 'qty'].value,
363
- port: section.boundData.name,
364
- type: EntityUtil.isPresent(valueOption) ? valueOption : this.form.controls[section.id].value,
365
- cfgStatus: 'New',
366
- parentId: parentLineItem?.id,
367
- };
368
- }
369
- ngOnDestroy() {
370
- this.unsubscribe.next();
371
- this.sectionsService.destroy();
372
- }
373
- startRuntime() {
374
- const uiDefinition = this.runtimeContext.uiDefinition;
375
- const defaultTab = uiDefinition?.tabs?.find(tab => tab.isDefault);
376
- this.activeUITab = EntityUtil.isPresent(defaultTab) ? defaultTab : uiDefinition?.tabs?.[0];
377
- this.sectionsService.compileModule(uiDefinition?.sections ?? [], uiDefinition?.isViewEncapsulated);
378
- this.processSolution();
379
- this.solutionIsReady = true;
380
- this.cdr.detectChanges();
381
- }
382
- updateRuntime(lineItem) {
383
- this.solutionUpdated.emit(lineItem);
384
- }
385
- addToCart() {
386
- const lineItem = EntityUtil.clone(this.solutionLineItem);
387
- this.runtimeService.stopRuntime(lineItem);
388
- }
389
- processSolution(isUpdate, isError) {
390
- //1. Bind sections to solution
391
- let sections = EntityUtil.clone(this.runtimeContext.uiDefinition?.sections) ?? [];
392
- const sourceSections = EntityUtil.clone(this.runtimeContext.uiDefinition?.sections) ?? [];
393
- this.updateLineItemsSectionPath(this.solutionLineItem);
394
- SectionsBinderHelper.setLineItemsPath(this.runtimeContext.runtimeModel, this.solutionLineItem, sections, sourceSections, (sec) => !sec.parentId && sec.boundData, this.runtimeContext.uiDefinition?.pricingEnabled ?? false);
395
- sections = sections.filter(s => s.model && s.template);
396
- //2. Init form
397
- this.form = this.formService.initForm(sections, this.solutionLineItem);
398
- this.formScope.form = this.form;
399
- this.sortedSections = this.filterAndSort(getSectionTree(sections.filter(s => !s.isStatic)));
400
- if (!isUpdate) {
401
- this.staticSections = this.filterAndSort(getSectionTree(sections.filter(s => s.isStatic)));
402
- }
403
- if (!isError) {
404
- this.messageService.clear(this.messageBucketId);
405
- }
406
- }
407
- hideModal() {
408
- this.runtimeService.cancelRuntime();
409
- }
410
- updateLineItemsSectionPath(lineItem, parent) {
411
- const path = {
412
- types: parent ? parent.types.concat([lineItem.type]) : [lineItem.type],
413
- ports: parent ? parent.ports.concat(lineItem.port ? [lineItem.port] : []) : [],
414
- };
415
- lineItem.path = path;
416
- for (const child of lineItem.lineItems) {
417
- this.updateLineItemsSectionPath(child, lineItem.path);
418
- }
419
- }
420
- filterAndSort(sections) {
421
- const filtered = this.searchFilterPipe.transform(sections, this.activeUITab?.id, 'page');
422
- const ordered = this.orderByPipe.transform(filtered, 'order', 'asc');
423
- return ordered;
424
- }
425
- findSection(id) {
426
- return EntityUtil.findByFieldHierarchically('id', id, [...this.sortedSections, ...this.staticSections], 'children');
427
- }
428
- }
429
- RuntimeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeComponent, deps: [{ token: i1.SectionsService }, { token: i2.FormScopeService }, { token: i3.CollapsibleStateService }, { token: i4.RuntimeFormService }, { token: i5.RuntimeService }, { token: MessageService }, { token: i6.ContextService }, { token: i7.OrderByPipe }, { token: i7.SearchFilterPipe }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
430
- RuntimeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: RuntimeComponent, selector: "vl-runtime", outputs: { solutionUpdated: "solutionUpdated" }, providers: [FormScopeService, CollapsibleStateService, OrderByPipe, SearchFilterPipe], ngImport: i0, template: "<vl-loader label=\"Loading UI\" *ngIf=\"!solutionIsReady; else content\"></vl-loader>\n\n<ng-template #content>\n <div\n class=\"sidebar-tabs\"\n [ngClass]=\"{ hidden: !runtimeContext?.uiDefinition?.defaultPanels }\"\n #uiTabs=\"sidebarTabs\"\n sidebarTabs=\"{{ activeUITab?.id }}\"\n id=\"vl-default-sidebar-tabs\"\n >\n <ul>\n <li\n *ngFor=\"let tab of runtimeContext?.uiDefinition?.tabs | orderBy: 'order':'asc'\"\n [ngClass]=\"{ active: uiTabs.activeTab === tab.id }\"\n (click)=\"uiTabs.switchTab(tab.id)\"\n >\n <a href=\"javascript:void(0);\">{{ tab.name }}</a>\n </li>\n </ul>\n </div>\n\n <div class=\"sections-wrapper\">\n <form role=\"form\" name=\"form\" class=\"form-horizontal\" [formGroup]=\"form\" novalidate autocomplete=\"off\">\n <ng-container *ngFor=\"let section of staticSections; let i = index\">\n <ng-container *ngIf=\"section.model && section.template && !section.hidden\">\n <vl-section-renderer [section]=\"section\" [form]=\"form\"></vl-section-renderer>\n </ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let section of sortedSections; let i = index\">\n <ng-container *ngIf=\"section.model && section.template && !section.hidden\">\n <vl-section-renderer [section]=\"section\" [form]=\"form\"></vl-section-renderer>\n </ng-container>\n </ng-container>\n </form>\n\n <div\n class=\"modal-footer\"\n *ngIf=\"runtimeContext?.runtimeMode === 1\"\n id=\"vl-runtime-default-footer\"\n [ngClass]=\"{ hidden: !runtimeContext?.uiDefinition?.defaultPanels }\"\n >\n <div class=\"col-md-12 input-form-input\">\n <a href=\"javascript:void(0);\" class=\"btn btn-default\" (click)=\"form.valid && addToCart()\" id=\"add-to-cart-btn\"\n >Add to cart</a\n >\n <a href=\"javascript:void(0);\" class=\"btn btn-link\" (click)=\"hideModal()\" id=\"cancel-btn\">Cancel</a>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["body.veloce-apex-index,body.veloce-index,body.sfdcBody{overflow:hidden;margin:0;padding:0}:host ::ng-deep .velo-app .modal.in .modal-dialog.runtime-modal{margin-left:5%;margin-right:5%;padding:0;position:relative;width:auto}:host ::ng-deep .modal-body.runtime-modal.main-container{height:100%;margin:0;padding:0}:host ::ng-deep .modal-body.runtime-modal.main-container .content-wrapper{display:flex;flex-direction:column;height:100%}:host ::ng-deep .modal-body.runtime-modal.main-container .sections-wrapper{display:flex;flex-direction:column;flex-grow:1;padding:0}:host ::ng-deep .modal-body.runtime-modal.main-container .sections-wrapper .modal-body.runtime-modal.container-fluid{height:100%;margin:0;padding:0;overflow:auto}:host ::ng-deep .modal-body.runtime-modal.main-container .sections-wrapper .modal-body.runtime-modal.container-fluid .input-form.form-horizontal,:host ::ng-deep .modal-body.runtime-modal.main-container .sections-wrapper .modal-body.runtime-modal.container-fluid .input-form.form-horizontal .form-horizontal,:host ::ng-deep .modal-body.runtime-modal.main-container .sections-wrapper .modal-body.runtime-modal.container-fluid section-script>:first-child{height:100%}:host ::ng-deep .runtime-modal .modal-content,:host ::ng-deep .gu-mirror .modal-content{background-color:--vl-input-background}:host ::ng-deep .runtime-modal .modal-content .modal-header-menu ul li a,:host ::ng-deep .gu-mirror .modal-content .modal-header-menu ul li a{color:#333333b3;font-weight:600;text-transform:uppercase;letter-spacing:.85px;font-size:10px}:host ::ng-deep .runtime-modal .modal-content .modal-header-menu ul li a.active,:host ::ng-deep .gu-mirror .modal-content .modal-header-menu ul li a.active{color:#333}:host ::ng-deep .runtime-modal .modal-content .modal-header-menu ul li a.disabled,:host ::ng-deep .gu-mirror .modal-content .modal-header-menu ul li a.disabled{color:#33333380}:host ::ng-deep .runtime-modal .modal-content .modal-header-menu ul li a.active:after,:host ::ng-deep .gu-mirror .modal-content .modal-header-menu ul li a.active:after{background-color:#f36;bottom:-1px;content:\"\";height:1px;left:0;position:absolute;width:100%}:host ::ng-deep .runtime-modal .modal-content .modal-header,:host ::ng-deep .gu-mirror .modal-content .modal-header{background:transparent;color:#fff}:host ::ng-deep .runtime-modal .runtime-group-divider,:host ::ng-deep .gu-mirror .runtime-group-divider{border-bottom:1px solid #e5e5e5}:host ::ng-deep .runtime-modal .input-form-input,:host ::ng-deep .gu-mirror .input-form-input{position:relative;padding-left:0;padding-top:0}:host ::ng-deep .runtime-modal .input-form-input--required>label,:host ::ng-deep .gu-mirror .input-form-input--required>label{color:#ff4233;font-weight:700}:host ::ng-deep .form-control-wrapper{position:relative}:host ::ng-deep .add-config-control:hover{background-color:#e96099;color:#fff;border:1px solid transparent}:host ::ng-deep .remove-config-control:hover{background-color:#828c9e;color:#fff}:host ::ng-deep .add-config-control[disabled],:host ::ng-deep .remove-config-control[disabled]{background-color:transparent;color:#ccc;border:1px dashed #ccc}:host ::ng-deep .add-config-control[disabled]:hover,:host ::ng-deep .remove-config-control[disabled]:hover{cursor:default}:host ::ng-deep .add-config-control{height:36px;width:36px;line-height:36px;font-size:14px;text-align:center;border-radius:50%;float:left;position:absolute;top:0;right:-57px;z-index:500;background-color:#e3337c;color:#fff;border:1px solid #e3337c;transition:all .5s ease 0s}:host ::ng-deep .add-config-control .plus-icon{line-height:36px}:host ::ng-deep .remove-config-control{height:36px;width:36px;line-height:36px;font-size:14px;text-align:center;margin-right:25px;border-radius:50%;float:left;position:absolute;top:33px;right:51px;z-index:500;background-color:transparent;color:#687285;border:1px solid transparent;transition:all .5s ease 0s}:host ::ng-deep .remove-config-control .plus-icon{line-height:36px}:host ::ng-deep .sidebar .new-wrapper{min-height:96px;margin-bottom:25px}:host ::ng-deep .sidebar .new-wrapper .add-container .add-card{left:0;margin-left:15px}:host ::ng-deep .ui-settings{height:100%;display:flex;flex-direction:column}:host ::ng-deep .runtime-modal .form-horizontal form,:host ::ng-deep .gu-mirror form{margin:0}:host ::ng-deep .runtime-modal .form-horizontal .form-group,:host ::ng-deep .gu-mirror .form-group{margin:0;padding:0}:host ::ng-deep .runtime-modal .form-horizontal .control.form-group,:host ::ng-deep .gu-mirror .control.form-group{margin-bottom:25px}:host ::ng-deep .runtime-modal .form-horizontal .form-control-wrapper,:host ::ng-deep .gu-mirror .form-control-wrapper{min-width:172px;margin-bottom:25px}:host ::ng-deep .runtime-modal .form-horizontal .quantity-form-input .form-control-wrapper,:host ::ng-deep .gu-mirror .quantity-form-input .form-control-wrapper{min-width:50px}:host ::ng-deep .runtime-modal .form-horizontal .quantity-form-input .form-control-wrapper .form-control,:host ::ng-deep .gu-mirror .quantity-form-input .form-control-wrapper .form-control{width:50px}:host ::ng-deep .runtime-left-side{height:calc(100% - 97px);background:#fff;padding:48px 56px 0}:host ::ng-deep .ui-controls-group{margin-left:-8px;margin-right:-8px}:host ::ng-deep .ui-controls-group .ui-control-type:hover{border-color:#3384ff}:host ::ng-deep .ui-controls-group .ui-control-type{position:relative;min-width:140px;float:left;border-radius:3px;border:1px solid #c4c4c4;background-color:#fff;width:calc(50% - 16px);padding:12px 13px;margin-bottom:16px;margin-right:8px;margin-left:8px;cursor:pointer}:host ::ng-deep .ui-controls-group .ui-control-type span{padding-left:3px}:host ::ng-deep .sidebar-header{letter-spacing:-.5px;padding-bottom:24px;padding-top:0;line-height:32px;font-size:24px;font-weight:700;color:#333}:host ::ng-deep .sidebar-header small{display:block;color:#333;font-size:11px;font-weight:300;line-height:20px;margin:0}:host ::ng-deep .sidebar-menu-list{color:#333333b3;margin:0;width:100%;list-style:none;font-size:12px}:host ::ng-deep .sidebar-menu-list li.active a,:host ::ng-deep .sidebar-menu-list li.active i{color:#005ee3}:host ::ng-deep .sidebar-menu-list li:hover{cursor:pointer}:host ::ng-deep .sidebar-menu-list li{text-align:right;padding-left:16px}:host ::ng-deep .sidebar-menu-list li a{padding:0 8px;margin-left:-8px;cursor:pointer;white-space:nowrap;color:inherit;font-weight:700;display:inline-block;line-height:32px}:host ::ng-deep .sidebar-menu-list li i{display:none;padding-right:5px}:host ::ng-deep .runtime-builder-content{min-height:100%}:host ::ng-deep .runtime-builder-content .input-form{margin:0;padding:18px 11px 0}:host ::ng-deep .runtime-builder-content .input-form .form-group{border:3px dashed transparent}:host ::ng-deep .runtime-builder-content .input-form .form-group:hover{border:3px dashed #dedede}:host ::ng-deep .runtime-right-side{background:#fff}:host ::ng-deep .sidebar-section .section-title{color:#a1a1a1;background:#fff;position:relative;display:inline-block;padding-right:16px;text-transform:uppercase;font-size:10px;letter-spacing:.2px}:host ::ng-deep .sidebar-section:before{content:\" \";position:absolute;top:50%;left:0;right:0;border-top:1px solid #e6e6e6}:host ::ng-deep .sidebar-section{position:relative;margin-top:16px;margin-bottom:16px}:host ::ng-deep .sidebar-section .section-title{color:#a1a1a1;background-color:var(--vl-input-background);position:relative;display:inline-block;padding-right:16px;padding-left:8px;text-transform:uppercase;font-size:6px;letter-spacing:.2px}:host ::ng-deep .section-wrapper{top:-21px;position:absolute;right:0;left:12px}:host ::ng-deep .container-box.container-box-bordered{border:1px solid rgba(0,0,0,.2);margin-bottom:25px;padding-left:25px}:host ::ng-deep .container-box.container-box-radio{margin-left:0}:host ::ng-deep .container-box.container-box-radio:hover,:host ::ng-deep .container-box.container-box-checkbox:hover{cursor:pointer}:host ::ng-deep .container-box{position:relative;overflow:auto;border:1px solid transparent;background:var(--vl-input-background)}:host ::ng-deep .container-box .container-box{border:1px solid rgba(0,0,0,.2);margin-left:25px;margin-right:25px;margin-bottom:25px}:host ::ng-deep .container-box .container-box:hover{border-color:var(--vl-primary-color)}:host ::ng-deep .container-box .box-title .header .header-label{color:#333;margin:0;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.2px;line-height:75px}:host ::ng-deep .container-box .box-title .header .header-label small{padding-left:21px;color:#757575;font-weight:400;font-size:10px;line-height:75px}:host ::ng-deep .container-box .box-title .header .header-qty-container,:host ::ng-deep .container-box .box-title .header .radio-button,:host ::ng-deep .container-box .box-title .header .checkbox-select{display:table-cell;vertical-align:middle;height:75px;padding-left:21px}:host ::ng-deep .container-box .box-title .header .header-qty-container .form-control,:host ::ng-deep .container-box .box-title .header .radio-button .form-control,:host ::ng-deep .container-box .box-title .header .checkbox-select .form-control{height:auto;color:#333;width:50px;border:1px solid #dddddd}:host ::ng-deep .container-box .box-title .header .header-qty-container .form-control:focus,:host ::ng-deep .container-box .box-title .header .radio-button .form-control:focus,:host ::ng-deep .container-box .box-title .header .checkbox-select .form-control:focus{border:1px solid #c4c4c4}:host ::ng-deep .container-box .box-title .header .header-qty-container .validation-message,:host ::ng-deep .container-box .box-title .header .radio-button .validation-message,:host ::ng-deep .container-box .box-title .header .checkbox-select .validation-message{position:absolute;margin-top:3px}:host ::ng-deep .container-box .box-title .header .radio-button,:host ::ng-deep .container-box .box-title .header .checkbox-select{padding-left:0;vertical-align:middle}:host ::ng-deep .container-box .box-content{padding:25px 0 25px 33px}:host ::ng-deep .container-box .timeline-item{clear:both;display:block;width:100%;position:relative}:host ::ng-deep .container-box .timeline-item:before{display:block!important;content:\"\";position:absolute;left:25px;top:-25px;bottom:25px;width:1px;border-left:1px dashed rgba(0,0,0,.2)}:host ::ng-deep .container-box .timeline-item .icon{background:#90c7ec;width:35px;height:35px;border-radius:50%;position:absolute;left:24px;top:4px}:host ::ng-deep .container-box .timeline-item .icon .fa.fa-upload{left:11px;top:10px}:host ::ng-deep .container-box .timeline-item .icon .fa{color:#fff;position:absolute}:host ::ng-deep .container-box .timeline-item .message .content{float:left;width:80%}:host ::ng-deep .container-box .container-group-control{background:transparent;text-transform:uppercase}:host ::ng-deep .container-box-custom{margin-bottom:25px}:host ::ng-deep .unchecked .container-box{border-color:#0003}:host ::ng-deep .unchecked .container-box:hover{border-color:var(--vl-primary-color)}:host ::ng-deep .unchecked.timeline-item .icon-circle{background-color:#6e6e6e}:host ::ng-deep .collapsed .box-content-wrapper{opacity:0;display:none;transition:max-height .3s .1s}:host ::ng-deep .box-content-wrapper{transition:opacity .5s .1s;display:block;opacity:1}:host ::ng-deep .box-actions{position:absolute;right:25px;z-index:2;top:21px;opacity:1;transition:height .3s ease-out,opacity .5s .1s}:host ::ng-deep .box-action-button{height:32px;width:32px;line-height:32px;font-size:12px;text-align:center;float:left;margin-left:5px;border-radius:50%;transition:all .25s ease 0s}:host ::ng-deep .box-action-button a{color:#0000008a}:host ::ng-deep .box-action-button .check-icon{line-height:32px}:host ::ng-deep .box-actions-group{top:18px;right:45px}:host ::ng-deep .box-action-button:hover,:host ::ng-deep .box-action-button:focus{background-color:#0000001a;cursor:pointer;outline:none}:host ::ng-deep .box-action-button:active{background-color:#0003;cursor:pointer}:host ::ng-deep .box-action-button.active{background-color:#0000001a}:host ::ng-deep .div-block{clear:both;display:block}:host ::ng-deep .div-inline{float:left}:host ::ng-deep .checkbox-select{position:relative;display:block}:host ::ng-deep .checkbox-select label{color:#333;margin:0;line-height:16px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.2px;padding-left:25px;position:relative;min-height:16px;cursor:pointer}:host ::ng-deep .checkbox-select input[type=checkbox]{position:absolute;width:16px;height:16px;top:0;left:0;z-index:1;cursor:pointer;opacity:0;filter:alpha(opacity=0);margin:0;line-height:normal}:host ::ng-deep .checkbox-select .input-helper:before{position:absolute;content:\"\";top:-1px;width:12px;height:12px;border-radius:2px;left:0;border:2px solid rgba(0,0,0,.54);transition:all;transition-duration:.25s}:host ::ng-deep .checkbox-select .input-helper:after{font-weight:100;line-height:12px;font-size:10px;color:#fff;font-family:FontAwesome;position:absolute;content:\"\\f00c\";width:12px;height:12px;background:#0065ff;border-radius:0;top:1px;left:2px;transform:scale(0);transition:all;transition-duration:.15s}:host ::ng-deep .checkbox-select input[type=checkbox]:checked+.input-helper:before,:host ::ng-deep .checkbox-select input[type=checkbox].checkbox--checked+.input-helper:before{border-color:var(--vl-primary-color)}:host ::ng-deep .checkbox-select input[type=checkbox]:checked+.input-helper:after,:host ::ng-deep .checkbox-select input[type=checkbox].checkbox--checked+.input-helper:after{transform:scale(1)}:host ::ng-deep .radio-button{position:relative;display:block}:host ::ng-deep .radio-button label{color:#333;margin:0;line-height:16px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.2px;padding-left:25px;position:relative;min-height:16px;cursor:pointer}:host ::ng-deep .radio-button input[type=radio]{position:absolute;width:16px;height:16px;top:0;left:0;z-index:1;cursor:pointer;opacity:0;filter:alpha(opacity=0);margin:0;line-height:normal}:host ::ng-deep .radio-button .input-helper:before{position:absolute;content:\"\";top:-1px;width:12px;height:12px;border-radius:50%;left:0;border:2px solid rgba(0,0,0,.54);transition:all;transition-duration:.25s}:host ::ng-deep .radio-button .input-helper:after{position:absolute;content:\"\";width:6px;height:6px;background:var(--vl-primary-color);border-radius:50%;top:4px;left:5px;transform:scale(0);transition:all;transition-duration:.25s}:host ::ng-deep .radio-button input[type=radio]:checked+.input-helper:before{border-color:var(--vl-primary-color)}:host ::ng-deep .radio-button input[type=radio]:checked+.input-helper:after{transform:scale(1)}:host ::ng-deep .radio-button[disabled] input[type=radio]+.input-helper:before,:host ::ng-deep .checkbox-select[disabled] input[type=radio]+.input-helper:before{border-color:#0003}:host ::ng-deep .radio-button[disabled] input[type=checkbox]+.input-helper:before,:host ::ng-deep .checkbox-select[disabled] input[type=checkbox]+.input-helper:before{border-color:#0003}:host ::ng-deep .radio-button[disabled] input[type=radio]+.input-helper:after,:host ::ng-deep .checkbox-select[disabled] input[type=radio]+.input-helper:after{background:rgba(0,0,0,.2)}:host ::ng-deep .radio-button[disabled] input[type=checkbox]+.input-helper:after,:host ::ng-deep .checkbox-select[disabled] input[type=checkbox]+.input-helper:after{background:rgba(0,0,0,.2)}:host ::ng-deep .form-control-wrapper .checkbox-select,:host ::ng-deep .form-control-wrapper .radio-button{padding-top:10px}:host ::ng-deep .shopping-bag-sidebar.open{transform:translate3d(-100%,0,0)}:host ::ng-deep .shopping-bag-sidebar{position:fixed;top:0;bottom:0;z-index:1051;width:420px;right:-420px;background-color:#2a2b30;transition:.3s transform}:host ::ng-deep .shopping-bag-sidebar .close-shopping-cart{color:#abacae;position:absolute;top:20%;width:50px;height:50px;line-height:50px;text-align:center;right:100%;left:auto;background:#2a2b30;border-radius:3px 0 0 3px;display:block}:host ::ng-deep .shopping-bag-sidebar .close-shopping-cart:before{font-family:FontAwesome;content:\"\\f291\"}:host ::ng-deep .shopping-bag-sidebar .close-shopping-cart:hover{text-decoration:none;color:#abacae}:host ::ng-deep .shopping-bag-sidebar .close-shopping-cart:active,:host ::ng-deep .shopping-bag-sidebar .close-shopping-cart:focus,:host ::ng-deep .shopping-bag-sidebar .close-shopping-cart:visited{text-decoration:none;color:#abacae}:host ::ng-deep .shopping-bag-sidebar .cart-count{font-size:9px;font-weight:700;line-height:15px;position:absolute;top:50%;right:8px;width:15px;height:15px;margin:-16px 0 0;text-align:center;color:#fff;border-radius:50%;background:var(--vl-primary-color)}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-container{overflow:auto;display:block;height:100%;padding:0 25px}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-item{color:#abacae;background-color:#000;position:relative;overflow:auto;margin-bottom:10px}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-item .item-title{position:relative;padding-right:25px;padding-left:25px}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-item .item-title .header{float:left;color:#abacae;margin:0;line-height:48px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.2px}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-item .item-title .box-actions{height:48px;float:right;top:0}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-item .item-title .box-action-button{height:32px;width:32px;line-height:32px;font-size:10px;font-weight:700;margin-top:8px;text-align:center;transition:all .25s ease 0s;color:#fff;background-color:var(--vl-primary-color)}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-title{color:#cecece;font-size:11px;text-transform:uppercase;line-height:64px;font-weight:600;padding-top:0;margin-top:25px;margin-bottom:25px;text-align:right}:host ::ng-deep .container-box.hovered:before,:host ::ng-deep .box-title.hovered:before,:host ::ng-deep .container-box.selected:before,:host ::ng-deep .box-title.selected:before{inset:0}:host ::ng-deep .selectable{position:relative;cursor:pointer}:host ::ng-deep .container-box.hovered:before{border-color:transparent}:host ::ng-deep .container-box.hovered{border-color:var(--vl-primary-color)}:host ::ng-deep .container-box.selected:before{border-color:transparent}:host ::ng-deep .container-box.selected{border-color:var(--vl-primary-color)}:host ::ng-deep .hovered:before{display:block!important;position:absolute;content:\" \";inset:-15px 15px 15px -15px;border:1px solid var(--vl-primary-color)}:host ::ng-deep .hovered .box-action-button{opacity:1!important}:host ::ng-deep .opacity-1{opacity:1!important}:host ::ng-deep .overflow-y--auto{overflow-y:auto}:host ::ng-deep .gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)\";filter:alpha(opacity=80)}:host ::ng-deep .gu-hide{display:none!important}:host ::ng-deep .gu-unselectable{-webkit-user-select:none!important;user-select:none!important}:host ::ng-deep .gu-transit{opacity:.2;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)\";filter:alpha(opacity=20)}:host ::ng-deep .top-nav-msg{margin-top:-30px}:host ::ng-deep .runtime-info-message ul{margin-bottom:0;list-style:none}:host ::ng-deep .runtime-info-message ul li{margin-bottom:10px}:host ::ng-deep .runtime-info-message ul li:last-child{margin-bottom:0}:host ::ng-deep .runtime-info-message .message-text{font-family:Open Sans,Tahoma,sans-serif!important;overflow:hidden;padding:0;font-size:11px}:host ::ng-deep .runtime-attributes-popover .popover-arrow{display:none}:host ::ng-deep .runtime-attributes-popover .popover-content{padding:0}:host ::ng-deep .runtime-attributes-popover .runtime-content-wrapper{padding:0}:host ::ng-deep .runtime-attributes-popover .container-box-custom{margin-bottom:0}:host ::ng-deep .runtime-attributes-popover .input-form{margin:0;padding:0}:host ::ng-deep .runtime-attributes-popover .input-form form{margin-bottom:0}:host ::ng-deep .runtime-attributes-popover .input-form form .div-inline{display:block;float:none}:host ::ng-deep .runtime-attributes-popover .input-form form .form-group{padding:0;margin:0}:host ::ng-deep .runtime-attributes-popover .container-box .box-content{padding:0}:host ::ng-deep .v-custom-title,:host ::ng-deep .v-custom-description,:host ::ng-deep .v-custom-image{display:none}:host ::ng-deep .dropdown{position:relative}:host ::ng-deep .dropdown-toggle:focus{outline:0}:host ::ng-deep .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;box-shadow:0 6px 12px #0000002d}:host ::ng-deep .dropdown-menu.pull-right{right:0;left:auto}:host ::ng-deep .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}:host ::ng-deep .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}:host ::ng-deep .dropdown-menu>li>a:hover,:host ::ng-deep .dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}:host ::ng-deep .dropdown-menu>.active>a,:host ::ng-deep .dropdown-menu>.active>a:hover,:host ::ng-deep .dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}:host ::ng-deep .dropdown-menu>.disabled>a,:host ::ng-deep .dropdown-menu>.disabled>a:hover,:host ::ng-deep .dropdown-menu>.disabled>a:focus{color:#777}:host ::ng-deep .dropdown-menu>.disabled>a:hover,:host ::ng-deep .dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}:host ::ng-deep .open>.dropdown-menu{display:block}:host ::ng-deep .open>a{outline:0}:host ::ng-deep .dropdown-menu-right{right:0;left:auto}:host ::ng-deep .dropdown-menu-left{right:auto;left:0}:host ::ng-deep .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}:host ::ng-deep .dropdown-backdrop{position:fixed;inset:0;z-index:990}\n", ":host{height:100%;display:flex;flex-direction:column}.sections-wrapper,form{flex-grow:1;display:flex;flex-direction:column}.hidden{display:none}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i9.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.SidebarTabsDirective, selector: "[sidebarTabs]", inputs: ["sidebarTabs"], exportAs: ["sidebarTabs"] }, { kind: "component", type: i10.LoaderComponent, selector: "vl-loader", inputs: ["label", "overlayVisible"] }, { kind: "component", type: i11.SectionRendererComponent, selector: "vl-section-renderer", inputs: ["section", "form"] }, { kind: "pipe", type: i7.OrderByPipe, name: "orderBy" }] });
431
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeComponent, decorators: [{
432
- type: Component,
433
- args: [{ selector: 'vl-runtime', providers: [FormScopeService, CollapsibleStateService, OrderByPipe, SearchFilterPipe], template: "<vl-loader label=\"Loading UI\" *ngIf=\"!solutionIsReady; else content\"></vl-loader>\n\n<ng-template #content>\n <div\n class=\"sidebar-tabs\"\n [ngClass]=\"{ hidden: !runtimeContext?.uiDefinition?.defaultPanels }\"\n #uiTabs=\"sidebarTabs\"\n sidebarTabs=\"{{ activeUITab?.id }}\"\n id=\"vl-default-sidebar-tabs\"\n >\n <ul>\n <li\n *ngFor=\"let tab of runtimeContext?.uiDefinition?.tabs | orderBy: 'order':'asc'\"\n [ngClass]=\"{ active: uiTabs.activeTab === tab.id }\"\n (click)=\"uiTabs.switchTab(tab.id)\"\n >\n <a href=\"javascript:void(0);\">{{ tab.name }}</a>\n </li>\n </ul>\n </div>\n\n <div class=\"sections-wrapper\">\n <form role=\"form\" name=\"form\" class=\"form-horizontal\" [formGroup]=\"form\" novalidate autocomplete=\"off\">\n <ng-container *ngFor=\"let section of staticSections; let i = index\">\n <ng-container *ngIf=\"section.model && section.template && !section.hidden\">\n <vl-section-renderer [section]=\"section\" [form]=\"form\"></vl-section-renderer>\n </ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let section of sortedSections; let i = index\">\n <ng-container *ngIf=\"section.model && section.template && !section.hidden\">\n <vl-section-renderer [section]=\"section\" [form]=\"form\"></vl-section-renderer>\n </ng-container>\n </ng-container>\n </form>\n\n <div\n class=\"modal-footer\"\n *ngIf=\"runtimeContext?.runtimeMode === 1\"\n id=\"vl-runtime-default-footer\"\n [ngClass]=\"{ hidden: !runtimeContext?.uiDefinition?.defaultPanels }\"\n >\n <div class=\"col-md-12 input-form-input\">\n <a href=\"javascript:void(0);\" class=\"btn btn-default\" (click)=\"form.valid && addToCart()\" id=\"add-to-cart-btn\"\n >Add to cart</a\n >\n <a href=\"javascript:void(0);\" class=\"btn btn-link\" (click)=\"hideModal()\" id=\"cancel-btn\">Cancel</a>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["body.veloce-apex-index,body.veloce-index,body.sfdcBody{overflow:hidden;margin:0;padding:0}:host ::ng-deep .velo-app .modal.in .modal-dialog.runtime-modal{margin-left:5%;margin-right:5%;padding:0;position:relative;width:auto}:host ::ng-deep .modal-body.runtime-modal.main-container{height:100%;margin:0;padding:0}:host ::ng-deep .modal-body.runtime-modal.main-container .content-wrapper{display:flex;flex-direction:column;height:100%}:host ::ng-deep .modal-body.runtime-modal.main-container .sections-wrapper{display:flex;flex-direction:column;flex-grow:1;padding:0}:host ::ng-deep .modal-body.runtime-modal.main-container .sections-wrapper .modal-body.runtime-modal.container-fluid{height:100%;margin:0;padding:0;overflow:auto}:host ::ng-deep .modal-body.runtime-modal.main-container .sections-wrapper .modal-body.runtime-modal.container-fluid .input-form.form-horizontal,:host ::ng-deep .modal-body.runtime-modal.main-container .sections-wrapper .modal-body.runtime-modal.container-fluid .input-form.form-horizontal .form-horizontal,:host ::ng-deep .modal-body.runtime-modal.main-container .sections-wrapper .modal-body.runtime-modal.container-fluid section-script>:first-child{height:100%}:host ::ng-deep .runtime-modal .modal-content,:host ::ng-deep .gu-mirror .modal-content{background-color:--vl-input-background}:host ::ng-deep .runtime-modal .modal-content .modal-header-menu ul li a,:host ::ng-deep .gu-mirror .modal-content .modal-header-menu ul li a{color:#333333b3;font-weight:600;text-transform:uppercase;letter-spacing:.85px;font-size:10px}:host ::ng-deep .runtime-modal .modal-content .modal-header-menu ul li a.active,:host ::ng-deep .gu-mirror .modal-content .modal-header-menu ul li a.active{color:#333}:host ::ng-deep .runtime-modal .modal-content .modal-header-menu ul li a.disabled,:host ::ng-deep .gu-mirror .modal-content .modal-header-menu ul li a.disabled{color:#33333380}:host ::ng-deep .runtime-modal .modal-content .modal-header-menu ul li a.active:after,:host ::ng-deep .gu-mirror .modal-content .modal-header-menu ul li a.active:after{background-color:#f36;bottom:-1px;content:\"\";height:1px;left:0;position:absolute;width:100%}:host ::ng-deep .runtime-modal .modal-content .modal-header,:host ::ng-deep .gu-mirror .modal-content .modal-header{background:transparent;color:#fff}:host ::ng-deep .runtime-modal .runtime-group-divider,:host ::ng-deep .gu-mirror .runtime-group-divider{border-bottom:1px solid #e5e5e5}:host ::ng-deep .runtime-modal .input-form-input,:host ::ng-deep .gu-mirror .input-form-input{position:relative;padding-left:0;padding-top:0}:host ::ng-deep .runtime-modal .input-form-input--required>label,:host ::ng-deep .gu-mirror .input-form-input--required>label{color:#ff4233;font-weight:700}:host ::ng-deep .form-control-wrapper{position:relative}:host ::ng-deep .add-config-control:hover{background-color:#e96099;color:#fff;border:1px solid transparent}:host ::ng-deep .remove-config-control:hover{background-color:#828c9e;color:#fff}:host ::ng-deep .add-config-control[disabled],:host ::ng-deep .remove-config-control[disabled]{background-color:transparent;color:#ccc;border:1px dashed #ccc}:host ::ng-deep .add-config-control[disabled]:hover,:host ::ng-deep .remove-config-control[disabled]:hover{cursor:default}:host ::ng-deep .add-config-control{height:36px;width:36px;line-height:36px;font-size:14px;text-align:center;border-radius:50%;float:left;position:absolute;top:0;right:-57px;z-index:500;background-color:#e3337c;color:#fff;border:1px solid #e3337c;transition:all .5s ease 0s}:host ::ng-deep .add-config-control .plus-icon{line-height:36px}:host ::ng-deep .remove-config-control{height:36px;width:36px;line-height:36px;font-size:14px;text-align:center;margin-right:25px;border-radius:50%;float:left;position:absolute;top:33px;right:51px;z-index:500;background-color:transparent;color:#687285;border:1px solid transparent;transition:all .5s ease 0s}:host ::ng-deep .remove-config-control .plus-icon{line-height:36px}:host ::ng-deep .sidebar .new-wrapper{min-height:96px;margin-bottom:25px}:host ::ng-deep .sidebar .new-wrapper .add-container .add-card{left:0;margin-left:15px}:host ::ng-deep .ui-settings{height:100%;display:flex;flex-direction:column}:host ::ng-deep .runtime-modal .form-horizontal form,:host ::ng-deep .gu-mirror form{margin:0}:host ::ng-deep .runtime-modal .form-horizontal .form-group,:host ::ng-deep .gu-mirror .form-group{margin:0;padding:0}:host ::ng-deep .runtime-modal .form-horizontal .control.form-group,:host ::ng-deep .gu-mirror .control.form-group{margin-bottom:25px}:host ::ng-deep .runtime-modal .form-horizontal .form-control-wrapper,:host ::ng-deep .gu-mirror .form-control-wrapper{min-width:172px;margin-bottom:25px}:host ::ng-deep .runtime-modal .form-horizontal .quantity-form-input .form-control-wrapper,:host ::ng-deep .gu-mirror .quantity-form-input .form-control-wrapper{min-width:50px}:host ::ng-deep .runtime-modal .form-horizontal .quantity-form-input .form-control-wrapper .form-control,:host ::ng-deep .gu-mirror .quantity-form-input .form-control-wrapper .form-control{width:50px}:host ::ng-deep .runtime-left-side{height:calc(100% - 97px);background:#fff;padding:48px 56px 0}:host ::ng-deep .ui-controls-group{margin-left:-8px;margin-right:-8px}:host ::ng-deep .ui-controls-group .ui-control-type:hover{border-color:#3384ff}:host ::ng-deep .ui-controls-group .ui-control-type{position:relative;min-width:140px;float:left;border-radius:3px;border:1px solid #c4c4c4;background-color:#fff;width:calc(50% - 16px);padding:12px 13px;margin-bottom:16px;margin-right:8px;margin-left:8px;cursor:pointer}:host ::ng-deep .ui-controls-group .ui-control-type span{padding-left:3px}:host ::ng-deep .sidebar-header{letter-spacing:-.5px;padding-bottom:24px;padding-top:0;line-height:32px;font-size:24px;font-weight:700;color:#333}:host ::ng-deep .sidebar-header small{display:block;color:#333;font-size:11px;font-weight:300;line-height:20px;margin:0}:host ::ng-deep .sidebar-menu-list{color:#333333b3;margin:0;width:100%;list-style:none;font-size:12px}:host ::ng-deep .sidebar-menu-list li.active a,:host ::ng-deep .sidebar-menu-list li.active i{color:#005ee3}:host ::ng-deep .sidebar-menu-list li:hover{cursor:pointer}:host ::ng-deep .sidebar-menu-list li{text-align:right;padding-left:16px}:host ::ng-deep .sidebar-menu-list li a{padding:0 8px;margin-left:-8px;cursor:pointer;white-space:nowrap;color:inherit;font-weight:700;display:inline-block;line-height:32px}:host ::ng-deep .sidebar-menu-list li i{display:none;padding-right:5px}:host ::ng-deep .runtime-builder-content{min-height:100%}:host ::ng-deep .runtime-builder-content .input-form{margin:0;padding:18px 11px 0}:host ::ng-deep .runtime-builder-content .input-form .form-group{border:3px dashed transparent}:host ::ng-deep .runtime-builder-content .input-form .form-group:hover{border:3px dashed #dedede}:host ::ng-deep .runtime-right-side{background:#fff}:host ::ng-deep .sidebar-section .section-title{color:#a1a1a1;background:#fff;position:relative;display:inline-block;padding-right:16px;text-transform:uppercase;font-size:10px;letter-spacing:.2px}:host ::ng-deep .sidebar-section:before{content:\" \";position:absolute;top:50%;left:0;right:0;border-top:1px solid #e6e6e6}:host ::ng-deep .sidebar-section{position:relative;margin-top:16px;margin-bottom:16px}:host ::ng-deep .sidebar-section .section-title{color:#a1a1a1;background-color:var(--vl-input-background);position:relative;display:inline-block;padding-right:16px;padding-left:8px;text-transform:uppercase;font-size:6px;letter-spacing:.2px}:host ::ng-deep .section-wrapper{top:-21px;position:absolute;right:0;left:12px}:host ::ng-deep .container-box.container-box-bordered{border:1px solid rgba(0,0,0,.2);margin-bottom:25px;padding-left:25px}:host ::ng-deep .container-box.container-box-radio{margin-left:0}:host ::ng-deep .container-box.container-box-radio:hover,:host ::ng-deep .container-box.container-box-checkbox:hover{cursor:pointer}:host ::ng-deep .container-box{position:relative;overflow:auto;border:1px solid transparent;background:var(--vl-input-background)}:host ::ng-deep .container-box .container-box{border:1px solid rgba(0,0,0,.2);margin-left:25px;margin-right:25px;margin-bottom:25px}:host ::ng-deep .container-box .container-box:hover{border-color:var(--vl-primary-color)}:host ::ng-deep .container-box .box-title .header .header-label{color:#333;margin:0;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.2px;line-height:75px}:host ::ng-deep .container-box .box-title .header .header-label small{padding-left:21px;color:#757575;font-weight:400;font-size:10px;line-height:75px}:host ::ng-deep .container-box .box-title .header .header-qty-container,:host ::ng-deep .container-box .box-title .header .radio-button,:host ::ng-deep .container-box .box-title .header .checkbox-select{display:table-cell;vertical-align:middle;height:75px;padding-left:21px}:host ::ng-deep .container-box .box-title .header .header-qty-container .form-control,:host ::ng-deep .container-box .box-title .header .radio-button .form-control,:host ::ng-deep .container-box .box-title .header .checkbox-select .form-control{height:auto;color:#333;width:50px;border:1px solid #dddddd}:host ::ng-deep .container-box .box-title .header .header-qty-container .form-control:focus,:host ::ng-deep .container-box .box-title .header .radio-button .form-control:focus,:host ::ng-deep .container-box .box-title .header .checkbox-select .form-control:focus{border:1px solid #c4c4c4}:host ::ng-deep .container-box .box-title .header .header-qty-container .validation-message,:host ::ng-deep .container-box .box-title .header .radio-button .validation-message,:host ::ng-deep .container-box .box-title .header .checkbox-select .validation-message{position:absolute;margin-top:3px}:host ::ng-deep .container-box .box-title .header .radio-button,:host ::ng-deep .container-box .box-title .header .checkbox-select{padding-left:0;vertical-align:middle}:host ::ng-deep .container-box .box-content{padding:25px 0 25px 33px}:host ::ng-deep .container-box .timeline-item{clear:both;display:block;width:100%;position:relative}:host ::ng-deep .container-box .timeline-item:before{display:block!important;content:\"\";position:absolute;left:25px;top:-25px;bottom:25px;width:1px;border-left:1px dashed rgba(0,0,0,.2)}:host ::ng-deep .container-box .timeline-item .icon{background:#90c7ec;width:35px;height:35px;border-radius:50%;position:absolute;left:24px;top:4px}:host ::ng-deep .container-box .timeline-item .icon .fa.fa-upload{left:11px;top:10px}:host ::ng-deep .container-box .timeline-item .icon .fa{color:#fff;position:absolute}:host ::ng-deep .container-box .timeline-item .message .content{float:left;width:80%}:host ::ng-deep .container-box .container-group-control{background:transparent;text-transform:uppercase}:host ::ng-deep .container-box-custom{margin-bottom:25px}:host ::ng-deep .unchecked .container-box{border-color:#0003}:host ::ng-deep .unchecked .container-box:hover{border-color:var(--vl-primary-color)}:host ::ng-deep .unchecked.timeline-item .icon-circle{background-color:#6e6e6e}:host ::ng-deep .collapsed .box-content-wrapper{opacity:0;display:none;transition:max-height .3s .1s}:host ::ng-deep .box-content-wrapper{transition:opacity .5s .1s;display:block;opacity:1}:host ::ng-deep .box-actions{position:absolute;right:25px;z-index:2;top:21px;opacity:1;transition:height .3s ease-out,opacity .5s .1s}:host ::ng-deep .box-action-button{height:32px;width:32px;line-height:32px;font-size:12px;text-align:center;float:left;margin-left:5px;border-radius:50%;transition:all .25s ease 0s}:host ::ng-deep .box-action-button a{color:#0000008a}:host ::ng-deep .box-action-button .check-icon{line-height:32px}:host ::ng-deep .box-actions-group{top:18px;right:45px}:host ::ng-deep .box-action-button:hover,:host ::ng-deep .box-action-button:focus{background-color:#0000001a;cursor:pointer;outline:none}:host ::ng-deep .box-action-button:active{background-color:#0003;cursor:pointer}:host ::ng-deep .box-action-button.active{background-color:#0000001a}:host ::ng-deep .div-block{clear:both;display:block}:host ::ng-deep .div-inline{float:left}:host ::ng-deep .checkbox-select{position:relative;display:block}:host ::ng-deep .checkbox-select label{color:#333;margin:0;line-height:16px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.2px;padding-left:25px;position:relative;min-height:16px;cursor:pointer}:host ::ng-deep .checkbox-select input[type=checkbox]{position:absolute;width:16px;height:16px;top:0;left:0;z-index:1;cursor:pointer;opacity:0;filter:alpha(opacity=0);margin:0;line-height:normal}:host ::ng-deep .checkbox-select .input-helper:before{position:absolute;content:\"\";top:-1px;width:12px;height:12px;border-radius:2px;left:0;border:2px solid rgba(0,0,0,.54);transition:all;transition-duration:.25s}:host ::ng-deep .checkbox-select .input-helper:after{font-weight:100;line-height:12px;font-size:10px;color:#fff;font-family:FontAwesome;position:absolute;content:\"\\f00c\";width:12px;height:12px;background:#0065ff;border-radius:0;top:1px;left:2px;transform:scale(0);transition:all;transition-duration:.15s}:host ::ng-deep .checkbox-select input[type=checkbox]:checked+.input-helper:before,:host ::ng-deep .checkbox-select input[type=checkbox].checkbox--checked+.input-helper:before{border-color:var(--vl-primary-color)}:host ::ng-deep .checkbox-select input[type=checkbox]:checked+.input-helper:after,:host ::ng-deep .checkbox-select input[type=checkbox].checkbox--checked+.input-helper:after{transform:scale(1)}:host ::ng-deep .radio-button{position:relative;display:block}:host ::ng-deep .radio-button label{color:#333;margin:0;line-height:16px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.2px;padding-left:25px;position:relative;min-height:16px;cursor:pointer}:host ::ng-deep .radio-button input[type=radio]{position:absolute;width:16px;height:16px;top:0;left:0;z-index:1;cursor:pointer;opacity:0;filter:alpha(opacity=0);margin:0;line-height:normal}:host ::ng-deep .radio-button .input-helper:before{position:absolute;content:\"\";top:-1px;width:12px;height:12px;border-radius:50%;left:0;border:2px solid rgba(0,0,0,.54);transition:all;transition-duration:.25s}:host ::ng-deep .radio-button .input-helper:after{position:absolute;content:\"\";width:6px;height:6px;background:var(--vl-primary-color);border-radius:50%;top:4px;left:5px;transform:scale(0);transition:all;transition-duration:.25s}:host ::ng-deep .radio-button input[type=radio]:checked+.input-helper:before{border-color:var(--vl-primary-color)}:host ::ng-deep .radio-button input[type=radio]:checked+.input-helper:after{transform:scale(1)}:host ::ng-deep .radio-button[disabled] input[type=radio]+.input-helper:before,:host ::ng-deep .checkbox-select[disabled] input[type=radio]+.input-helper:before{border-color:#0003}:host ::ng-deep .radio-button[disabled] input[type=checkbox]+.input-helper:before,:host ::ng-deep .checkbox-select[disabled] input[type=checkbox]+.input-helper:before{border-color:#0003}:host ::ng-deep .radio-button[disabled] input[type=radio]+.input-helper:after,:host ::ng-deep .checkbox-select[disabled] input[type=radio]+.input-helper:after{background:rgba(0,0,0,.2)}:host ::ng-deep .radio-button[disabled] input[type=checkbox]+.input-helper:after,:host ::ng-deep .checkbox-select[disabled] input[type=checkbox]+.input-helper:after{background:rgba(0,0,0,.2)}:host ::ng-deep .form-control-wrapper .checkbox-select,:host ::ng-deep .form-control-wrapper .radio-button{padding-top:10px}:host ::ng-deep .shopping-bag-sidebar.open{transform:translate3d(-100%,0,0)}:host ::ng-deep .shopping-bag-sidebar{position:fixed;top:0;bottom:0;z-index:1051;width:420px;right:-420px;background-color:#2a2b30;transition:.3s transform}:host ::ng-deep .shopping-bag-sidebar .close-shopping-cart{color:#abacae;position:absolute;top:20%;width:50px;height:50px;line-height:50px;text-align:center;right:100%;left:auto;background:#2a2b30;border-radius:3px 0 0 3px;display:block}:host ::ng-deep .shopping-bag-sidebar .close-shopping-cart:before{font-family:FontAwesome;content:\"\\f291\"}:host ::ng-deep .shopping-bag-sidebar .close-shopping-cart:hover{text-decoration:none;color:#abacae}:host ::ng-deep .shopping-bag-sidebar .close-shopping-cart:active,:host ::ng-deep .shopping-bag-sidebar .close-shopping-cart:focus,:host ::ng-deep .shopping-bag-sidebar .close-shopping-cart:visited{text-decoration:none;color:#abacae}:host ::ng-deep .shopping-bag-sidebar .cart-count{font-size:9px;font-weight:700;line-height:15px;position:absolute;top:50%;right:8px;width:15px;height:15px;margin:-16px 0 0;text-align:center;color:#fff;border-radius:50%;background:var(--vl-primary-color)}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-container{overflow:auto;display:block;height:100%;padding:0 25px}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-item{color:#abacae;background-color:#000;position:relative;overflow:auto;margin-bottom:10px}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-item .item-title{position:relative;padding-right:25px;padding-left:25px}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-item .item-title .header{float:left;color:#abacae;margin:0;line-height:48px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.2px}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-item .item-title .box-actions{height:48px;float:right;top:0}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-item .item-title .box-action-button{height:32px;width:32px;line-height:32px;font-size:10px;font-weight:700;margin-top:8px;text-align:center;transition:all .25s ease 0s;color:#fff;background-color:var(--vl-primary-color)}:host ::ng-deep .shopping-bag-sidebar .shopping-bag-title{color:#cecece;font-size:11px;text-transform:uppercase;line-height:64px;font-weight:600;padding-top:0;margin-top:25px;margin-bottom:25px;text-align:right}:host ::ng-deep .container-box.hovered:before,:host ::ng-deep .box-title.hovered:before,:host ::ng-deep .container-box.selected:before,:host ::ng-deep .box-title.selected:before{inset:0}:host ::ng-deep .selectable{position:relative;cursor:pointer}:host ::ng-deep .container-box.hovered:before{border-color:transparent}:host ::ng-deep .container-box.hovered{border-color:var(--vl-primary-color)}:host ::ng-deep .container-box.selected:before{border-color:transparent}:host ::ng-deep .container-box.selected{border-color:var(--vl-primary-color)}:host ::ng-deep .hovered:before{display:block!important;position:absolute;content:\" \";inset:-15px 15px 15px -15px;border:1px solid var(--vl-primary-color)}:host ::ng-deep .hovered .box-action-button{opacity:1!important}:host ::ng-deep .opacity-1{opacity:1!important}:host ::ng-deep .overflow-y--auto{overflow-y:auto}:host ::ng-deep .gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)\";filter:alpha(opacity=80)}:host ::ng-deep .gu-hide{display:none!important}:host ::ng-deep .gu-unselectable{-webkit-user-select:none!important;user-select:none!important}:host ::ng-deep .gu-transit{opacity:.2;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)\";filter:alpha(opacity=20)}:host ::ng-deep .top-nav-msg{margin-top:-30px}:host ::ng-deep .runtime-info-message ul{margin-bottom:0;list-style:none}:host ::ng-deep .runtime-info-message ul li{margin-bottom:10px}:host ::ng-deep .runtime-info-message ul li:last-child{margin-bottom:0}:host ::ng-deep .runtime-info-message .message-text{font-family:Open Sans,Tahoma,sans-serif!important;overflow:hidden;padding:0;font-size:11px}:host ::ng-deep .runtime-attributes-popover .popover-arrow{display:none}:host ::ng-deep .runtime-attributes-popover .popover-content{padding:0}:host ::ng-deep .runtime-attributes-popover .runtime-content-wrapper{padding:0}:host ::ng-deep .runtime-attributes-popover .container-box-custom{margin-bottom:0}:host ::ng-deep .runtime-attributes-popover .input-form{margin:0;padding:0}:host ::ng-deep .runtime-attributes-popover .input-form form{margin-bottom:0}:host ::ng-deep .runtime-attributes-popover .input-form form .div-inline{display:block;float:none}:host ::ng-deep .runtime-attributes-popover .input-form form .form-group{padding:0;margin:0}:host ::ng-deep .runtime-attributes-popover .container-box .box-content{padding:0}:host ::ng-deep .v-custom-title,:host ::ng-deep .v-custom-description,:host ::ng-deep .v-custom-image{display:none}:host ::ng-deep .dropdown{position:relative}:host ::ng-deep .dropdown-toggle:focus{outline:0}:host ::ng-deep .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;box-shadow:0 6px 12px #0000002d}:host ::ng-deep .dropdown-menu.pull-right{right:0;left:auto}:host ::ng-deep .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}:host ::ng-deep .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}:host ::ng-deep .dropdown-menu>li>a:hover,:host ::ng-deep .dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}:host ::ng-deep .dropdown-menu>.active>a,:host ::ng-deep .dropdown-menu>.active>a:hover,:host ::ng-deep .dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}:host ::ng-deep .dropdown-menu>.disabled>a,:host ::ng-deep .dropdown-menu>.disabled>a:hover,:host ::ng-deep .dropdown-menu>.disabled>a:focus{color:#777}:host ::ng-deep .dropdown-menu>.disabled>a:hover,:host ::ng-deep .dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}:host ::ng-deep .open>.dropdown-menu{display:block}:host ::ng-deep .open>a{outline:0}:host ::ng-deep .dropdown-menu-right{right:0;left:auto}:host ::ng-deep .dropdown-menu-left{right:auto;left:0}:host ::ng-deep .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}:host ::ng-deep .dropdown-backdrop{position:fixed;inset:0;z-index:990}\n", ":host{height:100%;display:flex;flex-direction:column}.sections-wrapper,form{flex-grow:1;display:flex;flex-direction:column}.hidden{display:none}\n"] }]
434
- }], ctorParameters: function () { return [{ type: i1.SectionsService }, { type: i2.FormScopeService }, { type: i3.CollapsibleStateService }, { type: i4.RuntimeFormService }, { type: i5.RuntimeService }, { type: i12.MessageService, decorators: [{
435
- type: Inject,
436
- args: [MessageService]
437
- }] }, { type: i6.ContextService }, { type: i7.OrderByPipe }, { type: i7.SearchFilterPipe }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { solutionUpdated: [{
438
- type: Output
439
- }] } });
440
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Nkay9ydW50aW1lL2NvbXBvbmVudHMvdWktcnVudGltZS9ydW50aW1lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2RrL3J1bnRpbWUvY29tcG9uZW50cy91aS1ydW50aW1lL3J1bnRpbWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFHTCxVQUFVLEVBRVYsV0FBVyxFQUVYLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFJaEIsSUFBSSxHQUNMLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXRELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFTMUUsTUFBTSxPQUFPLGdCQUFnQjtJQWtCM0IsWUFDVSxlQUFnQyxFQUNoQyxTQUEyQixFQUMzQixnQkFBeUMsRUFDekMsV0FBK0IsRUFDL0IsY0FBOEIsRUFDTixjQUE4QixFQUN0RCxjQUE4QixFQUM5QixXQUF3QixFQUN4QixnQkFBa0MsRUFDbEMsR0FBc0I7UUFUdEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBeUI7UUFDekMsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUNOLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUN0RCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTNCaEIsb0JBQWUsR0FBRyxZQUFZLENBQUM7UUFFeEMsbUJBQWMsR0FBYyxFQUFFLENBQUM7UUFDL0IsbUJBQWMsR0FBYyxFQUFFLENBQUM7UUFJL0IsU0FBSSxHQUFjLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBSXBDLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBRWQsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXhCLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQWFsRSxDQUFDO0lBRUksV0FBVyxDQUNqQixXQUErQixFQUMvQixPQUFnQixFQUNoQixnQkFBMEIsRUFDMUIsS0FBa0M7UUFFbEMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBRXBHLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDbkIsT0FBTztTQUNSO1FBRUQsY0FBYyxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNqRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLFFBQVEsQ0FBQztZQUU1QyxJQUFJLFNBQVMsS0FBSyxXQUFXLEVBQUU7Z0JBQzdCLE9BQU8sUUFBUSxDQUFDO2FBQ2pCO1lBRUQsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZDLE1BQU0saUJBQWlCLEdBQUc7Z0JBQ3hCLEdBQUcsVUFBVTtnQkFDYixHQUFHLEtBQUs7YUFDSyxDQUFDO1lBRWhCLE9BQU87Z0JBQ0wsR0FBRyxRQUFRO2dCQUNYLFdBQVcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsV0FBVyxDQUFDO2FBQ2pELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU0sUUFBUTtRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBYSxFQUFFLEVBQUU7WUFDM0YsSUFBSTtnQkFDRixJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQ25DLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFFakUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRXZDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ1osTUFBTSxtQkFBbUIsQ0FBQztpQkFDM0I7Z0JBQ0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7Z0JBRWhELElBQUksVUFBVSxLQUFLLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxLQUFLLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3hHLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxPQUFPLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUU7d0JBQy9ELE1BQU0sV0FBVyxHQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFFMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFOzRCQUM1QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQzt5QkFDakM7NkJBQU07NEJBQ0wsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQzs0QkFFekYsSUFBSSxjQUFjLEVBQUU7Z0NBQ2xCLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dDQUV2RixjQUFjLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dDQUV0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQ0FDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOzZCQUN0Qzt5QkFDRjtxQkFDRjtpQkFDRjtnQkFFRCxJQUFJLFVBQVUsS0FBSyxhQUFhLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNwRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFO3dCQUN6QixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7d0JBRXBHLElBQUksY0FBYyxFQUFFOzRCQUNsQixjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FDbkMsSUFDRSxDQUFDLENBQUMsb0JBQW9CO29DQUN0QixDQUFDLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQ25GO29DQUNBLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lDQUN0RDs0QkFDSCxDQUFDLENBQUMsQ0FBQzs0QkFDSCxNQUFNLFNBQVMsR0FBRyxjQUFjLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FDaEQsQ0FBQyxDQUFDLEVBQUUsQ0FDRixDQUFDLENBQUMsb0JBQW9CO2dDQUN0QixDQUFDLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDdkYsQ0FBQzs0QkFDRixDQUFDLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dDQUNsQyxJQUFJLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO29DQUNwRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7b0NBQ2pFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7b0NBQ3pELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUNBQzFCOzRCQUNILENBQUMsQ0FBQyxDQUFDOzRCQUVILElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzt5QkFDdEM7cUJBQ0Y7b0JBRUQsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRTt3QkFDekIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO3dCQUVwRyxJQUFJLGNBQWMsRUFBRTs0QkFDbEIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQzs0QkFDbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDOzRCQUMzRSxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDeEMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQzs0QkFFekQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3lCQUN0QztxQkFDRjtvQkFFRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxFQUFFO3dCQUN2QixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7d0JBRXBHLElBQUksY0FBYyxFQUFFOzRCQUNsQixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDOzRCQUNsQyxNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssV0FBVyxDQUFDLENBQUM7NEJBQ2xGLElBQUksY0FBYyxFQUFFO2dDQUNsQixNQUFNLFFBQVEsR0FBYSxFQUFFLEdBQUcsY0FBYyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztnQ0FDekQsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0NBQ3hDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0NBRXpELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs2QkFDdEM7eUJBQ0Y7cUJBQ0Y7b0JBRUQsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRTt3QkFDekIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO3dCQUVwRyxJQUFJLGNBQWMsRUFBRTs0QkFDbEIsd0VBQXdFOzRCQUN4RSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFFekcsSUFBSSxRQUFRLEVBQUU7Z0NBQ1osSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7NkJBQzdEOzRCQUVELE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7NEJBRS9FLE1BQU0sUUFBUSxHQUFhO2dDQUN6QixFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRTtnQ0FDZixHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUc7Z0NBQ2xCLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSTtnQ0FDcEIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSztnQ0FDMUYsU0FBUyxFQUFFLEtBQUs7Z0NBQ2hCLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUTs2QkFDakIsQ0FBQzs0QkFFZCxJQUFJLENBQUMseUJBQXlCLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDOzRCQUN6RCxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQzs0QkFFM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3lCQUN0QztxQkFDRjtvQkFFRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFO3dCQUN6QixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7d0JBRXBHLElBQ0UsY0FBYzs0QkFDZCxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQ2hHOzRCQUNBLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUM5QyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FDakUsQ0FBQzs0QkFDRixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtnQ0FDZCxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQzdELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUMzRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7NkJBQ3RDO3lCQUNGO3FCQUNGO29CQUVELElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7d0JBQzVCLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxXQUFXOzRCQUMvQixDQUFDLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUM7NEJBQ2xFLENBQUMsQ0FBQyxTQUFTLENBQUM7d0JBRWQsTUFBTSxZQUFZLEdBQUcsV0FBVyxFQUFFLEtBQUssSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO3dCQUMzRyxJQUFJLFdBQVcsSUFBSSxZQUFZLEVBQUU7NEJBQy9CLFlBQVksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQzs0QkFDckUsWUFBWSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7NEJBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzt5QkFDdEM7cUJBQ0Y7b0JBRUQsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLGdCQUFnQixFQUFFO3dCQUNqQyxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDbkMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7d0JBRWpDLE1BQU0sZUFBZSxHQUFvQjs0QkFDdkMsSUFBSSxFQUFFLGlCQUFpQjs0QkFDdkIsV0FBVyxFQUFFLDZCQUE2Qjs0QkFDMUMsT0FBTyxFQUFFLEVBQUU7NEJBQ1gsTUFBTTt5QkFDUCxDQUFDO3dCQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7cUJBQy9FO29CQUVELElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxpQkFBaUIsRUFBRTt3QkFDbEMsTUFBTSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ25DLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO3dCQUVqQyxNQUFNLG1CQUFtQixHQUFvQjs0QkFDM0MsSUFBSSxFQUFFLGlCQUFpQjs0QkFDdkIsV0FBVyxFQUFFLDhCQUE4Qjs0QkFDM0MsT0FBTyxFQUFFLEVBQUU7NEJBQ1gsTUFBTTt5QkFDUCxDQUFDO3dCQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQztxQkFDbkY7aUJBQ0Y7Z0JBRUQsSUFBSSxVQUFVLEtBQUssYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDcEQsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRTt3QkFDekIsTUFBTSxjQUFjLEdBQ2xCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUSxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7d0JBRS9GLElBQ0UsY0FBYzs0QkFDZCxPQUFPLENBQUMsS0FBSzs0QkFDYixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUk7NEJBQ2xCLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFDNUY7NEJBQ0EsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7NEJBQ3hGLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dDQUNkLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDN0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0NBQzNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dDQUM3QyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7NkJBQ3RDO3lCQUNGO3FCQUNGO29CQUVELElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7d0JBQzVCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQzt3QkFFbEcsSUFBSSxZQUFZLEVBQUU7NEJBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUM7NEJBQ3BELElBQUksWUFBWSxDQUFDLFFBQVEsRUFBRTtnQ0FDekIsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dDQUV4RixJQUFJLGNBQWMsRUFBRTtvQ0FDbEIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7aUNBQ25FOzZCQUNGOzRCQUNELFlBQVksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDOzRCQUN2QixZQUFZLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQzs0QkFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3lCQUN0QztxQkFDRjtpQkFDRjtnQkFFRCxJQUFJLFVBQVUsS0FBSyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUN6RCxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFO3dCQUN6QixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7d0JBQ3BHLE1BQU0sU0FBUyxHQUFHLGNBQWMsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUMvQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQ3pFLENBQUM7d0JBRUYsSUFBSSxTQUFTLEVBQUU7NEJBQ2IsaUNBQWlDOzRCQUNqQyxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDOzRCQUVsRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO2dDQUNoQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs2QkFDdkI7NEJBRUQsU0FBUyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7NEJBQ3hCLFNBQVMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDOzRCQUU3QixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7eUJBQ3RDO3FCQUNGO2lCQUNGO2FBQ0Y7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLHdCQUF5QixDQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ2hIO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQjthQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNqQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFekQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0I7YUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDakMsU0FBUyxDQUFDLENBQUMsSUFBa0MsRUFBRSxFQUFFO1lBQ2hELElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxpQkFBaUIsQ0FBQyxFQUFFO2dCQUN4QyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN4QztZQUVELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3BGLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxHQUFHLFlBQW1CLENBQUM7WUFDdkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGVBQWUsQ0FBQyxRQUFrQjtRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUEwQixDQUFDO1FBQ2hGLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUzRCxNQUFNLFlBQVksR0FBeUI7WUFDekMsR0FBRyxPQUFPO1lBQ1YsVUFBVSxFQUFFO2dCQUNWLEdBQUcsT0FBTyxDQUFDLFVBQVU7Z0JBQ3JCLEdBQUcsb0JBQW9CLENBQUMsVUFBVTthQUNuQztTQUNGLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQztRQUNyRCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsY0FBYyxHQUFHO2dCQUNwQixHQUFHLFlBQVk7Z0JBQ2YsVUFBVSxFQUFFO29CQUNWLEdBQUcsWUFBWSxDQUFDLFVBQVU7b0JBQzFCLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUM7aUJBQzdEO2FBQ0ssQ0FBQztTQUNWO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxHQUFHLFlBQW1CLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU8sb0JBQW9CLENBQUMsZUFBeUI7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQWUsQ0FBQztRQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU8sMEJBQTBCLENBQUMsS0FBd0I7UUFDekQsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDO1FBQy9FLE1BQU0sRUFBRSw2QkFBNkIsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUVqRixJQUFJLDZCQUE2QixFQUFFO1lBQ2pDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDMUU7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUc7WUFDdEIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3hCLFFBQVEsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxLQUFLLE9BQU8sRUFBRSxDQUFDO1NBQzlELENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTdELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLHlCQUF5QixDQUFDLE1BQWdCLEVBQUUsT0FBaUIsRUFBRSxXQUFvQjtRQUN6RixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQy9FLE1BQU0sVUFBVSxHQUFHLFVBQVUsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUUsTUFBTSxXQUFXLEdBQUcsVUFBVSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFFakQsSUFBSSxHQUFHLENBQUM7UUFDUixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUU7WUFDN0MsR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztTQUNoRTthQUFNO1lBQ0wsR0FBRyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO2dCQUNyQyxDQUFDLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEdBQUksV0FBc0I7Z0JBQ3JELENBQUMsQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztTQUMvQjtRQUVELE1BQU0sZUFBZSxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBRW5FLElBQUksbUJBQW1CLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUN4QixtQkFBbUIsR0FBRztnQkFDcEIsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2YsSUFBSSxFQUFFLGVBQWU7YUFDVCxDQUFDO1lBQ2YsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUM3QztRQUNELG1CQUFtQixDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDaEMsbUJBQW1CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztJQUN6QyxDQUFDO0lBRU8sY0FBYyxDQUFDLE9BQWdCLEVBQUUsV0FBb0IsRUFBRSxjQUF5QjtRQUN0RixPQUFPO1lBQ0wsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxLQUFLO1lBQ2xELElBQUksRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUk7WUFDNUIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUs7WUFDNUYsU0FBUyxFQUFFLEtBQUs7WUFDaEIsUUFBUSxFQUFFLGNBQWMsRUFBRSxFQUFFO1NBQ2pCLENBQUM7SUFDaEIsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFTyxZQUFZO1FBQ2xCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO1FBRXRELE1BQU0sVUFBVSxHQUFHLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFbkcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTVCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLGFBQWEsQ0FBQyxRQUFrQjtRQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sU0FBUztRQUNkLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFekQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVNLGVBQWUsQ0FBQyxRQUFrQixFQUFFLE9BQWlCO1FBQzFELDhCQUE4QjtRQUM5QixJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsRixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxRixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdkQsb0JBQW9CLENBQUMsZ0JBQWdCLENBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLFFBQVEsRUFDUixjQUFjLEVBQ2QsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsU0FBUyxFQUM1QyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxjQUFjLElBQUksS0FBSyxDQUMxRCxDQUFDO1FBRUYsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV2RCxjQUFjO1FBQ2QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUVoQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUYsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUY7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ2pEO0lBQ0gsQ0FBQztJQUVNLFNBQVM7UUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFTywwQkFBMEIsQ0FBQyxRQUFrQixFQUFFLE1BQW9CO1FBQ3pFLE1BQU0sSUFBSSxHQUFnQjtZQUN4QixLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdEUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ2hFLENBQUM7UUFFakIsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFckIsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO1lBQ3RDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0gsQ0FBQztJQUVPLGFBQWEsQ0FBQyxRQUFtQjtRQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXJFLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxXQUFXLENBQUMsRUFBVTtRQUM1QixPQUFPLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RILENBQUM7OzZHQXpnQlUsZ0JBQWdCLHdMQXdCakIsY0FBYztpR0F4QmIsZ0JBQWdCLHNGQUZoQixDQUFDLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQywwQkN2Q3ZGLG1nRUFtREE7MkZEVmEsZ0JBQWdCO2tCQVA1QixTQUFTOytCQUNFLFlBQVksYUFJWCxDQUFDLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQzs7MEJBMEJsRixNQUFNOzJCQUFDLGNBQWM7a0tBUkcsZUFBZTtzQkFBekMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZSxcbiAgQ2hhcmdlSXRlbSxcbiAgRW50aXR5VXRpbCxcbiAgTGluZUl0ZW0sXG4gIE9yZGVyQnlQaXBlLFxuICBQcmljZUFkanVzdG1lbnQsXG4gIFNhbGVzZm9yY2VJZFV0aWxzLFxuICBTZWFyY2hGaWx0ZXJQaXBlLFxuICBTZWN0aW9uLFxuICBTZWN0aW9uUGF0aCxcbiAgVUlUYWIsXG4gIFVVSUQsXG59IGZyb20gJ0B2ZWxvY2VhcHBzL2NvcmUnO1xuaW1wb3J0IHsgQ29udGV4dFNlcnZpY2UgfSBmcm9tICdAdmVsb2NlYXBwcy9zZGsvY29yZSc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29sbGFwc2libGVTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb2xsYXBzaWJsZS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1TY29wZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb3JtLXNjb3BlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnVudGltZUZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcnVudGltZS1mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnVudGltZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ydW50aW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VjdGlvbkhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zZWN0aW9uLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNlY3Rpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBMZWdhY3lSdW50aW1lQ29udGV4dCwgU29sdXRpb25SZWFkeUF3YXJlLCBVcGRhdGVEYXRhIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQm91bmREYXRhVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzL2JvdW5kLWRhdGEudHlwZXMnO1xuaW1wb3J0IHsgTGluZUl0ZW1VdGlsIH0gZnJvbSAnLi4vLi4vdXRpbHMvbGluZS1pdGVtLnV0aWwnO1xuaW1wb3J0IHsgZ2V0U2VjdGlvblRyZWUgfSBmcm9tICcuLi8uLi91dGlscy9zZWN0aW9uLnV0aWxzJztcbmltcG9ydCB7IFNlY3Rpb25zQmluZGVySGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2VjdGlvbnMtYmluZGVyLmhlbHBlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZsLXJ1bnRpbWUnLFxuICAvLyBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICB0ZW1wbGF0ZVVybDogJ3J1bnRpbWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ydW50aW1lLWxlZ2FjeS1zdHlsZXMuc2NzcycsICdydW50aW1lLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW0Zvcm1TY29wZVNlcnZpY2UsIENvbGxhcHNpYmxlU3RhdGVTZXJ2aWNlLCBPcmRlckJ5UGlwZSwgU2VhcmNoRmlsdGVyUGlwZV0sXG59KVxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgU29sdXRpb25SZWFkeUF3YXJlIHtcbiAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2VCdWNrZXRJZCA9ICd1aS5ydW50aW1lJztcblxuICBwdWJsaWMgc29ydGVkU2VjdGlvbnM6IFNlY3Rpb25bXSA9IFtdO1xuICBwdWJsaWMgc3RhdGljU2VjdGlvbnM6IFNlY3Rpb25bXSA9IFtdO1xuXG4gIHB1YmxpYyBydW50aW1lQ29udGV4dCE6IExlZ2FjeVJ1bnRpbWVDb250ZXh0O1xuICBwdWJsaWMgc29sdXRpb25MaW5lSXRlbSE6IExpbmVJdGVtO1xuICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG5cbiAgcHVibGljIGFjdGl2ZVVJVGFiPzogVUlUYWI7XG5cbiAgcHVibGljIHNvbHV0aW9uSXNSZWFkeSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBPdXRwdXQoKSBwcml2YXRlIHJlYWRvbmx5IHNvbHV0aW9uVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2VjdGlvbnNTZXJ2aWNlOiBTZWN0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtU2NvcGU6IEZvcm1TY29wZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb2xsYXBzaWJsZVN0YXRlOiBDb2xsYXBzaWJsZVN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1TZXJ2aWNlOiBSdW50aW1lRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBydW50aW1lU2VydmljZTogUnVudGltZVNlcnZpY2UsXG4gICAgQEluamVjdChNZXNzYWdlU2VydmljZSkgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZXh0U2VydmljZTogQ29udGV4dFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvcmRlckJ5UGlwZTogT3JkZXJCeVBpcGUsXG4gICAgcHJpdmF0ZSBzZWFyY2hGaWx0ZXJQaXBlOiBTZWFyY2hGaWx0ZXJQaXBlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIHByaXZhdGUgYWRqdXN0UHJpY2UoXG4gICAgdmFsdWVPcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzZWN0aW9uOiBTZWN0aW9uLFxuICAgIHNvbHV0aW9uTGluZUl0ZW06IExpbmVJdGVtLFxuICAgIHBhdGNoOiBEaWN0aW9uYXJ5PFByaWNlQWRqdXN0bWVudD4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudExpbmVJdGVtID0gc2VjdGlvbi5tb2RlbCAmJiBMaW5lSXRlbVV0aWwuZmluZEJ5SWQoc2VjdGlvbi5tb2RlbC5pZCwgW3NvbHV0aW9uTGluZUl0ZW1dKTtcblxuICAgIGlmICghcGFyZW50TGluZUl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwYXJlbnRMaW5lSXRlbS5saW5lSXRlbXMgPSBwYXJlbnRMaW5lSXRlbS5saW5lSXRlbXMubWFwKGxpbmVJdGVtID0+IHtcbiAgICAgIGNvbnN0IHsgcHJvZHVjdElkLCBjaGFyZ2VJdGVtcyB9ID0gbGluZUl0ZW07XG5cbiAgICAgIGlmIChwcm9kdWN0SWQgIT09IHZhbHVlT3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBsaW5lSXRlbTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhcmdlSXRlbSA9IGNoYXJnZUl0ZW1zLnNoaWZ0KCk7XG4gICAgICBjb25zdCB1cGRhdGVkQ2hhcmdlSXRlbSA9IHtcbiAgICAgICAgLi4uY2hhcmdlSXRlbSxcbiAgICAgICAgLi4ucGF0Y2gsXG4gICAgICB9IGFzIENoYXJnZUl0ZW07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmxpbmVJdGVtLFxuICAgICAgICBjaGFyZ2VJdGVtczogW3VwZGF0ZWRDaGFyZ2VJdGVtLCAuLi5jaGFyZ2VJdGVtc10sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVSdW50aW1lKHNvbHV0aW9uTGluZUl0ZW0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybVNjb3BlLmZvcm1TdWJtaXRFdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKChlOiBVcGRhdGVEYXRhKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICBjb25zdCBzb2x1dGlvbkxpbmVJdGVtID0gRW50aXR5VXRpbC5jbG9uZSh0aGlzLnNvbHV0aW9uTGluZUl0ZW0pO1xuXG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLmZpbmRTZWN0aW9uKGUuaWQpO1xuXG4gICAgICAgIGlmICghc2VjdGlvbikge1xuICAgICAgICAgIHRocm93ICdTZWN0aW9uIG5vdCBmb3VuZCc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50aXR5VHlwZSA9IHNlY3Rpb24uYm91bmREYXRhLmVudGl0eVR5cGU7XG5cbiAgICAgICAgaWYgKGVudGl0eVR5cGUgPT09IEJvdW5kRGF0YVR5cGVbQm91bmREYXRhVHlwZS5QT1JUXSB8fCBlbnRpdHlUeXBlID09PSBCb3VuZERhdGFUeXBlW0JvdW5kRGF0YVR5cGUuVFlQRV0pIHtcbiAgICAgICAgICBpZiAoZS5hY3Rpb24gPT09ICdwYXRjaCcgJiYgRW50aXR5VXRpbC5pc1ByZXNlbnQoZS52YWx1ZU9wdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlT3B0aW9uOiBhbnkgPSBlWyd2YWx1ZU9wdGlvbiddO1xuXG4gICAgICAgICAgICBpZiAoIXNlY3Rpb24ubW9kZWw/LnBhcmVudElkKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29sbGFwc2libGVTdGF0ZS5jbGVhclN0YXRlKHNlY3Rpb24uaWQpO1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJ1bnRpbWUodmFsdWVPcHRpb24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyZW50TGluZUl0ZW0gPSBMaW5lSXRlbVV0aWwuZmluZEJ5SWQoc2VjdGlvbi5tb2RlbC5wYXJlbnRJZCwgW3NvbHV0aW9uTGluZUl0ZW1dKTtcblxuICAgICAgICAgICAgICBpZiAocGFyZW50TGluZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmR4ID0gcGFyZW50TGluZUl0ZW0ubGluZUl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IHNlY3Rpb24ubW9kZWw/LmlkKTtcblxuICAgICAgICAgICAgICAgIHBhcmVudExpbmVJdGVtLmxpbmVJdGVtcy5zcGxpY2UoaW5keCwgMSwgdmFsdWVPcHRpb24pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb2xsYXBzaWJsZVN0YXRlLmNsZWFyU3RhdGUoc2VjdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSdW50aW1lKHNvbHV0aW9uTGluZUl0ZW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudGl0eVR5cGUgPT09IEJvdW5kRGF0YVR5cGVbQm91bmREYXRhVHlwZS5QT1JUXSkge1xuICAgICAgICAgIGlmIChlLmFjdGlvbiA9PT0gJ3Vwc2VydCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudExpbmVJdGVtID0gc2VjdGlvbi5tb2RlbCAmJiBMaW5lSXRlbVV0aWwuZmluZEJ5SWQoc2VjdGlvbi5tb2RlbC5pZCwgW3NvbHV0aW9uTGluZUl0ZW1dKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudExpbmVJdGVtKSB7XG4gICAgICAgICAgICAgIHBhcmVudExpbmVJdGVtLmxpbmVJdGVtcy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIGUuc2VsZWN0ZWRWYWx1ZU9wdGlvbnMgJiZcbiAgICAgICAgICAgICAgICAgIGUuc2VsZWN0ZWRWYWx1ZU9wdGlvbnMuZmluZEluZGV4KHYgPT4gdi50b0xvd2VyQ2FzZSgpID09PSBpLnR5cGUudG9Mb3dlckNhc2UoKSkgPCAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcmRpbmFsaXR5VmFyaWFibGUocGFyZW50TGluZUl0ZW0sIGksIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IGxpbmVJdGVtcyA9IHBhcmVudExpbmVJdGVtPy5saW5lSXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGkgPT5cbiAgICAgICAgICAgICAgICAgIGUuc2VsZWN0ZWRWYWx1ZU9wdGlvbnMgJiZcbiAgICAgICAgICAgICAgICAgIGUuc2VsZWN0ZWRWYWx1ZU9wdGlvbnMuZmluZEluZGV4KHYgPT4gdi50b0xvd2VyQ2FzZSgpID09PSBpLnR5cGUudG9Mb3dlckNhc2UoKSkgPiAtMSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgZS5zZWxlY3RlZFZhbHVlT3B0aW9ucz8uZm9yRWFjaCh2ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobGluZUl0ZW1zPy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gdi50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVJdGVtID0gdGhpcy5jcmVhdGVMaW5lSXRlbShzZWN0aW9uLCB2LCBwYXJlbnRMaW5lSXRlbSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcmRpbmFsaXR5VmFyaWFibGUocGFyZW50TGluZUl0ZW0sIGxpbmVJdGVtKTtcbiAgICAgICAgICAgICAgICAgIGxpbmVJdGVtcy5wdXNoKGxpbmVJdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlUnVudGltZShzb2x1dGlvbkxpbmVJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZS5hY3Rpb24gPT09ICdjcmVhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRMaW5lSXRlbSA9IHNlY3Rpb24ubW9kZWwgJiYgTGluZUl0ZW1VdGlsLmZpbmRCeUlkKHNlY3Rpb24ubW9kZWwuaWQsIFtzb2x1dGlvbkxpbmVJdGVtXSk7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnRMaW5lSXRlbSkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZU9wdGlvbiA9IGUudmFsdWVPcHRpb247XG4gICAgICAgICAgICAgIGNvbnN0IGxpbmVJdGVtID0gdGhpcy5jcmVhdGVMaW5lSXRlbShzZWN0aW9uLCB2YWx1ZU9wdGlvbiwgcGFyZW50TGluZUl0ZW0pO1xuICAgICAgICAgICAgICBwYXJlbnRMaW5lSXRlbS5saW5lSXRlbXMucHVzaChsaW5lSXRlbSk7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FyZGluYWxpdHlWYXJpYWJsZShwYXJlbnRMaW5lSXRlbSwgbGluZUl0ZW0pO1xuXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlUnVudGltZShzb2x1dGlvbkxpbmVJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZS5hY3Rpb24gPT09ICdjb3B5Jykge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50TGluZUl0ZW0gPSBzZWN0aW9uLm1vZGVsICYmIExpbmVJdGVtVXRpbC5maW5kQnlJZChzZWN0aW9uLm1vZGVsLmlkLCBbc29sdXRpb25MaW5lSXRlbV0pO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50TGluZUl0ZW0pIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWVPcHRpb24gPSBlLnZhbHVlT3B0aW9uO1xuICAgICAgICAgICAgICBjb25zdCBsaW5lSXRlbVRvQ29weSA9IHBhcmVudExpbmVJdGVtLmxpbmVJdGVtcy5maW5kKGxpID0+IGxpLmlkID09PSB2YWx1ZU9wdGlvbik7XG4gICAgICAgICAgICAgIGlmIChsaW5lSXRlbVRvQ29weSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVJdGVtOiBMaW5lSXRlbSA9IHsgLi4ubGluZUl0ZW1Ub0NvcHksIGlkOiAnJyB9O1xuICAgICAgICAgICAgICAgIHBhcmVudExpbmVJdGVtLmxpbmVJdGVtcy5wdXNoKGxpbmVJdGVtKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcmRpbmFsaXR5VmFyaWFibGUocGFyZW50TGluZUl0ZW0sIGxpbmVJdGVtKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUnVudGltZShzb2x1dGlvbkxpbmVJdGVtKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlLmFjdGlvbiA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudExpbmVJdGVtID0gc2VjdGlvbi5tb2RlbCAmJiBMaW5lSXRlbVV0aWwuZmluZEJ5SWQoc2VjdGlvbi5tb2RlbC5pZCwgW3NvbHV0aW9uTGluZUl0ZW1dKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudExpbmVJdGVtKSB7XG4gICAgICAgICAgICAgIC8vQXNzdW1pbmcgdGhhdCByYWRpbyBjb250cm9sIGlzIHRoZSBvbmx5IGNvbnRyb2wsIHRoYXQgJ3VwZGF0ZXMnIHZhbHVlc1xuICAgICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IHNlY3Rpb24ubW9kZWw/LmxpbmVJdGVtcy5maWx0ZXIobGkgPT4gbGkucG9ydCAmJiBsaS5wb3J0ID09PSBzZWN0aW9uLmJvdW5kRGF0YS5uYW1lKVswXTtcblxuICAgICAgICAgICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcmRpbmFsaXR5VmFyaWFibGUocGFyZW50TGluZUl0ZW0sIHByZXZpb3VzLCAwKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50TGluZUl0ZW0ubGluZUl0ZW1zLmZpbmRJbmRleChsaSA9PiBsaS5pZCA9PT0gcHJldmlvdXM/LmlkKTtcblxuICAgICAgICAgICAgICBjb25zdCBsaW5lSXRlbTogTGluZUl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IFVVSUQuVVVJRCgpLFxuICAgICAgICAgICAgICAgIHF0eTogcHJldmlvdXM/LnF0eSxcbiAgICAgICAgICAgICAgICBwb3J0OiBwcmV2aW91cz8ucG9ydCxcbiAgICAgICAgICAgICAgICB0eXBlOiBFbnRpdHlVdGlsLmlzUHJlc2VudChlLnZhbHVlT3B0aW9uKSA/IGUudmFsdWVPcHRpb24gOiB0aGlzLmZvcm0uY29udHJvbHNbZS5pZF0udmFsdWUsXG4gICAgICAgICAgICAgICAgY2ZnU3RhdHVzOiAnTmV3JyxcbiAgICAgICAgICAgICAgICBwYXJlbnRJZDogcHJldmlvdXM/LnBhcmVudElkLFxuICAgICAgICAgICAgICB9IGFzIExpbmVJdGVtO1xuXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FyZGluYWxpdHlWYXJpYWJsZShwYXJlbnRMaW5lSXRlbSwgbGluZUl0ZW0pO1xuICAgICAgICAgICAgICBwYXJlbnRMaW5lSXRlbS5saW5lSXRlbXNbaW5kZXhdID0gbGluZUl0ZW07XG5cbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVSdW50aW1lKHNvbHV0aW9uTGluZUl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlLmFjdGlvbiA9PT0gJ3JlbW92ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudExpbmVJdGVtID0gc2VjdGlvbi5tb2RlbCAmJiBMaW5lSXRlbVV0aWwuZmluZEJ5SWQoc2VjdGlvbi5tb2RlbC5pZCwgW3NvbHV0aW9uTGluZUl0ZW1dKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwYXJlbnRMaW5lSXRlbSAmJlxuICAgICAgICAgICAgICBTZWN0aW9uc0JpbmRlckhlbHBlci5pc1JlbW92ZUFsbG93ZWQocGFyZW50TGluZUl0ZW0sIHNlY3Rpb24uYm91bmREYXRhLm5hbWUsIHNlY3Rpb24ubW9kZWw/LnF0eSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudExpbmVJdGVtLmxpbmVJdGVtcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgaXRlbSA9PiBpdGVtLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gZS52YWx1ZU9wdGlvbj8udG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVkID0gcGFyZW50TGluZUl0ZW0ubGluZUl0ZW1zLnNwbGljZShpbmRleCwgMSlbMF07XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJkaW5hbGl0eVZhcmlhYmxlKHBhcmVudExpbmVJdGVtLCByZW1vdmVkLCAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJ1bnRpbWUoc29sdXRpb25MaW5lSXRlbSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZS5hY3Rpb24gPT09ICdxdHlVcGRhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlU2VjdGlvbiA9IGUudmFsdWVPcHRpb25cbiAgICAgICAgICAgICAgPyBTZWN0aW9uSGVscGVyU2VydmljZS5maW5kU2VjdGlvbkZvclZhbHVlKHNlY3Rpb24sIGUudmFsdWVPcHRpb24pXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBjb25zdCB0eXBlTGluZUl0ZW0gPSB0eXBlU2VjdGlvbj8ubW9kZWwgJiYgTGluZUl0ZW1VdGlsLmZpbmRCeUlkKHR5cGVTZWN0aW9uLm1vZGVsLmlkLCBbc29sdXRpb25MaW5lSXRlbV0pO1xuICAgICAgICAgICAgaWYgKHR5cGVTZWN0aW9uICYmIHR5cGVMaW5lSXRlbSkge1xuICAgICAgICAgICAgICB0eXBlTGluZUl0ZW0ucXR5ID0gK3RoaXMuZm9ybS5jb250cm9sc1t0eXBlU2VjdGlvbi5pZCArICdxdHknXS52YWx1ZTtcbiAgICAgICAgICAgICAgdHlwZUxpbmVJdGVtLmNmZ1N0YXR1cyA9ICdVc2VyJztcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVSdW50aW1lKHNvbHV0aW9uTGluZUl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlLmFjdGlvbiA9PT0gJ2FkanVzdE5ldFByaWNlJykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWx1ZU9wdGlvbiwgb3B0aW9ucyB9ID0gZTtcbiAgICAgICAgICAgIGNvbnN0IHsgYW1vdW50IH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgICAgICAgICBjb25zdCBwcmljZUFkanVzdG1lbnQ6IFByaWNlQWRqdXN0bWVudCA9IHtcbiAgICAgICAgICAgICAgdHlwZTogJ09WRVJSSURFX0FNT1VOVCcsXG4gICAgICAgICAgICAgIGV4cGxhbmF0aW9uOiAnTWFudWFsIG5ldCBwcmljZSBhZGp1c3RtZW50JyxcbiAgICAgICAgICAgICAgZm9ybXVsYTogJycsXG4gICAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuYWRqdXN0UHJpY2UodmFsdWVPcHRpb24sIHNlY3Rpb24sIHNvbHV0aW9uTGluZUl0ZW0sIHsgcHJpY2VBZGp1c3RtZW50IH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlLmFjdGlvbiA9PT0gJ2FkanVzdExpc3RQcmljZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWVPcHRpb24sIG9wdGlvbnMgfSA9IGU7XG4gICAgICAgICAgICBjb25zdCB7IGFtb3VudCB9ID0gb3B0aW9ucyA/PyB7fTtcblxuICAgICAgICAgICAgY29uc3QgbGlzdFByaWNlQWRqdXN0bWVudDogUHJpY2VBZGp1c3RtZW50ID0ge1xuICAgICAgICAgICAgICB0eXBlOiAnT1ZFUlJJREVfQU1PVU5UJyxcbiAgICAgICAgICAgICAgZXhwbGFuYXRpb246ICdNYW51YWwgbGlzdCBwcmljZSBhZGp1c3RtZW50JyxcbiAgICAgICAgICAgICAgZm9ybXVsYTogJycsXG4gICAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuYWRqdXN0UHJpY2UodmFsdWVPcHRpb24sIHNlY3Rpb24sIHNvbHV0aW9uTGluZUl0ZW0sIHsgbGlzdFByaWNlQWRqdXN0bWVudCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50aXR5VHlwZSA9PT0gQm91bmREYXRhVHlwZVtCb3VuZERhdGFUeXBlLlRZUEVdKSB7XG4gICAgICAgICAgaWYgKGUuYWN0aW9uID09PSAncmVtb3ZlJykge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50TGluZUl0ZW0gPVxuICAgICAgICAgICAgICBzZWN0aW9uLm1vZGVsPy5wYXJlbnRJZCAmJiBMaW5lSXRlbVV0aWwuZmluZEJ5SWQoc2VjdGlvbi5tb2RlbC5wYXJlbnRJZCwgW3NvbHV0aW9uTGluZUl0ZW1dKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwYXJlbnRMaW5lSXRlbSAmJlxuICAgICAgICAgICAgICBzZWN0aW9uLm1vZGVsICYmXG4gICAgICAgICAgICAgIHNlY3Rpb24ubW9kZWwucG9ydCAmJlxuICAgICAgICAgICAgICBTZWN0aW9uc0JpbmRlckhlbHBlci5pc1JlbW92ZUFsbG93ZWQocGFyZW50TGluZUl0ZW0sIHNlY3Rpb24ubW9kZWwucG9ydCwgc2VjdGlvbi5tb2RlbD8ucXR5KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50TGluZUl0ZW0ubGluZUl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IHNlY3Rpb24ubW9kZWw/LmlkKTtcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVkID0gcGFyZW50TGluZUl0ZW0ubGluZUl0ZW1zLnNwbGljZShpbmRleCwgMSlbMF07XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJkaW5hbGl0eVZhcmlhYmxlKHBhcmVudExpbmVJdGVtLCByZW1vdmVkLCAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNpYmxlU3RhdGUuY2xlYXJTdGF0ZShzZWN0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJ1bnRpbWUoc29sdXRpb25MaW5lSXRlbSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZS5hY3Rpb24gPT09ICdxdHlVcGRhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlTGluZUl0ZW0gPSBzZWN0aW9uLm1vZGVsICYmIExpbmVJdGVtVXRpbC5maW5kQnlJZChzZWN0aW9uLm1vZGVsLmlkLCBbc29sdXRpb25MaW5lSXRlbV0pO1xuXG4gICAgICAgICAgICBpZiAodHlwZUxpbmVJdGVtKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHF0eSA9ICt0aGlzLmZvcm0uY29udHJvbHNbZS5pZCArICdxdHknXS52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKHR5cGVMaW5lSXRlbS5wYXJlbnRJZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudExpbmVJdGVtID0gTGluZUl0ZW1VdGlsLmZpbmRCeUlkKHR5cGVMaW5lSXRlbS5wYXJlbnRJZCwgW3NvbHV0aW9uTGluZUl0ZW1dKTtcblxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRMaW5lSXRlbSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJkaW5hbGl0eVZhcmlhYmxlKHBhcmVudExpbmVJdGVtLCB0eXBlTGluZUl0ZW0sIHF0eSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHR5cGVMaW5lSXRlbS5xdHkgPSBxdHk7XG4gICAgICAgICAgICAgIHR5cGVMaW5lSXRlbS5jZmdTdGF0dXMgPSAnVXNlcic7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlUnVudGltZShzb2x1dGlvbkxpbmVJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50aXR5VHlwZSA9PT0gQm91bmREYXRhVHlwZVtCb3VuZERhdGFUeXBlLkFUVFJJQlVURV0pIHtcbiAgICAgICAgICBpZiAoZS5hY3Rpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRMaW5lSXRlbSA9IHNlY3Rpb24ubW9kZWwgJiYgTGluZUl0ZW1VdGlsLmZpbmRCeUlkKHNlY3Rpb24ubW9kZWwuaWQsIFtzb2x1dGlvbkxpbmVJdGVtXSk7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBwYXJlbnRMaW5lSXRlbT8uYXR0cmlidXRlcy5maW5kKFxuICAgICAgICAgICAgICBhdHRyID0+IGF0dHIubmFtZS50b0xvd2VyQ2FzZSgpID09PSBzZWN0aW9uLmJvdW5kRGF0YS5uYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgIC8vRXhwbGljaXRseSBzZXQgdmFsdWUgYWx3YXlzIHdpblxuICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0eXBlb2YgZS52YWx1ZU9wdGlvbiAhPT0gJ3VuZGVmaW5lZCcgPyBlLnZhbHVlT3B0aW9uIDogdGhpcy5mb3JtLmNvbnRyb2xzW2UuaWRdLnZhbHVlO1xuXG4gICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUudHlwZSA9PT0gJ0JPT0xFQU4nKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA/IDEgOiAwO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYXR0cmlidXRlLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZS5jZmdTdGF0dXMgPSAnVXNlcic7XG5cbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVSdW50aW1lKHNvbHV0aW9uTGluZUl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBrZXk6IHRoaXMubWVzc2FnZUJ1Y2tldElkLCBzdW1tYXJ5OiBgQ29uZmlndXJhdGlvbiBmYWlsZWQgJHsoZSBhcyBhbnkpPy5tZXNzYWdlfWAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJ1bnRpbWVTZXJ2aWNlLm9uU29sdXRpb25SZWFkeUV2ZW50XG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKGxpbmVJdGVtID0+IHRoaXMub25Tb2x1dGlvblJlYWR5KGxpbmVJdGVtKSk7XG5cbiAgICB0aGlzLnJ1bnRpbWVTZXJ2aWNlLm9uU29sdXRpb25VcGRhdGVkRXZlbnRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IExpbmVJdGVtIHwgSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVNvbHV0aW9uVXBkYXRlKGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVTb2x1dGlvbkZhaWxlZFVwZGF0ZShkYXRhKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5ydW50aW1lU2VydmljZS5vblVJUmVmcmVzaEV2ZW50LnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgeyB1aURlZmluaXRpb24gfSA9IHRoaXMucnVudGltZVNlcnZpY2UuZ2V0UnVudGltZUNvbnRleHQoKSA/PyB7fTtcbiAgICAgIHRoaXMucnVudGltZUNvbnRleHQudWlEZWZpbml0aW9uID0gdWlEZWZpbml0aW9uIGFzIGFueTtcbiAgICAgIHRoaXMuZm9ybVNjb3BlLnNjcmlwdFNlc3Npb25TY29wZSA9IHt9O1xuICAgICAgdGhpcy5zdGFydFJ1bnRpbWUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvblNvbHV0aW9uUmVhZHkobGluZUl0ZW06IExpbmVJdGVtKTogdm9pZCB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMucnVudGltZVNlcnZpY2UuZ2V0UnVudGltZUNvbnRleHQoKSBhcyBMZWdhY3lSdW50aW1lQ29udGV4dDtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uQ29udGV4dCA9IHRoaXMuY29udGV4dFNlcnZpY2UucmVzb2x2ZSgpO1xuXG4gICAgY29uc3QgbWVyZ2VDb250ZXh0OiBMZWdhY3lSdW50aW1lQ29udGV4dCA9IHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIC4uLmNvbnRleHQucHJvcGVydGllcyxcbiAgICAgICAgLi4uY29uZmlndXJhdGlvbkNvbnRleHQucHJvcGVydGllcyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IGFjY291bnRJZCA9IG1lcmdlQ29udGV4dC5wcm9wZXJ0aWVzPy5BY2NvdW50SWQ7XG4gICAgaWYgKGFjY291bnRJZCAmJiBhY2NvdW50SWQubGVuZ3RoID09PSAxNSkge1xuICAgICAgdGhpcy5ydW50aW1lQ29udGV4dCA9IHtcbiAgICAgICAgLi4ubWVyZ2VDb250ZXh0LFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgLi4ubWVyZ2VDb250ZXh0LnByb3BlcnRpZXMsXG4gICAgICAgICAgQWNjb3VudElkOiBTYWxlc2ZvcmNlSWRVdGlscy5nZW5lcmF0ZUlkMThGcm9tSWQxNShhY2NvdW50SWQpLFxuICAgICAgICB9LFxuICAgICAgfSBhcyBhbnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucnVudGltZUNvbnRleHQgPSBtZXJnZUNvbnRleHQgYXMgYW55O1xuICAgIH1cblxuICAgIHRoaXMuc29sdXRpb25MaW5lSXRlbSA9IGxpbmVJdGVtO1xuICAgIHRoaXMucnVudGltZVNlcnZpY2Uuc2V0UnVudGltZUNvbnRleHQodGhpcy5ydW50aW1lQ29udGV4dCk7XG5cbiAgICB0aGlzLnN0YXJ0UnVudGltZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTb2x1dGlvblVwZGF0ZSh1cGRhdGVkTGluZUl0ZW06IExpbmVJdGVtKTogdm9pZCB7XG4gICAgdGhpcy5zb2x1dGlvbkxpbmVJdGVtID0gdXBkYXRlZExpbmVJdGVtO1xuICAgIHRoaXMucHJvY2Vzc1NvbHV0aW9uKHRydWUpO1xuICAgIHRoaXMucnVudGltZVNlcnZpY2Uuc29sdXRpb25Qcm9jZXNzZWQodGhpcy5zb2x1dGlvbkxpbmVJdGVtKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNvbHV0aW9uRmFpbGVkVXBkYXRlKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSk6IHZvaWQge1xuICAgIGNvbnN0IGhhc0Vycm9yTWVzc2FnZSA9IEVudGl0eVV0aWwuaXNQcmVzZW50KGVycm9yLmVycm9yKSAmJiBFbnRpdHlVdGlsLmlzUHJlc2VudChlcnJvci5lcnJvci5tZXNzYWdlKTtcbiAgICBjb25zdCBtZXNzYWdlID0gaGFzRXJyb3JNZXNzYWdlID8gZXJyb3IuZXJyb3IubWVzc2FnZSA6ICdDb25maWd1cmF0aW9uIGZhaWxlZCc7XG4gICAgY29uc3QgeyBpc0hhbmRsaW5nQ29uZmlndXJhdGlvbkVycm9ycyB9ID0gdGhpcy5ydW50aW1lQ29udGV4dC51aURlZmluaXRpb24gPz8ge307XG5cbiAgICBpZiAoaXNIYW5kbGluZ0NvbmZpZ3VyYXRpb25FcnJvcnMpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsga2V5OiB0aGlzLm1lc3NhZ2VCdWNrZXRJZCwgc3VtbWFyeTogbWVzc2FnZSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNvbHV0aW9uTGluZUl0ZW0gPSB7XG4gICAgICAuLi50aGlzLnNvbHV0aW9uTGluZUl0ZW0sXG4gICAgICBtZXNzYWdlczogWy4uLnRoaXMuc29sdXRpb25MaW5lSXRlbS5tZXNzYWdlcywgYEU6JHttZXNzYWdlfWBdLFxuICAgIH07XG4gICAgdGhpcy5wcm9jZXNzU29sdXRpb24odHJ1ZSwgdHJ1ZSk7XG4gICAgdGhpcy5ydW50aW1lU2VydmljZS5zb2x1dGlvblByb2Nlc3NlZCh0aGlzLnNvbHV0aW9uTGluZUl0ZW0pO1xuXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDYXJkaW5hbGl0eVZhcmlhYmxlKHBhcmVudDogTGluZUl0ZW0sIHVwZGF0ZWQ6IExpbmVJdGVtLCBuZXdRdWFudGl0eT86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHBvcnREb21haW4gPSB1cGRhdGVkLnBvcnQgPyBwYXJlbnQucG9ydERvbWFpbnNbdXBkYXRlZC5wb3J0XSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkb21haW5UeXBlID0gcG9ydERvbWFpbj8uZG9tYWluVHlwZXMuZmluZCh0ID0+IHQubmFtZSA9PT0gdXBkYXRlZC50eXBlKTtcbiAgICBjb25zdCBjYXJkaW5hbGl0eSA9IGRvbWFpblR5cGU/LmNhcmRpbmFsaXR5ID8/IDA7XG5cbiAgICBsZXQgcXR5O1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGRvbWFpblR5cGU/LmNhcmRpbmFsaXR5KSkge1xuICAgICAgcXR5ID0gTnVtYmVyLmlzRmluaXRlKG5ld1F1YW50aXR5KSA/IG5ld1F1YW50aXR5IDogdXBkYXRlZC5xdHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF0eSA9IEVudGl0eVV0aWwuaXNQcmVzZW50KG5ld1F1YW50aXR5KVxuICAgICAgICA/IGNhcmRpbmFsaXR5IC0gdXBkYXRlZC5xdHkgKyAobmV3UXVhbnRpdHkgYXMgbnVtYmVyKVxuICAgICAgICA6IGNhcmRpbmFsaXR5ICsgdXBkYXRlZC5xdHk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FyZGluYWxpdHlOYW1lID0gJyNDVi0nICsgdXBkYXRlZC50eXBlICsgJ0AnICsgdXBkYXRlZC5wb3J0O1xuXG4gICAgbGV0IGNhcmRpbmFsaXR5VmFyaWFibGUgPSBwYXJlbnQuYXR0cmlidXRlcy5maW5kKGEgPT4gYS5uYW1lID09PSBjYXJkaW5hbGl0eU5hbWUpO1xuICAgIGlmICghY2FyZGluYWxpdHlWYXJpYWJsZSkge1xuICAgICAgY2FyZGluYWxpdHlWYXJpYWJsZSA9IHtcbiAgICAgICAgaWQ6IFVVSUQuVVVJRCgpLFxuICAgICAgICBuYW1lOiBjYXJkaW5hbGl0eU5hbWUsXG4gICAgICB9IGFzIEF0dHJpYnV0ZTtcbiAgICAgIHBhcmVudC5hdHRyaWJ1dGVzLnB1c2goY2FyZGluYWxpdHlWYXJpYWJsZSk7XG4gICAgfVxuICAgIGNhcmRpbmFsaXR5VmFyaWFibGUudmFsdWUgPSBxdHk7XG4gICAgY2FyZGluYWxpdHlWYXJpYWJsZS5jZmdTdGF0dXMgPSAnVXNlcic7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxpbmVJdGVtKHNlY3Rpb246IFNlY3Rpb24sIHZhbHVlT3B0aW9uPzogc3RyaW5nLCBwYXJlbnRMaW5lSXRlbT86IExpbmVJdGVtKTogTGluZUl0ZW0ge1xuICAgIHJldHVybiB7XG4gICAgICBxdHk6ICt0aGlzLmZvcm0uY29udHJvbHNbc2VjdGlvbi5pZCArICdxdHknXS52YWx1ZSxcbiAgICAgIHBvcnQ6IHNlY3Rpb24uYm91bmREYXRhLm5hbWUsXG4gICAgICB0eXBlOiBFbnRpdHlVdGlsLmlzUHJlc2VudCh2YWx1ZU9wdGlvbikgPyB2YWx1ZU9wdGlvbiA6IHRoaXMuZm9ybS5jb250cm9sc1tzZWN0aW9uLmlkXS52YWx1ZSxcbiAgICAgIGNmZ1N0YXR1czogJ05ldycsXG4gICAgICBwYXJlbnRJZDogcGFyZW50TGluZUl0ZW0/LmlkLFxuICAgIH0gYXMgTGluZUl0ZW07XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bnN1YnNjcmliZS5uZXh0KCk7XG5cbiAgICB0aGlzLnNlY3Rpb25zU2VydmljZS5kZXN0cm95KCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UnVudGltZSgpOiB2b2lkIHtcbiAgICBjb25zdCB1aURlZmluaXRpb24gPSB0aGlzLnJ1bnRpbWVDb250ZXh0LnVpRGVmaW5pdGlvbjtcblxuICAgIGNvbnN0IGRlZmF1bHRUYWIgPSB1aURlZmluaXRpb24/LnRhYnM/LmZpbmQodGFiID0+IHRhYi5pc0RlZmF1bHQpO1xuICAgIHRoaXMuYWN0aXZlVUlUYWIgPSBFbnRpdHlVdGlsLmlzUHJlc2VudChkZWZhdWx0VGFiKSA/IGRlZmF1bHRUYWIgOiB1aURlZmluaXRpb24/LnRhYnM/LlswXTtcblxuICAgIHRoaXMuc2VjdGlvbnNTZXJ2aWNlLmNvbXBpbGVNb2R1bGUodWlEZWZpbml0aW9uPy5zZWN0aW9ucyA/PyBbXSwgdWlEZWZpbml0aW9uPy5pc1ZpZXdFbmNhcHN1bGF0ZWQpO1xuXG4gICAgdGhpcy5wcm9jZXNzU29sdXRpb24oKTtcblxuICAgIHRoaXMuc29sdXRpb25Jc1JlYWR5ID0gdHJ1ZTtcblxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUnVudGltZShsaW5lSXRlbTogTGluZUl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLnNvbHV0aW9uVXBkYXRlZC5lbWl0KGxpbmVJdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb0NhcnQoKTogdm9pZCB7XG4gICAgY29uc3QgbGluZUl0ZW0gPSBFbnRpdHlVdGlsLmNsb25lKHRoaXMuc29sdXRpb25MaW5lSXRlbSk7XG5cbiAgICB0aGlzLnJ1bnRpbWVTZXJ2aWNlLnN0b3BSdW50aW1lKGxpbmVJdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzU29sdXRpb24oaXNVcGRhdGU/OiBib29sZWFuLCBpc0Vycm9yPzogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vMS4gQmluZCBzZWN0aW9ucyB0byBzb2x1dGlvblxuICAgIGxldCBzZWN0aW9ucyA9IEVudGl0eVV0aWwuY2xvbmUodGhpcy5ydW50aW1lQ29udGV4dC51aURlZmluaXRpb24/LnNlY3Rpb25zKSA/PyBbXTtcbiAgICBjb25zdCBzb3VyY2VTZWN0aW9ucyA9IEVudGl0eVV0aWwuY2xvbmUodGhpcy5ydW50aW1lQ29udGV4dC51aURlZmluaXRpb24/LnNlY3Rpb25zKSA/PyBbXTtcbiAgICB0aGlzLnVwZGF0ZUxpbmVJdGVtc1NlY3Rpb25QYXRoKHRoaXMuc29sdXRpb25MaW5lSXRlbSk7XG4gICAgU2VjdGlvbnNCaW5kZXJIZWxwZXIuc2V0TGluZUl0ZW1zUGF0aChcbiAgICAgIHRoaXMucnVudGltZUNvbnRleHQucnVudGltZU1vZGVsLFxuICAgICAgdGhpcy5zb2x1dGlvbkxpbmVJdGVtLFxuICAgICAgc2VjdGlvbnMsXG4gICAgICBzb3VyY2VTZWN0aW9ucyxcbiAgICAgIChzZWM6IGFueSkgPT4gIXNlYy5wYXJlbnRJZCAmJiBzZWMuYm91bmREYXRhLFxuICAgICAgdGhpcy5ydW50aW1lQ29udGV4dC51aURlZmluaXRpb24/LnByaWNpbmdFbmFibGVkID8/IGZhbHNlLFxuICAgICk7XG5cbiAgICBzZWN0aW9ucyA9IHNlY3Rpb25zLmZpbHRlcihzID0+IHMubW9kZWwgJiYgcy50ZW1wbGF0ZSk7XG5cbiAgICAvLzIuIEluaXQgZm9ybVxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZm9ybVNlcnZpY2UuaW5pdEZvcm0oc2VjdGlvbnMsIHRoaXMuc29sdXRpb25MaW5lSXRlbSk7XG4gICAgdGhpcy5mb3JtU2NvcGUuZm9ybSA9IHRoaXMuZm9ybTtcblxuICAgIHRoaXMuc29ydGVkU2VjdGlvbnMgPSB0aGlzLmZpbHRlckFuZFNvcnQoZ2V0U2VjdGlvblRyZWUoc2VjdGlvbnMuZmlsdGVyKHMgPT4gIXMuaXNTdGF0aWMpKSk7XG5cbiAgICBpZiAoIWlzVXBkYXRlKSB7XG4gICAgICB0aGlzLnN0YXRpY1NlY3Rpb25zID0gdGhpcy5maWx0ZXJBbmRTb3J0KGdldFNlY3Rpb25UcmVlKHNlY3Rpb25zLmZpbHRlcihzID0+IHMuaXNTdGF0aWMpKSk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0Vycm9yKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmNsZWFyKHRoaXMubWVzc2FnZUJ1Y2tldElkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGlkZU1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMucnVudGltZVNlcnZpY2UuY2FuY2VsUnVudGltZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVMaW5lSXRlbXNTZWN0aW9uUGF0aChsaW5lSXRlbTogTGluZUl0ZW0sIHBhcmVudD86IFNlY3Rpb25QYXRoKTogdm9pZCB7XG4gICAgY29uc3QgcGF0aDogU2VjdGlvblBhdGggPSB7XG4gICAgICB0eXBlczogcGFyZW50ID8gcGFyZW50LnR5cGVzLmNvbmNhdChbbGluZUl0ZW0udHlwZV0pIDogW2xpbmVJdGVtLnR5cGVdLFxuICAgICAgcG9ydHM6IHBhcmVudCA/IHBhcmVudC5wb3J0cy5jb25jYXQobGluZUl0ZW0ucG9ydCA/IFtsaW5lSXRlbS5wb3J0XSA6IFtdKSA6IFtdLFxuICAgIH0gYXMgU2VjdGlvblBhdGg7XG5cbiAgICBsaW5lSXRlbS5wYXRoID0gcGF0aDtcblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgbGluZUl0ZW0ubGluZUl0ZW1zKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxpbmVJdGVtc1NlY3Rpb25QYXRoKGNoaWxkLCBsaW5lSXRlbS5wYXRoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckFuZFNvcnQoc2VjdGlvbnM6IFNlY3Rpb25bXSk6IFNlY3Rpb25bXSB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnNlYXJjaEZpbHRlclBpcGUudHJhbnNmb3JtKHNlY3Rpb25zLCB0aGlzLmFjdGl2ZVVJVGFiPy5pZCwgJ3BhZ2UnKTtcbiAgICBjb25zdCBvcmRlcmVkID0gdGhpcy5vcmRlckJ5UGlwZS50cmFuc2Zvcm0oZmlsdGVyZWQsICdvcmRlcicsICdhc2MnKTtcblxuICAgIHJldHVybiBvcmRlcmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU2VjdGlvbihpZDogc3RyaW5nKTogU2VjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEVudGl0eVV0aWwuZmluZEJ5RmllbGRIaWVyYXJjaGljYWxseSgnaWQnLCBpZCwgWy4uLnRoaXMuc29ydGVkU2VjdGlvbnMsIC4uLnRoaXMuc3RhdGljU2VjdGlvbnNdLCAnY2hpbGRyZW4nKTtcbiAgfVxufVxuIiwiPHZsLWxvYWRlciBsYWJlbD1cIkxvYWRpbmcgVUlcIiAqbmdJZj1cIiFzb2x1dGlvbklzUmVhZHk7IGVsc2UgY29udGVudFwiPjwvdmwtbG9hZGVyPlxuXG48bmctdGVtcGxhdGUgI2NvbnRlbnQ+XG4gIDxkaXZcbiAgICBjbGFzcz1cInNpZGViYXItdGFic1wiXG4gICAgW25nQ2xhc3NdPVwieyBoaWRkZW46ICFydW50aW1lQ29udGV4dD8udWlEZWZpbml0aW9uPy5kZWZhdWx0UGFuZWxzIH1cIlxuICAgICN1aVRhYnM9XCJzaWRlYmFyVGFic1wiXG4gICAgc2lkZWJhclRhYnM9XCJ7eyBhY3RpdmVVSVRhYj8uaWQgfX1cIlxuICAgIGlkPVwidmwtZGVmYXVsdC1zaWRlYmFyLXRhYnNcIlxuICA+XG4gICAgPHVsPlxuICAgICAgPGxpXG4gICAgICAgICpuZ0Zvcj1cImxldCB0YWIgb2YgcnVudGltZUNvbnRleHQ/LnVpRGVmaW5pdGlvbj8udGFicyB8IG9yZGVyQnk6ICdvcmRlcic6J2FzYydcIlxuICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogdWlUYWJzLmFjdGl2ZVRhYiA9PT0gdGFiLmlkIH1cIlxuICAgICAgICAoY2xpY2spPVwidWlUYWJzLnN3aXRjaFRhYih0YWIuaWQpXCJcbiAgICAgID5cbiAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIj57eyB0YWIubmFtZSB9fTwvYT5cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInNlY3Rpb25zLXdyYXBwZXJcIj5cbiAgICA8Zm9ybSByb2xlPVwiZm9ybVwiIG5hbWU9XCJmb3JtXCIgY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIiBbZm9ybUdyb3VwXT1cImZvcm1cIiBub3ZhbGlkYXRlIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiBzdGF0aWNTZWN0aW9uczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VjdGlvbi5tb2RlbCAmJiBzZWN0aW9uLnRlbXBsYXRlICYmICFzZWN0aW9uLmhpZGRlblwiPlxuICAgICAgICAgIDx2bC1zZWN0aW9uLXJlbmRlcmVyIFtzZWN0aW9uXT1cInNlY3Rpb25cIiBbZm9ybV09XCJmb3JtXCI+PC92bC1zZWN0aW9uLXJlbmRlcmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIHNvcnRlZFNlY3Rpb25zOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWN0aW9uLm1vZGVsICYmIHNlY3Rpb24udGVtcGxhdGUgJiYgIXNlY3Rpb24uaGlkZGVuXCI+XG4gICAgICAgICAgPHZsLXNlY3Rpb24tcmVuZGVyZXIgW3NlY3Rpb25dPVwic2VjdGlvblwiIFtmb3JtXT1cImZvcm1cIj48L3ZsLXNlY3Rpb24tcmVuZGVyZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9mb3JtPlxuXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJtb2RhbC1mb290ZXJcIlxuICAgICAgKm5nSWY9XCJydW50aW1lQ29udGV4dD8ucnVudGltZU1vZGUgPT09IDFcIlxuICAgICAgaWQ9XCJ2bC1ydW50aW1lLWRlZmF1bHQtZm9vdGVyXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgaGlkZGVuOiAhcnVudGltZUNvbnRleHQ/LnVpRGVmaW5pdGlvbj8uZGVmYXVsdFBhbmVscyB9XCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGlucHV0LWZvcm0taW5wdXRcIj5cbiAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIChjbGljayk9XCJmb3JtLnZhbGlkICYmIGFkZFRvQ2FydCgpXCIgaWQ9XCJhZGQtdG8tY2FydC1idG5cIlxuICAgICAgICAgID5BZGQgdG8gY2FydDwvYVxuICAgICAgICA+XG4gICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgY2xhc3M9XCJidG4gYnRuLWxpbmtcIiAoY2xpY2spPVwiaGlkZU1vZGFsKClcIiBpZD1cImNhbmNlbC1idG5cIj5DYW5jZWw8L2E+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19