tango-app-ui-store-builder 1.0.12 → 1.0.13

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 (34) hide show
  1. package/esm2022/lib/components/fixture-template/fixture-template.component.mjs +9 -23
  2. package/esm2022/lib/components/fixture-template/template-basic-details/template-basic-details.component.mjs +47 -84
  3. package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +1 -1
  4. package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +5 -4
  5. package/esm2022/lib/components/manage-store-plano/manage-store-plano-feedback/manage-store-plano-feedback.component.mjs +3 -3
  6. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +46 -366
  7. package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +10 -51
  8. package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +9 -26
  9. package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +2 -2
  10. package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +73 -101
  11. package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +3 -3
  12. package/esm2022/lib/interfaces/fixture-template.interface.mjs +1 -1
  13. package/esm2022/lib/services/store-builder.service.mjs +4 -4
  14. package/esm2022/lib/tango-store-builder.module.mjs +7 -11
  15. package/fesm2022/tango-app-ui-store-builder.mjs +1147 -2524
  16. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  17. package/lib/components/fixture-template/fixture-template.component.d.ts +0 -1
  18. package/lib/components/fixture-template/template-basic-details/template-basic-details.component.d.ts +9 -9
  19. package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +1 -1
  20. package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +1 -1
  21. package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +6 -23
  22. package/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.d.ts +1 -1
  23. package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +6 -7
  24. package/lib/components/manage-store-plano/template-vms/template-vms.component.d.ts +9 -9
  25. package/lib/interfaces/fixture-template.interface.d.ts +2 -2
  26. package/lib/services/store-builder.service.d.ts +1 -1
  27. package/lib/tango-store-builder.module.d.ts +33 -35
  28. package/package.json +1 -1
  29. package/esm2022/lib/components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component.mjs +0 -80
  30. package/esm2022/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.mjs +0 -375
  31. package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +0 -486
  32. package/lib/components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component.d.ts +0 -21
  33. package/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.d.ts +0 -48
  34. package/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.d.ts +0 -76
@@ -1,486 +0,0 @@
1
- import { Component, EventEmitter, Input, Output, } from "@angular/core";
2
- import { Subject } from "rxjs";
3
- import { ActionConfirmPopupComponent } from "./action-confirm-popup/action-confirm-popup.component";
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@ng-bootstrap/ng-bootstrap";
6
- import * as i2 from "@angular/common";
7
- import * as i3 from "@angular/forms";
8
- import * as i4 from "./fixture/fixture.component";
9
- export class VerificationFeedbackComponent {
10
- ngbModal;
11
- floorData;
12
- totalFixtures = [];
13
- feedbackDetails;
14
- cdn;
15
- showAction = true;
16
- changeFixture = new EventEmitter();
17
- action = new EventEmitter();
18
- selectedFeedbackData;
19
- isPageLoading = true;
20
- currentFixtureIndex;
21
- planoFixtureQuickDetails = [];
22
- aiFixtureQuickDetails = [];
23
- planoFixture;
24
- aiFixture;
25
- editingPlanoFixture = null;
26
- editingAiFixture = null;
27
- selectedAiVmImageForPreview = null;
28
- isPlanoQuickEdit = false;
29
- isAIQuickEdit = false;
30
- highlightDifferences = true;
31
- isQuickEditSubmitted = false;
32
- destroy$ = new Subject();
33
- constructor(ngbModal) {
34
- this.ngbModal = ngbModal;
35
- }
36
- ngOnInit() { }
37
- ngOnChanges(changes) {
38
- if (changes["feedbackDetails"]?.currentValue) {
39
- this.onCancelAIQuickEdit();
40
- this.onCancelPlanoQuickEdit();
41
- this.currentFixtureIndex =
42
- this.totalFixtures.findIndex((f) => f._id === this.feedbackDetails?.fixtureFeedback?.fixtureId) + 1;
43
- this.planoFixture = structuredClone(this.feedbackDetails?.fixtureFeedback?.FixtureData);
44
- this.aiFixture = structuredClone(this.feedbackDetails?.fixtureFeedback?.fixtureAIData);
45
- this.planoFixtureQuickDetails = this.buildFixtureQuickDetails(this.feedbackDetails?.fixtureFeedback?.FixtureData);
46
- this.aiFixtureQuickDetails = this.buildFixtureQuickDetails(this.feedbackDetails?.fixtureFeedback?.fixtureAIData);
47
- if (!this.isApproved) {
48
- this.compareQuickDetails();
49
- }
50
- }
51
- }
52
- get isApproved() {
53
- return this.feedbackDetails?.fixtureFeedback?.approvalStatus === "approved";
54
- }
55
- buildFixtureQuickDetails(fixture) {
56
- if (!fixture)
57
- return [];
58
- const list = [];
59
- const safe = (v) => v === null || v === undefined || v === "" ? "-" : v;
60
- list.push({
61
- key: "fixtureHeader",
62
- label: "Fixture Header:",
63
- value: safe(fixture?.header?.label),
64
- editable: true,
65
- meta: { type: "fixture" },
66
- });
67
- list.push({
68
- key: "fixtureType",
69
- label: "Fixture type:",
70
- value: safe(fixture.fixtureCategory),
71
- editable: false,
72
- });
73
- const fWidth = fixture.fixtureWidth || {};
74
- list.push({
75
- key: "fixtureWidth",
76
- label: "Size (Width):",
77
- value: fWidth?.value ? `${safe(fWidth.value)}${safe(fWidth.unit)}` : "-",
78
- editable: false,
79
- });
80
- const shelves = Array.isArray(fixture.shelfConfig)
81
- ? fixture.shelfConfig
82
- : [];
83
- list.push({
84
- key: "totalShelves",
85
- label: "Total shelves:",
86
- value: shelves.length ? String(shelves.length) : "-",
87
- editable: false,
88
- });
89
- shelves
90
- .sort((a, b) => a.shelfNumber - b.shelfNumber)
91
- .forEach((s) => {
92
- const shelfNum = Number(safe(s.shelfNumber));
93
- const isShelf = s.shelfType === "shelf";
94
- const key = `${isShelf ? "shelf" : "tray"}_${shelfNum}`;
95
- const label = isShelf
96
- ? `Shelf ${shelfNum} capacity:`
97
- : `Tray ${shelfNum} capacity:`;
98
- let capacity = "-";
99
- if (s.productPerShelf) {
100
- if (isShelf) {
101
- capacity = String(s.productPerShelf);
102
- }
103
- else {
104
- const trayRows = s.trayRows || 0;
105
- capacity = trayRows ? String(s.productPerShelf * trayRows) : "-";
106
- }
107
- }
108
- list.push({
109
- key,
110
- label,
111
- value: capacity,
112
- editable: true,
113
- meta: {
114
- type: isShelf ? "shelf" : "tray",
115
- shelfNumber: shelfNum,
116
- },
117
- });
118
- });
119
- const totalCapacity = shelves.reduce((acc, s) => {
120
- if (!s.productPerShelf)
121
- return acc;
122
- if (s.shelfType === "shelf")
123
- return acc + s.productPerShelf;
124
- const rows = s.trayRows || 0;
125
- return acc + (rows ? s.productPerShelf * rows : 0);
126
- }, 0);
127
- list.push({
128
- key: "totalCapacity",
129
- label: "Total capacity:",
130
- value: totalCapacity ? String(totalCapacity) : "-",
131
- editable: false,
132
- });
133
- const vm = Array.isArray(fixture.vmConfig) ? fixture.vmConfig : [];
134
- vm.forEach((v, i) => {
135
- list.push({
136
- key: `vmType_${i}`,
137
- label: `VM type ${i + 1}:`,
138
- value: safe(v.vmType),
139
- editable: false,
140
- });
141
- list.push({
142
- key: `vmName_${i}`,
143
- label: "VM Collection:",
144
- value: safe(v.vmName),
145
- editable: false,
146
- });
147
- });
148
- return list;
149
- }
150
- compareQuickDetails() {
151
- const plano = this.planoFixtureQuickDetails;
152
- const ai = this.aiFixtureQuickDetails;
153
- if (!plano?.length || !ai?.length)
154
- return;
155
- const planoMap = new Map(plano.map((i) => [i.key, i]));
156
- const planoVMKeySet = new Set((this.feedbackDetails?.fixtureFeedback?.FixtureData?.vmConfig ?? []).map((v) => `${v.vmType}|${v.vmName}`.toLowerCase()));
157
- const aiVMList = (this.feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig ?? []).map((v) => `${v.vmType}|${v.vmName}`.toLowerCase());
158
- ai.forEach((item) => (item.isDifferent = false));
159
- ai.forEach((aiItem) => {
160
- const pItem = planoMap.get(aiItem.key);
161
- if (!pItem) {
162
- aiItem.isDifferent = true;
163
- return;
164
- }
165
- const pVal = (pItem.value ?? "-").toString().trim().toLowerCase();
166
- const aVal = (aiItem.value ?? "-").toString().trim().toLowerCase();
167
- if (aiItem.key.startsWith("vm")) {
168
- const idx = Number(aiItem.key.split("_")[1]);
169
- const aiVMKey = aiVMList[idx] ?? "";
170
- if (!planoVMKeySet.has(aiVMKey)) {
171
- aiItem.isDifferent = true;
172
- }
173
- return;
174
- }
175
- const isShelfPlano = pItem.key.startsWith("shelf_");
176
- const isShelfAI = aiItem.key.startsWith("shelf_");
177
- const isTrayPlano = pItem.key.startsWith("tray_");
178
- const isTrayAI = aiItem.key.startsWith("tray_");
179
- if (isShelfPlano || isTrayPlano) {
180
- if (isShelfPlano !== isShelfAI || isTrayPlano !== isTrayAI) {
181
- aiItem.isDifferent = true;
182
- return;
183
- }
184
- if (pVal !== aVal) {
185
- aiItem.isDifferent = true;
186
- }
187
- return;
188
- }
189
- if (pVal !== aVal) {
190
- aiItem.isDifferent = true;
191
- }
192
- });
193
- }
194
- onChangeFixture(change) {
195
- this.changeFixture.emit({
196
- currentFixture: this.feedbackDetails.fixtureFeedback.fixtureId,
197
- action: change,
198
- });
199
- this.onCancelAIQuickEdit();
200
- this.onCancelPlanoQuickEdit();
201
- }
202
- async onClickKeepPlano() {
203
- try {
204
- const result = await this.confirmAction("keepPlano");
205
- if (result?.action === "notOk")
206
- return false;
207
- this.action.emit({
208
- action: "keepPlano",
209
- type: "agree",
210
- fixtureData: this.planoFixture,
211
- feedback: this.feedbackDetails?.fixtureFeedback,
212
- remarks: result?.remark,
213
- planoId: this.floorData.planoId,
214
- floorId: this.floorData._id,
215
- taskType: "fixture",
216
- });
217
- }
218
- catch (error) {
219
- console.log("@@ ~ onClickKeepPlano [ERR]:", error);
220
- return false;
221
- }
222
- return true;
223
- }
224
- async onClickAcceptAI() {
225
- try {
226
- const result = await this.confirmAction("acceptAI");
227
- if (result?.action === "notOk")
228
- return false;
229
- this.action.emit({
230
- action: "acceptAi",
231
- type: "agree",
232
- fixtureData: this.aiFixture,
233
- feedback: this.feedbackDetails?.fixtureFeedback,
234
- remarks: result?.remark,
235
- planoId: this.floorData.planoId,
236
- floorId: this.floorData._id,
237
- taskType: "fixture",
238
- });
239
- }
240
- catch (error) {
241
- console.log("@@ ~ onClickAcceptAI [ERR]:", error);
242
- return false;
243
- }
244
- return true;
245
- }
246
- async onClickRedo() {
247
- if (this.isAIQuickEdit || this.isPlanoQuickEdit)
248
- return;
249
- try {
250
- const result = await this.confirmAction("redo");
251
- if (result?.action === "notOk")
252
- return;
253
- this.action.emit({
254
- action: "redo",
255
- type: "disagree",
256
- fixtureData: null,
257
- feedback: this.feedbackDetails?.fixtureFeedback,
258
- remark: result,
259
- planoId: this.floorData.planoId,
260
- floorId: this.floorData._id,
261
- taskType: "fixture",
262
- });
263
- }
264
- catch (error) {
265
- console.log("@@ ~ onClickRedo [ERR]:", error);
266
- }
267
- }
268
- onEditCurrentFixture() {
269
- this.action.emit({
270
- action: "editWithPlano",
271
- type: "agree",
272
- fixtureData: this.planoFixture,
273
- feedback: this.feedbackDetails?.fixtureFeedback,
274
- planoId: this.floorData.planoId,
275
- floorId: this.floorData._id,
276
- taskType: "fixture",
277
- });
278
- }
279
- onEditAIFeedback() {
280
- this.action.emit({
281
- action: "editWithAi",
282
- type: "agree",
283
- fixtureData: this.aiFixture,
284
- feedback: this.feedbackDetails?.fixtureFeedback,
285
- planoId: this.floorData.planoId,
286
- floorId: this.floorData._id,
287
- taskType: "fixture",
288
- });
289
- }
290
- togglePlanoQuickEdit() {
291
- if (this.isAIQuickEdit)
292
- return;
293
- if (!this.isPlanoQuickEdit) {
294
- this.editingPlanoFixture = structuredClone(this.planoFixture);
295
- }
296
- this.isPlanoQuickEdit = !this.isPlanoQuickEdit;
297
- }
298
- toggleAIQuickEdit() {
299
- if (this.isPlanoQuickEdit)
300
- return;
301
- if (!this.isAIQuickEdit) {
302
- this.editingAiFixture = structuredClone(this.aiFixture);
303
- }
304
- this.isAIQuickEdit = !this.isAIQuickEdit;
305
- }
306
- onCancelPlanoQuickEdit() {
307
- this.editingPlanoFixture = null;
308
- this.planoFixtureQuickDetails = this.buildFixtureQuickDetails(this.planoFixture);
309
- this.isPlanoQuickEdit = false;
310
- this.isQuickEditSubmitted = false;
311
- }
312
- async onSavePlanoQuickEdit() {
313
- try {
314
- this.isQuickEditSubmitted = true;
315
- if (this.isQuickValuesContainsError("plano"))
316
- return;
317
- const result = await this.confirmAction("keepPlano");
318
- if (result?.action === "notOk")
319
- return false;
320
- if (this.editingPlanoFixture) {
321
- this.planoFixture = structuredClone(this.editingPlanoFixture);
322
- }
323
- this.editingPlanoFixture = null;
324
- this.planoFixtureQuickDetails = this.buildFixtureQuickDetails(this.planoFixture);
325
- this.compareQuickDetails();
326
- this.action.emit({
327
- action: "keepPlano",
328
- type: "agree",
329
- fixtureData: this.planoFixture,
330
- feedback: this.feedbackDetails?.fixtureFeedback,
331
- remarks: result?.remark,
332
- planoId: this.floorData.planoId,
333
- floorId: this.floorData._id,
334
- taskType: "fixture",
335
- });
336
- this.isPlanoQuickEdit = false;
337
- this.isQuickEditSubmitted = false;
338
- }
339
- catch (error) {
340
- console.log("@@ ~ error:", error);
341
- }
342
- }
343
- onCancelAIQuickEdit() {
344
- this.editingAiFixture = null;
345
- this.aiFixtureQuickDetails = this.buildFixtureQuickDetails(this.aiFixture);
346
- this.isAIQuickEdit = false;
347
- this.isQuickEditSubmitted = false;
348
- }
349
- async onSaveAIQuickEdit() {
350
- try {
351
- this.isQuickEditSubmitted = true;
352
- if (this.isQuickValuesContainsError("ai"))
353
- return;
354
- const result = await this.confirmAction("acceptAI");
355
- if (result?.action === "notOk")
356
- return false;
357
- if (this.editingAiFixture) {
358
- this.aiFixture = structuredClone(this.editingAiFixture);
359
- }
360
- this.editingAiFixture = null;
361
- this.aiFixtureQuickDetails = this.buildFixtureQuickDetails(this.aiFixture);
362
- this.compareQuickDetails();
363
- this.action.emit({
364
- action: "acceptAi",
365
- type: "agree",
366
- fixtureData: this.aiFixture,
367
- feedback: this.feedbackDetails?.fixtureFeedback,
368
- remarks: result?.remark,
369
- planoId: this.floorData.planoId,
370
- floorId: this.floorData._id,
371
- taskType: "fixture",
372
- });
373
- this.isAIQuickEdit = false;
374
- this.isQuickEditSubmitted = false;
375
- }
376
- catch (error) {
377
- console.log("@@ ~ onSaveAIQuickEdit [ERR]:", error);
378
- }
379
- }
380
- onCapacityInput(event, item, source) {
381
- const input = event.target;
382
- let v = input.value.replace(/[^0-9]/g, "").slice(0, 2);
383
- input.value = v;
384
- item.value = v;
385
- this.onQuickValueChange(item, item.value, source);
386
- }
387
- onQuickValueChange(item, newValue, source) {
388
- const targetFixture = source === "plano" ? this.editingPlanoFixture : this.editingAiFixture;
389
- if (!targetFixture || !item?.meta)
390
- return;
391
- const value = newValue?.trim();
392
- item.value = value;
393
- if (item.meta.type === "fixture" && item.key === "fixtureHeader") {
394
- targetFixture.header.label = value || "";
395
- return;
396
- }
397
- const shelfNumber = item.meta.shelfNumber;
398
- if (!shelfNumber)
399
- return;
400
- const shelf = (targetFixture.shelfConfig ?? []).find((s) => Number(s.shelfNumber) === shelfNumber);
401
- if (!shelf)
402
- return;
403
- const numericValue = Number(value);
404
- if (isNaN(numericValue) || numericValue < 0)
405
- return;
406
- // Shelf → direct mapping
407
- if (item.meta.type === "shelf") {
408
- shelf.productPerShelf = numericValue;
409
- return;
410
- }
411
- // Tray → reverse calculate
412
- if (item.meta.type === "tray") {
413
- const rows = Number(shelf.trayRows) || 0;
414
- if (!rows)
415
- return;
416
- shelf.productPerShelf = Math.floor(numericValue / rows);
417
- }
418
- }
419
- isQuickValuesContainsError(target) {
420
- const targetList = target === "ai"
421
- ? this.aiFixtureQuickDetails
422
- : this.planoFixtureQuickDetails;
423
- const checkList = targetList.filter((l) => l.editable && l.meta?.type != "fixture");
424
- const error = checkList.some((cl) => cl.value == "" ||
425
- cl.value == undefined ||
426
- cl.value == null ||
427
- cl.value == "0" ||
428
- cl.value == "00");
429
- if (error) {
430
- return error;
431
- }
432
- else {
433
- const checkList = targetList.filter((l) => l.editable && l.meta?.type == "fixture");
434
- const error = checkList.some((cl) => cl.value == "" ||
435
- cl.value == undefined ||
436
- cl.value == null ||
437
- cl.value == "-");
438
- return error;
439
- }
440
- }
441
- async confirmAction(type) {
442
- try {
443
- const modelRef = this.ngbModal.open(ActionConfirmPopupComponent, {
444
- centered: true,
445
- size: "md",
446
- backdrop: "static",
447
- });
448
- modelRef.componentInstance.type = type;
449
- return await modelRef.result.then((result) => result);
450
- }
451
- catch (error) {
452
- return null;
453
- }
454
- }
455
- onClickVMImagePreview(imgUrl) {
456
- this.selectedAiVmImageForPreview = imgUrl;
457
- }
458
- closeVMImagePreview() {
459
- this.selectedAiVmImageForPreview = null;
460
- }
461
- ngOnDestroy() {
462
- this.destroy$.next();
463
- this.destroy$.complete();
464
- }
465
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VerificationFeedbackComponent, deps: [{ token: i1.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
466
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: VerificationFeedbackComponent, selector: "lib-verification-feedback", inputs: { floorData: "floorData", totalFixtures: "totalFixtures", feedbackDetails: "feedbackDetails", cdn: "cdn", showAction: "showAction" }, outputs: { changeFixture: "changeFixture", action: "action" }, usesOnChanges: true, ngImport: i0, template: "<section id=\"verification-feedback\">\r\n\r\n <div *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\" id=\"task-info\" ngbAccordion #accordion=\"ngbAccordion\">\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"feedbackDetails?.taskInfoToggle\">\r\n <div ngbAccordionHeader class=\"accordion-button task-info-header\">\r\n <div ngbAccordionToggle class=\"w-100\">\r\n <h2>Fixture verification assigned</h2>\r\n <p>{{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"log-block\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{feedbackDetails?.fixtureFeedback?.taskData?.createdByName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mma, dd MMM yyyy'}}\r\n </p>\r\n <h5>Assigner</h5>\r\n </div>\r\n </div>\r\n\r\n <div class=\"log-block\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4> {{feedbackDetails?.fixtureFeedback?.taskData?.userName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.submitTime_string}}\r\n </p>\r\n <h5>Assignee</h5>\r\n </div>\r\n </div>\r\n\r\n\r\n @if (feedbackDetails?.globalComments?.length) {\r\n <h5 class=\"mb-2\">Comments</h5>\r\n <div class=\"log-block\" *ngFor=\"let c of feedbackDetails?.globalComments;let i= index\">\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n <h5>{{c?.comment}}</h5>\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\">\r\n\r\n <div id=\"feedback-handler\" class=\"d-flex align-items-center gap-6 my-6 px-3 fixture-navigate\">\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n\r\n <h3 class=\"m-0\">{{planoFixture?.header?.label}}</h3>\r\n\r\n <h3 *ngIf=\"showAction\" class=\"m-0 ms-auto\">\r\n {{currentFixtureIndex}}/{{totalFixtures.length}}\r\n </h3>\r\n\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n </div>\r\n\r\n @if( this.aiFixture?.fixtureId){\r\n\r\n <div id=\"fixture-quick-details\" class=\"row g-0 \">\r\n <div class=\"col-6 p-2\">\r\n <div class=\"quick-edit-container\">\r\n\r\n @if (!isApproved && showAction) {\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button class=\"btn btn-outline quick-btn ms-auto\" type=\"button\"\r\n (click)=\"onEditCurrentFixture()\" [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onClickKeepPlano()\"\r\n [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n Keep plano\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <h4>Planogram: </h4>\r\n\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'keepPlano' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithPlano' \"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n }@else{\r\n <svg *ngIf=\"showAction && !isPlanoQuickEdit\" class=\"ms-auto cursor-pointer\"\r\n (click)=\"togglePlanoQuickEdit()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n [class.disabled]=\"isAIQuickEdit\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div *ngIf=\"showAction && isPlanoQuickEdit && !isAIQuickEdit\"\r\n class=\"d-flex gap-2 align-items-center ms-auto\">\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\"\r\n (click)=\"onCancelPlanoQuickEdit()\">\r\n Cancel\r\n </button>\r\n <button class=\"btn btn-primary quick-btn\" type=\"button\"\r\n (click)=\"onSavePlanoQuickEdit()\">\r\n Done\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"quick-details\">\r\n <div *ngFor=\"let item of planoFixtureQuickDetails\" class=\"row g-0 mb-4\">\r\n\r\n <p class=\"col-6 label\">{{ item.label }}</p>\r\n\r\n <!-- Inline editing -->\r\n <ng-container *ngIf=\"isPlanoQuickEdit && item.editable; else planoValue\">\r\n <!-- FIXTURE NAME (text) -->\r\n <ng-container *ngIf=\"item.meta?.type === 'fixture'; else capacityInput\">\r\n <div class=\"d-flex flex-column w-50\">\r\n <input class=\"col-6 value edit-input form-control w-100\" [ngModel]=\"item.value\"\r\n (ngModelChange)=\"onQuickValueChange(item, $event, 'plano')\" type=\"text\"\r\n maxlength=\"150\" />\r\n @if((item.value == '' || item.value == null || item.value == undefined ) && isQuickEditSubmitted){\r\n <p class=\"text-danger m-0 mt-1\" style=\"font-size: 11px;\">Cannot be empty</p>\r\n }\r\n </div>\r\n </ng-container>\r\n\r\n <!-- CAPACITY (number) -->\r\n <ng-template #capacityInput>\r\n <div class=\"d-flex flex-column w-50\">\r\n\r\n <input class=\"col-6 value edit-input form-control w-100\" [value]=\"item.value\"\r\n type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" autocomplete=\"off\"\r\n (input)=\"onCapacityInput($event, item, 'plano')\" />\r\n\r\n @if((item.value =='' || item.value == null || item.value == undefined || item.value == '0' ||item.value == '00' ) && isQuickEditSubmitted){\r\n <p class=\"text-danger m-0 mt-1\" style=\"font-size: 11px;\">Cannot be 0 or\r\n empty</p>\r\n }\r\n </div>\r\n\r\n </ng-template>\r\n\r\n\r\n </ng-container>\r\n\r\n <!-- Normal text -->\r\n <ng-template #planoValue>\r\n <p class=\"col-6 value\">\r\n {{ item.meta?.type === 'fixture' ? item.value : (item.value | titlecase) }}\r\n </p>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n <div class=\"col-6 p-2\">\r\n <div class=\"quick-edit-container\">\r\n\r\n @if (!isApproved && showAction) {\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <span class=\"redo-btn\" (click)=\"onClickRedo()\"\r\n [class.disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">Redo</span>\r\n\r\n <button class=\"btn btn-outline quick-btn ms-auto\" type=\"button\" (click)=\"onEditAIFeedback()\"\r\n [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onClickAcceptAI()\"\r\n [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_5774)\">\r\n <path\r\n d=\"M4.16602 1.6665L4.32435 2.44984C4.43782 3.01234 4.69457 3.53603 5.06977 3.97021C5.44497 4.40439 5.9259 4.73435 6.46602 4.92817L6.66602 4.99984L6.46602 5.0715C5.9259 5.26532 5.44497 5.59529 5.06977 6.02947C4.69457 6.46365 4.43782 6.98733 4.32435 7.54984L4.16602 8.33317L4.00768 7.54984C3.89422 6.98733 3.63746 6.46365 3.26226 6.02947C2.88706 5.59529 2.40613 5.26532 1.86602 5.0715L1.66602 4.99984L1.86602 4.92817C2.40613 4.73435 2.88706 4.40439 3.26226 3.97021C3.63746 3.53603 3.89422 3.01234 4.00768 2.44984L4.16602 1.6665ZM6.66602 13.3332L6.85768 14.3965C6.90745 14.6739 7.02674 14.9341 7.20439 15.1528C7.38204 15.3716 7.61226 15.5417 7.87352 15.6473L8.33268 15.8332L7.87352 16.019C7.61221 16.1244 7.38189 16.2944 7.20409 16.513C7.0263 16.7316 6.90683 16.9917 6.85685 17.269L6.66602 18.3332L6.47435 17.2698C6.42458 16.9925 6.30529 16.7322 6.12764 16.5135C5.94999 16.2947 5.71978 16.1246 5.45852 16.019L4.99935 15.8332L5.45852 15.6473C5.71983 15.5419 5.95014 15.372 6.12794 15.1534C6.30573 14.9348 6.4252 14.6746 6.47518 14.3973L6.66602 13.3332ZM13.3327 2.49984L13.796 4.7115C14.0322 5.83907 14.5565 6.88621 15.3178 7.75081C16.0791 8.61541 17.0515 9.26796 18.1402 9.64484L19.166 9.99984L18.1402 10.3548C17.0515 10.7317 16.0791 11.3843 15.3178 12.2489C14.5565 13.1135 14.0322 14.1606 13.796 15.2882L13.3327 17.4998L12.8693 15.2882C12.6332 14.1606 12.1089 13.1135 11.3476 12.2489C10.5862 11.3843 9.61382 10.7317 8.52518 10.3548L7.49935 9.99984L8.52518 9.64484C9.61382 9.26796 10.5862 8.61541 11.3476 7.75081C12.1089 6.88621 12.6332 5.83907 12.8693 4.7115L13.3327 2.49984Z\"\r\n stroke=\"black\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_5774\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n\r\n Accept AI\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_5774)\">\r\n <path\r\n d=\"M4.16602 1.6665L4.32435 2.44984C4.43782 3.01234 4.69457 3.53603 5.06977 3.97021C5.44497 4.40439 5.9259 4.73435 6.46602 4.92817L6.66602 4.99984L6.46602 5.0715C5.9259 5.26532 5.44497 5.59529 5.06977 6.02947C4.69457 6.46365 4.43782 6.98733 4.32435 7.54984L4.16602 8.33317L4.00768 7.54984C3.89422 6.98733 3.63746 6.46365 3.26226 6.02947C2.88706 5.59529 2.40613 5.26532 1.86602 5.0715L1.66602 4.99984L1.86602 4.92817C2.40613 4.73435 2.88706 4.40439 3.26226 3.97021C3.63746 3.53603 3.89422 3.01234 4.00768 2.44984L4.16602 1.6665ZM6.66602 13.3332L6.85768 14.3965C6.90745 14.6739 7.02674 14.9341 7.20439 15.1528C7.38204 15.3716 7.61226 15.5417 7.87352 15.6473L8.33268 15.8332L7.87352 16.019C7.61221 16.1244 7.38189 16.2944 7.20409 16.513C7.0263 16.7316 6.90683 16.9917 6.85685 17.269L6.66602 18.3332L6.47435 17.2698C6.42458 16.9925 6.30529 16.7322 6.12764 16.5135C5.94999 16.2947 5.71978 16.1246 5.45852 16.019L4.99935 15.8332L5.45852 15.6473C5.71983 15.5419 5.95014 15.372 6.12794 15.1534C6.30573 14.9348 6.4252 14.6746 6.47518 14.3973L6.66602 13.3332ZM13.3327 2.49984L13.796 4.7115C14.0322 5.83907 14.5565 6.88621 15.3178 7.75081C16.0791 8.61541 17.0515 9.26796 18.1402 9.64484L19.166 9.99984L18.1402 10.3548C17.0515 10.7317 16.0791 11.3843 15.3178 12.2489C14.5565 13.1135 14.0322 14.1606 13.796 15.2882L13.3327 17.4998L12.8693 15.2882C12.6332 14.1606 12.1089 13.1135 11.3476 12.2489C10.5862 11.3843 9.61382 10.7317 8.52518 10.3548L7.49935 9.99984L8.52518 9.64484C9.61382 9.26796 10.5862 8.61541 11.3476 7.75081C12.1089 6.88621 12.6332 5.83907 12.8693 4.7115L13.3327 2.49984Z\"\r\n stroke=\"black\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_5774\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <h4>AI Output: </h4>\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'acceptAi' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithAi'\"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n }@else {\r\n <svg *ngIf=\"showAction && !isAIQuickEdit\" [class.disabled]=\"isPlanoQuickEdit\"\r\n class=\"ms-auto cursor-pointer\" (click)=\"toggleAIQuickEdit()\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div *ngIf=\"showAction && isAIQuickEdit && !isPlanoQuickEdit\"\r\n class=\"d-flex gap-2 align-items-center ms-auto\">\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onCancelAIQuickEdit()\">\r\n Cancel\r\n </button>\r\n <button class=\"btn btn-primary quick-btn\" type=\"button\" (click)=\"onSaveAIQuickEdit()\">\r\n Done\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"quick-details\">\r\n <div *ngFor=\"let item of aiFixtureQuickDetails\" class=\"row g-0 mb-4\"\r\n [class.diff]=\"highlightDifferences && item.isDifferent\">\r\n\r\n <p class=\"col-6 label\">{{ item.label }}</p>\r\n\r\n <!-- Inline editing -->\r\n <ng-container *ngIf=\"isAIQuickEdit && item.editable; else aiValue\">\r\n <!-- FIXTURE NAME (text) -->\r\n <ng-container *ngIf=\"item.meta?.type === 'fixture'; else capacityInput\">\r\n <div class=\"d-flex flex-column w-50\">\r\n <input class=\"col-6 value edit-input form-control w-100\" [ngModel]=\"item.value\"\r\n (ngModelChange)=\"onQuickValueChange(item, $event, 'ai')\" type=\"text\"\r\n maxlength=\"150\" />\r\n @if((item.value == '' || item.value == null || item.value == undefined ) && isQuickEditSubmitted){\r\n <p class=\"text-danger m-0 mt-1\" style=\"font-size: 11px;\">Cannot be empty</p>\r\n }\r\n </div>\r\n </ng-container>\r\n\r\n <!-- CAPACITY (number) -->\r\n <ng-template #capacityInput>\r\n <div class=\"d-flex flex-column w-50\">\r\n\r\n <input class=\"col-6 value edit-input form-control w-100\" [value]=\"item.value\"\r\n type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" autocomplete=\"off\"\r\n (input)=\"onCapacityInput($event, item, 'ai')\" />\r\n\r\n @if((item.value =='' || item.value == null || item.value == undefined || item.value == '0'||item.value == '00') && isQuickEditSubmitted){\r\n <p class=\"text-danger m-0 mt-1\" style=\"font-size: 11px;\">Cannot be 0 or\r\n empty</p>\r\n }\r\n </div>\r\n\r\n </ng-template>\r\n\r\n\r\n </ng-container>\r\n\r\n <!-- Normal text -->\r\n <ng-template #aiValue>\r\n <p class=\"col-6 value\">\r\n {{ item.meta?.type === 'fixture' ? item.value : (item.value | titlecase) }}\r\n </p>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"fixture-comparison\" class=\"row g-0 my-3\">\r\n <div class=\"col-6 p-2\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"mb-1\">Planogram design</h5>\r\n <p>Template designed by the planogram team</p>\r\n </div>\r\n <lib-fixture [fixture]=\"planoFixture\"></lib-fixture>\r\n </div>\r\n\r\n <div class=\"col-6 p-2\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"mb-1\">Store response</h5>\r\n <p>Planogram response by the store team</p>\r\n </div>\r\n @if(cdn && aiFixture?.fixtureImage){\r\n <div class=\"fixture-image\">\r\n <img [src]=\"cdn + aiFixture?.fixtureImage\" alt=\"Store response image\">\r\n </div>\r\n }@else {\r\n <div class=\"text-center my-7\">\r\n <svg width=\"186\" height=\"84\" viewBox=\"0 0 186 84\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M130.256 15.3284C140.092 15.3284 148.065 23.302 148.065 33.1379C148.065 37.2176 150.826 41.8684 154.906 41.8684H167.972C177.807 41.8687 185.781 49.8422 185.781 59.678C185.781 69.5141 177.807 77.4885 167.971 77.4885H81.3662C69.7186 77.4883 58.6349 68.4084 46.9873 68.4084H5.93652C2.65782 68.4084 0 65.7506 0 62.4719C0.000127823 59.1933 2.6579 56.5354 5.93652 56.5354H61.8728C63.0069 56.5354 63.9669 55.6929 64.2897 54.6056C64.7994 52.8892 63.6267 50.9485 61.8361 50.9485H43.6514C33.8153 50.9485 25.8418 42.974 25.8418 33.1379C25.842 23.302 33.8154 15.3284 43.6514 15.3284H130.256Z\"\r\n fill=\"#EAECF0\" />\r\n <path\r\n d=\"M126.664 27.335V48.65L120.959 43.75C118.229 41.405 113.819 41.405 111.089 43.75L96.5291 56.245C93.7991 58.59 89.3891 58.59 86.6591 56.245L85.4691 55.265C82.9841 53.095 79.0291 52.885 76.2291 54.775L59.0091 66.325L58.6241 66.605C57.3291 63.805 56.6641 60.48 56.6641 56.665V27.335C56.6641 14.595 64.2591 7 76.9991 7H106.329C119.069 7 126.664 14.595 126.664 27.335Z\"\r\n fill=\"#6BCAFF\" />\r\n <path\r\n d=\"M81.164 36.3299C85.7645 36.3299 89.494 32.6005 89.494 27.9999C89.494 23.3994 85.7645 19.6699 81.164 19.6699C76.5635 19.6699 72.834 23.3994 72.834 27.9999C72.834 32.6005 76.5635 36.3299 81.164 36.3299Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M126.665 48.65V56.665C126.665 69.405 119.07 77 106.33 77H77C68.075 77 61.635 73.255 58.625 66.605L59.01 66.325L76.23 54.775C79.03 52.885 82.985 53.095 85.47 55.265L86.66 56.245C89.39 58.59 93.8 58.59 96.53 56.245L111.09 43.75C113.82 41.405 118.23 41.405 120.96 43.75L126.665 48.65Z\"\r\n fill=\"#00A3FF\" />\r\n <circle cx=\"138.064\" cy=\"28.3128\" r=\"4.40042\" fill=\"#6BCAFF\" />\r\n <circle cx=\"47.8256\" cy=\"39.2409\" r=\"2.45255\" fill=\"#6BCAFF\" />\r\n <ellipse cx=\"139.183\" cy=\"61.0072\" rx=\"4.29197\" ry=\"4.59854\" fill=\"#00A3FF\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <hr>\r\n\r\n <div id=\"vm-comparison\" *ngIf=\"feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig.length\">\r\n <h5 class=\"mb-1\">Visual Merchandise Images from AI output:</h5>\r\n\r\n <div class=\"row g-0\">\r\n\r\n @for (vm of feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig; track $index) {\r\n <div class=\"col-6 p-2\">\r\n <div class=\"vm-container\" (click)=\"onClickVMImagePreview(cdn+vm?.vmImage)\">\r\n <div class=\"vm-img\">\r\n <img [src]=\"cdn+vm?.vmImage\" alt=\"VM Image\">\r\n </div>\r\n <div class=\"d-flex flex-column gap-2 vm-details \">\r\n <h5>{{vm?.vmType}}</h5>\r\n <h5>{{vm?.vmName}}</h5>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"img-preview\" *ngIf=\"selectedAiVmImageForPreview\" (click)=\"closeVMImagePreview()\">\r\n <img [src]=\"selectedAiVmImageForPreview\" class=\"full-img\" />\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"my-6\">\r\n <div class=\"text-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n <path\r\n d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <div class=\"mt-3 text-center\">\r\n <div class=\"fw-bold h3 mt-2\">No response</div>\r\n <div class=\"mt-4\">No AI response found for this fixture.</div>\r\n </div>\r\n </div>\r\n <!-- <hr class=\"mb-6\"> -->\r\n }\r\n\r\n\r\n @if (feedbackDetails?.fixtureFeedback?.answers?.[0]?.comments.length) {\r\n <div id=\"fixture-comments\">\r\n <h5 class=\"mb-2\">Comments</h5>\r\n\r\n <div class=\"log-block\"\r\n *ngFor=\"let c of feedbackDetails?.fixtureFeedback?.answers[0]?.comments;let i= index\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n\r\n @if(c?.responsetype === 'comment'){\r\n <h5>{{c?.comment}}</h5>\r\n }@else if(c?.responsetype === 'agree'){\r\n\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'keepPlano'\">\r\n Marked as \"Keep Plano\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithPlano'\">\r\n Marked as \"Keep Plano with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'acceptAi'\">\r\n Marked as \"Accept AI\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithAi'\">\r\n Marked as \"Accept AI with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }@else if(c?.responsetype === 'disagree'){\r\n <h5>\r\n Marked as \"Redo\"\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</section>", styles: ["#verification-feedback{height:100%;overflow-y:auto}#verification-feedback .fixture-navigate,#verification-feedback .task-info-header{user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#verification-feedback h5{color:#1d2939;font-family:Inter;font-weight:600;font-size:12px;line-height:18px;margin:0}#verification-feedback .log-block{display:flex;gap:12px;padding:4px;margin-bottom:18px}#verification-feedback .log-block h4{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback .log-block p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085;margin:0}#verification-feedback #task-info .task-info-header{background-color:#fff!important;padding:6px;width:100%}#verification-feedback #task-info .task-info-header h2{font-weight:600;font-size:14px;line-height:20px;color:#1d2939}#verification-feedback #task-info .task-info-header p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085}#verification-feedback #fixture-quick-details .quick-edit-container{background:#f9fafb;padding:12px;border-radius:6px;width:100%;height:100%}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn{font-size:13px!important;line-height:10px!important;padding:6px 8px!important;border:1px solid rgb(208,213,221);box-shadow:0 1px 2px #1018280d;background:#fff}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-quick-details .quick-edit-container .redo-btn{font-family:Inter;font-weight:600;font-size:14px;line-height:18px;color:#1d2939;cursor:pointer}#verification-feedback #fixture-quick-details .quick-edit-container h4{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;color:#1d2939;margin:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .label{font-family:Inter;font-weight:500;font-size:14px;line-height:20px;color:#475467;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .value{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .diff .value{color:#d92d20!important;font-weight:600}#verification-feedback #fixture-quick-details .quick-edit-container .edit-input{padding:0 4px;border-radius:4px;width:50%;height:20px}#verification-feedback #fixture-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #fixture-comparison p{font-weight:400;font-size:12px;line-height:18px;color:#475467;margin:0}#verification-feedback #fixture-comparison .fixture-image{margin-bottom:12px}#verification-feedback #fixture-comparison .fixture-image img{object-fit:contain;width:100%}#verification-feedback #vm-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #vm-comparison .vm-container{padding:12px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);margin-bottom:12px;display:flex;gap:12px;cursor:pointer}#verification-feedback #vm-comparison .vm-container .vm-img{width:134px;height:134px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);background:var(--Gray-50, #f9fafb)}#verification-feedback #vm-comparison .vm-container .vm-img img{border-radius:2px;min-width:132px;min-height:134px;object-fit:contain;width:100%;height:100%;display:block}#verification-feedback #vm-comparison .vm-container .vm-details,#verification-feedback #vm-comparison .vm-container .vm-details h5{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#verification-feedback #vm-comparison .img-preview{position:fixed;inset:0;background:#000000d9;display:flex;align-items:center;justify-content:center;z-index:9999;cursor:zoom-out}#verification-feedback #vm-comparison .full-img{max-width:90vw;max-height:90vh;border-radius:10px;object-fit:contain}#verification-feedback .disabled{pointer-events:none;cursor:not-allowed!important;opacity:.6}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i1.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i1.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i1.NgbAccordionToggle, selector: "[ngbAccordionToggle]" }, { kind: "directive", type: i1.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i1.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: i4.FixtureComponent, selector: "lib-fixture", inputs: ["fixture"] }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
467
- }
468
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VerificationFeedbackComponent, decorators: [{
469
- type: Component,
470
- args: [{ selector: "lib-verification-feedback", template: "<section id=\"verification-feedback\">\r\n\r\n <div *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\" id=\"task-info\" ngbAccordion #accordion=\"ngbAccordion\">\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"feedbackDetails?.taskInfoToggle\">\r\n <div ngbAccordionHeader class=\"accordion-button task-info-header\">\r\n <div ngbAccordionToggle class=\"w-100\">\r\n <h2>Fixture verification assigned</h2>\r\n <p>{{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"log-block\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{feedbackDetails?.fixtureFeedback?.taskData?.createdByName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mma, dd MMM yyyy'}}\r\n </p>\r\n <h5>Assigner</h5>\r\n </div>\r\n </div>\r\n\r\n <div class=\"log-block\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4> {{feedbackDetails?.fixtureFeedback?.taskData?.userName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.submitTime_string}}\r\n </p>\r\n <h5>Assignee</h5>\r\n </div>\r\n </div>\r\n\r\n\r\n @if (feedbackDetails?.globalComments?.length) {\r\n <h5 class=\"mb-2\">Comments</h5>\r\n <div class=\"log-block\" *ngFor=\"let c of feedbackDetails?.globalComments;let i= index\">\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n <h5>{{c?.comment}}</h5>\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\">\r\n\r\n <div id=\"feedback-handler\" class=\"d-flex align-items-center gap-6 my-6 px-3 fixture-navigate\">\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n\r\n <h3 class=\"m-0\">{{planoFixture?.header?.label}}</h3>\r\n\r\n <h3 *ngIf=\"showAction\" class=\"m-0 ms-auto\">\r\n {{currentFixtureIndex}}/{{totalFixtures.length}}\r\n </h3>\r\n\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n </div>\r\n\r\n @if( this.aiFixture?.fixtureId){\r\n\r\n <div id=\"fixture-quick-details\" class=\"row g-0 \">\r\n <div class=\"col-6 p-2\">\r\n <div class=\"quick-edit-container\">\r\n\r\n @if (!isApproved && showAction) {\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button class=\"btn btn-outline quick-btn ms-auto\" type=\"button\"\r\n (click)=\"onEditCurrentFixture()\" [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onClickKeepPlano()\"\r\n [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n Keep plano\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <h4>Planogram: </h4>\r\n\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'keepPlano' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithPlano' \"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n }@else{\r\n <svg *ngIf=\"showAction && !isPlanoQuickEdit\" class=\"ms-auto cursor-pointer\"\r\n (click)=\"togglePlanoQuickEdit()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n [class.disabled]=\"isAIQuickEdit\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div *ngIf=\"showAction && isPlanoQuickEdit && !isAIQuickEdit\"\r\n class=\"d-flex gap-2 align-items-center ms-auto\">\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\"\r\n (click)=\"onCancelPlanoQuickEdit()\">\r\n Cancel\r\n </button>\r\n <button class=\"btn btn-primary quick-btn\" type=\"button\"\r\n (click)=\"onSavePlanoQuickEdit()\">\r\n Done\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"quick-details\">\r\n <div *ngFor=\"let item of planoFixtureQuickDetails\" class=\"row g-0 mb-4\">\r\n\r\n <p class=\"col-6 label\">{{ item.label }}</p>\r\n\r\n <!-- Inline editing -->\r\n <ng-container *ngIf=\"isPlanoQuickEdit && item.editable; else planoValue\">\r\n <!-- FIXTURE NAME (text) -->\r\n <ng-container *ngIf=\"item.meta?.type === 'fixture'; else capacityInput\">\r\n <div class=\"d-flex flex-column w-50\">\r\n <input class=\"col-6 value edit-input form-control w-100\" [ngModel]=\"item.value\"\r\n (ngModelChange)=\"onQuickValueChange(item, $event, 'plano')\" type=\"text\"\r\n maxlength=\"150\" />\r\n @if((item.value == '' || item.value == null || item.value == undefined ) && isQuickEditSubmitted){\r\n <p class=\"text-danger m-0 mt-1\" style=\"font-size: 11px;\">Cannot be empty</p>\r\n }\r\n </div>\r\n </ng-container>\r\n\r\n <!-- CAPACITY (number) -->\r\n <ng-template #capacityInput>\r\n <div class=\"d-flex flex-column w-50\">\r\n\r\n <input class=\"col-6 value edit-input form-control w-100\" [value]=\"item.value\"\r\n type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" autocomplete=\"off\"\r\n (input)=\"onCapacityInput($event, item, 'plano')\" />\r\n\r\n @if((item.value =='' || item.value == null || item.value == undefined || item.value == '0' ||item.value == '00' ) && isQuickEditSubmitted){\r\n <p class=\"text-danger m-0 mt-1\" style=\"font-size: 11px;\">Cannot be 0 or\r\n empty</p>\r\n }\r\n </div>\r\n\r\n </ng-template>\r\n\r\n\r\n </ng-container>\r\n\r\n <!-- Normal text -->\r\n <ng-template #planoValue>\r\n <p class=\"col-6 value\">\r\n {{ item.meta?.type === 'fixture' ? item.value : (item.value | titlecase) }}\r\n </p>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n <div class=\"col-6 p-2\">\r\n <div class=\"quick-edit-container\">\r\n\r\n @if (!isApproved && showAction) {\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <span class=\"redo-btn\" (click)=\"onClickRedo()\"\r\n [class.disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">Redo</span>\r\n\r\n <button class=\"btn btn-outline quick-btn ms-auto\" type=\"button\" (click)=\"onEditAIFeedback()\"\r\n [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onClickAcceptAI()\"\r\n [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_5774)\">\r\n <path\r\n d=\"M4.16602 1.6665L4.32435 2.44984C4.43782 3.01234 4.69457 3.53603 5.06977 3.97021C5.44497 4.40439 5.9259 4.73435 6.46602 4.92817L6.66602 4.99984L6.46602 5.0715C5.9259 5.26532 5.44497 5.59529 5.06977 6.02947C4.69457 6.46365 4.43782 6.98733 4.32435 7.54984L4.16602 8.33317L4.00768 7.54984C3.89422 6.98733 3.63746 6.46365 3.26226 6.02947C2.88706 5.59529 2.40613 5.26532 1.86602 5.0715L1.66602 4.99984L1.86602 4.92817C2.40613 4.73435 2.88706 4.40439 3.26226 3.97021C3.63746 3.53603 3.89422 3.01234 4.00768 2.44984L4.16602 1.6665ZM6.66602 13.3332L6.85768 14.3965C6.90745 14.6739 7.02674 14.9341 7.20439 15.1528C7.38204 15.3716 7.61226 15.5417 7.87352 15.6473L8.33268 15.8332L7.87352 16.019C7.61221 16.1244 7.38189 16.2944 7.20409 16.513C7.0263 16.7316 6.90683 16.9917 6.85685 17.269L6.66602 18.3332L6.47435 17.2698C6.42458 16.9925 6.30529 16.7322 6.12764 16.5135C5.94999 16.2947 5.71978 16.1246 5.45852 16.019L4.99935 15.8332L5.45852 15.6473C5.71983 15.5419 5.95014 15.372 6.12794 15.1534C6.30573 14.9348 6.4252 14.6746 6.47518 14.3973L6.66602 13.3332ZM13.3327 2.49984L13.796 4.7115C14.0322 5.83907 14.5565 6.88621 15.3178 7.75081C16.0791 8.61541 17.0515 9.26796 18.1402 9.64484L19.166 9.99984L18.1402 10.3548C17.0515 10.7317 16.0791 11.3843 15.3178 12.2489C14.5565 13.1135 14.0322 14.1606 13.796 15.2882L13.3327 17.4998L12.8693 15.2882C12.6332 14.1606 12.1089 13.1135 11.3476 12.2489C10.5862 11.3843 9.61382 10.7317 8.52518 10.3548L7.49935 9.99984L8.52518 9.64484C9.61382 9.26796 10.5862 8.61541 11.3476 7.75081C12.1089 6.88621 12.6332 5.83907 12.8693 4.7115L13.3327 2.49984Z\"\r\n stroke=\"black\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_5774\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n\r\n Accept AI\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_5774)\">\r\n <path\r\n d=\"M4.16602 1.6665L4.32435 2.44984C4.43782 3.01234 4.69457 3.53603 5.06977 3.97021C5.44497 4.40439 5.9259 4.73435 6.46602 4.92817L6.66602 4.99984L6.46602 5.0715C5.9259 5.26532 5.44497 5.59529 5.06977 6.02947C4.69457 6.46365 4.43782 6.98733 4.32435 7.54984L4.16602 8.33317L4.00768 7.54984C3.89422 6.98733 3.63746 6.46365 3.26226 6.02947C2.88706 5.59529 2.40613 5.26532 1.86602 5.0715L1.66602 4.99984L1.86602 4.92817C2.40613 4.73435 2.88706 4.40439 3.26226 3.97021C3.63746 3.53603 3.89422 3.01234 4.00768 2.44984L4.16602 1.6665ZM6.66602 13.3332L6.85768 14.3965C6.90745 14.6739 7.02674 14.9341 7.20439 15.1528C7.38204 15.3716 7.61226 15.5417 7.87352 15.6473L8.33268 15.8332L7.87352 16.019C7.61221 16.1244 7.38189 16.2944 7.20409 16.513C7.0263 16.7316 6.90683 16.9917 6.85685 17.269L6.66602 18.3332L6.47435 17.2698C6.42458 16.9925 6.30529 16.7322 6.12764 16.5135C5.94999 16.2947 5.71978 16.1246 5.45852 16.019L4.99935 15.8332L5.45852 15.6473C5.71983 15.5419 5.95014 15.372 6.12794 15.1534C6.30573 14.9348 6.4252 14.6746 6.47518 14.3973L6.66602 13.3332ZM13.3327 2.49984L13.796 4.7115C14.0322 5.83907 14.5565 6.88621 15.3178 7.75081C16.0791 8.61541 17.0515 9.26796 18.1402 9.64484L19.166 9.99984L18.1402 10.3548C17.0515 10.7317 16.0791 11.3843 15.3178 12.2489C14.5565 13.1135 14.0322 14.1606 13.796 15.2882L13.3327 17.4998L12.8693 15.2882C12.6332 14.1606 12.1089 13.1135 11.3476 12.2489C10.5862 11.3843 9.61382 10.7317 8.52518 10.3548L7.49935 9.99984L8.52518 9.64484C9.61382 9.26796 10.5862 8.61541 11.3476 7.75081C12.1089 6.88621 12.6332 5.83907 12.8693 4.7115L13.3327 2.49984Z\"\r\n stroke=\"black\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_5774\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <h4>AI Output: </h4>\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'acceptAi' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithAi'\"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n }@else {\r\n <svg *ngIf=\"showAction && !isAIQuickEdit\" [class.disabled]=\"isPlanoQuickEdit\"\r\n class=\"ms-auto cursor-pointer\" (click)=\"toggleAIQuickEdit()\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div *ngIf=\"showAction && isAIQuickEdit && !isPlanoQuickEdit\"\r\n class=\"d-flex gap-2 align-items-center ms-auto\">\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onCancelAIQuickEdit()\">\r\n Cancel\r\n </button>\r\n <button class=\"btn btn-primary quick-btn\" type=\"button\" (click)=\"onSaveAIQuickEdit()\">\r\n Done\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"quick-details\">\r\n <div *ngFor=\"let item of aiFixtureQuickDetails\" class=\"row g-0 mb-4\"\r\n [class.diff]=\"highlightDifferences && item.isDifferent\">\r\n\r\n <p class=\"col-6 label\">{{ item.label }}</p>\r\n\r\n <!-- Inline editing -->\r\n <ng-container *ngIf=\"isAIQuickEdit && item.editable; else aiValue\">\r\n <!-- FIXTURE NAME (text) -->\r\n <ng-container *ngIf=\"item.meta?.type === 'fixture'; else capacityInput\">\r\n <div class=\"d-flex flex-column w-50\">\r\n <input class=\"col-6 value edit-input form-control w-100\" [ngModel]=\"item.value\"\r\n (ngModelChange)=\"onQuickValueChange(item, $event, 'ai')\" type=\"text\"\r\n maxlength=\"150\" />\r\n @if((item.value == '' || item.value == null || item.value == undefined ) && isQuickEditSubmitted){\r\n <p class=\"text-danger m-0 mt-1\" style=\"font-size: 11px;\">Cannot be empty</p>\r\n }\r\n </div>\r\n </ng-container>\r\n\r\n <!-- CAPACITY (number) -->\r\n <ng-template #capacityInput>\r\n <div class=\"d-flex flex-column w-50\">\r\n\r\n <input class=\"col-6 value edit-input form-control w-100\" [value]=\"item.value\"\r\n type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" autocomplete=\"off\"\r\n (input)=\"onCapacityInput($event, item, 'ai')\" />\r\n\r\n @if((item.value =='' || item.value == null || item.value == undefined || item.value == '0'||item.value == '00') && isQuickEditSubmitted){\r\n <p class=\"text-danger m-0 mt-1\" style=\"font-size: 11px;\">Cannot be 0 or\r\n empty</p>\r\n }\r\n </div>\r\n\r\n </ng-template>\r\n\r\n\r\n </ng-container>\r\n\r\n <!-- Normal text -->\r\n <ng-template #aiValue>\r\n <p class=\"col-6 value\">\r\n {{ item.meta?.type === 'fixture' ? item.value : (item.value | titlecase) }}\r\n </p>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"fixture-comparison\" class=\"row g-0 my-3\">\r\n <div class=\"col-6 p-2\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"mb-1\">Planogram design</h5>\r\n <p>Template designed by the planogram team</p>\r\n </div>\r\n <lib-fixture [fixture]=\"planoFixture\"></lib-fixture>\r\n </div>\r\n\r\n <div class=\"col-6 p-2\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"mb-1\">Store response</h5>\r\n <p>Planogram response by the store team</p>\r\n </div>\r\n @if(cdn && aiFixture?.fixtureImage){\r\n <div class=\"fixture-image\">\r\n <img [src]=\"cdn + aiFixture?.fixtureImage\" alt=\"Store response image\">\r\n </div>\r\n }@else {\r\n <div class=\"text-center my-7\">\r\n <svg width=\"186\" height=\"84\" viewBox=\"0 0 186 84\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M130.256 15.3284C140.092 15.3284 148.065 23.302 148.065 33.1379C148.065 37.2176 150.826 41.8684 154.906 41.8684H167.972C177.807 41.8687 185.781 49.8422 185.781 59.678C185.781 69.5141 177.807 77.4885 167.971 77.4885H81.3662C69.7186 77.4883 58.6349 68.4084 46.9873 68.4084H5.93652C2.65782 68.4084 0 65.7506 0 62.4719C0.000127823 59.1933 2.6579 56.5354 5.93652 56.5354H61.8728C63.0069 56.5354 63.9669 55.6929 64.2897 54.6056C64.7994 52.8892 63.6267 50.9485 61.8361 50.9485H43.6514C33.8153 50.9485 25.8418 42.974 25.8418 33.1379C25.842 23.302 33.8154 15.3284 43.6514 15.3284H130.256Z\"\r\n fill=\"#EAECF0\" />\r\n <path\r\n d=\"M126.664 27.335V48.65L120.959 43.75C118.229 41.405 113.819 41.405 111.089 43.75L96.5291 56.245C93.7991 58.59 89.3891 58.59 86.6591 56.245L85.4691 55.265C82.9841 53.095 79.0291 52.885 76.2291 54.775L59.0091 66.325L58.6241 66.605C57.3291 63.805 56.6641 60.48 56.6641 56.665V27.335C56.6641 14.595 64.2591 7 76.9991 7H106.329C119.069 7 126.664 14.595 126.664 27.335Z\"\r\n fill=\"#6BCAFF\" />\r\n <path\r\n d=\"M81.164 36.3299C85.7645 36.3299 89.494 32.6005 89.494 27.9999C89.494 23.3994 85.7645 19.6699 81.164 19.6699C76.5635 19.6699 72.834 23.3994 72.834 27.9999C72.834 32.6005 76.5635 36.3299 81.164 36.3299Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M126.665 48.65V56.665C126.665 69.405 119.07 77 106.33 77H77C68.075 77 61.635 73.255 58.625 66.605L59.01 66.325L76.23 54.775C79.03 52.885 82.985 53.095 85.47 55.265L86.66 56.245C89.39 58.59 93.8 58.59 96.53 56.245L111.09 43.75C113.82 41.405 118.23 41.405 120.96 43.75L126.665 48.65Z\"\r\n fill=\"#00A3FF\" />\r\n <circle cx=\"138.064\" cy=\"28.3128\" r=\"4.40042\" fill=\"#6BCAFF\" />\r\n <circle cx=\"47.8256\" cy=\"39.2409\" r=\"2.45255\" fill=\"#6BCAFF\" />\r\n <ellipse cx=\"139.183\" cy=\"61.0072\" rx=\"4.29197\" ry=\"4.59854\" fill=\"#00A3FF\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <hr>\r\n\r\n <div id=\"vm-comparison\" *ngIf=\"feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig.length\">\r\n <h5 class=\"mb-1\">Visual Merchandise Images from AI output:</h5>\r\n\r\n <div class=\"row g-0\">\r\n\r\n @for (vm of feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig; track $index) {\r\n <div class=\"col-6 p-2\">\r\n <div class=\"vm-container\" (click)=\"onClickVMImagePreview(cdn+vm?.vmImage)\">\r\n <div class=\"vm-img\">\r\n <img [src]=\"cdn+vm?.vmImage\" alt=\"VM Image\">\r\n </div>\r\n <div class=\"d-flex flex-column gap-2 vm-details \">\r\n <h5>{{vm?.vmType}}</h5>\r\n <h5>{{vm?.vmName}}</h5>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"img-preview\" *ngIf=\"selectedAiVmImageForPreview\" (click)=\"closeVMImagePreview()\">\r\n <img [src]=\"selectedAiVmImageForPreview\" class=\"full-img\" />\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"my-6\">\r\n <div class=\"text-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n <path\r\n d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <div class=\"mt-3 text-center\">\r\n <div class=\"fw-bold h3 mt-2\">No response</div>\r\n <div class=\"mt-4\">No AI response found for this fixture.</div>\r\n </div>\r\n </div>\r\n <!-- <hr class=\"mb-6\"> -->\r\n }\r\n\r\n\r\n @if (feedbackDetails?.fixtureFeedback?.answers?.[0]?.comments.length) {\r\n <div id=\"fixture-comments\">\r\n <h5 class=\"mb-2\">Comments</h5>\r\n\r\n <div class=\"log-block\"\r\n *ngFor=\"let c of feedbackDetails?.fixtureFeedback?.answers[0]?.comments;let i= index\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n\r\n @if(c?.responsetype === 'comment'){\r\n <h5>{{c?.comment}}</h5>\r\n }@else if(c?.responsetype === 'agree'){\r\n\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'keepPlano'\">\r\n Marked as \"Keep Plano\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithPlano'\">\r\n Marked as \"Keep Plano with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'acceptAi'\">\r\n Marked as \"Accept AI\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithAi'\">\r\n Marked as \"Accept AI with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }@else if(c?.responsetype === 'disagree'){\r\n <h5>\r\n Marked as \"Redo\"\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</section>", styles: ["#verification-feedback{height:100%;overflow-y:auto}#verification-feedback .fixture-navigate,#verification-feedback .task-info-header{user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#verification-feedback h5{color:#1d2939;font-family:Inter;font-weight:600;font-size:12px;line-height:18px;margin:0}#verification-feedback .log-block{display:flex;gap:12px;padding:4px;margin-bottom:18px}#verification-feedback .log-block h4{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback .log-block p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085;margin:0}#verification-feedback #task-info .task-info-header{background-color:#fff!important;padding:6px;width:100%}#verification-feedback #task-info .task-info-header h2{font-weight:600;font-size:14px;line-height:20px;color:#1d2939}#verification-feedback #task-info .task-info-header p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085}#verification-feedback #fixture-quick-details .quick-edit-container{background:#f9fafb;padding:12px;border-radius:6px;width:100%;height:100%}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn{font-size:13px!important;line-height:10px!important;padding:6px 8px!important;border:1px solid rgb(208,213,221);box-shadow:0 1px 2px #1018280d;background:#fff}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-quick-details .quick-edit-container .redo-btn{font-family:Inter;font-weight:600;font-size:14px;line-height:18px;color:#1d2939;cursor:pointer}#verification-feedback #fixture-quick-details .quick-edit-container h4{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;color:#1d2939;margin:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .label{font-family:Inter;font-weight:500;font-size:14px;line-height:20px;color:#475467;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .value{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .diff .value{color:#d92d20!important;font-weight:600}#verification-feedback #fixture-quick-details .quick-edit-container .edit-input{padding:0 4px;border-radius:4px;width:50%;height:20px}#verification-feedback #fixture-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #fixture-comparison p{font-weight:400;font-size:12px;line-height:18px;color:#475467;margin:0}#verification-feedback #fixture-comparison .fixture-image{margin-bottom:12px}#verification-feedback #fixture-comparison .fixture-image img{object-fit:contain;width:100%}#verification-feedback #vm-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #vm-comparison .vm-container{padding:12px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);margin-bottom:12px;display:flex;gap:12px;cursor:pointer}#verification-feedback #vm-comparison .vm-container .vm-img{width:134px;height:134px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);background:var(--Gray-50, #f9fafb)}#verification-feedback #vm-comparison .vm-container .vm-img img{border-radius:2px;min-width:132px;min-height:134px;object-fit:contain;width:100%;height:100%;display:block}#verification-feedback #vm-comparison .vm-container .vm-details,#verification-feedback #vm-comparison .vm-container .vm-details h5{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#verification-feedback #vm-comparison .img-preview{position:fixed;inset:0;background:#000000d9;display:flex;align-items:center;justify-content:center;z-index:9999;cursor:zoom-out}#verification-feedback #vm-comparison .full-img{max-width:90vw;max-height:90vh;border-radius:10px;object-fit:contain}#verification-feedback .disabled{pointer-events:none;cursor:not-allowed!important;opacity:.6}\n"] }]
471
- }], ctorParameters: () => [{ type: i1.NgbModal }], propDecorators: { floorData: [{
472
- type: Input
473
- }], totalFixtures: [{
474
- type: Input
475
- }], feedbackDetails: [{
476
- type: Input
477
- }], cdn: [{
478
- type: Input
479
- }], showAction: [{
480
- type: Input
481
- }], changeFixture: [{
482
- type: Output
483
- }], action: [{
484
- type: Output
485
- }] } });
486
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby92ZXJpZmljYXRpb24tZmVlZGJhY2svdmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby92ZXJpZmljYXRpb24tZmVlZGJhY2svdmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQzs7Ozs7O0FBT3BHLE1BQU0sT0FBTyw2QkFBNkI7SUE0Q3BCO0lBekNYLFNBQVMsQ0FBTTtJQUNmLGFBQWEsR0FBVSxFQUFFLENBQUM7SUFDMUIsZUFBZSxDQUFNO0lBRXJCLEdBQUcsQ0FBUztJQUNaLFVBQVUsR0FBWSxJQUFJLENBQUM7SUFFMUIsYUFBYSxHQUFHLElBQUksWUFBWSxFQUd0QyxDQUFDO0lBRUssTUFBTSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFFM0Msb0JBQW9CLENBR2xCO0lBRUYsYUFBYSxHQUFZLElBQUksQ0FBQztJQUU5QixtQkFBbUIsQ0FBUztJQUU1Qix3QkFBd0IsR0FBeUIsRUFBRSxDQUFDO0lBQ3BELHFCQUFxQixHQUF5QixFQUFFLENBQUM7SUFFakQsWUFBWSxDQUFN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QUk7WUFDRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRTtnQkFDL0QsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsUUFBUSxFQUFFLFFBQVE7YUFDbkIsQ0FBQyxDQUFDO1lBQ0gsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFFdkMsT0FBTyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUc5QixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDeEI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRUQscUJBQXFCLENBQUMsTUFBYztRQUNsQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsTUFBTSxDQUFDO0lBQzVDLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQztJQUMxQyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQTlrQlUsNkJBQTZCOzRGQUE3Qiw2QkFBNkIsbVNDcEIxQyxva3hDQXlnQlU7OzRGRHJmRyw2QkFBNkI7a0JBTHpDLFNBQVM7K0JBQ0UsMkJBQTJCOzZFQU81QixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNO2dCQUtHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHsgQWN0aW9uQ29uZmlybVBvcHVwQ29tcG9uZW50IH0gZnJvbSBcIi4vYWN0aW9uLWNvbmZpcm0tcG9wdXAvYWN0aW9uLWNvbmZpcm0tcG9wdXAuY29tcG9uZW50XCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItdmVyaWZpY2F0aW9uLWZlZWRiYWNrXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi92ZXJpZmljYXRpb24tZmVlZGJhY2suY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL3ZlcmlmaWNhdGlvbi1mZWVkYmFjay5jb21wb25lbnQuc2Nzc1wiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVmVyaWZpY2F0aW9uRmVlZGJhY2tDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcclxue1xyXG4gIEBJbnB1dCgpIGZsb29yRGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIHRvdGFsRml4dHVyZXM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgZmVlZGJhY2tEZXRhaWxzOiBhbnk7XHJcblxyXG4gIEBJbnB1dCgpIGNkbjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNob3dBY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBAT3V0cHV0KCkgY2hhbmdlRml4dHVyZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgY3VycmVudEZpeHR1cmU6IHN0cmluZztcclxuICAgIGFjdGlvbjogXCJuZXh0XCIgfCBcInByZXZpb3VzXCI7XHJcbiAgfT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIGFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBzZWxlY3RlZEZlZWRiYWNrRGF0YToge1xyXG4gICAgY3VycmVudEZpeHR1cmU6IGFueTtcclxuICAgIGFpRmVlZGJhY2tGaXh0dXJlOiBhbnk7XHJcbiAgfTtcclxuXHJcbiAgaXNQYWdlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGN1cnJlbnRGaXh0dXJlSW5kZXg6IG51bWJlcjtcclxuXHJcbiAgcGxhbm9GaXh0dXJlUXVpY2tEZXRhaWxzOiBGaXh0dXJlUXVpY2tEZXRhaWxbXSA9IFtdO1xyXG4gIGFpRml4dHVyZVF1aWNrRGV0YWlsczogRml4dHVyZVF1aWNrRGV0YWlsW10gPSBbXTtcclxuXHJcbiAgcGxhbm9GaXh0dXJlOiBhbnk7XHJcbiAgYWlGaXh0dXJlOiBhbnk7XHJcblxyXG4gIGVkaXRpbmdQbGFub0ZpeHR1cmU6IGFueSB8IG51bGwgPSBudWxsO1xyXG4gIGVkaXRpbmdBaUZpeHR1cmU6IGFueSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBzZWxlY3RlZEFpVm1JbWFnZUZvclByZXZpZXc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBpc1BsYW5vUXVpY2tFZGl0ID0gZmFsc2U7XHJcbiAgaXNBSVF1aWNrRWRpdCA9IGZhbHNlO1xyXG4gIGhpZ2hsaWdodERpZmZlcmVuY2VzID0gdHJ1ZTtcclxuICBpc1F1aWNrRWRpdFN1Ym1pdHRlZCA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ2JNb2RhbDogTmdiTW9kYWwpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge31cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbXCJmZWVkYmFja0RldGFpbHNcIl0/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLm9uQ2FuY2VsQUlRdWlja0VkaXQoKTtcclxuICAgICAgdGhpcy5vbkNhbmNlbFBsYW5vUXVpY2tFZGl0KCk7XHJcbiAgICAgIHRoaXMuY3VycmVudEZpeHR1cmVJbmRleCA9XHJcbiAgICAgICAgdGhpcy50b3RhbEZpeHR1cmVzLmZpbmRJbmRleChcclxuICAgICAgICAgIChmOiBhbnkpID0+IGYuX2lkID09PSB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5maXh0dXJlSWRcclxuICAgICAgICApICsgMTtcclxuXHJcbiAgICAgIHRoaXMucGxhbm9GaXh0dXJlID0gc3RydWN0dXJlZENsb25lKFxyXG4gICAgICAgIHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LkZpeHR1cmVEYXRhXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmFpRml4dHVyZSA9IHN0cnVjdHVyZWRDbG9uZShcclxuICAgICAgICB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5maXh0dXJlQUlEYXRhXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLnBsYW5vRml4dHVyZVF1aWNrRGV0YWlscyA9IHRoaXMuYnVpbGRGaXh0dXJlUXVpY2tEZXRhaWxzKFxyXG4gICAgICAgIHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LkZpeHR1cmVEYXRhXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmFpRml4dHVyZVF1aWNrRGV0YWlscyA9IHRoaXMuYnVpbGRGaXh0dXJlUXVpY2tEZXRhaWxzKFxyXG4gICAgICAgIHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVBSURhdGFcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5pc0FwcHJvdmVkKSB7XHJcbiAgICAgICAgdGhpcy5jb21wYXJlUXVpY2tEZXRhaWxzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBpc0FwcHJvdmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFwcHJvdmFsU3RhdHVzID09PSBcImFwcHJvdmVkXCI7XHJcbiAgfVxyXG5cclxuICBidWlsZEZpeHR1cmVRdWlja0RldGFpbHMoZml4dHVyZTogYW55KSB7XHJcbiAgICBpZiAoIWZpeHR1cmUpIHJldHVybiBbXTtcclxuXHJcbiAgICBjb25zdCBsaXN0OiBGaXh0dXJlUXVpY2tEZXRhaWxbXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0IHNhZmUgPSAodjogYW55KSA9PlxyXG4gICAgICB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBcIlwiID8gXCItXCIgOiB2O1xyXG5cclxuICAgIGxpc3QucHVzaCh7XHJcbiAgICAgIGtleTogXCJmaXh0dXJlSGVhZGVyXCIsXHJcbiAgICAgIGxhYmVsOiBcIkZpeHR1cmUgSGVhZGVyOlwiLFxyXG4gICAgICB2YWx1ZTogc2FmZShmaXh0dXJlPy5oZWFkZXI/LmxhYmVsKSxcclxuICAgICAgZWRpdGFibGU6IHRydWUsXHJcbiAgICAgIG1ldGE6IHsgdHlwZTogXCJmaXh0dXJlXCIgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGxpc3QucHVzaCh7XHJcbiAgICAgIGtleTogXCJmaXh0dXJlVHlwZVwiLFxyXG4gICAgICBsYWJlbDogXCJGaXh0dXJlIHR5cGU6XCIsXHJcbiAgICAgIHZhbHVlOiBzYWZlKGZpeHR1cmUuZml4dHVyZUNhdGVnb3J5KSxcclxuICAgICAgZWRpdGFibGU6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZldpZHRoID0gZml4dHVyZS5maXh0dXJlV2lkdGggfHwge307XHJcbiAgICBsaXN0LnB1c2goe1xyXG4gICAgICBrZXk6IFwiZml4dHVyZVdpZHRoXCIsXHJcbiAgICAgIGxhYmVsOiBcIlNpemUgKFdpZHRoKTpcIixcclxuICAgICAgdmFsdWU6IGZXaWR0aD8udmFsdWUgPyBgJHtzYWZlKGZXaWR0aC52YWx1ZSl9JHtzYWZlKGZXaWR0aC51bml0KX1gIDogXCItXCIsXHJcbiAgICAgIGVkaXRhYmxlOiBmYWxzZSxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHNoZWx2ZXMgPSBBcnJheS5pc0FycmF5KGZpeHR1cmUuc2hlbGZDb25maWcpXHJcbiAgICAgID8gZml4dHVyZS5zaGVsZkNvbmZpZ1xyXG4gICAgICA6IFtdO1xyXG5cclxuICAgIGxpc3QucHVzaCh7XHJcbiAgICAgIGtleTogXCJ0b3RhbFNoZWx2ZXNcIixcclxuICAgICAgbGFiZWw6IFwiVG90YWwgc2hlbHZlczpcIixcclxuICAgICAgdmFsdWU6IHNoZWx2ZXMubGVuZ3RoID8gU3RyaW5nKHNoZWx2ZXMubGVuZ3RoKSA6IFwiLVwiLFxyXG4gICAgICBlZGl0YWJsZTogZmFsc2UsXHJcbiAgICB9KTtcclxuXHJcbiAgICBzaGVsdmVzXHJcbiAgICAgIC5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gYS5zaGVsZk51bWJlciAtIGIuc2hlbGZOdW1iZXIpXHJcbiAgICAgIC5mb3JFYWNoKChzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBzaGVsZk51bSA9IE51bWJlcihzYWZlKHMuc2hlbGZOdW1iZXIpKTtcclxuICAgICAgICBjb25zdCBpc1NoZWxmID0gcy5zaGVsZlR5cGUgPT09IFwic2hlbGZcIjtcclxuXHJcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7aXNTaGVsZiA/IFwic2hlbGZcIiA6IFwidHJheVwifV8ke3NoZWxmTnVtfWA7XHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBpc1NoZWxmXHJcbiAgICAgICAgICA/IGBTaGVsZiAke3NoZWxmTnVtfSBjYXBhY2l0eTpgXHJcbiAgICAgICAgICA6IGBUcmF5ICR7c2hlbGZOdW19IGNhcGFjaXR5OmA7XHJcblxyXG4gICAgICAgIGxldCBjYXBhY2l0eSA9IFwiLVwiO1xyXG5cclxuICAgICAgICBpZiAocy5wcm9kdWN0UGVyU2hlbGYpIHtcclxuICAgICAgICAgIGlmIChpc1NoZWxmKSB7XHJcbiAgICAgICAgICAgIGNhcGFjaXR5ID0gU3RyaW5nKHMucHJvZHVjdFBlclNoZWxmKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyYXlSb3dzID0gcy50cmF5Um93cyB8fCAwO1xyXG4gICAgICAgICAgICBjYXBhY2l0eSA9IHRyYXlSb3dzID8gU3RyaW5nKHMucHJvZHVjdFBlclNoZWxmICogdHJheVJvd3MpIDogXCItXCI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsaXN0LnB1c2goe1xyXG4gICAgICAgICAga2V5LFxyXG4gICAgICAgICAgbGFiZWwsXHJcbiAgICAgICAgICB2YWx1ZTogY2FwYWNpdHksXHJcbiAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIG1ldGE6IHtcclxuICAgICAgICAgICAgdHlwZTogaXNTaGVsZiA/IFwic2hlbGZcIiA6IFwidHJheVwiLFxyXG4gICAgICAgICAgICBzaGVsZk51bWJlcjogc2hlbGZOdW0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0b3RhbENhcGFjaXR5ID0gc2hlbHZlcy5yZWR1Y2UoKGFjYzogbnVtYmVyLCBzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFzLnByb2R1Y3RQZXJTaGVsZikgcmV0dXJuIGFjYztcclxuICAgICAgaWYgKHMuc2hlbGZUeXBlID09PSBcInNoZWxmXCIpIHJldHVybiBhY2MgKyBzLnByb2R1Y3RQZXJTaGVsZjtcclxuXHJcbiAgICAgIGNvbnN0IHJvd3MgPSBzLnRyYXlSb3dzIHx8IDA7XHJcbiAgICAgIHJldHVybiBhY2MgKyAocm93cyA/IHMucHJvZHVjdFBlclNoZWxmICogcm93cyA6IDApO1xyXG4gICAgfSwgMCk7XHJcblxyXG4gICAgbGlzdC5wdXNoKHtcclxuICAgICAga2V5OiBcInRvdGFsQ2FwYWNpdHlcIixcclxuICAgICAgbGFiZWw6IFwiVG90YWwgY2FwYWNpdHk6XCIsXHJcbiAgICAgIHZhbHVlOiB0b3RhbENhcGFjaXR5ID8gU3RyaW5nKHRvdGFsQ2FwYWNpdHkpIDogXCItXCIsXHJcbiAgICAgIGVkaXRhYmxlOiBmYWxzZSxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHZtID0gQXJyYXkuaXNBcnJheShmaXh0dXJlLnZtQ29uZmlnKSA/IGZpeHR1cmUudm1Db25maWcgOiBbXTtcclxuXHJcbiAgICB2bS5mb3JFYWNoKCh2OiBhbnksIGk6IG51bWJlcikgPT4ge1xyXG4gICAgICBsaXN0LnB1c2goe1xyXG4gICAgICAgIGtleTogYHZtVHlwZV8ke2l9YCxcclxuICAgICAgICBsYWJlbDogYFZNIHR5cGUgJHtpICsgMX06YCxcclxuICAgICAgICB2YWx1ZTogc2FmZSh2LnZtVHlwZSksXHJcbiAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGxpc3QucHVzaCh7XHJcbiAgICAgICAga2V5OiBgdm1OYW1lXyR7aX1gLFxyXG4gICAgICAgIGxhYmVsOiBcIlZNIENvbGxlY3Rpb246XCIsXHJcbiAgICAgICAgdmFsdWU6IHNhZmUodi52bU5hbWUpLFxyXG4gICAgICAgIGVkaXRhYmxlOiBmYWxzZSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbGlzdDtcclxuICB9XHJcblxyXG4gIGNvbXBhcmVRdWlja0RldGFpbHMoKSB7XHJcbiAgICBjb25zdCBwbGFubyA9IHRoaXMucGxhbm9GaXh0dXJlUXVpY2tEZXRhaWxzO1xyXG4gICAgY29uc3QgYWkgPSB0aGlzLmFpRml4dHVyZVF1aWNrRGV0YWlscztcclxuXHJcbiAgICBpZiAoIXBsYW5vPy5sZW5ndGggfHwgIWFpPy5sZW5ndGgpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBwbGFub01hcCA9IG5ldyBNYXAocGxhbm8ubWFwKChpKSA9PiBbaS5rZXksIGldKSk7XHJcblxyXG4gICAgY29uc3QgcGxhbm9WTUtleVNldCA9IG5ldyBTZXQoXHJcbiAgICAgICh0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5GaXh0dXJlRGF0YT8udm1Db25maWcgPz8gW10pLm1hcChcclxuICAgICAgICAodjogYW55KSA9PiBgJHt2LnZtVHlwZX18JHt2LnZtTmFtZX1gLnRvTG93ZXJDYXNlKClcclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBhaVZNTGlzdCA9IChcclxuICAgICAgdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUFJRGF0YT8udm1Db25maWcgPz8gW11cclxuICAgICkubWFwKCh2OiBhbnkpID0+IGAke3Yudm1UeXBlfXwke3Yudm1OYW1lfWAudG9Mb3dlckNhc2UoKSk7XHJcblxyXG4gICAgYWkuZm9yRWFjaCgoaXRlbSkgPT4gKGl0ZW0uaXNEaWZmZXJlbnQgPSBmYWxzZSkpO1xyXG5cclxuICAgIGFpLmZvckVhY2goKGFpSXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCBwSXRlbSA9IHBsYW5vTWFwLmdldChhaUl0ZW0ua2V5KTtcclxuXHJcbiAgICAgIGlmICghcEl0ZW0pIHtcclxuICAgICAgICBhaUl0ZW0uaXNEaWZmZXJlbnQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcFZhbCA9IChwSXRlbS52YWx1ZSA/PyBcIi1cIikudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3QgYVZhbCA9IChhaUl0ZW0udmFsdWUgPz8gXCItXCIpLnRvU3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICBpZiAoYWlJdGVtLmtleS5zdGFydHNXaXRoKFwidm1cIikpIHtcclxuICAgICAgICBjb25zdCBpZHggPSBOdW1iZXIoYWlJdGVtLmtleS5zcGxpdChcIl9cIilbMV0pO1xyXG4gICAgICAgIGNvbnN0IGFpVk1LZXkgPSBhaVZNTGlzdFtpZHhdID8/IFwiXCI7XHJcblxyXG4gICAgICAgIGlmICghcGxhbm9WTUtleVNldC5oYXMoYWlWTUtleSkpIHtcclxuICAgICAgICAgIGFpSXRlbS5pc0RpZmZlcmVudCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaXNTaGVsZlBsYW5vID0gcEl0ZW0ua2V5LnN0YXJ0c1dpdGgoXCJzaGVsZl9cIik7XHJcbiAgICAgIGNvbnN0IGlzU2hlbGZBSSA9IGFpSXRlbS5rZXkuc3RhcnRzV2l0aChcInNoZWxmX1wiKTtcclxuICAgICAgY29uc3QgaXNUcmF5UGxhbm8gPSBwSXRlbS5rZXkuc3RhcnRzV2l0aChcInRyYXlfXCIpO1xyXG4gICAgICBjb25zdCBpc1RyYXlBSSA9IGFpSXRlbS5rZXkuc3RhcnRzV2l0aChcInRyYXlfXCIpO1xyXG5cclxuICAgICAgaWYgKGlzU2hlbGZQbGFubyB8fCBpc1RyYXlQbGFubykge1xyXG4gICAgICAgIGlmIChpc1NoZWxmUGxhbm8gIT09IGlzU2hlbGZBSSB8fCBpc1RyYXlQbGFubyAhPT0gaXNUcmF5QUkpIHtcclxuICAgICAgICAgIGFpSXRlbS5pc0RpZmZlcmVudCA9IHRydWU7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocFZhbCAhPT0gYVZhbCkge1xyXG4gICAgICAgICAgYWlJdGVtLmlzRGlmZmVyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocFZhbCAhPT0gYVZhbCkge1xyXG4gICAgICAgIGFpSXRlbS5pc0RpZmZlcmVudCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VGaXh0dXJlKGNoYW5nZTogXCJuZXh0XCIgfCBcInByZXZpb3VzXCIpIHtcclxuICAgIHRoaXMuY2hhbmdlRml4dHVyZS5lbWl0KHtcclxuICAgICAgY3VycmVudEZpeHR1cmU6IHRoaXMuZmVlZGJhY2tEZXRhaWxzLmZpeHR1cmVGZWVkYmFjay5maXh0dXJlSWQsXHJcbiAgICAgIGFjdGlvbjogY2hhbmdlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm9uQ2FuY2VsQUlRdWlja0VkaXQoKTtcclxuICAgIHRoaXMub25DYW5jZWxQbGFub1F1aWNrRWRpdCgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DbGlja0tlZXBQbGFubygpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybUFjdGlvbihcImtlZXBQbGFub1wiKTtcclxuICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSBcIm5vdE9rXCIpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMuYWN0aW9uLmVtaXQoe1xyXG4gICAgICAgIGFjdGlvbjogXCJrZWVwUGxhbm9cIixcclxuICAgICAgICB0eXBlOiBcImFncmVlXCIsXHJcbiAgICAgICAgZml4dHVyZURhdGE6IHRoaXMucGxhbm9GaXh0dXJlLFxyXG4gICAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrLFxyXG4gICAgICAgIHJlbWFya3M6IHJlc3VsdD8ucmVtYXJrLFxyXG4gICAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gb25DbGlja0tlZXBQbGFubyBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ2xpY2tBY2NlcHRBSSgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybUFjdGlvbihcImFjY2VwdEFJXCIpO1xyXG4gICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09IFwibm90T2tcIikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgdGhpcy5hY3Rpb24uZW1pdCh7XHJcbiAgICAgICAgYWN0aW9uOiBcImFjY2VwdEFpXCIsXHJcbiAgICAgICAgdHlwZTogXCJhZ3JlZVwiLFxyXG4gICAgICAgIGZpeHR1cmVEYXRhOiB0aGlzLmFpRml4dHVyZSxcclxuICAgICAgICBmZWVkYmFjazogdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjayxcclxuICAgICAgICByZW1hcmtzOiByZXN1bHQ/LnJlbWFyayxcclxuICAgICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICB0YXNrVHlwZTogXCJmaXh0dXJlXCIsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IG9uQ2xpY2tBY2NlcHRBSSBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ2xpY2tSZWRvKCkge1xyXG4gICAgaWYgKHRoaXMuaXNBSVF1aWNrRWRpdCB8fCB0aGlzLmlzUGxhbm9RdWlja0VkaXQpIHJldHVybjtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbmZpcm1BY3Rpb24oXCJyZWRvXCIpO1xyXG4gICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09IFwibm90T2tcIikgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5hY3Rpb24uZW1pdCh7XHJcbiAgICAgICAgYWN0aW9uOiBcInJlZG9cIixcclxuICAgICAgICB0eXBlOiBcImRpc2FncmVlXCIsXHJcbiAgICAgICAgZml4dHVyZURhdGE6IG51bGwsXHJcbiAgICAgICAgZmVlZGJhY2s6IHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2ssXHJcbiAgICAgICAgcmVtYXJrOiByZXN1bHQsXHJcbiAgICAgICAgcGxhbm9JZDogdGhpcy5mbG9vckRhdGEucGxhbm9JZCxcclxuICAgICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgdGFza1R5cGU6IFwiZml4dHVyZVwiLFxyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBvbkNsaWNrUmVkbyBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25FZGl0Q3VycmVudEZpeHR1cmUoKSB7XHJcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHtcclxuICAgICAgYWN0aW9uOiBcImVkaXRXaXRoUGxhbm9cIixcclxuICAgICAgdHlwZTogXCJhZ3JlZVwiLFxyXG4gICAgICBmaXh0dXJlRGF0YTogdGhpcy5wbGFub0ZpeHR1cmUsXHJcbiAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrLFxyXG4gICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25FZGl0QUlGZWVkYmFjaygpIHtcclxuICAgIHRoaXMuYWN0aW9uLmVtaXQoe1xyXG4gICAgICBhY3Rpb246IFwiZWRpdFdpdGhBaVwiLFxyXG4gICAgICB0eXBlOiBcImFncmVlXCIsXHJcbiAgICAgIGZpeHR1cmVEYXRhOiB0aGlzLmFpRml4dHVyZSxcclxuXHJcbiAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrLFxyXG4gICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUGxhbm9RdWlja0VkaXQoKSB7XHJcbiAgICBpZiAodGhpcy5pc0FJUXVpY2tFZGl0KSByZXR1cm47XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzUGxhbm9RdWlja0VkaXQpIHtcclxuICAgICAgdGhpcy5lZGl0aW5nUGxhbm9GaXh0dXJlID0gc3RydWN0dXJlZENsb25lKHRoaXMucGxhbm9GaXh0dXJlKTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNQbGFub1F1aWNrRWRpdCA9ICF0aGlzLmlzUGxhbm9RdWlja0VkaXQ7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBSVF1aWNrRWRpdCgpIHtcclxuICAgIGlmICh0aGlzLmlzUGxhbm9RdWlja0VkaXQpIHJldHVybjtcclxuICAgIGlmICghdGhpcy5pc0FJUXVpY2tFZGl0KSB7XHJcbiAgICAgIHRoaXMuZWRpdGluZ0FpRml4dHVyZSA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLmFpRml4dHVyZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzQUlRdWlja0VkaXQgPSAhdGhpcy5pc0FJUXVpY2tFZGl0O1xyXG4gIH1cclxuXHJcbiAgb25DYW5jZWxQbGFub1F1aWNrRWRpdCgpIHtcclxuICAgIHRoaXMuZWRpdGluZ1BsYW5vRml4dHVyZSA9IG51bGw7XHJcbiAgICB0aGlzLnBsYW5vRml4dHVyZVF1aWNrRGV0YWlscyA9IHRoaXMuYnVpbGRGaXh0dXJlUXVpY2tEZXRhaWxzKFxyXG4gICAgICB0aGlzLnBsYW5vRml4dHVyZVxyXG4gICAgKTtcclxuICAgIHRoaXMuaXNQbGFub1F1aWNrRWRpdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1F1aWNrRWRpdFN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TYXZlUGxhbm9RdWlja0VkaXQoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmlzUXVpY2tFZGl0U3VibWl0dGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuaXNRdWlja1ZhbHVlc0NvbnRhaW5zRXJyb3IoXCJwbGFub1wiKSkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25maXJtQWN0aW9uKFwia2VlcFBsYW5vXCIpO1xyXG4gICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09IFwibm90T2tcIikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZWRpdGluZ1BsYW5vRml4dHVyZSkge1xyXG4gICAgICAgIHRoaXMucGxhbm9GaXh0dXJlID0gc3RydWN0dXJlZENsb25lKHRoaXMuZWRpdGluZ1BsYW5vRml4dHVyZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZWRpdGluZ1BsYW5vRml4dHVyZSA9IG51bGw7XHJcbiAgICAgIHRoaXMucGxhbm9GaXh0dXJlUXVpY2tEZXRhaWxzID0gdGhpcy5idWlsZEZpeHR1cmVRdWlja0RldGFpbHMoXHJcbiAgICAgICAgdGhpcy5wbGFub0ZpeHR1cmVcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jb21wYXJlUXVpY2tEZXRhaWxzKCk7XHJcblxyXG4gICAgICB0aGlzLmFjdGlvbi5lbWl0KHtcclxuICAgICAgICBhY3Rpb246IFwia2VlcFBsYW5vXCIsXHJcbiAgICAgICAgdHlwZTogXCJhZ3JlZVwiLFxyXG4gICAgICAgIGZpeHR1cmVEYXRhOiB0aGlzLnBsYW5vRml4dHVyZSxcclxuICAgICAgICBmZWVkYmFjazogdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjayxcclxuICAgICAgICByZW1hcmtzOiByZXN1bHQ/LnJlbWFyayxcclxuICAgICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICB0YXNrVHlwZTogXCJmaXh0dXJlXCIsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5pc1BsYW5vUXVpY2tFZGl0ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNRdWlja0VkaXRTdWJtaXR0ZWQgPSBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBlcnJvcjpcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DYW5jZWxBSVF1aWNrRWRpdCgpIHtcclxuICAgIHRoaXMuZWRpdGluZ0FpRml4dHVyZSA9IG51bGw7XHJcbiAgICB0aGlzLmFpRml4dHVyZVF1aWNrRGV0YWlscyA9IHRoaXMuYnVpbGRGaXh0dXJlUXVpY2tEZXRhaWxzKHRoaXMuYWlGaXh0dXJlKTtcclxuICAgIHRoaXMuaXNBSVF1aWNrRWRpdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1F1aWNrRWRpdFN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TYXZlQUlRdWlja0VkaXQoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmlzUXVpY2tFZGl0U3VibWl0dGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuaXNRdWlja1ZhbHVlc0NvbnRhaW5zRXJyb3IoXCJhaVwiKSkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25maXJtQWN0aW9uKFwiYWNjZXB0QUlcIik7XHJcbiAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gXCJub3RPa1wiKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5lZGl0aW5nQWlGaXh0dXJlKSB7XHJcbiAgICAgICAgdGhpcy5haUZpeHR1cmUgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5lZGl0aW5nQWlGaXh0dXJlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5lZGl0aW5nQWlGaXh0dXJlID0gbnVsbDtcclxuICAgICAgdGhpcy5haUZpeHR1cmVRdWlja0RldGFpbHMgPSB0aGlzLmJ1aWxkRml4dHVyZVF1aWNrRGV0YWlscyhcclxuICAgICAgICB0aGlzLmFpRml4dHVyZVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmNvbXBhcmVRdWlja0RldGFpbHMoKTtcclxuXHJcbiAgICAgIHRoaXMuYWN0aW9uLmVtaXQoe1xyXG4gICAgICAgIGFjdGlvbjogXCJhY2NlcHRBaVwiLFxyXG4gICAgICAgIHR5cGU6IFwiYWdyZWVcIixcclxuICAgICAgICBmaXh0dXJlRGF0YTogdGhpcy5haUZpeHR1cmUsXHJcbiAgICAgICAgZmVlZGJhY2s6IHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2ssXHJcbiAgICAgICAgcmVtYXJrczogcmVzdWx0Py5yZW1hcmssXHJcbiAgICAgICAgcGxhbm9JZDogdGhpcy5mbG9vckRhdGEucGxhbm9JZCxcclxuICAgICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgdGFza1R5cGU6IFwiZml4dHVyZVwiLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuaXNBSVF1aWNrRWRpdCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzUXVpY2tFZGl0U3VibWl0dGVkID0gZmFsc2U7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gb25TYXZlQUlRdWlja0VkaXQgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2FwYWNpdHlJbnB1dChcclxuICAgIGV2ZW50OiBFdmVudCxcclxuICAgIGl0ZW06IEZpeHR1cmVRdWlja0RldGFpbCxcclxuICAgIHNvdXJjZTogXCJwbGFub1wiIHwgXCJhaVwiXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgbGV0IHYgPSBpbnB1dC52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgXCJcIikuc2xpY2UoMCwgMik7XHJcblxyXG4gICAgaW5wdXQudmFsdWUgPSB2O1xyXG4gICAgaXRlbS52YWx1ZSA9IHY7XHJcblxyXG4gICAgdGhpcy5vblF1aWNrVmFsdWVDaGFuZ2UoaXRlbSwgaXRlbS52YWx1ZSwgc291cmNlKTtcclxuICB9XHJcblxyXG4gIG9uUXVpY2tWYWx1ZUNoYW5nZShcclxuICAgIGl0ZW06IEZpeHR1cmVRdWlja0RldGFpbCxcclxuICAgIG5ld1ZhbHVlOiBzdHJpbmcsXHJcbiAgICBzb3VyY2U6IFwicGxhbm9cIiB8IFwiYWlcIlxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgdGFyZ2V0Rml4dHVyZSA9XHJcbiAgICAgIHNvdXJjZSA9PT0gXCJwbGFub1wiID8gdGhpcy5lZGl0aW5nUGxhbm9GaXh0dXJlIDogdGhpcy5lZGl0aW5nQWlGaXh0dXJlO1xyXG5cclxuICAgIGlmICghdGFyZ2V0Rml4dHVyZSB8fCAhaXRlbT8ubWV0YSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gbmV3VmFsdWU/LnRyaW0oKTtcclxuICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICBpZiAoaXRlbS5tZXRhLnR5cGUgPT09IFwiZml4dHVyZVwiICYmIGl0ZW0ua2V5ID09PSBcImZpeHR1cmVIZWFkZXJcIikge1xyXG4gICAgICB0YXJnZXRGaXh0dXJlLmhlYWRlci5sYWJlbCA9IHZhbHVlIHx8IFwiXCI7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzaGVsZk51bWJlciA9IGl0ZW0ubWV0YS5zaGVsZk51bWJlcjtcclxuICAgIGlmICghc2hlbGZOdW1iZXIpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzaGVsZiA9ICh0YXJnZXRGaXh0dXJlLnNoZWxmQ29uZmlnID8/IFtdKS5maW5kKFxyXG4gICAgICAoczogYW55KSA9PiBOdW1iZXIocy5zaGVsZk51bWJlcikgPT09IHNoZWxmTnVtYmVyXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghc2hlbGYpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBudW1lcmljVmFsdWUgPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgaWYgKGlzTmFOKG51bWVyaWNWYWx1ZSkgfHwgbnVtZXJpY1ZhbHVlIDwgMCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIFNoZWxmIOKGkiBkaXJlY3QgbWFwcGluZ1xyXG4gICAgaWYgKGl0ZW0ubWV0YS50eXBlID09PSBcInNoZWxmXCIpIHtcclxuICAgICAgc2hlbGYucHJvZHVjdFBlclNoZWxmID0gbnVtZXJpY1ZhbHVlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVHJheSDihpIgcmV2ZXJzZSBjYWxjdWxhdGVcclxuICAgIGlmIChpdGVtLm1ldGEudHlwZSA9PT0gXCJ0cmF5XCIpIHtcclxuICAgICAgY29uc3Qgcm93cyA9IE51bWJlcihzaGVsZi50cmF5Um93cykgfHwgMDtcclxuICAgICAgaWYgKCFyb3dzKSByZXR1cm47XHJcblxyXG4gICAgICBzaGVsZi5wcm9kdWN0UGVyU2hlbGYgPSBNYXRoLmZsb29yKG51bWVyaWNWYWx1ZSAvIHJvd3MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNRdWlja1ZhbHVlc0NvbnRhaW5zRXJyb3IodGFyZ2V0OiBcImFpXCIgfCBcInBsYW5vXCIpIHtcclxuICAgIGNvbnN0IHRhcmdldExpc3QgPVxyXG4gICAgICB0YXJnZXQgPT09IFwiYWlcIlxyXG4gICAgICAgID8gdGhpcy5haUZpeHR1cmVRdWlja0RldGFpbHNcclxuICAgICAgICA6IHRoaXMucGxhbm9GaXh0dXJlUXVpY2tEZXRhaWxzO1xyXG5cclxuICAgIGNvbnN0IGNoZWNrTGlzdCA9IHRhcmdldExpc3QuZmlsdGVyKFxyXG4gICAgICAobCkgPT4gbC5lZGl0YWJsZSAmJiBsLm1ldGE/LnR5cGUgIT0gXCJmaXh0dXJlXCJcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgZXJyb3IgPSBjaGVja0xpc3Quc29tZShcclxuICAgICAgKGNsKSA9PlxyXG4gICAgICAgIGNsLnZhbHVlID09IFwiXCIgfHxcclxuICAgICAgICBjbC52YWx1ZSA9PSB1bmRlZmluZWQgfHxcclxuICAgICAgICBjbC52YWx1ZSA9PSBudWxsIHx8XHJcbiAgICAgICAgY2wudmFsdWUgPT0gXCIwXCIgfHxcclxuICAgICAgICBjbC52YWx1ZSA9PSBcIjAwXCJcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBlcnJvcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrTGlzdCA9IHRhcmdldExpc3QuZmlsdGVyKFxyXG4gICAgICAgIChsKSA9PiBsLmVkaXRhYmxlICYmIGwubWV0YT8udHlwZSA9PSBcImZpeHR1cmVcIlxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBlcnJvciA9IGNoZWNrTGlzdC5zb21lKFxyXG4gICAgICAgIChjbCkgPT5cclxuICAgICAgICAgIGNsLnZhbHVlID09IFwiXCIgfHxcclxuICAgICAgICAgIGNsLnZhbHVlID09IHVuZGVmaW5lZCB8fFxyXG4gICAgICAgICAgY2wudmFsdWUgPT0gbnVsbCB8fFxyXG4gICAgICAgICAgY2wudmFsdWUgPT0gXCItXCJcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIGVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY29uZmlybUFjdGlvbihcclxuICAgIHR5cGU6IFwicmVkb1wiIHwgXCJhY2NlcHRBSVwiIHwgXCJrZWVwUGxhbm9cIlxyXG4gICk6IFByb21pc2U8eyBhY3Rpb246IHN0cmluZzsgcmVtYXJrOiBzdHJpbmcgfCBudWxsIH0gfCBudWxsPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihBY3Rpb25Db25maXJtUG9wdXBDb21wb25lbnQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgICBzaXplOiBcIm1kXCIsXHJcbiAgICAgICAgYmFja2Ryb3A6IFwic3RhdGljXCIsXHJcbiAgICAgIH0pO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50eXBlID0gdHlwZTtcclxuXHJcbiAgICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjx7XHJcbiAgICAgICAgYWN0aW9uOiBzdHJpbmc7XHJcbiAgICAgICAgcmVtYXJrOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgICB9PigocmVzdWx0KSA9PiByZXN1bHQpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrVk1JbWFnZVByZXZpZXcoaW1nVXJsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRBaVZtSW1hZ2VGb3JQcmV2aWV3ID0gaW1nVXJsO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VWTUltYWdlUHJldmlldygpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRBaVZtSW1hZ2VGb3JQcmV2aWV3ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgRml4dHVyZVF1aWNrRGV0YWlsIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgZWRpdGFibGU6IGJvb2xlYW47XHJcbiAgaXNEaWZmZXJlbnQ/OiBib29sZWFuO1xyXG5cclxuICBtZXRhPzoge1xyXG4gICAgdHlwZTogXCJmaXh0dXJlXCIgfCBcInNoZWxmXCIgfCBcInRyYXlcIjtcclxuICAgIHNoZWxmTnVtYmVyPzogbnVtYmVyO1xyXG4gIH07XHJcbn1cclxuIiwiPHNlY3Rpb24gaWQ9XCJ2ZXJpZmljYXRpb24tZmVlZGJhY2tcIj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LnRhc2tEYXRhXCIgaWQ9XCJ0YXNrLWluZm9cIiBuZ2JBY2NvcmRpb24gI2FjY29yZGlvbj1cIm5nYkFjY29yZGlvblwiPlxyXG4gICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImRldGFpbHNcIiBbY29sbGFwc2VkXT1cImZlZWRiYWNrRGV0YWlscz8udGFza0luZm9Ub2dnbGVcIj5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25IZWFkZXIgY2xhc3M9XCJhY2NvcmRpb24tYnV0dG9uIHRhc2staW5mby1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uVG9nZ2xlIGNsYXNzPVwidy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDI+Rml4dHVyZSB2ZXJpZmljYXRpb24gYXNzaWduZWQ8L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPnt7ZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LnRhc2tEYXRhPy5jcmVhdGVkQXQgfCBkYXRlOiAnaGg6bW06c3MgYSAtIGRkIE1NTSB5eXl5J319PC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVXNlciBhdmF0YXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMTZcIiBmaWxsPVwiI0VBRjhGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMi42NjczIDIzLjVWMjEuODMzM0MyMi42NjczIDIwLjk0OTMgMjIuMzE2MSAyMC4xMDE0IDIxLjY5MSAxOS40NzYzQzIxLjA2NTkgMTguODUxMiAyMC4yMTggMTguNSAxOS4zMzQgMTguNUgxMi42NjczQzExLjc4MzMgMTguNSAxMC45MzU0IDE4Ljg1MTIgMTAuMzEwMyAxOS40NzYzQzkuNjg1MTcgMjAuMTAxNCA5LjMzMzk4IDIwLjk0OTMgOS4zMzM5OCAyMS44MzMzVjIzLjVNMTkuMzM0IDExLjgzMzNDMTkuMzM0IDEzLjY3NDMgMTcuODQxNiAxNS4xNjY3IDE2LjAwMDcgMTUuMTY2N0MxNC4xNTk3IDE1LjE2NjcgMTIuNjY3MyAxMy42NzQzIDEyLjY2NzMgMTEuODMzM0MxMi42NjczIDkuOTkyMzggMTQuMTU5NyA4LjUgMTYuMDAwNyA4LjVDMTcuODQxNiA4LjUgMTkuMzM0IDkuOTkyMzggMTkuMzM0IDExLjgzMzNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMSBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND57e2ZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy50YXNrRGF0YT8uY3JlYXRlZEJ5TmFtZX19PC9oND5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8udGFza0RhdGE/LmNyZWF0ZWRBdCB8IGRhdGU6ICdoaDptbWEsIGRkIE1NTSB5eXl5J319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT5Bc3NpZ25lcjwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nLWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFVzZXIgYXZhdGFyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgZmlsbD1cIiNFQUY4RkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjIuNjY3MyAyMy41VjIxLjgzMzNDMjIuNjY3MyAyMC45NDkzIDIyLjMxNjEgMjAuMTAxNCAyMS42OTEgMTkuNDc2M0MyMS4wNjU5IDE4Ljg1MTIgMjAuMjE4IDE4LjUgMTkuMzM0IDE4LjVIMTIuNjY3M0MxMS43ODMzIDE4LjUgMTAuOTM1NCAxOC44NTEyIDEwLjMxMDMgMTkuNDc2M0M5LjY4NTE3IDIwLjEwMTQgOS4zMzM5OCAyMC45NDkzIDkuMzMzOTggMjEuODMzM1YyMy41TTE5LjMzNCAxMS44MzMzQzE5LjMzNCAxMy42NzQzIDE3Ljg0MTYgMTUuMTY2NyAxNi4wMDA3IDE1LjE2NjdDMTQuMTU5NyAxNS4xNjY3IDEyLjY2NzMgMTMuNjc0MyAxMi42NjczIDExLjgzMzNDMTIuNjY3MyA5Ljk5MjM4IDE0LjE1OTcgOC41IDE2LjAwMDcgOC41QzE3Ljg0MTYgOC41IDE5LjMzNCA5Ljk5MjM4IDE5LjMzNCAxMS44MzMzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+IHt7ZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LnRhc2tEYXRhPy51c2VyTmFtZX19PC9oND5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8udGFza0RhdGE/LnN1Ym1pdFRpbWVfc3RyaW5nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PkFzc2lnbmVlPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGZlZWRiYWNrRGV0YWlscz8uZ2xvYmFsQ29tbWVudHM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMlwiPkNvbW1lbnRzPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctYmxvY2tcIiAqbmdGb3I9XCJsZXQgYyBvZiBmZWVkYmFja0RldGFpbHM/Lmdsb2JhbENvbW1lbnRzO2xldCBpPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgZmlsbD1cIiNFQUY4RkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMi42NjczIDIzLjVWMjEuODMzM0MyMi42NjczIDIwLjk0OTMgMjIuMzE2MSAyMC4xMDE0IDIxLjY5MSAxOS40NzYzQzIxLjA2NTkgMTguODUxMiAyMC4yMTggMTguNSAxOS4zMzQgMTguNUgxMi42NjczQzExLjc4MzMgMTguNSAxMC45MzU0IDE4Ljg1MTIgMTAuMzEwMyAxOS40NzYzQzkuNjg1MTcgMjAuMTAxNCA5LjMzMzk4IDIwLjk0OTMgOS4zMzM5OCAyMS44MzMzVjIzLjVNMTkuMzM0IDExLjgzMzNDMTkuMzM0IDEzLjY3NDMgMTcuODQxNiAxNS4xNjY3IDE2LjAwMDcgMTUuMTY2N0MxNC4xNTk3IDE1LjE2NjcgMTIuNjY3MyAxMy42NzQzIDEyLjY2NzMgMTEuODMzM0MxMi42NjczIDkuOTkyMzggMTQuMTU5NyA4LjUgMTYuMDAwNyA4LjVDMTcuODQxNiA4LjUgMTkuMzM0IDkuOTkyMzggMTkuMzM0IDExLjgzMzNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND57e2M/LnVzZXJOYW1lfX08L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3tjPy5jcmVhdGVkQXR8ZGF0ZTonaGg6bW06c3MgYSAtIGRkIE1NTSB5eXl5J319PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1Pnt7Yz8uY29tbWVudH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxociAqbmdJZj1cImZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy50YXNrRGF0YVwiPlxyXG5cclxuICAgIDxkaXYgaWQ9XCJmZWVkYmFjay1oYW5kbGVyXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC02IG15LTYgcHgtMyBmaXh0dXJlLW5hdmlnYXRlXCI+XHJcbiAgICAgICAgPHN2ZyAqbmdJZj1cInNob3dBY3Rpb25cIiAoY2xpY2spPVwib25DaGFuZ2VGaXh0dXJlKCdwcmV2aW91cycpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiXHJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xNSA2TDkgMTJMMTUgMThcIiBzdHJva2U9XCIjMUQyOTM5XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG5cclxuXHJcbiAgICAgICAgPGgzIGNsYXNzPVwibS0wXCI+e3twbGFub0ZpeHR1cmU/LmhlYWRlcj8ubGFiZWx9fTwvaDM+XHJcblxyXG4gICAgICAgIDxoMyAqbmdJZj1cInNob3dBY3Rpb25cIiBjbGFzcz1cIm0tMCBtcy1hdXRvXCI+XHJcbiAgICAgICAgICAgIHt7Y3VycmVudEZpeHR1cmVJbmRleH19L3t7dG90YWxGaXh0dXJlcy5sZW5ndGh9fVxyXG4gICAgICAgIDwvaDM+XHJcblxyXG4gICAgICAgIDxzdmcgKm5nSWY9XCJzaG93QWN0aW9uXCIgKGNsaWNrKT1cIm9uQ2hhbmdlRml4dHVyZSgnbmV4dCcpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiXHJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk05IDE4TDE1IDEyTDkgNlwiIHN0cm9rZT1cIiMxRDI5MzlcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgQGlmKCB0aGlzLmFpRml4dHVyZT8uZml4dHVyZUlkKXtcclxuXHJcbiAgICAgICAgPGRpdiBpZD1cImZpeHR1cmUtcXVpY2stZGV0YWlsc1wiIGNsYXNzPVwicm93IGctMCBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLWVkaXQtY29udGFpbmVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIWlzQXBwcm92ZWQgJiYgc2hvd0FjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBxdWljay1idG4gbXMtYXV0b1wiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXRDdXJyZW50Rml4dHVyZSgpXCIgW2Rpc2FibGVkXT1cImlzQUlRdWlja0VkaXQgfHwgaXNQbGFub1F1aWNrRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzIyOF8xMjUzNilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjE2NjAyIDMuMzMzMkgzLjMzMjY4QzIuODkwNjUgMy4zMzMyIDIuNDY2NzMgMy41MDg3OSAyLjE1NDE3IDMuODIxMzVDMS44NDE2MSA0LjEzMzkxIDEuNjY2MDIgNC41NTc4NCAxLjY2NjAyIDQuOTk5ODZWMTYuNjY2NUMxLjY2NjAyIDE3LjEwODYgMS44NDE2MSAxNy41MzI1IDIuMTU0MTcgMTcuODQ1QzIuNDY2NzMgMTguMTU3NiAyLjg5MDY1IDE4LjMzMzIgMy4zMzI2OCAxOC4zMzMySDE0Ljk5OTNDMTUuNDQxNCAxOC4zMzMyIDE1Ljg2NTMgMTguMTU3NiAxNi4xNzc5IDE3Ljg0NUMxNi40OTA0IDE3LjUzMjUgMTYuNjY2IDE3LjEwODYgMTYuNjY2IDE2LjY2NjVWMTAuODMzMk0xNS40MTYgMi4wODMyQzE1Ljc0NzUgMS43NTE2OCAxNi4xOTcyIDEuNTY1NDMgMTYuNjY2IDEuNTY1NDNDMTcuMTM0OSAxLjU2NTQzIDE3LjU4NDUgMS43NTE2OCAxNy45MTYgMi4wODMyQzE4LjI0NzUgMi40MTQ3MiAxOC40MzM4IDIuODY0MzYgMTguNDMzOCAzLjMzMzJDMTguNDMzOCAzLjgwMjA0IDE4LjI0NzUgNC4yNTE2OCAxNy45MTYgNC41ODMyTDkuOTk5MzUgMTIuNDk5OUw2LjY2NjAyIDEzLjMzMzJMNy40OTkzNSA5Ljk5OTg2TDE1LjQxNiAyLjA4MzJaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMUQyOTM5XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzIyOF8xMjUzNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcXVpY2stYnRuXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNsaWNrS2VlcFBsYW5vKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0FJUXVpY2tFZGl0IHx8IGlzUGxhbm9RdWlja0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMi43MjUgNS44MDAwOEwxMCAxMC4wMDg0TDE3LjI3NSA1LjgwMDA4TTEwIDE4LjQwMDFWMTAuMDAwMU0xNy41IDEzLjMzMzRWNi42NjY3NUMxNy40OTk3IDYuMzc0NDggMTcuNDIyNSA2LjA4NzQyIDE3LjI3NjMgNS44MzQzOEMxNy4xMyA1LjU4MTM0IDE2LjkxOTggNS4zNzEyMiAxNi42NjY3IDUuMjI1MDhMMTAuODMzMyAxLjg5MTc1QzEwLjU4IDEuNzQ1NDcgMTAuMjkyNiAxLjY2ODQ2IDEwIDEuNjY4NDZDOS43MDc0NCAxLjY2ODQ2IDkuNDIwMDMgMS43NDU0NyA5LjE2NjY3IDEuODkxNzVMMy4zMzMzMyA1LjIyNTA4QzMuMDgwMjIgNS4zNzEyMiAyLjg2OTk4IDUuNTgxMzQgMi43MjM3MiA1LjgzNDM4QzIuNTc3NDUgNi4wODc0MiAyLjUwMDMgNi4zNzQ0OCAyLjUgNi42NjY3NVYxMy4zMzM0QzIuNTAwMyAxMy42MjU3IDIuNTc3NDUgMTMuOTEyNyAyLjcyMzcyIDE0LjE2NThDMi44Njk5OCAxNC40MTg4IDMuMDgwMjIgMTQuNjI4OSAzLjMzMzMzIDE0Ljc3NTFMOS4xNjY2NyAxOC4xMDg0QzkuNDIwMDMgMTguMjU0NyA5LjcwNzQ0IDE4LjMzMTcgMTAgMTguMzMxN0MxMC4yOTI2IDE4LjMzMTcgMTAuNTggMTguMjU0NyAxMC44MzMzIDE4LjEwODRMMTYuNjY2NyAxNC43NzUxQzE2LjkxOTggMTQuNjI4OSAxNy4xMyAxNC40MTg4IDE3LjI3NjMgMTQuMTY1OEMxNy40MjI1IDEzLjkxMjcgMTcuNDk5NyAxMy42MjU3IDE3LjUgMTMuMzMzNFpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2VlcCBwbGFub1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgIG15LTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMi43MjUgNS44MDAwOEwxMCAxMC4wMDg0TDE3LjI3NSA1LjgwMDA4TTEwIDE4LjQwMDFWMTAuMDAwMU0xNy41IDEzLjMzMzRWNi42NjY3NUMxNy40OTk3IDYuMzc0NDggMTcuNDIyNSA2LjA4NzQyIDE3LjI3NjMgNS44MzQzOEMxNy4xMyA1LjU4MTM0IDE2LjkxOTggNS4zNzEyMiAxNi42NjY3IDUuMjI1MDhMMTAuODMzMyAxLjg5MTc1QzEwLjU4IDEuNzQ1NDcgMTAuMjkyNiAxLjY2ODQ2IDEwIDEuNjY4NDZDOS43MDc0NCAxLjY2ODQ2IDkuNDIwMDMgMS43NDU0NyA5LjE2NjY3IDEuODkxNzVMMy4zMzMzMyA1LjIyNTA4QzMuMDgwMjIgNS4zNzEyMiAyLjg2OTk4IDUuNTgxMzQgMi43MjM3MiA1LjgzNDM4QzIuNTc3NDUgNi4wODc0MiAyLjUwMDMgNi4zNzQ0OCAyLjUgNi42NjY3NVYxMy4zMzM0QzIuNTAwMyAxMy42MjU3IDIuNTc3NDUgMTMuOTEyNyAyLjcyMzcyIDE0LjE2NThDMi44Njk5OCAxNC40MTg4IDMuMDgwMjIgMTQuNjI4OSAzLjMzMzMzIDE0Ljc3NTFMOS4xNjY2NyAxOC4xMDg0QzkuNDIwMDMgMTguMjU0NyA5LjcwNzQ0IDE4LjMzMTcgMTAgMTguMzMxN0MxMC4yOTI2IDE4LjMzMTcgMTAuNTggMTguMjU0NyAxMC44MzMzIDE4LjEwODRMMTYuNjY2NyAxNC43NzUxQzE2LjkxOTggMTQuNjI4OSAxNy4xMyAxNC40MTg4IDE3LjI3NjMgMTQuMTY1OEMxNy40MjI1IDEzLjkxMjcgMTcuNDk5NyAxMy42MjU3IDE3LjUgMTMuMzMzNFpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQ+UGxhbm9ncmFtOiA8L2g0PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpc0FwcHJvdmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnNbMF0/LnVzZXJBY3Rpb24gPT09ICdrZWVwUGxhbm8nIHx8IGZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5hbnN3ZXJzWzBdPy51c2VyQWN0aW9uID09PSAnZWRpdFdpdGhQbGFubycgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLWF1dG9cIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB5PVwiOC43NDIyOGUtMDdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiByeD1cIjEwXCIgZmlsbD1cIiNEMUZBREZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNC4yNDY0IDYuMTU4MzlMOC4yNzk2OSAxMS45MTY3TDYuNjk2MzUgMTAuMjI1MUM2LjQwNDY5IDkuOTUwMDUgNS45NDYzNSA5LjkzMzM5IDUuNjEzMDIgMTAuMTY2N0M1LjI4ODAyIDEwLjQwODQgNS4xOTYzNSAxMC44MzM0IDUuMzk2MzUgMTEuMTc1MUw3LjI3MTM1IDE0LjIyNTFDNy40NTQ2OSAxNC41MDg0IDcuNzcxMzUgMTQuNjgzNCA4LjEyOTY5IDE0LjY4MzRDOC40NzEzNSAxNC42ODM0IDguNzk2MzUgMTQuNTA4NCA4Ljk3OTY5IDE0LjIyNTFDOS4yNzk2OSAxMy44MzM0IDE1LjAwNDcgNy4wMDgzOSAxNS4wMDQ3IDcuMDA4MzlDMTUuNzU0NyA2LjI0MTcyIDE0Ljg0NjQgNS41NjY3MiAxNC4yNDY0IDYuMTUwMDVMMTQuMjQ2NCA2LjE1ODM5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMTJCNzZBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9QGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwic2hvd0FjdGlvbiAmJiAhaXNQbGFub1F1aWNrRWRpdFwiIGNsYXNzPVwibXMtYXV0byBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBsYW5vUXVpY2tFZGl0KClcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc0FJUXVpY2tFZGl0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOSAxNS4wMDAySDE1Ljc1TTEyLjM3NSAyLjYyNTE3QzEyLjY3MzQgMi4zMjY4IDEzLjA3OCAyLjE1OTE4IDEzLjUgMi4xNTkxOEMxMy43MDg5IDIuMTU5MTggMTMuOTE1OCAyLjIwMDMzIDE0LjEwODggMi4yODAyOUMxNC4zMDE5IDIuMzYwMjQgMTQuNDc3MyAyLjQ3NzQzIDE0LjYyNSAyLjYyNTE3QzE0Ljc3MjcgMi43NzI5MSAxNC44ODk5IDIuOTQ4MyAxNC45Njk5IDMuMTQxMzJDMTUuMDQ5OCAzLjMzNDM1IDE1LjA5MSAzLjU0MTI0IDE1LjA5MSAzLjc1MDE3QzE1LjA5MSAzLjk1OTEgMTUuMDQ5OCA0LjE2NTk5IDE0Ljk2OTkgNC4zNTkwMkMxNC44ODk5IDQuNTUyMDQgMTQuNzcyNyA0LjcyNzQzIDE0LjYyNSA0Ljg3NTE3TDUuMjUgMTQuMjUwMkwyLjI1IDE1LjAwMDJMMyAxMi4wMDAyTDEyLjM3NSAyLjYyNTE3WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93QWN0aW9uICYmIGlzUGxhbm9RdWlja0VkaXQgJiYgIWlzQUlRdWlja0VkaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlciBtcy1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBxdWljay1idG5cIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsUGxhbm9RdWlja0VkaXQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5jZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHF1aWNrLWJ0blwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TYXZlUGxhbm9RdWlja0VkaXQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb25lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLWRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwbGFub0ZpeHR1cmVRdWlja0RldGFpbHNcIiBjbGFzcz1cInJvdyBnLTAgbWItNFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY29sLTYgbGFiZWxcIj57eyBpdGVtLmxhYmVsIH19PC9wPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5saW5lIGVkaXRpbmcgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNQbGFub1F1aWNrRWRpdCAmJiBpdGVtLmVkaXRhYmxlOyBlbHNlIHBsYW5vVmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZJWFRVUkUgTkFNRSAodGV4dCkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0ubWV0YT8udHlwZSA9PT0gJ2ZpeHR1cmUnOyBlbHNlIGNhcGFjaXR5SW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiB3LTUwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJjb2wtNiB2YWx1ZSBlZGl0LWlucHV0IGZvcm0tY29udHJvbCB3LTEwMFwiIFtuZ01vZGVsXT1cIml0ZW0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uUXVpY2tWYWx1ZUNoYW5nZShpdGVtLCAkZXZlbnQsICdwbGFubycpXCIgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjE1MFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoKGl0ZW0udmFsdWUgPT0gJycgfHwgaXRlbS52YWx1ZSA9PSBudWxsIHx8IGl0ZW0udmFsdWUgPT0gdW5kZWZpbmVkICkgJiYgaXNRdWlja0VkaXRTdWJtaXR0ZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1kYW5nZXIgbS0wIG10LTFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTFweDtcIj5DYW5ub3QgYmUgZW1wdHk8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENBUEFDSVRZIChudW1iZXIpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2FwYWNpdHlJbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiB3LTUwXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiY29sLTYgdmFsdWUgZWRpdC1pbnB1dCBmb3JtLWNvbnRyb2wgdy0xMDBcIiBbdmFsdWVdPVwiaXRlbS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBpbnB1dG1vZGU9XCJudW1lcmljXCIgcGF0dGVybj1cIlswLTldKlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uQ2FwYWNpdHlJbnB1dCgkZXZlbnQsIGl0ZW0sICdwbGFubycpXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoKGl0ZW0udmFsdWUgPT0nJyB8fCBpdGVtLnZhbHVlID09IG51bGwgfHwgaXRlbS52YWx1ZSA9PSB1bmRlZmluZWQgfHwgaXRlbS52YWx1ZSA9PSAnMCcgfHxpdGVtLnZhbHVlID09ICcwMCcgKSAmJiBpc1F1aWNrRWRpdFN1Ym1pdHRlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWRhbmdlciBtLTAgbXQtMVwiIHN0eWxlPVwiZm9udC1zaXplOiAxMXB4O1wiPkNhbm5vdCBiZSAwIG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3JtYWwgdGV4dCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhbm9WYWx1ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNvbC02IHZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubWV0YT8udHlwZSA9PT0gJ2ZpeHR1cmUnID8gaXRlbS52YWx1ZSA6IChpdGVtLnZhbHVlIHwgdGl0bGVjYXNlKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stZWRpdC1jb250YWluZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgQGlmICghaXNBcHByb3ZlZCAmJiBzaG93QWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlZG8tYnRuXCIgKGNsaWNrKT1cIm9uQ2xpY2tSZWRvKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc0FJUXVpY2tFZGl0IHx8IGlzUGxhbm9RdWlja0VkaXRcIj5SZWRvPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcXVpY2stYnRuIG1zLWF1dG9cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdEFJRmVlZGJhY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQUlRdWlja0VkaXQgfHwgaXNQbGFub1F1aWNrRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzIyOF8xMjUzNilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjE2NjAyIDMuMzMzMkgzLjMzMjY4QzIuODkwNjUgMy4zMzMyIDIuNDY2NzMgMy41MDg3OSAyLjE1NDE3IDMuODIxMzVDMS44NDE2MSA0LjEzMzkxIDEuNjY2MDIgNC41NTc4NCAxLjY2NjAyIDQuOTk5ODZWMTYuNjY2NUMxLjY2NjAyIDE3LjEwODYgMS44NDE2MSAxNy41MzI1IDIuMTU0MTcgMTcuODQ1QzIuNDY2NzMgMTguMTU3NiAyLjg5MDY1IDE4LjMzMzIgMy4zMzI2OCAxOC4zMzMySDE0Ljk5OTNDMTUuNDQxNCAxOC4zMzMyIDE1Ljg2NTMgMTguMTU3NiAxNi4xNzc5IDE3Ljg0NUMxNi40OTA0IDE3LjUzMjUgMTYuNjY2IDE3LjEwODYgMTYuNjY2IDE2LjY2NjVWMTAuODMzMk0xNS40MTYgMi4wODMyQzE1Ljc0NzUgMS43NTE2OCAxNi4xOTcyIDEuNTY1NDMgMTYuNjY2IDEuNTY1NDNDMTcuMTM0OSAxLjU2NTQzIDE3LjU4NDUgMS43NTE2OCAxNy45MTYgMi4wODMyQzE4LjI0NzUgMi40MTQ3MiAxOC40MzM4IDIuODY0MzYgMTguNDMzOCAzLjMzMzJDMTguNDMzOCAzLjgwMjA0IDE4LjI0NzUgNC4yNTE2OCAxNy45MTYgNC41ODMyTDkuOTk5MzUgMTIuNDk5OUw2LjY2NjAyIDEzLjMzMzJMNy40OTkzNSA5Ljk5OTg2TDE1LjQxNiAyLjA4MzJaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMUQyOTM5XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzIyOF8xMjUzNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHF1aWNrLWJ0blwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DbGlja0FjY2VwdEFJKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0FJUXVpY2tFZGl0IHx8IGlzUGxhbm9RdWlja0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8yMjhfNTc3NClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00LjE2NjAyIDEuNjY2NUw0LjMyNDM1IDIuNDQ5ODRDNC40Mzc4MiAzLjAxMjM0IDQuNjk0NTcgMy41MzYwMyA1LjA2OTc3IDMuOTcwMjFDNS40NDQ5NyA0LjQwNDM5IDUuOTI1OSA0LjczNDM1IDYuNDY2MDIgNC45MjgxN0w2LjY2NjAyIDQuOTk5ODRMNi40NjYwMiA1LjA3MTVDNS45MjU5IDUuMjY1MzIgNS40NDQ5NyA1LjU5NTI5IDUuMDY5NzcgNi4wMjk0N0M0LjY5NDU3IDYuNDYzNjUgNC40Mzc4MiA2Ljk4NzMzIDQuMzI0MzUgNy41NDk4NEw0LjE2NjAyIDguMzMzMTdMNC4wMDc2OCA3LjU0OTg0QzMuODk0MjIgNi45ODczMyAzLjYzNzQ2IDYuNDYzNjUgMy4yNjIyNiA2LjAyOTQ3QzIuODg3MDYgNS41OTUyOSAyLjQwNjEzIDUuMjY1MzIgMS44NjYwMiA1LjA3MTVMMS42NjYwMiA0Ljk5OTg0TDEuODY2MDIgNC45MjgxN0MyLjQwNjEzIDQuNzM0MzUgMi44ODcwNiA0LjQwNDM5IDMuMjYyMjYgMy45NzAyMUMzLjYzNzQ2IDMuNTM2MDMgMy44OTQyMiAzLjAxMjM0IDQuMDA3NjggMi40NDk4NEw0LjE2NjAyIDEuNjY2NVpNNi42NjYwMiAxMy4zMzMyTDYuODU3NjggMTQuMzk2NUM2LjkwNzQ1IDE0LjY3MzkgNy4wMjY3NCAxNC45MzQxIDcuMjA0MzkgMTUuMTUyOEM3LjM4MjA0IDE1LjM3MTYgNy42MTIyNiAxNS41NDE3IDcuODczNTIgMTUuNjQ3M0w4LjMzMjY4IDE1LjgzMzJMNy44NzM1MiAxNi4wMTlDNy42MTIyMSAxNi4xMjQ0IDcuMzgxODkgMTYuMjk0NCA3LjIwNDA5IDE2LjUxM0M3LjAyNjMgMTYuNzMxNiA2LjkwNjgzIDE2Ljk5MTcgNi44NTY4NSAxNy4yNjlMNi42NjYwMiAxOC4zMzMyTDYuNDc0MzUgMTcuMjY5OEM2LjQyNDU4IDE2Ljk5MjUgNi4zMDUyOSAxNi43MzIyIDYuMTI3NjQgMTYuNTEzNUM1Ljk0OTk5IDE2LjI5NDcgNS43MTk3OCAxNi4xMjQ2IDUuNDU4NTIgMTYuMDE5TDQuOTk5MzUgMTUuODMzMkw1LjQ1ODUyIDE1LjY0NzNDNS43MTk4MyAxNS41NDE5IDUuOTUwMTQgMTUuMzcyIDYuMTI3OTQgMTUuMTUzNEM2LjMwNTczIDE0LjkzNDggNi40MjUyIDE0LjY3NDYgNi40NzUxOCAxNC4zOTczTDYuNjY2MDIgMTMuMzMzMlpNMTMuMzMyNyAyLjQ5OTg0TDEzLjc5NiA0LjcxMTVDMTQuMDMyMiA1LjgzOTA3IDE0LjU1NjUgNi44ODYyMSAxNS4zMTc4IDcuNzUwODFDMTYuMDc5MSA4LjYxNTQxIDE3LjA1MTUgOS4yNjc5NiAxOC4xNDAyIDkuNjQ0ODRMMTkuMTY2IDkuOTk5ODRMMTguMTQwMiAxMC4zNTQ4QzE3LjA1MTUgMTAuNzMxNyAxNi4wNzkxIDExLjM4NDMgMTUuMzE3OCAxMi4yNDg5QzE0LjU1NjUgMTMuMTEzNSAxNC4wMzIyIDE0LjE2MDYgMTMuNzk2IDE1LjI4ODJMMTMuMzMyNyAxNy40OTk4TDEyLjg2OTMgMTUuMjg4MkMxMi42MzMyIDE0LjE2MDYgMTIuMTA4OSAxMy4xMTM1IDExLjM0NzYgMTIuMjQ4OUMxMC41ODYyIDExLjM4NDMgOS42MTM4MiAxMC43MzE3IDguNTI1MTggMTAuMzU0OEw3LjQ5OTM1IDkuOTk5ODRMOC41MjUxOCA5LjY0NDg0QzkuNjEzODIgOS4yNjc5NiAxMC41ODYyIDguNjE1NDEgMTEuMzQ3NiA3Ljc1MDgxQzEyLjEwODkgNi44ODYyMSAxMi42MzMyIDUuODM5MDcgMTIuODY5MyA0LjcxMTVMMTMuMzMyNyAyLjQ5OTg0WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiYmxhY2tcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8yMjhfNTc3NFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHQgQUlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIG15LTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzIyOF81Nzc0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNC4xNjYwMiAxLjY2NjVMNC4zMjQzNSAyLjQ0OTg0QzQuNDM3ODIgMy4wMTIzNCA0LjY5NDU3IDMuNTM2MDMgNS4wNjk3NyAzLjk3MDIxQzUuNDQ0OTcgNC40MDQzOSA1LjkyNTkgNC43MzQzNSA2LjQ2NjAyIDQuOTI4MTdMNi42NjYwMiA0Ljk5OTg0TDYuNDY2MDIgNS4wNzE1QzUuOTI1OSA1LjI2NTMyIDUuNDQ0OTcgNS41OTUyOSA1LjA2OTc3IDYuMDI5NDdDNC42OTQ1NyA2LjQ2MzY1IDQuNDM3ODIgNi45ODczMyA0LjMyNDM1IDcuNTQ5ODRMNC4xNjYwMiA4LjMzMzE3TDQuMDA3NjggNy41NDk4NEMzLjg5NDIyIDYuOTg3MzMgMy42Mzc0NiA2LjQ2MzY1IDMuMjYyMjYgNi4wMjk0N0MyLjg4NzA2IDUuNTk1MjkgMi40MDYxMyA1LjI2NTMyIDEuODY2MDIgNS4wNzE1TDEuNjY2MDIgNC45OTk4NEwxLjg2NjAyIDQuOTI4MTdDMi40MDYxMyA0LjczNDM1IDIuODg3MDYgNC40MDQzOSAzLjI2MjI2IDMuOTcwMjFDMy42Mzc0NiAzLjUzNjAzIDMuODk0MjIgMy4wMTIzNCA0LjAwNzY4IDIuNDQ5ODRMNC4xNjYwMiAxLjY2NjVaTTYuNjY2MDIgMTMuMzMzMkw2Ljg1NzY4IDE0LjM5NjVDNi45MDc0NSAxNC42NzM5IDcuMDI2NzQgMTQuOTM0MSA3LjIwNDM5IDE1LjE1MjhDNy4zODIwNCAxNS4zNzE2IDcuNjEyMjYgMTUuNTQxNyA3Ljg3MzUyIDE1LjY0NzNMOC4zMzI2OCAxNS44MzMyTDcuODczNTIgMTYuMDE5QzcuNjEyMjEgMTYuMTI0NCA3LjM4MTg5IDE2LjI5NDQgNy4yMDQwOSAxNi41MTNDNy4wMjYzIDE2LjczMTYgNi45MDY4MyAxNi45OTE3IDYuODU2ODUgMTcuMjY5TDYuNjY2MDIgMTguMzMzMkw2LjQ3NDM1IDE3LjI2OThDNi40MjQ1OCAxNi45OTI1IDYuMzA1MjkgMTYuNzMyMiA2LjEyNzY0IDE2LjUxMzVDNS45NDk5OSAxNi4yOTQ3IDUuNzE5NzggMTYuMTI0NiA1LjQ1ODUyIDE2LjAxOUw0Ljk5OTM1IDE1LjgzMzJMNS40NTg1MiAxNS42NDczQzUuNzE5ODMgMTUuNTQxOSA1Ljk1MDE0IDE1LjM3MiA2LjEyNzk0IDE1LjE1MzRDNi4zMDU3MyAxNC45MzQ4IDYuNDI1MiAxNC42NzQ2IDYuNDc1MTggMTQuMzk3M0w2LjY2NjAyIDEzLjMzMzJaTTEzLjMzMjcgMi40OTk4NEwxMy43OTYgNC43MTE1QzE0LjAzMjIgNS44MzkwNyAxNC41NTY1IDYuODg2MjEgMTUuMzE3OCA3Ljc1MDgxQzE2LjA3OTEgOC42MTU0MSAxNy4wNTE1IDkuMjY3OTYgMTguMTQwMiA5LjY0NDg0TDE5LjE2NiA5Ljk5OTg0TDE4LjE0MDIgMTAuMzU0OEMxNy4wNTE1IDEwLjczMTcgMTYuMDc5MSAxMS4zODQzIDE1LjMxNzggMTIuMjQ4OUMxNC41NTY1IDEzLjExMzUgMTQuMDMyMiAxNC4xNjA2IDEzLjc5NiAxNS4yODgyTDEzLjMzMjcgMTcuNDk5OEwxMi44NjkzIDE1LjI4ODJDMTIuNjMzMiAxNC4xNjA2IDEyLjEwODkgMTMuMTEzNSAxMS4zNDc2IDEyLjI0ODlDMTAuNTg2MiAxMS4zODQzIDkuNjEzODIgMTAuNzMxNyA4LjUyNTE4IDEwLjM1NDhMNy40OTkzNSA5Ljk5OTg0TDguNTI1MTggOS42NDQ4NEM5LjYxMzgyIDkuMjY3OTYgMTAuNTg2MiA4LjYxNTQxIDExLjM0NzYgNy43NTA4MUMxMi4xMDg5IDYuODg2MjEgMTIuNjMzMiA1LjgzOTA3IDEyLjg2OTMgNC43MTE1TDEzLjMzMjcgMi40OTk4NFpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJibGFja1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8yMjhfNTc3NFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkFJIE91dHB1dDogPC9oND5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpc0FwcHJvdmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnNbMF0/LnVzZXJBY3Rpb24gPT09ICdhY2NlcHRBaScgfHwgZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnNbMF0/LnVzZXJBY3Rpb24gPT09ICdlZGl0V2l0aEFpJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy1hdXRvXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeT1cIjguNzQyMjhlLTA3XCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgcng9XCIxMFwiIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQuMjQ2NCA2LjE1ODM5TDguMjc5NjkgMTEuOTE2N0w2LjY5NjM1IDEwLjIyNTFDNi40MDQ2OSA5Ljk1MDA1IDUuOTQ2MzUgOS45MzMzOSA1LjYxMzAyIDEwLjE2NjdDNS4yODgwMiAxMC40MDg0IDUuMTk2MzUgMTAuODMzNCA1LjM5NjM1IDExLjE3NTFMNy4yNzEzNSAxNC4yMjUxQzcuNDU0NjkgMTQuNTA4NCA3Ljc3MTM1IDE0LjY4MzQgOC4xMjk2OSAxNC42ODM0QzguNDcxMzUgMTQuNjgzNCA4Ljc5NjM1IDE0LjUwODQgOC45Nzk2OSAxNC4yMjUxQzkuMjc5NjkgMTMuODMzNCAxNS4wMDQ3IDcuMDA4MzkgMTUuMDA0NyA3LjAwODM5QzE1Ljc1NDcgNi4yNDE3MiAxNC44NDY0IDUuNTY2NzIgMTQuMjQ2NCA2LjE1MDA1TDE0LjI0NjQgNi4xNTgzOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzEyQjc2QVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJzaG93QWN0aW9uICYmICFpc0FJUXVpY2tFZGl0XCIgW2NsYXNzLmRpc2FibGVkXT1cImlzUGxhbm9RdWlja0VkaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtYXV0byBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJ0b2dnbGVBSVF1aWNrRWRpdCgpXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05IDE1LjAwMDJIMTUuNzVNMTIuMzc1IDIuNjI1MTdDMTIuNjczNCAyLjMyNjggMTMuMDc4IDIuMTU5MTggMTMuNSAyLjE1OTE4QzEzLjcwODkgMi4xNTkxOCAxMy45MTU4IDIuMjAwMzMgMTQuMTA4OCAyLjI4MDI5QzE0LjMwMTkgMi4zNjAyNCAxNC40NzczIDIuNDc3NDMgMTQuNjI1IDIuNjI1MTdDMTQuNzcyNyAyLjc3MjkxIDE0Ljg4OTkgMi45NDgzIDE0Ljk2OTkgMy4xNDEzMkMxNS4wNDk4IDMuMzM0MzUgMTUuMDkxIDMuNTQxMjQgMTUuMDkxIDMuNzUwMTdDMTUuMDkxIDMuOTU5MSAxNS4wNDk4IDQuMTY1OTkgMTQuOTY5OSA0LjM1OTAyQzE0Ljg4OTkgNC41NTIwNCAxNC43NzI3IDQuNzI3NDMgMTQuNjI1IDQuODc1MTdMNS4yNSAxNC4yNTAyTDIuMjUgMTUuMDAwMkwzIDEyLjAwMDJMMTIuMzc1IDIuNjI1MTdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dBY3Rpb24gJiYgaXNBSVF1aWNrRWRpdCAmJiAhaXNQbGFub1F1aWNrRWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZ2FwLTIgYWxpZ24taXRlbXMtY2VudGVyIG1zLWF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHF1aWNrLWJ0blwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYW5jZWxBSVF1aWNrRWRpdCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcXVpY2stYnRuXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblNhdmVBSVF1aWNrRWRpdCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stZGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFpRml4dHVyZVF1aWNrRGV0YWlsc1wiIGNsYXNzPVwicm93IGctMCBtYi00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaWZmXT1cImhpZ2hsaWdodERpZmZlcmVuY2VzICYmIGl0ZW0uaXNEaWZmZXJlbnRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNvbC02IGxhYmVsXCI+e3sgaXRlbS5sYWJlbCB9fTwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElubGluZSBlZGl0aW5nIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQUlRdWlja0VkaXQgJiYgaXRlbS5lZGl0YWJsZTsgZWxzZSBhaVZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGSVhUVVJFIE5BTUUgKHRleHQpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm1ldGE/LnR5cGUgPT09ICdmaXh0dXJlJzsgZWxzZSBjYXBhY2l0eUlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gdy01MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiY29sLTYgdmFsdWUgZWRpdC1pbnB1dCBmb3JtLWNvbnRyb2wgdy0xMDBcIiBbbmdNb2RlbF09XCJpdGVtLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblF1aWNrVmFsdWVDaGFuZ2UoaXRlbSwgJGV2ZW50LCAnYWknKVwiIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxNTBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKChpdGVtLnZhbHVlID09ICcnIHx8IGl0ZW0udmFsdWUgPT0gbnVsbCB8fCBpdGVtLnZhbHVlID09IHVuZGVmaW5lZCApICYmIGlzUXVpY2tFZGl0U3VibWl0dGVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtZGFuZ2VyIG0tMCBtdC0xXCIgc3R5bGU9XCJmb250LXNpemU6IDExcHg7XCI+Q2Fubm90IGJlIGVtcHR5PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDQVBBQ0lUWSAobnVtYmVyKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NhcGFjaXR5SW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gdy01MFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImNvbC02IHZhbHVlIGVkaXQtaW5wdXQgZm9ybS1jb250cm9sIHctMTAwXCIgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgaW5wdXRtb2RlPVwibnVtZXJpY1wiIHBhdHRlcm49XCJbMC05XSpcIiBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbkNhcGFjaXR5SW5wdXQoJGV2ZW50LCBpdGVtLCAnYWknKVwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKChpdGVtLnZhbHVlID09JycgfHwgaXRlbS52YWx1ZSA9PSBudWxsIHx8IGl0ZW0udmFsdWUgPT0gdW5kZWZpbmVkIHx8IGl0ZW0udmFsdWUgPT0gJzAnfHxpdGVtLnZhbHVlID09ICcwMCcpICYmIGlzUXVpY2tFZGl0U3VibWl0dGVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtZGFuZ2VyIG0tMCBtdC0xXCIgc3R5bGU9XCJmb250LXNpemU6IDExcHg7XCI+Q2Fubm90IGJlIDAgb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHk8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vcm1hbCB0ZXh0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNhaVZhbHVlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY29sLTYgdmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5tZXRhPy50eXBlID09PSAnZml4dHVyZScgPyBpdGVtLnZhbHVlIDogKGl0ZW0udmFsdWUgfCB0aXRsZWNhc2UpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGlkPVwiZml4dHVyZS1jb21wYXJpc29uXCIgY2xhc3M9XCJyb3cgZy0wIG15LTNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0xXCI+UGxhbm9ncmFtIGRlc2lnbjwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+VGVtcGxhdGUgZGVzaWduZWQgYnkgdGhlIHBsYW5vZ3JhbSB0ZWFtPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bGliLWZpeHR1cmUgW2ZpeHR1cmVdPVwicGxhbm9GaXh0dXJlXCI+PC9saWItZml4dHVyZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTFcIj5TdG9yZSByZXNwb25zZTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+UGxhbm9ncmFtIHJlc3BvbnNlIGJ5IHRoZSBzdG9yZSB0ZWFtPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICBAaWYoY2RuICYmIGFpRml4dHVyZT8uZml4dHVyZUltYWdlKXtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4dHVyZS1pbWFnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiY2RuICsgYWlGaXh0dXJlPy5maXh0dXJlSW1hZ2VcIiBhbHQ9XCJTdG9yZSByZXNwb25zZSBpbWFnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgbXktN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTg2XCIgaGVpZ2h0PVwiODRcIiB2aWV3Qm94PVwiMCAwIDE4NiA4NFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMzAuMjU2IDE1LjMyODRDMTQwLjA5MiAxNS4zMjg0IDE0OC4wNjUgMjMuMzAyIDE0OC4wNjUgMzMuMTM3OUMxNDguMDY1IDM3LjIxNzYgMTUwLjgyNiA0MS44Njg0IDE1NC45MDYgNDEuODY4NEgxNjcuOTcyQzE3Ny44MDcgNDEuODY4NyAxODUuNzgxIDQ5Ljg0MjIgMTg1Ljc4MSA1OS42NzhDMTg1Ljc4MSA2OS41MTQxIDE3Ny44MDcgNzcuNDg4NSAxNjcuOTcxIDc3LjQ4ODVIODEuMzY2MkM2OS43MTg2IDc3LjQ4ODMgNTguNjM0OSA2OC40MDg0IDQ2Ljk4NzMgNjguNDA4NEg1LjkzNjUyQzIuNjU3ODIgNjguNDA4NCAwIDY1Ljc1MDYgMCA2Mi40NzE5QzAuMDAwMTI3ODIzIDU5LjE5MzMgMi42NTc5IDU2LjUzNTQgNS45MzY1MiA1Ni41MzU0SDYxLjg3MjhDNjMuMDA2OSA1Ni41MzU0IDYzLjk2NjkgNTUuNjkyOSA2NC4yODk3IDU0LjYwNTZDNjQuNzk5NCA1Mi44ODkyIDYzLjYyNjcgNTAuOTQ4NSA2MS44MzYxIDUwLjk0ODVINDMuNjUxNEMzMy44MTUzIDUwLjk0ODUgMjUuODQxOCA0Mi45NzQgMjUuODQxOCAzMy4xMzc5QzI1Ljg0MiAyMy4zMDIgMzMuODE1NCAxNS4zMjg0IDQzLjY1MTQgMTUuMzI4NEgxMzAuMjU2WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNFQUVDRjBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyNi42NjQgMjcuMzM1VjQ4LjY1TDEyMC45NTkgNDMuNzVDMTE4LjIyOSA0MS40MDUgMTEzLjgxOSA0MS40MDUgMTExLjA4OSA0My43NUw5Ni41MjkxIDU2LjI0NUM5My43OTkxIDU4LjU5IDg5LjM4OTEgNTguNTkgODYuNjU5MSA1Ni4yNDVMODUuNDY5MSA1NS4yNjVDODIuOTg0MSA1My4wOTUgNzkuMDI5MSA1Mi44ODUgNzYuMjI5MSA1NC43NzVMNTkuMDA5MSA2Ni4zMjVMNTguNjI0MSA2Ni42MDVDNTcuMzI5MSA2My44MDUgNTYuNjY0MSA2MC40OCA1Ni42NjQxIDU2LjY2NVYyNy4zMzVDNTYuNjY0MSAxNC41OTUgNjQuMjU5MSA3IDc2Ljk5OTEgN0gxMDYuMzI5QzExOS4wNjkgNyAxMjYuNjY0IDE0LjU5NSAxMjYuNjY0IDI3LjMzNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNkJDQUZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04MS4xNjQgMzYuMzI5OUM4NS43NjQ1IDM2LjMyOTkgODkuNDk0IDMyLjYwMDUgODkuNDk0IDI3Ljk5OTlDODkuNDk0IDIzLjM5OTQgODUuNzY0NSAxOS42Njk5IDgxLjE2NCAxOS42Njk5Qzc2LjU2MzUgMTkuNjY5OSA3Mi44MzQgMjMuMzk5NCA3Mi44MzQgMjcuOTk5OUM3Mi44MzQgMzIuNjAwNSA3Ni41NjM1IDM2LjMyOTkgODEuMTY0IDM2LjMyOTlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwQTNGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTI2LjY2NSA0OC42NVY1Ni42NjVDMTI2LjY2NSA2OS40MDUgMTE5LjA3IDc3IDEwNi4zMyA3N0g3N0M2OC4wNzUgNzcgNjEuNjM1IDczLjI1NSA1OC42MjUgNjYuNjA1TDU5LjAxIDY2LjMyNUw3Ni4yMyA1NC43NzVDNzkuMDMgNTIuODg1IDgyLjk4NSA1My4wOTUgODUuNDcgNTUuMjY1TDg2LjY2IDU2LjI0NUM4OS4zOSA1OC41OSA5My44IDU4LjU5IDk2LjUzIDU2LjI0NUwxMTEuMDkgNDMuNzVDMTEzLjgyIDQxLjQwNSAxMTguMjMgNDEuNDA1IDEyMC45NiA0My43NUwxMjYuNjY1IDQ4LjY1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMwMEEzRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEzOC4wNjRcIiBjeT1cIjI4LjMxMjhcIiByPVwiNC40MDA0MlwiIGZpbGw9XCIjNkJDQUZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI0Ny44MjU2XCIgY3k9XCIzOS4yNDA5XCIgcj1cIjIuNDUyNTVcIiBmaWxsPVwiIzZCQ0FGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBjeD1cIjEzOS4xODNcIiBjeT1cIjYxLjAwNzJcIiByeD1cIjQuMjkxOTdcIiByeT1cIjQuNTk4NTRcIiBmaWxsPVwiIzAwQTNGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8aHI+XHJcblxyXG4gICAgICAgIDxkaXYgaWQ9XCJ2bS1jb21wYXJpc29uXCIgKm5nSWY9XCJmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUFJRGF0YT8udm1Db25maWcubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTFcIj5WaXN1YWwgTWVyY2hhbmRpc2UgSW1hZ2VzIGZyb20gQUkgb3V0cHV0OjwvaDU+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctMFwiPlxyXG5cclxuICAgICAgICAgICAgICAgIEBmb3IgKHZtIG9mIGZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5maXh0dXJlQUlEYXRhPy52bUNvbmZpZzsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm0tY29udGFpbmVyXCIgKGNsaWNrKT1cIm9uQ2xpY2tWTUltYWdlUHJldmlldyhjZG4rdm0/LnZtSW1hZ2UpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm0taW1nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImNkbit2bT8udm1JbWFnZVwiIGFsdD1cIlZNIEltYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTIgdm0tZGV0YWlscyBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+e3t2bT8udm1UeXBlfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT57e3ZtPy52bU5hbWV9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltZy1wcmV2aWV3XCIgKm5nSWY9XCJzZWxlY3RlZEFpVm1JbWFnZUZvclByZXZpZXdcIiAoY2xpY2spPVwiY2xvc2VWTUltYWdlUHJldmlldygpXCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwic2VsZWN0ZWRBaVZtSW1hZ2VGb3JQcmV2aWV3XCIgY2xhc3M9XCJmdWxsLWltZ1wiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgfUBlbHNlIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXktNlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiOTRcIiBoZWlnaHQ9XCI5NFwiIHZpZXdCb3g9XCIwIDAgOTQgOTRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI3XCIgeT1cIjdcIiB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiByeD1cIjQwXCIgZmlsbD1cIiNEQUYxRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI3XCIgeT1cIjdcIiB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiByeD1cIjQwXCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjEzLjMzMzNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMzUuOTUwMiA0OC4xOTk3QzM1LjY0ODkgNDguMjMxNSAzNS4zNDIyIDQ4LjI1MDUgMzUuMDMxMiA0OC4yNTA1QzM0Ljg2MTcgNDguMjUwNSAzNC42OTQ0IDQ4LjI0MzYgMzQuNTI5MyA0OC4yMzM5VjU4LjYwNjlDMzQuNTI5MyA2MC4wMzQ5IDM1LjcxMjMgNjEuMjI2IDM3LjIwMDIgNjEuMjI2MUg1Ni44MDQ3QzU4LjI5MjcgNjEuMjI2MSA1OS40NzU2IDYwLjAzNSA1OS40NzU2IDU4LjYwNjlWNDguMjM0OUM1OS4zMTM3IDQ4LjI0NDEgNTkuMTQ5OCA0OC4yNTA1IDU4Ljk4NTQgNDguMjUwNUM1OC42NzE0IDQ4LjI1MDUgNTguMzYwOCA0OC4yMzI1IDU4LjA1NDcgNDguMTk5N1Y1NS45ODc4SDM1Ljk1MDJWNDguMTk5N1pNNTcuOTMxNiAzMi43NzM5SDM2LjA3MzJDMzUuODk1OSAzMi43NzM5IDM1Ljc0MDYgMzIuODY2NyAzNS42NjMxIDMyLjk4NzhMMzUuNjYxMSAzMi45ODk3TDMyLjE1MTQgMzguNDczMUwzMi4wNTY2IDM4LjYyMDZDMzAuODMxMSA0MC43NDA0IDMyLjA5NTcgNDMuNDY3NCAzNC40NDczIDQzLjc3NjlDMzQuNjQ4MiA0My44MDEzIDM0LjgzNzkgNDMuODE1OSAzNS4wMjU0IDQzLjgxNTlDMzYuMjU1NSA0My44MTU5IDM3LjM0MzQgNDMuMjg3MiAzOC4xMDA2IDQyLjQ2NTNMMzkuMDIyNSA0MS40NjQ0TDM5Ljk0MTQgNDIuNDY4M0M0MC42OTAzIDQzLjI4NjMgNDEuNzc3IDQzLjgxNTkgNDMuMDE0NiA0My44MTU5QzQ0LjI0NjcgNDMuODE1OCA0NS4zMzg2IDQzLjI4NTYgNDYuMDg2OSA0Mi40NjgzTDQ3LjAwODggNDEuNDYxNEw0Ny45MzA3IDQyLjQ2ODNDNDguNjc5IDQzLjI4NTcgNDkuNzcwNyA0My44MTU5IDUxLjAwMjkgNDMuODE1OUM1Mi4yMzUxIDQzLjgxNTkgNTMuMzI2OCA0My4yODU3IDU0LjA3NTIgNDIuNDY4M0w1NC45OTcxIDQxLjQ2MTRMNTUuOTE4OSA0Mi40NjgzQzU2LjY2NzMgNDMuMjg1NyA1Ny43NiA0My44MTU5IDU4Ljk5MjIgNDMuODE1OUM1OS4xNzM2IDQzLjgxNTkgNTkuMzY4NyA0My44MDIxIDU5LjU2ODQgNDMuNzc3OEg1OS41Njc0QzYxLjk2MTEgNDMuNDU3MyA2My4yMjkzIDQwLjYwNzggNjEuODYxMyAzOC40NzMxTDYxLjg2MDQgMzguNDc0MUw1OC4zNDM4IDMyLjk5MDdMNTguMzQyOCAzMi45ODc4QzU4LjI2NTMgMzIuODY2NSA1OC4xMDkyIDMyLjc3MzkgNTcuOTMxNiAzMi43NzM5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMDlCRjNcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LWJvbGQgaDMgbXQtMlwiPk5vIHJlc3BvbnNlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPk5vIEFJIHJlc3BvbnNlIGZvdW5kIGZvciB0aGlzIGZpeHR1cmUuPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gPGhyIGNsYXNzPVwibWItNlwiPiAtLT5cclxuICAgIH1cclxuXHJcblxyXG4gICAgQGlmIChmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vycz8uWzBdPy5jb21tZW50cy5sZW5ndGgpIHtcclxuICAgICAgICA8ZGl2IGlkPVwiZml4dHVyZS1jb21tZW50c1wiPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0yXCI+Q29tbWVudHM8L2g1PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYyBvZiBmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vyc1swXT8uY29tbWVudHM7bGV0IGk9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIFVzZXIgYXZhdGFyIC0tPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgcng9XCIxNlwiIGZpbGw9XCIjRUFGOEZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIyLjY2NzMgMjMuNVYyMS44MzMzQzIyLjY2NzMgMjAuOTQ5MyAyMi4zMTYxIDIwLjEwMTQgMjEuNjkxIDE5LjQ3NjNDMjEuMDY1OSAxOC44NTEyIDIwLjIxOCAxOC41IDE5LjMzNCAxOC41SDEyLjY2NzNDMTEuNzgzMyAxOC41IDEwLjkzNTQgMTguODUxMiAxMC4zMTAzIDE5LjQ3NjNDOS42ODUxNyAyMC4xMDE0IDkuMzMzOTggMjAuOTQ5MyA5LjMzMzk4IDIxLjgzMzNWMjMuNU0xOS4zMzQgMTEuODMzM0MxOS4zMzQgMTMuNjc0MyAxNy44NDE2IDE1LjE2NjcgMTYuMDAwNyAxNS4xNjY3QzE0LjE1OTcgMTUuMTY2NyAxMi42NjczIDEzLjY3NDMgMTIuNjY3MyAxMS44MzMzQzEyLjY2NzMgOS45OTIzOCAxNC4xNTk3IDguNSAxNi4wMDA3IDguNUMxNy44NDE2IDguNSAxOS4zMzQgOS45OTIzOCAxOS4zMzQgMTEuODMzM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0Pnt7Yz8udXNlck5hbWV9fTwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPnt7Yz8udGltZVN0YW1wIHwgZGF0ZTonaGg6bW06c3MgYSAtIGRkIE1NTSB5eXl5J319PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoYz8ucmVzcG9uc2V0eXBlID09PSAnY29tbWVudCcpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDU+e3tjPy5jb21tZW50fX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgIH1AZWxzZSBpZihjPy5yZXNwb25zZXR5cGUgPT09ICdhZ3JlZScpe1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1ICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnM/LlswXT8udXNlckFjdGlvbiA9PT0gJ2tlZXBQbGFubydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIktlZXAgUGxhbm9cIi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1ICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnM/LlswXT8udXNlckFjdGlvbiA9PT0gJ2VkaXRXaXRoUGxhbm8nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrZWQgYXMgXCJLZWVwIFBsYW5vIHdpdGggTW9kaWZpY2F0aW9uXCIuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSAqbmdJZj1cImZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5hbnN3ZXJzPy5bMF0/LnVzZXJBY3Rpb24gPT09ICdhY2NlcHRBaSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIkFjY2VwdCBBSVwiLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vycz8uWzBdPy51c2VyQWN0aW9uID09PSAnZWRpdFdpdGhBaSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIkFjY2VwdCBBSSB3aXRoIE1vZGlmaWNhdGlvblwiLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJjPy5jb21tZW50XCI+Tm90ZToge3tjLmNvbW1lbnR9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgfUBlbHNlIGlmKGM/LnJlc3BvbnNldHlwZSA9PT0gJ2Rpc2FncmVlJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIlJlZG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJjPy5jb21tZW50XCI+Tm90ZToge3tjLmNvbW1lbnR9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG48L3NlY3Rpb24+Il19