tango-app-ui-store-builder 1.0.47 → 1.0.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +39 -19
  2. package/esm2022/lib/components/create-fixture/create-fixture.component.mjs +233 -138
  3. package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +4 -2
  4. package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +4 -2
  5. package/esm2022/lib/components/fixture-template/template-basic-details/template-basic-details.component.mjs +40 -4
  6. package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +3 -3
  7. package/esm2022/lib/components/fixture-template/template-summary/template-summary.component.mjs +3 -3
  8. package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +108 -79
  9. package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +7 -3
  10. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +4 -2
  11. package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +27 -4
  12. package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +3 -3
  13. package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +10 -14
  14. package/esm2022/lib/components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component.mjs +3 -3
  15. package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +3 -3
  16. package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +4 -2
  17. package/esm2022/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.mjs +11 -5
  18. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +14 -9
  19. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.mjs +39 -7
  20. package/esm2022/lib/components/planogram/merch-compliance/zone-products/zone-products.component.mjs +18 -5
  21. package/esm2022/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.mjs +68 -0
  22. package/esm2022/lib/components/planogram/plano-analytics/date-range-picker/date-range-picker.component.mjs +5 -5
  23. package/esm2022/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.mjs +649 -0
  24. package/esm2022/lib/components/planogram/plano-analytics/plano-analytics.component.mjs +1197 -25
  25. package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +14 -7
  26. package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +8 -4
  27. package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +17 -9
  28. package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +3 -3
  29. package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -2
  30. package/esm2022/lib/components/store-plano/store-plano.component.mjs +4 -2
  31. package/esm2022/lib/interfaces/fixture-library.interface.mjs +1 -1
  32. package/esm2022/lib/services/store-builder.service.mjs +4 -1
  33. package/esm2022/lib/tango-store-builder.module.mjs +8 -2
  34. package/fesm2022/tango-app-ui-store-builder.mjs +2996 -834
  35. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  36. package/lib/components/create-fixture/create-fixture.component.d.ts +15 -14
  37. package/lib/components/fixture-template/template-basic-details/template-basic-details.component.d.ts +2 -0
  38. package/lib/components/fixture-template/template-vms/template-vms.component.d.ts +12 -12
  39. package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +2 -2
  40. package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +4 -4
  41. package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +2 -0
  42. package/lib/components/manage-store-plano/template-vms/template-vms.component.d.ts +0 -1
  43. package/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.d.ts +4 -2
  44. package/lib/components/planogram/merch-compliance/product-locator/product-locator.component.d.ts +3 -2
  45. package/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.d.ts +10 -3
  46. package/lib/components/planogram/merch-compliance/zone-products/zone-products.component.d.ts +4 -2
  47. package/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.d.ts +25 -0
  48. package/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.d.ts +94 -0
  49. package/lib/components/planogram/plano-analytics/plano-analytics.component.d.ts +76 -3
  50. package/lib/components/planogram/plano-details-parent/plano-details-parent.component.d.ts +3 -2
  51. package/lib/interfaces/fixture-library.interface.d.ts +1 -1
  52. package/lib/services/store-builder.service.d.ts +1 -0
  53. package/lib/tango-store-builder.module.d.ts +26 -24
  54. package/package.json +1 -1
@@ -0,0 +1,649 @@
1
+ import { Component, EventEmitter, Input, Output, } from "@angular/core";
2
+ import { lastValueFrom, Subject, takeUntil } from "rxjs";
3
+ import { ZoneProductsComponent } from "../../merch-compliance/zone-products/zone-products.component";
4
+ import { AnalyticsPopupComponent } from "../analytics-popup/analytics-popup.component";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../../../services/store-builder.service";
7
+ import * as i2 from "tango-app-ui-global";
8
+ import * as i3 from "@ng-bootstrap/ng-bootstrap";
9
+ import * as i4 from "@angular/common";
10
+ import * as i5 from "@angular/forms";
11
+ export class FixtureAnalyticsComponent {
12
+ storeBuilderService;
13
+ gs;
14
+ cd;
15
+ ngbModal;
16
+ fixtureDetails;
17
+ vmList = [];
18
+ floorData;
19
+ startDate;
20
+ endDate;
21
+ dataType;
22
+ onClose = new EventEmitter();
23
+ changeFixture = new EventEmitter();
24
+ fixtureTemplateDetails;
25
+ clientId;
26
+ imgCDN;
27
+ zoneColor = {
28
+ right: {
29
+ bg: "#ffffff",
30
+ text: "#12B76A",
31
+ border: "#32D583",
32
+ productBorder: "#12B76A",
33
+ productBg: "#FCFCFD",
34
+ },
35
+ wrong: {
36
+ bg: "#ffffff",
37
+ text: "#F04438",
38
+ border: "#98a2b3",
39
+ productBorder: "#F04438",
40
+ productBg: "#FECDCA",
41
+ },
42
+ };
43
+ sectionByZones = [];
44
+ isPageLoading = true;
45
+ showVMs = true;
46
+ isVMInitialized = false;
47
+ isBCInitialized = false;
48
+ destroy$ = new Subject();
49
+ engagersList;
50
+ fixtureFootfall;
51
+ constructor(storeBuilderService, gs, cd, ngbModal) {
52
+ this.storeBuilderService = storeBuilderService;
53
+ this.gs = gs;
54
+ this.cd = cd;
55
+ this.ngbModal = ngbModal;
56
+ }
57
+ ngOnInit() {
58
+ this.isPageLoading = true;
59
+ this.gs.environment
60
+ .pipe(takeUntil(this.destroy$))
61
+ .subscribe((env) => (this.imgCDN = env.planogramCDN));
62
+ this.gs.dataRangeValue
63
+ .pipe(takeUntil(this.destroy$))
64
+ .subscribe(async (data) => {
65
+ if (data?.client) {
66
+ this.clientId = data?.client;
67
+ }
68
+ else {
69
+ let headerData = JSON.parse(localStorage.getItem("header-filters"));
70
+ this.clientId = headerData?.client;
71
+ }
72
+ });
73
+ }
74
+ getEngagersList() {
75
+ this.engagersList = null;
76
+ let payload = {
77
+ from_date: this.startDate,
78
+ to_date: this.endDate,
79
+ fixtureId: this.fixtureDetails._id,
80
+ };
81
+ this.storeBuilderService
82
+ .getStoreFixtureEngagers(payload)
83
+ .pipe(takeUntil(this.destroy$))
84
+ .subscribe((res) => {
85
+ if (res && res.code == 200) {
86
+ this.engagersList = res?.data?.data || {};
87
+ console.log(this.engagersList, "this.engagersList");
88
+ }
89
+ });
90
+ }
91
+ topEngagers() {
92
+ return this.engagersList?.["Top Engaged"]?.slice(0, 3);
93
+ }
94
+ leastEngagers() {
95
+ return [
96
+ ...this.engagersList?.["Non Engaged"],
97
+ ...this.engagersList?.["Least Engaged"],
98
+ ]?.slice(0, 3);
99
+ }
100
+ getFixtureFootfall() {
101
+ this.fixtureFootfall = null;
102
+ let payload = {
103
+ fromDate: this.startDate,
104
+ toDate: this.endDate,
105
+ storeId: [this.floorData.storeId],
106
+ zone: `Fixture ${this.fixtureDetails?.fixtureNumber}`,
107
+ dataType: this.dataType
108
+ };
109
+ this.storeBuilderService
110
+ .getStoreFixtureFootfall(payload)
111
+ .pipe(takeUntil(this.destroy$))
112
+ .subscribe((res) => {
113
+ console.log(res, 'res');
114
+ if (res && res.code == 200) {
115
+ this.fixtureFootfall = res?.data?.card || {};
116
+ }
117
+ });
118
+ }
119
+ async ngOnChanges(changes) {
120
+ if (changes["fixtureDetails"]?.currentValue) {
121
+ this.getEngagersList();
122
+ this.getFixtureFootfall();
123
+ await this.getFixtureShelfDetails(changes["fixtureDetails"].currentValue);
124
+ setTimeout(() => {
125
+ this.applyShelfColors();
126
+ this.handleVmPositionAndSize();
127
+ }, 200);
128
+ }
129
+ }
130
+ ngAfterViewChecked() {
131
+ if (!this.isBCInitialized) {
132
+ this.isBCInitialized = this.applyShelfColors();
133
+ }
134
+ if (!this.isVMInitialized) {
135
+ this.isVMInitialized = this.handleVmPositionAndSize();
136
+ }
137
+ }
138
+ async getFixtureShelfDetails(data) {
139
+ this.isPageLoading = true;
140
+ let payload = {
141
+ fixtureId: data?._id,
142
+ planoId: data?.planoId,
143
+ floorId: data?.floorId,
144
+ compliance: true,
145
+ ...(this.fixtureDetails?.revisionId && {
146
+ revisionId: this.fixtureDetails.revisionId,
147
+ }),
148
+ };
149
+ try {
150
+ const res = await lastValueFrom(this.storeBuilderService.getShelfDetails(payload));
151
+ if (res?.status === "success" && res?.data) {
152
+ this.fixtureTemplateDetails = {
153
+ ...res?.data,
154
+ shelfConfig: res?.data?.shelves ?? [],
155
+ };
156
+ this.fixtureTemplateDetails.shelfConfig =
157
+ this.fixtureTemplateDetails.shelfConfig.map((s) => {
158
+ if (s.shelfType !== "shelf" && s.products?.length) {
159
+ s.distributedRows = this.distributeRoundRobin(s.products, s.trayRows);
160
+ }
161
+ return s;
162
+ });
163
+ const allProducts = (this.fixtureTemplateDetails?.shelfConfig ?? []).flatMap((s) => s.products ?? []);
164
+ allProducts.forEach((p, i) => {
165
+ if (!p?.productId) {
166
+ p["productId"] = i;
167
+ }
168
+ });
169
+ }
170
+ }
171
+ catch (error) {
172
+ console.log("@@ ~ getFixtureShelfDetails [ERR]:", error);
173
+ }
174
+ finally {
175
+ this.isPageLoading = false;
176
+ }
177
+ }
178
+ getSelectedVM(vm) {
179
+ return this.vmList.find((v) => v.id === vm?.vmId);
180
+ }
181
+ handleVmPositionAndSize() {
182
+ const viewPort = document.getElementById("body-block-sum");
183
+ if (!viewPort)
184
+ return false;
185
+ const bodyWidth = viewPort.offsetWidth;
186
+ const header = document.getElementById("header-block");
187
+ const footer = document.getElementById("footer-block");
188
+ header.style.width = `${bodyWidth}px`;
189
+ footer.style.width = `${bodyWidth}px`;
190
+ this.fixtureTemplateDetails?.vmConfig?.forEach((e, i) => {
191
+ let startShelf = e?.startYPosition ?? 1;
192
+ let endShelf = e?.endYPosition ??
193
+ this.fixtureTemplateDetails?.shelfConfig?.length ??
194
+ 1;
195
+ const vm = viewPort.querySelector(`#vm${i}`);
196
+ if (!vm)
197
+ return;
198
+ let x = 0;
199
+ let y = 0;
200
+ let yStart = 0;
201
+ for (let k = 1; k < startShelf; k++) {
202
+ const s = getShelfDiv(k);
203
+ if (!s)
204
+ return;
205
+ yStart += s.offsetHeight;
206
+ }
207
+ let placementHeight = 0;
208
+ let placementWidth = bodyWidth;
209
+ for (let k = startShelf; k <= endShelf; k++) {
210
+ const s = getShelfDiv(k);
211
+ if (!s)
212
+ return;
213
+ placementHeight += s.offsetHeight;
214
+ }
215
+ let defaultW = placementWidth / 3;
216
+ let defaultH = placementHeight / 3;
217
+ let width = defaultW;
218
+ let height = defaultH;
219
+ switch (e?.xZone) {
220
+ case "left":
221
+ x = 0;
222
+ width = defaultW;
223
+ break;
224
+ case "right":
225
+ width = defaultW;
226
+ x = bodyWidth - width;
227
+ break;
228
+ case "middle":
229
+ width = defaultW;
230
+ x = (bodyWidth - width) / 2;
231
+ break;
232
+ case "stretch":
233
+ width = bodyWidth;
234
+ x = 0;
235
+ break;
236
+ }
237
+ switch (e?.yZone) {
238
+ case "top":
239
+ height = placementHeight < defaultH ? placementHeight - 20 : defaultH;
240
+ y = yStart;
241
+ break;
242
+ case "middle":
243
+ height = placementHeight < defaultH ? placementHeight - 20 : defaultH;
244
+ y = (placementHeight - height) / 2 + yStart;
245
+ break;
246
+ case "bottom":
247
+ height = placementHeight < defaultH ? placementHeight - 20 : defaultH;
248
+ y = placementHeight - height + yStart;
249
+ break;
250
+ case "stretch":
251
+ height = placementHeight;
252
+ y = yStart;
253
+ break;
254
+ }
255
+ vm.style.width = `${width}px`;
256
+ vm.style.height = ` ${height}px`;
257
+ vm.style.transform = `translate(${x}px, ${y}px)`;
258
+ function getShelfDiv(k) {
259
+ let div = viewPort.querySelector(`#shelf${k}`);
260
+ if (!div)
261
+ div = viewPort.querySelector(`#tray${k}`);
262
+ return div;
263
+ }
264
+ });
265
+ return true;
266
+ }
267
+ applyShelfColors() {
268
+ const bodies = document.getElementById("body-block-sum");
269
+ if (!bodies)
270
+ return false;
271
+ const bodyWidth = bodies.offsetWidth;
272
+ const bodyChildren = Array.from(bodies?.children ?? []);
273
+ const shelfDivs = bodyChildren
274
+ .map((div) => div)
275
+ .filter((d) => d?.id.includes("sumShelfContainer"));
276
+ if (!shelfDivs)
277
+ return false;
278
+ const adjust = 0;
279
+ switch (this.fixtureTemplateDetails?.productResolutionLevel) {
280
+ case "L1": //fixture
281
+ // const allProducts = (
282
+ // this.fixtureTemplateDetails?.shelves ?? []
283
+ // ).flatMap((s: any) => s.products ?? []);
284
+ // const isImproper =
285
+ // allProducts.length == 0
286
+ // ? true
287
+ // : allProducts.some(
288
+ // (p: any) =>
289
+ // p.status === "misplaced" ||
290
+ // p.status === "missing" ||
291
+ // p.status === ""
292
+ // );
293
+ // shelfDivs.forEach((d) => {
294
+ // if (d) {
295
+ // const blockDiv = d.querySelector(".block") as HTMLElement;
296
+ // if (blockDiv) {
297
+ // blockDiv.style.borderColor = isImproper
298
+ // ? this.zoneColor.wrong.border
299
+ // : this.zoneColor.right.border;
300
+ // blockDiv.style.backgroundColor = isImproper
301
+ // ? this.zoneColor.wrong.bg
302
+ // : this.zoneColor.right.bg;
303
+ // }
304
+ // }
305
+ // });
306
+ // const l1 = document.getElementById("fixture-level") as HTMLElement;
307
+ // if (l1) {
308
+ // const bc = l1.querySelector(".brand-category") as HTMLElement;
309
+ // if (bc) {
310
+ // if (isImproper) {
311
+ // bc.classList.add("wrong");
312
+ // } else {
313
+ // bc.classList.remove("wrong");
314
+ // }
315
+ // }
316
+ // }
317
+ break;
318
+ case "L3": //section
319
+ {
320
+ const shelves = shelfDivs
321
+ .map((div) => div.lastElementChild?.tagName.toLowerCase() === "div"
322
+ ? div.lastElementChild
323
+ : null)
324
+ .filter(Boolean);
325
+ this.constructSequentialSection(shelves);
326
+ const sectionArray = this.groupShelvesByZone(this.fixtureTemplateDetails?.shelfConfig ?? []);
327
+ const allSectionShelves = [];
328
+ sectionArray.forEach((se, i) => {
329
+ const shelfIds = se.shelves?.map((sh) => sh.replace(/\s/g, "").toLowerCase()) ??
330
+ [];
331
+ allSectionShelves.push(...shelfIds);
332
+ const secDivs = shelves.filter((item) => shelfIds?.includes(item?.id ?? ""));
333
+ const currentSe = this.sectionByZones.find((s) => s.zone === se.zone);
334
+ secDivs.forEach((d, i) => {
335
+ // if (d) d.style.backgroundColor = this.shelfColors[i].bg;
336
+ if (d) {
337
+ d.style.backgroundColor = currentSe?.section.improper
338
+ ? this.zoneColor.wrong.bg
339
+ : this.zoneColor.right.bg;
340
+ d.style.borderRight = `2px solid`;
341
+ d.style.borderLeft = `2px solid`;
342
+ if (secDivs.length == 1) {
343
+ d.style.border = `2px solid`;
344
+ }
345
+ else if (secDivs.length > 1 && secDivs.length <= 2) {
346
+ if (i == 0) {
347
+ d.style.borderTop = `1px solid`;
348
+ d.style.borderBottom = `0.5px dotted`;
349
+ }
350
+ else if (i == secDivs.length - 1) {
351
+ d.style.borderBottom = `1px solid`;
352
+ }
353
+ }
354
+ else {
355
+ if (i == 0) {
356
+ d.style.borderTop = `1px solid`;
357
+ }
358
+ else if (i == secDivs.length - 1) {
359
+ d.style.borderBottom = `1px solid`;
360
+ }
361
+ else {
362
+ d.style.borderTop = `0.5px dotted`;
363
+ d.style.borderBottom = `0.5px dotted`;
364
+ }
365
+ }
366
+ d.style.borderColor = currentSe?.section.improper
367
+ ? this.zoneColor.wrong.border
368
+ : this.zoneColor.right.border;
369
+ }
370
+ });
371
+ });
372
+ const unassignedShelves = shelfDivs.filter((item) => !allSectionShelves.includes(item.id));
373
+ unassignedShelves.forEach((d) => (d.style.backgroundColor = "white"));
374
+ let sectionGroupHeight = 0;
375
+ setTimeout(() => {
376
+ this.sectionByZones.forEach((sz, i) => {
377
+ const currentSectionHeight = sz.section.shelfDivs.reduce((h, d) => h + (d?.offsetHeight ?? 0), 0);
378
+ const currentSectionWidth = sz.section.shelfDivs[0]?.offsetWidth ?? 345;
379
+ const bc = bodies.querySelector(`#brand-category${i}`);
380
+ if (bc) {
381
+ // const secBg = rgbToHex(
382
+ // sz.section.shelfDivs[0]?.style.backgroundColor
383
+ // );
384
+ // const color =
385
+ // this.shelfColors.find((c) => c.bg === secBg) ??
386
+ // this.shelfColors[i];
387
+ // bc.style.borderColor = this.zoneColor.right.border;
388
+ bc.style.backgroundColor = "#fff";
389
+ // const bcX = (currentSectionWidth - bc.offsetWidth) / 2;
390
+ const bcX = bodyWidth + 16;
391
+ const bcY = (currentSectionHeight - bc.offsetHeight) / 2 +
392
+ sectionGroupHeight;
393
+ bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;
394
+ sectionGroupHeight += currentSectionHeight;
395
+ }
396
+ });
397
+ const storeBox = document.getElementById("storage-box-zone");
398
+ const align = bodyWidth + 16;
399
+ if (storeBox) {
400
+ storeBox.style.left = `${align}px`;
401
+ }
402
+ }, 0);
403
+ }
404
+ break;
405
+ case "L2": //shelf
406
+ {
407
+ shelfDivs.forEach((div, i) => {
408
+ // div.style.backgroundColor = this.zoneColor.right.bg;
409
+ // div.style.border = `1.4px solid ${this.zoneColor.right.border}`;
410
+ // if (this.showVMs) return false;
411
+ const bc = div.querySelector(`#brand-category${i}`);
412
+ if (!bc)
413
+ return;
414
+ const bcX = (div.offsetWidth - bc.offsetWidth) / 2;
415
+ const bcY = (div.offsetHeight - bc.offsetHeight) / 2;
416
+ // bc.style.borderColor = this.zoneColor.right.border;
417
+ // bc.style.backgroundColor = this.zoneColor.right.bg;
418
+ bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;
419
+ });
420
+ }
421
+ break;
422
+ case "L4": //spot
423
+ default:
424
+ // shelfDivs.forEach((d) => {
425
+ // if (d) d.style.backgroundColor = this.zoneColor.right.bg;
426
+ // });
427
+ break;
428
+ }
429
+ return true;
430
+ }
431
+ constructSequentialSection(shelfDivs) {
432
+ const newSectionByZones = [];
433
+ let pZone = null;
434
+ for (const s of this.fixtureTemplateDetails?.shelfConfig ?? []) {
435
+ const zone = s.zone || "";
436
+ const shelfId = `${s.shelfType}${s.shelfNumber}`;
437
+ const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);
438
+ if (zone === "")
439
+ continue;
440
+ const hasImproperProduct = (s?.products?.length ?? 0) === 0 ||
441
+ (s?.products ?? []).some((p) => p.status !== "proper");
442
+ const missCount = (s?.products ?? []).filter((p) => p.status === "missing").length;
443
+ const misplacedCount = (s?.products ?? []).filter((p) => p.status === "misplaced").length;
444
+ const shelfCapacity = s.shelfType === "tray"
445
+ ? s.productPerShelf * s.trayRows
446
+ : s.productPerShelf;
447
+ if (zone !== pZone) {
448
+ newSectionByZones.push({
449
+ zone,
450
+ section: {
451
+ brands: s.productBrandName ?? [],
452
+ categories: s.productCategory ?? [],
453
+ shelves: [shelfId],
454
+ shelfDivs: [shelfDiv],
455
+ products: structuredClone(s?.products) ?? [],
456
+ improper: hasImproperProduct,
457
+ misplaced: misplacedCount,
458
+ missing: missCount,
459
+ capacity: shelfCapacity,
460
+ },
461
+ });
462
+ pZone = zone;
463
+ }
464
+ else {
465
+ const section = newSectionByZones[newSectionByZones.length - 1].section;
466
+ section.shelves.push(shelfId);
467
+ section.shelfDivs.push(shelfDiv);
468
+ section.products.push(...s.products);
469
+ section.capacity += shelfCapacity;
470
+ if (hasImproperProduct)
471
+ section.improper = true;
472
+ section.missing += missCount;
473
+ section.misplaced += misplacedCount;
474
+ }
475
+ }
476
+ // if (this.fixtureTemplateDetails?.storageProducts?.length) {
477
+ // const storageProducts = this.fixtureTemplateDetails.storageProducts;
478
+ // newSectionByZones.push({
479
+ // zone: "Storage",
480
+ // section: {
481
+ // brands: storageProducts.map((p: any) => p.brandName),
482
+ // categories: storageProducts.map((p: any) => p.brandName),
483
+ // shelves: [],
484
+ // shelfDivs: [],
485
+ // products: structuredClone(storageProducts) ?? [],
486
+ // improper: false,
487
+ // hasMisplaced: false,
488
+ // hasMissing: false,
489
+ // capacity: storageProducts.length,
490
+ // },
491
+ // });
492
+ // }
493
+ this.sectionByZones = [...newSectionByZones];
494
+ this.cd.detectChanges();
495
+ }
496
+ groupShelvesByZone(input) {
497
+ const zoneMap = {};
498
+ for (const item of input) {
499
+ const zone = item?.zone ?? "";
500
+ const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;
501
+ if (!zoneMap[zone]) {
502
+ zoneMap[zone] = {
503
+ shelves: [],
504
+ productBrandName: this.fixtureTemplateDetails?.productResolutionLevel === "L2"
505
+ ? item.productBrandName
506
+ : [],
507
+ productCategory: this.fixtureTemplateDetails?.productResolutionLevel === "L2"
508
+ ? item.productCategory
509
+ : [],
510
+ zone: zone,
511
+ };
512
+ }
513
+ zoneMap[zone]?.shelves?.push(shelfLabel);
514
+ }
515
+ return Object.values(zoneMap);
516
+ }
517
+ applySectionConfigToShelves(sections) {
518
+ const sectionMap = new Map();
519
+ for (const section of sections) {
520
+ for (const shelfLabel of section.shelves) {
521
+ sectionMap.set(shelfLabel, {
522
+ zone: section.zone,
523
+ productBrandName: section.productBrandName,
524
+ productCategory: section.productCategory,
525
+ });
526
+ }
527
+ }
528
+ // Apply overrides to matching shelves
529
+ return (this.fixtureTemplateDetails?.shelfConfig?.map((shelf) => {
530
+ const shelfLabel = `${shelf.shelfType} ${shelf.shelfNumber}`;
531
+ const override = sectionMap.get(shelfLabel);
532
+ return {
533
+ ...shelf,
534
+ zone: override?.zone || "",
535
+ productBrandName: override?.productBrandName ?? [],
536
+ productCategory: override?.productCategory ?? [],
537
+ };
538
+ }) ?? []);
539
+ }
540
+ openZoneLevelProductModalByProduct(p, s) {
541
+ const pLocator = {
542
+ s: s.shelfNumber,
543
+ pid: p?.productId,
544
+ };
545
+ const zoneData = this.sectionByZones.find((sh) => sh.zone === (s?.zone ?? "Top"));
546
+ this.openZoneLevelProductModal(zoneData, "section", pLocator);
547
+ }
548
+ openZoneLevelProductModal(zoneData, level, pLocator) {
549
+ const data = {
550
+ zone: zoneData.zone,
551
+ shelves: this.fixtureTemplateDetails.shelfConfig.filter((s) => s.zone === zoneData.zone),
552
+ };
553
+ if (data.shelves.every((s) => s.products.length > 0)) {
554
+ const modalRef = this.ngbModal.open(ZoneProductsComponent, {
555
+ centered: true,
556
+ windowClass: "merch-compliance-modal",
557
+ });
558
+ modalRef.componentInstance.data = data;
559
+ modalRef.componentInstance.level = level;
560
+ modalRef.componentInstance.floorData = this.floorData;
561
+ modalRef.componentInstance.vmList = this.vmList;
562
+ modalRef.componentInstance.productLocation = pLocator;
563
+ modalRef.result.then((result) => {
564
+ if (result) {
565
+ this.changeFixture.emit(result);
566
+ }
567
+ });
568
+ }
569
+ }
570
+ openStoreBoxProducts() {
571
+ if (this.fixtureTemplateDetails.storageProducts.length <= 0)
572
+ return;
573
+ const MAX_PRODUCTS_PER_SHELF = 6;
574
+ const shelves = [];
575
+ // Creating Imaginary shelves to display the storage box products.
576
+ for (let i = 0; i < this.fixtureTemplateDetails.storageProducts.length; i += MAX_PRODUCTS_PER_SHELF) {
577
+ shelves.push({
578
+ shelfType: "shelf",
579
+ products: this.fixtureTemplateDetails.storageProducts.slice(i, i + MAX_PRODUCTS_PER_SHELF),
580
+ });
581
+ }
582
+ const data = {
583
+ zone: "Storage Box",
584
+ shelves: shelves,
585
+ };
586
+ const modalRef = this.ngbModal.open(ZoneProductsComponent, {
587
+ centered: true,
588
+ windowClass: "merch-compliance-modal",
589
+ });
590
+ modalRef.componentInstance.data = data;
591
+ modalRef.componentInstance.level = "section";
592
+ }
593
+ distributeRoundRobin(products, trayRows) {
594
+ const result = Array.from({ length: trayRows }, () => []);
595
+ products.forEach((product, index) => {
596
+ const trayIndex = index % trayRows;
597
+ result[trayIndex].push(product);
598
+ });
599
+ return result;
600
+ }
601
+ // isErrorProduct(products?: any[]) {
602
+ // if (products) {
603
+ // return products.some(
604
+ // (p: any) => p.status == "missing" || p.status == "misplaced"
605
+ // );
606
+ // }
607
+ // return true;
608
+ // }
609
+ getShelfRowWithProducts() { }
610
+ onClickClose() {
611
+ this.onClose.emit("");
612
+ }
613
+ openPopup(type) {
614
+ const modalRef = this.ngbModal.open(AnalyticsPopupComponent, {
615
+ centered: true,
616
+ windowClass: "merch-compliance-modal",
617
+ size: 'lg'
618
+ });
619
+ modalRef.componentInstance.data = this.engagersList;
620
+ modalRef.componentInstance.type = type;
621
+ }
622
+ ngOnDestroy() {
623
+ this.destroy$.next();
624
+ this.destroy$.complete();
625
+ }
626
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FixtureAnalyticsComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }, { token: i0.ChangeDetectorRef }, { token: i3.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
627
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FixtureAnalyticsComponent, selector: "lib-fixture-analytics", inputs: { fixtureDetails: "fixtureDetails", vmList: "vmList", floorData: "floorData", startDate: "startDate", endDate: "endDate", dataType: "dataType" }, outputs: { onClose: "onClose", changeFixture: "changeFixture" }, usesOnChanges: true, ngImport: i0, template: "<section id=\"fixture-analytic-details\" *ngIf=\"!isPageLoading\">\r\n <div class=\"d-flex p-2 w-100 justify-content-end align-items-center\">\r\n <svg (click)=\"onClickClose()\" class=\"m-2 cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n </div>\r\n <div class=\"hero-block\">\r\n <h1 style=\"font-weight: 600;font-size: 30px;\">{{ fixtureTemplateDetails?.fixtureCompliance ?? 0 }}%</h1>\r\n <p>Compliance score</p>\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}<span>&#8226;</span>\r\n {{fixtureTemplateDetails?.fixtureCategory}} <span>&#8226;</span>\r\n {{fixtureTemplateDetails?.fixtureWidth.value}}{{fixtureTemplateDetails?.fixtureWidth.unit}}<span>&#8226;</span>\r\n {{fixtureTemplateDetails?.shelfConfig?.length}} Shelves\r\n </p>\r\n </div>\r\n <div class=\"d-flex justify-content-end mb-4 pe-5\">\r\n <div class=\"form-check form-switch \">\r\n <input [checked]=\"showVMs\" [(ngModel)]=\"showVMs\" [ngModelOptions]=\"{ standalone: true }\"\r\n style=\"cursor: pointer\" class=\"form-check-input\" type=\"checkbox\" />\r\n <label style=\"color: black; white-space: nowrap\" class=\"form-check-label sub ms-2\" for=\"showVMs\">\r\n Show VM\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"w-20\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n <div class=\"metric-header\">\r\n <span class=\"fw-semibold\">Total Footfall</span>\r\n </div>\r\n \r\n <div class=\"mt-2\">\r\n <h2 class=\"mb-1\">{{fixtureFootfall?.zoneTotal?.PreviousData}}</h2>\r\n \r\n <div class=\"d-flex align-items-center gap-1 small\" [ngClass]=\"fixtureFootfall?.zoneTotal?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" style=\"transform: rotate(180deg);\" *ngIf=\"!fixtureFootfall?.zoneTotal?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" *ngIf=\"fixtureFootfall?.zoneTotal?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span class=\"fw-semibold\">{{fixtureFootfall?.zoneTotal?.count}}%</span>\r\n <span class=\"text-muted\">vs Previous day</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"w-20\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n <div class=\"metric-header\">\r\n <span class=\"fw-semibold\">Zone Conversion</span>\r\n </div>\r\n \r\n <div class=\"mt-2\">\r\n <h2 class=\"mb-1\">{{fixtureFootfall?.conversionCount?.PreviousData}}</h2>\r\n \r\n <div class=\"d-flex align-items-center gap-1 small\" [ngClass]=\"fixtureFootfall?.conversionCount?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" style=\"transform: rotate(180deg);\" *ngIf=\"!fixtureFootfall?.conversionCount?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" *ngIf=\"fixtureFootfall?.conversionCount?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span class=\"fw-semibold\">{{fixtureFootfall?.conversionCount?.count}}%</span>\r\n <span class=\"text-muted\">vs Previous day</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"w-20\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n <div class=\"metric-header\">\r\n <span class=\"fw-semibold\">Avg Dwell Time</span>\r\n </div>\r\n \r\n <div class=\"mt-2\">\r\n <h2 class=\"mb-1\">{{fixtureFootfall?.dwellTime?.PreviousData}}</h2>\r\n \r\n <div class=\"d-flex align-items-centergap-1 small\" [ngClass]=\"fixtureFootfall?.dwellTime?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" style=\"transform: rotate(180deg);\" *ngIf=\"!fixtureFootfall?.dwellTime?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" *ngIf=\"fixtureFootfall?.dwellTime?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span class=\"fw-semibold\">{{fixtureFootfall?.dwellTime?.count}}%</span>\r\n <span class=\"text-muted\">vs Previous day</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div id=\"vm-products-sum\" class=\"wall-viewport mt-8\">\r\n <div class=\"fixture-wrapper\">\r\n <!-- Header block -->\r\n <div id=\"header-block\" class=\"header-block\">\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div id=\"body-block-sum\" class=\"body-block\">\r\n <!----------------------------------[VM BLOCK]--------------------------------------->\r\n <div *ngIf=\"fixtureTemplateDetails?.vmConfig?.length\" [ngClass]=\"{'d-none':!showVMs}\">\r\n <ng-container *ngFor=\"let vm of fixtureTemplateDetails?.vmConfig; let i = index\">\r\n <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\"\r\n alt=\"Vm Image\" />\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ selectedVM?.name }}</h3>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n <div id=\"brand-category\" class=\"brand-category\"\r\n *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span class=\"badge mt-1\">\r\n Capacity {{fixtureTemplateDetails?.fixtureCapacity }}\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container\r\n *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container\r\n *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\"\r\n (click)=\"openZoneLevelProductModal(item,'section')\"\r\n [class.proper]=\"!item?.section?.improper\">\r\n <div class=\"d-flex gap-1\">\r\n <span class=\"badge inactive\">\r\n {{ item.zone }}\r\n </span>\r\n <span class=\"badge inactive\">\r\n Capacity {{ item?.section?.capacity }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n\r\n <div class=\"d-flex gap-1 mb-1\">\r\n <span class=\"badge\" *ngIf=\"item.section.missing > 0\">\r\n Missing {{item.section.missing}}\r\n </span>\r\n <span class=\"badge\" *ngIf=\"item.section.misplaced > 0\">\r\n Misplaced {{item.section.misplaced}}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <div [id]=\"'sumShelfContainer' + i\"\r\n *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"item.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <span class=\"badge inactive\">\r\n Capacity {{item?.productPerShelf }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n @if(item.products.length){\r\n <div *ngFor=\"let product of item.products;let p = index\" class=\"product cursor-pointer\"\r\n [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\"\r\n (click)=\"openZoneLevelProductModalByProduct(product,item)\">\r\n @if(product.status != 'missing'){\r\n <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n [src]=\"product?.productImageUrl\" alt=\"Product Image\" />\r\n <ng-template #placeholder>\r\n <div></div>\r\n </ng-template>\r\n }\r\n </div>\r\n }@else {\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n }\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n @if(item.products.length){\r\n <div *ngFor=\"let row of item.distributedRows;let r = index\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of row;let p = index\" class=\"product cursor-pointer\"\r\n [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\"\r\n (click)=\"openZoneLevelProductModalByProduct(product,item)\">\r\n @if(product.status != 'missing'){\r\n <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n [src]=\"product?.productImageUrl\" alt=\"Product Image\" />\r\n <ng-template #placeholder>\r\n <div></div>\r\n </ng-template>\r\n }\r\n </div>\r\n </div>\r\n }@else{\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div id=\"footer-block\" class=\"footer-block\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n\r\n <div id=\"storage-box-zone\" *ngIf=\"fixtureTemplateDetails?.storageProducts?.length\" class=\"storage-box\"\r\n (click)=\"openStoreBoxProducts()\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n\r\n <span class=\"badge inactive\">\r\n Capacity {{ fixtureTemplateDetails?.storageProducts?.length ?? 0}}\r\n </span>\r\n\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\">\r\n @for(p of fixtureTemplateDetails?.storageProducts; track $index; let last = $last){\r\n {{p.brandName}}\r\n }\r\n </span>\r\n <span class=\"category\">\r\n @for(p of fixtureTemplateDetails?.storageProducts; track $index; let last = $last){\r\n {{p.category}}\r\n }\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <!-- Brands -->\r\n <p>\r\n <b>Brands: </b>\r\n\r\n @for (\r\n b of fixtureTemplateDetails?.storageProducts?.slice(0, 20);\r\n track $index;\r\n let last = $last\r\n ) {\r\n {{ b?.brandName }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n\r\n @if ((fixtureTemplateDetails?.storageProducts?.length ?? 0) > 20) {\r\n , +{{ (fixtureTemplateDetails?.storageProducts.length - 20) }}\r\n }\r\n </p>\r\n\r\n <!-- Categories -->\r\n <p>\r\n <b>Categories: </b>\r\n\r\n @for (\r\n b of fixtureTemplateDetails?.storageProducts?.slice(0, 20);\r\n track $index;\r\n let last = $last\r\n ) {\r\n {{ b?.category }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n\r\n @if ((fixtureTemplateDetails?.storageProducts?.length ?? 0) > 20) {\r\n , +{{ (fixtureTemplateDetails?.storageProducts.length - 20) }}\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"w-25\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"engagersList?.['Top Engaged']?.length\">\r\n <div class=\"metric-header bg-header d-flex justify-content-between\">\r\n <span>Top Engaged</span>\r\n <span>Count</span>\r\n </div>\r\n <div class=\"row align-items-center py-2 border-bottom\" *ngFor=\"let top of topEngagers()\">\r\n <div class=\"col-auto\">\r\n <img [src]=\"top?.imageUrl ? top.imageUrl : '{{imgCDN}}fixtureImage/imagenotfound.png'\" alt=\"Product\" class=\"rounded\">\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"fw-medium text-dark small\">{{top?.Brandname ?? ''}}</div>\r\n <div class=\"text-muted\" style=\"font-size: 12px;\">{{top?.productBrandName ?? ''}}</div>\r\n </div>\r\n <div class=\"col-auto\">\r\n <span class=\"fw-medium text-dark\">{{top?.count ?? 0}}</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"text-end py-1\">\r\n <a class=\"text-primary text-decoration-underline\" (click)=\"openPopup('Top Engaged')\">View all</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"w-25\" *ngIf=\"engagersList?.['Non Engaged']?.length\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\">\r\n <div class=\"metric-header bg-header d-flex justify-content-between\">\r\n <span>Least/Non Engaged</span>\r\n <span>Count</span>\r\n </div>\r\n <div class=\"row align-items-center py-2 border-bottom\" *ngFor=\"let top of leastEngagers()\">\r\n <div class=\"col-auto\">\r\n <img [src]=\"top?.imageUrl ? top.imageUrl : '{{imgCDN}}fixtureImage/imagenotfound.png'\" alt=\"Product\" class=\"rounded\">\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"fw-medium text-dark small\">{{top.Brandname}}</div>\r\n <div class=\"text-muted\" style=\"font-size: 12px;\">{{top?.productBrandName ?? ''}}</div>\r\n </div>\r\n <div class=\"col-auto\">\r\n <span class=\"fw-medium text-dark\">{{top?.count ?? 0}}</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"text-end py-1\">\r\n <a class=\"text-primary text-decoration-underline\" (click)=\"openPopup('least_Non_Engaged')\">View all</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"template-summary-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>", 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}#fixture-analytic-details ::ng-deep .wall-viewport{margin-bottom:0!important}#fixture-analytic-details #vm-products-sum .wall-viewport{align-items:self-start;margin-bottom:0!important}#fixture-analytic-details #vm-products-sum .body-block{position:relative;width:fit-content}#fixture-analytic-details #vm-products-sum .body-block .block{border:none}#fixture-analytic-details #vm-products-sum .product{height:30px;border-radius:4px;border:.52px solid #12b76a;box-shadow:0 .52px 1.04px #1018280d}#fixture-analytic-details #vm-products-sum .product img{object-fit:cover;border-radius:4px}#fixture-analytic-details #vm-products-sum .product.error{border:.52px solid #f04438;background-color:#fef3f2}#fixture-analytic-details #vm-products-sum #fixture-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:8px;border:1.12px solid var(--Primary-200, #f04438);background:var(--White, #fff);top:50%;left:59%;transform:translate(100%,-50%);transition:all .3s ease;cursor:pointer}#fixture-analytic-details #vm-products-sum #fixture-level .brand,#fixture-analytic-details #vm-products-sum #fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-analytic-details #vm-products-sum #fixture-level .category{margin-top:12px}#fixture-analytic-details #vm-products-sum #section-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:8px;border:1.12px solid var(--Primary-200, #f04438);transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#fixture-analytic-details #vm-products-sum #section-level .brand,#fixture-analytic-details #vm-products-sum #section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-analytic-details #vm-products-sum #section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum #section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum #section-level .separator{margin:0 4px;font-weight:600}#fixture-analytic-details #vm-products-sum #section-level #body-loader{height:100%;width:100%;position:absolute;display:flex;justify-content:center;align-items:center;z-index:1;background:#fff3;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(10px)}#fixture-analytic-details #vm-products-sum #section-level #body-loader .loader{width:30px;height:30px;border:4px solid #f3f3f3;border-top:4px solid #00a3ff;border-radius:50%;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#fixture-analytic-details #vm-products-sum #shelf-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:8px 4px;border-radius:8px;border:1.12px solid var(--Primary-200, #f04438);transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#fixture-analytic-details #vm-products-sum #shelf-level .brand,#fixture-analytic-details #vm-products-sum #shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-analytic-details #vm-products-sum #shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum #shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum #shelf-level .separator{margin:0 4px;font-weight:600}#fixture-analytic-details #vm-products-sum .brand-category.proper{border:1.12px solid var(--Primary-200, #32d583)!important}#fixture-analytic-details #vm-products-sum .brand-category .badge{color:#f04438;background-color:#fef3f2}#fixture-analytic-details #vm-products-sum .brand-category .badge.proper{color:#12b76a!important;background-color:#ecfdf3!important}#fixture-analytic-details #vm-products-sum .header-block{width:fit-content}#fixture-analytic-details #vm-products-sum .footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important;width:fit-content}#fixture-analytic-details #vm-products-sum .footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}#fixture-analytic-details #vm-products-sum .storage-box{position:relative;bottom:70px;width:200px;overflow:hidden;padding:4px;border-radius:8px;border:1px solid rgb(152,162,179);transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#fixture-analytic-details #vm-products-sum .storage-box .brand,#fixture-analytic-details #vm-products-sum .storage-box .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-analytic-details #vm-products-sum .storage-box .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum .storage-box .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum .storage-box .separator{margin:0 4px;font-weight:600}#fixture-analytic-details #vm-products-sum .sub-footer{position:relative;width:48%}#fixture-analytic-details #vm-products-sum img{width:100%;height:100%;display:block}#fixture-analytic-details #vm-products-sum .vm-block{position:absolute;width:100px;height:100px;transition:all .3s ease}#fixture-analytic-details #vm-products-sum .vm-block h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;margin:0;width:100%;text-overflow:ellipsis;overflow:hidden}#fixture-analytic-details #vm-products-sum .vm-placeholder{border:4px solid var(--Black, #101828);background:#f9fafb;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:8px;white-space:nowrap;overflow:hidden}#fixture-analytic-details .hero-block{background-color:#f9fafb;width:100%;display:flex;flex-direction:column;gap:6px;padding:12px;justify-content:center;align-items:center;margin-bottom:18px}#fixture-analytic-details .hero-block h1{font-size:18px;font-weight:600;color:#101828;margin:0}#fixture-analytic-details .hero-block p{font-weight:500;font-size:16px;line-height:24px;color:#475467;margin:0}.metric-header{background-color:#eaf8ff;padding:8px;border-radius:4px;display:flex;align-items:center;justify-content:space-between;gap:8px}.w-20{width:33%}.card-body img{width:38px;height:38px;object-fit:cover}.w-25{width:50%!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] });
628
+ }
629
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FixtureAnalyticsComponent, decorators: [{
630
+ type: Component,
631
+ args: [{ selector: "lib-fixture-analytics", template: "<section id=\"fixture-analytic-details\" *ngIf=\"!isPageLoading\">\r\n <div class=\"d-flex p-2 w-100 justify-content-end align-items-center\">\r\n <svg (click)=\"onClickClose()\" class=\"m-2 cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n </div>\r\n <div class=\"hero-block\">\r\n <h1 style=\"font-weight: 600;font-size: 30px;\">{{ fixtureTemplateDetails?.fixtureCompliance ?? 0 }}%</h1>\r\n <p>Compliance score</p>\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}<span>&#8226;</span>\r\n {{fixtureTemplateDetails?.fixtureCategory}} <span>&#8226;</span>\r\n {{fixtureTemplateDetails?.fixtureWidth.value}}{{fixtureTemplateDetails?.fixtureWidth.unit}}<span>&#8226;</span>\r\n {{fixtureTemplateDetails?.shelfConfig?.length}} Shelves\r\n </p>\r\n </div>\r\n <div class=\"d-flex justify-content-end mb-4 pe-5\">\r\n <div class=\"form-check form-switch \">\r\n <input [checked]=\"showVMs\" [(ngModel)]=\"showVMs\" [ngModelOptions]=\"{ standalone: true }\"\r\n style=\"cursor: pointer\" class=\"form-check-input\" type=\"checkbox\" />\r\n <label style=\"color: black; white-space: nowrap\" class=\"form-check-label sub ms-2\" for=\"showVMs\">\r\n Show VM\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"w-20\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n <div class=\"metric-header\">\r\n <span class=\"fw-semibold\">Total Footfall</span>\r\n </div>\r\n \r\n <div class=\"mt-2\">\r\n <h2 class=\"mb-1\">{{fixtureFootfall?.zoneTotal?.PreviousData}}</h2>\r\n \r\n <div class=\"d-flex align-items-center gap-1 small\" [ngClass]=\"fixtureFootfall?.zoneTotal?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" style=\"transform: rotate(180deg);\" *ngIf=\"!fixtureFootfall?.zoneTotal?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" *ngIf=\"fixtureFootfall?.zoneTotal?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span class=\"fw-semibold\">{{fixtureFootfall?.zoneTotal?.count}}%</span>\r\n <span class=\"text-muted\">vs Previous day</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"w-20\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n <div class=\"metric-header\">\r\n <span class=\"fw-semibold\">Zone Conversion</span>\r\n </div>\r\n \r\n <div class=\"mt-2\">\r\n <h2 class=\"mb-1\">{{fixtureFootfall?.conversionCount?.PreviousData}}</h2>\r\n \r\n <div class=\"d-flex align-items-center gap-1 small\" [ngClass]=\"fixtureFootfall?.conversionCount?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" style=\"transform: rotate(180deg);\" *ngIf=\"!fixtureFootfall?.conversionCount?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" *ngIf=\"fixtureFootfall?.conversionCount?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span class=\"fw-semibold\">{{fixtureFootfall?.conversionCount?.count}}%</span>\r\n <span class=\"text-muted\">vs Previous day</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"w-20\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n <div class=\"metric-header\">\r\n <span class=\"fw-semibold\">Avg Dwell Time</span>\r\n </div>\r\n \r\n <div class=\"mt-2\">\r\n <h2 class=\"mb-1\">{{fixtureFootfall?.dwellTime?.PreviousData}}</h2>\r\n \r\n <div class=\"d-flex align-items-centergap-1 small\" [ngClass]=\"fixtureFootfall?.dwellTime?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" style=\"transform: rotate(180deg);\" *ngIf=\"!fixtureFootfall?.dwellTime?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" *ngIf=\"fixtureFootfall?.dwellTime?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span class=\"fw-semibold\">{{fixtureFootfall?.dwellTime?.count}}%</span>\r\n <span class=\"text-muted\">vs Previous day</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div id=\"vm-products-sum\" class=\"wall-viewport mt-8\">\r\n <div class=\"fixture-wrapper\">\r\n <!-- Header block -->\r\n <div id=\"header-block\" class=\"header-block\">\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div id=\"body-block-sum\" class=\"body-block\">\r\n <!----------------------------------[VM BLOCK]--------------------------------------->\r\n <div *ngIf=\"fixtureTemplateDetails?.vmConfig?.length\" [ngClass]=\"{'d-none':!showVMs}\">\r\n <ng-container *ngFor=\"let vm of fixtureTemplateDetails?.vmConfig; let i = index\">\r\n <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\"\r\n alt=\"Vm Image\" />\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ selectedVM?.name }}</h3>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n <div id=\"brand-category\" class=\"brand-category\"\r\n *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span class=\"badge mt-1\">\r\n Capacity {{fixtureTemplateDetails?.fixtureCapacity }}\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container\r\n *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container\r\n *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\"\r\n (click)=\"openZoneLevelProductModal(item,'section')\"\r\n [class.proper]=\"!item?.section?.improper\">\r\n <div class=\"d-flex gap-1\">\r\n <span class=\"badge inactive\">\r\n {{ item.zone }}\r\n </span>\r\n <span class=\"badge inactive\">\r\n Capacity {{ item?.section?.capacity }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n\r\n <div class=\"d-flex gap-1 mb-1\">\r\n <span class=\"badge\" *ngIf=\"item.section.missing > 0\">\r\n Missing {{item.section.missing}}\r\n </span>\r\n <span class=\"badge\" *ngIf=\"item.section.misplaced > 0\">\r\n Misplaced {{item.section.misplaced}}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <div [id]=\"'sumShelfContainer' + i\"\r\n *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"item.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <span class=\"badge inactive\">\r\n Capacity {{item?.productPerShelf }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n @if(item.products.length){\r\n <div *ngFor=\"let product of item.products;let p = index\" class=\"product cursor-pointer\"\r\n [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\"\r\n (click)=\"openZoneLevelProductModalByProduct(product,item)\">\r\n @if(product.status != 'missing'){\r\n <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n [src]=\"product?.productImageUrl\" alt=\"Product Image\" />\r\n <ng-template #placeholder>\r\n <div></div>\r\n </ng-template>\r\n }\r\n </div>\r\n }@else {\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n }\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n @if(item.products.length){\r\n <div *ngFor=\"let row of item.distributedRows;let r = index\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of row;let p = index\" class=\"product cursor-pointer\"\r\n [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\"\r\n (click)=\"openZoneLevelProductModalByProduct(product,item)\">\r\n @if(product.status != 'missing'){\r\n <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n [src]=\"product?.productImageUrl\" alt=\"Product Image\" />\r\n <ng-template #placeholder>\r\n <div></div>\r\n </ng-template>\r\n }\r\n </div>\r\n </div>\r\n }@else{\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div id=\"footer-block\" class=\"footer-block\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n\r\n <div id=\"storage-box-zone\" *ngIf=\"fixtureTemplateDetails?.storageProducts?.length\" class=\"storage-box\"\r\n (click)=\"openStoreBoxProducts()\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n\r\n <span class=\"badge inactive\">\r\n Capacity {{ fixtureTemplateDetails?.storageProducts?.length ?? 0}}\r\n </span>\r\n\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\">\r\n @for(p of fixtureTemplateDetails?.storageProducts; track $index; let last = $last){\r\n {{p.brandName}}\r\n }\r\n </span>\r\n <span class=\"category\">\r\n @for(p of fixtureTemplateDetails?.storageProducts; track $index; let last = $last){\r\n {{p.category}}\r\n }\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <!-- Brands -->\r\n <p>\r\n <b>Brands: </b>\r\n\r\n @for (\r\n b of fixtureTemplateDetails?.storageProducts?.slice(0, 20);\r\n track $index;\r\n let last = $last\r\n ) {\r\n {{ b?.brandName }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n\r\n @if ((fixtureTemplateDetails?.storageProducts?.length ?? 0) > 20) {\r\n , +{{ (fixtureTemplateDetails?.storageProducts.length - 20) }}\r\n }\r\n </p>\r\n\r\n <!-- Categories -->\r\n <p>\r\n <b>Categories: </b>\r\n\r\n @for (\r\n b of fixtureTemplateDetails?.storageProducts?.slice(0, 20);\r\n track $index;\r\n let last = $last\r\n ) {\r\n {{ b?.category }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n\r\n @if ((fixtureTemplateDetails?.storageProducts?.length ?? 0) > 20) {\r\n , +{{ (fixtureTemplateDetails?.storageProducts.length - 20) }}\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"w-25\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"engagersList?.['Top Engaged']?.length\">\r\n <div class=\"metric-header bg-header d-flex justify-content-between\">\r\n <span>Top Engaged</span>\r\n <span>Count</span>\r\n </div>\r\n <div class=\"row align-items-center py-2 border-bottom\" *ngFor=\"let top of topEngagers()\">\r\n <div class=\"col-auto\">\r\n <img [src]=\"top?.imageUrl ? top.imageUrl : '{{imgCDN}}fixtureImage/imagenotfound.png'\" alt=\"Product\" class=\"rounded\">\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"fw-medium text-dark small\">{{top?.Brandname ?? ''}}</div>\r\n <div class=\"text-muted\" style=\"font-size: 12px;\">{{top?.productBrandName ?? ''}}</div>\r\n </div>\r\n <div class=\"col-auto\">\r\n <span class=\"fw-medium text-dark\">{{top?.count ?? 0}}</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"text-end py-1\">\r\n <a class=\"text-primary text-decoration-underline\" (click)=\"openPopup('Top Engaged')\">View all</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"w-25\" *ngIf=\"engagersList?.['Non Engaged']?.length\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\">\r\n <div class=\"metric-header bg-header d-flex justify-content-between\">\r\n <span>Least/Non Engaged</span>\r\n <span>Count</span>\r\n </div>\r\n <div class=\"row align-items-center py-2 border-bottom\" *ngFor=\"let top of leastEngagers()\">\r\n <div class=\"col-auto\">\r\n <img [src]=\"top?.imageUrl ? top.imageUrl : '{{imgCDN}}fixtureImage/imagenotfound.png'\" alt=\"Product\" class=\"rounded\">\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"fw-medium text-dark small\">{{top.Brandname}}</div>\r\n <div class=\"text-muted\" style=\"font-size: 12px;\">{{top?.productBrandName ?? ''}}</div>\r\n </div>\r\n <div class=\"col-auto\">\r\n <span class=\"fw-medium text-dark\">{{top?.count ?? 0}}</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"text-end py-1\">\r\n <a class=\"text-primary text-decoration-underline\" (click)=\"openPopup('least_Non_Engaged')\">View all</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"template-summary-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>", 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}#fixture-analytic-details ::ng-deep .wall-viewport{margin-bottom:0!important}#fixture-analytic-details #vm-products-sum .wall-viewport{align-items:self-start;margin-bottom:0!important}#fixture-analytic-details #vm-products-sum .body-block{position:relative;width:fit-content}#fixture-analytic-details #vm-products-sum .body-block .block{border:none}#fixture-analytic-details #vm-products-sum .product{height:30px;border-radius:4px;border:.52px solid #12b76a;box-shadow:0 .52px 1.04px #1018280d}#fixture-analytic-details #vm-products-sum .product img{object-fit:cover;border-radius:4px}#fixture-analytic-details #vm-products-sum .product.error{border:.52px solid #f04438;background-color:#fef3f2}#fixture-analytic-details #vm-products-sum #fixture-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:8px;border:1.12px solid var(--Primary-200, #f04438);background:var(--White, #fff);top:50%;left:59%;transform:translate(100%,-50%);transition:all .3s ease;cursor:pointer}#fixture-analytic-details #vm-products-sum #fixture-level .brand,#fixture-analytic-details #vm-products-sum #fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-analytic-details #vm-products-sum #fixture-level .category{margin-top:12px}#fixture-analytic-details #vm-products-sum #section-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:8px;border:1.12px solid var(--Primary-200, #f04438);transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#fixture-analytic-details #vm-products-sum #section-level .brand,#fixture-analytic-details #vm-products-sum #section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-analytic-details #vm-products-sum #section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum #section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum #section-level .separator{margin:0 4px;font-weight:600}#fixture-analytic-details #vm-products-sum #section-level #body-loader{height:100%;width:100%;position:absolute;display:flex;justify-content:center;align-items:center;z-index:1;background:#fff3;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(10px)}#fixture-analytic-details #vm-products-sum #section-level #body-loader .loader{width:30px;height:30px;border:4px solid #f3f3f3;border-top:4px solid #00a3ff;border-radius:50%;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#fixture-analytic-details #vm-products-sum #shelf-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:8px 4px;border-radius:8px;border:1.12px solid var(--Primary-200, #f04438);transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#fixture-analytic-details #vm-products-sum #shelf-level .brand,#fixture-analytic-details #vm-products-sum #shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-analytic-details #vm-products-sum #shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum #shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum #shelf-level .separator{margin:0 4px;font-weight:600}#fixture-analytic-details #vm-products-sum .brand-category.proper{border:1.12px solid var(--Primary-200, #32d583)!important}#fixture-analytic-details #vm-products-sum .brand-category .badge{color:#f04438;background-color:#fef3f2}#fixture-analytic-details #vm-products-sum .brand-category .badge.proper{color:#12b76a!important;background-color:#ecfdf3!important}#fixture-analytic-details #vm-products-sum .header-block{width:fit-content}#fixture-analytic-details #vm-products-sum .footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important;width:fit-content}#fixture-analytic-details #vm-products-sum .footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}#fixture-analytic-details #vm-products-sum .storage-box{position:relative;bottom:70px;width:200px;overflow:hidden;padding:4px;border-radius:8px;border:1px solid rgb(152,162,179);transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#fixture-analytic-details #vm-products-sum .storage-box .brand,#fixture-analytic-details #vm-products-sum .storage-box .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-analytic-details #vm-products-sum .storage-box .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum .storage-box .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum .storage-box .separator{margin:0 4px;font-weight:600}#fixture-analytic-details #vm-products-sum .sub-footer{position:relative;width:48%}#fixture-analytic-details #vm-products-sum img{width:100%;height:100%;display:block}#fixture-analytic-details #vm-products-sum .vm-block{position:absolute;width:100px;height:100px;transition:all .3s ease}#fixture-analytic-details #vm-products-sum .vm-block h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;margin:0;width:100%;text-overflow:ellipsis;overflow:hidden}#fixture-analytic-details #vm-products-sum .vm-placeholder{border:4px solid var(--Black, #101828);background:#f9fafb;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:8px;white-space:nowrap;overflow:hidden}#fixture-analytic-details .hero-block{background-color:#f9fafb;width:100%;display:flex;flex-direction:column;gap:6px;padding:12px;justify-content:center;align-items:center;margin-bottom:18px}#fixture-analytic-details .hero-block h1{font-size:18px;font-weight:600;color:#101828;margin:0}#fixture-analytic-details .hero-block p{font-weight:500;font-size:16px;line-height:24px;color:#475467;margin:0}.metric-header{background-color:#eaf8ff;padding:8px;border-radius:4px;display:flex;align-items:center;justify-content:space-between;gap:8px}.w-20{width:33%}.card-body img{width:38px;height:38px;object-fit:cover}.w-25{width:50%!important}\n"] }]
632
+ }], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }, { type: i0.ChangeDetectorRef }, { type: i3.NgbModal }], propDecorators: { fixtureDetails: [{
633
+ type: Input
634
+ }], vmList: [{
635
+ type: Input
636
+ }], floorData: [{
637
+ type: Input
638
+ }], startDate: [{
639
+ type: Input
640
+ }], endDate: [{
641
+ type: Input
642
+ }], dataType: [{
643
+ type: Input
644
+ }], onClose: [{
645
+ type: Output
646
+ }], changeFixture: [{
647
+ type: Output
648
+ }] } });
649
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1hbmFseXRpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm9ncmFtL3BsYW5vLWFuYWx5dGljcy9maXh0dXJlLWFuYWx5dGljcy9maXh0dXJlLWFuYWx5dGljcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wbGFub2dyYW0vcGxhbm8tYW5hbHl0aWNzL2ZpeHR1cmUtYW5hbHl0aWNzL2ZpeHR1cmUtYW5hbHl0aWNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFLdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBS3pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3JHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7O0FBT3ZGLE1BQU0sT0FBTyx5QkFBeUI7SUFpRTFCO0lBQ0E7SUFDQTtJQUNBO0lBakVELGNBQWMsQ0FBTTtJQUNwQixNQUFNLEdBQW9CLEVBQUUsQ0FBQztJQUM3QixTQUFTLENBQU07SUFDZixTQUFTLENBQU07SUFDZixPQUFPLENBQU07SUFDYixRQUFRLENBQU07SUFFYixPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUNsQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBS3RDLENBQUM7SUFFTCxzQkFBc0IsQ0FBTTtJQUM1QixRQUFRLENBQVM7SUFFakIsTUFBTSxDQUFTO0lBRWYsU0FBUyxHQUFHO1FBQ1YsS0FBSyxFQUFFO1lBQ0wsRUFBRSxFQUFFLFNBQVM7WUFDYixJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLFNBQVMsRUFBRSxTQUFTO1NBQ3JCO1FBQ0QsS0FBSyxFQUFFO1lBQ0wsRUFBRSxFQUFFLFNBQVM7WUFDYixJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLFNBQVMsRUFBRSxTQUFTO1NBQ3JCO0tBQ0YsQ0FBQztJQUVGLGNBQWMsR0FhUixFQUFFLENBQUM7SUFFVCxhQUFhLEdBQVksSUFBSSxDQUFDO0lBQzlCLE9BQU8sR0FBWSxJQUFJLENBQUM7SUFFaEIsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQ3ZDLFlBQVksQ0FBTTtJQUNsQixlQUFlLENBQUs7SUFFcEIsWUFDVSxtQkFBd0MsRUFDeEMsRUFBc0IsRUFDdEIsRUFBcUIsRUFDckIsUUFBa0I7UUFIbEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxPQUFFLEdBQUYsRUFBRSxDQUFvQjtRQUN0QixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixhQUFRLEdBQVIsUUFBUSxDQUFVO0lBQ3pCLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXO2FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYzthQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3hCLElBQUksSUFBSSxFQUFFLE1BQU0sRUFBRTtnQkFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQUUsTUFBTSxDQUFDO2FBQzlCO2lCQUFNO2dCQUNMLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQ3pCLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQVcsQ0FDakQsQ0FBQztnQkFDRixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsRUFBRSxNQUFNLENBQUM7YUFDcEM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxPQUFPLEdBQUc7WUFDWixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUc7U0FDbkMsQ0FBQztRQUVGLElBQUksQ0FBQyxtQkFBbUI7YUFDckIsdUJBQXVCLENBQUMsT0FBTyxDQUFDO2FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3RCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFO2dCQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLENBQUM7YUFDckQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDckMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsZUFBZSxDQUFDO1NBQ3hDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksT0FBTyxHQUFHO1lBQ1osUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNwQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztZQUNqQyxJQUFJLEVBQUUsV0FBVyxJQUFJLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRTtZQUNyRCxRQUFRLEVBQUMsSUFBSSxDQUFDLFFBQVE7U0FDdkIsQ0FBQztRQUVGLElBQUksQ0FBQyxtQkFBbUI7YUFDckIsdUJBQXVCLENBQUMsT0FBTyxDQUFDO2FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3RCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFO2dCQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQzthQUM5QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBc0I7UUFDdEMsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxZQUFZLEVBQUU7WUFDM0MsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzFFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ2pDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNUO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ2hEO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztTQUN2RDtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBUztRQUNwQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLE9BQU8sR0FBRztZQUNaLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRztZQUNwQixPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU87WUFDdEIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPO1lBQ3RCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFVBQVUsSUFBSTtnQkFDckMsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVTthQUMzQyxDQUFDO1NBQ0gsQ0FBQztRQUVGLElBQUk7WUFDRixNQUFNLEdBQUcsR0FBUSxNQUFNLGFBQWEsQ0FDbEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FDbEQsQ0FBQztZQUNGLElBQUksR0FBRyxFQUFFLE1BQU0sS0FBSyxTQUFTLElBQUksR0FBRyxFQUFFLElBQUksRUFBRTtnQkFDMUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHO29CQUM1QixHQUFHLEdBQUcsRUFBRSxJQUFJO29CQUNaLFdBQVcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sSUFBSSxFQUFFO2lCQUN0QyxDQUFDO2dCQUVGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXO29CQUNyQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO3dCQUNyRCxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFOzRCQUNqRCxDQUFDLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FDM0MsQ0FBQyxDQUFDLFFBQVEsRUFDVixDQUFDLENBQUMsUUFBUSxDQUNYLENBQUM7eUJBQ0g7d0JBQ0QsT0FBTyxDQUFDLENBQUM7b0JBQ1gsQ0FBQyxDQUFDLENBQUM7Z0JBRUwsTUFBTSxXQUFXLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLFdBQVcsSUFBSSxFQUFFLENBQy9DLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUV4QyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQVMsRUFBRSxFQUFFO29CQUN4QyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRTt3QkFDakIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDcEI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtTQUNGO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzFEO2dCQUFTO1lBQ1IsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLEVBQU87UUFDbkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFnQixDQUFDO1FBQzFFLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFNUIsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUV2QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBZ0IsQ0FBQztRQUN0RSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBZ0IsQ0FBQztRQUV0RSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLFNBQVMsSUFBSSxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsU0FBUyxJQUFJLENBQUM7UUFFdEMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsQ0FBUyxFQUFFLEVBQUU7WUFDbkUsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLGNBQWMsSUFBSSxDQUFDLENBQUM7WUFFeEMsSUFBSSxRQUFRLEdBQ1YsQ0FBQyxFQUFFLFlBQVk7Z0JBQ2YsSUFBSSxDQUFDLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxNQUFNO2dCQUNoRCxDQUFDLENBQUM7WUFFSixNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQWdCLENBQUM7WUFDNUQsSUFBSSxDQUFDLEVBQUU7Z0JBQUUsT0FBTztZQUVoQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFVixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNuQyxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxDQUFDO29CQUFFLE9BQU87Z0JBRWYsTUFBTSxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUM7YUFDMUI7WUFFRCxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7WUFDeEIsSUFBSSxjQUFjLEdBQUcsU0FBUyxDQUFDO1lBRS9CLEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzNDLE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLENBQUM7b0JBQUUsT0FBTztnQkFDZixlQUFlLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQzthQUNuQztZQUVELElBQUksUUFBUSxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUM7WUFDbEMsSUFBSSxRQUFRLEdBQUcsZUFBZSxHQUFHLENBQUMsQ0FBQztZQUVuQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUM7WUFDckIsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDO1lBRXRCLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRTtnQkFDaEIsS0FBSyxNQUFNO29CQUNULENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ04sS0FBSyxHQUFHLFFBQVEsQ0FBQztvQkFDakIsTUFBTTtnQkFDUixLQUFLLE9BQU87b0JBQ1YsS0FBSyxHQUFHLFFBQVEsQ0FBQztvQkFDakIsQ0FBQyxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUM7b0JBQ3RCLE1BQU07Z0JBQ1IsS0FBSyxRQUFRO29CQUNYLEtBQUssR0FBRyxRQUFRLENBQUM7b0JBQ2pCLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzVCLE1BQU07Z0JBQ1IsS0FBSyxTQUFTO29CQUNaLEtBQUssR0FBRyxTQUFTLENBQUM7b0JBQ2xCLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ04sTUFBTTthQUNUO1lBRUQsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFO2dCQUNoQixLQUFLLEtBQUs7b0JBQ1IsTUFBTSxHQUFHLGVBQWUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztvQkFDdEUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztvQkFDWCxNQUFNO2dCQUNSLEtBQUssUUFBUTtvQkFDWCxNQUFNLEdBQUcsZUFBZSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO29CQUN0RSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztvQkFDNUMsTUFBTTtnQkFDUixLQUFLLFFBQVE7b0JBQ1gsTUFBTSxHQUFHLGVBQWUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztvQkFDdEUsQ0FBQyxHQUFHLGVBQWUsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO29CQUN0QyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixNQUFNLEdBQUcsZUFBZSxDQUFDO29CQUN6QixDQUFDLEdBQUcsTUFBTSxDQUFDO29CQUNYLE1BQU07YUFDVDtZQUVELEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsS0FBSyxJQUFJLENBQUM7WUFDOUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLElBQUksQ0FBQztZQUNqQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUVqRCxTQUFTLFdBQVcsQ0FBQyxDQUFTO2dCQUM1QixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQWdCLENBQUM7Z0JBQzlELElBQUksQ0FBQyxHQUFHO29CQUFFLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQWdCLENBQUM7Z0JBQ25FLE9BQU8sR0FBa0IsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFnQixDQUFDO1FBQ3hFLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUVyQyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLElBQUksRUFBRSxDQUFrQixDQUFDO1FBRXpFLE1BQU0sU0FBUyxHQUFHLFlBQVk7YUFDM0IsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFrQixDQUFDO2FBQ2hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFN0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLFFBQVEsSUFBSSxDQUFDLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFO1lBQzNELEtBQUssSUFBSSxFQUFFLFNBQVM7Z0JBQ2xCLHdCQUF3QjtnQkFDeEIsK0NBQStDO2dCQUMvQywyQ0FBMkM7Z0JBRTNDLHFCQUFxQjtnQkFDckIsNEJBQTRCO2dCQUM1QixhQUFhO2dCQUNiLDBCQUEwQjtnQkFDMUIsc0JBQXNCO2dCQUN0Qix3Q0FBd0M7Z0JBQ3hDLHNDQUFzQztnQkFDdEMsNEJBQTRCO2dCQUM1QixXQUFXO2dCQUVYLDZCQUE2QjtnQkFDN0IsYUFBYTtnQkFDYixpRUFBaUU7Z0JBQ2pFLHNCQUFzQjtnQkFDdEIsZ0RBQWdEO2dCQUNoRCx3Q0FBd0M7Z0JBQ3hDLHlDQUF5QztnQkFDekMsb0RBQW9EO2dCQUNwRCxvQ0FBb0M7Z0JBQ3BDLHFDQUFxQztnQkFDckMsUUFBUTtnQkFDUixNQUFNO2dCQUNOLE1BQU07Z0JBQ04sc0VBQXNFO2dCQUN0RSxZQUFZO2dCQUNaLG1FQUFtRTtnQkFFbkUsY0FBYztnQkFDZCx3QkFBd0I7Z0JBQ3hCLG1DQUFtQztnQkFDbkMsZUFBZTtnQkFDZixzQ0FBc0M7Z0JBQ3RDLFFBQVE7Z0JBQ1IsTUFBTTtnQkFDTixJQUFJO2dCQUVKLE1BQU07WUFFUixLQUFLLElBQUksRUFBRSxTQUFTO2dCQUNsQjtvQkFDRSxNQUFNLE9BQU8sR0FBRyxTQUFTO3lCQUN0QixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNYLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSzt3QkFDbkQsQ0FBQyxDQUFFLEdBQUcsQ0FBQyxnQkFBZ0M7d0JBQ3ZDLENBQUMsQ0FBQyxJQUFJLENBQ1Q7eUJBQ0EsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUVuQixJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3pDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDMUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLFdBQVcsSUFBSSxFQUFFLENBQy9DLENBQUM7b0JBQ0YsTUFBTSxpQkFBaUIsR0FBYSxFQUFFLENBQUM7b0JBRXZDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQzdCLE1BQU0sUUFBUSxHQUNaLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs0QkFDNUQsRUFBRSxDQUFDO3dCQUNMLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO3dCQUNwQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDdEMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUNuQyxDQUFDO3dCQUNGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUN4QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsSUFBSSxDQUMxQixDQUFDO3dCQUVGLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7NEJBQ3ZCLDJEQUEyRDs0QkFDM0QsSUFBSSxDQUFDLEVBQUU7Z0NBQ0wsQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsU0FBUyxFQUFFLE9BQU8sQ0FBQyxRQUFRO29DQUNuRCxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQ0FDekIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQ0FDNUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO2dDQUNsQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7Z0NBRWpDLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7b0NBQ3ZCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztpQ0FDOUI7cUNBQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtvQ0FDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO3dDQUNWLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQzt3Q0FDaEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDO3FDQUN2Qzt5Q0FBTSxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3Q0FDbEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO3FDQUNwQztpQ0FDRjtxQ0FBTTtvQ0FDTCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7d0NBQ1YsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO3FDQUNqQzt5Q0FBTSxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3Q0FDbEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO3FDQUNwQzt5Q0FBTTt3Q0FDTCxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUM7d0NBQ25DLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQztxQ0FDdkM7aUNBQ0Y7Z0NBQ0QsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsU0FBUyxFQUFFLE9BQU8sQ0FBQyxRQUFRO29DQUMvQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTTtvQ0FDN0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQzs2QkFDakM7d0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBRUgsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUN4QyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUMvQyxDQUFDO29CQUNGLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUV0RSxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztvQkFDM0IsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTs0QkFDcEMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQ3RELENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFlBQVksSUFBSSxDQUFDLENBQUMsRUFDcEMsQ0FBQyxDQUNGLENBQUM7NEJBQ0YsTUFBTSxtQkFBbUIsR0FDdkIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxJQUFJLEdBQUcsQ0FBQzs0QkFFOUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FDN0Isa0JBQWtCLENBQUMsRUFBRSxDQUN0QixDQUFDOzRCQUVGLElBQUksRUFBRSxFQUFFO2dDQUNOLDBCQUEwQjtnQ0FDMUIsbURBQW1EO2dDQUNuRCxLQUFLO2dDQUNMLGdCQUFnQjtnQ0FDaEIsb0RBQW9EO2dDQUNwRCx5QkFBeUI7Z0NBRXpCLHNEQUFzRDtnQ0FDdEQsRUFBRSxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO2dDQUVsQywwREFBMEQ7Z0NBQzFELE1BQU0sR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0NBQzNCLE1BQU0sR0FBRyxHQUNQLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7b0NBQzVDLGtCQUFrQixDQUFDO2dDQUNyQixFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxhQUFhLEdBQUcsR0FBRyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0NBRTlELGtCQUFrQixJQUFJLG9CQUFvQixDQUFDOzZCQUM1Qzt3QkFDSCxDQUFDLENBQUMsQ0FBQzt3QkFFSCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUN0QyxrQkFBa0IsQ0FDSixDQUFDO3dCQUVqQixNQUFNLEtBQUssR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDO3dCQUU3QixJQUFJLFFBQVEsRUFBRTs0QkFDWixRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLEtBQUssSUFBSSxDQUFDO3lCQUNwQztvQkFDSCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ1A7Z0JBRUQsTUFBTTtZQUVSLEtBQUssSUFBSSxFQUFFLE9BQU87Z0JBQ2hCO29CQUNFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQzNCLHVEQUF1RDt3QkFDdkQsbUVBQW1FO3dCQUNuRSxrQ0FBa0M7d0JBQ2xDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQWMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ2pFLElBQUksQ0FBQyxFQUFFOzRCQUFFLE9BQU87d0JBRWhCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNuRCxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFFckQsc0RBQXNEO3dCQUN0RCxzREFBc0Q7d0JBQ3RELEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLGFBQWEsR0FBRyxHQUFHLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQztvQkFDaEUsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTTtZQUNqQjtnQkFDRSw2QkFBNkI7Z0JBQzdCLDhEQUE4RDtnQkFDOUQsTUFBTTtnQkFDTixNQUFNO1NBQ1Q7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxTQUFpQztRQUMxRCxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLEtBQUssR0FBa0IsSUFBSSxDQUFDO1FBRWhDLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLFdBQVcsSUFBSSxFQUFFLEVBQUU7WUFDOUQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDMUIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1lBRTFELElBQUksSUFBSSxLQUFLLEVBQUU7Z0JBQUUsU0FBUztZQUUxQixNQUFNLGtCQUFrQixHQUN0QixDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUM7WUFFOUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FDMUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUNuQyxDQUFDLE1BQU0sQ0FBQztZQUNULE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQy9DLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FDckMsQ0FBQyxNQUFNLENBQUM7WUFFVCxNQUFNLGFBQWEsR0FDakIsQ0FBQyxDQUFDLFNBQVMsS0FBSyxNQUFNO2dCQUNwQixDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsUUFBUTtnQkFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7WUFFeEIsSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO2dCQUNsQixpQkFBaUIsQ0FBQyxJQUFJLENBQUM7b0JBQ3JCLElBQUk7b0JBQ0osT0FBTyxFQUFFO3dCQUNQLE1BQU0sRUFBRSxDQUFDLENBQUMsZ0JBQWdCLElBQUksRUFBRTt3QkFDaEMsVUFBVSxFQUFFLENBQUMsQ0FBQyxlQUFlLElBQUksRUFBRTt3QkFDbkMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDO3dCQUNsQixTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7d0JBQ3JCLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUU7d0JBQzVDLFFBQVEsRUFBRSxrQkFBa0I7d0JBQzVCLFNBQVMsRUFBRSxjQUFjO3dCQUN6QixPQUFPLEVBQUUsU0FBUzt3QkFDbEIsUUFBUSxFQUFFLGFBQWE7cUJBQ3hCO2lCQUNGLENBQUMsQ0FBQztnQkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDO2FBQ2Q7aUJBQU07Z0JBQ0wsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDeEUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzlCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNqQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDckMsT0FBTyxDQUFDLFFBQVEsSUFBSSxhQUFhLENBQUM7Z0JBQ2xDLElBQUksa0JBQWtCO29CQUFFLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNoRCxPQUFPLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQztnQkFDN0IsT0FBTyxDQUFDLFNBQVMsSUFBSSxjQUFjLENBQUM7YUFDckM7U0FDRjtRQUVELDhEQUE4RDtRQUM5RCx5RUFBeUU7UUFFekUsNkJBQTZCO1FBQzdCLHVCQUF1QjtRQUN2QixpQkFBaUI7UUFDakIsOERBQThEO1FBQzlELGtFQUFrRTtRQUNsRSxxQkFBcUI7UUFDckIsdUJBQXVCO1FBQ3ZCLDBEQUEwRDtRQUMxRCx5QkFBeUI7UUFDekIsNkJBQTZCO1FBQzdCLDJCQUEyQjtRQUMzQiwwQ0FBMEM7UUFDMUMsU0FBUztRQUNULFFBQVE7UUFDUixJQUFJO1FBRUosSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFvQjtRQUNyQyxNQUFNLE9BQU8sR0FBc0MsRUFBRSxDQUFDO1FBRXRELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzlCLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHO29CQUNkLE9BQU8sRUFBRSxFQUFFO29CQUNYLGdCQUFnQixFQUNkLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxzQkFBc0IsS0FBSyxJQUFJO3dCQUMxRCxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQjt3QkFDdkIsQ0FBQyxDQUFDLEVBQUU7b0JBQ1IsZUFBZSxFQUNiLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxzQkFBc0IsS0FBSyxJQUFJO3dCQUMxRCxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWU7d0JBQ3RCLENBQUMsQ0FBQyxFQUFFO29CQUNSLElBQUksRUFBRSxJQUFJO2lCQUNYLENBQUM7YUFDSDtZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzFDO1FBRUQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxRQUF5QjtRQUNuRCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFHdkIsQ0FBQztRQUVKLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFO1lBQzlCLEtBQUssTUFBTSxVQUFVLElBQUksT0FBTyxDQUFDLE9BQVEsRUFBRTtnQkFDekMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7b0JBQ3pCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtvQkFDbEIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtvQkFDMUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlO2lCQUN6QyxDQUFDLENBQUM7YUFDSjtTQUNGO1FBRUQsc0NBQXNDO1FBQ3RDLE9BQU8sQ0FDTCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQzNELE1BQU0sVUFBVSxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0QsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUU1QyxPQUFPO2dCQUNMLEdBQUcsS0FBSztnQkFDUixJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUMxQixnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLElBQUksRUFBRTtnQkFDbEQsZUFBZSxFQUFFLFFBQVEsRUFBRSxlQUFlLElBQUksRUFBRTthQUNqRCxDQUFDO1FBQ0osQ0FBQyxDQUFDLElBQUksRUFBRSxDQUNULENBQUM7SUFDSixDQUFDO0lBRUQsa0NBQWtDLENBQUMsQ0FBTSxFQUFFLENBQU07UUFDL0MsTUFBTSxRQUFRLEdBQUc7WUFDZixDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVc7WUFDaEIsR0FBRyxFQUFFLENBQUMsRUFBRSxTQUFTO1NBQ2xCLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDdkMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUN2QyxDQUFDO1FBRUYsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELHlCQUF5QixDQUN2QixRQUFhLEVBQ2IsS0FBYSxFQUNiLFFBQWtDO1FBRWxDLE1BQU0sSUFBSSxHQUFHO1lBQ1gsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FDckQsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLElBQUksQ0FDckM7U0FDRixDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDekQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7Z0JBQ3pELFFBQVEsRUFBRSxJQUFJO2dCQUNkLFdBQVcsRUFBRSx3QkFBd0I7YUFDdEMsQ0FBQyxDQUFDO1lBQ0gsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDdkMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDekMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3RELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNoRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztZQUV0RCxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO2dCQUNuQyxJQUFJLE1BQU0sRUFBRTtvQkFDVixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDakM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsTUFBTSxJQUFJLENBQUM7WUFBRSxPQUFPO1FBRXBFLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUVuQixrRUFBa0U7UUFDbEUsS0FDRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQ1QsQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUN0RCxDQUFDLElBQUksc0JBQXNCLEVBQzNCO1lBQ0EsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDWCxTQUFTLEVBQUUsT0FBTztnQkFDbEIsUUFBUSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUN6RCxDQUFDLEVBQ0QsQ0FBQyxHQUFHLHNCQUFzQixDQUMzQjthQUNGLENBQUMsQ0FBQztTQUNKO1FBRUQsTUFBTSxJQUFJLEdBQUc7WUFDWCxJQUFJLEVBQUUsYUFBYTtZQUNuQixPQUFPLEVBQUUsT0FBTztTQUNqQixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDekQsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsd0JBQXdCO1NBQ3RDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3ZDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO0lBQy9DLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxRQUFhLEVBQUUsUUFBZ0I7UUFDbEQsTUFBTSxNQUFNLEdBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUvRCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBWSxFQUFFLEtBQWEsRUFBRSxFQUFFO1lBQy9DLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUM7WUFDbkMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsb0JBQW9CO0lBQ3BCLDRCQUE0QjtJQUM1QixxRUFBcUU7SUFDckUsU0FBUztJQUNULE1BQU07SUFDTixpQkFBaUI7SUFDakIsSUFBSTtJQUVKLHVCQUF1QixLQUFJLENBQUM7SUFFNUIsWUFBWTtRQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBUztRQUNqQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUMzRCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSx3QkFBd0I7WUFDckMsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDcEQsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDekMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0Ezd0JVLHlCQUF5Qjs0RkFBekIseUJBQXlCLDZTQzdCdEMseWs2QkFrZVU7OzRGRHJjRyx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsdUJBQXVCO2dMQU94QixjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdDaGVja2VkLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHsgVm1MaWJyYXJ5TGlzdCB9IGZyb20gXCIuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL3ZtLWxpYnJhcnkuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XHJcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20sIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7XHJcbiAgU2hlbGZDb25maWcsXHJcbiAgU2VjdGlvbkNvbmZpZyxcclxufSBmcm9tIFwiLi4vLi4vLi4vLi4vaW50ZXJmYWNlcy9maXh0dXJlLXRlbXBsYXRlLmludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBab25lUHJvZHVjdHNDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vbWVyY2gtY29tcGxpYW5jZS96b25lLXByb2R1Y3RzL3pvbmUtcHJvZHVjdHMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEFuYWx5dGljc1BvcHVwQ29tcG9uZW50IH0gZnJvbSBcIi4uL2FuYWx5dGljcy1wb3B1cC9hbmFseXRpY3MtcG9wdXAuY29tcG9uZW50XCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItZml4dHVyZS1hbmFseXRpY3NcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2ZpeHR1cmUtYW5hbHl0aWNzLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9maXh0dXJlLWFuYWx5dGljcy5jb21wb25lbnQuc2Nzc1wiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRml4dHVyZUFuYWx5dGljc0NvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveVxyXG57XHJcbiAgQElucHV0KCkgZml4dHVyZURldGFpbHM6IGFueTtcclxuICBASW5wdXQoKSB2bUxpc3Q6IFZtTGlicmFyeUxpc3RbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGZsb29yRGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIHN0YXJ0RGF0ZTogYW55O1xyXG4gIEBJbnB1dCgpIGVuZERhdGU6IGFueTtcclxuICBASW5wdXQoKSBkYXRhVHlwZTogYW55O1xyXG5cclxuICBAT3V0cHV0KCkgb25DbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBjaGFuZ2VGaXh0dXJlID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBmaXh0dXJlSWQ6IHN0cmluZztcclxuICAgIGZpeHR1cmVOYW1lOiBzdHJpbmc7XHJcbiAgICBzaGVsZklkOiBzdHJpbmc7XHJcbiAgICB6b25lOiBzdHJpbmc7XHJcbiAgfT4oKTtcclxuXHJcbiAgZml4dHVyZVRlbXBsYXRlRGV0YWlsczogYW55O1xyXG4gIGNsaWVudElkOiBzdHJpbmc7XHJcblxyXG4gIGltZ0NETjogc3RyaW5nO1xyXG5cclxuICB6b25lQ29sb3IgPSB7XHJcbiAgICByaWdodDoge1xyXG4gICAgICBiZzogXCIjZmZmZmZmXCIsXHJcbiAgICAgIHRleHQ6IFwiIzEyQjc2QVwiLFxyXG4gICAgICBib3JkZXI6IFwiIzMyRDU4M1wiLFxyXG4gICAgICBwcm9kdWN0Qm9yZGVyOiBcIiMxMkI3NkFcIixcclxuICAgICAgcHJvZHVjdEJnOiBcIiNGQ0ZDRkRcIixcclxuICAgIH0sXHJcbiAgICB3cm9uZzoge1xyXG4gICAgICBiZzogXCIjZmZmZmZmXCIsXHJcbiAgICAgIHRleHQ6IFwiI0YwNDQzOFwiLFxyXG4gICAgICBib3JkZXI6IFwiIzk4YTJiM1wiLFxyXG4gICAgICBwcm9kdWN0Qm9yZGVyOiBcIiNGMDQ0MzhcIixcclxuICAgICAgcHJvZHVjdEJnOiBcIiNGRUNEQ0FcIixcclxuICAgIH0sXHJcbiAgfTtcclxuXHJcbiAgc2VjdGlvbkJ5Wm9uZXM6IHtcclxuICAgIHpvbmU6IHN0cmluZztcclxuICAgIHNlY3Rpb246IHtcclxuICAgICAgYnJhbmRzOiBzdHJpbmdbXTtcclxuICAgICAgY2F0ZWdvcmllczogc3RyaW5nW107XHJcbiAgICAgIHNoZWx2ZXM6IHN0cmluZ1tdO1xyXG4gICAgICBzaGVsZkRpdnM6IChIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQpW107XHJcbiAgICAgIHByb2R1Y3RzOiBhbnk7XHJcbiAgICAgIGltcHJvcGVyOiBib29sZWFuO1xyXG4gICAgICBtaXNzaW5nOiBudW1iZXI7XHJcbiAgICAgIG1pc3BsYWNlZDogbnVtYmVyO1xyXG4gICAgICBjYXBhY2l0eTogbnVtYmVyO1xyXG4gICAgfTtcclxuICB9W10gPSBbXTtcclxuXHJcbiAgaXNQYWdlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgc2hvd1ZNczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgaXNWTUluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBpc0JDSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBlbmdhZ2Vyc0xpc3Q6IGFueTtcclxuICBmaXh0dXJlRm9vdGZhbGw6YW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc3RvcmVCdWlsZGVyU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBuZ2JNb2RhbDogTmdiTW9kYWwsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmdzLmVudmlyb25tZW50XHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoZW52KSA9PiAodGhpcy5pbWdDRE4gPSBlbnYucGxhbm9ncmFtQ0ROKSk7XHJcblxyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEVuZ2FnZXJzTGlzdCgpIHtcclxuICAgIHRoaXMuZW5nYWdlcnNMaXN0ID0gbnVsbDtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBmcm9tX2RhdGU6IHRoaXMuc3RhcnREYXRlLFxyXG4gICAgICB0b19kYXRlOiB0aGlzLmVuZERhdGUsXHJcbiAgICAgIGZpeHR1cmVJZDogdGhpcy5maXh0dXJlRGV0YWlscy5faWQsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZVxyXG4gICAgICAuZ2V0U3RvcmVGaXh0dXJlRW5nYWdlcnMocGF5bG9hZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZ2FnZXJzTGlzdCA9IHJlcz8uZGF0YT8uZGF0YSB8fCB7fTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuZW5nYWdlcnNMaXN0LCBcInRoaXMuZW5nYWdlcnNMaXN0XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b3BFbmdhZ2VycygpIHtcclxuICAgIHJldHVybiB0aGlzLmVuZ2FnZXJzTGlzdD8uW1wiVG9wIEVuZ2FnZWRcIl0/LnNsaWNlKDAsIDMpO1xyXG4gIH1cclxuXHJcbiAgbGVhc3RFbmdhZ2VycygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIC4uLnRoaXMuZW5nYWdlcnNMaXN0Py5bXCJOb24gRW5nYWdlZFwiXSxcclxuICAgICAgLi4udGhpcy5lbmdhZ2Vyc0xpc3Q/LltcIkxlYXN0IEVuZ2FnZWRcIl0sXHJcbiAgICBdPy5zbGljZSgwLCAzKTtcclxuICB9XHJcblxyXG4gIGdldEZpeHR1cmVGb290ZmFsbCgpIHtcclxuICAgIHRoaXMuZml4dHVyZUZvb3RmYWxsID0gbnVsbDtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBmcm9tRGF0ZTogdGhpcy5zdGFydERhdGUsXHJcbiAgICAgIHRvRGF0ZTogdGhpcy5lbmREYXRlLFxyXG4gICAgICBzdG9yZUlkOiBbdGhpcy5mbG9vckRhdGEuc3RvcmVJZF0sXHJcbiAgICAgIHpvbmU6IGBGaXh0dXJlICR7dGhpcy5maXh0dXJlRGV0YWlscz8uZml4dHVyZU51bWJlcn1gLFxyXG4gICAgICBkYXRhVHlwZTp0aGlzLmRhdGFUeXBlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZVxyXG4gICAgICAuZ2V0U3RvcmVGaXh0dXJlRm9vdGZhbGwocGF5bG9hZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlcywncmVzJylcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRm9vdGZhbGwgPSByZXM/LmRhdGE/LmNhcmQgfHwge307XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChjaGFuZ2VzW1wiZml4dHVyZURldGFpbHNcIl0/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmdldEVuZ2FnZXJzTGlzdCgpO1xyXG4gICAgICB0aGlzLmdldEZpeHR1cmVGb290ZmFsbCgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEZpeHR1cmVTaGVsZkRldGFpbHMoY2hhbmdlc1tcImZpeHR1cmVEZXRhaWxzXCJdLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXBwbHlTaGVsZkNvbG9ycygpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlVm1Qb3NpdGlvbkFuZFNpemUoKTtcclxuICAgICAgfSwgMjAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0JDSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5pc0JDSW5pdGlhbGl6ZWQgPSB0aGlzLmFwcGx5U2hlbGZDb2xvcnMoKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5pc1ZNSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5pc1ZNSW5pdGlhbGl6ZWQgPSB0aGlzLmhhbmRsZVZtUG9zaXRpb25BbmRTaXplKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRGaXh0dXJlU2hlbGZEZXRhaWxzKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBmaXh0dXJlSWQ6IGRhdGE/Ll9pZCxcclxuICAgICAgcGxhbm9JZDogZGF0YT8ucGxhbm9JZCxcclxuICAgICAgZmxvb3JJZDogZGF0YT8uZmxvb3JJZCxcclxuICAgICAgY29tcGxpYW5jZTogdHJ1ZSxcclxuICAgICAgLi4uKHRoaXMuZml4dHVyZURldGFpbHM/LnJldmlzaW9uSWQgJiYge1xyXG4gICAgICAgIHJldmlzaW9uSWQ6IHRoaXMuZml4dHVyZURldGFpbHMucmV2aXNpb25JZCxcclxuICAgICAgfSksXHJcbiAgICB9O1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZ2V0U2hlbGZEZXRhaWxzKHBheWxvYWQpLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAocmVzPy5zdGF0dXMgPT09IFwic3VjY2Vzc1wiICYmIHJlcz8uZGF0YSkge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyA9IHtcclxuICAgICAgICAgIC4uLnJlcz8uZGF0YSxcclxuICAgICAgICAgIHNoZWxmQ29uZmlnOiByZXM/LmRhdGE/LnNoZWx2ZXMgPz8gW10sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLnNoZWxmQ29uZmlnID1cclxuICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5zaGVsZkNvbmZpZy5tYXAoKHM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocy5zaGVsZlR5cGUgIT09IFwic2hlbGZcIiAmJiBzLnByb2R1Y3RzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICBzLmRpc3RyaWJ1dGVkUm93cyA9IHRoaXMuZGlzdHJpYnV0ZVJvdW5kUm9iaW4oXHJcbiAgICAgICAgICAgICAgICBzLnByb2R1Y3RzLFxyXG4gICAgICAgICAgICAgICAgcy50cmF5Um93cyxcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBzO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbFByb2R1Y3RzID0gKFxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZyA/PyBbXVxyXG4gICAgICAgICkuZmxhdE1hcCgoczogYW55KSA9PiBzLnByb2R1Y3RzID8/IFtdKTtcclxuXHJcbiAgICAgICAgYWxsUHJvZHVjdHMuZm9yRWFjaCgocDogYW55LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGlmICghcD8ucHJvZHVjdElkKSB7XHJcbiAgICAgICAgICAgIHBbXCJwcm9kdWN0SWRcIl0gPSBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0Rml4dHVyZVNoZWxmRGV0YWlscyBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZFZNKHZtOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLnZtTGlzdC5maW5kKCh2KSA9PiB2LmlkID09PSB2bT8udm1JZCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVWbVBvc2l0aW9uQW5kU2l6ZSgpIHtcclxuICAgIGNvbnN0IHZpZXdQb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJib2R5LWJsb2NrLXN1bVwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghdmlld1BvcnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBib2R5V2lkdGggPSB2aWV3UG9ydC5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhlYWRlci1ibG9ja1wiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IGZvb3RlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZm9vdGVyLWJsb2NrXCIpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGhlYWRlci5zdHlsZS53aWR0aCA9IGAke2JvZHlXaWR0aH1weGA7XHJcbiAgICBmb290ZXIuc3R5bGUud2lkdGggPSBgJHtib2R5V2lkdGh9cHhgO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8udm1Db25maWc/LmZvckVhY2goKGU6IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGxldCBzdGFydFNoZWxmID0gZT8uc3RhcnRZUG9zaXRpb24gPz8gMTtcclxuXHJcbiAgICAgIGxldCBlbmRTaGVsZiA9XHJcbiAgICAgICAgZT8uZW5kWVBvc2l0aW9uID8/XHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubGVuZ3RoID8/XHJcbiAgICAgICAgMTtcclxuXHJcbiAgICAgIGNvbnN0IHZtID0gdmlld1BvcnQucXVlcnlTZWxlY3RvcihgI3ZtJHtpfWApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBpZiAoIXZtKSByZXR1cm47XHJcblxyXG4gICAgICBsZXQgeCA9IDA7XHJcbiAgICAgIGxldCB5ID0gMDtcclxuXHJcbiAgICAgIGxldCB5U3RhcnQgPSAwO1xyXG4gICAgICBmb3IgKGxldCBrID0gMTsgayA8IHN0YXJ0U2hlbGY7IGsrKykge1xyXG4gICAgICAgIGNvbnN0IHMgPSBnZXRTaGVsZkRpdihrKTtcclxuICAgICAgICBpZiAoIXMpIHJldHVybjtcclxuXHJcbiAgICAgICAgeVN0YXJ0ICs9IHMub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcGxhY2VtZW50SGVpZ2h0ID0gMDtcclxuICAgICAgbGV0IHBsYWNlbWVudFdpZHRoID0gYm9keVdpZHRoO1xyXG5cclxuICAgICAgZm9yIChsZXQgayA9IHN0YXJ0U2hlbGY7IGsgPD0gZW5kU2hlbGY7IGsrKykge1xyXG4gICAgICAgIGNvbnN0IHMgPSBnZXRTaGVsZkRpdihrKTtcclxuICAgICAgICBpZiAoIXMpIHJldHVybjtcclxuICAgICAgICBwbGFjZW1lbnRIZWlnaHQgKz0gcy5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBkZWZhdWx0VyA9IHBsYWNlbWVudFdpZHRoIC8gMztcclxuICAgICAgbGV0IGRlZmF1bHRIID0gcGxhY2VtZW50SGVpZ2h0IC8gMztcclxuXHJcbiAgICAgIGxldCB3aWR0aCA9IGRlZmF1bHRXO1xyXG4gICAgICBsZXQgaGVpZ2h0ID0gZGVmYXVsdEg7XHJcblxyXG4gICAgICBzd2l0Y2ggKGU/Lnhab25lKSB7XHJcbiAgICAgICAgY2FzZSBcImxlZnRcIjpcclxuICAgICAgICAgIHggPSAwO1xyXG4gICAgICAgICAgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgICAgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgICAgIHggPSBib2R5V2lkdGggLSB3aWR0aDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgIHdpZHRoID0gZGVmYXVsdFc7XHJcbiAgICAgICAgICB4ID0gKGJvZHlXaWR0aCAtIHdpZHRoKSAvIDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwic3RyZXRjaFwiOlxyXG4gICAgICAgICAgd2lkdGggPSBib2R5V2lkdGg7XHJcbiAgICAgICAgICB4ID0gMDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGU/Lnlab25lKSB7XHJcbiAgICAgICAgY2FzZSBcInRvcFwiOlxyXG4gICAgICAgICAgaGVpZ2h0ID0gcGxhY2VtZW50SGVpZ2h0IDwgZGVmYXVsdEggPyBwbGFjZW1lbnRIZWlnaHQgLSAyMCA6IGRlZmF1bHRIO1xyXG4gICAgICAgICAgeSA9IHlTdGFydDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgIGhlaWdodCA9IHBsYWNlbWVudEhlaWdodCA8IGRlZmF1bHRIID8gcGxhY2VtZW50SGVpZ2h0IC0gMjAgOiBkZWZhdWx0SDtcclxuICAgICAgICAgIHkgPSAocGxhY2VtZW50SGVpZ2h0IC0gaGVpZ2h0KSAvIDIgKyB5U3RhcnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiYm90dG9tXCI6XHJcbiAgICAgICAgICBoZWlnaHQgPSBwbGFjZW1lbnRIZWlnaHQgPCBkZWZhdWx0SCA/IHBsYWNlbWVudEhlaWdodCAtIDIwIDogZGVmYXVsdEg7XHJcbiAgICAgICAgICB5ID0gcGxhY2VtZW50SGVpZ2h0IC0gaGVpZ2h0ICsgeVN0YXJ0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcInN0cmV0Y2hcIjpcclxuICAgICAgICAgIGhlaWdodCA9IHBsYWNlbWVudEhlaWdodDtcclxuICAgICAgICAgIHkgPSB5U3RhcnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgdm0uc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgIHZtLnN0eWxlLmhlaWdodCA9IGAgJHtoZWlnaHR9cHhgO1xyXG4gICAgICB2bS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XHJcblxyXG4gICAgICBmdW5jdGlvbiBnZXRTaGVsZkRpdihrOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZGl2ID0gdmlld1BvcnQucXVlcnlTZWxlY3RvcihgI3NoZWxmJHtrfWApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmICghZGl2KSBkaXYgPSB2aWV3UG9ydC5xdWVyeVNlbGVjdG9yKGAjdHJheSR7a31gKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICByZXR1cm4gZGl2IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlTaGVsZkNvbG9ycygpIHtcclxuICAgIGNvbnN0IGJvZGllcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYm9keS1ibG9jay1zdW1cIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIWJvZGllcykgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgYm9keVdpZHRoID0gYm9kaWVzLm9mZnNldFdpZHRoO1xyXG5cclxuICAgIGNvbnN0IGJvZHlDaGlsZHJlbiA9IEFycmF5LmZyb20oYm9kaWVzPy5jaGlsZHJlbiA/PyBbXSkgYXMgSFRNTEVsZW1lbnRbXTtcclxuXHJcbiAgICBjb25zdCBzaGVsZkRpdnMgPSBib2R5Q2hpbGRyZW5cclxuICAgICAgLm1hcCgoZGl2KSA9PiBkaXYgYXMgSFRNTEVsZW1lbnQpXHJcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQ/LmlkLmluY2x1ZGVzKFwic3VtU2hlbGZDb250YWluZXJcIikpO1xyXG5cclxuICAgIGlmICghc2hlbGZEaXZzKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgYWRqdXN0ID0gMDtcclxuICAgIHN3aXRjaCAodGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsKSB7XHJcbiAgICAgIGNhc2UgXCJMMVwiOiAvL2ZpeHR1cmVcclxuICAgICAgICAvLyBjb25zdCBhbGxQcm9kdWN0cyA9IChcclxuICAgICAgICAvLyAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbHZlcyA/PyBbXVxyXG4gICAgICAgIC8vICkuZmxhdE1hcCgoczogYW55KSA9PiBzLnByb2R1Y3RzID8/IFtdKTtcclxuXHJcbiAgICAgICAgLy8gY29uc3QgaXNJbXByb3BlciA9XHJcbiAgICAgICAgLy8gICBhbGxQcm9kdWN0cy5sZW5ndGggPT0gMFxyXG4gICAgICAgIC8vICAgICA/IHRydWVcclxuICAgICAgICAvLyAgICAgOiBhbGxQcm9kdWN0cy5zb21lKFxyXG4gICAgICAgIC8vICAgICAgICAgKHA6IGFueSkgPT5cclxuICAgICAgICAvLyAgICAgICAgICAgcC5zdGF0dXMgPT09IFwibWlzcGxhY2VkXCIgfHxcclxuICAgICAgICAvLyAgICAgICAgICAgcC5zdGF0dXMgPT09IFwibWlzc2luZ1wiIHx8XHJcbiAgICAgICAgLy8gICAgICAgICAgIHAuc3RhdHVzID09PSBcIlwiXHJcbiAgICAgICAgLy8gICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gc2hlbGZEaXZzLmZvckVhY2goKGQpID0+IHtcclxuICAgICAgICAvLyAgIGlmIChkKSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGJsb2NrRGl2ID0gZC5xdWVyeVNlbGVjdG9yKFwiLmJsb2NrXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIC8vICAgICBpZiAoYmxvY2tEaXYpIHtcclxuICAgICAgICAvLyAgICAgICBibG9ja0Rpdi5zdHlsZS5ib3JkZXJDb2xvciA9IGlzSW1wcm9wZXJcclxuICAgICAgICAvLyAgICAgICAgID8gdGhpcy56b25lQ29sb3Iud3JvbmcuYm9yZGVyXHJcbiAgICAgICAgLy8gICAgICAgICA6IHRoaXMuem9uZUNvbG9yLnJpZ2h0LmJvcmRlcjtcclxuICAgICAgICAvLyAgICAgICBibG9ja0Rpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBpc0ltcHJvcGVyXHJcbiAgICAgICAgLy8gICAgICAgICA/IHRoaXMuem9uZUNvbG9yLndyb25nLmJnXHJcbiAgICAgICAgLy8gICAgICAgICA6IHRoaXMuem9uZUNvbG9yLnJpZ2h0LmJnO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy8gY29uc3QgbDEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZpeHR1cmUtbGV2ZWxcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgLy8gaWYgKGwxKSB7XHJcbiAgICAgICAgLy8gICBjb25zdCBiYyA9IGwxLnF1ZXJ5U2VsZWN0b3IoXCIuYnJhbmQtY2F0ZWdvcnlcIikgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vICAgaWYgKGJjKSB7XHJcbiAgICAgICAgLy8gICAgIGlmIChpc0ltcHJvcGVyKSB7XHJcbiAgICAgICAgLy8gICAgICAgYmMuY2xhc3NMaXN0LmFkZChcIndyb25nXCIpO1xyXG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgIGJjLmNsYXNzTGlzdC5yZW1vdmUoXCJ3cm9uZ1wiKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiTDNcIjogLy9zZWN0aW9uXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29uc3Qgc2hlbHZlcyA9IHNoZWxmRGl2c1xyXG4gICAgICAgICAgICAubWFwKChkaXYpID0+XHJcbiAgICAgICAgICAgICAgZGl2Lmxhc3RFbGVtZW50Q2hpbGQ/LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkaXZcIlxyXG4gICAgICAgICAgICAgICAgPyAoZGl2Lmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICA6IG51bGwsXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdFNlcXVlbnRpYWxTZWN0aW9uKHNoZWx2ZXMpO1xyXG4gICAgICAgICAgY29uc3Qgc2VjdGlvbkFycmF5ID0gdGhpcy5ncm91cFNoZWx2ZXNCeVpvbmUoXHJcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWcgPz8gW10sXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgY29uc3QgYWxsU2VjdGlvblNoZWx2ZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgICAgICAgc2VjdGlvbkFycmF5LmZvckVhY2goKHNlLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoZWxmSWRzID1cclxuICAgICAgICAgICAgICBzZS5zaGVsdmVzPy5tYXAoKHNoKSA9PiBzaC5yZXBsYWNlKC9cXHMvZywgXCJcIikudG9Mb3dlckNhc2UoKSkgPz9cclxuICAgICAgICAgICAgICBbXTtcclxuICAgICAgICAgICAgYWxsU2VjdGlvblNoZWx2ZXMucHVzaCguLi5zaGVsZklkcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY0RpdnMgPSBzaGVsdmVzLmZpbHRlcigoaXRlbSkgPT5cclxuICAgICAgICAgICAgICBzaGVsZklkcz8uaW5jbHVkZXMoaXRlbT8uaWQgPz8gXCJcIiksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZSA9IHRoaXMuc2VjdGlvbkJ5Wm9uZXMuZmluZChcclxuICAgICAgICAgICAgICAocykgPT4gcy56b25lID09PSBzZS56b25lLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgc2VjRGl2cy5mb3JFYWNoKChkLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gaWYgKGQpIGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZztcclxuICAgICAgICAgICAgICBpZiAoZCkge1xyXG4gICAgICAgICAgICAgICAgZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjdXJyZW50U2U/LnNlY3Rpb24uaW1wcm9wZXJcclxuICAgICAgICAgICAgICAgICAgPyB0aGlzLnpvbmVDb2xvci53cm9uZy5iZ1xyXG4gICAgICAgICAgICAgICAgICA6IHRoaXMuem9uZUNvbG9yLnJpZ2h0LmJnO1xyXG4gICAgICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXJSaWdodCA9IGAycHggc29saWRgO1xyXG4gICAgICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXJMZWZ0ID0gYDJweCBzb2xpZGA7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNlY0RpdnMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXIgPSBgMnB4IHNvbGlkYDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VjRGl2cy5sZW5ndGggPiAxICYmIHNlY0RpdnMubGVuZ3RoIDw9IDIpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGQuc3R5bGUuYm9yZGVyVG9wID0gYDFweCBzb2xpZGA7XHJcbiAgICAgICAgICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXJCb3R0b20gPSBgMC41cHggZG90dGVkYDtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IHNlY0RpdnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGQuc3R5bGUuYm9yZGVyQm90dG9tID0gYDFweCBzb2xpZGA7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBkLnN0eWxlLmJvcmRlclRvcCA9IGAxcHggc29saWRgO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gc2VjRGl2cy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXJCb3R0b20gPSBgMXB4IHNvbGlkYDtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkLnN0eWxlLmJvcmRlclRvcCA9IGAwLjVweCBkb3R0ZWRgO1xyXG4gICAgICAgICAgICAgICAgICAgIGQuc3R5bGUuYm9yZGVyQm90dG9tID0gYDAuNXB4IGRvdHRlZGA7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGQuc3R5bGUuYm9yZGVyQ29sb3IgPSBjdXJyZW50U2U/LnNlY3Rpb24uaW1wcm9wZXJcclxuICAgICAgICAgICAgICAgICAgPyB0aGlzLnpvbmVDb2xvci53cm9uZy5ib3JkZXJcclxuICAgICAgICAgICAgICAgICAgOiB0aGlzLnpvbmVDb2xvci5yaWdodC5ib3JkZXI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHVuYXNzaWduZWRTaGVsdmVzID0gc2hlbGZEaXZzLmZpbHRlcihcclxuICAgICAgICAgICAgKGl0ZW0pID0+ICFhbGxTZWN0aW9uU2hlbHZlcy5pbmNsdWRlcyhpdGVtLmlkKSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB1bmFzc2lnbmVkU2hlbHZlcy5mb3JFYWNoKChkKSA9PiAoZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIndoaXRlXCIpKTtcclxuXHJcbiAgICAgICAgICBsZXQgc2VjdGlvbkdyb3VwSGVpZ2h0ID0gMDtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlY3Rpb25CeVpvbmVzLmZvckVhY2goKHN6LCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNlY3Rpb25IZWlnaHQgPSBzei5zZWN0aW9uLnNoZWxmRGl2cy5yZWR1Y2UoXHJcbiAgICAgICAgICAgICAgICAoaCwgZCkgPT4gaCArIChkPy5vZmZzZXRIZWlnaHQgPz8gMCksXHJcbiAgICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNlY3Rpb25XaWR0aCA9XHJcbiAgICAgICAgICAgICAgICBzei5zZWN0aW9uLnNoZWxmRGl2c1swXT8ub2Zmc2V0V2lkdGggPz8gMzQ1O1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBiYyA9IGJvZGllcy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcclxuICAgICAgICAgICAgICAgIGAjYnJhbmQtY2F0ZWdvcnkke2l9YCxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoYmMpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IHNlY0JnID0gcmdiVG9IZXgoXHJcbiAgICAgICAgICAgICAgICAvLyAgIHN6LnNlY3Rpb24uc2hlbGZEaXZzWzBdPy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3JcclxuICAgICAgICAgICAgICAgIC8vICk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBjb2xvciA9XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuc2hlbGZDb2xvcnMuZmluZCgoYykgPT4gYy5iZyA9PT0gc2VjQmcpID8/XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuc2hlbGZDb2xvcnNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gYmMuc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLnpvbmVDb2xvci5yaWdodC5ib3JkZXI7XHJcbiAgICAgICAgICAgICAgICBiYy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIiNmZmZcIjtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBiY1ggPSAoY3VycmVudFNlY3Rpb25XaWR0aCAtIGJjLm9mZnNldFdpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiY1ggPSBib2R5V2lkdGggKyAxNjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJjWSA9XHJcbiAgICAgICAgICAgICAgICAgIChjdXJyZW50U2VjdGlvbkhlaWdodCAtIGJjLm9mZnNldEhlaWdodCkgLyAyICtcclxuICAgICAgICAgICAgICAgICAgc2VjdGlvbkdyb3VwSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgYmMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2JjWCArIGFkanVzdH1weCwgJHtiY1l9cHgpYDtcclxuXHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uR3JvdXBIZWlnaHQgKz0gY3VycmVudFNlY3Rpb25IZWlnaHQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlQm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXHJcbiAgICAgICAgICAgICAgXCJzdG9yYWdlLWJveC16b25lXCIsXHJcbiAgICAgICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhbGlnbiA9IGJvZHlXaWR0aCArIDE2O1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0b3JlQm94KSB7XHJcbiAgICAgICAgICAgICAgc3RvcmVCb3guc3R5bGUubGVmdCA9IGAke2FsaWdufXB4YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJMMlwiOiAvL3NoZWxmXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgc2hlbGZEaXZzLmZvckVhY2goKGRpdiwgaSkgPT4ge1xyXG4gICAgICAgICAgICAvLyBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy56b25lQ29sb3IucmlnaHQuYmc7XHJcbiAgICAgICAgICAgIC8vIGRpdi5zdHlsZS5ib3JkZXIgPSBgMS40cHggc29saWQgJHt0aGlzLnpvbmVDb2xvci5yaWdodC5ib3JkZXJ9YDtcclxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuc2hvd1ZNcykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCBiYyA9IGRpdi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgI2JyYW5kLWNhdGVnb3J5JHtpfWApO1xyXG4gICAgICAgICAgICBpZiAoIWJjKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCBiY1ggPSAoZGl2Lm9mZnNldFdpZHRoIC0gYmMub2Zmc2V0V2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgY29uc3QgYmNZID0gKGRpdi5vZmZzZXRIZWlnaHQgLSBiYy5vZmZzZXRIZWlnaHQpIC8gMjtcclxuXHJcbiAgICAgICAgICAgIC8vIGJjLnN0eWxlLmJvcmRlckNvbG9yID0gdGhpcy56b25lQ29sb3IucmlnaHQuYm9yZGVyO1xyXG4gICAgICAgICAgICAvLyBiYy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnpvbmVDb2xvci5yaWdodC5iZztcclxuICAgICAgICAgICAgYmMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2JjWCArIGFkanVzdH1weCwgJHtiY1l9cHgpYDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIkw0XCI6IC8vc3BvdFxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIC8vIHNoZWxmRGl2cy5mb3JFYWNoKChkKSA9PiB7XHJcbiAgICAgICAgLy8gICBpZiAoZCkgZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnpvbmVDb2xvci5yaWdodC5iZztcclxuICAgICAgICAvLyB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdFNlcXVlbnRpYWxTZWN0aW9uKHNoZWxmRGl2czogKEhUTUxFbGVtZW50IHwgbnVsbClbXSkge1xyXG4gICAgY29uc3QgbmV3U2VjdGlvbkJ5Wm9uZXMgPSBbXTtcclxuICAgIGxldCBwWm9uZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgZm9yIChjb25zdCBzIG9mIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWcgPz8gW10pIHtcclxuICAgICAgY29uc3Qgem9uZSA9IHMuem9uZSB8fCBcIlwiO1xyXG4gICAgICBjb25zdCBzaGVsZklkID0gYCR7cy5zaGVsZlR5cGV9JHtzLnNoZWxmTnVtYmVyfWA7XHJcbiAgICAgIGNvbnN0IHNoZWxmRGl2ID0gc2hlbGZEaXZzLmZpbmQoKGQpID0+IGQ/LmlkID09PSBzaGVsZklkKTtcclxuXHJcbiAgICAgIGlmICh6b25lID09PSBcIlwiKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGNvbnN0IGhhc0ltcHJvcGVyUHJvZHVjdCA9XHJcbiAgICAgICAgKHM/LnByb2R1Y3RzPy5sZW5ndGggPz8gMCkgPT09IDAgfHxcclxuICAgICAgICAocz8ucHJvZHVjdHMgPz8gW10pLnNvbWUoKHA6IGFueSkgPT4gcC5zdGF0dXMgIT09IFwicHJvcGVyXCIpO1xyXG5cclxuICAgICAgY29uc3QgbWlzc0NvdW50ID0gKHM/LnByb2R1Y3RzID8/IFtdKS5maWx0ZXIoXHJcbiAgICAgICAgKHA6IGFueSkgPT4gcC5zdGF0dXMgPT09IFwibWlzc2luZ1wiLFxyXG4gICAgICApLmxlbmd0aDtcclxuICAgICAgY29uc3QgbWlzcGxhY2VkQ291bnQgPSAocz8ucHJvZHVjdHMgPz8gW10pLmZpbHRlcihcclxuICAgICAgICAocDogYW55KSA9PiBwLnN0YXR1cyA9PT0gXCJtaXNwbGFjZWRcIixcclxuICAgICAgKS5sZW5ndGg7XHJcblxyXG4gICAgICBjb25zdCBzaGVsZkNhcGFjaXR5ID1cclxuICAgICAgICBzLnNoZWxmVHlwZSA9PT0gXCJ0cmF5XCJcclxuICAgICAgICAgID8gcy5wcm9kdWN0UGVyU2hlbGYgKiBzLnRyYXlSb3dzXHJcbiAgICAgICAgICA6IHMucHJvZHVjdFBlclNoZWxmO1xyXG5cclxuICAgICAgaWYgKHpvbmUgIT09IHBab25lKSB7XHJcbiAgICAgICAgbmV3U2VjdGlvbkJ5Wm9uZXMucHVzaCh7XHJcbiAgICAgICAgICB6b25lLFxyXG4gICAgICAgICAgc2VjdGlvbjoge1xyXG4gICAgICAgICAgICBicmFuZHM6IHMucHJvZHVjdEJyYW5kTmFtZSA/PyBbXSxcclxuICAgICAgICAgICAgY2F0ZWdvcmllczogcy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgICAgIHNoZWx2ZXM6IFtzaGVsZklkXSxcclxuICAgICAgICAgICAgc2hlbGZEaXZzOiBbc2hlbGZEaXZdLFxyXG4gICAgICAgICAgICBwcm9kdWN0czogc3RydWN0dXJlZENsb25lKHM/LnByb2R1Y3RzKSA/PyBbXSxcclxuICAgICAgICAgICAgaW1wcm9wZXI6IGhhc0ltcHJvcGVyUHJvZHVjdCxcclxuICAgICAgICAgICAgbWlzcGxhY2VkOiBtaXNwbGFjZWRDb3VudCxcclxuICAgICAgICAgICAgbWlzc2luZzogbWlzc0NvdW50LFxyXG4gICAgICAgICAgICBjYXBhY2l0eTogc2hlbGZDYXBhY2l0eSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcFpvbmUgPSB6b25lO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBuZXdTZWN0aW9uQnlab25lc1tuZXdTZWN0aW9uQnlab25lcy5sZW5ndGggLSAxXS5zZWN0aW9uO1xyXG4gICAgICAgIHNlY3Rpb24uc2hlbHZlcy5wdXNoKHNoZWxmSWQpO1xyXG4gICAgICAgIHNlY3Rpb24uc2hlbGZEaXZzLnB1c2goc2hlbGZEaXYpO1xyXG4gICAgICAgIHNlY3Rpb24ucHJvZHVjdHMucHVzaCguLi5zLnByb2R1Y3RzKTtcclxuICAgICAgICBzZWN0aW9uLmNhcGFjaXR5ICs9IHNoZWxmQ2FwYWNpdHk7XHJcbiAgICAgICAgaWYgKGhhc0ltcHJvcGVyUHJvZHVjdCkgc2VjdGlvbi5pbXByb3BlciA9IHRydWU7XHJcbiAgICAgICAgc2VjdGlvbi5taXNzaW5nICs9IG1pc3NDb3VudDtcclxuICAgICAgICBzZWN0aW9uLm1pc3BsYWNlZCArPSBtaXNwbGFjZWRDb3VudDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmICh0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnN0b3JhZ2VQcm9kdWN0cz8ubGVuZ3RoKSB7XHJcbiAgICAvLyAgIGNvbnN0IHN0b3JhZ2VQcm9kdWN0cyA9IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5zdG9yYWdlUHJvZHVjdHM7XHJcblxyXG4gICAgLy8gICBuZXdTZWN0aW9uQnlab25lcy5wdXNoKHtcclxuICAgIC8vICAgICB6b25lOiBcIlN0b3JhZ2VcIixcclxuICAgIC8vICAgICBzZWN0aW9uOiB7XHJcbiAgICAvLyAgICAgICBicmFuZHM6IHN0b3JhZ2VQcm9kdWN0cy5tYXAoKHA6IGFueSkgPT4gcC5icmFuZE5hbWUpLFxyXG4gICAgLy8gICAgICAgY2F0ZWdvcmllczogc3RvcmFnZVByb2R1Y3RzLm1hcCgocDogYW55KSA9PiBwLmJyYW5kTmFtZSksXHJcbiAgICAvLyAgICAgICBzaGVsdmVzOiBbXSxcclxuICAgIC8vICAgICAgIHNoZWxmRGl2czogW10sXHJcbiAgICAvLyAgICAgICBwcm9kdWN0czogc3RydWN0dXJlZENsb25lKHN0b3JhZ2VQcm9kdWN0cykgPz8gW10sXHJcbiAgICAvLyAgICAgICBpbXByb3BlcjogZmFsc2UsXHJcbiAgICAvLyAgICAgICBoYXNNaXNwbGFjZWQ6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgaGFzTWlzc2luZzogZmFsc2UsXHJcbiAgICAvLyAgICAgICBjYXBhY2l0eTogc3RvcmFnZVByb2R1Y3RzLmxlbmd0aCxcclxuICAgIC8vICAgICB9LFxyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICB0aGlzLnNlY3Rpb25CeVpvbmVzID0gWy4uLm5ld1NlY3Rpb25CeVpvbmVzXTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgZ3JvdXBTaGVsdmVzQnlab25lKGlucHV0OiBTaGVsZkNvbmZpZ1tdKTogU2VjdGlvbkNvbmZpZ1tdIHtcclxuICAgIGNvbnN0IHpvbmVNYXA6IHsgW3pvbmU6IHN0cmluZ106IFNlY3Rpb25Db25maWcgfSA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dCkge1xyXG4gICAgICBjb25zdCB6b25lID0gaXRlbT8uem9uZSA/PyBcIlwiO1xyXG4gICAgICBjb25zdCBzaGVsZkxhYmVsID0gYCR7aXRlbS5zaGVsZlR5cGV9ICR7aXRlbS5zaGVsZk51bWJlcn1gO1xyXG5cclxuICAgICAgaWYgKCF6b25lTWFwW3pvbmVdKSB7XHJcbiAgICAgICAgem9uZU1hcFt6b25lXSA9IHtcclxuICAgICAgICAgIHNoZWx2ZXM6IFtdLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTpcclxuICAgICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSBcIkwyXCJcclxuICAgICAgICAgICAgICA/IGl0ZW0ucHJvZHVjdEJyYW5kTmFtZVxyXG4gICAgICAgICAgICAgIDogW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6XHJcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gXCJMMlwiXHJcbiAgICAgICAgICAgICAgPyBpdGVtLnByb2R1Y3RDYXRlZ29yeVxyXG4gICAgICAgICAgICAgIDogW10sXHJcbiAgICAgICAgICB6b25lOiB6b25lLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHpvbmVNYXBbem9uZV0/LnNoZWx2ZXM/LnB1c2goc2hlbGZMYWJlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoem9uZU1hcCk7XHJcbiAgfVxyXG5cclxuICBhcHBseVNlY3Rpb25Db25maWdUb1NoZWx2ZXMoc2VjdGlvbnM6IFNlY3Rpb25Db25maWdbXSk6IFNoZWxmQ29uZmlnW10ge1xyXG4gICAgY29uc3Qgc2VjdGlvbk1hcCA9IG5ldyBNYXA8XHJcbiAgICAgIHN0cmluZyxcclxuICAgICAgUGljazxTZWN0aW9uQ29uZmlnLCBcInpvbmVcIiB8IFwicHJvZHVjdEJyYW5kTmFtZVwiIHwgXCJwcm9kdWN0Q2F0ZWdvcnlcIj5cclxuICAgID4oKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcclxuICAgICAgZm9yIChjb25zdCBzaGVsZkxhYmVsIG9mIHNlY3Rpb24uc2hlbHZlcyEpIHtcclxuICAgICAgICBzZWN0aW9uTWFwLnNldChzaGVsZkxhYmVsLCB7XHJcbiAgICAgICAgICB6b25lOiBzZWN0aW9uLnpvbmUsXHJcbiAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBzZWN0aW9uLnByb2R1Y3RCcmFuZE5hbWUsXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IHNlY3Rpb24ucHJvZHVjdENhdGVnb3J5LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXBwbHkgb3ZlcnJpZGVzIHRvIG1hdGNoaW5nIHNoZWx2ZXNcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/Lm1hcCgoc2hlbGY6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNoZWxmTGFiZWwgPSBgJHtzaGVsZi5zaGVsZlR5cGV9ICR7c2hlbGYuc2hlbGZOdW1iZXJ9YDtcclxuICAgICAgICBjb25zdCBvdmVycmlkZSA9IHNlY3Rpb25NYXAuZ2V0KHNoZWxmTGFiZWwpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uc2hlbGYsXHJcbiAgICAgICAgICB6b25lOiBvdmVycmlkZT8uem9uZSB8fCBcIlwiLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogb3ZlcnJpZGU/LnByb2R1Y3RCcmFuZE5hbWUgPz8gW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IG92ZXJyaWRlPy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgfTtcclxuICAgICAgfSkgPz8gW11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvcGVuWm9uZUxldmVsUHJvZHVjdE1vZGFsQnlQcm9kdWN0KHA6IGFueSwgczogYW55KSB7XHJcbiAgICBjb25zdCBwTG9jYXRvciA9IHtcclxuICAgICAgczogcy5zaGVsZk51bWJlcixcclxuICAgICAgcGlkOiBwPy5wcm9kdWN0SWQsXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHpvbmVEYXRhID0gdGhpcy5zZWN0aW9uQnlab25lcy5maW5kKFxyXG4gICAgICAoc2gpID0+IHNoLnpvbmUgPT09IChzPy56b25lID8/IFwiVG9wXCIpLFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLm9wZW5ab25lTGV2ZWxQcm9kdWN0TW9kYWwoem9uZURhdGEsIFwic2VjdGlvblwiLCBwTG9jYXRvcik7XHJcbiAgfVxyXG5cclxuICBvcGVuWm9uZUxldmVsUHJvZHVjdE1vZGFsKFxyXG4gICAgem9uZURhdGE6IGFueSxcclxuICAgIGxldmVsOiBzdHJpbmcsXHJcbiAgICBwTG9jYXRvcj86IHsgczogbnVtYmVyOyBwaWQ6IGFueSB9LFxyXG4gICkge1xyXG4gICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgem9uZTogem9uZURhdGEuem9uZSxcclxuICAgICAgc2hlbHZlczogdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLnNoZWxmQ29uZmlnLmZpbHRlcihcclxuICAgICAgICAoczogYW55KSA9PiBzLnpvbmUgPT09IHpvbmVEYXRhLnpvbmUsXHJcbiAgICAgICksXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChkYXRhLnNoZWx2ZXMuZXZlcnkoKHM6IGFueSkgPT4gcy5wcm9kdWN0cy5sZW5ndGggPiAwKSkge1xyXG4gICAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubmdiTW9kYWwub3Blbihab25lUHJvZHVjdHNDb21wb25lbnQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgICB3aW5kb3dDbGFzczogXCJtZXJjaC1jb21wbGlhbmNlLW1vZGFsXCIsXHJcbiAgICAgIH0pO1xyXG4gICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kYXRhID0gZGF0YTtcclxuICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UubGV2ZWwgPSBsZXZlbDtcclxuICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZmxvb3JEYXRhID0gdGhpcy5mbG9vckRhdGE7XHJcbiAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnZtTGlzdCA9IHRoaXMudm1MaXN0O1xyXG4gICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5wcm9kdWN0TG9jYXRpb24gPSBwTG9jYXRvcjtcclxuXHJcbiAgICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgIHRoaXMuY2hhbmdlRml4dHVyZS5lbWl0KHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wZW5TdG9yZUJveFByb2R1Y3RzKCkge1xyXG4gICAgaWYgKHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5zdG9yYWdlUHJvZHVjdHMubGVuZ3RoIDw9IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBNQVhfUFJPRFVDVFNfUEVSX1NIRUxGID0gNjtcclxuICAgIGNvbnN0IHNoZWx2ZXMgPSBbXTtcclxuXHJcbiAgICAvLyBDcmVhdGluZyBJbWFnaW5hcnkgc2hlbHZlcyB0byBkaXNwbGF5IHRoZSBzdG9yYWdlIGJveCBwcm9kdWN0cy5cclxuICAgIGZvciAoXHJcbiAgICAgIGxldCBpID0gMDtcclxuICAgICAgaSA8IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5zdG9yYWdlUHJvZHVjdHMubGVuZ3RoO1xyXG4gICAgICBpICs9IE1BWF9QUk9EVUNUU19QRVJfU0hFTEZcclxuICAgICkge1xyXG4gICAgICBzaGVsdmVzLnB1c2goe1xyXG4gICAgICAgIHNoZWxmVHlwZTogXCJzaGVsZlwiLFxyXG4gICAgICAgIHByb2R1Y3RzOiB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMuc3RvcmFnZVByb2R1Y3RzLnNsaWNlKFxyXG4gICAgICAgICAgaSxcclxuICAgICAgICAgIGkgKyBNQVhfUFJPRFVDVFNfUEVSX1NIRUxGLFxyXG4gICAgICAgICksXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIHpvbmU6IFwiU3RvcmFnZSBCb3hcIixcclxuICAgICAgc2hlbHZlczogc2hlbHZlcyxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oWm9uZVByb2R1Y3RzQ29tcG9uZW50LCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB3aW5kb3dDbGFzczogXCJtZXJjaC1jb21wbGlhbmNlLW1vZGFsXCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kYXRhID0gZGF0YTtcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmxldmVsID0gXCJzZWN0aW9uXCI7XHJcbiAgfVxyXG5cclxuICBkaXN0cmlidXRlUm91bmRSb2Jpbihwcm9kdWN0czogYW55LCB0cmF5Um93czogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRyYXlSb3dzIH0sICgpID0+IFtdKTtcclxuXHJcbiAgICBwcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgY29uc3QgdHJheUluZGV4ID0gaW5kZXggJSB0cmF5Um93cztcclxuICAgICAgcmVzdWx0W3RyYXlJbmRleF0ucHVzaChwcm9kdWN0KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLyBpc0Vycm9yUHJvZHVjdChwcm9kdWN0cz86IGFueVtdKSB7XHJcbiAgLy8gICBpZiAocHJvZHVjdHMpIHtcclxuICAvLyAgICAgcmV0dXJuIHByb2R1Y3RzLnNvbWUoXHJcbiAgLy8gICAgICAgKHA6IGFueSkgPT4gcC5zdGF0dXMgPT0gXCJtaXNzaW5nXCIgfHwgcC5zdGF0dXMgPT0gXCJtaXNwbGFjZWRcIlxyXG4gIC8vICAgICApO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIHRydWU7XHJcbiAgLy8gfVxyXG5cclxuICBnZXRTaGVsZlJvd1dpdGhQcm9kdWN0cygpIHt9XHJcblxyXG4gIG9uQ2xpY2tDbG9zZSgpIHtcclxuICAgIHRoaXMub25DbG9zZS5lbWl0KFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgb3BlblBvcHVwKHR5cGU6IGFueSkge1xyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQW5hbHl0aWNzUG9wdXBDb21wb25lbnQsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIHdpbmRvd0NsYXNzOiBcIm1lcmNoLWNvbXBsaWFuY2UtbW9kYWxcIixcclxuICAgICAgc2l6ZTogJ2xnJ1xyXG4gICAgfSk7XHJcblxyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGF0YSA9IHRoaXMuZW5nYWdlcnNMaXN0O1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudHlwZSA9IHR5cGU7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8c2VjdGlvbiBpZD1cImZpeHR1cmUtYW5hbHl0aWMtZGV0YWlsc1wiICpuZ0lmPVwiIWlzUGFnZUxvYWRpbmdcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggcC0yIHctMTAwIGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPHN2ZyAoY2xpY2spPVwib25DbGlja0Nsb3NlKClcIiBjbGFzcz1cIm0tMiBjdXJzb3ItcG9pbnRlclwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJoZXJvLWJsb2NrXCI+XHJcbiAgICAgICAgPGgxIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDtmb250LXNpemU6IDMwcHg7XCI+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUNvbXBsaWFuY2UgPz8gMCB9fSU8L2gxPlxyXG4gICAgICAgIDxwPkNvbXBsaWFuY2Ugc2NvcmU8L3A+XHJcbiAgICAgICAgPHA+XHJcbiAgICAgICAgICAgIHt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8ubGFiZWwgfX08c3Bhbj4mIzgyMjY7PC9zcGFuPlxyXG4gICAgICAgICAgICB7e2ZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVDYXRlZ29yeX19IDxzcGFuPiYjODIyNjs8L3NwYW4+XHJcbiAgICAgICAgICAgIHt7Zml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoLnZhbHVlfX17e2ZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aC51bml0fX08c3Bhbj4mIzgyMjY7PC9zcGFuPlxyXG4gICAgICAgICAgICB7e2ZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGh9fSBTaGVsdmVzXHJcbiAgICAgICAgPC9wPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItNCBwZS01XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2ggXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBbY2hlY2tlZF09XCJzaG93Vk1zXCIgWyhuZ01vZGVsKV09XCJzaG93Vk1zXCIgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgLz5cclxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiY29sb3I6IGJsYWNrOyB3aGl0ZS1zcGFjZTogbm93cmFwXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIHN1YiBtcy0yXCIgZm9yPVwic2hvd1ZNc1wiPlxyXG4gICAgICAgICAgICAgICAgU2hvdyBWTVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IGctM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTIwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGgtMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMlwiICpuZ0lmPVwiZml4dHVyZUZvb3RmYWxsPy5jb252ZXJzaW9uQ291bnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+VG90YWwgRm9vdGZhbGw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWItMVwiPnt7Zml4dHVyZUZvb3RmYWxsPy56b25lVG90YWw/LlByZXZpb3VzRGF0YX19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xIHNtYWxsXCIgW25nQ2xhc3NdPVwiZml4dHVyZUZvb3RmYWxsPy56b25lVG90YWw/LlByZXZpb3VzVmFyaWF0aW9uID8gJ3RleHQtc3VjY2VzcycgOiAndGV4dC1kYW5nZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTMgMTNcIiBmaWxsPVwibm9uZVwiIHN0eWxlPVwidHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcIiAqbmdJZj1cIiFmaXh0dXJlRm9vdGZhbGw/LnpvbmVUb3RhbD8uUHJldmlvdXNWYXJpYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjMxOTggMy4yMTM4Nkw3LjIzMTE3IDguMzAyNDZMNC41NTI5NiA1LjYyNDI1TDAuNTM1NjQzIDkuNjQxNTdNMTIuMzE5OCAzLjIxMzg2SDkuMTA1OTJNMTIuMzE5OCAzLjIxMzg2VjYuNDI3NzFcIiBzdHJva2U9XCIjRDkyRDIwXCIgc3Ryb2tlLXdpZHRoPVwiMS4yMDUyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTMgMTNcIiBmaWxsPVwibm9uZVwiICpuZ0lmPVwiZml4dHVyZUZvb3RmYWxsPy56b25lVG90YWw/LlByZXZpb3VzVmFyaWF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMi4zMTk4IDMuMjEzODZMNy4yMzExNyA4LjMwMjQ2TDQuNTUyOTYgNS42MjQyNUwwLjUzNTY0MyA5LjY0MTU3TTEyLjMxOTggMy4yMTM4Nkg5LjEwNTkyTTEyLjMxOTggMy4yMTM4NlY2LjQyNzcxXCIgc3Ryb2tlPVwiIzAzOTg1NVwiIHN0cm9rZS13aWR0aD1cIjEuMjA1MlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7Zml4dHVyZUZvb3RmYWxsPy56b25lVG90YWw/LmNvdW50fX0lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkXCI+dnMgUHJldmlvdXMgZGF5PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0yMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTJcIiAqbmdJZj1cImZpeHR1cmVGb290ZmFsbD8uY29udmVyc2lvbkNvdW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPlpvbmUgQ29udmVyc2lvbjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJtYi0xXCI+e3tmaXh0dXJlRm9vdGZhbGw/LmNvbnZlcnNpb25Db3VudD8uUHJldmlvdXNEYXRhfX08L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTEgc21hbGxcIiBbbmdDbGFzc109XCJmaXh0dXJlRm9vdGZhbGw/LmNvbnZlcnNpb25Db3VudD8uUHJldmlvdXNWYXJpYXRpb24gPyAndGV4dC1zdWNjZXNzJyA6ICd0ZXh0LWRhbmdlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCIgc3R5bGU9XCJ0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1wiICpuZ0lmPVwiIWZpeHR1cmVGb290ZmFsbD8uY29udmVyc2lvbkNvdW50Py5QcmV2aW91c1ZhcmlhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuMzE5OCAzLjIxMzg2TDcuMjMxMTcgOC4zMDI0Nkw0LjU1Mjk2IDUuNjI0MjVMMC41MzU2NDMgOS42NDE1N00xMi4zMTk4IDMuMjEzODZIOS4xMDU5Mk0xMi4zMTk4IDMuMjEzODZWNi40Mjc3MVwiIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2Utd2lkdGg9XCIxLjIwNTJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCIgKm5nSWY9XCJmaXh0dXJlRm9vdGZhbGw/LmNvbnZlcnNpb25Db3VudD8uUHJldmlvdXNWYXJpYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjMxOTggMy4yMTM4Nkw3LjIzMTE3IDguMzAyNDZMNC41NTI5NiA1LjYyNDI1TDAuNTM1NjQzIDkuNjQxNTdNMTIuMzE5OCAzLjIxMzg2SDkuMTA1OTJNMTIuMzE5OCAzLjIxMzg2VjYuNDI3NzFcIiBzdHJva2U9XCIjMDM5ODU1XCIgc3Ryb2tlLXdpZHRoPVwiMS4yMDUyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3tmaXh0dXJlRm9vdGZhbGw/LmNvbnZlcnNpb25Db3VudD8uY291bnR9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj52cyBQcmV2aW91cyBkYXk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTIwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGgtMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMlwiICpuZ0lmPVwiZml4dHVyZUZvb3RmYWxsPy5jb252ZXJzaW9uQ291bnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+QXZnIER3ZWxsIFRpbWU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWItMVwiPnt7Zml4dHVyZUZvb3RmYWxsPy5kd2VsbFRpbWU/LlByZXZpb3VzRGF0YX19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyZ2FwLTEgc21hbGxcIiBbbmdDbGFzc109XCJmaXh0dXJlRm9vdGZhbGw/LmR3ZWxsVGltZT8uUHJldmlvdXNWYXJpYXRpb24gPyAndGV4dC1zdWNjZXNzJyA6ICd0ZXh0LWRhbmdlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCIgc3R5bGU9XCJ0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1wiICpuZ0lmPVwiIWZpeHR1cmVGb290ZmFsbD8uZHdlbGxUaW1lPy5QcmV2aW91c1ZhcmlhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuMzE5OCAzLjIxMzg2TDcuMjMxMTcgOC4zMDI0Nkw0LjU1Mjk2IDUuNjI0MjVMMC41MzU2NDMgOS42NDE1N00xMi4zMTk4IDMuMjEzODZIOS4xMDU5Mk0xMi4zMTk4IDMuMjEzODZWNi40Mjc3MVwiIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2Utd2lkdGg9XCIxLjIwNTJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCIgKm5nSWY9XCJmaXh0dXJlRm9vdGZhbGw/LmR3ZWxsVGltZT8uUHJldmlvdXNWYXJpYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjMxOTggMy4yMTM4Nkw3LjIzMTE3IDguMzAyNDZMNC41NTI5NiA1LjYyNDI1TDAuNTM1NjQzIDkuNjQxNTdNMTIuMzE5OCAzLjIxMzg2SDkuMTA1OTJNMTIuMzE5OCAzLjIxMzg2VjYuNDI3NzFcIiBzdHJva2U9XCIjMDM5ODU1XCIgc3Ryb2tlLXdpZHRoPVwiMS4yMDUyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3tmaXh0dXJlRm9vdGZhbGw/LmR3ZWxsVGltZT8uY291bnR9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj52cyBQcmV2aW91cyBkYXk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGlkPVwidm0tcHJvZHVjdHMtc3VtXCIgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0IG10LThcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZml4dHVyZS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwiaGVhZGVyLWJsb2NrXCIgY2xhc3M9XCJoZWFkZXItYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8ubGFiZWwgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBCb2R5IGJsb2NrIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwiYm9keS1ibG9jay1zdW1cIiBjbGFzcz1cImJvZHktYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVtWTSBCTE9DS10tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8udm1Db25maWc/Lmxlbmd0aFwiIFtuZ0NsYXNzXT1cInsnZC1ub25lJzohc2hvd1ZNc31cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2bSBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy52bUNvbmZpZzsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCIndm0nICsgaVwiIGNsYXNzPVwidm0tYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRTZWxlY3RlZFZNKHZtKSBhcyBzZWxlY3RlZFZNXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cInNlbGVjdGVkVk0/LmltZ1VybDsgZWxzZSBwbGFjZWhvbGRlclwiIFtzcmNdPVwic2VsZWN0ZWRWTT8uaW1nVXJsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiVm0gSW1hZ2VcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhY2Vob2xkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2bS1wbGFjZWhvbGRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPnt7IHNlbGVjdGVkVk0/Lm5hbWUgfX08L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tW0ZJWFRVUkUgTEVWRUwgLSBCUkFORCBDQVRFR09SWV0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJmaXh0dXJlLWxldmVsXCIgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSAnTDEnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImJyYW5kLWNhdGVnb3J5XCIgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdEJyYW5kTmFtZT8ubGVuZ3RoXCIgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYiBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0QnJhbmROYW1lOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGRyYWZ0IG1lLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIG10LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcGFjaXR5IHt7Zml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUNhcGFjaXR5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2JyYW5kQ2F0ZWdvcnlUb29sdGlwPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+QnJhbmRzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYyBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0QnJhbmROYW1lOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0Q2F0ZWdvcnk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bU0VDVElPTiBMRVZFTCAtIEJSQU5EIENBVEVHT1JZXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInNlY3Rpb24tbGV2ZWxcIiAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09ICdMMydcIj5cclxuICAgICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNlY3Rpb25CeVpvbmVzOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiJ2JyYW5kLWNhdGVnb3J5JyArICRpbmRleFwiIGNsYXNzPVwiYnJhbmQtY2F0ZWdvcnlcIiBbbmdiVG9vbHRpcF09XCJicmFuZENhdGVnb3J5VG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblpvbmVMZXZlbFByb2R1Y3RNb2RhbChpdGVtLCdzZWN0aW9uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnByb3Blcl09XCIhaXRlbT8uc2VjdGlvbj8uaW1wcm9wZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGluYWN0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uem9uZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGluYWN0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcGFjaXR5IHt7IGl0ZW0/LnNlY3Rpb24/LmNhcGFjaXR5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uYnJhbmRzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYiBvZiBpdGVtPy5zZWN0aW9uPy5icmFuZHM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCIgY2xhc3M9XCJzZXBhcmF0b3JcIj4gLSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeVwiICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGMgb2YgaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllczt0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlXCIgKm5nSWY9XCJpdGVtLnNlY3Rpb24ubWlzc2luZyA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzc2luZyB7e2l0ZW0uc2VjdGlvbi5taXNzaW5nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZVwiICpuZ0lmPVwiaXRlbS5zZWN0aW9uLm1pc3BsYWNlZCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzcGxhY2VkIHt7aXRlbS5zZWN0aW9uLm1pc3BsYWNlZH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkJyYW5kczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChiIG9mIGl0ZW0/LnNlY3Rpb24/LmJyYW5kczt0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJpdGVtPy5zZWN0aW9uPy5jYXRlZ29yaWVzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+Q2F0ZWdvcmllczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjIG9mIGl0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiJ3N1bVNoZWxmQ29udGFpbmVyJyArIGlcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVtTSEVMRiBMRVZFTCAtIEJSQU5EIENBVEVHT1JZXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInNoZWxmLWxldmVsXCIgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSAnTDInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIidicmFuZC1jYXRlZ29yeScgKyBpXCIgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiICpuZ0lmPVwiaXRlbS5wcm9kdWN0QnJhbmROYW1lPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmRcIiAqbmdJZj1cIml0ZW0ucHJvZHVjdEJyYW5kTmFtZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYiBvZiBpdGVtLnByb2R1Y3RCcmFuZE5hbWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0ucHJvZHVjdENhdGVnb3J5Py5sZW5ndGhcIiBjbGFzcz1cInNlcGFyYXRvclwiPiAtIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdJZj1cIml0ZW0ucHJvZHVjdENhdGVnb3J5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiIG9mIGl0ZW0ucHJvZHVjdENhdGVnb3J5OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkJyYW5kczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGl0ZW0ucHJvZHVjdEJyYW5kTmFtZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJpdGVtLnByb2R1Y3RDYXRlZ29yeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBpdGVtLnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBpbmFjdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBhY2l0eSB7e2l0ZW0/LnByb2R1Y3RQZXJTaGVsZiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0uc2hlbGZUeXBlID09PSdzaGVsZicpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoaXRlbS5wcm9kdWN0cy5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgaXRlbS5wcm9kdWN0cztsZXQgcCA9IGluZGV4XCIgY2xhc3M9XCJwcm9kdWN0IGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmVycm9yXT1cInByb2R1Y3Quc3RhdHVzID09PSAnbWlzc2luZycgfHwgcHJvZHVjdC5zdGF0dXMgPT09ICdtaXNwbGFjZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5ab25lTGV2ZWxQcm9kdWN0TW9kYWxCeVByb2R1Y3QocHJvZHVjdCxpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYocHJvZHVjdC5zdGF0dXMgIT0gJ21pc3NpbmcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJwcm9kdWN0Py5wcm9kdWN0SW1hZ2VVcmw7IGVsc2UgcGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwicHJvZHVjdD8ucHJvZHVjdEltYWdlVXJsXCIgYWx0PVwiUHJvZHVjdCBJbWFnZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlISArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoaXRlbS5wcm9kdWN0cy5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBpdGVtLmRpc3RyaWJ1dGVkUm93cztsZXQgciA9IGluZGV4XCIgY2xhc3M9XCJ0cmF5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiByb3c7bGV0IHAgPSBpbmRleFwiIGNsYXNzPVwicHJvZHVjdCBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXJyb3JdPVwicHJvZHVjdC5zdGF0dXMgPT09ICdtaXNzaW5nJyB8fCBwcm9kdWN0LnN0YXR1cyA9PT0gJ21pc3BsYWNlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5ab25lTGV2ZWxQcm9kdWN0TW9kYWxCeVByb2R1Y3QocHJvZHVjdCxpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHByb2R1Y3Quc3RhdHVzICE9ICdtaXNzaW5nJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cInByb2R1Y3Q/LnByb2R1Y3RJbWFnZVVybDsgZWxzZSBwbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwicHJvZHVjdD8ucHJvZHVjdEltYWdlVXJsXCIgYWx0PVwiUHJvZHVjdCBJbWFnZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFjZWhvbGRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1AZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0udHJheVJvd3MpXCIgY2xhc3M9XCJ0cmF5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRm9vdGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwiZm9vdGVyLWJsb2NrXCIgY2xhc3M9XCJmb290ZXItYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIGxlZnQtYm94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciByaWdodC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8ubGFiZWwgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBpZD1cInN0b3JhZ2UtYm94LXpvbmVcIiAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnN0b3JhZ2VQcm9kdWN0cz8ubGVuZ3RoXCIgY2xhc3M9XCJzdG9yYWdlLWJveFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblN0b3JlQm94UHJvZHVjdHMoKVwiIFtuZ2JUb29sdGlwXT1cImJyYW5kQ2F0ZWdvcnlUb29sdGlwXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBpbmFjdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIENhcGFjaXR5IHt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnN0b3JhZ2VQcm9kdWN0cz8ubGVuZ3RoICA/PyAwfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IocCBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zdG9yYWdlUHJvZHVjdHM7IHRyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3AuYnJhbmROYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IocCBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zdG9yYWdlUHJvZHVjdHM7IHRyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3AuY2F0ZWdvcnl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJyYW5kcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5CcmFuZHM6IDwvYj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc3RvcmFnZVByb2R1Y3RzPy5zbGljZSgwLCAyMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjayAkaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9ICRsYXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGI/LmJyYW5kTmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICgoZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc3RvcmFnZVByb2R1Y3RzPy5sZW5ndGggPz8gMCkgPiAyMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgK3t7IChmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zdG9yYWdlUHJvZHVjdHMubGVuZ3RoIC0gMjApIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2F0ZWdvcmllcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5DYXRlZ29yaWVzOiA8L2I+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnN0b3JhZ2VQcm9kdWN0cz8uc2xpY2UoMCwgMjApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgJGluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSAkbGFzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBiPy5jYXRlZ29yeSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICgoZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc3RvcmFnZVByb2R1Y3RzPy5sZW5ndGggPz8gMCkgPiAyMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgK3t7IChmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zdG9yYWdlUHJvZHVjdHMubGVuZ3RoIC0gMjApIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBnLTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0yNVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTJcIiAqbmdJZj1cImVuZ2FnZXJzTGlzdD8uWydUb3AgRW5nYWdlZCddPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWhlYWRlciBiZy1oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlRvcCBFbmdhZ2VkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Db3VudDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlciBweS0yIGJvcmRlci1ib3R0b21cIiAqbmdGb3I9XCJsZXQgdG9wIG9mIHRvcEVuZ2FnZXJzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwidG9wPy5pbWFnZVVybCA/IHRvcC5pbWFnZVVybCA6ICd7e2ltZ0NETn19Zml4dHVyZUltYWdlL2ltYWdlbm90Zm91bmQucG5nJ1wiIGFsdD1cIlByb2R1Y3RcIiBjbGFzcz1cInJvdW5kZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1tZWRpdW0gdGV4dC1kYXJrIHNtYWxsXCI+e3t0b3A/LkJyYW5kbmFtZSA/PyAnJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZFwiIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4O1wiPnt7dG9wPy5wcm9kdWN0QnJhbmROYW1lID8/ICcnfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1tZWRpdW0gdGV4dC1kYXJrXCI+e3t0b3A/LmNvdW50ID8/IDB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZW5kIHB5LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ0ZXh0LXByaW1hcnkgdGV4dC1kZWNvcmF0aW9uLXVuZGVybGluZVwiIChjbGljayk9XCJvcGVuUG9wdXAoJ1RvcCBFbmdhZ2VkJylcIj5WaWV3IGFsbDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTI1XCIgKm5nSWY9XCJlbmdhZ2Vyc0xpc3Q/LlsnTm9uIEVuZ2FnZWQnXT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGgtMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1oZWFkZXIgYmctaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5MZWFzdC9Ob24gRW5nYWdlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q291bnQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgcHktMiBib3JkZXItYm90dG9tXCIgKm5nRm9yPVwibGV0IHRvcCBvZiBsZWFzdEVuZ2FnZXJzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwidG9wPy5pbWFnZVVybCA/IHRvcC5pbWFnZVVybCA6ICd7e2ltZ0NETn19Zml4dHVyZUltYWdlL2ltYWdlbm90Zm91bmQucG5nJ1wiIGFsdD1cIlByb2R1Y3RcIiBjbGFzcz1cInJvdW5kZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1tZWRpdW0gdGV4dC1kYXJrIHNtYWxsXCI+e3t0b3AuQnJhbmRuYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgc3R5bGU9XCJmb250LXNpemU6IDEycHg7XCI+e3t0b3A/LnByb2R1Y3RCcmFuZE5hbWUgPz8gJyd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LW1lZGl1bSB0ZXh0LWRhcmtcIj57e3RvcD8uY291bnQgPz8gMH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmQgcHktMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInRleHQtcHJpbWFyeSB0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lXCIgKGNsaWNrKT1cIm9wZW5Qb3B1cCgnbGVhc3RfTm9uX0VuZ2FnZWQnKVwiPlZpZXcgYWxsPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjxzZWN0aW9uIGlkPVwidGVtcGxhdGUtc3VtbWFyeS1za2VsZXRvblwiICpuZ0lmPVwiaXNQYWdlTG9hZGluZ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NlY3Rpb24+Il19