tango-app-ui-analyse-zone 3.7.1-beta.4-demo2 → 3.7.1-beta.40

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 (31) hide show
  1. package/esm2022/lib/components/customer-journey-chart/customer-journey-chart.component.mjs +185 -10
  2. package/esm2022/lib/components/interation-table-client459/interation-table-client459.component.mjs +3 -3
  3. package/esm2022/lib/components/overallcards/overallcards.component.mjs +527 -73
  4. package/esm2022/lib/components/segmentation/segmentation.component.mjs +46 -19
  5. package/esm2022/lib/components/services/zone.service.mjs +57 -1
  6. package/esm2022/lib/components/services/zonev2.service.mjs +6 -1
  7. package/esm2022/lib/components/tango-analyse-zone/tango-analyse-zone.component.mjs +7 -4
  8. package/esm2022/lib/components/top-performing-zones/top-performing-zones.component.mjs +14 -5
  9. package/esm2022/lib/components/zone-concentration/zone-concentration.component.mjs +4 -3
  10. package/esm2022/lib/components/zone-journey/zone-journey.component.mjs +562 -0
  11. package/esm2022/lib/components/zone-summary-table/zone-summary-table.component.mjs +10 -4
  12. package/esm2022/lib/components/zone-v2/customer-journey/customer-journey.component.mjs +44 -36
  13. package/esm2022/lib/components/zone-v2/store-heatmap/store-heatmap.component.mjs +91 -88
  14. package/esm2022/lib/components/zone-v2/summary-table/summary-table.component.mjs +3 -3
  15. package/esm2022/lib/components/zone-v2/zones-cards/zones-cards.component.mjs +4 -3
  16. package/esm2022/lib/tango-analyse-zone.module.mjs +15 -7
  17. package/fesm2022/tango-app-ui-analyse-zone.mjs +1718 -420
  18. package/fesm2022/tango-app-ui-analyse-zone.mjs.map +1 -1
  19. package/lib/components/customer-journey-chart/customer-journey-chart.component.d.ts +30 -2
  20. package/lib/components/overallcards/overallcards.component.d.ts +59 -13
  21. package/lib/components/segmentation/segmentation.component.d.ts +2 -0
  22. package/lib/components/services/zone.service.d.ts +18 -0
  23. package/lib/components/services/zonev2.service.d.ts +3 -0
  24. package/lib/components/tango-analyse-zone/tango-analyse-zone.component.d.ts +1 -0
  25. package/lib/components/top-performing-zones/top-performing-zones.component.d.ts +5 -3
  26. package/lib/components/zone-journey/zone-journey.component.d.ts +77 -0
  27. package/lib/components/zone-summary-table/zone-summary-table.component.d.ts +1 -0
  28. package/lib/components/zone-v2/customer-journey/customer-journey.component.d.ts +5 -2
  29. package/lib/components/zone-v2/store-heatmap/store-heatmap.component.d.ts +1 -0
  30. package/lib/tango-analyse-zone.module.d.ts +8 -6
  31. package/package.json +1 -1
@@ -0,0 +1,562 @@
1
+ import { Component, Input, ViewChild, HostListener } from '@angular/core';
2
+ import * as am5 from '@amcharts/amcharts5';
3
+ import * as am5flow from '@amcharts/amcharts5/flow';
4
+ import am5themes_Animated from '@amcharts/amcharts5/themes/Animated';
5
+ import { Subject, takeUntil } from 'rxjs';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../services/zone.service";
8
+ import * as i2 from "../services/zonev2.service";
9
+ import * as i3 from "@angular/router";
10
+ import * as i4 from "tango-app-ui-shared";
11
+ import * as i5 from "@angular/common";
12
+ import * as i6 from "@angular/forms";
13
+ import * as i7 from "@ng-bootstrap/ng-bootstrap";
14
+ export class ZoneJourneyComponent {
15
+ service;
16
+ zoneV2Service;
17
+ cd;
18
+ router;
19
+ ts;
20
+ root;
21
+ headerData;
22
+ clientData;
23
+ destroy$ = new Subject();
24
+ constructor(service, zoneV2Service, cd, router, ts) {
25
+ this.service = service;
26
+ this.zoneV2Service = zoneV2Service;
27
+ this.cd = cd;
28
+ this.router = router;
29
+ this.ts = ts;
30
+ }
31
+ ngOnChanges(changes) {
32
+ if (changes['headerData']?.currentValue) {
33
+ this.headerData = changes['headerData'].currentValue;
34
+ }
35
+ if (changes['clientData']?.currentValue) {
36
+ this.clientData = changes['clientData'].currentValue;
37
+ }
38
+ this.getAvailableZones();
39
+ this.cd.detectChanges();
40
+ }
41
+ zoneShopperAnalysis;
42
+ bubbleChartData;
43
+ object;
44
+ object1;
45
+ zoneSearchText = '';
46
+ showDropdown = false;
47
+ searchText = '';
48
+ zoneList = [];
49
+ filteredZones = [];
50
+ zonesInitialized = false;
51
+ tempZoneList = [];
52
+ tempFilteredZones = [];
53
+ dropdownSearchText = '';
54
+ availableZones = [];
55
+ getAvailableZones() {
56
+ const requestData = {
57
+ fromDate: this.headerData.date.startDate,
58
+ toDate: this.headerData.date.endDate,
59
+ storeId: this.headerData.stores.filter((store) => store.checked).map((store) => store.storeId),
60
+ clientId: this.headerData.client,
61
+ };
62
+ this.zoneV2Service.getAvailableZoneNames(requestData).pipe(takeUntil(this.destroy$)).subscribe({
63
+ next: (res) => {
64
+ if (res && res?.code === 200) {
65
+ this.availableZones = (res.data.availableZoneData || []).filter((zone) => zone.zoneName?.toLowerCase() !== 'overall store');
66
+ this.zoneList = this.availableZones.map(z => ({
67
+ name: z.zoneName,
68
+ checked: true
69
+ }));
70
+ this.zonesInitialized = true;
71
+ this.getZoneJourney([]);
72
+ this.getBubble([]);
73
+ this.cd.detectChanges();
74
+ }
75
+ else {
76
+ this.availableZones = [];
77
+ this.zoneChartNoData = true;
78
+ this.zoneChartLoading = false;
79
+ this.zoneCardNoData = true;
80
+ this.zoneCardLoading = false;
81
+ }
82
+ },
83
+ error: (err) => {
84
+ this.availableZones = [];
85
+ this.zoneChartNoData = true;
86
+ this.zoneChartLoading = false;
87
+ this.zoneCardNoData = true;
88
+ this.zoneCardLoading = false;
89
+ }
90
+ });
91
+ }
92
+ // getAvailableZones() {
93
+ // this.zoneV2Service.zones$
94
+ // .pipe(takeUntil(this.destroy$))
95
+ // .subscribe((zones) => {
96
+ // this.availableZones = zones;
97
+ // if (!this.zonesInitialized) {
98
+ // this.zoneList = zones.map(z => ({
99
+ // name: z.zoneName,
100
+ // checked: true
101
+ // }));
102
+ // this.zonesInitialized = true;
103
+ // if(this.zoneList.length){
104
+ // console.log('available zones in zone journey', this.zoneList);
105
+ // this.getZoneJourney([]);
106
+ // this.getBubble([]);
107
+ // } else {
108
+ // console.log('available zones in zone journey', this.zoneList);
109
+ // this.zoneChartNoData = true;
110
+ // this.zoneChartLoading = false;
111
+ // this.zoneCardNoData = true;
112
+ // this.zoneCardLoading = false;
113
+ // this.getZoneJourney([]);
114
+ // this.getBubble([]);
115
+ // }
116
+ // }
117
+ // });
118
+ // }
119
+ zoneDropdown;
120
+ /* OPEN / TOGGLE */
121
+ toggleDropdown(event) {
122
+ event.stopPropagation();
123
+ this.showDropdown = !this.showDropdown;
124
+ if (this.showDropdown) {
125
+ this.tempZoneList = this.zoneList.map((z) => ({ ...z }));
126
+ this.tempFilteredZones = [...this.tempZoneList];
127
+ }
128
+ }
129
+ /* 🔥 OUTSIDE CLICK HANDLER */
130
+ onDocumentClick(event) {
131
+ if (!this.showDropdown)
132
+ return;
133
+ const clickedInside = this.zoneDropdown?.nativeElement.contains(event.target);
134
+ if (!clickedInside) {
135
+ this.showDropdown = false;
136
+ }
137
+ }
138
+ toggleSelectAll(event) {
139
+ const checked = event.target.checked;
140
+ // Apply to full temp list
141
+ this.tempZoneList = this.tempZoneList.map(z => ({
142
+ ...z,
143
+ checked
144
+ }));
145
+ // Re-apply search filter so UI updates correctly
146
+ this.filterZones();
147
+ }
148
+ isAllSelected() {
149
+ return (this.tempZoneList.length > 0 &&
150
+ this.tempZoneList.every(z => z.checked));
151
+ }
152
+ filterZones() {
153
+ const text = this.dropdownSearchText.toLowerCase();
154
+ this.tempFilteredZones = this.tempZoneList.filter(z => z.name.toLowerCase().includes(text));
155
+ }
156
+ hiddenZones = [];
157
+ applyZones() {
158
+ this.zoneList = this.tempZoneList.map(z => ({ ...z }));
159
+ this.hiddenZones = this.zoneList
160
+ .filter((z) => !z.checked)
161
+ .map((z) => z.name);
162
+ this.getZoneJourney(this.hiddenZones);
163
+ this.getBubble(this.hiddenZones);
164
+ this.cd.detectChanges();
165
+ this.dropdownSearchText = '';
166
+ this.showDropdown = false;
167
+ }
168
+ resetZones() {
169
+ // Reset applied state
170
+ this.zoneList = this.zoneList.map((z) => ({
171
+ ...z,
172
+ checked: true
173
+ }));
174
+ // Sync temp state
175
+ this.tempZoneList = this.zoneList.map((z) => ({ ...z }));
176
+ this.tempFilteredZones = [...this.tempZoneList];
177
+ this.dropdownSearchText = '';
178
+ // Apply immediately
179
+ this.getZoneJourney([]);
180
+ this.getBubble([]);
181
+ this.showDropdown = false;
182
+ }
183
+ getZoneJourneyExport() {
184
+ this.object1 = {
185
+ clientId: this.headerData?.client,
186
+ storeId: this.headerData?.stores
187
+ .filter((store) => store.checked)
188
+ .map((store) => store.storeId),
189
+ fromDate: this.headerData?.date?.startDate,
190
+ toDate: this.headerData?.date?.endDate,
191
+ nob: this.clientData?.isNOB,
192
+ hideZones: this.zoneList.filter((z) => !z.checked).map((z) => z.name),
193
+ search: this.searchZoneText || '',
194
+ export: true
195
+ };
196
+ this.service.getNewZoneShopperAnalysisExportApi(this.object1).subscribe({
197
+ next: (res) => {
198
+ if (this.headerData.date.startDate == this.headerData.date.endDate) {
199
+ let fileName = 'Shopper Journey_Export_' + this.headerData.date.startDate;
200
+ this.service.saveAsExcelFile1(res, fileName);
201
+ }
202
+ else {
203
+ let fileName = 'Shopper Journey_Export_' + this.headerData.date.startDate + '_' + this.headerData.date.endDate;
204
+ this.service.saveAsExcelFile1(res, fileName);
205
+ }
206
+ },
207
+ error: ((e) => {
208
+ let errorMsg = 'Something went Wrong..';
209
+ if (e && e.error && e.error.error) {
210
+ errorMsg = e.error.error;
211
+ }
212
+ this.ts.getErrorToast(errorMsg);
213
+ })
214
+ });
215
+ }
216
+ zoneCardNoData = false;
217
+ zoneCardLoading = true;
218
+ zoneTestNoData = false;
219
+ getZoneJourney(hiddenZones = []) {
220
+ this.zoneCardLoading = true;
221
+ this.zoneCardNoData = false;
222
+ this.object1 = {
223
+ clientId: this.headerData?.client,
224
+ storeId: this.headerData?.stores
225
+ .filter((store) => store.checked)
226
+ .map((store) => store.storeId),
227
+ fromDate: this.headerData?.date?.startDate,
228
+ toDate: this.headerData?.date?.endDate,
229
+ nob: this.clientData?.isNOB,
230
+ hideZones: hiddenZones,
231
+ search: this.searchZoneText || '',
232
+ export: false
233
+ };
234
+ this.service.getNewZoneShopperAnalysisApi(this.object1).subscribe({
235
+ next: (res) => {
236
+ this.zoneCardLoading = false;
237
+ const list = res?.data?.zoneShopperAnalysis ?? [];
238
+ // API success
239
+ if (res?.code === 200) {
240
+ if (list.length > 0) {
241
+ this.zoneShopperAnalysis = res.data;
242
+ this.zones = list;
243
+ this.zoneCardNoData = false;
244
+ this.zoneTestNoData = false;
245
+ }
246
+ else if (this.searchZoneText) {
247
+ this.zoneShopperAnalysis = null;
248
+ this.zones = [];
249
+ this.zoneCardNoData = false;
250
+ this.zoneTestNoData = true;
251
+ }
252
+ // Case 3: No data at all
253
+ else {
254
+ this.resetZoneData(true);
255
+ }
256
+ }
257
+ else {
258
+ this.resetZoneData(true);
259
+ }
260
+ this.cd.detectChanges();
261
+ },
262
+ error: () => {
263
+ this.zoneCardLoading = false;
264
+ this.resetZoneData(true);
265
+ }
266
+ });
267
+ }
268
+ resetZoneData(noData) {
269
+ this.zoneShopperAnalysis = null;
270
+ this.zones = [];
271
+ this.zoneCardNoData = noData;
272
+ this.zoneTestNoData = false;
273
+ }
274
+ zoneChartNoData = false;
275
+ zoneChartLoading = true;
276
+ getBubble(hiddenZones = []) {
277
+ this.zoneChartLoading = true;
278
+ this.zoneChartNoData = false;
279
+ this.object = {
280
+ clientId: this.headerData?.client,
281
+ storeId: this.headerData?.stores.filter((store) => store.checked).map((store) => store.storeId),
282
+ fromDate: this.headerData?.date?.startDate,
283
+ toDate: this.headerData?.date?.endDate,
284
+ nob: this.clientData?.isNOB,
285
+ hideZones: hiddenZones,
286
+ };
287
+ this.service.getNewZoneShopperBubbleChartApi(this.object).subscribe({
288
+ next: (res) => {
289
+ if (res && res.code === 200) {
290
+ if (res?.data?.zoneBubbleChartMetrics?.length) {
291
+ this.bubbleChartData = res.data;
292
+ this.createChart();
293
+ this.zoneChartNoData = false;
294
+ this.zoneChartLoading = false;
295
+ }
296
+ else {
297
+ this.bubbleChartData = null;
298
+ this.zoneChartNoData = true;
299
+ this.zoneChartLoading = false;
300
+ }
301
+ this.cd.detectChanges();
302
+ }
303
+ else {
304
+ this.bubbleChartData = null;
305
+ this.zoneChartNoData = true;
306
+ this.zoneChartLoading = false;
307
+ }
308
+ },
309
+ error: (err) => {
310
+ this.bubbleChartData = null;
311
+ this.zoneChartNoData = true;
312
+ this.zoneChartLoading = false;
313
+ // console.log('zone journey bubble chart error',err);
314
+ }
315
+ });
316
+ }
317
+ prepareArcData(rawData) {
318
+ if (!rawData || !rawData.length) {
319
+ return { nodes: [], links: [] };
320
+ }
321
+ const nodeSet = new Set();
322
+ rawData.forEach(item => {
323
+ if (item.from)
324
+ nodeSet.add(item.from);
325
+ if (item.to)
326
+ nodeSet.add(item.to);
327
+ });
328
+ // remove Entry & Exit
329
+ const middle = Array.from(nodeSet).filter(n => n !== 'Entry' && n !== 'Exit');
330
+ // final order
331
+ const nodes = ['Entry', ...middle, 'Exit'].map(id => ({ id }));
332
+ return {
333
+ nodes,
334
+ links: rawData
335
+ };
336
+ }
337
+ createChart() {
338
+ setTimeout(() => {
339
+ // Dispose old chart
340
+ if (this.root) {
341
+ this.root.dispose();
342
+ }
343
+ // Root
344
+ this.root = am5.Root.new('chartdiv');
345
+ this.root.setThemes([am5themes_Animated.new(this.root)]);
346
+ // Arc Diagram Series
347
+ const series = this.root.container.children.push(am5flow.ArcDiagram.new(this.root, {
348
+ sourceIdField: 'from',
349
+ targetIdField: 'to',
350
+ valueField: 'value',
351
+ orientation: 'horizontal'
352
+ }));
353
+ // --------------------------------------------------
354
+ // TOOLTIP (HTML)
355
+ // --------------------------------------------------
356
+ const tooltip = am5.Tooltip.new(this.root, {
357
+ getFillFromSprite: true,
358
+ getStrokeFromSprite: true,
359
+ autoTextColor: true,
360
+ keepTargetHover: true,
361
+ pointerOrientation: 'horizontal'
362
+ });
363
+ // Attach tooltip to links
364
+ // series.links.template.set('tooltip', tooltip);
365
+ series.links.template.set('tooltipHTML', '');
366
+ series.links.template.setAll({
367
+ strokeWidth: 2.5,
368
+ interactive: false,
369
+ cursorOverStyle: 'pointer',
370
+ // tooltip: tooltip,
371
+ });
372
+ // Add a larger invisible hit area
373
+ series.links.template.states.create("hover", {
374
+ strokeWidth: 3
375
+ });
376
+ const flowData = this.bubbleChartData.zoneBubbleChartMetrics;
377
+ // Build bidirectional map
378
+ const bidirectionalMap = new Map();
379
+ flowData.forEach((d1) => {
380
+ flowData.forEach((d2) => {
381
+ if (d1.from === d2.to && d1.to === d2.from) {
382
+ const key = [d1.from, d1.to].sort().join("||");
383
+ const total = (d1.value || 0) + (d2.value || 0);
384
+ bidirectionalMap.set(key, total);
385
+ }
386
+ });
387
+ });
388
+ // Adapter for HTML content
389
+ series.links.template.adapters.add("tooltipHTML", (_html, target) => {
390
+ const dc = target.dataItem?.dataContext;
391
+ if (!dc)
392
+ return "";
393
+ const key = [dc.from, dc.to].sort().join("||");
394
+ // ✅ Bidirectional case
395
+ if (bidirectionalMap.has(key)) {
396
+ // Show tooltip ONLY for one direction
397
+ if (dc.from > dc.to)
398
+ return "";
399
+ return `
400
+ <div class="am-tooltip">
401
+ <div class="am-tooltip-header">
402
+ ${dc.from} ⇄ ${dc.to}
403
+ </div>
404
+ <div class="am-tooltip-table">
405
+ <div>
406
+ <span class="text-primary">${bidirectionalMap.get(key)}</span>
407
+ <span class="text-value">Total Footfall</span>
408
+ </div>
409
+ </div>
410
+ </div>
411
+ `;
412
+ }
413
+ // ✅ Normal (one-direction) tooltip
414
+ return `
415
+ <div class="am-tooltip">
416
+ <div class="am-tooltip-header">
417
+ ${dc.from} → ${dc.to}
418
+ </div>
419
+ <div class="am-tooltip-table">
420
+ <div>
421
+ <span class="text-primary">${dc.value ?? "--"}</span>
422
+ <span class="text-value">Footfall</span>
423
+ </div>
424
+ </div>
425
+ </div>
426
+ `;
427
+ return `
428
+ <div class="am-tooltip">
429
+ <div class="am-tooltip-header">
430
+ ${dc.to} → ${dc.from}
431
+ </div>
432
+ <div class="am-tooltip-table">
433
+ <div>
434
+ <span class="text-primary">${dc.value ?? "--"}</span>
435
+ <span class="text-value">Footfall</span>
436
+ </div>
437
+ </div>
438
+ </div>
439
+ `;
440
+ });
441
+ // <div><span class="text-primary">${dc.nob ?? '--'}</span><span class="text-value"> ${ this.clientData?.isNOB ? ' NoB' : ' Conversion' } </span> </div>
442
+ // --------------------------------------------------
443
+ // NODE LABELS
444
+ // --------------------------------------------------
445
+ series.nodes.labels.template.setAll({
446
+ text: '{id}',
447
+ centerX: am5.percent(50),
448
+ centerY: am5.percent(50),
449
+ textAlign: 'right',
450
+ fontSize: 11,
451
+ fill: am5.color(0x000000),
452
+ maxWidth: 90
453
+ });
454
+ // --------------------------------------------------
455
+ // FLOW BULLETS
456
+ // --------------------------------------------------
457
+ series.bullets.push((_root, _series, dataItem) => {
458
+ const bullet = am5.Bullet.new(this.root, {
459
+ locationY: Math.random(),
460
+ sprite: am5.Circle.new(this.root, {
461
+ radius: 2,
462
+ fill: dataItem.get('source').get('fill')
463
+ })
464
+ });
465
+ bullet.animate({
466
+ key: 'locationY',
467
+ from: 0,
468
+ to: 1,
469
+ duration: Math.random() * 1000 + 2000,
470
+ // loops: Infinity
471
+ });
472
+ return bullet;
473
+ });
474
+ // --------------------------------------------------
475
+ // DATA + ORDERING
476
+ // --------------------------------------------------
477
+ const prepared = this.prepareArcData(this.bubbleChartData?.zoneBubbleChartMetrics);
478
+ // 1️⃣ set nodes FIRST
479
+ series.nodes.data.setAll(prepared.nodes);
480
+ // 2️⃣ set links AFTER
481
+ series.data.setAll(prepared.links);
482
+ series.appear(1000, 100);
483
+ }, 500);
484
+ }
485
+ ngOnDestroy() {
486
+ if (this.root) {
487
+ this.root.dispose();
488
+ }
489
+ this.destroy$.next();
490
+ this.destroy$.complete();
491
+ // this.stopAutoSlide();
492
+ }
493
+ zones = [];
494
+ activeIndex = 0;
495
+ toggle(index) {
496
+ this.activeIndex = this.activeIndex === index ? null : index;
497
+ }
498
+ searchNewOpen = false;
499
+ searchOpen() {
500
+ this.searchNewOpen = !this.searchNewOpen;
501
+ if (!this.searchNewOpen) {
502
+ this.searchZoneText = '';
503
+ this.getZoneJourney(this.hiddenZones);
504
+ }
505
+ }
506
+ searchZoneText = '';
507
+ SearchZones() {
508
+ this.getZoneJourney(this.hiddenZones);
509
+ }
510
+ isMinimized = false;
511
+ // drag support
512
+ dragging = false;
513
+ offsetX = 0;
514
+ offsetY = 0;
515
+ floatingPos = {
516
+ top: 120,
517
+ left: window.innerWidth - 380
518
+ };
519
+ expandClose() {
520
+ this.isMinimized = !this.isMinimized;
521
+ }
522
+ startDrag(event) {
523
+ if (!this.isMinimized)
524
+ return;
525
+ this.dragging = true;
526
+ this.offsetX = event.clientX - this.floatingPos.left;
527
+ this.offsetY = event.clientY - this.floatingPos.top;
528
+ document.addEventListener('mousemove', this.onDrag);
529
+ document.addEventListener('mouseup', this.stopDrag);
530
+ }
531
+ onDrag = (event) => {
532
+ if (!this.dragging)
533
+ return;
534
+ this.floatingPos.left = event.clientX - this.offsetX;
535
+ this.floatingPos.top = event.clientY - this.offsetY;
536
+ };
537
+ stopDrag = () => {
538
+ this.dragging = false;
539
+ document.removeEventListener('mousemove', this.onDrag);
540
+ document.removeEventListener('mouseup', this.stopDrag);
541
+ };
542
+ nobUpload() {
543
+ this.router.navigate(["/manage/traffic/nob"]);
544
+ }
545
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ZoneJourneyComponent, deps: [{ token: i1.ZoneService }, { token: i2.Zonev2Service }, { token: i0.ChangeDetectorRef }, { token: i3.Router }, { token: i4.ToastService }], target: i0.ɵɵFactoryTarget.Component });
546
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ZoneJourneyComponent, selector: "lib-zone-journey", inputs: { headerData: "headerData", clientData: "clientData" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "zoneDropdown", first: true, predicate: ["zoneDropdown"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- zone-journey.component.html -->\r\n<div class=\"card my-card mx-1 my-2\">\r\n <div class=\"card-header px-0 mx-5 border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-1\">Zone-Based Shopper Analysis </span>\r\n <span class=\"text-sub mb-1\">Understand your Shoppers journey from one zone to another\r\n </span>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n<div class=\"zone-dropdown me-3\" #zoneDropdown\r\n (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- BUTTON -->\r\n <button \r\n class=\"btn btn-outline w-100 me-3 d-flex justify-content-between\"\r\n (click)=\"toggleDropdown($event)\"\r\n >\r\n Show / Hide Zone\r\n <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"7\" viewBox=\"0 0 12 7\" fill=\"none\">\r\n<path d=\"M1 1L6 6L11 1\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg></span>\r\n </button>\r\n\r\n <!-- DROPDOWN -->\r\n <div *ngIf=\"showDropdown\" class=\"dropdown-panel h-300px d-flex flex-column\">\r\n \r\n <!-- HEADER (fixed) -->\r\n <div class=\"dropdown-header px-2 pb-2\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Search Zone\"\r\n [(ngModel)]=\"dropdownSearchText\"\r\n (input)=\"filterZones()\"\r\n />\r\n </div>\r\n \r\n <div *ngIf=\"tempFilteredZones?.length\" class=\"d-flex align-items-center gap-2 mb-2 \">\r\n <span class=\"ms-1\"><input\r\n type=\"checkbox\"\r\n [checked]=\"isAllSelected()\"\r\n (change)=\"toggleSelectAll($event)\"\r\n /></span>\r\n <span >Select All</span>\r\n </div>\r\n <!-- BODY (scrollable list) -->\r\n <div *ngIf=\"tempFilteredZones?.length\" class=\"dropdown-body flex-grow-1 overflow-auto \">\r\n <div\r\n class=\"zone-item\"\r\n *ngFor=\"let zone of tempFilteredZones\"\r\n >\r\n <span class=\"ms-1\"><input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"zone.checked\"\r\n /></span>\r\n <span >{{ zone.name }}</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!tempFilteredZones?.length\" >\r\n <div class=\"col-lg-12\">\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata-table\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- FOOTER (fixed) -->\r\n <div *ngIf=\"tempFilteredZones?.length\" class=\"dropdown-footer d-flex justify-content-end gap-2 p-2 border-top\">\r\n <button class=\"btn btn-sm btn-outline w-50\" (click)=\"resetZones()\">\r\n Reset\r\n </button>\r\n <button class=\"btn btn-sm btn-primary w-50\" (click)=\"applyZones()\">\r\n Apply\r\n </button>\r\n </div>\r\n\r\n</div>\r\n\r\n</div>\r\n\r\n\r\n <!-- <button type=\"button\" (click)=\"getZoneJourneyExport()\" [disabled]=\"!zoneShopperAnalysis\"\r\n class=\"btn-outline btn align-items-end text-nowrap invheader me-4\">\r\n \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <span class=\"ms-2\"></span> Export\r\n </button> -->\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-between mt-3 mx-3\">\r\n <div class=\"bordered-box w-50 me-2 py-1\">\r\n <div class=\"group d-flex justify-content-between pt-1 px-3\">\r\n <span class=\"text-title py-2\"><svg class=\"mx-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"19\"\r\n height=\"21\" viewBox=\"0 0 19 21\" fill=\"none\">\r\n <path\r\n d=\"M0.5 16.3258H6V17.5758C6 18.3051 5.71027 19.0046 5.19454 19.5203C4.67882 20.036 3.97935 20.3258 3.25 20.3258C2.52065 20.3258 1.82118 20.036 1.30546 19.5203C0.789731 19.0046 0.5 18.3051 0.5 17.5758V16.3258ZM4.5 4.44576C6.5 4.44576 7.5 7.32576 7.5 9.32576C7.5 10.3258 7 11.3258 6.5 12.8258L6 14.3258H0.5C0.5 13.3258 0 11.8258 0 9.32576C0 6.82576 1.998 4.44576 4.5 4.44576ZM16.554 12.4238L16.337 13.6548C16.2023 14.3654 15.7931 14.9943 15.198 15.4054C14.6029 15.8165 13.8698 15.9765 13.1576 15.8509C12.4453 15.7254 11.8111 15.3242 11.3925 14.7344C10.9739 14.1446 10.8045 13.4136 10.921 12.6998L11.137 11.4698L16.554 12.4238ZM14.678 0.0307624C17.142 0.464762 18.696 3.15576 18.262 5.61776C17.828 8.07976 17.075 9.46976 16.902 10.4548L11.485 9.49976L11.253 7.93576C11.021 6.37176 10.703 5.29976 10.876 4.31576C11.223 2.34576 12.708 -0.316238 14.678 0.0307624Z\"\r\n fill=\"#1D2939\" />\r\n </svg>Overall Footfall :</span>\r\n <span><span class=\"text-val\">{{zoneShopperAnalysis?.OverallFootfall ?? '--'}}</span> </span>\r\n </div>\r\n </div>\r\n <div class=\"bordered-box w-50 py-1\">\r\n <div class=\"group d-flex justify-content-between pt-1 px-3\">\r\n <span *ngIf=\"this.clientData?.isNOB\" class=\"text-title py-2\">\r\n<svg class=\"mx-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\"\r\n height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M9 11H15M9 15H15M9 7H15M5 3C5 2.73478 5.10536 2.48043 5.29289 2.29289C5.48043 2.10536 5.73478 2 6 2H18C18.2652 2 18.5196 2.10536 18.7071 2.29289C18.8946 2.48043 19 2.73478 19 3V22L15.5 19.5L12 22L8.5 19.5L5 22V3Z\"\r\n stroke=\"#1D2939\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> NoB :</span>\r\n <span *ngIf=\"!this.clientData?.isNOB\" class=\"text-title py-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n<path d=\"M16 21V19C16 17.9391 15.5786 16.9217 14.8284 16.1716C14.0783 15.4214 13.0609 15 12 15H5C3.93913 15 2.92172 15.4214 2.17157 16.1716C1.42143 16.9217 1 17.9391 1 19V21M17 11L19 13L23 9M12.5 7C12.5 9.20914 10.7091 11 8.5 11C6.29086 11 4.5 9.20914 4.5 7C4.5 4.79086 6.29086 3 8.5 3C10.7091 3 12.5 4.79086 12.5 7Z\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg> Conversion :</span>\r\n <span class=\"text-val\">{{zoneShopperAnalysis?.Nob ?? '--'}}<span class=\"text-perc ms-1\">({{zoneShopperAnalysis?.ConversionPercent ?? '--'}} %)</span> <span *ngIf=\"this.clientData?.isNOB\" class=\"px-0 cursor-pointer\" (click)=\"nobUpload()\">\r\n <svg placement=\"top\" ngbTooltip=\"Upload NoB\" xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\"\r\n viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_15106_106090)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"#EAF8FF\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#EAF8FF\" />\r\n <path\r\n d=\"M23.3326 22.3332L19.9992 18.9999M19.9992 18.9999L16.6659 22.3332M19.9992 18.9999V26.4999M26.9909 24.3249C27.8037 23.8818 28.4458 23.1806 28.8158 22.3321C29.1858 21.4835 29.2627 20.5359 29.0344 19.6388C28.8061 18.7417 28.2855 17.9462 27.5548 17.3778C26.8241 16.8094 25.925 16.5005 24.9992 16.4999H23.9492C23.697 15.5243 23.2269 14.6185 22.5742 13.8507C21.9215 13.0829 21.1033 12.4731 20.181 12.0671C19.2587 11.661 18.2564 11.4694 17.2493 11.5065C16.2423 11.5436 15.2568 11.8085 14.3669 12.2813C13.477 12.7541 12.7058 13.4225 12.1114 14.2362C11.517 15.05 11.1148 15.9879 10.9351 16.9794C10.7553 17.9709 10.8027 18.9903 11.0736 19.961C11.3445 20.9316 11.8319 21.8281 12.4992 22.5832\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_15106_106090\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_15106_106090\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_15106_106090\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg></span></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row gx-0 p-3\">\r\n <div [ngClass]=\"isMinimized ? 'col-12' : 'col-8'\"\r\n [style.height.px]=\"zoneChartNoData ? 300 : (isMinimized ? 650 : 550)\">\r\n <ng-container *ngIf=\"zoneChartLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"zoneChartNoData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for Zone Based Shopper Analysis Chart</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!zoneChartNoData && !zoneChartLoading\" id=\"chartdiv\" style=\"width: 100%; height: 100%;\"></div>\r\n </div>\r\n\r\n <div [ngClass]=\"isMinimized ? 'zone-floating' : 'col-4'\" [style.top.px]=\"isMinimized ? floatingPos.top : null\"\r\n [style.left.px]=\"isMinimized ? floatingPos.left : null\" (mousedown)=\"startDrag($event)\">\r\n <!-- (mousedown)=\"startDrag($event)\" -->\r\n <ng-container *ngIf=\"zoneCardLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"zoneCardNoData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for Zone Based Shopper Analysis</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-conatiner *ngIf=\"!zoneCardNoData && !zoneCardLoading\" class=\"card \">\r\n <div class=\"card-header border-0 px-4\"\r\n [ngClass]=\"isMinimized ?'bg-secondary min-h-30px': 'bg-light-primary min-h-45px mb-2'\">\r\n <div class=\"card-title align-items-start\"><span *ngIf=\"isMinimized\" class=\"me-2 mb-2\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M9 20C8.45 20 7.97917 19.8042 7.5875 19.4125C7.19583 19.0208 7 18.55 7 18C7 17.45 7.19583 16.9792 7.5875 16.5875C7.97917 16.1958 8.45 16 9 16C9.55 16 10.0208 16.1958 10.4125 16.5875C10.8042 16.9792 11 17.45 11 18C11 18.55 10.8042 19.0208 10.4125 19.4125C10.0208 19.8042 9.55 20 9 20ZM15 20C14.45 20 13.9792 19.8042 13.5875 19.4125C13.1958 19.0208 13 18.55 13 18C13 17.45 13.1958 16.9792 13.5875 16.5875C13.9792 16.1958 14.45 16 15 16C15.55 16 16.0208 16.1958 16.4125 16.5875C16.8042 16.9792 17 17.45 17 18C17 18.55 16.8042 19.0208 16.4125 19.4125C16.0208 19.8042 15.55 20 15 20ZM9 14C8.45 14 7.97917 13.8042 7.5875 13.4125C7.19583 13.0208 7 12.55 7 12C7 11.45 7.19583 10.9792 7.5875 10.5875C7.97917 10.1958 8.45 10 9 10C9.55 10 10.0208 10.1958 10.4125 10.5875C10.8042 10.9792 11 11.45 11 12C11 12.55 10.8042 13.0208 10.4125 13.4125C10.0208 13.8042 9.55 14 9 14ZM15 14C14.45 14 13.9792 13.8042 13.5875 13.4125C13.1958 13.0208 13 12.55 13 12C13 11.45 13.1958 10.9792 13.5875 10.5875C13.9792 10.1958 14.45 10 15 10C15.55 10 16.0208 10.1958 16.4125 10.5875C16.8042 10.9792 17 11.45 17 12C17 12.55 16.8042 13.0208 16.4125 13.4125C16.0208 13.8042 15.55 14 15 14ZM9 8C8.45 8 7.97917 7.80417 7.5875 7.4125C7.19583 7.02083 7 6.55 7 6C7 5.45 7.19583 4.97917 7.5875 4.5875C7.97917 4.19583 8.45 4 9 4C9.55 4 10.0208 4.19583 10.4125 4.5875C10.8042 4.97917 11 5.45 11 6C11 6.55 10.8042 7.02083 10.4125 7.4125C10.0208 7.80417 9.55 8 9 8ZM15 8C14.45 8 13.9792 7.80417 13.5875 7.4125C13.1958 7.02083 13 6.55 13 6C13 5.45 13.1958 4.97917 13.5875 4.5875C13.9792 4.19583 14.45 4 15 4C15.55 4 16.0208 4.19583 16.4125 4.5875C16.8042 4.97917 17 5.45 17 6C17 6.55 16.8042 7.02083 16.4125 7.4125C16.0208 7.80417 15.55 8 15 8Z\"\r\n fill=\"#667085\" />\r\n </svg></span> Zone Journey </div>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span *ngIf=\"!isMinimized\" (click)=\"searchOpen()\" class=\"me-3\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path\r\n d=\"M19 19L14.65 14.65M17 9C17 13.4183 13.4183 17 9 17C4.58172 17 1 13.4183 1 9C1 4.58172 4.58172 1 9 1C13.4183 1 17 4.58172 17 9Z\"\r\n stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"cursor-pointer\" *ngIf=\"!isMinimized\"\r\n (click)=\"expandClose(); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M5 12H19\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span class=\"cursor-pointer\" *ngIf=\"isMinimized\"\r\n (click)=\"expandClose(); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M15 3H21M21 3V9M21 3L14 10M9 21H3M3 21V15M3 21L10 14\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"searchNewOpen && !isMinimized\" class=\"px-2 pb-2\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Search Zone\"\r\n [(ngModel)]=\"searchZoneText\"\r\n (change)=\"SearchZones()\"\r\n />\r\n </div>\r\n <div *ngIf=\"!isMinimized\" class=\"card-body h-500px overflow-auto px-0 py-2\">\r\n <ng-container *ngIf=\"zoneTestNoData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for Zone Analysis</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n <div class=\"zone-card mx-3 \" *ngFor=\"let zone of zones;let i = index\">\r\n\r\n <!-- HEADER -->\r\n <div [ngClass]=\"activeIndex === i ? 'zone-header':'zone-default'\" (click)=\"toggle(i)\">\r\n <div [ngClass]=\"activeIndex === i ? 'zone-title':'zone-notitle'\">{{ zone.fromZone |\r\n titlecase}}\r\n </div>\r\n\r\n <div class=\"zone-metrics\">\r\n <span class=\"badge badge-light-primary px-2\" placement=\"top\" ngbTooltip=\"Footfall\">\r\n <span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\"\r\n viewBox=\"0 0 10 11\" fill=\"none\">\r\n <path\r\n d=\"M0.25 8.16288H3V8.78788C3 9.15255 2.85513 9.50229 2.59727 9.76015C2.33941 10.018 1.98967 10.1629 1.625 10.1629C1.26033 10.1629 0.910591 10.018 0.652728 9.76015C0.394866 9.50229 0.25 9.15255 0.25 8.78788V8.16288ZM2.25 2.22288C3.25 2.22288 3.75 3.66288 3.75 4.66288C3.75 5.16288 3.5 5.66288 3.25 6.41288L3 7.16288H0.25C0.25 6.66288 0 5.91288 0 4.66288C0 3.41288 0.999 2.22288 2.25 2.22288ZM8.277 6.21188L8.1685 6.82738C8.10117 7.18269 7.89656 7.49717 7.59901 7.70271C7.30146 7.90824 6.93492 7.98827 6.57878 7.92547C6.22263 7.86268 5.90557 7.6621 5.69626 7.3672C5.48695 7.07229 5.40225 6.7068 5.4605 6.34988L5.5685 5.73488L8.277 6.21188ZM7.339 0.0153812C8.571 0.232381 9.348 1.57788 9.131 2.80888C8.914 4.03988 8.5375 4.73488 8.451 5.22738L5.7425 4.74988L5.6265 3.96788C5.5105 3.18588 5.3515 2.64988 5.438 2.15788C5.6115 1.17288 6.354 -0.158119 7.339 0.0153812Z\"\r\n fill=\"#009BF3\" />\r\n </svg></span> {{ zone.fromZoneFootfallCount ?? '--' }}\r\n </span>\r\n <span class=\"badge badge-light-default px-2\" placement=\"top\"\r\n[ngbTooltip]=\"clientData?.isNOB ? 'NoB' : 'Conversion'\">\r\n <span *ngIf=\"this.clientData?.isNOB\" class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M4.5 5.5H7.5M4.5 7.5H7.5M4.5 3.5H7.5M2.5 1.5C2.5 1.36739 2.55268 1.24021 2.64645 1.14645C2.74021 1.05268 2.86739 1 3 1H9C9.13261 1 9.25979 1.05268 9.35355 1.14645C9.44732 1.24021 9.5 1.36739 9.5 1.5V11L7.75 9.75L6 11L4.25 9.75L2.5 11V1.5Z\"\r\n stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span> <span *ngIf=\"!this.clientData?.isNOB\" class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n<path d=\"M16 21V19C16 17.9391 15.5786 16.9217 14.8284 16.1716C14.0783 15.4214 13.0609 15 12 15H5C3.93913 15 2.92172 15.4214 2.17157 16.1716C1.42143 16.9217 1 17.9391 1 19V21M17 11L19 13L23 9M12.5 7C12.5 9.20914 10.7091 11 8.5 11C6.29086 11 4.5 9.20914 4.5 7C4.5 4.79086 6.29086 3 8.5 3C10.7091 3 12.5 4.79086 12.5 7Z\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg></span> {{ zone.fromZoneNobCount ?? '--' }}\r\n </span>\r\n\r\n <span class=\"arrow cursor-pointer\"><svg *ngIf=\"activeIndex === i\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"7\" viewBox=\"0 0 12 7\"\r\n fill=\"none\">\r\n <path d=\"M0.832031 5.83301L5.83203 0.833008L10.832 5.83301\" stroke=\"#33B5FF\"\r\n stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"activeIndex !== i\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\"\r\n height=\"7\" viewBox=\"0 0 12 7\" fill=\"none\">\r\n <path d=\"M0.832031 0.833008L5.83203 5.83301L10.832 0.833008\" stroke=\"#667085\"\r\n stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- BODY -->\r\n <div class=\"zone-body max-h-200px min-h-auto overflow-auto\" *ngIf=\"activeIndex === i\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table text-nowrap bottom-border \">\r\n <thead>\r\n\r\n <tr>\r\n <th class=\"w-50\">To Zone</th>\r\n <th>Footfall (Concentration)</th>\r\n <!-- <th ><span class=\"me-2\" *ngIf=\"this.clientData?.isNOB\">NoB</span> <span class=\"me-2\" *ngIf=\"!this.clientData?.isNOB\">Conversion</span> -->\r\n <!-- <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_15320_82488)\">\r\n <path\r\n d=\"M7.9987 10.6663V7.99967M7.9987 5.33301H8.00536M14.6654 7.99967C14.6654 11.6816 11.6806 14.6663 7.9987 14.6663C4.3168 14.6663 1.33203 11.6816 1.33203 7.99967C1.33203 4.31778 4.3168 1.33301 7.9987 1.33301C11.6806 1.33301 14.6654 4.31778 14.6654 7.99967Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_15320_82488\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg> -->\r\n <!-- </th> -->\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of zone.toZoneData\">\r\n <td>{{ row.toZone | titlecase}}</td>\r\n <td>{{ row.footfall ?? '--' }} ({{ row.concPercent }}%)</td>\r\n <!-- <td>{{ row.nob ?? '--' }} ({{ row.nobPercent }}%)</td> -->\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n \r\n </div>\r\n </ng-conatiner>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n</div>", styles: [".zone-card{border:1px solid #e6f0ff;border-radius:10px;margin-bottom:12px;background:#fff}.zone-header{display:flex;justify-content:space-between;align-items:center;padding:12px 30px 12px 12px;cursor:pointer;background:#f6fcff;border-radius:10px}.zone-default{border-width:1px;display:flex;justify-content:space-between;align-items:center;opacity:1;border-radius:8px;padding:12px 30px 12px 12px;border:1px solid #D0D5DD;background:#fff}.zone-title{font-weight:600;font-size:16px;line-height:24px;letter-spacing:0%;vertical-align:middle;color:#33b5ff}.zone-metrics{display:flex;align-items:center;gap:8px}.pill{padding:4px 10px;border-radius:16px;font-size:12px}.arrow{transition:transform .3s ease}.arrow.rotate{transform:rotate(180deg)}.zone-body{padding:10px 12px}.table-head,.table-row{display:grid;grid-template-columns:1fr 1fr 1fr;padding:6px 0}.table-head{font-weight:600;font-size:12px;opacity:1;padding:11px 16px;border-bottom-width:1px;background-color:#fcfcfd;color:#667085;border-bottom:1px solid #EAECF0;display:flex;justify-content:space-between}.table-row{opacity:1;padding:11px 16px;border-bottom-width:1px;display:flex;justify-content:space-between;font-size:13px;border-bottom:1px solid #EAECF0}.zone-floating{position:sticky;width:330px;height:75px;top:0;z-index:9999;cursor:move}.ellipse1{border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.bordered-box{border:1px solid #EAECF0;border-radius:8px}.path-wrapper{opacity:1;padding:8px 16px;gap:16px;border-bottom-width:2px;border-radius:6px}.title{font-weight:600;margin-bottom:12px}.path-card{position:relative;border-radius:12px;background:linear-gradient(135deg,#eef7ff,#e1f3ff);padding:20px}.badge{background:#e0f2ff;color:#0b6ef6;padding:6px 12px;border-radius:20px;font-size:13px}.percent{font-size:20px;font-weight:600;margin-left:12px}.path-text{margin-top:12px;font-size:16px;display:flex;flex-wrap:wrap;gap:8px}.step{font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#344054}.arrowpath{color:#98a2b3}.dots{display:flex;gap:6px;margin-top:12px}.dots span{width:8px;height:8px;background:#d0d5dd;border-radius:50%;cursor:pointer}.dots span.active{background:#344054}.my-card{position:relative}.text-perc{color:#101828;font-weight:400;font-size:20px;line-height:30px}.text-val{font-weight:600;font-size:20px;color:#101828;line-height:30px}.text-title{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.zone-dropdown{position:relative}.dropdown-panel{position:absolute;background:#fff;border-radius:8px;padding:10px;width:100%;box-shadow:0 6px 20px #0000001a;z-index:1000}input[type=checkbox]{width:16px!important;height:16px!important;margin:-2px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.dropdown-panel{width:230px;background:#fff;border-radius:8px;box-shadow:0 6px 20px #0000001f}.dropdown-body{max-height:220px}.zone-item{display:flex;align-items:center;gap:8px;padding:6px 0}input[type=checkbox]{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}::ng-deep .am-tooltip{font-size:12px;background:#fff;border:1px solid #D0D5DD;border-width:1px;opacity:1;border-radius:12px;padding:8px}::ng-deep .am-tooltip-header{margin-bottom:6px;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}::ng-deep .am-tooltip-table{width:100%;border-collapse:collapse}::ng-deep .am-tooltip-table .value{font-weight:600}::ng-deep .am-tooltip-table .text-primary{font-weight:700;font-size:20px;line-height:30px;letter-spacing:0%;vertical-align:middle;color:#00a3ff}::ng-deep .am-tooltip-table .text-value{font-weight:500;font-size:16px;line-height:20px;letter-spacing:0%;margin-left:5px;padding-top:5px;color:#667085}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.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: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }] });
547
+ }
548
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ZoneJourneyComponent, decorators: [{
549
+ type: Component,
550
+ args: [{ selector: 'lib-zone-journey', template: "<!-- zone-journey.component.html -->\r\n<div class=\"card my-card mx-1 my-2\">\r\n <div class=\"card-header px-0 mx-5 border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-1\">Zone-Based Shopper Analysis </span>\r\n <span class=\"text-sub mb-1\">Understand your Shoppers journey from one zone to another\r\n </span>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n<div class=\"zone-dropdown me-3\" #zoneDropdown\r\n (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- BUTTON -->\r\n <button \r\n class=\"btn btn-outline w-100 me-3 d-flex justify-content-between\"\r\n (click)=\"toggleDropdown($event)\"\r\n >\r\n Show / Hide Zone\r\n <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"7\" viewBox=\"0 0 12 7\" fill=\"none\">\r\n<path d=\"M1 1L6 6L11 1\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg></span>\r\n </button>\r\n\r\n <!-- DROPDOWN -->\r\n <div *ngIf=\"showDropdown\" class=\"dropdown-panel h-300px d-flex flex-column\">\r\n \r\n <!-- HEADER (fixed) -->\r\n <div class=\"dropdown-header px-2 pb-2\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Search Zone\"\r\n [(ngModel)]=\"dropdownSearchText\"\r\n (input)=\"filterZones()\"\r\n />\r\n </div>\r\n \r\n <div *ngIf=\"tempFilteredZones?.length\" class=\"d-flex align-items-center gap-2 mb-2 \">\r\n <span class=\"ms-1\"><input\r\n type=\"checkbox\"\r\n [checked]=\"isAllSelected()\"\r\n (change)=\"toggleSelectAll($event)\"\r\n /></span>\r\n <span >Select All</span>\r\n </div>\r\n <!-- BODY (scrollable list) -->\r\n <div *ngIf=\"tempFilteredZones?.length\" class=\"dropdown-body flex-grow-1 overflow-auto \">\r\n <div\r\n class=\"zone-item\"\r\n *ngFor=\"let zone of tempFilteredZones\"\r\n >\r\n <span class=\"ms-1\"><input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"zone.checked\"\r\n /></span>\r\n <span >{{ zone.name }}</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!tempFilteredZones?.length\" >\r\n <div class=\"col-lg-12\">\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata-table\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- FOOTER (fixed) -->\r\n <div *ngIf=\"tempFilteredZones?.length\" class=\"dropdown-footer d-flex justify-content-end gap-2 p-2 border-top\">\r\n <button class=\"btn btn-sm btn-outline w-50\" (click)=\"resetZones()\">\r\n Reset\r\n </button>\r\n <button class=\"btn btn-sm btn-primary w-50\" (click)=\"applyZones()\">\r\n Apply\r\n </button>\r\n </div>\r\n\r\n</div>\r\n\r\n</div>\r\n\r\n\r\n <!-- <button type=\"button\" (click)=\"getZoneJourneyExport()\" [disabled]=\"!zoneShopperAnalysis\"\r\n class=\"btn-outline btn align-items-end text-nowrap invheader me-4\">\r\n \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <span class=\"ms-2\"></span> Export\r\n </button> -->\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-between mt-3 mx-3\">\r\n <div class=\"bordered-box w-50 me-2 py-1\">\r\n <div class=\"group d-flex justify-content-between pt-1 px-3\">\r\n <span class=\"text-title py-2\"><svg class=\"mx-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"19\"\r\n height=\"21\" viewBox=\"0 0 19 21\" fill=\"none\">\r\n <path\r\n d=\"M0.5 16.3258H6V17.5758C6 18.3051 5.71027 19.0046 5.19454 19.5203C4.67882 20.036 3.97935 20.3258 3.25 20.3258C2.52065 20.3258 1.82118 20.036 1.30546 19.5203C0.789731 19.0046 0.5 18.3051 0.5 17.5758V16.3258ZM4.5 4.44576C6.5 4.44576 7.5 7.32576 7.5 9.32576C7.5 10.3258 7 11.3258 6.5 12.8258L6 14.3258H0.5C0.5 13.3258 0 11.8258 0 9.32576C0 6.82576 1.998 4.44576 4.5 4.44576ZM16.554 12.4238L16.337 13.6548C16.2023 14.3654 15.7931 14.9943 15.198 15.4054C14.6029 15.8165 13.8698 15.9765 13.1576 15.8509C12.4453 15.7254 11.8111 15.3242 11.3925 14.7344C10.9739 14.1446 10.8045 13.4136 10.921 12.6998L11.137 11.4698L16.554 12.4238ZM14.678 0.0307624C17.142 0.464762 18.696 3.15576 18.262 5.61776C17.828 8.07976 17.075 9.46976 16.902 10.4548L11.485 9.49976L11.253 7.93576C11.021 6.37176 10.703 5.29976 10.876 4.31576C11.223 2.34576 12.708 -0.316238 14.678 0.0307624Z\"\r\n fill=\"#1D2939\" />\r\n </svg>Overall Footfall :</span>\r\n <span><span class=\"text-val\">{{zoneShopperAnalysis?.OverallFootfall ?? '--'}}</span> </span>\r\n </div>\r\n </div>\r\n <div class=\"bordered-box w-50 py-1\">\r\n <div class=\"group d-flex justify-content-between pt-1 px-3\">\r\n <span *ngIf=\"this.clientData?.isNOB\" class=\"text-title py-2\">\r\n<svg class=\"mx-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\"\r\n height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M9 11H15M9 15H15M9 7H15M5 3C5 2.73478 5.10536 2.48043 5.29289 2.29289C5.48043 2.10536 5.73478 2 6 2H18C18.2652 2 18.5196 2.10536 18.7071 2.29289C18.8946 2.48043 19 2.73478 19 3V22L15.5 19.5L12 22L8.5 19.5L5 22V3Z\"\r\n stroke=\"#1D2939\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> NoB :</span>\r\n <span *ngIf=\"!this.clientData?.isNOB\" class=\"text-title py-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n<path d=\"M16 21V19C16 17.9391 15.5786 16.9217 14.8284 16.1716C14.0783 15.4214 13.0609 15 12 15H5C3.93913 15 2.92172 15.4214 2.17157 16.1716C1.42143 16.9217 1 17.9391 1 19V21M17 11L19 13L23 9M12.5 7C12.5 9.20914 10.7091 11 8.5 11C6.29086 11 4.5 9.20914 4.5 7C4.5 4.79086 6.29086 3 8.5 3C10.7091 3 12.5 4.79086 12.5 7Z\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg> Conversion :</span>\r\n <span class=\"text-val\">{{zoneShopperAnalysis?.Nob ?? '--'}}<span class=\"text-perc ms-1\">({{zoneShopperAnalysis?.ConversionPercent ?? '--'}} %)</span> <span *ngIf=\"this.clientData?.isNOB\" class=\"px-0 cursor-pointer\" (click)=\"nobUpload()\">\r\n <svg placement=\"top\" ngbTooltip=\"Upload NoB\" xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\"\r\n viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_15106_106090)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"#EAF8FF\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#EAF8FF\" />\r\n <path\r\n d=\"M23.3326 22.3332L19.9992 18.9999M19.9992 18.9999L16.6659 22.3332M19.9992 18.9999V26.4999M26.9909 24.3249C27.8037 23.8818 28.4458 23.1806 28.8158 22.3321C29.1858 21.4835 29.2627 20.5359 29.0344 19.6388C28.8061 18.7417 28.2855 17.9462 27.5548 17.3778C26.8241 16.8094 25.925 16.5005 24.9992 16.4999H23.9492C23.697 15.5243 23.2269 14.6185 22.5742 13.8507C21.9215 13.0829 21.1033 12.4731 20.181 12.0671C19.2587 11.661 18.2564 11.4694 17.2493 11.5065C16.2423 11.5436 15.2568 11.8085 14.3669 12.2813C13.477 12.7541 12.7058 13.4225 12.1114 14.2362C11.517 15.05 11.1148 15.9879 10.9351 16.9794C10.7553 17.9709 10.8027 18.9903 11.0736 19.961C11.3445 20.9316 11.8319 21.8281 12.4992 22.5832\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_15106_106090\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_15106_106090\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_15106_106090\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg></span></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row gx-0 p-3\">\r\n <div [ngClass]=\"isMinimized ? 'col-12' : 'col-8'\"\r\n [style.height.px]=\"zoneChartNoData ? 300 : (isMinimized ? 650 : 550)\">\r\n <ng-container *ngIf=\"zoneChartLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"zoneChartNoData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for Zone Based Shopper Analysis Chart</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!zoneChartNoData && !zoneChartLoading\" id=\"chartdiv\" style=\"width: 100%; height: 100%;\"></div>\r\n </div>\r\n\r\n <div [ngClass]=\"isMinimized ? 'zone-floating' : 'col-4'\" [style.top.px]=\"isMinimized ? floatingPos.top : null\"\r\n [style.left.px]=\"isMinimized ? floatingPos.left : null\" (mousedown)=\"startDrag($event)\">\r\n <!-- (mousedown)=\"startDrag($event)\" -->\r\n <ng-container *ngIf=\"zoneCardLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"zoneCardNoData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for Zone Based Shopper Analysis</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-conatiner *ngIf=\"!zoneCardNoData && !zoneCardLoading\" class=\"card \">\r\n <div class=\"card-header border-0 px-4\"\r\n [ngClass]=\"isMinimized ?'bg-secondary min-h-30px': 'bg-light-primary min-h-45px mb-2'\">\r\n <div class=\"card-title align-items-start\"><span *ngIf=\"isMinimized\" class=\"me-2 mb-2\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M9 20C8.45 20 7.97917 19.8042 7.5875 19.4125C7.19583 19.0208 7 18.55 7 18C7 17.45 7.19583 16.9792 7.5875 16.5875C7.97917 16.1958 8.45 16 9 16C9.55 16 10.0208 16.1958 10.4125 16.5875C10.8042 16.9792 11 17.45 11 18C11 18.55 10.8042 19.0208 10.4125 19.4125C10.0208 19.8042 9.55 20 9 20ZM15 20C14.45 20 13.9792 19.8042 13.5875 19.4125C13.1958 19.0208 13 18.55 13 18C13 17.45 13.1958 16.9792 13.5875 16.5875C13.9792 16.1958 14.45 16 15 16C15.55 16 16.0208 16.1958 16.4125 16.5875C16.8042 16.9792 17 17.45 17 18C17 18.55 16.8042 19.0208 16.4125 19.4125C16.0208 19.8042 15.55 20 15 20ZM9 14C8.45 14 7.97917 13.8042 7.5875 13.4125C7.19583 13.0208 7 12.55 7 12C7 11.45 7.19583 10.9792 7.5875 10.5875C7.97917 10.1958 8.45 10 9 10C9.55 10 10.0208 10.1958 10.4125 10.5875C10.8042 10.9792 11 11.45 11 12C11 12.55 10.8042 13.0208 10.4125 13.4125C10.0208 13.8042 9.55 14 9 14ZM15 14C14.45 14 13.9792 13.8042 13.5875 13.4125C13.1958 13.0208 13 12.55 13 12C13 11.45 13.1958 10.9792 13.5875 10.5875C13.9792 10.1958 14.45 10 15 10C15.55 10 16.0208 10.1958 16.4125 10.5875C16.8042 10.9792 17 11.45 17 12C17 12.55 16.8042 13.0208 16.4125 13.4125C16.0208 13.8042 15.55 14 15 14ZM9 8C8.45 8 7.97917 7.80417 7.5875 7.4125C7.19583 7.02083 7 6.55 7 6C7 5.45 7.19583 4.97917 7.5875 4.5875C7.97917 4.19583 8.45 4 9 4C9.55 4 10.0208 4.19583 10.4125 4.5875C10.8042 4.97917 11 5.45 11 6C11 6.55 10.8042 7.02083 10.4125 7.4125C10.0208 7.80417 9.55 8 9 8ZM15 8C14.45 8 13.9792 7.80417 13.5875 7.4125C13.1958 7.02083 13 6.55 13 6C13 5.45 13.1958 4.97917 13.5875 4.5875C13.9792 4.19583 14.45 4 15 4C15.55 4 16.0208 4.19583 16.4125 4.5875C16.8042 4.97917 17 5.45 17 6C17 6.55 16.8042 7.02083 16.4125 7.4125C16.0208 7.80417 15.55 8 15 8Z\"\r\n fill=\"#667085\" />\r\n </svg></span> Zone Journey </div>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span *ngIf=\"!isMinimized\" (click)=\"searchOpen()\" class=\"me-3\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path\r\n d=\"M19 19L14.65 14.65M17 9C17 13.4183 13.4183 17 9 17C4.58172 17 1 13.4183 1 9C1 4.58172 4.58172 1 9 1C13.4183 1 17 4.58172 17 9Z\"\r\n stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"cursor-pointer\" *ngIf=\"!isMinimized\"\r\n (click)=\"expandClose(); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M5 12H19\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span class=\"cursor-pointer\" *ngIf=\"isMinimized\"\r\n (click)=\"expandClose(); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M15 3H21M21 3V9M21 3L14 10M9 21H3M3 21V15M3 21L10 14\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"searchNewOpen && !isMinimized\" class=\"px-2 pb-2\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Search Zone\"\r\n [(ngModel)]=\"searchZoneText\"\r\n (change)=\"SearchZones()\"\r\n />\r\n </div>\r\n <div *ngIf=\"!isMinimized\" class=\"card-body h-500px overflow-auto px-0 py-2\">\r\n <ng-container *ngIf=\"zoneTestNoData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for Zone Analysis</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n <div class=\"zone-card mx-3 \" *ngFor=\"let zone of zones;let i = index\">\r\n\r\n <!-- HEADER -->\r\n <div [ngClass]=\"activeIndex === i ? 'zone-header':'zone-default'\" (click)=\"toggle(i)\">\r\n <div [ngClass]=\"activeIndex === i ? 'zone-title':'zone-notitle'\">{{ zone.fromZone |\r\n titlecase}}\r\n </div>\r\n\r\n <div class=\"zone-metrics\">\r\n <span class=\"badge badge-light-primary px-2\" placement=\"top\" ngbTooltip=\"Footfall\">\r\n <span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\"\r\n viewBox=\"0 0 10 11\" fill=\"none\">\r\n <path\r\n d=\"M0.25 8.16288H3V8.78788C3 9.15255 2.85513 9.50229 2.59727 9.76015C2.33941 10.018 1.98967 10.1629 1.625 10.1629C1.26033 10.1629 0.910591 10.018 0.652728 9.76015C0.394866 9.50229 0.25 9.15255 0.25 8.78788V8.16288ZM2.25 2.22288C3.25 2.22288 3.75 3.66288 3.75 4.66288C3.75 5.16288 3.5 5.66288 3.25 6.41288L3 7.16288H0.25C0.25 6.66288 0 5.91288 0 4.66288C0 3.41288 0.999 2.22288 2.25 2.22288ZM8.277 6.21188L8.1685 6.82738C8.10117 7.18269 7.89656 7.49717 7.59901 7.70271C7.30146 7.90824 6.93492 7.98827 6.57878 7.92547C6.22263 7.86268 5.90557 7.6621 5.69626 7.3672C5.48695 7.07229 5.40225 6.7068 5.4605 6.34988L5.5685 5.73488L8.277 6.21188ZM7.339 0.0153812C8.571 0.232381 9.348 1.57788 9.131 2.80888C8.914 4.03988 8.5375 4.73488 8.451 5.22738L5.7425 4.74988L5.6265 3.96788C5.5105 3.18588 5.3515 2.64988 5.438 2.15788C5.6115 1.17288 6.354 -0.158119 7.339 0.0153812Z\"\r\n fill=\"#009BF3\" />\r\n </svg></span> {{ zone.fromZoneFootfallCount ?? '--' }}\r\n </span>\r\n <span class=\"badge badge-light-default px-2\" placement=\"top\"\r\n[ngbTooltip]=\"clientData?.isNOB ? 'NoB' : 'Conversion'\">\r\n <span *ngIf=\"this.clientData?.isNOB\" class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M4.5 5.5H7.5M4.5 7.5H7.5M4.5 3.5H7.5M2.5 1.5C2.5 1.36739 2.55268 1.24021 2.64645 1.14645C2.74021 1.05268 2.86739 1 3 1H9C9.13261 1 9.25979 1.05268 9.35355 1.14645C9.44732 1.24021 9.5 1.36739 9.5 1.5V11L7.75 9.75L6 11L4.25 9.75L2.5 11V1.5Z\"\r\n stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span> <span *ngIf=\"!this.clientData?.isNOB\" class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n<path d=\"M16 21V19C16 17.9391 15.5786 16.9217 14.8284 16.1716C14.0783 15.4214 13.0609 15 12 15H5C3.93913 15 2.92172 15.4214 2.17157 16.1716C1.42143 16.9217 1 17.9391 1 19V21M17 11L19 13L23 9M12.5 7C12.5 9.20914 10.7091 11 8.5 11C6.29086 11 4.5 9.20914 4.5 7C4.5 4.79086 6.29086 3 8.5 3C10.7091 3 12.5 4.79086 12.5 7Z\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg></span> {{ zone.fromZoneNobCount ?? '--' }}\r\n </span>\r\n\r\n <span class=\"arrow cursor-pointer\"><svg *ngIf=\"activeIndex === i\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"7\" viewBox=\"0 0 12 7\"\r\n fill=\"none\">\r\n <path d=\"M0.832031 5.83301L5.83203 0.833008L10.832 5.83301\" stroke=\"#33B5FF\"\r\n stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"activeIndex !== i\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\"\r\n height=\"7\" viewBox=\"0 0 12 7\" fill=\"none\">\r\n <path d=\"M0.832031 0.833008L5.83203 5.83301L10.832 0.833008\" stroke=\"#667085\"\r\n stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- BODY -->\r\n <div class=\"zone-body max-h-200px min-h-auto overflow-auto\" *ngIf=\"activeIndex === i\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table text-nowrap bottom-border \">\r\n <thead>\r\n\r\n <tr>\r\n <th class=\"w-50\">To Zone</th>\r\n <th>Footfall (Concentration)</th>\r\n <!-- <th ><span class=\"me-2\" *ngIf=\"this.clientData?.isNOB\">NoB</span> <span class=\"me-2\" *ngIf=\"!this.clientData?.isNOB\">Conversion</span> -->\r\n <!-- <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_15320_82488)\">\r\n <path\r\n d=\"M7.9987 10.6663V7.99967M7.9987 5.33301H8.00536M14.6654 7.99967C14.6654 11.6816 11.6806 14.6663 7.9987 14.6663C4.3168 14.6663 1.33203 11.6816 1.33203 7.99967C1.33203 4.31778 4.3168 1.33301 7.9987 1.33301C11.6806 1.33301 14.6654 4.31778 14.6654 7.99967Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_15320_82488\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg> -->\r\n <!-- </th> -->\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of zone.toZoneData\">\r\n <td>{{ row.toZone | titlecase}}</td>\r\n <td>{{ row.footfall ?? '--' }} ({{ row.concPercent }}%)</td>\r\n <!-- <td>{{ row.nob ?? '--' }} ({{ row.nobPercent }}%)</td> -->\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n \r\n </div>\r\n </ng-conatiner>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n</div>", styles: [".zone-card{border:1px solid #e6f0ff;border-radius:10px;margin-bottom:12px;background:#fff}.zone-header{display:flex;justify-content:space-between;align-items:center;padding:12px 30px 12px 12px;cursor:pointer;background:#f6fcff;border-radius:10px}.zone-default{border-width:1px;display:flex;justify-content:space-between;align-items:center;opacity:1;border-radius:8px;padding:12px 30px 12px 12px;border:1px solid #D0D5DD;background:#fff}.zone-title{font-weight:600;font-size:16px;line-height:24px;letter-spacing:0%;vertical-align:middle;color:#33b5ff}.zone-metrics{display:flex;align-items:center;gap:8px}.pill{padding:4px 10px;border-radius:16px;font-size:12px}.arrow{transition:transform .3s ease}.arrow.rotate{transform:rotate(180deg)}.zone-body{padding:10px 12px}.table-head,.table-row{display:grid;grid-template-columns:1fr 1fr 1fr;padding:6px 0}.table-head{font-weight:600;font-size:12px;opacity:1;padding:11px 16px;border-bottom-width:1px;background-color:#fcfcfd;color:#667085;border-bottom:1px solid #EAECF0;display:flex;justify-content:space-between}.table-row{opacity:1;padding:11px 16px;border-bottom-width:1px;display:flex;justify-content:space-between;font-size:13px;border-bottom:1px solid #EAECF0}.zone-floating{position:sticky;width:330px;height:75px;top:0;z-index:9999;cursor:move}.ellipse1{border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.bordered-box{border:1px solid #EAECF0;border-radius:8px}.path-wrapper{opacity:1;padding:8px 16px;gap:16px;border-bottom-width:2px;border-radius:6px}.title{font-weight:600;margin-bottom:12px}.path-card{position:relative;border-radius:12px;background:linear-gradient(135deg,#eef7ff,#e1f3ff);padding:20px}.badge{background:#e0f2ff;color:#0b6ef6;padding:6px 12px;border-radius:20px;font-size:13px}.percent{font-size:20px;font-weight:600;margin-left:12px}.path-text{margin-top:12px;font-size:16px;display:flex;flex-wrap:wrap;gap:8px}.step{font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#344054}.arrowpath{color:#98a2b3}.dots{display:flex;gap:6px;margin-top:12px}.dots span{width:8px;height:8px;background:#d0d5dd;border-radius:50%;cursor:pointer}.dots span.active{background:#344054}.my-card{position:relative}.text-perc{color:#101828;font-weight:400;font-size:20px;line-height:30px}.text-val{font-weight:600;font-size:20px;color:#101828;line-height:30px}.text-title{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.zone-dropdown{position:relative}.dropdown-panel{position:absolute;background:#fff;border-radius:8px;padding:10px;width:100%;box-shadow:0 6px 20px #0000001a;z-index:1000}input[type=checkbox]{width:16px!important;height:16px!important;margin:-2px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.dropdown-panel{width:230px;background:#fff;border-radius:8px;box-shadow:0 6px 20px #0000001f}.dropdown-body{max-height:220px}.zone-item{display:flex;align-items:center;gap:8px;padding:6px 0}input[type=checkbox]{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}::ng-deep .am-tooltip{font-size:12px;background:#fff;border:1px solid #D0D5DD;border-width:1px;opacity:1;border-radius:12px;padding:8px}::ng-deep .am-tooltip-header{margin-bottom:6px;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}::ng-deep .am-tooltip-table{width:100%;border-collapse:collapse}::ng-deep .am-tooltip-table .value{font-weight:600}::ng-deep .am-tooltip-table .text-primary{font-weight:700;font-size:20px;line-height:30px;letter-spacing:0%;vertical-align:middle;color:#00a3ff}::ng-deep .am-tooltip-table .text-value{font-weight:500;font-size:16px;line-height:20px;letter-spacing:0%;margin-left:5px;padding-top:5px;color:#667085}\n"] }]
551
+ }], ctorParameters: () => [{ type: i1.ZoneService }, { type: i2.Zonev2Service }, { type: i0.ChangeDetectorRef }, { type: i3.Router }, { type: i4.ToastService }], propDecorators: { headerData: [{
552
+ type: Input
553
+ }], clientData: [{
554
+ type: Input
555
+ }], zoneDropdown: [{
556
+ type: ViewChild,
557
+ args: ['zoneDropdown']
558
+ }], onDocumentClick: [{
559
+ type: HostListener,
560
+ args: ['document:click', ['$event']]
561
+ }] } });
562
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9uZS1qb3VybmV5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2Utem9uZS9zcmMvbGliL2NvbXBvbmVudHMvem9uZS1qb3VybmV5L3pvbmUtam91cm5leS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXpvbmUvc3JjL2xpYi9jb21wb25lbnRzL3pvbmUtam91cm5leS96b25lLWpvdXJuZXkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBNEIsS0FBSyxFQUFvRCxTQUFTLEVBQWMsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pLLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFRLGtCQUFrQixNQUFNLHFDQUFxQyxDQUFDO0FBSXRFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7QUFPMUMsTUFBTSxPQUFPLG9CQUFvQjtJQUtSO0lBQTRCO0lBQW9DO0lBQTZCO0lBQXNCO0lBSmpJLElBQUksQ0FBWTtJQUNkLFVBQVUsQ0FBTTtJQUNmLFVBQVUsQ0FBTTtJQUNmLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQ3pDLFlBQW9CLE9BQW1CLEVBQVMsYUFBMkIsRUFBUyxFQUFvQixFQUFTLE1BQWEsRUFBUyxFQUFlO1FBQWxJLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBUyxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUFTLE9BQUUsR0FBRixFQUFFLENBQWtCO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBTztRQUFTLE9BQUUsR0FBRixFQUFFLENBQWE7SUFBSSxDQUFDO0lBQ2hLLFdBQVcsQ0FB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U0FBUzt1QkFBQyxjQUFjO2dCQWdCekIsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LENoYW5nZURldGVjdG9yUmVmLCBPbkluaXQgLElucHV0LCBPbkNoYW5nZXMsT25EZXN0cm95LFNpbXBsZUNoYW5nZXMsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgYW01IGZyb20gJ0BhbWNoYXJ0cy9hbWNoYXJ0czUnO1xyXG5pbXBvcnQgKiBhcyBhbTVmbG93IGZyb20gJ0BhbWNoYXJ0cy9hbWNoYXJ0czUvZmxvdyc7XHJcbmltcG9ydCAgYW01dGhlbWVzX0FuaW1hdGVkIGZyb20gJ0BhbWNoYXJ0cy9hbWNoYXJ0czUvdGhlbWVzL0FuaW1hdGVkJztcclxuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy96b25lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IFpvbmV2MlNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy96b25ldjIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItem9uZS1qb3VybmV5JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vem9uZS1qb3VybmV5LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vem9uZS1qb3VybmV5LmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgWm9uZUpvdXJuZXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksT25DaGFuZ2VzIHtcclxuICAgcHJpdmF0ZSByb290ITogYW01LlJvb3Q7XHJcbiAgICBASW5wdXQoKSBoZWFkZXJEYXRhIDphbnk7XHJcbiAgICAgQElucHV0KCkgY2xpZW50RGF0YSA6YW55O1xyXG4gICAgICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOlpvbmVTZXJ2aWNlLHByaXZhdGUgem9uZVYyU2VydmljZTpab25ldjJTZXJ2aWNlLHByaXZhdGUgY2Q6Q2hhbmdlRGV0ZWN0b3JSZWYscHJpdmF0ZSByb3V0ZXI6Um91dGVyLHByaXZhdGUgdHM6VG9hc3RTZXJ2aWNlKSB7IH1cclxubmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gIGlmIChjaGFuZ2VzWydoZWFkZXJEYXRhJ10/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgIHRoaXMuaGVhZGVyRGF0YSA9IGNoYW5nZXNbJ2hlYWRlckRhdGEnXS5jdXJyZW50VmFsdWU7XHJcbiAgfVxyXG4gIGlmIChjaGFuZ2VzWydjbGllbnREYXRhJ10/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmNsaWVudERhdGEgPSBjaGFuZ2VzWydjbGllbnREYXRhJ10uY3VycmVudFZhbHVlO1xyXG4gIH1cclxuICB0aGlzLmdldEF2YWlsYWJsZVpvbmVzKCk7XHJcbiAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbn1cclxuXHJcblxyXG56b25lU2hvcHBlckFuYWx5c2lzOmFueTtcclxuYnViYmxlQ2hhcnREYXRhOmFueTtcclxub2JqZWN0OmFueTtcclxub2JqZWN0MTphbnk7XHJcbnpvbmVTZWFyY2hUZXh0OnN0cmluZz0nJztcclxuXHJcbnNob3dEcm9wZG93biA9IGZhbHNlO1xyXG5zZWFyY2hUZXh0ID0gJyc7XHJcbnpvbmVMaXN0OmFueT1bXTtcclxuZmlsdGVyZWRab25lczphbnk9W107XHJcblxyXG5cclxuem9uZXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG50ZW1wWm9uZUxpc3Q6IGFueVtdID0gW107XHJcbnRlbXBGaWx0ZXJlZFpvbmVzOiBhbnkgPSBbXTtcclxuZHJvcGRvd25TZWFyY2hUZXh0ID0gJyc7XHJcbmF2YWlsYWJsZVpvbmVzOmFueVtdID0gW107XHJcbiAgZ2V0QXZhaWxhYmxlWm9uZXMoKXtcclxuICAgIGNvbnN0IHJlcXVlc3REYXRhID0ge1xyXG4gICAgICBmcm9tRGF0ZTogdGhpcy5oZWFkZXJEYXRhLmRhdGUuc3RhcnREYXRlLCBcclxuICAgICAgdG9EYXRlOiB0aGlzLmhlYWRlckRhdGEuZGF0ZS5lbmREYXRlLFxyXG4gICAgICBzdG9yZUlkOiB0aGlzLmhlYWRlckRhdGEuc3RvcmVzLmZpbHRlcigoc3RvcmU6IGFueSkgPT4gc3RvcmUuY2hlY2tlZCkubWFwKChzdG9yZTogYW55KSA9PiBzdG9yZS5zdG9yZUlkKSxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YS5jbGllbnQsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuem9uZVYyU2VydmljZS5nZXRBdmFpbGFibGVab25lTmFtZXMocmVxdWVzdERhdGEpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVab25lcyA9IChyZXMuZGF0YS5hdmFpbGFibGVab25lRGF0YSB8fCBbXSkuZmlsdGVyKFxyXG4gICh6b25lOiBhbnkpID0+IHpvbmUuem9uZU5hbWU/LnRvTG93ZXJDYXNlKCkgIT09ICdvdmVyYWxsIHN0b3JlJ1xyXG4pO1xyXG4gICB0aGlzLnpvbmVMaXN0ID0gdGhpcy5hdmFpbGFibGVab25lcy5tYXAoeiA9PiAoe1xyXG4gICAgICAgICAgbmFtZTogei56b25lTmFtZSxcclxuICAgICAgICAgIGNoZWNrZWQ6IHRydWVcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy56b25lc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmdldFpvbmVKb3VybmV5KFtdKTtcclxuICAgICAgICB0aGlzLmdldEJ1YmJsZShbXSk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmF2YWlsYWJsZVpvbmVzID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuem9uZUNoYXJ0Tm9EYXRhID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuem9uZUNoYXJ0TG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy56b25lQ2FyZE5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnpvbmVDYXJkTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlWm9uZXMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuem9uZUNoYXJ0Tm9EYXRhID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuem9uZUNoYXJ0TG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy56b25lQ2FyZE5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnpvbmVDYXJkTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbi8vIGdldEF2YWlsYWJsZVpvbmVzKCkge1xyXG4vLyAgIHRoaXMuem9uZVYyU2VydmljZS56b25lcyRcclxuLy8gICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuLy8gICAgIC5zdWJzY3JpYmUoKHpvbmVzKSA9PiB7XHJcbiAgICAgICBcclxuLy8gICAgICAgdGhpcy5hdmFpbGFibGVab25lcyA9IHpvbmVzO1xyXG5cclxuLy8gICAgICAgaWYgKCF0aGlzLnpvbmVzSW5pdGlhbGl6ZWQpIHtcclxuLy8gICAgICAgICB0aGlzLnpvbmVMaXN0ID0gem9uZXMubWFwKHogPT4gKHtcclxuLy8gICAgICAgICAgIG5hbWU6IHouem9uZU5hbWUsXHJcbi8vICAgICAgICAgICBjaGVja2VkOiB0cnVlXHJcbi8vICAgICAgICAgfSkpO1xyXG5cclxuLy8gICAgICAgICB0aGlzLnpvbmVzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4vLyAgICAgICAgIGlmKHRoaXMuem9uZUxpc3QubGVuZ3RoKXtcclxuLy8gICAgICAgICAgICBjb25zb2xlLmxvZygnYXZhaWxhYmxlIHpvbmVzIGluIHpvbmUgam91cm5leScsICAgICAgICB0aGlzLnpvbmVMaXN0KTsgICBcclxuLy8gICAgICAgICAgIHRoaXMuZ2V0Wm9uZUpvdXJuZXkoW10pO1xyXG4vLyAgICAgICAgICAgdGhpcy5nZXRCdWJibGUoW10pO1xyXG4vLyAgICAgICAgIH0gZWxzZSB7XHJcbi8vICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYXZhaWxhYmxlIHpvbmVzIGluIHpvbmUgam91cm5leScsICAgICAgICB0aGlzLnpvbmVMaXN0KTtcclxuLy8gICAgICAgICAgIHRoaXMuem9uZUNoYXJ0Tm9EYXRhID0gdHJ1ZTtcclxuLy8gICAgICAgICAgIHRoaXMuem9uZUNoYXJ0TG9hZGluZyA9IGZhbHNlO1xyXG4vLyAgICAgICAgICAgdGhpcy56b25lQ2FyZE5vRGF0YSA9IHRydWU7XHJcbi8vICAgICAgICAgICB0aGlzLnpvbmVDYXJkTG9hZGluZyA9IGZhbHNlO1xyXG4vLyAgICAgICAgICAgdGhpcy5nZXRab25lSm91cm5leShbXSk7XHJcbi8vICAgICAgICAgICB0aGlzLmdldEJ1YmJsZShbXSk7XHJcbi8vICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4vLyAgICAgICB9XHJcbi8vICAgICB9KTtcclxuLy8gfVxyXG5cclxuQFZpZXdDaGlsZCgnem9uZURyb3Bkb3duJykgem9uZURyb3Bkb3duITogRWxlbWVudFJlZjtcclxuXHJcblxyXG4vKiBPUEVOIC8gVE9HR0xFICovXHJcbnRvZ2dsZURyb3Bkb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IFxyXG4gIHRoaXMuc2hvd0Ryb3Bkb3duID0gIXRoaXMuc2hvd0Ryb3Bkb3duO1xyXG5cclxuICBpZiAodGhpcy5zaG93RHJvcGRvd24pIHtcclxuICAgIHRoaXMudGVtcFpvbmVMaXN0ID0gdGhpcy56b25lTGlzdC5tYXAoKHo6YW55KSA9PiAoeyAuLi56IH0pKTtcclxuICAgIHRoaXMudGVtcEZpbHRlcmVkWm9uZXMgPSBbLi4udGhpcy50ZW1wWm9uZUxpc3RdO1xyXG4gIH1cclxufVxyXG5cclxuLyog8J+UpSBPVVRTSURFIENMSUNLIEhBTkRMRVIgKi9cclxuQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG5vbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICBpZiAoIXRoaXMuc2hvd0Ryb3Bkb3duKSByZXR1cm47XHJcblxyXG4gIGNvbnN0IGNsaWNrZWRJbnNpZGUgPVxyXG4gICAgdGhpcy56b25lRHJvcGRvd24/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KTtcclxuXHJcbiAgaWYgKCFjbGlja2VkSW5zaWRlKSB7XHJcbiAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG50b2dnbGVTZWxlY3RBbGwoZXZlbnQ6IGFueSkge1xyXG4gIGNvbnN0IGNoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcclxuXHJcbiAgLy8gQXBwbHkgdG8gZnVsbCB0ZW1wIGxpc3RcclxuICB0aGlzLnRlbXBab25lTGlzdCA9IHRoaXMudGVtcFpvbmVMaXN0Lm1hcCh6ID0+ICh7XHJcbiAgICAuLi56LFxyXG4gICAgY2hlY2tlZFxyXG4gIH0pKTtcclxuXHJcbiAgLy8gUmUtYXBwbHkgc2VhcmNoIGZpbHRlciBzbyBVSSB1cGRhdGVzIGNvcnJlY3RseVxyXG4gIHRoaXMuZmlsdGVyWm9uZXMoKTtcclxufVxyXG5pc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiAoXHJcbiAgICB0aGlzLnRlbXBab25lTGlzdC5sZW5ndGggPiAwICYmXHJcbiAgICB0aGlzLnRlbXBab25lTGlzdC5ldmVyeSh6ID0+IHouY2hlY2tlZClcclxuICApO1xyXG59XHJcblxyXG5maWx0ZXJab25lcygpIHtcclxuICBjb25zdCB0ZXh0ID0gdGhpcy5kcm9wZG93blNlYXJjaFRleHQudG9Mb3dlckNhc2UoKTtcclxuICB0aGlzLnRlbXBGaWx0ZXJlZFpvbmVzID0gdGhpcy50ZW1wWm9uZUxpc3QuZmlsdGVyKHogPT5cclxuICAgIHoubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpXHJcbiAgKTtcclxufVxyXG5oaWRkZW5ab25lczogYW55W10gPSBbXTtcclxuYXBwbHlab25lcygpIHtcclxuICB0aGlzLnpvbmVMaXN0ID0gdGhpcy50ZW1wWm9uZUxpc3QubWFwKHogPT4gKHsgLi4ueiB9KSk7XHJcblxyXG4gIHRoaXMuaGlkZGVuWm9uZXMgPSB0aGlzLnpvbmVMaXN0XHJcbiAgICAuZmlsdGVyKCh6OiBhbnkpID0+ICF6LmNoZWNrZWQpXHJcbiAgICAubWFwKCh6OiBhbnkpID0+IHoubmFtZSk7XHJcblxyXG4gIHRoaXMuZ2V0Wm9uZUpvdXJuZXkodGhpcy5oaWRkZW5ab25lcyk7XHJcbiAgdGhpcy5nZXRCdWJibGUodGhpcy5oaWRkZW5ab25lcyk7XHJcbiAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgdGhpcy5kcm9wZG93blNlYXJjaFRleHQgPSAnJztcclxuICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xyXG59XHJcblxyXG5yZXNldFpvbmVzKCkge1xyXG4gIC8vIFJlc2V0IGFwcGxpZWQgc3RhdGVcclxuICB0aGlzLnpvbmVMaXN0ID0gdGhpcy56b25lTGlzdC5tYXAoKHo6YW55KSA9PiAoe1xyXG4gICAgLi4ueixcclxuICAgIGNoZWNrZWQ6IHRydWVcclxuICB9KSk7XHJcblxyXG4gIC8vIFN5bmMgdGVtcCBzdGF0ZVxyXG4gIHRoaXMudGVtcFpvbmVMaXN0ID0gdGhpcy56b25lTGlzdC5tYXAoKHo6YW55KSA9PiAoeyAuLi56IH0pKTtcclxuICB0aGlzLnRlbXBGaWx0ZXJlZFpvbmVzID0gWy4uLnRoaXMudGVtcFpvbmVMaXN0XTtcclxuXHJcbiAgdGhpcy5kcm9wZG93blNlYXJjaFRleHQgPSAnJztcclxuXHJcbiAgLy8gQXBwbHkgaW1tZWRpYXRlbHlcclxuICB0aGlzLmdldFpvbmVKb3VybmV5KFtdKTtcclxuICB0aGlzLmdldEJ1YmJsZShbXSk7XHJcblxyXG4gIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcbn1cclxuZ2V0Wm9uZUpvdXJuZXlFeHBvcnQoKSB7XHJcbiAgdGhpcy5vYmplY3QxID0ge1xyXG4gICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LFxyXG4gICAgc3RvcmVJZDogdGhpcy5oZWFkZXJEYXRhPy5zdG9yZXNcclxuICAgICAgLmZpbHRlcigoc3RvcmU6IGFueSkgPT4gc3RvcmUuY2hlY2tlZClcclxuICAgICAgLm1hcCgoc3RvcmU6IGFueSkgPT4gc3RvcmUuc3RvcmVJZCksXHJcbiAgICBmcm9tRGF0ZTogdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUsXHJcbiAgICB0b0RhdGU6IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgIG5vYjogdGhpcy5jbGllbnREYXRhPy5pc05PQixcclxuICAgIGhpZGVab25lczogdGhpcy56b25lTGlzdC5maWx0ZXIoKHo6IGFueSkgPT4gIXouY2hlY2tlZCkubWFwKCh6OiBhbnkpID0+IHoubmFtZSksXHJcbiAgICBzZWFyY2g6IHRoaXMuc2VhcmNoWm9uZVRleHQgfHwgJycsXHJcbiAgICBleHBvcnQgOiB0cnVlXHJcbiAgfTtcclxuXHJcbiAgdGhpcy5zZXJ2aWNlLmdldE5ld1pvbmVTaG9wcGVyQW5hbHlzaXNFeHBvcnRBcGkodGhpcy5vYmplY3QxKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgIGlmKHRoaXMuaGVhZGVyRGF0YS5kYXRlLnN0YXJ0RGF0ZSA9PSB0aGlzLmhlYWRlckRhdGEuZGF0ZS5lbmREYXRlKXtcclxuICAgICAgbGV0IGZpbGVOYW1lID0gJ1Nob3BwZXIgSm91cm5leV9FeHBvcnRfJyt0aGlzLmhlYWRlckRhdGEuZGF0ZS5zdGFydERhdGU7XHJcbiAgICAgIHRoaXMuc2VydmljZS5zYXZlQXNFeGNlbEZpbGUxKHJlcywgZmlsZU5hbWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZmlsZU5hbWUgPSAnU2hvcHBlciBKb3VybmV5X0V4cG9ydF8nK3RoaXMuaGVhZGVyRGF0YS5kYXRlLnN0YXJ0RGF0ZSsnXycrdGhpcy5oZWFkZXJEYXRhLmRhdGUuZW5kRGF0ZTtcclxuICAgICAgdGhpcy5zZXJ2aWNlLnNhdmVBc0V4Y2VsRmlsZTEocmVzLCBmaWxlTmFtZSk7XHJcbiAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKGU6YW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgZXJyb3JNc2cgPSAnU29tZXRoaW5nIHdlbnQgV3JvbmcuLic7XHJcbiAgICAgICAgICBpZiAoZSAmJiBlLmVycm9yICYmIGUuZXJyb3IuZXJyb3IpIHtcclxuICAgICAgICAgICAgZXJyb3JNc2cgPSBlLmVycm9yLmVycm9yO1xyXG4gICAgICAgICAgfSBcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnJvck1zZylcclxuICAgICAgICB9KVxyXG4gIH0pO1xyXG59XHJcbnpvbmVDYXJkTm9EYXRhID0gZmFsc2U7XHJcbiAgICAgICAgem9uZUNhcmRMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB6b25lVGVzdE5vRGF0YSA9IGZhbHNlO1xyXG5nZXRab25lSm91cm5leShoaWRkZW5ab25lczogYW55W10gPSBbXSkge1xyXG4gIHRoaXMuem9uZUNhcmRMb2FkaW5nID0gdHJ1ZTtcclxuICB0aGlzLnpvbmVDYXJkTm9EYXRhID0gZmFsc2U7XHJcbiAgdGhpcy5vYmplY3QxID0ge1xyXG4gICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LFxyXG4gICAgc3RvcmVJZDogdGhpcy5oZWFkZXJEYXRhPy5zdG9yZXNcclxuICAgICAgLmZpbHRlcigoc3RvcmU6IGFueSkgPT4gc3RvcmUuY2hlY2tlZClcclxuICAgICAgLm1hcCgoc3RvcmU6IGFueSkgPT4gc3RvcmUuc3RvcmVJZCksXHJcbiAgICBmcm9tRGF0ZTogdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUsXHJcbiAgICB0b0RhdGU6IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgIG5vYjogdGhpcy5jbGllbnREYXRhPy5pc05PQixcclxuICAgIGhpZGVab25lczogaGlkZGVuWm9uZXMsIC8vIOKchSBhbHdheXMgY29ycmVjdFxyXG4gICAgc2VhcmNoOiB0aGlzLnNlYXJjaFpvbmVUZXh0IHx8ICcnLFxyXG4gICAgZXhwb3J0IDogZmFsc2VcclxuICB9O1xyXG5cclxudGhpcy5zZXJ2aWNlLmdldE5ld1pvbmVTaG9wcGVyQW5hbHlzaXNBcGkodGhpcy5vYmplY3QxKS5zdWJzY3JpYmUoe1xyXG4gIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgdGhpcy56b25lQ2FyZExvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBsaXN0ID0gcmVzPy5kYXRhPy56b25lU2hvcHBlckFuYWx5c2lzID8/IFtdO1xyXG5cclxuICAgIC8vIEFQSSBzdWNjZXNzXHJcbiAgICBpZiAocmVzPy5jb2RlID09PSAyMDApIHtcclxuXHJcbiAgICAgIGlmIChsaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnpvbmVTaG9wcGVyQW5hbHlzaXMgPSByZXMuZGF0YTtcclxuICAgICAgICB0aGlzLnpvbmVzID0gbGlzdDtcclxuICAgICAgICB0aGlzLnpvbmVDYXJkTm9EYXRhID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy56b25lVGVzdE5vRGF0YSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuc2VhcmNoWm9uZVRleHQpIHtcclxuICAgICAgICB0aGlzLnpvbmVTaG9wcGVyQW5hbHlzaXMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuem9uZXMgPSBbXTtcclxuICAgICAgICB0aGlzLnpvbmVDYXJkTm9EYXRhID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy56b25lVGVzdE5vRGF0YSA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENhc2UgMzogTm8gZGF0YSBhdCBhbGxcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZXNldFpvbmVEYXRhKHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXNldFpvbmVEYXRhKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH0sXHJcblxyXG4gIGVycm9yOiAoKSA9PiB7XHJcbiAgICB0aGlzLnpvbmVDYXJkTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5yZXNldFpvbmVEYXRhKHRydWUpO1xyXG4gIH1cclxufSk7XHJcblxyXG59XHJcbnJlc2V0Wm9uZURhdGEobm9EYXRhOiBib29sZWFuKTogdm9pZCB7XHJcbiAgdGhpcy56b25lU2hvcHBlckFuYWx5c2lzID0gbnVsbDtcclxuICB0aGlzLnpvbmVzID0gW107XHJcbiAgdGhpcy56b25lQ2FyZE5vRGF0YSA9IG5vRGF0YTtcclxuICB0aGlzLnpvbmVUZXN0Tm9EYXRhID0gZmFsc2U7XHJcbn1cclxuXHJcbnpvbmVDaGFydE5vRGF0YSA9IGZhbHNlO1xyXG4gICAgICAgIHpvbmVDaGFydExvYWRpbmcgPSB0cnVlO1xyXG5nZXRCdWJibGUoaGlkZGVuWm9uZXM6IGFueVtdID0gW10pIHtcclxuICAgdGhpcy56b25lQ2hhcnRMb2FkaW5nID0gdHJ1ZTtcclxuICAgdGhpcy56b25lQ2hhcnROb0RhdGEgPSBmYWxzZTtcclxuICB0aGlzLm9iamVjdCA9IHtcclxuICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCxcclxuICAgIHN0b3JlSWQ6IHRoaXMuaGVhZGVyRGF0YT8uc3RvcmVzLmZpbHRlcigoc3RvcmU6IGFueSkgPT4gc3RvcmUuY2hlY2tlZCkubWFwKChzdG9yZTogYW55KSA9PiBzdG9yZS5zdG9yZUlkKSxcclxuICAgICBmcm9tRGF0ZTogdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUsXHJcbiAgICAgIHRvRGF0ZTogdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlLFxyXG4gICAgbm9iOiB0aGlzLmNsaWVudERhdGE/LmlzTk9CLFxyXG4gICAgaGlkZVpvbmVzOiBoaWRkZW5ab25lcyxcclxuXHJcbiAgfTtcclxudGhpcy5zZXJ2aWNlLmdldE5ld1pvbmVTaG9wcGVyQnViYmxlQ2hhcnRBcGkodGhpcy5vYmplY3QpLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiAocmVzOmFueSk9PntcclxuICAgICAgaWYocmVzICYmIHJlcy5jb2RlID09PSAyMDApe1xyXG4gICAgICAgIGlmKHJlcz8uZGF0YT8uem9uZUJ1YmJsZUNoYXJ0TWV0cmljcz8ubGVuZ3RoKXtcclxuICAgICAgICAgIHRoaXMuYnViYmxlQ2hhcnREYXRhID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XHJcbiAgICAgICAgICB0aGlzLnpvbmVDaGFydE5vRGF0YSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy56b25lQ2hhcnRMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNle1xyXG4gICAgICAgICAgdGhpcy5idWJibGVDaGFydERhdGEgPSBudWxsO1xyXG4gICAgICAgICB0aGlzLnpvbmVDaGFydE5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy56b25lQ2hhcnRMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYnViYmxlQ2hhcnREYXRhID0gbnVsbDtcclxuICAgICAgICAgdGhpcy56b25lQ2hhcnROb0RhdGEgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuem9uZUNoYXJ0TG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6IChlcnI6YW55KT0+e1xyXG4gICAgICB0aGlzLmJ1YmJsZUNoYXJ0RGF0YSA9IG51bGw7XHJcbiAgICAgIHRoaXMuem9uZUNoYXJ0Tm9EYXRhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnpvbmVDaGFydExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ3pvbmUgam91cm5leSBidWJibGUgY2hhcnQgZXJyb3InLGVycik7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgXHJcbn1cclxucHJpdmF0ZSBwcmVwYXJlQXJjRGF0YShyYXdEYXRhOiBhbnlbXSkge1xyXG4gIGlmICghcmF3RGF0YSB8fCAhcmF3RGF0YS5sZW5ndGgpIHtcclxuICAgIHJldHVybiB7IG5vZGVzOiBbXSwgbGlua3M6IFtdIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBub2RlU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gIHJhd0RhdGEuZm9yRWFjaChpdGVtID0+IHtcclxuICAgIGlmIChpdGVtLmZyb20pIG5vZGVTZXQuYWRkKGl0ZW0uZnJvbSk7XHJcbiAgICBpZiAoaXRlbS50bykgbm9kZVNldC5hZGQoaXRlbS50byk7XHJcbiAgfSk7XHJcblxyXG4gIC8vIHJlbW92ZSBFbnRyeSAmIEV4aXRcclxuICBjb25zdCBtaWRkbGUgPSBBcnJheS5mcm9tKG5vZGVTZXQpLmZpbHRlcihcclxuICAgIG4gPT4gbiAhPT0gJ0VudHJ5JyAmJiBuICE9PSAnRXhpdCdcclxuICApO1xyXG5cclxuICAvLyBmaW5hbCBvcmRlclxyXG4gIGNvbnN0IG5vZGVzID0gWydFbnRyeScsIC4uLm1pZGRsZSwgJ0V4aXQnXS5tYXAoaWQgPT4gKHsgaWQgfSkpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgbm9kZXMsXHJcbiAgICBsaW5rczogcmF3RGF0YVxyXG4gIH07XHJcbn1cclxuXHJcblxyXG5jcmVhdGVDaGFydCgpIHtcclxuICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIC8vIERpc3Bvc2Ugb2xkIGNoYXJ0XHJcbiAgICBpZiAodGhpcy5yb290KSB7XHJcbiAgICAgIHRoaXMucm9vdC5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUm9vdFxyXG4gICAgdGhpcy5yb290ID0gYW01LlJvb3QubmV3KCdjaGFydGRpdicpO1xyXG4gICAgdGhpcy5yb290LnNldFRoZW1lcyhbYW01dGhlbWVzX0FuaW1hdGVkLm5ldyh0aGlzLnJvb3QpXSk7XHJcblxyXG4gICAgLy8gQXJjIERpYWdyYW0gU2VyaWVzXHJcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLnJvb3QuY29udGFpbmVyLmNoaWxkcmVuLnB1c2goXHJcbiAgICAgIGFtNWZsb3cuQXJjRGlhZ3JhbS5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgc291cmNlSWRGaWVsZDogJ2Zyb20nLFxyXG4gICAgICAgIHRhcmdldElkRmllbGQ6ICd0bycsXHJcbiAgICAgICAgdmFsdWVGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICBvcmllbnRhdGlvbjogJ2hvcml6b250YWwnXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBUT09MVElQIChIVE1MKVxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIGNvbnN0IHRvb2x0aXAgPSBhbTUuVG9vbHRpcC5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgIGdldEZpbGxGcm9tU3ByaXRlOiB0cnVlLFxyXG4gICAgICBnZXRTdHJva2VGcm9tU3ByaXRlOiB0cnVlLFxyXG4gICAgICBhdXRvVGV4dENvbG9yOiB0cnVlLFxyXG4gICAgICBrZWVwVGFyZ2V0SG92ZXI6IHRydWUsXHJcbiAgICAgIHBvaW50ZXJPcmllbnRhdGlvbjogJ2hvcml6b250YWwnXHJcbiAgICB9KTtcclxuXHJcblxyXG5cclxuICAgIC8vIEF0dGFjaCB0b29sdGlwIHRvIGxpbmtzXHJcbiAgICAvLyBzZXJpZXMubGlua3MudGVtcGxhdGUuc2V0KCd0b29sdGlwJywgdG9vbHRpcCk7XHJcbiAgICBzZXJpZXMubGlua3MudGVtcGxhdGUuc2V0KCd0b29sdGlwSFRNTCcsICcnKTtcclxuc2VyaWVzLmxpbmtzLnRlbXBsYXRlLnNldEFsbCh7XHJcbiAgc3Ryb2tlV2lkdGg6IDIuNSwgLy8gdmlzaWJsZSBsaW5lXHJcbiAgaW50ZXJhY3RpdmU6IGZhbHNlLFxyXG4gIGN1cnNvck92ZXJTdHlsZTogJ3BvaW50ZXInLFxyXG4gIC8vIHRvb2x0aXA6IHRvb2x0aXAsXHJcblxyXG59KTtcclxuXHJcbi8vIEFkZCBhIGxhcmdlciBpbnZpc2libGUgaGl0IGFyZWFcclxuc2VyaWVzLmxpbmtzLnRlbXBsYXRlLnN0YXRlcy5jcmVhdGUoXCJob3ZlclwiLCB7XHJcbiAgc3Ryb2tlV2lkdGg6IDNcclxufSk7XHJcbmNvbnN0IGZsb3dEYXRhID0gdGhpcy5idWJibGVDaGFydERhdGEuem9uZUJ1YmJsZUNoYXJ0TWV0cmljcztcclxuXHJcbi8vIEJ1aWxkIGJpZGlyZWN0aW9uYWwgbWFwXHJcbmNvbnN0IGJpZGlyZWN0aW9uYWxNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG5cclxuZmxvd0RhdGEuZm9yRWFjaCgoZDE6YW55KSA9PiB7XHJcbiAgZmxvd0RhdGEuZm9yRWFjaCgoZDI6YW55KSA9PiB7XHJcbiAgICBpZiAoZDEuZnJvbSA9PT0gZDIudG8gJiYgZDEudG8gPT09IGQyLmZyb20pIHtcclxuICAgICAgY29uc3Qga2V5ID0gW2QxLmZyb20sIGQxLnRvXS5zb3J0KCkuam9pbihcInx8XCIpO1xyXG4gICAgICBjb25zdCB0b3RhbCA9IChkMS52YWx1ZSB8fCAwKSArIChkMi52YWx1ZSB8fCAwKTtcclxuICAgICAgYmlkaXJlY3Rpb25hbE1hcC5zZXQoa2V5LCB0b3RhbCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn0pO1xyXG4gICAgLy8gQWRhcHRlciBmb3IgSFRNTCBjb250ZW50XHJcbnNlcmllcy5saW5rcy50ZW1wbGF0ZS5hZGFwdGVycy5hZGQoXCJ0b29sdGlwSFRNTFwiLCAoX2h0bWwsIHRhcmdldCkgPT4ge1xyXG4gIGNvbnN0IGRjOiBhbnkgPSB0YXJnZXQuZGF0YUl0ZW0/LmRhdGFDb250ZXh0O1xyXG4gIGlmICghZGMpIHJldHVybiBcIlwiO1xyXG5cclxuICBjb25zdCBrZXkgPSBbZGMuZnJvbSwgZGMudG9dLnNvcnQoKS5qb2luKFwifHxcIik7XHJcblxyXG4gIC8vIOKchSBCaWRpcmVjdGlvbmFsIGNhc2VcclxuICBpZiAoYmlkaXJlY3Rpb25hbE1hcC5oYXMoa2V5KSkge1xyXG4gICAgLy8gU2hvdyB0b29sdGlwIE9OTFkgZm9yIG9uZSBkaXJlY3Rpb25cclxuICAgIGlmIChkYy5mcm9tID4gZGMudG8pIHJldHVybiBcIlwiO1xyXG5cclxuICAgIHJldHVybiBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhbS10b29sdGlwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFtLXRvb2x0aXAtaGVhZGVyXCI+XHJcbiAgICAgICAgICAke2RjLmZyb219IOKHhCAke2RjLnRvfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbS10b29sdGlwLXRhYmxlXCI+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtcHJpbWFyeVwiPiR7YmlkaXJlY3Rpb25hbE1hcC5nZXQoa2V5KX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC12YWx1ZVwiPlRvdGFsIEZvb3RmYWxsPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgYDtcclxuICB9XHJcblxyXG4gIC8vIOKchSBOb3JtYWwgKG9uZS1kaXJlY3Rpb24pIHRvb2x0aXBcclxuICByZXR1cm4gYFxyXG4gICAgPGRpdiBjbGFzcz1cImFtLXRvb2x0aXBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImFtLXRvb2x0aXAtaGVhZGVyXCI+XHJcbiAgICAgICAgJHtkYy5mcm9tfSDihpIgJHtkYy50b31cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhbS10b29sdGlwLXRhYmxlXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1wcmltYXJ5XCI+JHtkYy52YWx1ZSA/PyBcIi0tXCJ9PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXZhbHVlXCI+Rm9vdGZhbGw8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYDtcclxuICAgcmV0dXJuIGBcclxuICAgIDxkaXYgY2xhc3M9XCJhbS10b29sdGlwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhbS10b29sdGlwLWhlYWRlclwiPlxyXG4gICAgICAgICR7ZGMudG99IOKGkiAke2RjLmZyb219XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYW0tdG9vbHRpcC10YWJsZVwiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtcHJpbWFyeVwiPiR7ZGMudmFsdWUgPz8gXCItLVwifTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC12YWx1ZVwiPkZvb3RmYWxsPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIGA7XHJcbn0pO1xyXG4vLyAgPGRpdj48c3BhbiBjbGFzcz1cInRleHQtcHJpbWFyeVwiPiR7ZGMubm9iID8/ICctLSd9PC9zcGFuPjxzcGFuIGNsYXNzPVwidGV4dC12YWx1ZVwiPiAkeyB0aGlzLmNsaWVudERhdGE/LmlzTk9CID8gJyBOb0InIDogJyBDb252ZXJzaW9uJyB9IDwvc3Bhbj4gPC9kaXY+XHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gTk9ERSBMQUJFTFNcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBzZXJpZXMubm9kZXMubGFiZWxzLnRlbXBsYXRlLnNldEFsbCh7XHJcbiAgICAgIHRleHQ6ICd7aWR9JyxcclxuICAgICAgY2VudGVyWDogYW01LnBlcmNlbnQoNTApLFxyXG4gICAgICBjZW50ZXJZOiBhbTUucGVyY2VudCg1MCksXHJcbiAgICAgIHRleHRBbGlnbjogJ3JpZ2h0JyxcclxuICAgICAgZm9udFNpemU6IDExLFxyXG4gICAgICBmaWxsOiBhbTUuY29sb3IoMHgwMDAwMDApLFxyXG4gICAgICBtYXhXaWR0aDogOTBcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBGTE9XIEJVTExFVFNcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBzZXJpZXMuYnVsbGV0cy5wdXNoKChfcm9vdCwgX3NlcmllcywgZGF0YUl0ZW0pID0+IHtcclxuICAgICAgY29uc3QgYnVsbGV0ID0gYW01LkJ1bGxldC5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgbG9jYXRpb25ZOiBNYXRoLnJhbmRvbSgpLFxyXG4gICAgICAgIHNwcml0ZTogYW01LkNpcmNsZS5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgICByYWRpdXM6IDIsXHJcbiAgICAgICAgICBmaWxsOiBkYXRhSXRlbS5nZXQoJ3NvdXJjZScpLmdldCgnZmlsbCcpXHJcbiAgICAgICAgfSlcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBidWxsZXQuYW5pbWF0ZSh7XHJcbiAgICAgICAga2V5OiAnbG9jYXRpb25ZJyxcclxuICAgICAgICBmcm9tOiAwLFxyXG4gICAgICAgIHRvOiAxLFxyXG4gICAgICAgIGR1cmF0aW9uOiBNYXRoLnJhbmRvbSgpICogMTAwMCArIDIwMDAsXHJcbiAgICAgICAgLy8gbG9vcHM6IEluZmluaXR5XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIGJ1bGxldDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBEQVRBICsgT1JERVJJTkdcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgY29uc3QgcHJlcGFyZWQgPSB0aGlzLnByZXBhcmVBcmNEYXRhKFxyXG4gICAgICB0aGlzLmJ1YmJsZUNoYXJ0RGF0YT8uem9uZUJ1YmJsZUNoYXJ0TWV0cmljc1xyXG4gICAgKTtcclxuXHJcbiAgICAvLyAx77iP4oOjIHNldCBub2RlcyBGSVJTVFxyXG4gICAgc2VyaWVzLm5vZGVzLmRhdGEuc2V0QWxsKHByZXBhcmVkLm5vZGVzKTtcclxuXHJcbiAgICAvLyAy77iP4oOjIHNldCBsaW5rcyBBRlRFUlxyXG4gICAgc2VyaWVzLmRhdGEuc2V0QWxsKHByZXBhcmVkLmxpbmtzKTtcclxuXHJcbiAgICBzZXJpZXMuYXBwZWFyKDEwMDAsIDEwMCk7XHJcbiAgfSwgNTAwKTtcclxufVxyXG5cclxuXHJcblxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJvb3QpIHtcclxuICAgICAgdGhpcy5yb290LmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIC8vICB0aGlzLnN0b3BBdXRvU2xpZGUoKTtcclxuICB9XHJcbiBcclxuICAgem9uZXM6YW55ID0gW107XHJcblxyXG5hY3RpdmVJbmRleDogbnVtYmVyIHwgbnVsbCA9IDA7XHJcblxyXG50b2dnbGUoaW5kZXg6IG51bWJlcikge1xyXG4gIHRoaXMuYWN0aXZlSW5kZXggPSB0aGlzLmFjdGl2ZUluZGV4ID09PSBpbmRleCA/IG51bGwgOiBpbmRleDtcclxufVxyXG5zZWFyY2hOZXdPcGVuID1mYWxzZTtcclxuc2VhcmNoT3Blbigpe1xyXG4gIHRoaXMuc2VhcmNoTmV3T3BlbiA9ICF0aGlzLnNlYXJjaE5ld09wZW47XHJcbmlmKCF0aGlzLnNlYXJjaE5ld09wZW4pe1xyXG4gIHRoaXMuc2VhcmNoWm9uZVRleHQgPScnO1xyXG4gIHRoaXMuZ2V0Wm9uZUpvdXJuZXkodGhpcy5oaWRkZW5ab25lcyk7XHJcbn1cclxufVxyXG5cclxuc2VhcmNoWm9uZVRleHQ6c3RyaW5nID0nJztcclxuU2VhcmNoWm9uZXMoKXtcclxuICAgdGhpcy5nZXRab25lSm91cm5leSh0aGlzLmhpZGRlblpvbmVzKTtcclxufVxyXG5pc01pbmltaXplZCA9IGZhbHNlO1xyXG5cclxuLy8gZHJhZyBzdXBwb3J0XHJcbmRyYWdnaW5nID0gZmFsc2U7XHJcbm9mZnNldFggPSAwO1xyXG5vZmZzZXRZID0gMDtcclxuXHJcbmZsb2F0aW5nUG9zID0ge1xyXG4gIHRvcDogMTIwLFxyXG4gIGxlZnQ6IHdpbmRvdy5pbm5lcldpZHRoIC0gMzgwXHJcbn07XHJcblxyXG5leHBhbmRDbG9zZSgpIHtcclxuICB0aGlzLmlzTWluaW1pemVkID0gIXRoaXMuaXNNaW5pbWl6ZWQ7XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5zdGFydERyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICBpZiAoIXRoaXMuaXNNaW5pbWl6ZWQpIHJldHVybjtcclxuXHJcbiAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XHJcbiAgdGhpcy5vZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuZmxvYXRpbmdQb3MubGVmdDtcclxuICB0aGlzLm9mZnNldFkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5mbG9hdGluZ1Bvcy50b3A7XHJcblxyXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25EcmFnKTtcclxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5zdG9wRHJhZyk7XHJcbn1cclxuXHJcbm9uRHJhZyA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gIGlmICghdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xyXG5cclxuICB0aGlzLmZsb2F0aW5nUG9zLmxlZnQgPSBldmVudC5jbGllbnRYIC0gdGhpcy5vZmZzZXRYO1xyXG4gIHRoaXMuZmxvYXRpbmdQb3MudG9wID0gZXZlbnQuY2xpZW50WSAtIHRoaXMub2Zmc2V0WTtcclxufTtcclxuXHJcbnN0b3BEcmFnID0gKCkgPT4ge1xyXG4gIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcclxuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uRHJhZyk7XHJcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuc3RvcERyYWcpO1xyXG59O1xyXG5cclxuICBub2JVcGxvYWQoKXtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIi9tYW5hZ2UvdHJhZmZpYy9ub2JcIl0pOyBcclxuICB9XHJcbn1cclxuIiwiPCEtLSB6b25lLWpvdXJuZXkuY29tcG9uZW50Lmh0bWwgLS0+XHJcbjxkaXYgY2xhc3M9XCJjYXJkIG15LWNhcmQgbXgtMSBteS0yXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcHgtMCBteC01IGJvcmRlci0wIHB0LTNcIj5cclxuICAgICAgICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlIGFsaWduLWl0ZW1zLXN0YXJ0IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1sYWJlbCBtYi0xXCI+Wm9uZS1CYXNlZCBTaG9wcGVyIEFuYWx5c2lzIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXN1YiBtYi0xXCI+VW5kZXJzdGFuZCB5b3VyIFNob3BwZXJzIGpvdXJuZXkgZnJvbSBvbmUgem9uZSB0byBhbm90aGVyXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2gzPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cclxuPGRpdiBjbGFzcz1cInpvbmUtZHJvcGRvd24gbWUtM1wiICAjem9uZURyb3Bkb3duXHJcbiAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG5cclxuICA8IS0tIEJVVFRPTiAtLT5cclxuICA8YnV0dG9uIFxyXG4gICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgdy0xMDAgbWUtMyBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxyXG4gICAgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKCRldmVudClcIlxyXG4gID5cclxuICAgIFNob3cgLyBIaWRlIFpvbmVcclxuICAgIDxzcGFuPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCI3XCIgdmlld0JveD1cIjAgMCAxMiA3XCIgZmlsbD1cIm5vbmVcIj5cclxuPHBhdGggZD1cIk0xIDFMNiA2TDExIDFcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuPC9zdmc+PC9zcGFuPlxyXG4gIDwvYnV0dG9uPlxyXG5cclxuICA8IS0tIERST1BET1dOIC0tPlxyXG4gPGRpdiAqbmdJZj1cInNob3dEcm9wZG93blwiIGNsYXNzPVwiZHJvcGRvd24tcGFuZWwgaC0zMDBweCBkLWZsZXggZmxleC1jb2x1bW5cIj5cclxuICAgICBcclxuICAgICA8IS0tIEhFQURFUiAoZml4ZWQpIC0tPlxyXG4gICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXIgcHgtMiBwYi0yXCI+XHJcbiAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggWm9uZVwiXHJcbiAgICAgICAgIFsobmdNb2RlbCldPVwiZHJvcGRvd25TZWFyY2hUZXh0XCJcclxuICAgICAgICAgKGlucHV0KT1cImZpbHRlclpvbmVzKClcIlxyXG4gICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICA8ZGl2ICpuZ0lmPVwidGVtcEZpbHRlcmVkWm9uZXM/Lmxlbmd0aFwiIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBtYi0yIFwiPlxyXG4gICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCI+PGlucHV0XHJcbiAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICBbY2hlY2tlZF09XCJpc0FsbFNlbGVjdGVkKClcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKCRldmVudClcIlxyXG4gICAgICAvPjwvc3Bhbj5cclxuICAgICAgPHNwYW4gPlNlbGVjdCBBbGw8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gQk9EWSAoc2Nyb2xsYWJsZSBsaXN0KSAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJ0ZW1wRmlsdGVyZWRab25lcz8ubGVuZ3RoXCIgY2xhc3M9XCJkcm9wZG93bi1ib2R5IGZsZXgtZ3Jvdy0xIG92ZXJmbG93LWF1dG8gXCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cInpvbmUtaXRlbVwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IHpvbmUgb2YgdGVtcEZpbHRlcmVkWm9uZXNcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCI+PGlucHV0XHJcbiAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJ6b25lLmNoZWNrZWRcIlxyXG4gICAgICAgIC8+PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuID57eyB6b25lLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gPGRpdiAqbmdJZj1cIiF0ZW1wRmlsdGVyZWRab25lcz8ubGVuZ3RoXCIgPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctbm9kYXRhLXRhYmxlXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBGT09URVIgKGZpeGVkKSAtLT5cclxuICA8ZGl2ICpuZ0lmPVwidGVtcEZpbHRlcmVkWm9uZXM/Lmxlbmd0aFwiIGNsYXNzPVwiZHJvcGRvd24tZm9vdGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGdhcC0yIHAtMiBib3JkZXItdG9wXCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZSB3LTUwXCIgKGNsaWNrKT1cInJlc2V0Wm9uZXMoKVwiPlxyXG4gICAgICBSZXNldFxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSB3LTUwXCIgKGNsaWNrKT1cImFwcGx5Wm9uZXMoKVwiPlxyXG4gICAgICBBcHBseVxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZ2V0Wm9uZUpvdXJuZXlFeHBvcnQoKVwiIFtkaXNhYmxlZF09XCIhem9uZVNob3BwZXJBbmFseXNpc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLW91dGxpbmUgYnRuIGFsaWduLWl0ZW1zLWVuZCB0ZXh0LW5vd3JhcCBpbnZoZWFkZXIgbWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIj48L3NwYW4+IEV4cG9ydFxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbXQtMyBteC0zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlcmVkLWJveCB3LTUwIG1lLTIgcHktMVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHB0LTEgcHgtM1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRpdGxlIHB5LTJcIj48c3ZnIGNsYXNzPVwibXgtMlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjFcIiB2aWV3Qm94PVwiMCAwIDE5IDIxXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMC41IDE2LjMyNThINlYxNy41NzU4QzYgMTguMzA1MSA1LjcxMDI3IDE5LjAwNDYgNS4xOTQ1NCAxOS41MjAzQzQuNjc4ODIgMjAuMDM2IDMuOTc5MzUgMjAuMzI1OCAzLjI1IDIwLjMyNThDMi41MjA2NSAyMC4zMjU4IDEuODIxMTggMjAuMDM2IDEuMzA1NDYgMTkuNTIwM0MwLjc4OTczMSAxOS4wMDQ2IDAuNSAxOC4zMDUxIDAuNSAxNy41NzU4VjE2LjMyNThaTTQuNSA0LjQ0NTc2QzYuNSA0LjQ0NTc2IDcuNSA3LjMyNTc2IDcuNSA5LjMyNTc2QzcuNSAxMC4zMjU4IDcgMTEuMzI1OCA2LjUgMTIuODI1OEw2IDE0LjMyNThIMC41QzAuNSAxMy4zMjU4IDAgMTEuODI1OCAwIDkuMzI1NzZDMCA2LjgyNTc2IDEuOTk4IDQuNDQ1NzYgNC41IDQuNDQ1NzZaTTE2LjU1NCAxMi40MjM4TDE2LjMzNyAxMy42NTQ4QzE2LjIwMjMgMTQuMzY1NCAxNS43OTMxIDE0Ljk5NDMgMTUuMTk4IDE1LjQwNTRDMTQuNjAyOSAxNS44MTY1IDEzLjg2OTggMTUuOTc2NSAxMy4xNTc2IDE1Ljg1MDlDMTIuNDQ1MyAxNS43MjU0IDExLjgxMTEgMTUuMzI0MiAxMS4zOTI1IDE0LjczNDRDMTAuOTczOSAxNC4xNDQ2IDEwLjgwNDUgMTMuNDEzNiAxMC45MjEgMTIuNjk5OEwxMS4xMzcgMTEuNDY5OEwxNi41NTQgMTIuNDIzOFpNMTQuNjc4IDAuMDMwNzYyNEMxNy4xNDIgMC40NjQ3NjIgMTguNjk2IDMuMTU1NzYgMTguMjYyIDUuNjE3NzZDMTcuODI4IDguMDc5NzYgMTcuMDc1IDkuNDY5NzYgMTYuOTAyIDEwLjQ1NDhMMTEuNDg1IDkuNDk5NzZMMTEuMjUzIDcuOTM1NzZDMTEuMDIxIDYuMzcxNzYgMTAuNzAzIDUuMjk5NzYgMTAuODc2IDQuMzE1NzZDMTEuMjIzIDIuMzQ1NzYgMTIuNzA4IC0wLjMxNjIzOCAxNC42NzggMC4wMzA3NjI0WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzFEMjkzOVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+T3ZlcmFsbCBGb290ZmFsbCA6PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+PHNwYW4gY2xhc3M9XCJ0ZXh0LXZhbFwiPnt7em9uZVNob3BwZXJBbmFseXNpcz8uT3ZlcmFsbEZvb3RmYWxsID8/ICctLSd9fTwvc3Bhbj4gPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyZWQtYm94IHctNTAgcHktMVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHB0LTEgcHgtM1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0aGlzLmNsaWVudERhdGE/LmlzTk9CXCIgY2xhc3M9XCJ0ZXh0LXRpdGxlIHB5LTJcIj5cclxuPHN2ZyBjbGFzcz1cIm14LTJcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgMTFIMTVNOSAxNUgxNU05IDdIMTVNNSAzQzUgMi43MzQ3OCA1LjEwNTM2IDIuNDgwNDMgNS4yOTI4OSAyLjI5Mjg5QzUuNDgwNDMgMi4xMDUzNiA1LjczNDc4IDIgNiAySDE4QzE4LjI2NTIgMiAxOC41MTk2IDIuMTA1MzYgMTguNzA3MSAyLjI5Mjg5QzE4Ljg5NDYgMi40ODA0MyAxOSAyLjczNDc4IDE5IDNWMjJMMTUuNSAxOS41TDEyIDIyTDguNSAxOS41TDUgMjJWM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzFEMjkzOVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPiBOb0IgOjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF0aGlzLmNsaWVudERhdGE/LmlzTk9CXCIgY2xhc3M9XCJ0ZXh0LXRpdGxlIHB5LTJcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuPHBhdGggZD1cIk0xNiAyMVYxOUMxNiAxNy45MzkxIDE1LjU3ODYgMTYuOTIxNyAxNC44Mjg0IDE2LjE3MTZDMTQuMDc4MyAxNS40MjE0IDEzLjA2MDkgMTUgMTIgMTVINUMzLjkzOTEzIDE1IDIuOTIxNzIgMTUuNDIxNCAyLjE3MTU3IDE2LjE3MTZDMS40MjE0MyAxNi45MjE3IDEgMTcuOTM5MSAxIDE5VjIxTTE3IDExTDE5IDEzTDIzIDlNMTIuNSA3QzEyLjUgOS4yMDkxNCAxMC43MDkxIDExIDguNSAxMUM2LjI5MDg2IDExIDQuNSA5LjIwOTE0IDQuNSA3QzQuNSA0Ljc5MDg2IDYuMjkwODYgMyA4LjUgM0MxMC43MDkxIDMgMTIuNSA0Ljc5MDg2IDEyLjUgN1pcIiBzdHJva2U9XCIjMUQyOTM5XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuPC9zdmc+IENvbnZlcnNpb24gOjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC12YWxcIj57e3pvbmVTaG9wcGVyQW5hbHlzaXM/Lk5vYiA/PyAnLS0nfX08c3BhbiBjbGFzcz1cInRleHQtcGVyYyBtcy0xXCI+KHt7em9uZVNob3BwZXJBbmFseXNpcz8uQ29udmVyc2lvblBlcmNlbnQgPz8gJy0tJ319ICUpPC9zcGFuPiAgICA8c3BhbiAqbmdJZj1cInRoaXMuY2xpZW50RGF0YT8uaXNOT0JcIiBjbGFzcz1cInB4LTAgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwibm9iVXBsb2FkKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnICBwbGFjZW1lbnQ9XCJ0b3BcIiBuZ2JUb29sdGlwPVwiVXBsb2FkIE5vQlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCA0MCA0MFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF8xNTEwNl8xMDYwOTApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiMzZcIiBoZWlnaHQ9XCIzNlwiIHJ4PVwiOFwiIGZpbGw9XCIjRUFGOEZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzVcIiBoZWlnaHQ9XCIzNVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMy4zMzI2IDIyLjMzMzJMMTkuOTk5MiAxOC45OTk5TTE5Ljk5OTIgMTguOTk5OUwxNi42NjU5IDIyLjMzMzJNMTkuOTk5MiAxOC45OTk5VjI2LjQ5OTlNMjYuOTkwOSAyNC4zMjQ5QzI3LjgwMzcgMjMuODgxOCAyOC40NDU4IDIzLjE4MDYgMjguODE1OCAyMi4zMzIxQzI5LjE4NTggMjEuNDgzNSAyOS4yNjI3IDIwLjUzNTkgMjkuMDM0NCAxOS42Mzg4QzI4LjgwNjEgMTguNzQxNyAyOC4yODU1IDE3Ljk0NjIgMjcuNTU0OCAxNy4zNzc4QzI2LjgyNDEgMTYuODA5NCAyNS45MjUgMTYuNTAwNSAyNC45OTkyIDE2LjQ5OTlIMjMuOTQ5MkMyMy42OTcgMTUuNTI0MyAyMy4yMjY5IDE0LjYxODUgMjIuNTc0MiAxMy44NTA3QzIxLjkyMTUgMTMuMDgyOSAyMS4xMDMzIDEyLjQ3MzEgMjAuMTgxIDEyLjA2NzFDMTkuMjU4NyAxMS42NjEgMTguMjU2NCAxMS40Njk0IDE3LjI0OTMgMTEuNTA2NUMxNi4yNDIzIDExLjU0MzYgMTUuMjU2OCAxMS44MDg1IDE0LjM2NjkgMTIuMjgxM0MxMy40NzcgMTIuNzU0MSAxMi43MDU4IDEzLjQyMjUgMTIuMTExNCAxNC4yMzYyQzExLjUxNyAxNS4wNSAxMS4xMTQ4IDE1Ljk4NzkgMTAuOTM1MSAxNi45Nzk0QzEwLjc1NTMgMTcuOTcwOSAxMC44MDI3IDE4Ljk5MDMgMTEuMDczNiAxOS45NjFDMTEuMzQ0NSAyMC45MzE2IDExLjgzMTkgMjEuODI4MSAxMi40OTkyIDIyLjU4MzJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIGlkPVwiZmlsdGVyMF9kXzE1MTA2XzEwNjA5MFwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCIgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlT2Zmc2V0IGR5PVwiMVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIxXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzE1MTA2XzEwNjA5MFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIiBpbjI9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMTUxMDZfMTA2MDkwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cInNoYXBlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZ3gtMCBwLTNcIj5cclxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImlzTWluaW1pemVkID8gJ2NvbC0xMicgOiAnY29sLTgnXCJcclxuICBbc3R5bGUuaGVpZ2h0LnB4XT1cInpvbmVDaGFydE5vRGF0YSA/IDMwMCA6IChpc01pbmltaXplZCA/IDY1MCA6IDU1MClcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInpvbmVDaGFydExvYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ6b25lQ2hhcnROb0RhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBteS02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhbWFpbnRleHQgbXQtM1wiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YXN1YnRleHRcIj5UaGVyZSBpcyBubyByZXN1bHQgZm9yIFpvbmUgQmFzZWQgU2hvcHBlciBBbmFseXNpcyBDaGFydDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXpvbmVDaGFydE5vRGF0YSAmJiAhem9uZUNoYXJ0TG9hZGluZ1wiIGlkPVwiY2hhcnRkaXZcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXNNaW5pbWl6ZWQgPyAnem9uZS1mbG9hdGluZycgOiAnY29sLTQnXCIgW3N0eWxlLnRvcC5weF09XCJpc01pbmltaXplZCA/IGZsb2F0aW5nUG9zLnRvcCA6IG51bGxcIlxyXG4gICAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJpc01pbmltaXplZCA/IGZsb2F0aW5nUG9zLmxlZnQgOiBudWxsXCIgKG1vdXNlZG93bik9XCJzdGFydERyYWcoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8IS0tIChtb3VzZWRvd24pPVwic3RhcnREcmFnKCRldmVudClcIiAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiem9uZUNhcmRMb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyICBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiem9uZUNhcmROb0RhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBteS02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhbWFpbnRleHQgbXQtM1wiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YXN1YnRleHRcIj5UaGVyZSBpcyBubyByZXN1bHQgZm9yIFpvbmUgQmFzZWQgU2hvcHBlciBBbmFseXNpczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29uYXRpbmVyICpuZ0lmPVwiIXpvbmVDYXJkTm9EYXRhICYmICF6b25lQ2FyZExvYWRpbmdcIiBjbGFzcz1cImNhcmQgXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgcHgtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaXNNaW5pbWl6ZWQgPydiZy1zZWNvbmRhcnkgbWluLWgtMzBweCc6ICdiZy1saWdodC1wcmltYXJ5IG1pbi1oLTQ1cHggbWItMidcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZSBhbGlnbi1pdGVtcy1zdGFydFwiPjxzcGFuICpuZ0lmPVwiaXNNaW5pbWl6ZWRcIiBjbGFzcz1cIm1lLTIgbWItMlwiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgMjBDOC40NSAyMCA3Ljk3OTE3IDE5LjgwNDIgNy41ODc1IDE5LjQxMjVDNy4xOTU4MyAxOS4wMjA4IDcgMTguNTUgNyAxOEM3IDE3LjQ1IDcuMTk1ODMgMTYuOTc5MiA3LjU4NzUgMTYuNTg3NUM3Ljk3OTE3IDE2LjE5NTggOC40NSAxNiA5IDE2QzkuNTUgMTYgMTAuMDIwOCAxNi4xOTU4IDEwLjQxMjUgMTYuNTg3NUMxMC44MDQyIDE2Ljk3OTIgMTEgMTcuNDUgMTEgMThDMTEgMTguNTUgMTAuODA0MiAxOS4wMjA4IDEwLjQxMjUgMTkuNDEyNUMxMC4wMjA4IDE5LjgwNDIgOS41NSAyMCA5IDIwWk0xNSAyMEMxNC40NSAyMCAxMy45NzkyIDE5LjgwNDIgMTMuNTg3NSAxOS40MTI1QzEzLjE5NTggMTkuMDIwOCAxMyAxOC41NSAxMyAxOEMxMyAxNy40NSAxMy4xOTU4IDE2Ljk3OTIgMTMuNTg3NSAxNi41ODc1QzEzLjk3OTIgMTYuMTk1OCAxNC40NSAxNiAxNSAxNkMxNS41NSAxNiAxNi4wMjA4IDE2LjE5NTggMTYuNDEyNSAxNi41ODc1QzE2LjgwNDIgMTYuOTc5MiAxNyAxNy40NSAxNyAxOEMxNyAxOC41NSAxNi44MDQyIDE5LjAyMDggMTYuNDEyNSAxOS40MTI1QzE2LjAyMDggMTkuODA0MiAxNS41NSAyMCAxNSAyMFpNOSAxNEM4LjQ1IDE0IDcuOTc5MTcgMTMuODA0MiA3LjU4NzUgMTMuNDEyNUM3LjE5NTgzIDEzLjAyMDggNyAxMi41NSA3IDEyQzcgMTEuNDUgNy4xOTU4MyAxMC45NzkyIDcuNTg3NSAxMC41ODc1QzcuOTc5MTcgMTAuMTk1OCA4LjQ1IDEwIDkgMTBDOS41NSAxMCAxMC4wMjA4IDEwLjE5NTggMTAuNDEyNSAxMC41ODc1QzEwLjgwNDIgMTAuOTc5MiAxMSAxMS40NSAxMSAxMkMxMSAxMi41NSAxMC44MDQyIDEzLjAyMDggMTAuNDEyNSAxMy40MTI1QzEwLjAyMDggMTMuODA0MiA5LjU1IDE0IDkgMTRaTTE1IDE0QzE0LjQ1IDE0IDEzLjk3OTIgMTMuODA0MiAxMy41ODc1IDEzLjQxMjVDMTMuMTk1OCAxMy4wMjA4IDEzIDEyLjU1IDEzIDEyQzEzIDExLjQ1IDEzLjE5NTggMTAuOTc5MiAxMy41ODc1IDEwLjU4NzVDMTMuOTc5MiAxMC4xOTU4IDE0LjQ1IDEwIDE1IDEwQzE1LjU1IDEwIDE2LjAyMDggMTAuMTk1OCAxNi40MTI1IDEwLjU4NzVDMTYuODA0MiAxMC45NzkyIDE3IDExLjQ1IDE3IDEyQzE3IDEyLjU1IDE2LjgwNDIgMTMuMDIwOCAxNi40MTI1IDEzLjQxMjVDMTYuMDIwOCAxMy44MDQyIDE1LjU1IDE0IDE1IDE0Wk05IDhDOC40NSA4IDcuOTc5MTcgNy44MDQxNyA3LjU4NzUgNy40MTI1QzcuMTk1ODMgNy4wMjA4MyA3IDYuNTUgNyA2QzcgNS40NSA3LjE5NTgzIDQuOTc5MTcgNy41ODc1IDQuNTg3NUM3Ljk3OTE3IDQuMTk1ODMgOC40NSA0IDkgNEM5LjU1IDQgMTAuMDIwOCA0LjE5NTgzIDEwLjQxMjUgNC41ODc1QzEwLjgwNDIgNC45NzkxNyAxMSA1LjQ1IDExIDZDMTEgNi41NSAxMC44MDQyIDcuMDIwODMgMTAuNDEyNSA3LjQxMjVDMTAuMDIwOCA3LjgwNDE3IDkuNTUgOCA5IDhaTTE1IDhDMTQuNDUgOCAxMy45NzkyIDcuODA0MTcgMTMuNTg3NSA3LjQxMjVDMTMuMTk1OCA3LjAyMDgzIDEzIDYuNTUgMTMgNkMxMyA1LjQ1IDEzLjE5NTggNC45NzkxNyAxMy41ODc1IDQuNTg3NUMxMy45NzkyIDQuMTk1ODMgMTQuNDUgNCAxNSA0QzE1LjU1IDQgMTYuMDIwOCA0LjE5NTgzIDE2LjQxMjUgNC41ODc1QzE2LjgwNDIgNC45NzkxNyAxNyA1LjQ1IDE3IDZDMTcgNi41NSAxNi44MDQyIDcuMDIwODMgMTYuNDEyNSA3LjQxMjVDMTYuMDIwOCA3LjgwNDE3IDE1LjU1IDggMTUgOFpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzY2NzA4NVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+IFpvbmUgSm91cm5leSA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10b29sYmFyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc01pbmltaXplZFwiIChjbGljayk9XCJzZWFyY2hPcGVuKClcIiBjbGFzcz1cIm1lLTNcIj48c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE5IDE5TDE0LjY1IDE0LjY1TTE3IDlDMTcgMTMuNDE4MyAxMy40MTgzIDE3IDkgMTdDNC41ODE3MiAxNyAxIDEzLjQxODMgMSA5QzEgNC41ODE3MiA0LjU4MTcyIDEgOSAxQzEzLjQxODMgMSAxNyA0LjU4MTcyIDE3IDlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cIiFpc01pbmltaXplZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRDbG9zZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDEySDE5XCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKm5nSWY9XCJpc01pbmltaXplZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRDbG9zZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNSAzSDIxTTIxIDNWOU0yMSAzTDE0IDEwTTkgMjFIM00zIDIxVjE1TTMgMjFMMTAgMTRcIiBzdHJva2U9XCIjNjY3MDg1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VhcmNoTmV3T3BlbiAmJiAhaXNNaW5pbWl6ZWRcIiBjbGFzcz1cInB4LTIgcGItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggWm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFpvbmVUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiU2VhcmNoWm9uZXMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNNaW5pbWl6ZWRcIiBjbGFzcz1cImNhcmQtYm9keSBoLTUwMHB4IG92ZXJmbG93LWF1dG8gcHgtMCBweS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInpvbmVUZXN0Tm9EYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG15LTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YW1haW50ZXh0IG10LTNcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YXN1YnRleHRcIj5UaGVyZSBpcyBubyByZXN1bHQgZm9yIFpvbmUgQW5hbHlzaXM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICBcclxuICAgICAgPGRpdiBjbGFzcz1cInpvbmUtY2FyZCBteC0zIFwiICpuZ0Zvcj1cImxldCB6b25lIG9mIHpvbmVzO2xldCBpID0gaW5kZXhcIj5cclxuXHJcbiAgICAgICAgICA8IS0tIEhFQURFUiAtLT5cclxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiYWN0aXZlSW5kZXggPT09IGkgPyAnem9uZS1oZWFkZXInOid6b25lLWRlZmF1bHQnXCIgKGNsaWNrKT1cInRvZ2dsZShpKVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiYWN0aXZlSW5kZXggPT09IGkgPyAnem9uZS10aXRsZSc6J3pvbmUtbm90aXRsZSdcIj57eyB6b25lLmZyb21ab25lIHxcclxuICAgICAgICAgICAgICAgICAgdGl0bGVjYXNlfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInpvbmUtbWV0cmljc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LXByaW1hcnkgcHgtMlwiICBwbGFjZW1lbnQ9XCJ0b3BcIiBuZ2JUb29sdGlwPVwiRm9vdGZhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiPjxzdmcgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEwIDExXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMC4yNSA4LjE2Mjg4SDNWOC43ODc4OEMzIDkuMTUyNTUgMi44NTUxMyA5LjUwMjI5IDIuNTk3MjcgOS43NjAxNUMyLjMzOTQxIDEwLjAxOCAxLjk4OTY3IDEwLjE2MjkgMS42MjUgMTAuMTYyOUMxLjI2MDMzIDEwLjE2MjkgMC45MTA1OTEgMTAuMDE4IDAuNjUyNzI4IDkuNzYwMTVDMC4zOTQ4NjYgOS41MDIyOSAwLjI1IDkuMTUyNTUgMC4yNSA4Ljc4Nzg4VjguMTYyODhaTTIuMjUgMi4yMjI4OEMzLjI1IDIuMjIyODggMy43NSAzLjY2Mjg4IDMuNzUgNC42NjI4OEMzLjc1IDUuMTYyODggMy41IDUuNjYyODggMy4yNSA2LjQxMjg4TDMgNy4xNjI4OEgwLjI1QzAuMjUgNi42NjI4OCAwIDUuOTEyODggMCA0LjY2Mjg4QzAgMy40MTI4OCAwLjk5OSAyLjIyMjg4IDIuMjUgMi4yMjI4OFpNOC4yNzcgNi4yMTE4OEw4LjE2ODUgNi44MjczOEM4LjEwMTE3IDcuMTgyNjkgNy44OTY1NiA3LjQ5NzE3IDcuNTk5MDEgNy43MDI3MUM3LjMwMTQ2IDcuOTA4MjQgNi45MzQ5MiA3Ljk4ODI3IDYuNTc4NzggNy45MjU0N0M2LjIyMjYzIDcuODYyNjggNS45MDU1NyA3LjY2MjEgNS42OTYyNiA3LjM2NzJDNS40ODY5NSA3LjA3MjI5IDUuNDAyMjUgNi43MDY4IDUuNDYwNSA2LjM0OTg4TDUuNTY4NSA1LjczNDg4TDguMjc3IDYuMjExODhaTTcuMzM5IDAuMDE1MzgxMkM4LjU3MSAwLjIzMjM4MSA5LjM0OCAxLjU3Nzg4IDkuMTMxIDIuODA4ODhDOC45MTQgNC4wMzk4OCA4LjUzNzUgNC43MzQ4OCA4LjQ1MSA1LjIyNzM4TDUuNzQyNSA0Ljc0OTg4TDUuNjI2NSAzLjk2Nzg4QzUuNTEwNSAzLjE4NTg4IDUuMzUxNSAyLjY0OTg4IDUuNDM4IDIuMTU3ODhDNS42MTE1IDEuMTcyODggNi4zNTQgLTAuMTU4MTE5IDcuMzM5IDAuMDE1MzgxMlpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMwMDlCRjNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj4ge3sgem9uZS5mcm9tWm9uZUZvb3RmYWxsQ291bnQgPz8gJy0tJyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtZGVmYXVsdCBweC0yXCIgIHBsYWNlbWVudD1cInRvcFwiXHJcbltuZ2JUb29sdGlwXT1cImNsaWVudERhdGE/LmlzTk9CID8gJ05vQicgOiAnQ29udmVyc2lvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGhpcy5jbGllbnREYXRhPy5pc05PQlwiIGNsYXNzPVwibWUtMlwiPjxzdmcgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTQuNSA1LjVINy41TTQuNSA3LjVINy41TTQuNSAzLjVINy41TTIuNSAxLjVDMi41IDEuMzY3MzkgMi41NTI2OCAxLjI0MDIxIDIuNjQ2NDUgMS4xNDY0NUMyLjc0MDIxIDEuMDUyNjggMi44NjczOSAxIDMgMUg5QzkuMTMyNjEgMSA5LjI1OTc5IDEuMDUyNjggOS4zNTM1NSAxLjE0NjQ1QzkuNDQ3MzIgMS4yNDAyMSA5LjUgMS4zNjczOSA5LjUgMS41VjExTDcuNzUgOS43NUw2IDExTDQuMjUgOS43NUwyLjUgMTFWMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+ICAgICA8c3BhbiAqbmdJZj1cIiF0aGlzLmNsaWVudERhdGE/LmlzTk9CXCIgY2xhc3M9XCJtZS0yXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbjxwYXRoIGQ9XCJNMTYgMjFWMTlDMTYgMTcuOTM5MSAxNS41Nzg2IDE2LjkyMTcgMTQuODI4NCAxNi4xNzE2QzE0LjA3ODMgMTUuNDIxNCAxMy4wNjA5IDE1IDEyIDE1SDVDMy45MzkxMyAxNSAyLjkyMTcyIDE1LjQyMTQgMi4xNzE1NyAxNi4xNzE2QzEuNDIxNDMgMTYuOTIxNyAxIDE3LjkzOTEgMSAxOVYyMU0xNyAxMUwxOSAxM0wyMyA5TTEyLjUgN0MxMi41IDkuMjA5MTQgMTAuNzA5MSAxMSA4LjUgMTFDNi4yOTA4NiAxMSA0LjUgOS4yMDkxNCA0LjUgN0M0LjUgNC43OTA4NiA2LjI5MDg2IDMgOC41IDNDMTAuNzA5MSAzIDEyLjUgNC43OTA4NiAxMi41IDdaXCIgc3Ryb2tlPVwiIzFEMjkzOVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbjwvc3ZnPjwvc3Bhbj4ge3sgem9uZS5mcm9tWm9uZU5vYkNvdW50ID8/ICctLScgfX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJvdyBjdXJzb3ItcG9pbnRlclwiPjxzdmcgKm5nSWY9XCJhY3RpdmVJbmRleCA9PT0gaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCI3XCIgdmlld0JveD1cIjAgMCAxMiA3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMC44MzIwMzEgNS44MzMwMUw1LjgzMjAzIDAuODMzMDA4TDEwLjgzMiA1LjgzMzAxXCIgc3Ryb2tlPVwiIzMzQjVGRlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiYWN0aXZlSW5kZXggIT09IGlcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiN1wiIHZpZXdCb3g9XCIwIDAgMTIgN1wiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wLjgzMjAzMSAwLjgzMzAwOEw1LjgzMjAzIDUuODMzMDFMMTAuODMyIDAuODMzMDA4XCIgc3Ryb2tlPVwiIzY2NzA4NVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gQk9EWSAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ6b25lLWJvZHkgbWF4LWgtMjAwcHggbWluLWgtYXV0byBvdmVyZmxvdy1hdXRvXCIgKm5nSWY9XCJhY3RpdmVJbmRleCA9PT0gaVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRleHQtbm93cmFwIGJvdHRvbS1ib3JkZXIgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwidy01MFwiPlRvIFpvbmU8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+Rm9vdGZhbGwgKENvbmNlbnRyYXRpb24pPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8dGggPjxzcGFuIGNsYXNzPVwibWUtMlwiICpuZ0lmPVwidGhpcy5jbGllbnREYXRhPy5pc05PQlwiPk5vQjwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJtZS0yXCIgKm5nSWY9XCIhdGhpcy5jbGllbnREYXRhPy5pc05PQlwiPkNvbnZlcnNpb248L3NwYW4+ICAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE1MzIwXzgyNDg4KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03Ljk5ODcgMTAuNjY2M1Y3Ljk5OTY3TTcuOTk4NyA1LjMzMzAxSDguMDA1MzZNMTQuNjY1NCA3Ljk5OTY3QzE0LjY2NTQgMTEuNjgxNiAxMS42ODA2IDE0LjY2NjMgNy45OTg3IDE0LjY2NjNDNC4zMTY4IDE0LjY2NjMgMS4zMzIwMyAxMS42ODE2IDEuMzMyMDMgNy45OTk2N0MxLjMzMjAzIDQuMzE3NzggNC4zMTY4IDEuMzMzMDEgNy45OTg3IDEuMzMzMDFDMTEuNjgwNiAxLjMzMzAxIDE0LjY2NTQgNC4zMTc3OCAxNC42NjU0IDcuOTk5NjdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNTMyMF84MjQ4OFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPC90aD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2Ygem9uZS50b1pvbmVEYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyByb3cudG9ab25lIHwgdGl0bGVjYXNlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgcm93LmZvb3RmYWxsID8/ICctLScgfX0gKHt7IHJvdy5jb25jUGVyY2VudCB9fSUpPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8dGQ+e3sgcm93Lm5vYiA/PyAnLS0nIH19ICh7eyByb3cubm9iUGVyY2VudCB9fSUpPC90ZD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29uYXRpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbjwvZGl2PiJdfQ==