tango-app-ui-store-builder 1.0.47 → 1.0.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/create-fixture/create-fixture.component.mjs +233 -138
- package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +4 -2
- package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +4 -2
- package/esm2022/lib/components/fixture-template/template-basic-details/template-basic-details.component.mjs +40 -4
- package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +3 -3
- package/esm2022/lib/components/fixture-template/template-summary/template-summary.component.mjs +3 -3
- package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +108 -79
- package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +7 -3
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +4 -2
- package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +27 -4
- package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +10 -14
- package/esm2022/lib/components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +3 -3
- package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +4 -2
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.mjs +11 -5
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +14 -9
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.mjs +39 -7
- package/esm2022/lib/components/planogram/merch-compliance/zone-products/zone-products.component.mjs +18 -5
- package/esm2022/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.mjs +68 -0
- package/esm2022/lib/components/planogram/plano-analytics/date-range-picker/date-range-picker.component.mjs +3 -3
- package/esm2022/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.mjs +645 -0
- package/esm2022/lib/components/planogram/plano-analytics/plano-analytics.component.mjs +1194 -24
- package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +15 -8
- package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +8 -4
- package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +17 -9
- package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +3 -3
- package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -2
- package/esm2022/lib/components/store-plano/store-plano.component.mjs +4 -2
- package/esm2022/lib/interfaces/fixture-library.interface.mjs +1 -1
- package/esm2022/lib/services/store-builder.service.mjs +4 -1
- package/esm2022/lib/tango-store-builder.module.mjs +8 -2
- package/fesm2022/tango-app-ui-store-builder.mjs +2953 -817
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/create-fixture/create-fixture.component.d.ts +15 -14
- package/lib/components/fixture-template/template-basic-details/template-basic-details.component.d.ts +2 -0
- package/lib/components/fixture-template/template-vms/template-vms.component.d.ts +12 -12
- package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +2 -2
- package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +4 -4
- package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +2 -0
- package/lib/components/manage-store-plano/template-vms/template-vms.component.d.ts +0 -1
- package/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.d.ts +4 -2
- package/lib/components/planogram/merch-compliance/product-locator/product-locator.component.d.ts +3 -2
- package/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.d.ts +10 -3
- package/lib/components/planogram/merch-compliance/zone-products/zone-products.component.d.ts +4 -2
- package/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.d.ts +25 -0
- package/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.d.ts +93 -0
- package/lib/components/planogram/plano-analytics/plano-analytics.component.d.ts +75 -3
- package/lib/components/planogram/plano-details-parent/plano-details-parent.component.d.ts +3 -2
- package/lib/interfaces/fixture-library.interface.d.ts +1 -1
- package/lib/services/store-builder.service.d.ts +1 -0
- package/lib/tango-store-builder.module.d.ts +26 -24
- package/package.json +1 -1
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { Component } from
|
|
2
|
-
import { Validators, FormsModule, ReactiveFormsModule } from
|
|
3
|
-
import { RouterLink } from
|
|
4
|
-
import { NgbAccordionModule, NgbTooltip } from
|
|
5
|
-
import { debounceTime, distinctUntilChanged, filter, firstValueFrom, map, Subject, takeUntil } from
|
|
6
|
-
import { CompleteConfirmationComponent } from
|
|
7
|
-
import { DeleteConfirmationComponent } from
|
|
8
|
-
import { ExitConfirmationComponent } from
|
|
9
|
-
import { CannotPerformComponent } from
|
|
10
|
-
import { CommonModule } from
|
|
11
|
-
import { TimeAgoPipe } from
|
|
12
|
-
import { CounterInputComponent } from
|
|
13
|
-
import { ReactiveSelectComponent } from
|
|
14
|
-
import { generalValidator } from
|
|
1
|
+
import { Component } from "@angular/core";
|
|
2
|
+
import { Validators, FormsModule, ReactiveFormsModule, } from "@angular/forms";
|
|
3
|
+
import { RouterLink } from "@angular/router";
|
|
4
|
+
import { NgbAccordionModule, NgbTooltip, } from "@ng-bootstrap/ng-bootstrap";
|
|
5
|
+
import { debounceTime, distinctUntilChanged, filter, firstValueFrom, map, Subject, takeUntil, } from "rxjs";
|
|
6
|
+
import { CompleteConfirmationComponent } from "../popups/complete-confirmation/complete-confirmation.component";
|
|
7
|
+
import { DeleteConfirmationComponent } from "../popups/delete-confirmation/delete-confirmation.component";
|
|
8
|
+
import { ExitConfirmationComponent } from "../popups/exit-confirmation/exit-confirmation.component";
|
|
9
|
+
import { CannotPerformComponent } from "../popups/cannot-perform/cannot-perform.component";
|
|
10
|
+
import { CommonModule } from "@angular/common";
|
|
11
|
+
import { TimeAgoPipe } from "../../pipes/time-ago.pipe";
|
|
12
|
+
import { CounterInputComponent } from "../counter-input/counter-input.component";
|
|
13
|
+
import { ReactiveSelectComponent } from "../reactive-select/reactive-select.component";
|
|
14
|
+
import { generalValidator } from "../../functions/plano.function";
|
|
15
15
|
import * as i0 from "@angular/core";
|
|
16
16
|
import * as i1 from "@angular/router";
|
|
17
17
|
import * as i2 from "@angular/forms";
|
|
@@ -40,8 +40,9 @@ export class CreateFixtureComponent {
|
|
|
40
40
|
isBodyEnabled = true;
|
|
41
41
|
canGoBack = false;
|
|
42
42
|
shelfTypes = [
|
|
43
|
-
{ label:
|
|
44
|
-
{ label:
|
|
43
|
+
{ label: "Shelf", value: "shelf" },
|
|
44
|
+
{ label: "Tray", value: "tray" },
|
|
45
|
+
{ label: "VM Only", value: "vmonly" },
|
|
45
46
|
];
|
|
46
47
|
destroy$ = new Subject();
|
|
47
48
|
constructor(route, fb, storeBuilderService, toast, router, ngbModal, pageInfo, gs) {
|
|
@@ -58,22 +59,23 @@ export class CreateFixtureComponent {
|
|
|
58
59
|
this.setPageData();
|
|
59
60
|
this.isPageLoading = true;
|
|
60
61
|
const params = this.route.snapshot.queryParams;
|
|
61
|
-
this.fixtureDetails._id = params[
|
|
62
|
-
this.isEditMode = params[
|
|
62
|
+
this.fixtureDetails._id = params["fixtureId"] ?? "";
|
|
63
|
+
this.isEditMode = params["isEdit"] == "true";
|
|
63
64
|
if (!this.fixtureDetails._id) {
|
|
64
65
|
this.canGoBack = true;
|
|
65
|
-
this.router.navigate([
|
|
66
|
+
this.router.navigate(["/manage/planogram/library/fixtures"]);
|
|
66
67
|
return;
|
|
67
68
|
}
|
|
68
69
|
this.getClientId();
|
|
69
70
|
this.route.queryParams
|
|
70
|
-
.pipe(map(params => params[
|
|
71
|
+
.pipe(map((params) => params["fixtureId"]), filter((id) => !!id), distinctUntilChanged(), takeUntil(this.destroy$))
|
|
72
|
+
.subscribe(async (id) => {
|
|
71
73
|
this.storeBuilderService.getFixtureLibraryDetails(id).subscribe({
|
|
72
74
|
next: (res) => {
|
|
73
75
|
let details = res.data;
|
|
74
76
|
if (details) {
|
|
75
77
|
this.fixtureDetails = {
|
|
76
|
-
...details
|
|
78
|
+
...details,
|
|
77
79
|
};
|
|
78
80
|
this.initializeForm();
|
|
79
81
|
this.isPageLoading = false;
|
|
@@ -84,36 +86,47 @@ export class CreateFixtureComponent {
|
|
|
84
86
|
this.toast.getErrorToast(err?.error?.error ?? "Failed to fetch fixture details");
|
|
85
87
|
this.isPageLoading = false;
|
|
86
88
|
// this.isError = true;
|
|
87
|
-
}
|
|
89
|
+
},
|
|
88
90
|
});
|
|
89
91
|
});
|
|
90
92
|
}
|
|
91
93
|
setPageData() {
|
|
92
94
|
this.pageInfo.setTitle("Create Fixture");
|
|
93
95
|
this.pageInfo.setBreadcrumbs([
|
|
94
|
-
{
|
|
96
|
+
{
|
|
97
|
+
title: "Planogram",
|
|
98
|
+
path: "/manage/planogram/manage-planograms",
|
|
99
|
+
isActive: false,
|
|
100
|
+
isSeparator: false,
|
|
101
|
+
},
|
|
95
102
|
{ title: "", path: "", isActive: false, isSeparator: true },
|
|
96
|
-
{
|
|
103
|
+
{
|
|
104
|
+
title: "Library",
|
|
105
|
+
path: "/manage/planogram/library/fixtures",
|
|
106
|
+
isActive: false,
|
|
107
|
+
isSeparator: false,
|
|
108
|
+
},
|
|
97
109
|
{ title: "", path: "", isActive: false, isSeparator: true },
|
|
98
110
|
]);
|
|
99
111
|
}
|
|
100
112
|
getClientId() {
|
|
101
|
-
this.gs.dataRangeValue
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
113
|
+
this.gs.dataRangeValue
|
|
114
|
+
.pipe(takeUntil(this.destroy$), // Subscription will be cancelled on component destroy.
|
|
115
|
+
debounceTime(200), // To avoid immediate frequent calls.
|
|
116
|
+
filter((data) => !!data), // Filtering null/undefined.
|
|
117
|
+
distinctUntilChanged())
|
|
118
|
+
.subscribe(async (data) => {
|
|
106
119
|
if (data?.client) {
|
|
107
120
|
this.clientId = data?.client;
|
|
108
121
|
}
|
|
109
122
|
else {
|
|
110
|
-
let headerData = JSON.parse(localStorage.getItem(
|
|
123
|
+
let headerData = JSON.parse(localStorage.getItem("header-filters"));
|
|
111
124
|
this.clientId = headerData?.client;
|
|
112
125
|
}
|
|
113
126
|
});
|
|
114
127
|
}
|
|
115
128
|
initializeForm() {
|
|
116
|
-
if (this.fixtureDetails.fixtureType ===
|
|
129
|
+
if (this.fixtureDetails.fixtureType === "wall") {
|
|
117
130
|
this.initWallFixtureForm();
|
|
118
131
|
}
|
|
119
132
|
else {
|
|
@@ -121,11 +134,11 @@ export class CreateFixtureComponent {
|
|
|
121
134
|
}
|
|
122
135
|
if (this.isEditMode) {
|
|
123
136
|
if (!this.fixtureDetails.header?.isEnabled)
|
|
124
|
-
this.toggleSection(
|
|
137
|
+
this.toggleSection("header");
|
|
125
138
|
if (!this.fixtureDetails.footer?.isEnabled)
|
|
126
|
-
this.toggleSection(
|
|
139
|
+
this.toggleSection("footer");
|
|
127
140
|
if (!this.fixtureDetails.isBodyEnabled)
|
|
128
|
-
this.toggleSection(
|
|
141
|
+
this.toggleSection("body");
|
|
129
142
|
}
|
|
130
143
|
else {
|
|
131
144
|
this.wallFixtureForm?.disable({ emitEvent: false });
|
|
@@ -136,45 +149,57 @@ export class CreateFixtureComponent {
|
|
|
136
149
|
}
|
|
137
150
|
}
|
|
138
151
|
getForm() {
|
|
139
|
-
return this.fixtureDetails.fixtureType ===
|
|
152
|
+
return this.fixtureDetails.fixtureType === "wall"
|
|
153
|
+
? this.wallFixtureForm
|
|
154
|
+
: this.floorFixtureForm;
|
|
140
155
|
}
|
|
141
156
|
get shelfArray() {
|
|
142
|
-
return this.wallFixtureForm.get(
|
|
157
|
+
return this.wallFixtureForm.get("body.shelf");
|
|
143
158
|
}
|
|
144
159
|
get panelArray() {
|
|
145
|
-
return this.floorFixtureForm.get(
|
|
160
|
+
return this.floorFixtureForm.get("panel");
|
|
146
161
|
}
|
|
147
162
|
get totalProductCapacity() {
|
|
148
|
-
const formArray = this.fixtureDetails.fixtureType ===
|
|
163
|
+
const formArray = this.fixtureDetails.fixtureType === "wall"
|
|
164
|
+
? this.shelfArray
|
|
165
|
+
: this.panelArray;
|
|
149
166
|
return formArray.controls.reduce((total, item) => {
|
|
150
|
-
const count = item.get(
|
|
151
|
-
const isTray = item.get(
|
|
152
|
-
const rows = item.get(
|
|
167
|
+
const count = item.get("productCapacity")?.value || 0;
|
|
168
|
+
const isTray = item.get("type")?.value === "tray";
|
|
169
|
+
const rows = item.get("noOfRows")?.value || 1;
|
|
153
170
|
// If the fixture is a floor panel or tray, we need to multiply the product capacity by the number of rows
|
|
154
|
-
return total +
|
|
171
|
+
return (total +
|
|
172
|
+
(isTray || this.fixtureDetails.fixtureType === "floor"
|
|
173
|
+
? count * rows
|
|
174
|
+
: count));
|
|
155
175
|
}, 0);
|
|
156
176
|
}
|
|
157
177
|
initWallFixtureForm() {
|
|
158
178
|
this.wallFixtureForm = this.fb.group({
|
|
159
179
|
basicDetails: this.getBasicDetailsFormGroup(),
|
|
160
180
|
header: this.fb.group({
|
|
161
|
-
height: [this.fixtureDetails?.header?.height?.value ?? 300,
|
|
181
|
+
height: [this.fixtureDetails?.header?.height?.value ?? 300],
|
|
162
182
|
}),
|
|
163
183
|
body: this.fb.group({
|
|
164
|
-
shelf: this.fb.array([])
|
|
184
|
+
shelf: this.fb.array([]),
|
|
165
185
|
}),
|
|
166
186
|
footer: this.fb.group({
|
|
167
|
-
height: [this.fixtureDetails?.footer?.height?.value ?? 300,
|
|
168
|
-
})
|
|
187
|
+
height: [this.fixtureDetails?.footer?.height?.value ?? 300],
|
|
188
|
+
}),
|
|
169
189
|
});
|
|
170
|
-
this.fixtureDetails.shelfConfig?.forEach(s => this.addShelf(s));
|
|
171
|
-
if (this.fixtureDetails.shelfConfig?.length === 0 &&
|
|
190
|
+
this.fixtureDetails.shelfConfig?.forEach((s) => this.addShelf(s));
|
|
191
|
+
if (this.fixtureDetails.shelfConfig?.length === 0 &&
|
|
192
|
+
!this.fixtureDetails.fixtureCategory) {
|
|
172
193
|
this.addShelf();
|
|
173
194
|
}
|
|
174
|
-
this.wallFixtureForm
|
|
195
|
+
this.wallFixtureForm
|
|
196
|
+
.get("basicDetails.fixtureCategory")
|
|
197
|
+
?.valueChanges.subscribe((value) => {
|
|
175
198
|
this.fixtureDetails.fixtureCategory = value;
|
|
176
199
|
});
|
|
177
|
-
this.wallFixtureForm
|
|
200
|
+
this.wallFixtureForm
|
|
201
|
+
.get("basicDetails.width")
|
|
202
|
+
?.valueChanges.subscribe((value) => {
|
|
178
203
|
if (this.fixtureDetails.fixtureWidth) {
|
|
179
204
|
this.fixtureDetails.fixtureWidth.value = value;
|
|
180
205
|
}
|
|
@@ -183,13 +208,17 @@ export class CreateFixtureComponent {
|
|
|
183
208
|
initFloorPanelFixtureForm() {
|
|
184
209
|
this.floorFixtureForm = this.fb.group({
|
|
185
210
|
basicDetails: this.getBasicDetailsFormGroup(),
|
|
186
|
-
panel: this.fb.array([])
|
|
211
|
+
panel: this.fb.array([]),
|
|
187
212
|
});
|
|
188
|
-
this.fixtureDetails.shelfConfig?.forEach(s => this.addPanel(s));
|
|
189
|
-
this.floorFixtureForm
|
|
213
|
+
this.fixtureDetails.shelfConfig?.forEach((s) => this.addPanel(s));
|
|
214
|
+
this.floorFixtureForm
|
|
215
|
+
.get("basicDetails.fixtureCategory")
|
|
216
|
+
?.valueChanges.subscribe((value) => {
|
|
190
217
|
this.fixtureDetails.fixtureCategory = value;
|
|
191
218
|
});
|
|
192
|
-
this.floorFixtureForm
|
|
219
|
+
this.floorFixtureForm
|
|
220
|
+
.get("basicDetails.width")
|
|
221
|
+
?.valueChanges.subscribe((value) => {
|
|
193
222
|
if (this.fixtureDetails.fixtureWidth) {
|
|
194
223
|
this.fixtureDetails.fixtureWidth.value = value;
|
|
195
224
|
}
|
|
@@ -197,26 +226,55 @@ export class CreateFixtureComponent {
|
|
|
197
226
|
}
|
|
198
227
|
getBasicDetailsFormGroup() {
|
|
199
228
|
return this.fb.group({
|
|
200
|
-
fixtureCategory: [
|
|
201
|
-
|
|
202
|
-
|
|
229
|
+
fixtureCategory: [
|
|
230
|
+
this.fixtureDetails?.fixtureCategory || "Untitled",
|
|
231
|
+
[Validators.required, generalValidator()],
|
|
232
|
+
],
|
|
233
|
+
width: [
|
|
234
|
+
this.fixtureDetails?.fixtureWidth?.value ?? 6,
|
|
235
|
+
[Validators.required, Validators.min(0.5)],
|
|
236
|
+
],
|
|
237
|
+
length: [
|
|
238
|
+
this.fixtureDetails?.fixtureLength?.value ?? 12,
|
|
239
|
+
[Validators.required, Validators.min(0.5)],
|
|
240
|
+
],
|
|
203
241
|
});
|
|
204
242
|
}
|
|
205
243
|
addShelf(shelf) {
|
|
206
244
|
const shelfGroup = this.fb.group({
|
|
207
|
-
type: [shelf?.shelfType
|
|
208
|
-
productCapacity: [shelf?.productPerShelf ?? 6
|
|
209
|
-
noOfRows: [shelf?.trayRows ?? 1]
|
|
245
|
+
type: [shelf?.shelfType ?? "shelf"],
|
|
246
|
+
productCapacity: [shelf?.productPerShelf ?? 6],
|
|
247
|
+
noOfRows: [shelf?.trayRows ?? 1],
|
|
210
248
|
});
|
|
249
|
+
this.updateProductPerShelfMinValidator(shelfGroup, shelfGroup.get("type")?.value);
|
|
211
250
|
this.setupShelfTypeListener(shelfGroup);
|
|
212
251
|
this.shelfArray.push(shelfGroup);
|
|
213
252
|
}
|
|
253
|
+
updateProductPerShelfMinValidator(shelfGroup, shelfType) {
|
|
254
|
+
const productPerShelfControl = shelfGroup.get("productCapacity");
|
|
255
|
+
const minValue = shelfType === "vmonly" ? 0 : 1;
|
|
256
|
+
productPerShelfControl?.setValidators([Validators.min(minValue)]);
|
|
257
|
+
productPerShelfControl?.updateValueAndValidity({ emitEvent: false });
|
|
258
|
+
}
|
|
214
259
|
// we need to setup a listener to the type of the shelf to enable or disable the noOfRows field
|
|
215
260
|
setupShelfTypeListener(shelfGroup) {
|
|
216
|
-
shelfGroup.get(
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
261
|
+
let previousType = shelfGroup.get("type")?.value;
|
|
262
|
+
shelfGroup.get("type")?.valueChanges.subscribe((type) => {
|
|
263
|
+
const productPerShelfControl = shelfGroup.get("productCapacity");
|
|
264
|
+
if (type === "vmonly") {
|
|
265
|
+
productPerShelfControl?.setValue(0);
|
|
266
|
+
}
|
|
267
|
+
else if (previousType === "vmonly") {
|
|
268
|
+
productPerShelfControl?.setValue(1);
|
|
269
|
+
}
|
|
270
|
+
previousType = type;
|
|
271
|
+
this.updateProductPerShelfMinValidator(shelfGroup, type);
|
|
272
|
+
const noOfRowsControl = shelfGroup.get("noOfRows");
|
|
273
|
+
if (type === "tray") {
|
|
274
|
+
noOfRowsControl?.setValidators([
|
|
275
|
+
Validators.required,
|
|
276
|
+
Validators.min(1),
|
|
277
|
+
]);
|
|
220
278
|
noOfRowsControl?.setValue(1);
|
|
221
279
|
}
|
|
222
280
|
else {
|
|
@@ -235,8 +293,14 @@ export class CreateFixtureComponent {
|
|
|
235
293
|
addPanel(panel) {
|
|
236
294
|
const panelGroup = this.fb.group({
|
|
237
295
|
panelName: [panel?.label, [Validators.required, generalValidator()]],
|
|
238
|
-
productCapacity: [
|
|
239
|
-
|
|
296
|
+
productCapacity: [
|
|
297
|
+
panel?.productPerShelf ?? 6,
|
|
298
|
+
[Validators.required, Validators.min(0)],
|
|
299
|
+
],
|
|
300
|
+
noOfRows: [
|
|
301
|
+
panel?.trayRows ?? 5,
|
|
302
|
+
[Validators.required, Validators.min(1)],
|
|
303
|
+
],
|
|
240
304
|
});
|
|
241
305
|
this.panelArray.push(panelGroup);
|
|
242
306
|
}
|
|
@@ -254,64 +318,68 @@ export class CreateFixtureComponent {
|
|
|
254
318
|
const form = this.getForm();
|
|
255
319
|
const group = form.get(section);
|
|
256
320
|
if (group) {
|
|
257
|
-
group.enabled
|
|
321
|
+
group.enabled
|
|
322
|
+
? group.disable({ emitEvent: false })
|
|
323
|
+
: group.enable({ emitEvent: false });
|
|
258
324
|
}
|
|
259
325
|
}
|
|
260
326
|
toggleSectionCheckBox(section) {
|
|
261
327
|
switch (section) {
|
|
262
|
-
case
|
|
328
|
+
case "header":
|
|
263
329
|
this.isHeaderEnabled = !this.isHeaderEnabled;
|
|
264
330
|
break;
|
|
265
|
-
case
|
|
331
|
+
case "body":
|
|
266
332
|
this.isBodyEnabled = !this.isBodyEnabled;
|
|
267
333
|
break;
|
|
268
|
-
case
|
|
334
|
+
case "footer":
|
|
269
335
|
this.isFooterEnabled = !this.isFooterEnabled;
|
|
270
336
|
break;
|
|
271
337
|
}
|
|
272
338
|
}
|
|
273
339
|
mapFormToApi(form, status) {
|
|
274
340
|
const formValue = form.value;
|
|
275
|
-
const formArray = this.fixtureDetails.fixtureType ===
|
|
341
|
+
const formArray = this.fixtureDetails.fixtureType === "wall"
|
|
342
|
+
? this.shelfArray
|
|
343
|
+
: this.panelArray;
|
|
276
344
|
return {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
345
|
+
status: status,
|
|
346
|
+
clientId: this.clientId,
|
|
347
|
+
fixtureCategory: this.fixtureDetails.fixtureCategory,
|
|
348
|
+
fixtureCapacity: this.totalProductCapacity,
|
|
349
|
+
fixtureLength: {
|
|
350
|
+
value: formValue.basicDetails.length,
|
|
351
|
+
unit: "ft",
|
|
284
352
|
},
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
353
|
+
fixtureWidth: {
|
|
354
|
+
value: formValue.basicDetails.width,
|
|
355
|
+
unit: "ft",
|
|
288
356
|
},
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
357
|
+
header: {
|
|
358
|
+
height: {
|
|
359
|
+
value: form.get("header.height")?.value,
|
|
360
|
+
unit: "mm",
|
|
293
361
|
},
|
|
294
|
-
|
|
295
|
-
|
|
362
|
+
label: "",
|
|
363
|
+
isEnabled: !form.get("header")?.disabled,
|
|
296
364
|
},
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
365
|
+
footer: {
|
|
366
|
+
height: {
|
|
367
|
+
value: form.get("footer.height")?.value,
|
|
368
|
+
unit: "mm",
|
|
301
369
|
},
|
|
302
|
-
|
|
303
|
-
|
|
370
|
+
label: "",
|
|
371
|
+
isEnabled: !form.get("footer")?.disabled,
|
|
304
372
|
},
|
|
305
|
-
|
|
306
|
-
|
|
373
|
+
isBodyEnabled: !form.get("body")?.disabled,
|
|
374
|
+
shelfConfig: formArray.controls.map((e, i) => {
|
|
307
375
|
return {
|
|
308
376
|
shelfNumber: i + 1,
|
|
309
|
-
shelfType: e?.value?.type ??
|
|
377
|
+
shelfType: e?.value?.type ?? "tray",
|
|
310
378
|
productPerShelf: e.value.productCapacity,
|
|
311
379
|
trayRows: e?.value?.noOfRows ?? 1,
|
|
312
|
-
label: e?.value?.panelName ??
|
|
380
|
+
label: e?.value?.panelName ?? "",
|
|
313
381
|
};
|
|
314
|
-
})
|
|
382
|
+
}),
|
|
315
383
|
};
|
|
316
384
|
}
|
|
317
385
|
async onSubmit(status) {
|
|
@@ -322,16 +390,16 @@ export class CreateFixtureComponent {
|
|
|
322
390
|
this.toast.getErrorToast("Form is invalid");
|
|
323
391
|
return false;
|
|
324
392
|
}
|
|
325
|
-
if (status ===
|
|
326
|
-
if (!await this.confirmCompletion())
|
|
393
|
+
if (status === "complete")
|
|
394
|
+
if (!(await this.confirmCompletion()))
|
|
327
395
|
return false;
|
|
328
396
|
const transformedData = this.mapFormToApi(form, status);
|
|
329
397
|
const res = await firstValueFrom(this.storeBuilderService.updateFixtureLibrary(transformedData, this.fixtureDetails?._id));
|
|
330
|
-
if (res && res?.status ===
|
|
398
|
+
if (res && res?.status === "success") {
|
|
331
399
|
this.fixtureDetails.status = status;
|
|
332
400
|
this.toast.getSuccessToast(res.message);
|
|
333
401
|
this.canGoBack = true;
|
|
334
|
-
this.router.navigate([
|
|
402
|
+
this.router.navigate(["manage/planogram/library/fixtures"]);
|
|
335
403
|
return true;
|
|
336
404
|
}
|
|
337
405
|
return false;
|
|
@@ -367,96 +435,113 @@ export class CreateFixtureComponent {
|
|
|
367
435
|
return false;
|
|
368
436
|
}
|
|
369
437
|
if (result) {
|
|
370
|
-
return await this.onSubmit(
|
|
438
|
+
return await this.onSubmit("draft");
|
|
371
439
|
}
|
|
372
440
|
}
|
|
373
441
|
return true;
|
|
374
442
|
}
|
|
375
443
|
async confirmExit() {
|
|
376
444
|
try {
|
|
377
|
-
const modelRef = this.ngbModal.open(ExitConfirmationComponent, {
|
|
378
|
-
|
|
445
|
+
const modelRef = this.ngbModal.open(ExitConfirmationComponent, {
|
|
446
|
+
centered: true,
|
|
447
|
+
});
|
|
448
|
+
return await modelRef.result.then((result) => result === "ok");
|
|
379
449
|
}
|
|
380
450
|
catch (error) {
|
|
381
451
|
return null;
|
|
382
452
|
}
|
|
383
453
|
}
|
|
384
454
|
async confirmCompletion() {
|
|
385
|
-
const modelRef = this.ngbModal.open(CompleteConfirmationComponent, {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
modelRef.componentInstance.
|
|
389
|
-
|
|
455
|
+
const modelRef = this.ngbModal.open(CompleteConfirmationComponent, {
|
|
456
|
+
centered: true,
|
|
457
|
+
});
|
|
458
|
+
modelRef.componentInstance.title = "Complete fixture";
|
|
459
|
+
modelRef.componentInstance.description =
|
|
460
|
+
"Fixture is now ready and available to create as template.";
|
|
461
|
+
modelRef.componentInstance.note =
|
|
462
|
+
"You can't edit it once assigned to the template.";
|
|
463
|
+
return await modelRef.result.then((result) => result === "ok");
|
|
390
464
|
}
|
|
391
465
|
onDuplicate() {
|
|
392
|
-
this.storeBuilderService
|
|
393
|
-
|
|
394
|
-
|
|
466
|
+
this.storeBuilderService
|
|
467
|
+
.duplicateFixtureLibrary({
|
|
468
|
+
fixtureId: this.fixtureDetails._id,
|
|
469
|
+
})
|
|
470
|
+
.subscribe({
|
|
395
471
|
next: (res) => {
|
|
396
|
-
if (res?.status ===
|
|
472
|
+
if (res?.status === "success") {
|
|
397
473
|
this.toast.getSuccessToast(res.data.message);
|
|
398
474
|
this.canGoBack = true;
|
|
399
|
-
this.router.navigate([
|
|
475
|
+
this.router.navigate(["/manage/planogram/create-library-fixture"], {
|
|
476
|
+
queryParams: { fixtureId: res?.data?.id },
|
|
477
|
+
});
|
|
400
478
|
}
|
|
401
479
|
},
|
|
402
480
|
error: (err) => {
|
|
403
|
-
this.toast.getErrorToast(err?.error?.error ||
|
|
481
|
+
this.toast.getErrorToast(err?.error?.error || "Failed to duplicate Fixture");
|
|
404
482
|
console.log("@@ ~ duplicateFixtureLibrary err:", err);
|
|
405
|
-
}
|
|
483
|
+
},
|
|
406
484
|
});
|
|
407
485
|
}
|
|
408
486
|
async confirmDeletion() {
|
|
409
|
-
const modelRef = this.ngbModal.open(DeleteConfirmationComponent, {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
487
|
+
const modelRef = this.ngbModal.open(DeleteConfirmationComponent, {
|
|
488
|
+
centered: true,
|
|
489
|
+
});
|
|
490
|
+
modelRef.componentInstance.title = "Delete fixture";
|
|
491
|
+
modelRef.componentInstance.description =
|
|
492
|
+
"Are you sure you want to delete this fixture ?";
|
|
493
|
+
return await modelRef.result.then((result) => result === "ok");
|
|
413
494
|
}
|
|
414
495
|
async onDelete() {
|
|
415
496
|
if (this.fixtureDetails.templateId) {
|
|
416
|
-
const modelRef = this.ngbModal.open(CannotPerformComponent, {
|
|
497
|
+
const modelRef = this.ngbModal.open(CannotPerformComponent, {
|
|
498
|
+
centered: true,
|
|
499
|
+
});
|
|
417
500
|
modelRef.componentInstance.title = `Can’t delete fixture!`;
|
|
418
501
|
modelRef.componentInstance.description = `Since this fixture is live in "${this.fixtureDetails.templateId} templates," deleting is not allowed.`;
|
|
419
502
|
return;
|
|
420
503
|
}
|
|
421
|
-
|
|
422
|
-
if (!await this.confirmDeletion())
|
|
504
|
+
if (!(await this.confirmDeletion()))
|
|
423
505
|
return;
|
|
424
|
-
this.storeBuilderService
|
|
506
|
+
this.storeBuilderService
|
|
507
|
+
.deleteFixtureLibrary({ fixtureId: this.fixtureDetails._id })
|
|
508
|
+
.subscribe({
|
|
425
509
|
next: (res) => {
|
|
426
|
-
if (res?.status ===
|
|
510
|
+
if (res?.status === "success") {
|
|
427
511
|
this.toast.getSuccessToast(res.message);
|
|
428
512
|
this.canGoBack = true;
|
|
429
|
-
this.router.navigate([
|
|
513
|
+
this.router.navigate(["manage/planogram/library/fixtures"]);
|
|
430
514
|
}
|
|
431
515
|
},
|
|
432
516
|
error: (err) => {
|
|
433
|
-
this.toast.getErrorToast(err?.error?.error ||
|
|
517
|
+
this.toast.getErrorToast(err?.error?.error || "Failed to delete Fixture");
|
|
434
518
|
console.log("@@ ~ deleteFixtureLibrary err:", err);
|
|
435
|
-
}
|
|
519
|
+
},
|
|
436
520
|
});
|
|
437
521
|
}
|
|
438
522
|
onClickEdit() {
|
|
439
523
|
if (this.fixtureDetails.templateId) {
|
|
440
|
-
const modelRef = this.ngbModal.open(CannotPerformComponent, {
|
|
524
|
+
const modelRef = this.ngbModal.open(CannotPerformComponent, {
|
|
525
|
+
centered: true,
|
|
526
|
+
});
|
|
441
527
|
modelRef.componentInstance.title = `Can’t edit fixture!`;
|
|
442
528
|
modelRef.componentInstance.description = `Since this fixture is live in "${this.fixtureDetails.templateId} templates," editing is not allowed.`;
|
|
443
529
|
return;
|
|
444
530
|
}
|
|
445
|
-
;
|
|
446
531
|
this.isEditMode = true;
|
|
447
532
|
this.floorFixtureForm?.enable({ emitEvent: false });
|
|
448
533
|
this.wallFixtureForm?.enable({ emitEvent: false });
|
|
449
534
|
if (!this.fixtureDetails.header?.isEnabled)
|
|
450
|
-
this.toggleSectionForm(
|
|
535
|
+
this.toggleSectionForm("header");
|
|
451
536
|
if (!this.fixtureDetails.footer?.isEnabled)
|
|
452
|
-
this.toggleSectionForm(
|
|
537
|
+
this.toggleSectionForm("footer");
|
|
453
538
|
if (!this.fixtureDetails.isBodyEnabled)
|
|
454
|
-
this.toggleSectionForm(
|
|
539
|
+
this.toggleSectionForm("body");
|
|
455
540
|
this.router.navigate([], {
|
|
456
541
|
relativeTo: this.route,
|
|
457
542
|
replaceUrl: true,
|
|
458
543
|
queryParams: { isEdit: true },
|
|
459
|
-
queryParamsHandling:
|
|
544
|
+
queryParamsHandling: "merge",
|
|
460
545
|
});
|
|
461
546
|
}
|
|
462
547
|
ngOnDestroy() {
|
|
@@ -464,10 +549,20 @@ export class CreateFixtureComponent {
|
|
|
464
549
|
this.destroy$.complete();
|
|
465
550
|
}
|
|
466
551
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreateFixtureComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.FormBuilder }, { token: i3.StoreBuilderService }, { token: i4.ToastService }, { token: i1.Router }, { token: i5.NgbModal }, { token: i6.PageInfoService }, { token: i6.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
467
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreateFixtureComponent, isStandalone: true, selector: "lib-create-fixture", ngImport: i0, template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <h2\r\n class=\"m-0 ellipsis\"\r\n style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\"\r\n >\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\" [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \"\r\n >\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\"\r\n >\r\n Fixture name is required.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\"\r\n >\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\"\r\n >\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addShelf(); wallFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"shelfTypes\"\r\n formControlName=\"type\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div\r\n *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\"\r\n >\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='shelf'){\r\n <div class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n SHELF {{ i + 1 }} <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }@else {\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n SHELF {{ i + 1 }}\r\n <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \"\r\n >\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\"\r\n >\r\n Fixture name is required.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\"\r\n >\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\"\r\n >\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(); floorFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addPanel(); floorFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\"\r\n />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\"\r\n />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{width:590px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"], dependencies: [{ kind: "component", type: CounterInputComponent, selector: "counter-input", inputs: ["step", "placeholder", "max"], outputs: ["onIncrement", "onDecrement"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: TimeAgoPipe, name: "timeAgo" }, { kind: "ngmodule", type: NgbAccordionModule }, { kind: "directive", type: i5.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i5.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i5.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i5.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i5.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i5.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
552
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreateFixtureComponent, isStandalone: true, selector: "lib-create-fixture", ngImport: i0, template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0 ellipsis\" style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\"\r\n [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\"\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly'\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly' && shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='shelf'){\r\n <div class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n SHELF {{ i + 1 }} <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }@else {\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n SHELF {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addPanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(i)\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\" />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{width:590px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"], dependencies: [{ kind: "component", type: CounterInputComponent, selector: "counter-input", inputs: ["step", "placeholder", "max"], outputs: ["onIncrement", "onDecrement"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: TimeAgoPipe, name: "timeAgo" }, { kind: "ngmodule", type: NgbAccordionModule }, { kind: "directive", type: i5.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i5.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i5.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i5.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i5.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i5.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
468
553
|
}
|
|
469
554
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreateFixtureComponent, decorators: [{
|
|
470
555
|
type: Component,
|
|
471
|
-
args: [{ selector: 'lib-create-fixture', standalone: true, imports: [CounterInputComponent, NgbTooltip, FormsModule, ReactiveFormsModule, CommonModule, TimeAgoPipe, NgbAccordionModule, ReactiveSelectComponent, RouterLink], template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <h2\r\n class=\"m-0 ellipsis\"\r\n style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\"\r\n >\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\" [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \"\r\n >\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\"\r\n >\r\n Fixture name is required.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\"\r\n >\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\"\r\n >\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addShelf(); wallFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"shelfTypes\"\r\n formControlName=\"type\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div\r\n *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\"\r\n >\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='shelf'){\r\n <div class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n SHELF {{ i + 1 }} <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }@else {\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n SHELF {{ i + 1 }}\r\n <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \"\r\n >\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\"\r\n >\r\n Fixture name is required.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\"\r\n >\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\"\r\n >\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(); floorFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addPanel(); floorFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\"\r\n />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\"\r\n />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{width:590px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"] }]
|
|
556
|
+
args: [{ selector: "lib-create-fixture", standalone: true, imports: [
|
|
557
|
+
CounterInputComponent,
|
|
558
|
+
NgbTooltip,
|
|
559
|
+
FormsModule,
|
|
560
|
+
ReactiveFormsModule,
|
|
561
|
+
CommonModule,
|
|
562
|
+
TimeAgoPipe,
|
|
563
|
+
NgbAccordionModule,
|
|
564
|
+
ReactiveSelectComponent,
|
|
565
|
+
RouterLink,
|
|
566
|
+
], template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0 ellipsis\" style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\"\r\n [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\"\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly'\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly' && shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='shelf'){\r\n <div class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n SHELF {{ i + 1 }} <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }@else {\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n SHELF {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addPanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(i)\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\" />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{width:590px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"] }]
|
|
472
567
|
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.FormBuilder }, { type: i3.StoreBuilderService }, { type: i4.ToastService }, { type: i1.Router }, { type: i5.NgbModal }, { type: i6.PageInfoService }, { type: i6.GlobalStateService }] });
|
|
473
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFxQyxVQUFVLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakgsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQVksVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSzNHLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlFQUFpRSxDQUFDO0FBQ2hILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQzFHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBRXBHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBRTNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7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QUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQTdlVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiw4RUM1Qm5DLDYvNkNBKzJCQSxrdmFEcjFCWSxxQkFBcUIsMklBQUUsVUFBVSwwVEFBRSxXQUFXLDJwQkFBRSxtQkFBbUIsNmhCQUFFLFlBQVksa2hCQUFFLFdBQVcsK0NBQUUsa0JBQWtCLDYxQkFBRSx1QkFBdUIseU5BQUUsVUFBVTs7NEZBRXRKLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FHbEIsSUFBSSxXQUNQLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUFycmF5LCBWYWxpZGF0b3JzLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciwgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE5nYkFjY29yZGlvbk1vZHVsZSwgTmdiTW9kYWwsIE5nYlRvb2x0aXAgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgZmlyc3RWYWx1ZUZyb20sIG1hcCwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRml4dHVyZUxpYnJhcnlEZXRhaWxzLCBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maXh0dXJlLWxpYnJhcnkuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGxhbm8tZ2VuZXJhbC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBDb21wbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BvcHVwcy9jb21wbGV0ZS1jb25maXJtYXRpb24vY29tcGxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BvcHVwcy9kZWxldGUtY29uZmlybWF0aW9uL2RlbGV0ZS1jb25maXJtYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgRXhpdENvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BvcHVwcy9leGl0LWNvbmZpcm1hdGlvbi9leGl0LWNvbmZpcm1hdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDYW5FeGl0R3VhcmQgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZXhpdC5ndWFyZCc7XHJcbmltcG9ydCB7IENhbm5vdFBlcmZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9wb3B1cHMvY2Fubm90LXBlcmZvcm0vY2Fubm90LXBlcmZvcm0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgVGltZUFnb1BpcGUgfSBmcm9tICcuLi8uLi9waXBlcy90aW1lLWFnby5waXBlJztcclxuaW1wb3J0IHsgQ291bnRlcklucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vY291bnRlci1pbnB1dC9jb3VudGVyLWlucHV0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJlYWN0aXZlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBnZW5lcmFsVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWNyZWF0ZS1maXh0dXJlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9jcmVhdGUtZml4dHVyZS5jb21wb25lbnQuc2NzcycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ291bnRlcklucHV0Q29tcG9uZW50LCBOZ2JUb29sdGlwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgQ29tbW9uTW9kdWxlLCBUaW1lQWdvUGlwZSwgTmdiQWNjb3JkaW9uTW9kdWxlLCBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCwgUm91dGVyTGlua11cclxufSlcclxuZXhwb3J0IGNsYXNzIENyZWF0ZUZpeHR1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ2FuRXhpdEd1YXJkIHtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG5cclxuICB3YWxsRml4dHVyZUZvcm06IEZvcm1Hcm91cDtcclxuICBmbG9vckZpeHR1cmVGb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGlzUGFnZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBmaXh0dXJlRGV0YWlsczogRml4dHVyZUxpYnJhcnlEZXRhaWxzID0ge307XHJcbiAgaXNFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpc0hlYWRlckVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRm9vdGVyRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNCb2R5RW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNhbkdvQmFjazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICByZWFkb25seSBzaGVsZlR5cGVzOiBEcm9wZG93bklGW10gPSBbXHJcbiAgICB7IGxhYmVsOiAnU2hlbGYnLCB2YWx1ZTogJ3NoZWxmJyB9LFxyXG4gICAgeyBsYWJlbDogJ1RyYXknLCB2YWx1ZTogJ3RyYXknIH1cclxuICBdO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbmdiTW9kYWw6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCA9IHBhcmFtc1snZml4dHVyZUlkJ10gPz8gJyc7XHJcblxyXG4gICAgdGhpcy5pc0VkaXRNb2RlID0gcGFyYW1zWydpc0VkaXQnXSA9PSAndHJ1ZSc7XHJcblxyXG4gICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCkge1xyXG4gICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlcyddKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnRJZCgpO1xyXG5cclxuICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKHBhcmFtcyA9PiBwYXJhbXNbJ2ZpeHR1cmVJZCddKSwgZmlsdGVyKGlkID0+ICEhaWQpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcclxuICAgICAgKS5zdWJzY3JpYmUoYXN5bmMgaWQgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5nZXRGaXh0dXJlTGlicmFyeURldGFpbHMoaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldGFpbHMgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgaWYgKGRldGFpbHMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzID0ge1xyXG4gICAgICAgICAgICAgICAgLi4uZGV0YWlsc1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW5Hb0JhY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBmZXRjaCBmaXh0dXJlIGRldGFpbHNcIik7XHJcbiAgICAgICAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmlzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiQ3JlYXRlIEZpeHR1cmVcIik7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldEJyZWFkY3J1bWJzKFtcclxuICAgICAgeyB0aXRsZTogXCJQbGFub2dyYW1cIiwgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtc1wiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiBmYWxzZSB9LFxyXG4gICAgICB7IHRpdGxlOiBcIlwiLCBwYXRoOiBcIlwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwiTGlicmFyeVwiLCBwYXRoOiBcIi9tYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXNcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcclxuICAgICAgeyB0aXRsZTogXCJcIiwgcGF0aDogXCJcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBnZXRDbGllbnRJZCgpIHtcclxuXHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgLy8gU3Vic2NyaXB0aW9uIHdpbGwgYmUgY2FuY2VsbGVkIG9uIGNvbXBvbmVudCBkZXN0cm95LlxyXG4gICAgICBkZWJvdW5jZVRpbWUoMjAwKSwgLy8gVG8gYXZvaWQgaW1tZWRpYXRlIGZyZXF1ZW50IGNhbGxzLiBcclxuICAgICAgZmlsdGVyKGRhdGEgPT4gISFkYXRhKSwgLy8gRmlsdGVyaW5nIG51bGwvdW5kZWZpbmVkLlxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIC8vIEVtaXR0aW5nIG9ubHkgZGlmZmVyZW50IHZhbHVlcy4gKElnbm9yZXMgc2FtZSBjbGllbnRJZCkuXHJcbiAgICApLnN1YnNjcmliZShhc3luYyAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSAnd2FsbCcpIHtcclxuICAgICAgdGhpcy5pbml0V2FsbEZpeHR1cmVGb3JtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlKSB7XHJcbiAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5oZWFkZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uKCdoZWFkZXInKVxyXG4gICAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuZm9vdGVyPy5pc0VuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbignZm9vdGVyJylcclxuICAgICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmlzQm9keUVuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbignYm9keScpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLndhbGxGaXh0dXJlRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSlcclxuICAgICAgdGhpcy5mbG9vckZpeHR1cmVGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG5cclxuICAgICAgdGhpcy5pc0hlYWRlckVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaXNFbmFibGVkID8/IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzQm9keUVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmlzQm9keUVuYWJsZWQgPz8gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNGb290ZXJFbmFibGVkID0gdGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmlzRW5hYmxlZCA/PyBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEZvcm0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnID8gdGhpcy53YWxsRml4dHVyZUZvcm0gOiB0aGlzLmZsb29yRml4dHVyZUZvcm1cclxuICB9XHJcblxyXG4gIGdldCBzaGVsZkFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy53YWxsRml4dHVyZUZvcm0uZ2V0KCdib2R5LnNoZWxmJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhbmVsQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZsb29yRml4dHVyZUZvcm0uZ2V0KCdwYW5lbCcpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFByb2R1Y3RDYXBhY2l0eSgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnID8gdGhpcy5zaGVsZkFycmF5IDogdGhpcy5wYW5lbEFycmF5O1xyXG5cclxuICAgIHJldHVybiBmb3JtQXJyYXkuY29udHJvbHMucmVkdWNlKCh0b3RhbCwgaXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCBjb3VudCA9IGl0ZW0uZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udmFsdWUgfHwgMDtcclxuICAgICAgY29uc3QgaXNUcmF5ID0gaXRlbS5nZXQoJ3R5cGUnKT8udmFsdWUgPT09ICd0cmF5JztcclxuICAgICAgY29uc3Qgcm93cyA9IGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSB8fCAxO1xyXG5cclxuICAgICAgLy8gSWYgdGhlIGZpeHR1cmUgaXMgYSBmbG9vciBwYW5lbCBvciB0cmF5LCB3ZSBuZWVkIHRvIG11bHRpcGx5IHRoZSBwcm9kdWN0IGNhcGFjaXR5IGJ5IHRoZSBudW1iZXIgb2Ygcm93c1xyXG4gICAgICByZXR1cm4gdG90YWwgKyAoaXNUcmF5IHx8IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICdmbG9vcicgPyBjb3VudCAqIHJvd3MgOiBjb3VudCk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIGluaXRXYWxsRml4dHVyZUZvcm0oKSB7XHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBiYXNpY0RldGFpbHM6IHRoaXMuZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCksXHJcbiAgICAgIGhlYWRlcjogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgaGVpZ2h0OiBbdGhpcy5maXh0dXJlRGV0YWlscz8uaGVhZGVyPy5oZWlnaHQ/LnZhbHVlID8/IDMwMCxdXHJcbiAgICAgIH0pLFxyXG4gICAgICBib2R5OiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBzaGVsZjogdGhpcy5mYi5hcnJheShbXSlcclxuICAgICAgfSksXHJcbiAgICAgIGZvb3RlcjogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgaGVpZ2h0OiBbdGhpcy5maXh0dXJlRGV0YWlscz8uZm9vdGVyPy5oZWlnaHQ/LnZhbHVlID8/IDMwMCxdXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5mb3JFYWNoKHMgPT4gdGhpcy5hZGRTaGVsZihzKSlcclxuXHJcbiAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5zaGVsZkNvbmZpZz8ubGVuZ3RoID09PSAwICYmICF0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSkge1xyXG4gICAgICB0aGlzLmFkZFNoZWxmKClcclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aCkge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBpbml0Rmxvb3JQYW5lbEZpeHR1cmVGb3JtKCkge1xyXG4gICAgdGhpcy5mbG9vckZpeHR1cmVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGJhc2ljRGV0YWlsczogdGhpcy5nZXRCYXNpY0RldGFpbHNGb3JtR3JvdXAoKSxcclxuICAgICAgcGFuZWw6IHRoaXMuZmIuYXJyYXkoW10pXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5mb3JFYWNoKHMgPT4gdGhpcy5hZGRQYW5lbChzKSlcclxuXHJcbiAgICB0aGlzLmZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgpIHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aC52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBmaXh0dXJlQ2F0ZWdvcnk6IFt0aGlzLmZpeHR1cmVEZXRhaWxzPy5maXh0dXJlQ2F0ZWdvcnkgfHwgJ1VudGl0bGVkJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGdlbmVyYWxWYWxpZGF0b3IoKV1dLFxyXG4gICAgICB3aWR0aDogW3RoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWUgPz8gNiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDAuNSldXSxcclxuICAgICAgbGVuZ3RoOiBbdGhpcy5maXh0dXJlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWUgPz8gMTIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwLjUpXV1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRTaGVsZihzaGVsZj86IEZpeHR1cmVMaWJyYXJ5U2hlbGZDb25maWcpIHtcclxuICAgIGNvbnN0IHNoZWxmR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdHlwZTogW3NoZWxmPy5zaGVsZlR5cGUgfHwgJ3NoZWxmJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHByb2R1Y3RDYXBhY2l0eTogW3NoZWxmPy5wcm9kdWN0UGVyU2hlbGYgPz8gNiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDApXV0sXHJcbiAgICAgIG5vT2ZSb3dzOiBbc2hlbGY/LnRyYXlSb3dzID8/IDFdXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwU2hlbGZUeXBlTGlzdGVuZXIoc2hlbGZHcm91cCk7XHJcbiAgICB0aGlzLnNoZWxmQXJyYXkucHVzaChzaGVsZkdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8vICB3ZSBuZWVkIHRvIHNldHVwIGEgbGlzdGVuZXIgdG8gdGhlIHR5cGUgb2YgdGhlIHNoZWxmIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBub09mUm93cyBmaWVsZFxyXG4gIHNldHVwU2hlbGZUeXBlTGlzdGVuZXIoc2hlbGZHcm91cDogRm9ybUdyb3VwKSB7XHJcbiAgICBzaGVsZkdyb3VwLmdldCgndHlwZScpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHR5cGUgPT4ge1xyXG4gICAgICBjb25zdCBub09mUm93c0NvbnRyb2wgPSBzaGVsZkdyb3VwLmdldCgnbm9PZlJvd3MnKTtcclxuICAgICAgaWYgKHR5cGUgPT09ICd0cmF5Jykge1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMSldKTtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbHVlKDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgfVxyXG4gICAgICBub09mUm93c0NvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gSWYgaW5kZXggaXMgbm90IGdpdmVuLCBsYXN0IHNoZWxmIHNob3VsZCBiZSByZW1vdmVkXHJcbiAgcmVtb3ZlU2hlbGYoaW5kZXg6IG51bWJlciA9IHRoaXMuc2hlbGZBcnJheS5jb250cm9scy5sZW5ndGggLSAxKSB7XHJcbiAgICBpZiAodGhpcy5zaGVsZkFycmF5LmNvbnRyb2xzLmxlbmd0aCA9PSAxKSByZXR1cm47XHJcbiAgICB0aGlzLnNoZWxmQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgYWRkUGFuZWwocGFuZWw/OiBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnKSB7XHJcbiAgICBjb25zdCBwYW5lbEdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHBhbmVsTmFtZTogW3BhbmVsPy5sYWJlbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGdlbmVyYWxWYWxpZGF0b3IoKV1dLFxyXG4gICAgICBwcm9kdWN0Q2FwYWNpdHk6IFtwYW5lbD8ucHJvZHVjdFBlclNoZWxmID8/IDYsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwKV1dLFxyXG4gICAgICBub09mUm93czogW3BhbmVsPy50cmF5Um93cyA/PyA1LCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMSldXVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5wYW5lbEFycmF5LnB1c2gocGFuZWxHcm91cCk7XHJcbiAgfVxyXG5cclxuICAvLyBJZiBpbmRleCBpcyBub3QgZ2l2ZW4sIGxhc3QgcGFuZWwgc2hvdWxkIGJlIHJlbW92ZWRcclxuICByZW1vdmVQYW5lbChpbmRleDogbnVtYmVyID0gdGhpcy5wYW5lbEFycmF5LmNvbnRyb2xzLmxlbmd0aCAtIDEpIHtcclxuICAgIGlmICh0aGlzLnBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoID09IDEpIHJldHVybjtcclxuICAgIHRoaXMucGFuZWxBcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWN0aW9uKHNlY3Rpb246ICdoZWFkZXInIHwgJ2JvZHknIHwgJ2Zvb3RlcicpIHtcclxuICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oc2VjdGlvbik7XHJcbiAgICB0aGlzLnRvZ2dsZVNlY3Rpb25DaGVja0JveChzZWN0aW9uKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb25Gb3JtKHNlY3Rpb246ICdoZWFkZXInIHwgJ2JvZHknIHwgJ2Zvb3RlcicpIHtcclxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEZvcm0oKTtcclxuICAgIGNvbnN0IGdyb3VwID0gZm9ybS5nZXQoc2VjdGlvbik7XHJcbiAgICBpZiAoZ3JvdXApIHtcclxuICAgICAgZ3JvdXAuZW5hYmxlZCA/IGdyb3VwLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pIDogZ3JvdXAuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb25DaGVja0JveChzZWN0aW9uOiAnaGVhZGVyJyB8ICdib2R5JyB8ICdmb290ZXInKSB7XHJcbiAgICBzd2l0Y2ggKHNlY3Rpb24pIHtcclxuICAgICAgY2FzZSAnaGVhZGVyJzpcclxuICAgICAgICB0aGlzLmlzSGVhZGVyRW5hYmxlZCA9ICF0aGlzLmlzSGVhZGVyRW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnYm9keSc6XHJcbiAgICAgICAgdGhpcy5pc0JvZHlFbmFibGVkID0gIXRoaXMuaXNCb2R5RW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZm9vdGVyJzpcclxuICAgICAgICB0aGlzLmlzRm9vdGVyRW5hYmxlZCA9ICF0aGlzLmlzRm9vdGVyRW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1hcEZvcm1Ub0FwaShmb3JtOiBGb3JtR3JvdXAsIHN0YXR1czogc3RyaW5nKTogYW55IHtcclxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm0udmFsdWU7XHJcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSAnd2FsbCcgPyB0aGlzLnNoZWxmQXJyYXkgOiB0aGlzLnBhbmVsQXJyYXk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgXCJzdGF0dXNcIjogc3RhdHVzLFxyXG4gICAgICBcImNsaWVudElkXCI6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIFwiZml4dHVyZUNhdGVnb3J5XCI6IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5LFxyXG4gICAgICBcImZpeHR1cmVDYXBhY2l0eVwiOiB0aGlzLnRvdGFsUHJvZHVjdENhcGFjaXR5LFxyXG4gICAgICBcImZpeHR1cmVMZW5ndGhcIjoge1xyXG4gICAgICAgIFwidmFsdWVcIjogZm9ybVZhbHVlLmJhc2ljRGV0YWlscy5sZW5ndGgsXHJcbiAgICAgICAgXCJ1bml0XCI6IFwiZnRcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImZpeHR1cmVXaWR0aFwiOiB7XHJcbiAgICAgICAgXCJ2YWx1ZVwiOiBmb3JtVmFsdWUuYmFzaWNEZXRhaWxzLndpZHRoLFxyXG4gICAgICAgIFwidW5pdFwiOiBcImZ0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJoZWFkZXJcIjoge1xyXG4gICAgICAgIFwiaGVpZ2h0XCI6IHtcclxuICAgICAgICAgIFwidmFsdWVcIjogZm9ybS5nZXQoJ2hlYWRlci5oZWlnaHQnKT8udmFsdWUsXHJcbiAgICAgICAgICBcInVuaXRcIjogXCJtbVwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImxhYmVsXCI6IFwiXCIsXHJcbiAgICAgICAgXCJpc0VuYWJsZWRcIjogIWZvcm0uZ2V0KCdoZWFkZXInKT8uZGlzYWJsZWRcclxuICAgICAgfSxcclxuICAgICAgXCJmb290ZXJcIjoge1xyXG4gICAgICAgIFwiaGVpZ2h0XCI6IHtcclxuICAgICAgICAgIFwidmFsdWVcIjogZm9ybS5nZXQoJ2Zvb3Rlci5oZWlnaHQnKT8udmFsdWUsXHJcbiAgICAgICAgICBcInVuaXRcIjogXCJtbVwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImxhYmVsXCI6IFwiXCIsXHJcbiAgICAgICAgXCJpc0VuYWJsZWRcIjogIWZvcm0uZ2V0KCdmb290ZXInKT8uZGlzYWJsZWRcclxuICAgICAgfSxcclxuICAgICAgXCJpc0JvZHlFbmFibGVkXCI6ICFmb3JtLmdldCgnYm9keScpPy5kaXNhYmxlZCxcclxuICAgICAgXCJzaGVsZkNvbmZpZ1wiOiBmb3JtQXJyYXkuY29udHJvbHMubWFwKChlLCBpKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHNoZWxmTnVtYmVyOiBpICsgMSxcclxuICAgICAgICAgIHNoZWxmVHlwZTogZT8udmFsdWU/LnR5cGUgPz8gJ3RyYXknLFxyXG4gICAgICAgICAgcHJvZHVjdFBlclNoZWxmOiBlLnZhbHVlLnByb2R1Y3RDYXBhY2l0eSxcclxuICAgICAgICAgIHRyYXlSb3dzOiBlPy52YWx1ZT8ubm9PZlJvd3MgPz8gMSxcclxuICAgICAgICAgIGxhYmVsOiBlPy52YWx1ZT8ucGFuZWxOYW1lID8/ICcnXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU3VibWl0KHN0YXR1czogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmb3JtID0gdGhpcy5nZXRGb3JtKCk7XHJcblxyXG4gICAgICBpZiAoZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgICAgZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiRm9ybSBpcyBpbnZhbGlkXCIpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2NvbXBsZXRlJykgaWYgKCFhd2FpdCB0aGlzLmNvbmZpcm1Db21wbGV0aW9uKCkpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YSA9IHRoaXMubWFwRm9ybVRvQXBpKGZvcm0sIHN0YXR1cyk7XHJcblxyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS51cGRhdGVGaXh0dXJlTGlicmFyeSh0cmFuc2Zvcm1lZERhdGEsIHRoaXMuZml4dHVyZURldGFpbHM/Ll9pZCEpKTtcclxuXHJcbiAgICAgIGlmIChyZXMgJiYgcmVzPy5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcy5tZXNzYWdlKTtcclxuICAgICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydtYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXMnXSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBzYXZlIEZpeHR1cmUgZGV0YWlsc1wiKTtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IHVwZGF0ZUZpeHR1cmVMaWJyYXJ5IGVycjpcIiwgZXJyKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS51cGRhdGVGaXh0dXJlTGlicmFyeSh0cmFuc2Zvcm1lZERhdGEsIHRoaXMuZml4dHVyZURldGFpbHM/Ll9pZCEpLnN1YnNjcmliZSh7XHJcbiAgICAvLyAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgLy8gICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAvLyAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnN0YXR1cyA9IHN0YXR1cztcclxuICAgIC8vICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcy5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzJ10pO1xyXG4gICAgLy8gICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgLy8gICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBzYXZlIEZpeHR1cmUgZGV0YWlsc1wiKTtcclxuICAgIC8vICAgICBjb25zb2xlLmxvZyhcIkBAIH4gdXBkYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpO1xyXG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSlcclxuXHJcbiAgfVxyXG5cclxuICBhc3luYyBjYW5EZWFjdGl2YXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHRoaXMuY2FuR29CYWNrKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBmb3JtID0gdGhpcy5nZXRGb3JtKCk7XHJcblxyXG4gICAgaWYgKGZvcm0uZGlydHkpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25maXJtRXhpdCgpO1xyXG5cclxuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm9uU3VibWl0KCdkcmFmdCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICBhc3luYyBjb25maXJtRXhpdCgpOiBQcm9taXNlPGJvb2xlYW4gfCBudWxsPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihFeGl0Q29uZmlybWF0aW9uQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlIH0pO1xyXG4gICAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSAnb2snKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY29uZmlybUNvbXBsZXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihDb21wbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwgeyBjZW50ZXJlZDogdHJ1ZSB9KTtcclxuICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gJ0NvbXBsZXRlIGZpeHR1cmUnO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSAnRml4dHVyZSBpcyBub3cgcmVhZHkgYW5kIGF2YWlsYWJsZSB0byBjcmVhdGUgYXMgdGVtcGxhdGUuJztcclxuICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLm5vdGUgPSAnWW91IGNhblxcJ3QgZWRpdCBpdCBvbmNlIGFzc2lnbmVkIHRvIHRoZSB0ZW1wbGF0ZS4nO1xyXG5cclxuICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09ICdvaycpO1xyXG4gIH1cclxuXHJcbiAgb25EdXBsaWNhdGUoKSB7XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZHVwbGljYXRlRml4dHVyZUxpYnJhcnkoe1xyXG4gICAgICBmaXh0dXJlSWQ6IHRoaXMuZml4dHVyZURldGFpbHMuX2lkXHJcbiAgICB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLmRhdGEubWVzc2FnZSk7XHJcbiAgICAgICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvcGxhbm9ncmFtL2NyZWF0ZS1saWJyYXJ5LWZpeHR1cmUnXSwgeyBxdWVyeVBhcmFtczogeyBmaXh0dXJlSWQ6IHJlcz8uZGF0YT8uaWQgfSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yIHx8ICdGYWlsZWQgdG8gZHVwbGljYXRlIEZpeHR1cmUnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZHVwbGljYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtRGVsZXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUgfSk7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9ICdEZWxldGUgZml4dHVyZSc7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZml4dHVyZSA/JztcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSAnb2snKVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25EZWxldGUoKSB7XHJcbiAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkKSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKENhbm5vdFBlcmZvcm1Db21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUgfSk7XHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gYENhbuKAmXQgZGVsZXRlIGZpeHR1cmUhYDtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSBgU2luY2UgdGhpcyBmaXh0dXJlIGlzIGxpdmUgaW4gXCIke3RoaXMuZml4dHVyZURldGFpbHMudGVtcGxhdGVJZH0gdGVtcGxhdGVzLFwiIGRlbGV0aW5nIGlzIG5vdCBhbGxvd2VkLmA7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoIWF3YWl0IHRoaXMuY29uZmlybURlbGV0aW9uKCkpIHJldHVybjtcclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5kZWxldGVGaXh0dXJlTGlicmFyeSh7IGZpeHR1cmVJZDogdGhpcy5maXh0dXJlRGV0YWlscy5faWQgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcy5tZXNzYWdlKTtcclxuICAgICAgICAgIHRoaXMuY2FuR29CYWNrID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgfHwgJ0ZhaWxlZCB0byBkZWxldGUgRml4dHVyZScpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBkZWxldGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycilcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG9uQ2xpY2tFZGl0KCkge1xyXG4gICAgaWYgKHRoaXMuZml4dHVyZURldGFpbHMudGVtcGxhdGVJZCkge1xyXG4gICAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihDYW5ub3RQZXJmb3JtQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlIH0pO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9IGBDYW7igJl0IGVkaXQgZml4dHVyZSFgO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9IGBTaW5jZSB0aGlzIGZpeHR1cmUgaXMgbGl2ZSBpbiBcIiR7dGhpcy5maXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkfSB0ZW1wbGF0ZXMsXCIgZWRpdGluZyBpcyBub3QgYWxsb3dlZC5gO1xyXG4gICAgICByZXR1cm5cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5pc0VkaXRNb2RlID0gdHJ1ZTtcclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5oZWFkZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uRm9ybSgnaGVhZGVyJylcclxuICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uRm9ybSgnZm9vdGVyJylcclxuICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5pc0JvZHlFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb25Gb3JtKCdib2R5JylcclxuXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xyXG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxyXG4gICAgICByZXBsYWNlVXJsOiB0cnVlLFxyXG4gICAgICBxdWVyeVBhcmFtczogeyBpc0VkaXQ6IHRydWUgfSxcclxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn0iLCI8c2VjdGlvbiBpZD1cImJ1aWxkLWZpeHR1cmVcIiAqbmdJZj1cIiFpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgPCEtLSBIZWFkZXIgc2VjdGlvbiAtLT5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnRzLWNlbnRlciBnYXAtNVwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBwLTNcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgZD1cIk0xNS44MzM0IDkuOTk5ODRINC4xNjY3NU00LjE2Njc1IDkuOTk5ODRMMTAuMDAwMSAxNS44MzMyTTQuMTY2NzUgOS45OTk4NEwxMC4wMDAxIDQuMTY2NVwiXHJcbiAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8aDJcclxuICAgICAgICBjbGFzcz1cIm0tMCBlbGxpcHNpc1wiXHJcbiAgICAgICAgc3R5bGU9XCJtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSA4NjBweClcIlxyXG4gICAgICAgIFtuZ2JUb29sdGlwXT1cImZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSArICcgLSAnICsgZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy52YWx1ZSArICdmdCdcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5IH19IC0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy52YWx1ZSB9fVxyXG4gICAgICAgIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udW5pdCB8fCBcImZ0XCIgfX1cclxuICAgICAgPC9oMj5cclxuICAgICAgPGRpdiBjbGFzcz1cImJhZGdlIGRyYWZ0XCI+e3sgZml4dHVyZURldGFpbHMuc3RhdHVzIHwgdGl0bGVjYXNlIH19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudHMtY2VudGVyIGdhcC01XCI+XHJcbiAgICAgIDxwIGNsYXNzPVwibS0wIHRleHQtbm93cmFwXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscz8udXBkYXRlZEF0XCIgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMudXBkYXRlZEF0IHwgZGF0ZSA6ICdtZWRpdW0nXCI+XHJcbiAgICAgICAgTGFzdCB1cGRhdGU6IHt7IGZpeHR1cmVEZXRhaWxzLnVwZGF0ZWRBdCB8IHRpbWVBZ28gfX1cclxuICAgICAgPC9wPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCIgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIj5cclxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzEzMjJfNTMyNSlcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xNC4xNjY3IDIuNDk5OTNDMTQuMzg1NiAyLjI4MTA2IDE0LjY0NTUgMi4xMDc0NCAxNC45MzE0IDEuOTg4OTlDMTUuMjE3NCAxLjg3MDU0IDE1LjUyMzkgMS44MDk1NyAxNS44MzM0IDEuODA5NTdDMTYuMTQyOSAxLjgwOTU3IDE2LjQ0OTQgMS44NzA1NCAxNi43MzU0IDEuOTg4OTlDMTcuMDIxNCAyLjEwNzQ0IDE3LjI4MTIgMi4yODEwNiAxNy41MDAxIDIuNDk5OTNDMTcuNzE5IDIuNzE4OCAxNy44OTI2IDIuOTc4NjMgMTguMDExIDMuMjY0NkMxOC4xMjk1IDMuNTUwNTcgMTguMTkwNCAzLjg1NzA2IDE4LjE5MDQgNC4xNjY1OUMxOC4xOTA0IDQuNDc2MTIgMTguMTI5NSA0Ljc4MjYyIDE4LjAxMSA1LjA2ODU5QzE3Ljg5MjYgNS4zNTQ1NSAxNy43MTkgNS42MTQzOSAxNy41MDAxIDUuODMzMjZMNi4yNTAwOCAxNy4wODMzTDEuNjY2NzUgMTguMzMzM0wyLjkxNjc1IDEzLjc0OTlMMTQuMTY2NyAyLjQ5OTkzWlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xMzIyXzUzMjVcIj5cclxuICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICBFZGl0XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cImlzRWRpdE1vZGVcIiBjbGFzcz1cImQtZmxleCBnYXAtNSBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHRleHQtbm93cmFwXCIgKGNsaWNrKT1cIm9uU3VibWl0KCdkcmFmdCcpXCI+U2F2ZSBhcyBkcmFmdDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtbm93cmFwXCIgKGNsaWNrKT1cIm9uU3VibWl0KCdjb21wbGV0ZScpXCI+Q29tcGxldGU8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd25cIiAqbmdJZj1cImZpeHR1cmVEZXRhaWxzPy5faWRcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHAtM1wiIHR5cGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTExIDEyQzExIDEyLjU1MjMgMTEuNDQ3NyAxMyAxMiAxM0MxMi41NTIzIDEzIDEzIDEyLjU1MjMgMTMgMTJDMTMgMTEuNDQ3NyAxMi41NTIzIDExIDEyIDExQzExLjQ0NzcgMTEgMTEgMTEuNDQ3NyAxMSAxMlpcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTExIDE5QzExIDE5LjU1MjMgMTEuNDQ3NyAyMCAxMiAyMEMxMi41NTIzIDIwIDEzIDE5LjU1MjMgMTMgMTlDMTMgMTguNDQ3NyAxMi41NTIzIDE4IDEyIDE4QzExLjQ0NzcgMTggMTEgMTguNDQ3NyAxMSAxOVpcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTExIDVDMTEgNS41NTIyOCAxMS40NDc3IDYgMTIgNkMxMi41NTIzIDYgMTMgNS41NTIyOCAxMyA1QzEzIDQuNDQ3NzIgMTIuNTUyMyA0IDEyIDRDMTEuNDQ3NyA0IDExIDQuNDQ3NzIgMTEgNVpcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uRHVwbGljYXRlKClcIiAqbmdJZj1cIiFpc0VkaXRNb2RlXCI+RHVwbGljYXRlPC9hPjwvbGk+XHJcbiAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlciB0ZXh0LWRhbmdlclwiIChjbGljayk9XCJvbkRlbGV0ZSgpXCI+IERlbGV0ZSA8L2E+XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gV2FsbCB0eXBlIGZpeHR1cmUgY3JlYXRpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBnYXAtNCBidWlsZGVyXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCI+XHJcbiAgICA8IS0tIFdhbGwgRml4dHVyZSBGb3JtIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGgyPkZpeHR1cmUgRGV0YWlsczwvaDI+XHJcbiAgICAgICAgPHA+Q29uZmlndXJlIHlvdXIgZml4dHVyZSBkZXRhaWxzIGhlcmU8L3A+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJ3YWxsRml4dHVyZUZvcm1cIj5cclxuICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uICNhY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgPCEtLSBCYXNpYyBEZXRhaWxzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJkZXRhaWxzXCIgW2NvbGxhcHNlZF09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5CQVNJQyBERVRBSUxTPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJiYXNpY0RldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkZpeHR1cmUgbmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4dHVyZSBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgd2lkdGggKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJhbGwgd2lkdGggY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCBoZWlnaHQgKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJsZW5ndGhcIiBbc3RlcF09XCIwLjVcIiBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmFsbCBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNIZWFkZXJFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdoZWFkZXInKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbXMtNFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkhFQURFUjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJoZWFkZXJcIiBbY2xhc3MuZGlzYWJsZWRdPVwiIWlzSGVhZGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgXCJIZWlnaHQgKFwiICsgKGZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaGVpZ2h0Py51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cImhlaWdodFwiIFtzdGVwXT1cIjAuNVwiIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2hlYWRlci5oZWlnaHQnKT8udG91Y2hlZCAmJiB3YWxsRml4dHVyZUZvcm0uZ2V0KCdoZWFkZXIuaGVpZ2h0Jyk/LmludmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnaGVhZGVyLmhlaWdodCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaGVpZ2h0IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEJvZHkgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiYm9keVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0VkaXRNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNCb2R5RW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VjdGlvbignYm9keScpOyB3YWxsRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtcy00XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+Qk9EWTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJib2R5XCIgW2NsYXNzLmRpc2FibGVkXT1cIiFpc0JvZHlFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHNoZWx2ZXM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWNvbnRhaW5lclwiIFtjbGFzcy5kaXNhYmxlLWNvdW50ZXJdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTUgMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlU2hlbGYoKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2hlbGZBcnJheS5sZW5ndGggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE1IDE0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFNoZWxmKCk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMTUzODkgMi45MTY1VjExLjA4MzJNMy4wNzA1NiA2Ljk5OTg0SDExLjIzNzJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInNoZWxmQXJyYXkubGVuZ3RoIDwgMSAmJiBpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHNoZWxmIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNoZWxmQXJyYXk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJzaGVsZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNoZWxmIG9mIHNoZWxmQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwiYXJyYXktZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5TaGVsZiB7eyBpICsgMSB9fTwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTaGVsZihpKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM5OEEyQjNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJzaGVsZlR5cGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNoZWxmLmdldCgndHlwZScpPy52YWx1ZSA9PT0gJ3RyYXknXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibm9PZlJvd3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaGVsZi5nZXQoJ25vT2ZSb3dzJyk/LnRvdWNoZWQgJiYgc2hlbGYuZ2V0KCdub09mUm93cycpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInNoZWxmLmdldCgnbm9PZlJvd3MnKT8uaGFzRXJyb3IoJ21pbicpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGF0IGxlYXN0IDEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5IGZvciBlYWNoIHJvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2FwYWNpdHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaGVsZi5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy50b3VjaGVkICYmIHNoZWxmLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LmVycm9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2hlbGYuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBjYXBhY2l0eSBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBGb290ZXIgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0Zvb3RlckVuYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlY3Rpb24oJ2Zvb3RlcicpOyB3YWxsRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtcy00XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+Rk9PVEVSPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cImZvb3RlclwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNGb290ZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIkhlaWdodCAoXCIgKyAoZml4dHVyZURldGFpbHMuZm9vdGVyPy5oZWlnaHQ/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwiaGVpZ2h0XCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnZm9vdGVyLmhlaWdodCcpPy50b3VjaGVkICYmIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Zvb3Rlci5oZWlnaHQnKT8uaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdmb290ZXIuaGVpZ2h0Jyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEZvb3RlciBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFdhbGwgRml4dHVyZSBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogY2FsYyg3NXZoIC0gMTIwcHgpOyBvdmVyZmxvdy15OiBhdXRvXCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJpc0JvZHlFbmFibGVkIHx8IGlzSGVhZGVyRW5hYmxlZCB8fCBpc0Zvb3RlckVuYWJsZWQ7IGVsc2UgZW1wdHlGaXh0dXJlXCJcclxuICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAge3sgbGVuZ3RoIH19IHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgZGltZW5zaW9uQXJyb3dzO1xyXG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTVcIiAqbmdJZj1cImlzSGVhZGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWJsb2NrXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8cD5IRUFERVI8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBCb2R5IFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWJsb2NrXCIgKm5nSWY9XCJpc0JvZHlFbmFibGVkICYmIHNoZWxmQXJyYXkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTVcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzaGVsZkFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICBAaWYoaXRlbS5nZXQoJ3R5cGUnKT8udmFsdWUgPT09J3NoZWxmJyl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2sgc2hlbGZcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgIFNIRUxGIHt7IGkgKyAxIH19IDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOiB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgfX08L2I+XHJcbiAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSlcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy52YWx1ZSlcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgU0hFTEYge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgICAgPGIgY2xhc3M9XCJtcy0zXCI+UHJvZHVjdHM6IHt7IGl0ZW0uZ2V0KFwicHJvZHVjdENhcGFjaXR5XCIpPy52YWx1ZSAqIChpdGVtLmdldChcIm5vT2ZSb3dzXCIpPy52YWx1ZSA/PyAxKSB9fTwvYj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRm9vdGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTVcIiAqbmdJZj1cImlzRm9vdGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyIGZvb3Rlci1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgaC0xMDAgZ2FwLTMgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBzdWItZm9vdGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc3ViLWZvb3RlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8cD5GT09URVI8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eUZpeHR1cmU+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtbiBoLTEwMFwiPlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YW1haW50ZXh0IG10LTNcIj5QcmV2aWV3IHJlcXVpcmVzIGhlYWRlciwgZm9vdGVyLCBvciBib2R5IGJsb2NrIGVuYWJsZWQuPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFzdWJ0ZXh0XCI+UGxlYXNlIGVuYWJsZSBlaXRoZXIgdGhlIGhlYWRlciwgZm9vdGVyLCBvciBib2R5IHRvIHZpZXcgdGhlIHByZXZpZXcuLjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIEluZm8gQ2FyZHMgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPnt7IHNoZWxmQXJyYXkubGVuZ3RoIH19PC9oMz5cclxuICAgICAgICAgIDxwPk5vIG9mIFNoZWx2ZXM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IHdhbGxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIik/LnZhbHVlIH19IHgge3sgd2FsbEZpeHR1cmVGb3JtLmdldChcImJhc2ljRGV0YWlscy5sZW5ndGhcIik/LnZhbHVlIH19IGZlZXRcclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBGbG9vciB0eXBlIGZpeHR1cmUgY3JlYXRpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBnYXAtNCBidWlsZGVyXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ2Zsb29yJ1wiPlxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBGb3JtIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGgyPkZpeHR1cmUgRGV0YWlsczwvaDI+XHJcbiAgICAgICAgPHA+VGhlIHNldHRpbmdzIGFyZSBwcmUtY29uZmlndXJlZCBhbmQgY2Fubm90IGJlIGVkaXRlZDwvcD5cclxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZsb29yRml4dHVyZUZvcm1cIj5cclxuICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uICNhY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgPCEtLSBCYXNpYyBEZXRhaWxzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJkZXRhaWxzXCIgW2NvbGxhcHNlZF09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5CQVNJQyBERVRBSUxTPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJiYXNpY0RldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkZpeHR1cmUgbmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCB3aWR0aCAoXCIgKyAoZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwid2lkdGhcIiBbc3RlcF09XCIwLjVcIiBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmFsbCB3aWR0aCBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgbGVuZ3RoIChcIiArIChmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibGVuZ3RoXCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJhbGwgaGVpZ2h0IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFBhbmVsIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cInBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPlBBTkVMPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHBhbmVsczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWNvbnRhaW5lclwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE1IDE0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVBhbmVsKCk7IGZsb29yRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zLjc2Mjk0IDdIMTEuOTI5NlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBhbmVsQXJyYXkubGVuZ3RoIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNSAxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRQYW5lbCgpOyBmbG9vckZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4xNTM4OSAyLjkxNjVWMTEuMDgzMk0zLjA3MDU2IDYuOTk5ODRIMTEuMjM3MlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWxBcnJheS5sZW5ndGggPCAxICYmIGlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhbmVsIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBhbmVsQXJyYXk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwicGFuZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcGFuZWwgb2YgcGFuZWxBcnJheT8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJhcnJheS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cInNoZWxmLXRpdGxlXCI+UGFuZWwge3sgaSArIDEgfX08L2g2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVBhbmVsKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjOThBMkIzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBhbmVsTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInBhbmVsTmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuZ2V0KCdwYW5lbE5hbWUnKT8udG91Y2hlZCAmJiBwYW5lbC5nZXQoJ3BhbmVsTmFtZScpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncGFuZWxOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZWwgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncGFuZWxOYW1lJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lbCBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ3BhbmVsTmFtZScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibm9PZlJvd3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbC5nZXQoJ25vT2ZSb3dzJyk/LnRvdWNoZWQgJiYgcGFuZWwuZ2V0KCdub09mUm93cycpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ25vT2ZSb3dzJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGF0IGxlYXN0IDEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlByb2R1Y3QgY2FwYWNpdHkgZm9yIGVhY2ggcm93PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDQwJVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXBhY2l0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udG91Y2hlZCAmJiBwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBjYXBhY2l0eSBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogY2FsYyg3NXZoIC0gMTIwcHgpOyBvdmVyZmxvdy15OiBhdXRvXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoOyBlbHNlIG5vUGFuZWxcIiBjbGFzcz1cImZsb29yLXBhbmVsLXZpZXdwb3J0IHctMTAwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFuZWxBcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZC1mbGV4IGdhcC01XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGxlbmd0aCB9fSB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIiB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgnbm9PZlJvd3MnKT8udmFsdWUpXCIgY2xhc3M9XCJwYW5lbCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgUEFORUwge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOiB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgKiAoaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgPz8gMSkgfX08L2I+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTUgbXQtNVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDI0cHhcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDY0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDUzMCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk01MjIuNjUzIDAuMjkyODkzQzUyMi4yNjMgLTAuMDk3NjMxNSA1MjEuNjMgLTAuMDk3NjMxNCA1MjEuMjM5IDAuMjkyODkzTDUxNC44NzUgNi42NTY4NUM1MTQuNDg1IDcuMDQ3MzggNTE0LjQ4NSA3LjY4MDU0IDUxNC44NzUgOC4wNzEwN0M1MTUuMjY2IDguNDYxNTkgNTE1Ljg5OSA4LjQ2MTU5IDUxNi4yODkgOC4wNzEwN0w1MjEuOTQ2IDIuNDE0MjFMNTI3LjYwMyA4LjA3MTA3QzUyNy45OTQgOC40NjE1OSA1MjguNjI3IDguNDYxNTkgNTI5LjAxNyA4LjA3MTA3QzUyOS40MDggNy42ODA1NCA1MjkuNDA4IDcuMDQ3MzggNTI5LjAxNyA2LjY1Njg1TDUyMi42NTMgMC4yOTI4OTNaTTUyMi45NDYgMTRMNTIyLjk0NiAxTDUyMC45NDYgMUw1MjAuOTQ2IDE0TDUyMi45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMzk0LjE1MyAwLjI5Mjg5M0MzOTMuNzYzIC0wLjA5NzYzMTUgMzkzLjEzIC0wLjA5NzYzMTQgMzkyLjczOSAwLjI5Mjg5M0wzODYuMzc1IDYuNjU2ODVDMzg1Ljk4NSA3LjA0NzM4IDM4NS45ODUgNy42ODA1NCAzODYuMzc1IDguMDcxMDdDMzg2Ljc2NiA4LjQ2MTU5IDM4Ny4zOTkgOC40NjE1OSAzODcuNzg5IDguMDcxMDdMMzkzLjQ0NiAyLjQxNDIxTDM5OS4xMDMgOC4wNzEwN0MzOTkuNDk0IDguNDYxNTkgNDAwLjEyNyA4LjQ2MTU5IDQwMC41MTcgOC4wNzEwN0M0MDAuOTA4IDcuNjgwNTQgNDAwLjkwOCA3LjA0NzM4IDQwMC41MTcgNi42NTY4NUwzOTQuMTUzIDAuMjkyODkzWk0zOTQuNDQ2IDE0TDM5NC40NDYgMUwzOTIuNDQ2IDFMMzkyLjQ0NiAxNEwzOTQuNDQ2IDE0WlwiXHJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICBkPVwiTTI2NS42NTMgMC4yOTI4OTNDMjY1LjI2MyAtMC4wOTc2MzE1IDI2NC42MyAtMC4wOTc2MzE0IDI2NC4yMzkgMC4yOTI4OTNMMjU3Ljg3NSA2LjY1Njg1QzI1Ny40ODUgNy4wNDczOCAyNTcuNDg1IDcuNjgwNTQgMjU3Ljg3NSA4LjA3MTA3QzI1OC4yNjYgOC40NjE1OSAyNTguODk5IDguNDYxNTkgMjU5LjI4OSA4LjA3MTA3TDI2NC45NDYgMi40MTQyMUwyNzAuNjAzIDguMDcxMDdDMjcwLjk5NCA4LjQ2MTU5IDI3MS42MjcgOC40NjE1OSAyNzIuMDE3IDguMDcxMDdDMjcyLjQwOCA3LjY4MDU0IDI3Mi40MDggNy4wNDczOCAyNzIuMDE3IDYuNjU2ODVMMjY1LjY1MyAwLjI5Mjg5M1pNMjY1Ljk0NiAxNEwyNjUuOTQ2IDFMMjYzLjk0NiAxTDI2My45NDYgMTRMMjY1Ljk0NiAxNFpcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0xMzcuMTUzIDAuMjkyODkzQzEzNi43NjMgLTAuMDk3NjMxNSAxMzYuMTMgLTAuMDk3NjMxNCAxMzUuNzM5IDAuMjkyODkzTDEyOS4zNzUgNi42NTY4NUMxMjguOTg1IDcuMDQ3MzggMTI4Ljk4NSA3LjY4MDU0IDEyOS4zNzUgOC4wNzEwN0MxMjkuNzY2IDguNDYxNTkgMTMwLjM5OSA4LjQ2MTU5IDEzMC43ODkgOC4wNzEwN0wxMzYuNDQ2IDIuNDE0MjFMMTQyLjEwMyA4LjA3MTA3QzE0Mi40OTQgOC40NjE1OSAxNDMuMTI3IDguNDYxNTkgMTQzLjUxNyA4LjA3MTA3QzE0My45MDggNy42ODA1NCAxNDMuOTA4IDcuMDQ3MzggMTQzLjUxNyA2LjY1Njg1TDEzNy4xNTMgMC4yOTI4OTNaTTEzNy40NDYgMTRMMTM3LjQ0NiAxTDEzNS40NDYgMUwxMzUuNDQ2IDE0TDEzNy40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNOC42NTM0IDAuMjkyODkzQzguMjYyODcgLTAuMDk3NjMxNSA3LjYyOTcxIC0wLjA5NzYzMTQgNy4yMzkxOCAwLjI5Mjg5M0wwLjg3NTIyMSA2LjY1Njg1QzAuNDg0Njk3IDcuMDQ3MzggMC40ODQ2OTcgNy42ODA1NCAwLjg3NTIyMSA4LjA3MTA3QzEuMjY1NzUgOC40NjE1OSAxLjg5ODkxIDguNDYxNTkgMi4yODk0MyA4LjA3MTA3TDcuOTQ2MjkgMi40MTQyMUwxMy42MDMxIDguMDcxMDdDMTMuOTkzNyA4LjQ2MTU5IDE0LjYyNjggOC40NjE1OSAxNS4wMTc0IDguMDcxMDdDMTUuNDA3OSA3LjY4MDU0IDE1LjQwNzkgNy4wNDczOCAxNS4wMTc0IDYuNjU2ODVMOC42NTM0IDAuMjkyODkzWk04Ljk0NjI5IDE0TDguOTQ2MjkgMUw2Ljk0NjI5IDFMNi45NDYyOSAxNEw4Ljk0NjI5IDE0WlwiXHJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI1N1wiIGhlaWdodD1cIjQzXCIgdmlld0JveD1cIjAgMCA1NyA0M1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0wLjQzOTY5NyAzMS44MDg3QzAuNDM5Njk3IDI2Ljg2NCA0LjQ0ODIgMjIuODU1NSA5LjM5Mjk0IDIyLjg1NTVINDcuNDY4MUM1Mi40MjMgMjIuODU1NSA1Ni40Mzk3IDI2Ljg3MjIgNTYuNDM5NyAzMS44MjdDNTYuNDM5NyAzNy4zMjU1IDUxLjUzNzMgNDEuNDk5NCA0Ni4wNzY1IDQwLjg1NzFDMzMuNjMxOCAzOS4zOTM1IDIzLjcyNjcgMzkuMzIwNiAxMC44MTg2IDQwLjgzNzZDNS4zNTU0MiA0MS40Nzk2IDAuNDM5Njk3IDM3LjMwOTUgMC40Mzk2OTcgMzEuODA4N1pcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiIzFEMjkzOVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjI4LjQ0MDhcIiBjeT1cIjE2LjU3MTRcIiByPVwiMTUuMDcxNFwiIGZpbGw9XCIjMUQyOTM5XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIzXCIgLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub1BhbmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW4gaC0xMDBcIj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+QWRkIGEgcGFuZWwgdG8gc2VlIHlvdXIgcHJldmlldy48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YXN1YnRleHRcIj5UbyBzZWUgeW91ciBwcmV2aWV3LCBwbGVhc2UgYWRkIGF0IGxlYXN0IG9uZSBwYW5lbC48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBwYW5lbEFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBQYW5lbHM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4IHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLmxlbmd0aFwiKT8udmFsdWUgfX1cclxuICAgICAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX1cclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlLXNrZWxldG9uXCIgKm5nSWY9XCJpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjwhLS0gQ29tbW9uIGRpbWVuc2lvbiBhcnJvd3MgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZGltZW5zaW9uQXJyb3dzIGxldC1sYWJlbD1cImxhYmVsXCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cclxuICA8ZGl2IGNsYXNzPVwiaG9yaXpvbnRhbC1kaW1lbnNpb25cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBsZWZ0XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInZhbHVlXCI+e3sgdmFsdWUgfX0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyByaWdodFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
|
|
568
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUlMLFVBQVUsRUFDVixXQUFXLEVBQ1gsbUJBQW1CLEdBQ3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsa0JBQWtCLEVBRWxCLFVBQVUsR0FDWCxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixjQUFjLEVBQ2QsR0FBRyxFQUNILE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFRZCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMxRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUVwRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUUzRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7QUFtQmxFLE1BQU0sT0FBTyxzQkFBc0I7SUEwQnZCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFoQ1YsUUFBUSxDQUFTO0lBRWpCLGVBQWUsQ0FBWTtJQUMzQixnQkFBZ0IsQ0FBWTtJQUU1QixhQUFhLEdBQVksSUFBSSxDQUFDO0lBRTlCLGNBQWMsR0FBMEIsRUFBRSxDQUFDO0lBQzNDLFVBQVUsR0FBWSxLQUFLLENBQUM7SUFFNUIsZUFBZSxHQUFZLElBQUksQ0FBQztJQUNoQyxlQUFlLEdBQVksSUFBSSxDQUFDO0lBQ2hDLGFBQWEsR0FBWSxJQUFJLENBQUM7SUFFOUIsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUVsQixVQUFVLEdBQWlCO1FBQ2xDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO1FBQ2xDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO1FBQ2hDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO0tBQ3RDLENBQUM7SUFFZSxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVoRCxZQUNVLEtBQXFCLEVBQ3JCLEVBQWUsRUFDZixtQkFBd0MsRUFDeEMsS0FBbUIsRUFDbkIsTUFBYyxFQUNkLFFBQWtCLEVBQ2xCLFFBQXlCLEVBQ3pCLEVBQXNCO1FBUHRCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7SUFDN0IsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFcEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDO1FBRTdDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRTtZQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO2FBQ25CLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUNwQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDcEIsb0JBQW9CLEVBQUUsRUFDdEIsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDekI7YUFDQSxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzlELElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO29CQUNqQixJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO29CQUN2QixJQUFJLE9BQU8sRUFBRTt3QkFDWCxJQUFJLENBQUMsY0FBYyxHQUFHOzRCQUNwQixHQUFHLE9BQU87eUJBQ1gsQ0FBQzt3QkFDRixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7d0JBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO3dCQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztxQkFDeEI7Z0JBQ0gsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FDdEIsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLElBQUksaUNBQWlDLENBQ3ZELENBQUM7b0JBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7b0JBQzNCLHVCQUF1QjtnQkFDekIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1lBQzNCO2dCQUNFLEtBQUssRUFBRSxXQUFXO2dCQUNsQixJQUFJLEVBQUUscUNBQXFDO2dCQUMzQyxRQUFRLEVBQUUsS0FBSztnQkFDZixXQUFXLEVBQUUsS0FBSzthQUNuQjtZQUNELEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtZQUMzRDtnQkFDRSxLQUFLLEVBQUUsU0FBUztnQkFDaEIsSUFBSSxFQUFFLG9DQUFvQztnQkFDMUMsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsV0FBVyxFQUFFLEtBQUs7YUFDbkI7WUFDRCxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7U0FDNUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWM7YUFDbkIsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsdURBQXVEO1FBQ2pGLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxxQ0FBcUM7UUFDeEQsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsNEJBQTRCO1FBQ3RELG9CQUFvQixFQUFFLENBQ3ZCO2FBQ0EsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFTLEVBQUUsRUFBRTtZQUM3QixJQUFJLElBQUksRUFBRSxNQUFNLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxFQUFFLE1BQU0sQ0FBQzthQUM5QjtpQkFBTTtnQkFDTCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN6QixZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFXLENBQ2pELENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLEVBQUUsTUFBTSxDQUFDO2FBQ3BDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEtBQUssTUFBTSxFQUFFO1lBQzlDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO2FBQU07WUFDTCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztTQUNsQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUztnQkFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTO2dCQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYTtnQkFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3BFO2FBQU07WUFDTCxJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUVyRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsSUFBSSxLQUFLLENBQUM7WUFDdEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUM7WUFDaEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLElBQUksS0FBSyxDQUFDO1NBQ3ZFO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxLQUFLLE1BQU07WUFDL0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFjLENBQUM7SUFDN0QsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQWMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsSUFBSSxvQkFBb0I7UUFDdEIsTUFBTSxTQUFTLEdBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEtBQUssTUFBTTtZQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFDakIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFdEIsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUN0RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssS0FBSyxNQUFNLENBQUM7WUFDbEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBRTlDLDBHQUEwRztZQUMxRyxPQUFPLENBQ0wsS0FBSztnQkFDTCxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsS0FBSyxPQUFPO29CQUNwRCxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUk7b0JBQ2QsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUNYLENBQUM7UUFDSixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkMsWUFBWSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUM3QyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3BCLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDO2FBQzVELENBQUM7WUFDRixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ2xCLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7YUFDekIsQ0FBQztZQUNGLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDcEIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssSUFBSSxHQUFHLENBQUM7YUFDNUQsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxFLElBQ0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxLQUFLLENBQUM7WUFDN0MsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFDcEM7WUFDQSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7UUFFRCxJQUFJLENBQUMsZUFBZTthQUNqQixHQUFHLENBQUMsOEJBQThCLENBQUM7WUFDcEMsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLGVBQWU7YUFDakIsR0FBRyxDQUFDLG9CQUFvQixDQUFDO1lBQzFCLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2pDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7YUFDaEQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3BDLFlBQVksRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDN0MsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUN6QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsRSxJQUFJLENBQUMsZ0JBQWdCO2FBQ2xCLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQztZQUNwQyxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsZ0JBQWdCO2FBQ2xCLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztZQUMxQixFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2FBQ2hEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIsZUFBZSxFQUFFO2dCQUNmLElBQUksQ0FBQyxjQUFjLEVBQUUsZUFBZSxJQUFJLFVBQVU7Z0JBQ2xELENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO2FBQzFDO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLElBQUksQ0FBQyxjQUFjLEVBQUUsWUFBWSxFQUFFLEtBQUssSUFBSSxDQUFDO2dCQUM3QyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUMzQztZQUNELE1BQU0sRUFBRTtnQkFDTixJQUFJLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDL0MsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDM0M7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQVc7UUFDbEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDL0IsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsSUFBSSxPQUFPLENBQUM7WUFDbkMsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLGVBQWUsSUFBSSxDQUFDLENBQUM7WUFDOUMsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsSUFBSSxDQUFDLENBQUM7U0FDakMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlDQUFpQyxDQUNwQyxVQUFVLEVBQ1YsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQzlCLENBQUM7UUFDRixJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELGlDQUFpQyxDQUFDLFVBQXFCLEVBQUUsU0FBaUI7UUFDeEUsTUFBTSxzQkFBc0IsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDakUsTUFBTSxRQUFRLEdBQUcsU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEQsc0JBQXNCLEVBQUUsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsc0JBQXNCLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsZ0dBQWdHO0lBQ2hHLHNCQUFzQixDQUFDLFVBQXFCO1FBQzFDLElBQUksWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ2pELFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3RELE1BQU0sc0JBQXNCLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2pFLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDckIsc0JBQXNCLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JDO2lCQUFNLElBQUksWUFBWSxLQUFLLFFBQVEsRUFBRTtnQkFDcEMsc0JBQXNCLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JDO1lBQ0QsWUFBWSxHQUFHLElBQUksQ0FBQztZQUVwQixJQUFJLENBQUMsaUNBQWlDLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pELE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkQsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO2dCQUNuQixlQUFlLEVBQUUsYUFBYSxDQUFDO29CQUM3QixVQUFVLENBQUMsUUFBUTtvQkFDbkIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzlCO2lCQUFNO2dCQUNMLGVBQWUsRUFBRSxlQUFlLEVBQUUsQ0FBQztnQkFDbkMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNqQztZQUNELGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxXQUFXLENBQUMsUUFBZ0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDN0QsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE9BQU87UUFDakQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFpQztRQUN4QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUMvQixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDcEUsZUFBZSxFQUFFO2dCQUNmLEtBQUssRUFBRSxlQUFlLElBQUksQ0FBQztnQkFDM0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDekM7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLFFBQVEsSUFBSSxDQUFDO2dCQUNwQixDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6QztTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsV0FBVyxDQUFDLFFBQWdCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQzdELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUM7WUFBRSxPQUFPO1FBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxhQUFhLENBQUMsT0FBcUM7UUFDakQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsT0FBcUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEMsSUFBSSxLQUFLLEVBQUU7WUFDVCxLQUFLLENBQUMsT0FBTztnQkFDWCxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDckMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxPQUFxQztRQUN6RCxRQUFRLE9BQU8sRUFBRTtZQUNmLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDekMsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFlLEVBQUUsTUFBYztRQUMxQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzdCLE1BQU0sU0FBUyxHQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxLQUFLLE1BQU07WUFDeEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQ2pCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRXRCLE9BQU87WUFDTCxNQUFNLEVBQUUsTUFBTTtZQUNkLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlO1lBQ3BELGVBQWUsRUFBRSxJQUFJLENBQUMsb0JBQW9CO1lBQzFDLGFBQWEsRUFBRTtnQkFDYixLQUFLLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxNQUFNO2dCQUNwQyxJQUFJLEVBQUUsSUFBSTthQUNYO1lBQ0QsWUFBWSxFQUFFO2dCQUNaLEtBQUssRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUs7Z0JBQ25DLElBQUksRUFBRSxJQUFJO2FBQ1g7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sTUFBTSxFQUFFO29CQUNOLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUs7b0JBQ3ZDLElBQUksRUFBRSxJQUFJO2lCQUNYO2dCQUNELEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUTthQUN6QztZQUNELE1BQU0sRUFBRTtnQkFDTixNQUFNLEVBQUU7b0JBQ04sS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSztvQkFDdkMsSUFBSSxFQUFFLElBQUk7aUJBQ1g7Z0JBQ0QsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRO2FBQ3pDO1lBQ0QsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRO1lBQzFDLFdBQVcsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDM0MsT0FBTztvQkFDTCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUM7b0JBQ2xCLFNBQVMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksSUFBSSxNQUFNO29CQUNuQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFlO29CQUN4QyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksQ0FBQztvQkFDakMsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxJQUFJLEVBQUU7aUJBQ2pDLENBQUM7WUFDSixDQUFDLENBQUM7U0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBYztRQUMzQixJQUFJO1lBQ0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRTVCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQzVDLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxJQUFJLE1BQU0sS0FBSyxVQUFVO2dCQUN2QixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUFFLE9BQU8sS0FBSyxDQUFDO1lBRXRELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRXhELE1BQU0sR0FBRyxHQUFRLE1BQU0sY0FBYyxDQUNuQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQzNDLGVBQWUsRUFDZixJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUksQ0FDMUIsQ0FDRixDQUFDO1lBRUYsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQUMsT0FBTyxHQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQ3RCLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxJQUFJLGdDQUFnQyxDQUN0RCxDQUFDO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNuRCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsd0dBQXdHO1FBQ3hHLDBCQUEwQjtRQUMxQix1Q0FBdUM7UUFDdkMsNkNBQTZDO1FBQzdDLGlEQUFpRDtRQUNqRCxxRUFBcUU7UUFDckUscUJBQXFCO1FBQ3JCLFFBQVE7UUFDUixPQUFPO1FBQ1Asc0JBQXNCO1FBQ3RCLHVGQUF1RjtRQUN2RiwwREFBMEQ7UUFDMUQsb0JBQW9CO1FBQ3BCLE1BQU07UUFDTixLQUFLO0lBQ1AsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhO1FBQ2pCLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFNUIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFeEMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO2dCQUNuQixPQUFPLEtBQUssQ0FBQzthQUNkO1lBRUQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsT0FBTyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDckM7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXO1FBQ2YsSUFBSTtZQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO2dCQUM3RCxRQUFRLEVBQUUsSUFBSTthQUNmLENBQUMsQ0FBQztZQUNILE9BQU8sTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDO1NBQ3pFO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUI7UUFDckIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7WUFDakUsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLGtCQUFrQixDQUFDO1FBQ3RELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXO1lBQ3BDLDJEQUEyRCxDQUFDO1FBQzlELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJO1lBQzdCLGtEQUFrRCxDQUFDO1FBRXJELE9BQU8sTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLG1CQUFtQjthQUNyQix1QkFBdUIsQ0FBQztZQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHO1NBQ25DLENBQUM7YUFDRCxTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxHQUFHLEVBQUUsTUFBTSxLQUFLLFNBQVMsRUFBRTtvQkFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsMENBQTBDLENBQUMsRUFBRTt3QkFDakUsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO3FCQUMxQyxDQUFDLENBQUM7aUJBQ0o7WUFDSCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQ3RCLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxJQUFJLDZCQUE2QixDQUNuRCxDQUFDO2dCQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDeEQsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNuQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRTtZQUMvRCxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsZ0JBQWdCLENBQUM7UUFDcEQsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVc7WUFDcEMsZ0RBQWdELENBQUM7UUFFbkQsT0FBTyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRTtZQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtnQkFDMUQsUUFBUSxFQUFFLElBQUk7YUFDZixDQUFDLENBQUM7WUFDSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLHVCQUF1QixDQUFDO1lBQzNELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsa0NBQWtDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSx1Q0FBdUMsQ0FBQztZQUNqSixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUFFLE9BQU87UUFDNUMsSUFBSSxDQUFDLG1CQUFtQjthQUNyQixvQkFBb0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQzVELFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLEdBQUcsRUFBRSxNQUFNLEtBQUssU0FBUyxFQUFFO29CQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO29CQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7WUFDSCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQ3RCLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxJQUFJLDBCQUEwQixDQUNoRCxDQUFDO2dCQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDckQsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRTtZQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtnQkFDMUQsUUFBUSxFQUFFLElBQUk7YUFDZixDQUFDLENBQUM7WUFDSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLHFCQUFxQixDQUFDO1lBQ3pELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsa0NBQWtDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxzQ0FBc0MsQ0FBQztZQUNoSixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUztZQUN4QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVM7WUFDeEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWE7WUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFO1lBQ3ZCLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSztZQUN0QixVQUFVLEVBQUUsSUFBSTtZQUNoQixXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO1lBQzdCLG1CQUFtQixFQUFFLE9BQU87U0FDN0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0FobUJVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLDhFQzVEbkMsbXJ6Q0FndUJjLGt2YUQvcUJWLHFCQUFxQiwySUFDckIsVUFBVSwwVEFDVixXQUFXLDJwQkFDWCxtQkFBbUIsNmhCQUNuQixZQUFZLGtoQkFDWixXQUFXLCtDQUNYLGtCQUFrQiw2MUJBQ2xCLHVCQUF1Qix5TkFDdkIsVUFBVTs7NEZBR0Qsc0JBQXNCO2tCQWpCbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FHbEIsSUFBSSxXQUNQO3dCQUNQLHFCQUFxQjt3QkFDckIsVUFBVTt3QkFDVixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3dCQUN2QixVQUFVO3FCQUNYIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEZvcm1BcnJheSxcclxuICBWYWxpZGF0b3JzLFxyXG4gIEZvcm1zTW9kdWxlLFxyXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIsIFJvdXRlckxpbmsgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7XHJcbiAgTmdiQWNjb3JkaW9uTW9kdWxlLFxyXG4gIE5nYk1vZGFsLFxyXG4gIE5nYlRvb2x0aXAsXHJcbn0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7XHJcbiAgZGVib3VuY2VUaW1lLFxyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gIGZpbHRlcixcclxuICBmaXJzdFZhbHVlRnJvbSxcclxuICBtYXAsXHJcbiAgU3ViamVjdCxcclxuICB0YWtlVW50aWwsXHJcbn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1zaGFyZWRcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtcclxuICBGaXh0dXJlTGlicmFyeURldGFpbHMsXHJcbiAgRml4dHVyZUxpYnJhcnlTaGVsZkNvbmZpZyxcclxufSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9maXh0dXJlLWxpYnJhcnkuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duSUYgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9wbGFuby1nZW5lcmFsLmludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBDb21wbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9wb3B1cHMvY29tcGxldGUtY29uZmlybWF0aW9uL2NvbXBsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4uL3BvcHVwcy9kZWxldGUtY29uZmlybWF0aW9uL2RlbGV0ZS1jb25maXJtYXRpb24uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEV4aXRDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vcG9wdXBzL2V4aXQtY29uZmlybWF0aW9uL2V4aXQtY29uZmlybWF0aW9uLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDYW5FeGl0R3VhcmQgfSBmcm9tIFwiLi4vLi4vZnVuY3Rpb25zL2V4aXQuZ3VhcmRcIjtcclxuaW1wb3J0IHsgQ2Fubm90UGVyZm9ybUNvbXBvbmVudCB9IGZyb20gXCIuLi9wb3B1cHMvY2Fubm90LXBlcmZvcm0vY2Fubm90LXBlcmZvcm0uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSwgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBUaW1lQWdvUGlwZSB9IGZyb20gXCIuLi8uLi9waXBlcy90aW1lLWFnby5waXBlXCI7XHJcbmltcG9ydCB7IENvdW50ZXJJbnB1dENvbXBvbmVudCB9IGZyb20gXCIuLi9jb3VudGVyLWlucHV0L2NvdW50ZXItaW5wdXQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFJlYWN0aXZlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3JlYWN0aXZlLXNlbGVjdC9yZWFjdGl2ZS1zZWxlY3QuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IGdlbmVyYWxWYWxpZGF0b3IgfSBmcm9tIFwiLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItY3JlYXRlLWZpeHR1cmVcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2NyZWF0ZS1maXh0dXJlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9jcmVhdGUtZml4dHVyZS5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ291bnRlcklucHV0Q29tcG9uZW50LFxyXG4gICAgTmdiVG9vbHRpcCxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIFRpbWVBZ29QaXBlLFxyXG4gICAgTmdiQWNjb3JkaW9uTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQsXHJcbiAgICBSb3V0ZXJMaW5rLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDcmVhdGVGaXh0dXJlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENhbkV4aXRHdWFyZCB7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuXHJcbiAgd2FsbEZpeHR1cmVGb3JtOiBGb3JtR3JvdXA7XHJcbiAgZmxvb3JGaXh0dXJlRm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBpc1BhZ2VMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgZml4dHVyZURldGFpbHM6IEZpeHR1cmVMaWJyYXJ5RGV0YWlscyA9IHt9O1xyXG4gIGlzRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgaXNIZWFkZXJFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0Zvb3RlckVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzQm9keUVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBjYW5Hb0JhY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcmVhZG9ubHkgc2hlbGZUeXBlczogRHJvcGRvd25JRltdID0gW1xyXG4gICAgeyBsYWJlbDogXCJTaGVsZlwiLCB2YWx1ZTogXCJzaGVsZlwiIH0sXHJcbiAgICB7IGxhYmVsOiBcIlRyYXlcIiwgdmFsdWU6IFwidHJheVwiIH0sXHJcbiAgICB7IGxhYmVsOiBcIlZNIE9ubHlcIiwgdmFsdWU6IFwidm1vbmx5XCIgfSxcclxuICBdO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbmdiTW9kYWw6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XHJcbiAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcztcclxuICAgIHRoaXMuZml4dHVyZURldGFpbHMuX2lkID0gcGFyYW1zW1wiZml4dHVyZUlkXCJdID8/IFwiXCI7XHJcblxyXG4gICAgdGhpcy5pc0VkaXRNb2RlID0gcGFyYW1zW1wiaXNFZGl0XCJdID09IFwidHJ1ZVwiO1xyXG5cclxuICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5faWQpIHtcclxuICAgICAgdGhpcy5jYW5Hb0JhY2sgPSB0cnVlO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCIvbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzXCJdKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50SWQoKTtcclxuXHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocGFyYW1zKSA9PiBwYXJhbXNbXCJmaXh0dXJlSWRcIl0pLFxyXG4gICAgICAgIGZpbHRlcigoaWQpID0+ICEhaWQpLFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGlkKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldEZpeHR1cmVMaWJyYXJ5RGV0YWlscyhpZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZGV0YWlscyA9IHJlcy5kYXRhO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWlscykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi5kZXRhaWxzLFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FuR29CYWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgICAgZXJyPy5lcnJvcj8uZXJyb3IgPz8gXCJGYWlsZWQgdG8gZmV0Y2ggZml4dHVyZSBkZXRhaWxzXCIsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmlzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRQYWdlRGF0YSgpIHtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0VGl0bGUoXCJDcmVhdGUgRml4dHVyZVwiKTtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiUGxhbm9ncmFtXCIsXHJcbiAgICAgICAgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtc1wiLFxyXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICBpc1NlcGFyYXRvcjogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwiXCIsIHBhdGg6IFwiXCIsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkxpYnJhcnlcIixcclxuICAgICAgICBwYXRoOiBcIi9tYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXNcIixcclxuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgaXNTZXBhcmF0b3I6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgICB7IHRpdGxlOiBcIlwiLCBwYXRoOiBcIlwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIGdldENsaWVudElkKCkge1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIC8vIFN1YnNjcmlwdGlvbiB3aWxsIGJlIGNhbmNlbGxlZCBvbiBjb21wb25lbnQgZGVzdHJveS5cclxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSwgLy8gVG8gYXZvaWQgaW1tZWRpYXRlIGZyZXF1ZW50IGNhbGxzLlxyXG4gICAgICAgIGZpbHRlcigoZGF0YSkgPT4gISFkYXRhKSwgLy8gRmlsdGVyaW5nIG51bGwvdW5kZWZpbmVkLlxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIC8vIEVtaXR0aW5nIG9ubHkgZGlmZmVyZW50IHZhbHVlcy4gKElnbm9yZXMgc2FtZSBjbGllbnRJZCkuXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShhc3luYyAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGE/LmNsaWVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIGFzIHN0cmluZyxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICB0aGlzLmluaXRXYWxsRml4dHVyZUZvcm0oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5pdEZsb29yUGFuZWxGaXh0dXJlRm9ybSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzRWRpdE1vZGUpIHtcclxuICAgICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaXNFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb24oXCJoZWFkZXJcIik7XHJcbiAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uKFwiZm9vdGVyXCIpO1xyXG4gICAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaXNCb2R5RW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uKFwiYm9keVwiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgdGhpcy5mbG9vckZpeHR1cmVGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICAgIHRoaXMuaXNIZWFkZXJFbmFibGVkID0gdGhpcy5maXh0dXJlRGV0YWlscy5oZWFkZXI/LmlzRW5hYmxlZCA/PyBmYWxzZTtcclxuICAgICAgdGhpcy5pc0JvZHlFbmFibGVkID0gdGhpcy5maXh0dXJlRGV0YWlscy5pc0JvZHlFbmFibGVkID8/IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzRm9vdGVyRW5hYmxlZCA9IHRoaXMuZml4dHVyZURldGFpbHMuZm9vdGVyPy5pc0VuYWJsZWQgPz8gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRGb3JtKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09IFwid2FsbFwiXHJcbiAgICAgID8gdGhpcy53YWxsRml4dHVyZUZvcm1cclxuICAgICAgOiB0aGlzLmZsb29yRml4dHVyZUZvcm07XHJcbiAgfVxyXG5cclxuICBnZXQgc2hlbGZBcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMud2FsbEZpeHR1cmVGb3JtLmdldChcImJvZHkuc2hlbGZcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhbmVsQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZsb29yRml4dHVyZUZvcm0uZ2V0KFwicGFuZWxcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvdGFsUHJvZHVjdENhcGFjaXR5KCk6IG51bWJlciB7XHJcbiAgICBjb25zdCBmb3JtQXJyYXkgPVxyXG4gICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIlxyXG4gICAgICAgID8gdGhpcy5zaGVsZkFycmF5XHJcbiAgICAgICAgOiB0aGlzLnBhbmVsQXJyYXk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm1BcnJheS5jb250cm9scy5yZWR1Y2UoKHRvdGFsLCBpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gaXRlbS5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik/LnZhbHVlIHx8IDA7XHJcbiAgICAgIGNvbnN0IGlzVHJheSA9IGl0ZW0uZ2V0KFwidHlwZVwiKT8udmFsdWUgPT09IFwidHJheVwiO1xyXG4gICAgICBjb25zdCByb3dzID0gaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgfHwgMTtcclxuXHJcbiAgICAgIC8vIElmIHRoZSBmaXh0dXJlIGlzIGEgZmxvb3IgcGFuZWwgb3IgdHJheSwgd2UgbmVlZCB0byBtdWx0aXBseSB0aGUgcHJvZHVjdCBjYXBhY2l0eSBieSB0aGUgbnVtYmVyIG9mIHJvd3NcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0b3RhbCArXHJcbiAgICAgICAgKGlzVHJheSB8fCB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSBcImZsb29yXCJcclxuICAgICAgICAgID8gY291bnQgKiByb3dzXHJcbiAgICAgICAgICA6IGNvdW50KVxyXG4gICAgICApO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBpbml0V2FsbEZpeHR1cmVGb3JtKCkge1xyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYmFzaWNEZXRhaWxzOiB0aGlzLmdldEJhc2ljRGV0YWlsc0Zvcm1Hcm91cCgpLFxyXG4gICAgICBoZWFkZXI6IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGhlaWdodDogW3RoaXMuZml4dHVyZURldGFpbHM/LmhlYWRlcj8uaGVpZ2h0Py52YWx1ZSA/PyAzMDBdLFxyXG4gICAgICB9KSxcclxuICAgICAgYm9keTogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgc2hlbGY6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICB9KSxcclxuICAgICAgZm9vdGVyOiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBoZWlnaHQ6IFt0aGlzLmZpeHR1cmVEZXRhaWxzPy5mb290ZXI/LmhlaWdodD8udmFsdWUgPz8gMzAwXSxcclxuICAgICAgfSksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5mb3JFYWNoKChzKSA9PiB0aGlzLmFkZFNoZWxmKHMpKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuc2hlbGZDb25maWc/Lmxlbmd0aCA9PT0gMCAmJlxyXG4gICAgICAhdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnlcclxuICAgICkge1xyXG4gICAgICB0aGlzLmFkZFNoZWxmKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm1cclxuICAgICAgLmdldChcImJhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnlcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtXHJcbiAgICAgIC5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aCkge1xyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdEZsb29yUGFuZWxGaXh0dXJlRm9ybSgpIHtcclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBiYXNpY0RldGFpbHM6IHRoaXMuZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCksXHJcbiAgICAgIHBhbmVsOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZURldGFpbHMuc2hlbGZDb25maWc/LmZvckVhY2goKHMpID0+IHRoaXMuYWRkUGFuZWwocykpO1xyXG5cclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybVxyXG4gICAgICAuZ2V0KFwiYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnkgPSB2YWx1ZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5mbG9vckZpeHR1cmVGb3JtXHJcbiAgICAgIC5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aCkge1xyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBmaXh0dXJlQ2F0ZWdvcnk6IFtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzPy5maXh0dXJlQ2F0ZWdvcnkgfHwgXCJVbnRpdGxlZFwiLFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBnZW5lcmFsVmFsaWRhdG9yKCldLFxyXG4gICAgICBdLFxyXG4gICAgICB3aWR0aDogW1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWUgPz8gNixcclxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMC41KV0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGxlbmd0aDogW1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnZhbHVlID8/IDEyLFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwLjUpXSxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkU2hlbGYoc2hlbGY/OiBhbnkpIHtcclxuICAgIGNvbnN0IHNoZWxmR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdHlwZTogW3NoZWxmPy5zaGVsZlR5cGUgPz8gXCJzaGVsZlwiXSxcclxuICAgICAgcHJvZHVjdENhcGFjaXR5OiBbc2hlbGY/LnByb2R1Y3RQZXJTaGVsZiA/PyA2XSxcclxuICAgICAgbm9PZlJvd3M6IFtzaGVsZj8udHJheVJvd3MgPz8gMV0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMudXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKFxyXG4gICAgICBzaGVsZkdyb3VwLFxyXG4gICAgICBzaGVsZkdyb3VwLmdldChcInR5cGVcIik/LnZhbHVlLFxyXG4gICAgKTtcclxuICAgIHRoaXMuc2V0dXBTaGVsZlR5cGVMaXN0ZW5lcihzaGVsZkdyb3VwKTtcclxuICAgIHRoaXMuc2hlbGZBcnJheS5wdXNoKHNoZWxmR3JvdXApO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKHNoZWxmR3JvdXA6IEZvcm1Hcm91cCwgc2hlbGZUeXBlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHByb2R1Y3RQZXJTaGVsZkNvbnRyb2wgPSBzaGVsZkdyb3VwLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKTtcclxuICAgIGNvbnN0IG1pblZhbHVlID0gc2hlbGZUeXBlID09PSBcInZtb25seVwiID8gMCA6IDE7XHJcblxyXG4gICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5taW4obWluVmFsdWUpXSk7XHJcbiAgICBwcm9kdWN0UGVyU2hlbGZDb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIC8vICB3ZSBuZWVkIHRvIHNldHVwIGEgbGlzdGVuZXIgdG8gdGhlIHR5cGUgb2YgdGhlIHNoZWxmIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBub09mUm93cyBmaWVsZFxyXG4gIHNldHVwU2hlbGZUeXBlTGlzdGVuZXIoc2hlbGZHcm91cDogRm9ybUdyb3VwKSB7XHJcbiAgICBsZXQgcHJldmlvdXNUeXBlID0gc2hlbGZHcm91cC5nZXQoXCJ0eXBlXCIpPy52YWx1ZTtcclxuICAgIHNoZWxmR3JvdXAuZ2V0KFwidHlwZVwiKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodHlwZSkgPT4ge1xyXG4gICAgICBjb25zdCBwcm9kdWN0UGVyU2hlbGZDb250cm9sID0gc2hlbGZHcm91cC5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik7XHJcbiAgICAgIGlmICh0eXBlID09PSBcInZtb25seVwiKSB7XHJcbiAgICAgICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsdWUoMCk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNUeXBlID09PSBcInZtb25seVwiKSB7XHJcbiAgICAgICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsdWUoMSk7XHJcbiAgICAgIH1cclxuICAgICAgcHJldmlvdXNUeXBlID0gdHlwZTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKHNoZWxmR3JvdXAsIHR5cGUpO1xyXG4gICAgICBjb25zdCBub09mUm93c0NvbnRyb2wgPSBzaGVsZkdyb3VwLmdldChcIm5vT2ZSb3dzXCIpO1xyXG4gICAgICBpZiAodHlwZSA9PT0gXCJ0cmF5XCIpIHtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbGlkYXRvcnMoW1xyXG4gICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgIFZhbGlkYXRvcnMubWluKDEpLFxyXG4gICAgICAgIF0pO1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uc2V0VmFsdWUoMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIG5vT2ZSb3dzQ29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBJZiBpbmRleCBpcyBub3QgZ2l2ZW4sIGxhc3Qgc2hlbGYgc2hvdWxkIGJlIHJlbW92ZWRcclxuICByZW1vdmVTaGVsZihpbmRleDogbnVtYmVyID0gdGhpcy5zaGVsZkFycmF5LmNvbnRyb2xzLmxlbmd0aCAtIDEpIHtcclxuICAgIGlmICh0aGlzLnNoZWxmQXJyYXkuY29udHJvbHMubGVuZ3RoID09IDEpIHJldHVybjtcclxuICAgIHRoaXMuc2hlbGZBcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICBhZGRQYW5lbChwYW5lbD86IEZpeHR1cmVMaWJyYXJ5U2hlbGZDb25maWcpIHtcclxuICAgIGNvbnN0IHBhbmVsR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcGFuZWxOYW1lOiBbcGFuZWw/LmxhYmVsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZ2VuZXJhbFZhbGlkYXRvcigpXV0sXHJcbiAgICAgIHByb2R1Y3RDYXBhY2l0eTogW1xyXG4gICAgICAgIHBhbmVsPy5wcm9kdWN0UGVyU2hlbGYgPz8gNixcclxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMCldLFxyXG4gICAgICBdLFxyXG4gICAgICBub09mUm93czogW1xyXG4gICAgICAgIHBhbmVsPy50cmF5Um93cyA/PyA1LFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV0sXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnBhbmVsQXJyYXkucHVzaChwYW5lbEdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8vIElmIGluZGV4IGlzIG5vdCBnaXZlbiwgbGFzdCBwYW5lbCBzaG91bGQgYmUgcmVtb3ZlZFxyXG4gIHJlbW92ZVBhbmVsKGluZGV4OiBudW1iZXIgPSB0aGlzLnBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoIC0gMSkge1xyXG4gICAgaWYgKHRoaXMucGFuZWxBcnJheS5jb250cm9scy5sZW5ndGggPT0gMSkgcmV0dXJuO1xyXG4gICAgdGhpcy5wYW5lbEFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb24oc2VjdGlvbjogXCJoZWFkZXJcIiB8IFwiYm9keVwiIHwgXCJmb290ZXJcIikge1xyXG4gICAgdGhpcy50b2dnbGVTZWN0aW9uRm9ybShzZWN0aW9uKTtcclxuICAgIHRoaXMudG9nZ2xlU2VjdGlvbkNoZWNrQm94KHNlY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VjdGlvbkZvcm0oc2VjdGlvbjogXCJoZWFkZXJcIiB8IFwiYm9keVwiIHwgXCJmb290ZXJcIikge1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybSgpO1xyXG4gICAgY29uc3QgZ3JvdXAgPSBmb3JtLmdldChzZWN0aW9uKTtcclxuICAgIGlmIChncm91cCkge1xyXG4gICAgICBncm91cC5lbmFibGVkXHJcbiAgICAgICAgPyBncm91cC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG4gICAgICAgIDogZ3JvdXAuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb25DaGVja0JveChzZWN0aW9uOiBcImhlYWRlclwiIHwgXCJib2R5XCIgfCBcImZvb3RlclwiKSB7XHJcbiAgICBzd2l0Y2ggKHNlY3Rpb24pIHtcclxuICAgICAgY2FzZSBcImhlYWRlclwiOlxyXG4gICAgICAgIHRoaXMuaXNIZWFkZXJFbmFibGVkID0gIXRoaXMuaXNIZWFkZXJFbmFibGVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiYm9keVwiOlxyXG4gICAgICAgIHRoaXMuaXNCb2R5RW5hYmxlZCA9ICF0aGlzLmlzQm9keUVuYWJsZWQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJmb290ZXJcIjpcclxuICAgICAgICB0aGlzLmlzRm9vdGVyRW5hYmxlZCA9ICF0aGlzLmlzRm9vdGVyRW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1hcEZvcm1Ub0FwaShmb3JtOiBGb3JtR3JvdXAsIHN0YXR1czogc3RyaW5nKTogYW55IHtcclxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm0udmFsdWU7XHJcbiAgICBjb25zdCBmb3JtQXJyYXkgPVxyXG4gICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIlxyXG4gICAgICAgID8gdGhpcy5zaGVsZkFycmF5XHJcbiAgICAgICAgOiB0aGlzLnBhbmVsQXJyYXk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBmaXh0dXJlQ2F0ZWdvcnk6IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5LFxyXG4gICAgICBmaXh0dXJlQ2FwYWNpdHk6IHRoaXMudG90YWxQcm9kdWN0Q2FwYWNpdHksXHJcbiAgICAgIGZpeHR1cmVMZW5ndGg6IHtcclxuICAgICAgICB2YWx1ZTogZm9ybVZhbHVlLmJhc2ljRGV0YWlscy5sZW5ndGgsXHJcbiAgICAgICAgdW5pdDogXCJmdFwiLFxyXG4gICAgICB9LFxyXG4gICAgICBmaXh0dXJlV2lkdGg6IHtcclxuICAgICAgICB2YWx1ZTogZm9ybVZhbHVlLmJhc2ljRGV0YWlscy53aWR0aCxcclxuICAgICAgICB1bml0OiBcImZ0XCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWRlcjoge1xyXG4gICAgICAgIGhlaWdodDoge1xyXG4gICAgICAgICAgdmFsdWU6IGZvcm0uZ2V0KFwiaGVhZGVyLmhlaWdodFwiKT8udmFsdWUsXHJcbiAgICAgICAgICB1bml0OiBcIm1tXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsYWJlbDogXCJcIixcclxuICAgICAgICBpc0VuYWJsZWQ6ICFmb3JtLmdldChcImhlYWRlclwiKT8uZGlzYWJsZWQsXHJcbiAgICAgIH0sXHJcbiAgICAgIGZvb3Rlcjoge1xyXG4gICAgICAgIGhlaWdodDoge1xyXG4gICAgICAgICAgdmFsdWU6IGZvcm0uZ2V0KFwiZm9vdGVyLmhlaWdodFwiKT8udmFsdWUsXHJcbiAgICAgICAgICB1bml0OiBcIm1tXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsYWJlbDogXCJcIixcclxuICAgICAgICBpc0VuYWJsZWQ6ICFmb3JtLmdldChcImZvb3RlclwiKT8uZGlzYWJsZWQsXHJcbiAgICAgIH0sXHJcbiAgICAgIGlzQm9keUVuYWJsZWQ6ICFmb3JtLmdldChcImJvZHlcIik/LmRpc2FibGVkLFxyXG4gICAgICBzaGVsZkNvbmZpZzogZm9ybUFycmF5LmNvbnRyb2xzLm1hcCgoZSwgaSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBzaGVsZk51bWJlcjogaSArIDEsXHJcbiAgICAgICAgICBzaGVsZlR5cGU6IGU/LnZhbHVlPy50eXBlID8/IFwidHJheVwiLFxyXG4gICAgICAgICAgcHJvZHVjdFBlclNoZWxmOiBlLnZhbHVlLnByb2R1Y3RDYXBhY2l0eSxcclxuICAgICAgICAgIHRyYXlSb3dzOiBlPy52YWx1ZT8ubm9PZlJvd3MgPz8gMSxcclxuICAgICAgICAgIGxhYmVsOiBlPy52YWx1ZT8ucGFuZWxOYW1lID8/IFwiXCIsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdWJtaXQoc3RhdHVzOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEZvcm0oKTtcclxuXHJcbiAgICAgIGlmIChmb3JtLmludmFsaWQpIHtcclxuICAgICAgICBmb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJGb3JtIGlzIGludmFsaWRcIik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc3RhdHVzID09PSBcImNvbXBsZXRlXCIpXHJcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jb25maXJtQ29tcGxldGlvbigpKSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgY29uc3QgdHJhbnNmb3JtZWREYXRhID0gdGhpcy5tYXBGb3JtVG9BcGkoZm9ybSwgc3RhdHVzKTtcclxuXHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVMaWJyYXJ5KFxyXG4gICAgICAgICAgdHJhbnNmb3JtZWREYXRhLFxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscz8uX2lkISxcclxuICAgICAgICApLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHJlcyAmJiByZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnN0YXR1cyA9IHN0YXR1cztcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChyZXMubWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5jYW5Hb0JhY2sgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIm1hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICBlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBzYXZlIEZpeHR1cmUgZGV0YWlsc1wiLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gdXBkYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVMaWJyYXJ5KHRyYW5zZm9ybWVkRGF0YSwgdGhpcy5maXh0dXJlRGV0YWlscz8uX2lkISkuc3Vic2NyaWJlKHtcclxuICAgIC8vICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAvLyAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnc3VjY2VzcycpIHtcclxuICAgIC8vICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgLy8gICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydtYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXMnXSk7XHJcbiAgICAvLyAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAvLyAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8/IFwiRmFpbGVkIHRvIHNhdmUgRml4dHVyZSBkZXRhaWxzXCIpO1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwiQEAgfiB1cGRhdGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycik7XHJcbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FuRGVhY3RpdmF0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLmNhbkdvQmFjaykgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybSgpO1xyXG5cclxuICAgIGlmIChmb3JtLmRpcnR5KSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybUV4aXQoKTtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vblN1Ym1pdChcImRyYWZ0XCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1FeGl0KCk6IFByb21pc2U8Ym9vbGVhbiB8IG51bGw+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKEV4aXRDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1Db21wbGV0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ29tcGxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gXCJDb21wbGV0ZSBmaXh0dXJlXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgIFwiRml4dHVyZSBpcyBub3cgcmVhZHkgYW5kIGF2YWlsYWJsZSB0byBjcmVhdGUgYXMgdGVtcGxhdGUuXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5ub3RlID1cclxuICAgICAgXCJZb3UgY2FuJ3QgZWRpdCBpdCBvbmNlIGFzc2lnbmVkIHRvIHRoZSB0ZW1wbGF0ZS5cIjtcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSBcIm9rXCIpO1xyXG4gIH1cclxuXHJcbiAgb25EdXBsaWNhdGUoKSB7XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmR1cGxpY2F0ZUZpeHR1cmVMaWJyYXJ5KHtcclxuICAgICAgICBmaXh0dXJlSWQ6IHRoaXMuZml4dHVyZURldGFpbHMuX2lkLFxyXG4gICAgICB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLmRhdGEubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuR29CYWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL21hbmFnZS9wbGFub2dyYW0vY3JlYXRlLWxpYnJhcnktZml4dHVyZVwiXSwge1xyXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGZpeHR1cmVJZDogcmVzPy5kYXRhPy5pZCB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgIGVycj8uZXJyb3I/LmVycm9yIHx8IFwiRmFpbGVkIHRvIGR1cGxpY2F0ZSBGaXh0dXJlXCIsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJAQCB+IGR1cGxpY2F0ZUZpeHR1cmVMaWJyYXJ5IGVycjpcIiwgZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1EZWxldGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBcIkRlbGV0ZSBmaXh0dXJlXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpeHR1cmUgP1wiO1xyXG5cclxuICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkRlbGV0ZSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWQpIHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ2Fubm90UGVyZm9ybUNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBgQ2Fu4oCZdCBkZWxldGUgZml4dHVyZSFgO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9IGBTaW5jZSB0aGlzIGZpeHR1cmUgaXMgbGl2ZSBpbiBcIiR7dGhpcy5maXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkfSB0ZW1wbGF0ZXMsXCIgZGVsZXRpbmcgaXMgbm90IGFsbG93ZWQuYDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghKGF3YWl0IHRoaXMuY29uZmlybURlbGV0aW9uKCkpKSByZXR1cm47XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmRlbGV0ZUZpeHR1cmVMaWJyYXJ5KHsgZml4dHVyZUlkOiB0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIm1hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgICAgICBlcnI/LmVycm9yPy5lcnJvciB8fCBcIkZhaWxlZCB0byBkZWxldGUgRml4dHVyZVwiLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBkZWxldGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrRWRpdCgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWQpIHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ2Fubm90UGVyZm9ybUNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBgQ2Fu4oCZdCBlZGl0IGZpeHR1cmUhYDtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSBgU2luY2UgdGhpcyBmaXh0dXJlIGlzIGxpdmUgaW4gXCIke3RoaXMuZml4dHVyZURldGFpbHMudGVtcGxhdGVJZH0gdGVtcGxhdGVzLFwiIGVkaXRpbmcgaXMgbm90IGFsbG93ZWQuYDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNFZGl0TW9kZSA9IHRydWU7XHJcbiAgICB0aGlzLmZsb29yRml4dHVyZUZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaGVhZGVyPy5pc0VuYWJsZWQpXHJcbiAgICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oXCJoZWFkZXJcIik7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuZm9vdGVyPy5pc0VuYWJsZWQpXHJcbiAgICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oXCJmb290ZXJcIik7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaXNCb2R5RW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uRm9ybShcImJvZHlcIik7XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcclxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcclxuICAgICAgcXVlcnlQYXJhbXM6IHsgaXNFZGl0OiB0cnVlIH0sXHJcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDwhLS0gSGVhZGVyIHNlY3Rpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50cy1jZW50ZXIgZ2FwLTVcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcC0zXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXNcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuODMzNCA5Ljk5OTg0SDQuMTY2NzVNNC4xNjY3NSA5Ljk5OTg0TDEwLjAwMDEgMTUuODMzMk00LjE2Njc1IDkuOTk5ODRMMTAuMDAwMSA0LjE2NjVcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8aDIgY2xhc3M9XCJtLTAgZWxsaXBzaXNcIiBzdHlsZT1cIm1heC13aWR0aDogY2FsYygxMDB2dyAtIDg2MHB4KVwiXHJcbiAgICAgICAgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ICsgJyAtICcgKyBmaXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnZhbHVlICsgJ2Z0J1wiPlxyXG4gICAgICAgIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSB9fSAtIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udmFsdWUgfX1cclxuICAgICAgICB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgIDwvaDI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZSBkcmFmdFwiPnt7IGZpeHR1cmVEZXRhaWxzLnN0YXR1cyB8IHRpdGxlY2FzZSB9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnRzLWNlbnRlciBnYXAtNVwiPlxyXG4gICAgICA8cCBjbGFzcz1cIm0tMCB0ZXh0LW5vd3JhcFwiICpuZ0lmPVwiZml4dHVyZURldGFpbHM/LnVwZGF0ZWRBdFwiXHJcbiAgICAgICAgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMudXBkYXRlZEF0IHwgZGF0ZSA6ICdtZWRpdW0nXCI+XHJcbiAgICAgICAgTGFzdCB1cGRhdGU6IHt7IGZpeHR1cmVEZXRhaWxzLnVwZGF0ZWRBdCB8IHRpbWVBZ28gfX1cclxuICAgICAgPC9wPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCIgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIj5cclxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzEzMjJfNTMyNSlcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xNC4xNjY3IDIuNDk5OTNDMTQuMzg1NiAyLjI4MTA2IDE0LjY0NTUgMi4xMDc0NCAxNC45MzE0IDEuOTg4OTlDMTUuMjE3NCAxLjg3MDU0IDE1LjUyMzkgMS44MDk1NyAxNS44MzM0IDEuODA5NTdDMTYuMTQyOSAxLjgwOTU3IDE2LjQ0OTQgMS44NzA1NCAxNi43MzU0IDEuOTg4OTlDMTcuMDIxNCAyLjEwNzQ0IDE3LjI4MTIgMi4yODEwNiAxNy41MDAxIDIuNDk5OTNDMTcuNzE5IDIuNzE4OCAxNy44OTI2IDIuOTc4NjMgMTguMDExIDMuMjY0NkMxOC4xMjk1IDMuNTUwNTcgMTguMTkwNCAzLjg1NzA2IDE4LjE5MDQgNC4xNjY1OUMxOC4xOTA0IDQuNDc2MTIgMTguMTI5NSA0Ljc4MjYyIDE4LjAxMSA1LjA2ODU5QzE3Ljg5MjYgNS4zNTQ1NSAxNy43MTkgNS42MTQzOSAxNy41MDAxIDUuODMzMjZMNi4yNTAwOCAxNy4wODMzTDEuNjY2NzUgMTguMzMzM0wyLjkxNjc1IDEzLjc0OTlMMTQuMTY2NyAyLjQ5OTkzWlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTMyMl81MzI1XCI+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgRWRpdFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJpc0VkaXRNb2RlXCIgY2xhc3M9XCJkLWZsZXggZ2FwLTUganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvblN1Ym1pdCgnZHJhZnQnKVwiPlNhdmUgYXMgZHJhZnQ8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvblN1Ym1pdCgnY29tcGxldGUnKVwiPkNvbXBsZXRlPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscz8uX2lkXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBwLTNcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSAxMkMxMSAxMi41NTIzIDExLjQ0NzcgMTMgMTIgMTNDMTIuNTUyMyAxMyAxMyAxMi41NTIzIDEzIDEyQzEzIDExLjQ0NzcgMTIuNTUyMyAxMSAxMiAxMUMxMS40NDc3IDExIDExIDExLjQ0NzcgMTEgMTJaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSAxOUMxMSAxOS41NTIzIDExLjQ0NzcgMjAgMTIgMjBDMTIuNTUyMyAyMCAxMyAxOS41NTIzIDEzIDE5QzEzIDE4LjQ0NzcgMTIuNTUyMyAxOCAxMiAxOEMxMS40NDc3IDE4IDExIDE4LjQ0NzcgMTEgMTlaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSA1QzExIDUuNTUyMjggMTEuNDQ3NyA2IDEyIDZDMTIuNTUyMyA2IDEzIDUuNTUyMjggMTMgNUMxMyA0LjQ0NzcyIDEyLjU1MjMgNCAxMiA0QzExLjQ0NzcgNCAxMSA0LjQ0NzcyIDExIDVaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxyXG4gICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvbkR1cGxpY2F0ZSgpXCIgKm5nSWY9XCIhaXNFZGl0TW9kZVwiPkR1cGxpY2F0ZTwvYT48L2xpPlxyXG4gICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gY3Vyc29yLXBvaW50ZXIgdGV4dC1kYW5nZXJcIiAoY2xpY2spPVwib25EZWxldGUoKVwiPiBEZWxldGUgPC9hPlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFdhbGwgdHlwZSBmaXh0dXJlIGNyZWF0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiICpuZ0lmPVwiZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiPlxyXG4gICAgPCEtLSBXYWxsIEZpeHR1cmUgRm9ybSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxoMj5GaXh0dXJlIERldGFpbHM8L2gyPlxyXG4gICAgICAgIDxwPkNvbmZpZ3VyZSB5b3VyIGZpeHR1cmUgZGV0YWlscyBoZXJlPC9wPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwid2FsbEZpeHR1cmVGb3JtXCI+XHJcbiAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbiAjYWNjb3JkaW9uPVwibmdiQWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgIDwhLS0gQmFzaWMgRGV0YWlscyAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZGV0YWlsc1wiIFtjb2xsYXBzZWRdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+QkFTSUMgREVUQUlMUzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYmFzaWNEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZml4dHVyZUNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5GaXh0dXJlIG5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZml4dHVyZUNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4dHVyZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgd2lkdGggKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIHdpZHRoIGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgaGVpZ2h0IChcIiArIChmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibGVuZ3RoXCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmFsbCBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNIZWFkZXJFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdoZWFkZXInKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbXMtNFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+SEVBREVSPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cImhlYWRlclwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNIZWFkZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIkhlaWdodCAoXCIgKyAoZml4dHVyZURldGFpbHMuaGVhZGVyPy5oZWlnaHQ/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwiaGVpZ2h0XCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdoZWFkZXIuaGVpZ2h0Jyk/LnRvdWNoZWQgJiYgd2FsbEZpeHR1cmVGb3JtLmdldCgnaGVhZGVyLmhlaWdodCcpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdoZWFkZXIuaGVpZ2h0Jyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQm9keSBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJib2R5XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIiBbY2hlY2tlZF09XCJpc0JvZHlFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdib2R5Jyk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1zLTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkJPRFk8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYm9keVwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNCb2R5RW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5ObyBvZiBzaGVsdmVzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1jb250YWluZXJcIiBbY2xhc3MuZGlzYWJsZS1jb3VudGVyXT1cIiFpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cInJlbW92ZVNoZWxmKCk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2hlbGZBcnJheS5sZW5ndGggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cImFkZFNoZWxmKCk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4xNTM4OSAyLjkxNjVWMTEuMDgzMk0zLjA3MDU2IDYuOTk5ODRIMTEuMjM3MlwiIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2hlbGZBcnJheS5sZW5ndGggPCAxICYmIGlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgc2hlbGYgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hlbGZBcnJheT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInNoZWxmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc2hlbGYgb2Ygc2hlbGZBcnJheT8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJyYXktZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5TaGVsZiB7eyBpICsgMSB9fTwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlU2hlbGYoaSk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cIiFpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwic2hlbGZUeXBlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hlbGYuZ2V0KCd0eXBlJyk/LnZhbHVlID09PSAndHJheSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+Tm8gb2Ygcm93czwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJub09mUm93c1wiIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaGVsZi5nZXQoJ25vT2ZSb3dzJyk/LnRvdWNoZWQgJiYgc2hlbGYuZ2V0KCdub09mUm93cycpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInNoZWxmLmdldCgnbm9PZlJvd3MnKT8uaGFzRXJyb3IoJ21pbicpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGF0IGxlYXN0IDEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaGVsZi5nZXQoJ3R5cGUnKT8udmFsdWUgIT09ICd2bW9ubHknXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5IGZvciBlYWNoIHJvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXBhY2l0eVwiIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaGVsZi5nZXQoJ3R5cGUnKT8udmFsdWUgIT09ICd2bW9ubHknICYmIHNoZWxmLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnRvdWNoZWQgJiYgc2hlbGYuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8uZXJyb3JzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzaGVsZi5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0IGNhcGFjaXR5IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZvb3RlciBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJmb290ZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiIFtjaGVja2VkXT1cImlzRm9vdGVyRW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VjdGlvbignZm9vdGVyJyk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1zLTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkZPT1RFUjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJmb290ZXJcIiBbY2xhc3MuZGlzYWJsZWRdPVwiIWlzRm9vdGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgXCJIZWlnaHQgKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZvb3Rlcj8uaGVpZ2h0Py51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cImhlaWdodFwiIFtzdGVwXT1cIjAuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnZm9vdGVyLmhlaWdodCcpPy50b3VjaGVkICYmIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Zvb3Rlci5oZWlnaHQnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnZm9vdGVyLmhlaWdodCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBGb290ZXIgaGVpZ2h0IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBXYWxsIEZpeHR1cmUgUHJldmlldyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbC04XCI+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoNzV2aCAtIDEyMHB4KTsgb3ZlcmZsb3cteTogYXV0b1wiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0JvZHlFbmFibGVkIHx8IGlzSGVhZGVyRW5hYmxlZCB8fCBpc0Zvb3RlckVuYWJsZWQ7IGVsc2UgZW1wdHlGaXh0dXJlXCJcclxuICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAge3sgbGVuZ3RoIH19IHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnZhbHVlXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBnYXAtNVwiICpuZ0lmPVwiaXNIZWFkZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYmxvY2tcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWluZm9cIj5cclxuICAgICAgICAgICAgICAgIDxwPkhFQURFUjwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEJvZHkgUHJldmlldyAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiAqbmdJZj1cImlzQm9keUVuYWJsZWQgJiYgc2hlbGZBcnJheS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBnYXAtNVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNoZWxmQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIEBpZihpdGVtLmdldCgndHlwZScpPy52YWx1ZSA9PT0nc2hlbGYnKXtcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrIHNoZWxmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgICAgU0hFTEYge3sgaSArIDEgfX0gPGIgY2xhc3M9XCJtcy0zXCI+UHJvZHVjdHM6IHt7IGl0ZW0uZ2V0KFwicHJvZHVjdENhcGFjaXR5XCIpPy52YWx1ZSB9fTwvYj5cclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgnbm9PZlJvd3MnKT8udmFsdWUpXCIgY2xhc3M9XCJ0cmF5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy52YWx1ZSlcIiBjbGFzcz1cInByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIFNIRUxGIHt7IGkgKyAxIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGIgY2xhc3M9XCJtcy0zXCI+UHJvZHVjdHM6XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgKiAoaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgPz8gMSkgfX08L2I+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRm9vdGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTVcIiAqbmdJZj1cImlzRm9vdGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyIGZvb3Rlci1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgaC0xMDAgZ2FwLTMgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBzdWItZm9vdGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc3ViLWZvb3RlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8cD5GT09URVI8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eUZpeHR1cmU+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtbiBoLTEwMFwiPlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YW1haW50ZXh0IG10LTNcIj5QcmV2aWV3IHJlcXVpcmVzIGhlYWRlciwgZm9vdGVyLCBvciBib2R5IGJsb2NrIGVuYWJsZWQuPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFzdWJ0ZXh0XCI+UGxlYXNlIGVuYWJsZSBlaXRoZXIgdGhlIGhlYWRlciwgZm9vdGVyLCBvciBib2R5IHRvIHZpZXcgdGhlIHByZXZpZXcuLjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIEluZm8gQ2FyZHMgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPnt7IHNoZWxmQXJyYXkubGVuZ3RoIH19PC9oMz5cclxuICAgICAgICAgIDxwPk5vIG9mIFNoZWx2ZXM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IHdhbGxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIik/LnZhbHVlIH19IHhcclxuICAgICAgICAgICAge3sgd2FsbEZpeHR1cmVGb3JtLmdldChcImJhc2ljRGV0YWlscy5sZW5ndGhcIik/LnZhbHVlIH19IGZlZXRcclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBGbG9vciB0eXBlIGZpeHR1cmUgY3JlYXRpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBnYXAtNCBidWlsZGVyXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ2Zsb29yJ1wiPlxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBGb3JtIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGgyPkZpeHR1cmUgRGV0YWlsczwvaDI+XHJcbiAgICAgICAgPHA+VGhlIHNldHRpbmdzIGFyZSBwcmUtY29uZmlndXJlZCBhbmQgY2Fubm90IGJlIGVkaXRlZDwvcD5cclxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZsb29yRml4dHVyZUZvcm1cIj5cclxuICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uICNhY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgPCEtLSBCYXNpYyBEZXRhaWxzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJkZXRhaWxzXCIgW2NvbGxhcHNlZF09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5CQVNJQyBERVRBSUxTPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJiYXNpY0RldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkZpeHR1cmUgbmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJmaXh0dXJlQ2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVDYXRlZ29yeVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXh0dXJlIG5hbWUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWxsb3dlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgXCJPdmVyYWxsIHdpZHRoIChcIiArIChmaXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJ3aWR0aFwiIFtzdGVwXT1cIjAuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJhbGwgd2lkdGggY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgXCJPdmVyYWxsIGxlbmd0aCAoXCIgKyAoZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cImxlbmd0aFwiIFtzdGVwXT1cIjAuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJhbGwgaGVpZ2h0IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFBhbmVsIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cInBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPlBBTkVMPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHBhbmVsczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWNvbnRhaW5lclwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgcm9sZT1cImJ1dHRvblwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTUgMTRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cInJlbW92ZVBhbmVsKCk7IGZsb29yRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjc2Mjk0IDdIMTEuOTI5NlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcGFuZWxBcnJheS5sZW5ndGggfX08L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgcm9sZT1cImJ1dHRvblwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTUgMTRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cImFkZFBhbmVsKCk7IGZsb29yRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjE1Mzg5IDIuOTE2NVYxMS4wODMyTTMuMDcwNTYgNi45OTk4NEgxMS4yMzcyXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsQXJyYXkubGVuZ3RoIDwgMSAmJiBpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYW5lbCBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYW5lbEFycmF5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHBhbmVsIG9mIHBhbmVsQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcnJheS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cInNoZWxmLXRpdGxlXCI+UGFuZWwge3sgaSArIDEgfX08L2g2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cInJlbW92ZVBhbmVsKGkpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE4IDZMNiAxOE02IDZMMTggMThcIiBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicGFuZWxOYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwicGFuZWxOYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbC5nZXQoJ3BhbmVsTmFtZScpPy50b3VjaGVkICYmIHBhbmVsLmdldCgncGFuZWxOYW1lJyk/LmVycm9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWwuZ2V0KCdwYW5lbE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lbCBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWwuZ2V0KCdwYW5lbE5hbWUnKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhbmVsIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncGFuZWxOYW1lJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWxsb3dlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+Tm8gb2Ygcm93czwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJub09mUm93c1wiIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbC5nZXQoJ25vT2ZSb3dzJyk/LnRvdWNoZWQgJiYgcGFuZWwuZ2V0KCdub09mUm93cycpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ25vT2ZSb3dzJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGF0IGxlYXN0IDEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlByb2R1Y3QgY2FwYWNpdHkgZm9yIGVhY2ggcm93PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXBhY2l0eVwiIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy50b3VjaGVkICYmIHBhbmVsLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LmVycm9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0IGNhcGFjaXR5IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEZsb29yIFBhbmVsIFByZXZpZXcgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29scyBjb2wtOFwiPlxyXG4gICAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiBjYWxjKDc1dmggLSAxMjBweCk7IG92ZXJmbG93LXk6IGF1dG9cIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwicGFuZWxBcnJheS5jb250cm9scy5sZW5ndGg7IGVsc2Ugbm9QYW5lbFwiIGNsYXNzPVwiZmxvb3ItcGFuZWwtdmlld3BvcnQgdy0xMDBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtc3RhcnRcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYW5lbEFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJkLWZsZXggZ2FwLTVcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmVydGljYWwtZGltZW5zaW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgdXBcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udmFsdWUgYXMgbGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgbGVuZ3RoIH19IHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbkFycm93cztcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgnbm9PZlJvd3MnKT8udmFsdWUpXCIgY2xhc3M9XCJwYW5lbCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgUEFORUwge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOlxyXG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgKiAoaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgPz8gMSkgfX08L2I+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTUgbXQtNVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDI0cHhcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDY0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDUzMCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk01MjIuNjUzIDAuMjkyODkzQzUyMi4yNjMgLTAuMDk3NjMxNSA1MjEuNjMgLTAuMDk3NjMxNCA1MjEuMjM5IDAuMjkyODkzTDUxNC44NzUgNi42NTY4NUM1MTQuNDg1IDcuMDQ3MzggNTE0LjQ4NSA3LjY4MDU0IDUxNC44NzUgOC4wNzEwN0M1MTUuMjY2IDguNDYxNTkgNTE1Ljg5OSA4LjQ2MTU5IDUxNi4yODkgOC4wNzEwN0w1MjEuOTQ2IDIuNDE0MjFMNTI3LjYwMyA4LjA3MTA3QzUyNy45OTQgOC40NjE1OSA1MjguNjI3IDguNDYxNTkgNTI5LjAxNyA4LjA3MTA3QzUyOS40MDggNy42ODA1NCA1MjkuNDA4IDcuMDQ3MzggNTI5LjAxNyA2LjY1Njg1TDUyMi42NTMgMC4yOTI4OTNaTTUyMi45NDYgMTRMNTIyLjk0NiAxTDUyMC45NDYgMUw1MjAuOTQ2IDE0TDUyMi45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0zOTQuMTUzIDAuMjkyODkzQzM5My43NjMgLTAuMDk3NjMxNSAzOTMuMTMgLTAuMDk3NjMxNCAzOTIuNzM5IDAuMjkyODkzTDM4Ni4zNzUgNi42NTY4NUMzODUuOTg1IDcuMDQ3MzggMzg1Ljk4NSA3LjY4MDU0IDM4Ni4zNzUgOC4wNzEwN0MzODYuNzY2IDguNDYxNTkgMzg3LjM5OSA4LjQ2MTU5IDM4Ny43ODkgOC4wNzEwN0wzOTMuNDQ2IDIuNDE0MjFMMzk5LjEwMyA4LjA3MTA3QzM5OS40OTQgOC40NjE1OSA0MDAuMTI3IDguNDYxNTkgNDAwLjUxNyA4LjA3MTA3QzQwMC45MDggNy42ODA1NCA0MDAuOTA4IDcuMDQ3MzggNDAwLjUxNyA2LjY1Njg1TDM5NC4xNTMgMC4yOTI4OTNaTTM5NC40NDYgMTRMMzk0LjQ0NiAxTDM5Mi40NDYgMUwzOTIuNDQ2IDE0TDM5NC40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0yNjUuNjUzIDAuMjkyODkzQzI2NS4yNjMgLTAuMDk3NjMxNSAyNjQuNjMgLTAuMDk3NjMxNCAyNjQuMjM5IDAuMjkyODkzTDI1Ny44NzUgNi42NTY4NUMyNTcuNDg1IDcuMDQ3MzggMjU3LjQ4NSA3LjY4MDU0IDI1Ny44NzUgOC4wNzEwN0MyNTguMjY2IDguNDYxNTkgMjU4Ljg5OSA4LjQ2MTU5IDI1OS4yODkgOC4wNzEwN0wyNjQuOTQ2IDIuNDE0MjFMMjcwLjYwMyA4LjA3MTA3QzI3MC45OTQgOC40NjE1OSAyNzEuNjI3IDguNDYxNTkgMjcyLjAxNyA4LjA3MTA3QzI3Mi40MDggNy42ODA1NCAyNzIuNDA4IDcuMDQ3MzggMjcyLjAxNyA2LjY1Njg1TDI2NS42NTMgMC4yOTI4OTNaTTI2NS45NDYgMTRMMjY1Ljk0NiAxTDI2My45NDYgMUwyNjMuOTQ2IDE0TDI2NS45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0xMzcuMTUzIDAuMjkyODkzQzEzNi43NjMgLTAuMDk3NjMxNSAxMzYuMTMgLTAuMDk3NjMxNCAxMzUuNzM5IDAuMjkyODkzTDEyOS4zNzUgNi42NTY4NUMxMjguOTg1IDcuMDQ3MzggMTI4Ljk4NSA3LjY4MDU0IDEyOS4zNzUgOC4wNzEwN0MxMjkuNzY2IDguNDYxNTkgMTMwLjM5OSA4LjQ2MTU5IDEzMC43ODkgOC4wNzEwN0wxMzYuNDQ2IDIuNDE0MjFMMTQyLjEwMyA4LjA3MTA3QzE0Mi40OTQgOC40NjE1OSAxNDMuMTI3IDguNDYxNTkgMTQzLjUxNyA4LjA3MTA3QzE0My45MDggNy42ODA1NCAxNDMuOTA4IDcuMDQ3MzggMTQzLjUxNyA2LjY1Njg1TDEzNy4xNTMgMC4yOTI4OTNaTTEzNy40NDYgMTRMMTM3LjQ0NiAxTDEzNS40NDYgMUwxMzUuNDQ2IDE0TDEzNy40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk04LjY1MzQgMC4yOTI4OTNDOC4yNjI4NyAtMC4wOTc2MzE1IDcuNjI5NzEgLTAuMDk3NjMxNCA3LjIzOTE4IDAuMjkyODkzTDAuODc1MjIxIDYuNjU2ODVDMC40ODQ2OTcgNy4wNDczOCAwLjQ4NDY5NyA3LjY4MDU0IDAuODc1MjIxIDguMDcxMDdDMS4yNjU3NSA4LjQ2MTU5IDEuODk4OTEgOC40NjE1OSAyLjI4OTQzIDguMDcxMDdMNy45NDYyOSAyLjQxNDIxTDEzLjYwMzEgOC4wNzEwN0MxMy45OTM3IDguNDYxNTkgMTQuNjI2OCA4LjQ2MTU5IDE1LjAxNzQgOC4wNzEwN0MxNS40MDc5IDcuNjgwNTQgMTUuNDA3OSA3LjA0NzM4IDE1LjAxNzQgNi42NTY4NUw4LjY1MzQgMC4yOTI4OTNaTTguOTQ2MjkgMTRMOC45NDYyOSAxTDYuOTQ2MjkgMUw2Ljk0NjI5IDE0TDguOTQ2MjkgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTdcIiBoZWlnaHQ9XCI0M1wiIHZpZXdCb3g9XCIwIDAgNTcgNDNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMC40Mzk2OTcgMzEuODA4N0MwLjQzOTY5NyAyNi44NjQgNC40NDgyIDIyLjg1NTUgOS4zOTI5NCAyMi44NTU1SDQ3LjQ2ODFDNTIuNDIzIDIyLjg1NTUgNTYuNDM5NyAyNi44NzIyIDU2LjQzOTcgMzEuODI3QzU2LjQzOTcgMzcuMzI1NSA1MS41MzczIDQxLjQ5OTQgNDYuMDc2NSA0MC44NTcxQzMzLjYzMTggMzkuMzkzNSAyMy43MjY3IDM5LjMyMDYgMTAuODE4NiA0MC44Mzc2QzUuMzU1NDIgNDEuNDc5NiAwLjQzOTY5NyAzNy4zMDk1IDAuNDM5Njk3IDMxLjgwODdaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxRDI5MzlcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjI4LjQ0MDhcIiBjeT1cIjE2LjU3MTRcIiByPVwiMTUuMDcxNFwiIGZpbGw9XCIjMUQyOTM5XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIzXCIgLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub1BhbmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW4gaC0xMDBcIj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+QWRkIGEgcGFuZWwgdG8gc2VlIHlvdXIgcHJldmlldy48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YXN1YnRleHRcIj5UbyBzZWUgeW91ciBwcmV2aWV3LCBwbGVhc2UgYWRkIGF0IGxlYXN0IG9uZSBwYW5lbC48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBwYW5lbEFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBQYW5lbHM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLmxlbmd0aFwiKT8udmFsdWUgfX1cclxuICAgICAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX1cclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlLXNrZWxldG9uXCIgKm5nSWY9XCJpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjwhLS0gQ29tbW9uIGRpbWVuc2lvbiBhcnJvd3MgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZGltZW5zaW9uQXJyb3dzIGxldC1sYWJlbD1cImxhYmVsXCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cclxuICA8ZGl2IGNsYXNzPVwiaG9yaXpvbnRhbC1kaW1lbnNpb25cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBsZWZ0XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInZhbHVlXCI+e3sgdmFsdWUgfX0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyByaWdodFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|