tango-app-ui-manage-billing 3.3.19 → 3.3.21

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/billing-summary/billing-summary.component.mjs +25 -17
  2. package/esm2022/lib/components/brand-invoices/brand-invoices.component.mjs +13 -5
  3. package/esm2022/lib/components/daily-pricing/daily-pricing.component.mjs +71 -7
  4. package/esm2022/lib/components/daily-pricing/generate-invoice-modal/generate-invoice-modal.component.mjs +3 -3
  5. package/esm2022/lib/components/daily-pricing/new-stores-modal/new-stores-modal.component.mjs +25 -0
  6. package/esm2022/lib/components/invoice-preview/invoice-preview.component.mjs +3 -3
  7. package/esm2022/lib/components/plans-subscription/payments-subscription.component.mjs +184 -13
  8. package/esm2022/lib/components/plans-subscription/subscription-popups/upload-document/upload-document.component.mjs +82 -0
  9. package/esm2022/lib/components/purchase-order/purchase-order-details/purchase-order-details.component.mjs +62 -0
  10. package/esm2022/lib/components/purchase-order/purchase-order-form/purchase-order-form.component.mjs +87 -0
  11. package/esm2022/lib/components/purchase-order/purchase-order.component.mjs +104 -0
  12. package/esm2022/lib/components/services/billing.service.mjs +15 -1
  13. package/esm2022/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.mjs +25 -3
  14. package/esm2022/lib/services/payment-subscription.service.mjs +17 -6
  15. package/esm2022/lib/tango-manage-billing.module.mjs +16 -1
  16. package/fesm2022/tango-app-ui-manage-billing.mjs +724 -96
  17. package/fesm2022/tango-app-ui-manage-billing.mjs.map +1 -1
  18. package/lib/components/billing-summary/billing-summary.component.d.ts +1 -0
  19. package/lib/components/brand-invoices/brand-invoices.component.d.ts +3 -0
  20. package/lib/components/daily-pricing/daily-pricing.component.d.ts +6 -0
  21. package/lib/components/daily-pricing/new-stores-modal/new-stores-modal.component.d.ts +10 -0
  22. package/lib/components/plans-subscription/payments-subscription.component.d.ts +15 -0
  23. package/lib/components/plans-subscription/subscription-popups/upload-document/upload-document.component.d.ts +23 -0
  24. package/lib/components/purchase-order/purchase-order-details/purchase-order-details.component.d.ts +18 -0
  25. package/lib/components/purchase-order/purchase-order-form/purchase-order-form.component.d.ts +25 -0
  26. package/lib/components/purchase-order/purchase-order.component.d.ts +28 -0
  27. package/lib/components/services/billing.service.d.ts +3 -0
  28. package/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.d.ts +2 -0
  29. package/lib/services/payment-subscription.service.d.ts +4 -0
  30. package/lib/tango-manage-billing.module.d.ts +42 -37
  31. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  import { Component, Input } from '@angular/core';
2
2
  import { Subject, takeUntil } from 'rxjs';
3
3
  import { GenerateInvoiceModalComponent } from './generate-invoice-modal/generate-invoice-modal.component';
4
+ import { NewStoresModalComponent } from './new-stores-modal/new-stores-modal.component';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "../services/billing.service";
6
7
  import * as i2 from "tango-app-ui-shared";
@@ -50,6 +51,10 @@ export class DailyPricingComponent {
50
51
  // (currently clientId 11). Empty for everyone else -> the table is hidden.
51
52
  additionalProducts = [];
52
53
  additionalProductsCurrency = 'inr';
54
+ // Count + list of stores onboarded this month (first file date in the current
55
+ // month). The list feeds the "View Stores" popup.
56
+ newlyOnboardedStores = 0;
57
+ newlyOnboardedStoreList = [];
53
58
  constructor(billingService, changeDetector, toast, modalService) {
54
59
  this.billingService = billingService;
55
60
  this.changeDetector = changeDetector;
@@ -72,6 +77,47 @@ export class DailyPricingComponent {
72
77
  get additionalProductsTotal() {
73
78
  return (this.additionalProducts || []).reduce((a, p) => a + (Number(p.total) || 0), 0);
74
79
  }
80
+ // Products that have a backend detailed export. Keyed by the product key the
81
+ // export endpoint understands. Add more as their queries are wired up.
82
+ exportableProducts = {
83
+ 'eyetest': 'eyetest',
84
+ 'planogram': 'planogram',
85
+ 'ai manager': 'aimanager',
86
+ 'vms': 'vms',
87
+ 'run ai': 'runai',
88
+ 'remote optum': 'remoteoptum',
89
+ };
90
+ canExportAdditionalProduct(productName) {
91
+ return !!this.exportableProducts[(productName || '').toLowerCase()];
92
+ }
93
+ exportAdditionalProduct(productName) {
94
+ const key = this.exportableProducts[(productName || '').toLowerCase()];
95
+ if (!key) {
96
+ return;
97
+ }
98
+ // Pass today's date (YYYY-MM-DD) — used by day-scoped products (Remote Optum).
99
+ const today = new Date();
100
+ const todayStr = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;
101
+ this.billingService.additionalProductExport(this.clientId, key, todayStr)
102
+ .pipe(takeUntil(this.destroy$))
103
+ .subscribe({
104
+ next: (res) => {
105
+ // A real .xlsx is a zip — its first two bytes are 'PK' (0x50 0x4B).
106
+ // A 204/empty or JSON error body is NOT, and saving it produces a
107
+ // "corrupted" file. Guard so we only save a genuine workbook.
108
+ const bytes = res ? new Uint8Array(res) : new Uint8Array();
109
+ const isXlsx = bytes.length > 1 && bytes[0] === 0x50 && bytes[1] === 0x4b;
110
+ if (!isXlsx) {
111
+ this.toast.getErrorToast('No data to export');
112
+ return;
113
+ }
114
+ this.billingService.saveAsExcelFile(res, `${productName}-${this.clientId}`);
115
+ },
116
+ error: () => {
117
+ this.toast.getErrorToast('Export failed');
118
+ },
119
+ });
120
+ }
75
121
  // Fetch the additional-products table for this client. Backend returns an
76
122
  // empty list for any client that has none (so the table just won't render).
77
123
  loadAdditionalProducts() {
@@ -112,6 +158,10 @@ export class DailyPricingComponent {
112
158
  // rows — apply it regardless of whether the store list is empty, so it
113
159
  // still shows when the filtered store table has no rows.
114
160
  this.monthlyBillingSummary = this.decorateMonthlySummary(e?.data?.monthlyBillingSummary || []);
161
+ // Newly onboarded count/list is independent of the store table's
162
+ // filters, so capture it whether or not the filtered store list has rows.
163
+ this.newlyOnboardedStores = e?.data?.newlyOnboardedStores || 0;
164
+ this.newlyOnboardedStoreList = e?.data?.newlyOnboardedStoreList || [];
115
165
  if (e?.data?.count) {
116
166
  this.storeLoading = false;
117
167
  this.storeNoData = false;
@@ -225,7 +275,9 @@ export class DailyPricingComponent {
225
275
  }
226
276
  startEdit(store, product) {
227
277
  const key = this.getEditKey(store.storeId, product.productName);
228
- this.editingProduct[key] = product.workingdays;
278
+ // Coerce to a number so a 0 / missing value still enters edit mode with a
279
+ // defined value (undefined would make isEditing() think we're not editing).
280
+ this.editingProduct[key] = Number(product.workingdays) || 0;
229
281
  }
230
282
  cancelEdit(store, product) {
231
283
  const key = this.getEditKey(store.storeId, product.productName);
@@ -233,8 +285,10 @@ export class DailyPricingComponent {
233
285
  }
234
286
  saveWorkingDays(store, product) {
235
287
  const key = this.getEditKey(store.storeId, product.productName);
236
- const newValue = this.editingProduct[key];
237
- if (newValue === product.workingdays) {
288
+ const newValue = Number(this.editingProduct[key]) || 0;
289
+ // Unchanged → just close the editor (compare as numbers so 0 vs "0" etc.
290
+ // don't slip through).
291
+ if (newValue === (Number(product.workingdays) || 0)) {
238
292
  delete this.editingProduct[key];
239
293
  return;
240
294
  }
@@ -243,7 +297,7 @@ export class DailyPricingComponent {
243
297
  dateString: this.dailyPricingInfo.dateString,
244
298
  storeId: store.storeId,
245
299
  productName: product.productName,
246
- workingdays: Number(newValue)
300
+ workingdays: newValue
247
301
  };
248
302
  this.billingService.updateDailyPricingWorkingDays(payload).pipe(takeUntil(this.destroy$)).subscribe({
249
303
  next: () => {
@@ -315,6 +369,16 @@ export class DailyPricingComponent {
315
369
  this.runInvoiceGeneration(groupIds);
316
370
  }).catch(() => { });
317
371
  }
372
+ // Open a popup listing the newly onboarded stores (with first file date).
373
+ // The list is already loaded with the page, so no extra API call is needed.
374
+ viewNewStores() {
375
+ if (!this.newlyOnboardedStoreList.length)
376
+ return;
377
+ const modalRef = this.modalService.open(NewStoresModalComponent, {
378
+ centered: true, size: 'lg', scrollable: true,
379
+ });
380
+ modalRef.componentInstance.stores = this.newlyOnboardedStoreList;
381
+ }
318
382
  runInvoiceGeneration(groupIds) {
319
383
  this.generatingInvoice = true;
320
384
  const payload = {
@@ -383,12 +447,12 @@ export class DailyPricingComponent {
383
447
  this.monthlySummaryExpanded = !this.monthlySummaryExpanded;
384
448
  }
385
449
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DailyPricingComponent, deps: [{ token: i1.BillingService }, { token: i0.ChangeDetectorRef }, { token: i2.ToastService }, { token: i3.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
386
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DailyPricingComponent, selector: "lib-daily-pricing", inputs: { clientId: "clientId" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"invoices-section\">\n <!-- Header Row -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"billingheader\">Billing Breakdown</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ totalItems }} stores</span>\n </div>\n <div class=\"text-muted small mt-1\" *ngIf=\"dailyPricingInfo?.dateString\">\n Date: <strong>{{ dailyPricingInfo?.dateString }}</strong>\n <span class=\"mx-2\">|</span>\n Active Stores: <strong>{{ dailyPricingInfo?.activeStores }}</strong>\n <span class=\"mx-2\">|</span>\n Account Type: <strong>{{ dailyPricingInfo?.accountType }}</strong>\n </div>\n </div>\n <div class=\"d-flex align-items-center gap-3\">\n <div class=\"d-flex align-items-center gap-2\">\n <input type=\"date\" class=\"form-control form-control-sm date-filter\"\n [value]=\"dateFilter\"\n (change)=\"onDateFilter($event)\"\n placeholder=\"Filter by date\">\n <button *ngIf=\"dateFilter\" type=\"button\" class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"clearDateFilter()\" title=\"Clear date filter\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M10.5 3.5L3.5 10.5M3.5 3.5L10.5 10.5\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <button type=\"button\" (click)=\"generateInvoice()\"\n class=\"btn btn-primary align-items-end text-nowrap invheader\"\n [disabled]=\"!storeList.length || generatingInvoice\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\"\n stroke=\"#fff\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-1\">{{ generatingInvoice ? 'Generating...' : 'Generate Invoice' }}</span>\n </button>\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!storeList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path 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\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-1\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Monthly Billing Summary \u2014 invoice trend (newest first, with deltas vs prior month) -->\n <div class=\"monthly-billing-summary\" *ngIf=\"monthlyBillingSummary?.length\">\n <div class=\"msum-header\">Monthly Billing Summary</div>\n <div class=\"table-responsive\">\n <table class=\"table mb-0\">\n <thead>\n <tr>\n <th>MONTH</th>\n <th>NUMBER OF STORES BILLED</th>\n <th>INVOICE AMOUNT</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let row of monthlyBillingSummary; let i = index\">\n <tr *ngIf=\"i < 2 || monthlySummaryExpanded\" [class.curr]=\"row.tag === 'Current'\">\n <td>\n <strong>{{ row.monthLabel }}</strong>\n <span *ngIf=\"row.tag === 'Current'\" class=\"badge badge-light-primary ms-2\">Current</span>\n <span *ngIf=\"row.tag === 'Last generated'\" class=\"badge bg-light text-dark ms-2\">Last generated</span>\n </td>\n <td>\n <strong>{{ row.storesBilled }}</strong>\n <span *ngIf=\"row.storesDelta !== null\" class=\"ind ms-2\"\n [class.up]=\"row.storesDelta > 0\"\n [class.down]=\"row.storesDelta < 0\"\n [class.flat]=\"row.storesDelta === 0\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"row.storesDelta > 0\">\u25B2 {{ row.storesDelta }}</ng-container>\n <ng-container *ngSwitchCase=\"row.storesDelta < 0\">\u25BC {{ -row.storesDelta }}</ng-container>\n <ng-container *ngSwitchDefault>\u25AC 0</ng-container>\n </ng-container>\n </span>\n </td>\n <td>\n <strong>{{ row.currencySymbol }}{{ row.invoiceAmount | number:'1.2-2':'en-IN' }}</strong>\n <span *ngIf=\"row.amountDelta !== null\" class=\"ind ms-2\"\n [class.up]=\"row.amountDelta > 0\"\n [class.down]=\"row.amountDelta < 0\"\n [class.flat]=\"row.amountDelta === 0\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"row.amountDelta > 0\">\u25B2 {{ row.currencySymbol }}{{ row.amountDelta | number:'1.2-2':'en-IN' }}</ng-container>\n <ng-container *ngSwitchCase=\"row.amountDelta < 0\">\u25BC {{ row.currencySymbol }}{{ -row.amountDelta | number:'1.2-2':'en-IN' }}</ng-container>\n <ng-container *ngSwitchDefault>\u25AC 0</ng-container>\n </ng-container>\n </span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n <div *ngIf=\"monthlyBillingSummary.length > 2\" class=\"msum-toggle\" (click)=\"toggleMonthlySummaryHistory()\">\n <ng-container *ngIf=\"!monthlySummaryExpanded\">\u25BE Show older months ({{ monthlyBillingSummary.length - 2 }})</ng-container>\n <ng-container *ngIf=\"monthlySummaryExpanded\">\u25B4 Hide older months</ng-container>\n </div>\n </div>\n\n <!-- Additional Products \u2014 non-standard products billed for this client only\n (e.g. clientId 11: Eyetest, Planogram). Hidden when the client has none. -->\n <div class=\"monthly-billing-summary\" *ngIf=\"additionalProducts?.length\">\n <div class=\"msum-header\">Additional Products</div>\n <div class=\"table-responsive\">\n <table class=\"table mb-0\">\n <thead>\n <tr>\n <th>Product Name</th>\n <th class=\"text-end\">Quantity</th>\n <th class=\"text-end\">Price</th>\n <th class=\"text-end\">Total</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let p of additionalProducts\">\n <td>{{ p.productName }}</td>\n <td class=\"text-end\">{{ p.quantity | number:'1.0-0':'en-IN' }}</td>\n <td class=\"text-end\">{{ (additionalProductsCurrency === 'dollar' ? '$' : '\u20B9') }}{{ p.price | number:'1.2-2':'en-IN' }}</td>\n <td class=\"text-end\"><strong>{{ (additionalProductsCurrency === 'dollar' ? '$' : '\u20B9') }}{{ p.total | number:'1.2-2':'en-IN' }}</strong></td>\n </tr>\n <tr>\n <td colspan=\"3\" class=\"text-end\"><strong>Grand Total</strong></td>\n <td class=\"text-end\"><strong>{{ (additionalProductsCurrency === 'dollar' ? '$' : '\u20B9') }}{{ additionalProductsTotal | number:'1.2-2':'en-IN' }}</strong></td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Search + Filter Row -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar\">\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Store name or ID...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"storeFilterObject\" (appliedFilters)=\"applyStoreFilters($event)\"></lib-filters>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"storeLoading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- No Data -->\n <ng-container *ngIf=\"storeNoData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Stores Table -->\n <div *ngIf=\"!storeLoading && !storeNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th class=\"cursor-pointer\" (click)=\"sortData('storeName')\">STORE NAME\n <svg [ngClass]=\"sortColumName === 'storeName' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'storeName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STORE ID</th>\n <th>PRODUCTS</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('trafficCameraCount')\">TRAFFIC CAMERAS\n <svg [ngClass]=\"sortColumName === 'trafficCameraCount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'trafficCameraCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('zoneCameraCount')\">ZONE CAMERAS\n <svg [ngClass]=\"sortColumName === 'zoneCameraCount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'zoneCameraCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('zoneCount')\">ZONES\n <svg [ngClass]=\"sortColumName === 'zoneCount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'zoneCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>FIRST FILE DATE</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('daysDifference')\">WORKING DAYS\n <svg [ngClass]=\"sortColumName === 'daysDifference' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'daysDifference' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STATUS</th>\n <th class=\"text-end\">INVOICE AMOUNT</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let store of storeList\">\n <td>\n <div class=\"table-title table-title-primary\">{{ store?.storeName }}</div>\n </td>\n <td>\n <div class=\"table-title\">{{ store?.storeId }}</div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngFor=\"let product of store?.products\" class=\"badge badge-light-primary me-1\">\n {{ formatProductName(product?.productName) }}\n </span>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <div class=\"d-flex align-items-center gap-2\">\n <ng-container *ngIf=\"!isEditingField(store?.storeId, 'trafficCameraCount')\">\n <strong>{{ store?.trafficCameraCount || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startFieldEdit(store, 'trafficCameraCount')\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n <ng-container *ngIf=\"isEditingField(store?.storeId, 'trafficCameraCount')\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingField[getFieldEditKey(store?.storeId, 'trafficCameraCount')]\"\n (keydown.enter)=\"saveFieldEdit(store, 'trafficCameraCount')\"\n (keydown.escape)=\"cancelFieldEdit(store, 'trafficCameraCount')\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveFieldEdit(store, 'trafficCameraCount')\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelFieldEdit(store, 'trafficCameraCount')\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <div class=\"d-flex align-items-center gap-2\">\n <ng-container *ngIf=\"!isEditingField(store?.storeId, 'zoneCameraCount')\">\n <strong>{{ store?.zoneCameraCount || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startFieldEdit(store, 'zoneCameraCount')\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n <ng-container *ngIf=\"isEditingField(store?.storeId, 'zoneCameraCount')\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingField[getFieldEditKey(store?.storeId, 'zoneCameraCount')]\"\n (keydown.enter)=\"saveFieldEdit(store, 'zoneCameraCount')\"\n (keydown.escape)=\"cancelFieldEdit(store, 'zoneCameraCount')\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveFieldEdit(store, 'zoneCameraCount')\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelFieldEdit(store, 'zoneCameraCount')\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <div class=\"d-flex align-items-center gap-2\">\n <ng-container *ngIf=\"!isEditingField(store?.storeId, 'zoneCount')\">\n <strong>{{ store?.zoneCount || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startFieldEdit(store, 'zoneCount')\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n <ng-container *ngIf=\"isEditingField(store?.storeId, 'zoneCount')\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingField[getFieldEditKey(store?.storeId, 'zoneCount')]\"\n (keydown.enter)=\"saveFieldEdit(store, 'zoneCount')\"\n (keydown.escape)=\"cancelFieldEdit(store, 'zoneCount')\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveFieldEdit(store, 'zoneCount')\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelFieldEdit(store, 'zoneCount')\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ store?.edgefirstFileDate ? (store?.edgefirstFileDate | date: 'dd MMM yyyy') : '\u2014' }}</div>\n </td>\n <td>\n <div class=\"table-title\" *ngFor=\"let product of store?.products\">\n <div class=\"d-flex align-items-center gap-2 mb-1\">\n <span class=\"small text-muted\">{{ formatProductName(product?.productName) }}:</span>\n\n <!-- View mode -->\n <ng-container *ngIf=\"!isEditing(store?.storeId, product?.productName)\">\n <strong>{{ product?.workingdays || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startEdit(store, product)\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n\n <!-- Edit mode -->\n <ng-container *ngIf=\"isEditing(store?.storeId, product?.productName)\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingProduct[getEditKey(store?.storeId, product?.productName)]\"\n (keydown.enter)=\"saveWorkingDays(store, product)\"\n (keydown.escape)=\"cancelEdit(store, product)\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveWorkingDays(store, product)\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelEdit(store, product)\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"mt-3\" [ngClass]=\"store?.status === 'active' ? 'badge badge-light-success' : 'badge badge-light-danger'\">\n {{ store?.status }}\n </div>\n </td>\n <td class=\"text-end\">\n <!-- Per-product breakdown (Traffic: \u20B9x, Zone: \u20B9y \u2026) + total. -->\n <div *ngFor=\"let b of store?.invoiceBreakdown\" class=\"inv-breakdown-row\">\n <span class=\"inv-breakdown-label\">{{ b.label }}:</span>\n {{ storeCurrencySymbol(store) }}{{ (b.amount || 0) | number:'1.2-2':'en-IN' }}\n </div>\n <div class=\"table-title inv-breakdown-total\">\n <strong>{{ storeCurrencySymbol(store) }}{{ (store?.invoiceAmount || 0) | number:'1.2-2':'en-IN' }}</strong>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div *ngIf=\"!storeLoading && !storeNoData\">\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </div>\n</div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.rotate{rotate:180deg;transition:1s}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.billingheader{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.table-title{font-family:Inter;font-size:14px;font-weight:500;line-height:3!important}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:3!important}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.edit-input{width:70px!important;padding:4px 8px!important;font-size:13px!important;text-align:center;border-radius:6px!important}.edit-icon{opacity:.4;transition:opacity .2s}.edit-icon:hover{opacity:1}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.date-filter{border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:8px;font-family:Inter;font-size:14px;color:var(--Gray-700, #344054);padding:6px 12px;min-width:160px}.monthly-billing-summary{border:1px solid #E4E7EC;border-radius:12px;margin:0 0 18px;overflow:hidden;background:#fff}.monthly-billing-summary .msum-header{padding:12px 18px;font-weight:700;color:#101828;background:#f9fafb;border-bottom:1px solid #E4E7EC;font-size:14px}.monthly-billing-summary table{margin:0}.monthly-billing-summary table thead th{background:#fff;font-size:11.5px;letter-spacing:.04em;color:#8a93a2;font-weight:600;text-transform:uppercase;padding:12px 18px;border-bottom:1px solid #E4E7EC}.monthly-billing-summary table tbody td{padding:14px 18px;font-size:13.5px;color:#344054;border-bottom:1px solid #E4E7EC;vertical-align:middle}.monthly-billing-summary table tbody tr:last-child td{border-bottom:0}.monthly-billing-summary table tbody tr.curr{background:#f5faff}.monthly-billing-summary .ind{font-size:11.5px;font-weight:700;white-space:nowrap}.monthly-billing-summary .ind.up{color:#138a52}.monthly-billing-summary .ind.down{color:#d64545}.monthly-billing-summary .ind.flat{color:#98a2b3}.monthly-billing-summary .msum-toggle{padding:11px 18px;text-align:center;color:#00a3ff;font-weight:600;font-size:13px;background:#f9fafb;border-top:1px solid #E4E7EC;cursor:pointer;-webkit-user-select:none;user-select:none}.monthly-billing-summary .msum-toggle:hover{background:#f2f6fb}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}.inv-breakdown-row{font-size:12px;color:#667085;line-height:1.5}.inv-breakdown-label{color:#98a2b3;margin-right:4px}.inv-breakdown-total{border-top:1px solid #eceef1;margin-top:4px;padding-top:4px;color:#101828}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i5.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: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i2.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.DatePipe, name: "date" }] });
450
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DailyPricingComponent, selector: "lib-daily-pricing", inputs: { clientId: "clientId" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"invoices-section\">\n <!-- Header Row -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"billingheader\">Billing Breakdown</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ totalItems }} stores</span>\n </div>\n <div class=\"text-muted small mt-1\" *ngIf=\"dailyPricingInfo?.dateString\">\n Date: <strong>{{ dailyPricingInfo?.dateString }}</strong>\n <span class=\"mx-2\">|</span>\n Active Stores: <strong>{{ dailyPricingInfo?.activeStores }}</strong>\n <span class=\"mx-2\">|</span>\n Account Type: <strong>{{ dailyPricingInfo?.accountType }}</strong>\n </div>\n </div>\n <div class=\"d-flex align-items-center gap-3\">\n <div class=\"d-flex align-items-center gap-2\">\n <input type=\"date\" class=\"form-control form-control-sm date-filter\"\n [value]=\"dateFilter\"\n (change)=\"onDateFilter($event)\"\n placeholder=\"Filter by date\">\n <button *ngIf=\"dateFilter\" type=\"button\" class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"clearDateFilter()\" title=\"Clear date filter\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M10.5 3.5L3.5 10.5M3.5 3.5L10.5 10.5\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <button type=\"button\" (click)=\"generateInvoice()\"\n class=\"btn btn-primary align-items-end text-nowrap invheader\"\n [disabled]=\"!storeList.length || generatingInvoice\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\"\n stroke=\"#fff\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-1\">{{ generatingInvoice ? 'Generating...' : 'Generate Invoice' }}</span>\n </button>\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!storeList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path 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\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-1\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Newly Onboarded Stores \u2014 stores whose first file date is in the current month -->\n <div class=\"d-flex mb-4\">\n <div class=\"newly-onboarded-card\"\n style=\"display:flex;align-items:center;gap:14px;border:1px solid #E4E7EC;border-radius:10px;padding:14px 18px;background:#fff;min-width:240px;\">\n <div style=\"width:40px;height:40px;border-radius:8px;background:#EAF8FF;display:flex;align-items:center;justify-content:center;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M3 21V8l9-5 9 5v13M3 21h18M3 21H1m20 0h2M9 21v-6h6v6M12 7.5h.01\" stroke=\"#00A3FF\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div>\n <div style=\"font-size:24px;font-weight:700;color:#101828;line-height:1.1;\">{{ newlyOnboardedStores | number:'1.0-0':'en-IN' }}</div>\n <div style=\"font-size:13px;color:#667085;\">Newly Onboarded Stores</div>\n <div style=\"font-size:11px;color:#98A2B3;\">First file in current month</div>\n </div>\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary ms-3\"\n [disabled]=\"!newlyOnboardedStores\"\n (click)=\"viewNewStores()\">View Stores</button>\n </div>\n </div>\n\n <!-- Monthly Billing Summary \u2014 invoice trend (newest first, with deltas vs prior month) -->\n <div class=\"monthly-billing-summary\" *ngIf=\"monthlyBillingSummary?.length\">\n <div class=\"msum-header\">Monthly Billing Summary</div>\n <div class=\"table-responsive\">\n <table class=\"table mb-0\">\n <thead>\n <tr>\n <th>MONTH</th>\n <th>NUMBER OF STORES BILLED</th>\n <th>INVOICE AMOUNT</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let row of monthlyBillingSummary; let i = index\">\n <tr *ngIf=\"i < 2 || monthlySummaryExpanded\" [class.curr]=\"row.tag === 'Current'\">\n <td>\n <strong>{{ row.monthLabel }}</strong>\n <span *ngIf=\"row.tag === 'Current'\" class=\"badge badge-light-primary ms-2\">Current</span>\n <span *ngIf=\"row.tag === 'Last generated'\" class=\"badge bg-light text-dark ms-2\">Last generated</span>\n </td>\n <td>\n <strong>{{ row.storesBilled }}</strong>\n <span *ngIf=\"row.storesDelta !== null\" class=\"ind ms-2\"\n [class.up]=\"row.storesDelta > 0\"\n [class.down]=\"row.storesDelta < 0\"\n [class.flat]=\"row.storesDelta === 0\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"row.storesDelta > 0\">\u25B2 {{ row.storesDelta }}</ng-container>\n <ng-container *ngSwitchCase=\"row.storesDelta < 0\">\u25BC {{ -row.storesDelta }}</ng-container>\n <ng-container *ngSwitchDefault>\u25AC 0</ng-container>\n </ng-container>\n </span>\n </td>\n <td>\n <strong>{{ row.currencySymbol }}{{ row.invoiceAmount | number:'1.2-2':'en-IN' }}</strong>\n <span *ngIf=\"row.amountDelta !== null\" class=\"ind ms-2\"\n [class.up]=\"row.amountDelta > 0\"\n [class.down]=\"row.amountDelta < 0\"\n [class.flat]=\"row.amountDelta === 0\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"row.amountDelta > 0\">\u25B2 {{ row.currencySymbol }}{{ row.amountDelta | number:'1.2-2':'en-IN' }}</ng-container>\n <ng-container *ngSwitchCase=\"row.amountDelta < 0\">\u25BC {{ row.currencySymbol }}{{ -row.amountDelta | number:'1.2-2':'en-IN' }}</ng-container>\n <ng-container *ngSwitchDefault>\u25AC 0</ng-container>\n </ng-container>\n </span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n <div *ngIf=\"monthlyBillingSummary.length > 2\" class=\"msum-toggle\" (click)=\"toggleMonthlySummaryHistory()\">\n <ng-container *ngIf=\"!monthlySummaryExpanded\">\u25BE Show older months ({{ monthlyBillingSummary.length - 2 }})</ng-container>\n <ng-container *ngIf=\"monthlySummaryExpanded\">\u25B4 Hide older months</ng-container>\n </div>\n </div>\n\n <!-- Additional Products \u2014 non-standard products billed for this client only\n (e.g. clientId 11: Eyetest, Planogram). Hidden when the client has none. -->\n <div class=\"monthly-billing-summary\" *ngIf=\"additionalProducts?.length\">\n <div class=\"msum-header\">Additional Products</div>\n <div class=\"table-responsive\">\n <table class=\"table mb-0\">\n <thead>\n <tr>\n <th>Product Name</th>\n <th class=\"text-end\">Quantity</th>\n <th class=\"text-end\">Price</th>\n <th class=\"text-end\">Total</th>\n <th class=\"text-center\">Action</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let p of additionalProducts\">\n <td>{{ p.productName }}</td>\n <td class=\"text-end\">{{ p.quantity | number:'1.0-0':'en-IN' }}</td>\n <td class=\"text-end\">{{ (additionalProductsCurrency === 'dollar' ? '$' : '\u20B9') }}{{ p.price | number:'1.2-2':'en-IN' }}</td>\n <td class=\"text-end\"><strong>{{ (additionalProductsCurrency === 'dollar' ? '$' : '\u20B9') }}{{ p.total | number:'1.2-2':'en-IN' }}</strong></td>\n <td class=\"text-center\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\"\n *ngIf=\"canExportAdditionalProduct(p.productName)\"\n (click)=\"exportAdditionalProduct(p.productName)\">\n Download\n </button>\n </td>\n </tr>\n <tr>\n <td colspan=\"3\" class=\"text-end\"><strong>Grand Total</strong></td>\n <td class=\"text-end\"><strong>{{ (additionalProductsCurrency === 'dollar' ? '$' : '\u20B9') }}{{ additionalProductsTotal | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Search + Filter Row -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar\">\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Store name or ID...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"storeFilterObject\" (appliedFilters)=\"applyStoreFilters($event)\"></lib-filters>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"storeLoading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- No Data -->\n <ng-container *ngIf=\"storeNoData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Stores Table -->\n <div *ngIf=\"!storeLoading && !storeNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th class=\"cursor-pointer\" (click)=\"sortData('storeName')\">STORE NAME\n <svg [ngClass]=\"sortColumName === 'storeName' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'storeName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STORE ID</th>\n <th>PRODUCTS</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('trafficCameraCount')\">TRAFFIC CAMERAS\n <svg [ngClass]=\"sortColumName === 'trafficCameraCount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'trafficCameraCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('zoneCameraCount')\">ZONE CAMERAS\n <svg [ngClass]=\"sortColumName === 'zoneCameraCount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'zoneCameraCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('zoneCount')\">ZONES\n <svg [ngClass]=\"sortColumName === 'zoneCount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'zoneCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>FIRST FILE DATE</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('daysDifference')\">WORKING DAYS\n <svg [ngClass]=\"sortColumName === 'daysDifference' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'daysDifference' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STATUS</th>\n <th class=\"text-end\">INVOICE AMOUNT</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let store of storeList\">\n <td>\n <div class=\"table-title table-title-primary\">{{ store?.storeName }}</div>\n </td>\n <td>\n <div class=\"table-title\">{{ store?.storeId }}</div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngFor=\"let product of store?.products\" class=\"badge badge-light-primary me-1\">\n {{ formatProductName(product?.productName) }}\n </span>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <div class=\"d-flex align-items-center gap-2\">\n <ng-container *ngIf=\"!isEditingField(store?.storeId, 'trafficCameraCount')\">\n <strong>{{ store?.trafficCameraCount || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startFieldEdit(store, 'trafficCameraCount')\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n <ng-container *ngIf=\"isEditingField(store?.storeId, 'trafficCameraCount')\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingField[getFieldEditKey(store?.storeId, 'trafficCameraCount')]\"\n (keydown.enter)=\"saveFieldEdit(store, 'trafficCameraCount')\"\n (keydown.escape)=\"cancelFieldEdit(store, 'trafficCameraCount')\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveFieldEdit(store, 'trafficCameraCount')\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelFieldEdit(store, 'trafficCameraCount')\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <div class=\"d-flex align-items-center gap-2\">\n <ng-container *ngIf=\"!isEditingField(store?.storeId, 'zoneCameraCount')\">\n <strong>{{ store?.zoneCameraCount || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startFieldEdit(store, 'zoneCameraCount')\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n <ng-container *ngIf=\"isEditingField(store?.storeId, 'zoneCameraCount')\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingField[getFieldEditKey(store?.storeId, 'zoneCameraCount')]\"\n (keydown.enter)=\"saveFieldEdit(store, 'zoneCameraCount')\"\n (keydown.escape)=\"cancelFieldEdit(store, 'zoneCameraCount')\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveFieldEdit(store, 'zoneCameraCount')\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelFieldEdit(store, 'zoneCameraCount')\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <div class=\"d-flex align-items-center gap-2\">\n <ng-container *ngIf=\"!isEditingField(store?.storeId, 'zoneCount')\">\n <strong>{{ store?.zoneCount || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startFieldEdit(store, 'zoneCount')\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n <ng-container *ngIf=\"isEditingField(store?.storeId, 'zoneCount')\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingField[getFieldEditKey(store?.storeId, 'zoneCount')]\"\n (keydown.enter)=\"saveFieldEdit(store, 'zoneCount')\"\n (keydown.escape)=\"cancelFieldEdit(store, 'zoneCount')\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveFieldEdit(store, 'zoneCount')\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelFieldEdit(store, 'zoneCount')\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ store?.edgefirstFileDate ? (store?.edgefirstFileDate | date: 'dd MMM yyyy') : '\u2014' }}</div>\n </td>\n <td>\n <div class=\"table-title\" *ngFor=\"let product of store?.products\">\n <div class=\"d-flex align-items-center gap-2 mb-1\">\n <span class=\"small text-muted\">{{ formatProductName(product?.productName) }}:</span>\n\n <!-- View mode -->\n <ng-container *ngIf=\"!isEditing(store?.storeId, product?.productName)\">\n <strong>{{ product?.workingdays || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startEdit(store, product)\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n\n <!-- Edit mode -->\n <ng-container *ngIf=\"isEditing(store?.storeId, product?.productName)\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingProduct[getEditKey(store?.storeId, product?.productName)]\"\n (keydown.enter)=\"saveWorkingDays(store, product)\"\n (keydown.escape)=\"cancelEdit(store, product)\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveWorkingDays(store, product)\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelEdit(store, product)\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"mt-3\" [ngClass]=\"store?.status === 'active' ? 'badge badge-light-success' : 'badge badge-light-danger'\">\n {{ store?.status }}\n </div>\n </td>\n <td class=\"text-end\">\n <!-- Per-product breakdown (Traffic: \u20B9x, Zone: \u20B9y \u2026) + total. -->\n <div *ngFor=\"let b of store?.invoiceBreakdown\" class=\"inv-breakdown-row\">\n <span class=\"inv-breakdown-label\">{{ b.label }}:</span>\n {{ storeCurrencySymbol(store) }}{{ (b.amount || 0) | number:'1.2-2':'en-IN' }}\n </div>\n <div class=\"table-title inv-breakdown-total\">\n <strong>{{ storeCurrencySymbol(store) }}{{ (store?.invoiceAmount || 0) | number:'1.2-2':'en-IN' }}</strong>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div *ngIf=\"!storeLoading && !storeNoData\">\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </div>\n</div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.rotate{rotate:180deg;transition:1s}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.billingheader{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.table-title{font-family:Inter;font-size:14px;font-weight:500;line-height:3!important}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:3!important}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.edit-input{width:70px!important;padding:4px 8px!important;font-size:13px!important;text-align:center;border-radius:6px!important}.edit-icon{opacity:.4;transition:opacity .2s}.edit-icon:hover{opacity:1}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.date-filter{border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:8px;font-family:Inter;font-size:14px;color:var(--Gray-700, #344054);padding:6px 12px;min-width:160px}.monthly-billing-summary{border:1px solid #E4E7EC;border-radius:12px;margin:0 0 18px;overflow:hidden;background:#fff}.monthly-billing-summary .msum-header{padding:12px 18px;font-weight:700;color:#101828;background:#f9fafb;border-bottom:1px solid #E4E7EC;font-size:14px}.monthly-billing-summary table{margin:0}.monthly-billing-summary table thead th{background:#fff;font-size:11.5px;letter-spacing:.04em;color:#8a93a2;font-weight:600;text-transform:uppercase;padding:12px 18px;border-bottom:1px solid #E4E7EC}.monthly-billing-summary table tbody td{padding:14px 18px;font-size:13.5px;color:#344054;border-bottom:1px solid #E4E7EC;vertical-align:middle}.monthly-billing-summary table tbody tr:last-child td{border-bottom:0}.monthly-billing-summary table tbody tr.curr{background:#f5faff}.monthly-billing-summary .ind{font-size:11.5px;font-weight:700;white-space:nowrap}.monthly-billing-summary .ind.up{color:#138a52}.monthly-billing-summary .ind.down{color:#d64545}.monthly-billing-summary .ind.flat{color:#98a2b3}.monthly-billing-summary .msum-toggle{padding:11px 18px;text-align:center;color:#00a3ff;font-weight:600;font-size:13px;background:#f9fafb;border-top:1px solid #E4E7EC;cursor:pointer;-webkit-user-select:none;user-select:none}.monthly-billing-summary .msum-toggle:hover{background:#f2f6fb}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}.inv-breakdown-row{font-size:12px;color:#667085;line-height:1.5}.inv-breakdown-label{color:#98a2b3;margin-right:4px}.inv-breakdown-total{border-top:1px solid #eceef1;margin-top:4px;padding-top:4px;color:#101828}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i5.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: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i2.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.DatePipe, name: "date" }] });
387
451
  }
388
452
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DailyPricingComponent, decorators: [{
389
453
  type: Component,
390
- args: [{ selector: 'lib-daily-pricing', template: "<div class=\"invoices-section\">\n <!-- Header Row -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"billingheader\">Billing Breakdown</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ totalItems }} stores</span>\n </div>\n <div class=\"text-muted small mt-1\" *ngIf=\"dailyPricingInfo?.dateString\">\n Date: <strong>{{ dailyPricingInfo?.dateString }}</strong>\n <span class=\"mx-2\">|</span>\n Active Stores: <strong>{{ dailyPricingInfo?.activeStores }}</strong>\n <span class=\"mx-2\">|</span>\n Account Type: <strong>{{ dailyPricingInfo?.accountType }}</strong>\n </div>\n </div>\n <div class=\"d-flex align-items-center gap-3\">\n <div class=\"d-flex align-items-center gap-2\">\n <input type=\"date\" class=\"form-control form-control-sm date-filter\"\n [value]=\"dateFilter\"\n (change)=\"onDateFilter($event)\"\n placeholder=\"Filter by date\">\n <button *ngIf=\"dateFilter\" type=\"button\" class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"clearDateFilter()\" title=\"Clear date filter\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M10.5 3.5L3.5 10.5M3.5 3.5L10.5 10.5\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <button type=\"button\" (click)=\"generateInvoice()\"\n class=\"btn btn-primary align-items-end text-nowrap invheader\"\n [disabled]=\"!storeList.length || generatingInvoice\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\"\n stroke=\"#fff\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-1\">{{ generatingInvoice ? 'Generating...' : 'Generate Invoice' }}</span>\n </button>\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!storeList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path 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\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-1\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Monthly Billing Summary \u2014 invoice trend (newest first, with deltas vs prior month) -->\n <div class=\"monthly-billing-summary\" *ngIf=\"monthlyBillingSummary?.length\">\n <div class=\"msum-header\">Monthly Billing Summary</div>\n <div class=\"table-responsive\">\n <table class=\"table mb-0\">\n <thead>\n <tr>\n <th>MONTH</th>\n <th>NUMBER OF STORES BILLED</th>\n <th>INVOICE AMOUNT</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let row of monthlyBillingSummary; let i = index\">\n <tr *ngIf=\"i < 2 || monthlySummaryExpanded\" [class.curr]=\"row.tag === 'Current'\">\n <td>\n <strong>{{ row.monthLabel }}</strong>\n <span *ngIf=\"row.tag === 'Current'\" class=\"badge badge-light-primary ms-2\">Current</span>\n <span *ngIf=\"row.tag === 'Last generated'\" class=\"badge bg-light text-dark ms-2\">Last generated</span>\n </td>\n <td>\n <strong>{{ row.storesBilled }}</strong>\n <span *ngIf=\"row.storesDelta !== null\" class=\"ind ms-2\"\n [class.up]=\"row.storesDelta > 0\"\n [class.down]=\"row.storesDelta < 0\"\n [class.flat]=\"row.storesDelta === 0\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"row.storesDelta > 0\">\u25B2 {{ row.storesDelta }}</ng-container>\n <ng-container *ngSwitchCase=\"row.storesDelta < 0\">\u25BC {{ -row.storesDelta }}</ng-container>\n <ng-container *ngSwitchDefault>\u25AC 0</ng-container>\n </ng-container>\n </span>\n </td>\n <td>\n <strong>{{ row.currencySymbol }}{{ row.invoiceAmount | number:'1.2-2':'en-IN' }}</strong>\n <span *ngIf=\"row.amountDelta !== null\" class=\"ind ms-2\"\n [class.up]=\"row.amountDelta > 0\"\n [class.down]=\"row.amountDelta < 0\"\n [class.flat]=\"row.amountDelta === 0\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"row.amountDelta > 0\">\u25B2 {{ row.currencySymbol }}{{ row.amountDelta | number:'1.2-2':'en-IN' }}</ng-container>\n <ng-container *ngSwitchCase=\"row.amountDelta < 0\">\u25BC {{ row.currencySymbol }}{{ -row.amountDelta | number:'1.2-2':'en-IN' }}</ng-container>\n <ng-container *ngSwitchDefault>\u25AC 0</ng-container>\n </ng-container>\n </span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n <div *ngIf=\"monthlyBillingSummary.length > 2\" class=\"msum-toggle\" (click)=\"toggleMonthlySummaryHistory()\">\n <ng-container *ngIf=\"!monthlySummaryExpanded\">\u25BE Show older months ({{ monthlyBillingSummary.length - 2 }})</ng-container>\n <ng-container *ngIf=\"monthlySummaryExpanded\">\u25B4 Hide older months</ng-container>\n </div>\n </div>\n\n <!-- Additional Products \u2014 non-standard products billed for this client only\n (e.g. clientId 11: Eyetest, Planogram). Hidden when the client has none. -->\n <div class=\"monthly-billing-summary\" *ngIf=\"additionalProducts?.length\">\n <div class=\"msum-header\">Additional Products</div>\n <div class=\"table-responsive\">\n <table class=\"table mb-0\">\n <thead>\n <tr>\n <th>Product Name</th>\n <th class=\"text-end\">Quantity</th>\n <th class=\"text-end\">Price</th>\n <th class=\"text-end\">Total</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let p of additionalProducts\">\n <td>{{ p.productName }}</td>\n <td class=\"text-end\">{{ p.quantity | number:'1.0-0':'en-IN' }}</td>\n <td class=\"text-end\">{{ (additionalProductsCurrency === 'dollar' ? '$' : '\u20B9') }}{{ p.price | number:'1.2-2':'en-IN' }}</td>\n <td class=\"text-end\"><strong>{{ (additionalProductsCurrency === 'dollar' ? '$' : '\u20B9') }}{{ p.total | number:'1.2-2':'en-IN' }}</strong></td>\n </tr>\n <tr>\n <td colspan=\"3\" class=\"text-end\"><strong>Grand Total</strong></td>\n <td class=\"text-end\"><strong>{{ (additionalProductsCurrency === 'dollar' ? '$' : '\u20B9') }}{{ additionalProductsTotal | number:'1.2-2':'en-IN' }}</strong></td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Search + Filter Row -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar\">\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Store name or ID...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"storeFilterObject\" (appliedFilters)=\"applyStoreFilters($event)\"></lib-filters>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"storeLoading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- No Data -->\n <ng-container *ngIf=\"storeNoData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Stores Table -->\n <div *ngIf=\"!storeLoading && !storeNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th class=\"cursor-pointer\" (click)=\"sortData('storeName')\">STORE NAME\n <svg [ngClass]=\"sortColumName === 'storeName' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'storeName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STORE ID</th>\n <th>PRODUCTS</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('trafficCameraCount')\">TRAFFIC CAMERAS\n <svg [ngClass]=\"sortColumName === 'trafficCameraCount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'trafficCameraCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('zoneCameraCount')\">ZONE CAMERAS\n <svg [ngClass]=\"sortColumName === 'zoneCameraCount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'zoneCameraCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('zoneCount')\">ZONES\n <svg [ngClass]=\"sortColumName === 'zoneCount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'zoneCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>FIRST FILE DATE</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('daysDifference')\">WORKING DAYS\n <svg [ngClass]=\"sortColumName === 'daysDifference' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'daysDifference' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STATUS</th>\n <th class=\"text-end\">INVOICE AMOUNT</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let store of storeList\">\n <td>\n <div class=\"table-title table-title-primary\">{{ store?.storeName }}</div>\n </td>\n <td>\n <div class=\"table-title\">{{ store?.storeId }}</div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngFor=\"let product of store?.products\" class=\"badge badge-light-primary me-1\">\n {{ formatProductName(product?.productName) }}\n </span>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <div class=\"d-flex align-items-center gap-2\">\n <ng-container *ngIf=\"!isEditingField(store?.storeId, 'trafficCameraCount')\">\n <strong>{{ store?.trafficCameraCount || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startFieldEdit(store, 'trafficCameraCount')\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n <ng-container *ngIf=\"isEditingField(store?.storeId, 'trafficCameraCount')\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingField[getFieldEditKey(store?.storeId, 'trafficCameraCount')]\"\n (keydown.enter)=\"saveFieldEdit(store, 'trafficCameraCount')\"\n (keydown.escape)=\"cancelFieldEdit(store, 'trafficCameraCount')\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveFieldEdit(store, 'trafficCameraCount')\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelFieldEdit(store, 'trafficCameraCount')\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <div class=\"d-flex align-items-center gap-2\">\n <ng-container *ngIf=\"!isEditingField(store?.storeId, 'zoneCameraCount')\">\n <strong>{{ store?.zoneCameraCount || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startFieldEdit(store, 'zoneCameraCount')\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n <ng-container *ngIf=\"isEditingField(store?.storeId, 'zoneCameraCount')\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingField[getFieldEditKey(store?.storeId, 'zoneCameraCount')]\"\n (keydown.enter)=\"saveFieldEdit(store, 'zoneCameraCount')\"\n (keydown.escape)=\"cancelFieldEdit(store, 'zoneCameraCount')\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveFieldEdit(store, 'zoneCameraCount')\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelFieldEdit(store, 'zoneCameraCount')\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <div class=\"d-flex align-items-center gap-2\">\n <ng-container *ngIf=\"!isEditingField(store?.storeId, 'zoneCount')\">\n <strong>{{ store?.zoneCount || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startFieldEdit(store, 'zoneCount')\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n <ng-container *ngIf=\"isEditingField(store?.storeId, 'zoneCount')\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingField[getFieldEditKey(store?.storeId, 'zoneCount')]\"\n (keydown.enter)=\"saveFieldEdit(store, 'zoneCount')\"\n (keydown.escape)=\"cancelFieldEdit(store, 'zoneCount')\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveFieldEdit(store, 'zoneCount')\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelFieldEdit(store, 'zoneCount')\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ store?.edgefirstFileDate ? (store?.edgefirstFileDate | date: 'dd MMM yyyy') : '\u2014' }}</div>\n </td>\n <td>\n <div class=\"table-title\" *ngFor=\"let product of store?.products\">\n <div class=\"d-flex align-items-center gap-2 mb-1\">\n <span class=\"small text-muted\">{{ formatProductName(product?.productName) }}:</span>\n\n <!-- View mode -->\n <ng-container *ngIf=\"!isEditing(store?.storeId, product?.productName)\">\n <strong>{{ product?.workingdays || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startEdit(store, product)\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n\n <!-- Edit mode -->\n <ng-container *ngIf=\"isEditing(store?.storeId, product?.productName)\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingProduct[getEditKey(store?.storeId, product?.productName)]\"\n (keydown.enter)=\"saveWorkingDays(store, product)\"\n (keydown.escape)=\"cancelEdit(store, product)\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveWorkingDays(store, product)\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelEdit(store, product)\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"mt-3\" [ngClass]=\"store?.status === 'active' ? 'badge badge-light-success' : 'badge badge-light-danger'\">\n {{ store?.status }}\n </div>\n </td>\n <td class=\"text-end\">\n <!-- Per-product breakdown (Traffic: \u20B9x, Zone: \u20B9y \u2026) + total. -->\n <div *ngFor=\"let b of store?.invoiceBreakdown\" class=\"inv-breakdown-row\">\n <span class=\"inv-breakdown-label\">{{ b.label }}:</span>\n {{ storeCurrencySymbol(store) }}{{ (b.amount || 0) | number:'1.2-2':'en-IN' }}\n </div>\n <div class=\"table-title inv-breakdown-total\">\n <strong>{{ storeCurrencySymbol(store) }}{{ (store?.invoiceAmount || 0) | number:'1.2-2':'en-IN' }}</strong>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div *ngIf=\"!storeLoading && !storeNoData\">\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </div>\n</div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.rotate{rotate:180deg;transition:1s}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.billingheader{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.table-title{font-family:Inter;font-size:14px;font-weight:500;line-height:3!important}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:3!important}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.edit-input{width:70px!important;padding:4px 8px!important;font-size:13px!important;text-align:center;border-radius:6px!important}.edit-icon{opacity:.4;transition:opacity .2s}.edit-icon:hover{opacity:1}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.date-filter{border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:8px;font-family:Inter;font-size:14px;color:var(--Gray-700, #344054);padding:6px 12px;min-width:160px}.monthly-billing-summary{border:1px solid #E4E7EC;border-radius:12px;margin:0 0 18px;overflow:hidden;background:#fff}.monthly-billing-summary .msum-header{padding:12px 18px;font-weight:700;color:#101828;background:#f9fafb;border-bottom:1px solid #E4E7EC;font-size:14px}.monthly-billing-summary table{margin:0}.monthly-billing-summary table thead th{background:#fff;font-size:11.5px;letter-spacing:.04em;color:#8a93a2;font-weight:600;text-transform:uppercase;padding:12px 18px;border-bottom:1px solid #E4E7EC}.monthly-billing-summary table tbody td{padding:14px 18px;font-size:13.5px;color:#344054;border-bottom:1px solid #E4E7EC;vertical-align:middle}.monthly-billing-summary table tbody tr:last-child td{border-bottom:0}.monthly-billing-summary table tbody tr.curr{background:#f5faff}.monthly-billing-summary .ind{font-size:11.5px;font-weight:700;white-space:nowrap}.monthly-billing-summary .ind.up{color:#138a52}.monthly-billing-summary .ind.down{color:#d64545}.monthly-billing-summary .ind.flat{color:#98a2b3}.monthly-billing-summary .msum-toggle{padding:11px 18px;text-align:center;color:#00a3ff;font-weight:600;font-size:13px;background:#f9fafb;border-top:1px solid #E4E7EC;cursor:pointer;-webkit-user-select:none;user-select:none}.monthly-billing-summary .msum-toggle:hover{background:#f2f6fb}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}.inv-breakdown-row{font-size:12px;color:#667085;line-height:1.5}.inv-breakdown-label{color:#98a2b3;margin-right:4px}.inv-breakdown-total{border-top:1px solid #eceef1;margin-top:4px;padding-top:4px;color:#101828}\n"] }]
454
+ args: [{ selector: 'lib-daily-pricing', template: "<div class=\"invoices-section\">\n <!-- Header Row -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"billingheader\">Billing Breakdown</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ totalItems }} stores</span>\n </div>\n <div class=\"text-muted small mt-1\" *ngIf=\"dailyPricingInfo?.dateString\">\n Date: <strong>{{ dailyPricingInfo?.dateString }}</strong>\n <span class=\"mx-2\">|</span>\n Active Stores: <strong>{{ dailyPricingInfo?.activeStores }}</strong>\n <span class=\"mx-2\">|</span>\n Account Type: <strong>{{ dailyPricingInfo?.accountType }}</strong>\n </div>\n </div>\n <div class=\"d-flex align-items-center gap-3\">\n <div class=\"d-flex align-items-center gap-2\">\n <input type=\"date\" class=\"form-control form-control-sm date-filter\"\n [value]=\"dateFilter\"\n (change)=\"onDateFilter($event)\"\n placeholder=\"Filter by date\">\n <button *ngIf=\"dateFilter\" type=\"button\" class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"clearDateFilter()\" title=\"Clear date filter\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M10.5 3.5L3.5 10.5M3.5 3.5L10.5 10.5\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <button type=\"button\" (click)=\"generateInvoice()\"\n class=\"btn btn-primary align-items-end text-nowrap invheader\"\n [disabled]=\"!storeList.length || generatingInvoice\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\"\n stroke=\"#fff\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-1\">{{ generatingInvoice ? 'Generating...' : 'Generate Invoice' }}</span>\n </button>\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!storeList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path 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\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-1\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Newly Onboarded Stores \u2014 stores whose first file date is in the current month -->\n <div class=\"d-flex mb-4\">\n <div class=\"newly-onboarded-card\"\n style=\"display:flex;align-items:center;gap:14px;border:1px solid #E4E7EC;border-radius:10px;padding:14px 18px;background:#fff;min-width:240px;\">\n <div style=\"width:40px;height:40px;border-radius:8px;background:#EAF8FF;display:flex;align-items:center;justify-content:center;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M3 21V8l9-5 9 5v13M3 21h18M3 21H1m20 0h2M9 21v-6h6v6M12 7.5h.01\" stroke=\"#00A3FF\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div>\n <div style=\"font-size:24px;font-weight:700;color:#101828;line-height:1.1;\">{{ newlyOnboardedStores | number:'1.0-0':'en-IN' }}</div>\n <div style=\"font-size:13px;color:#667085;\">Newly Onboarded Stores</div>\n <div style=\"font-size:11px;color:#98A2B3;\">First file in current month</div>\n </div>\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary ms-3\"\n [disabled]=\"!newlyOnboardedStores\"\n (click)=\"viewNewStores()\">View Stores</button>\n </div>\n </div>\n\n <!-- Monthly Billing Summary \u2014 invoice trend (newest first, with deltas vs prior month) -->\n <div class=\"monthly-billing-summary\" *ngIf=\"monthlyBillingSummary?.length\">\n <div class=\"msum-header\">Monthly Billing Summary</div>\n <div class=\"table-responsive\">\n <table class=\"table mb-0\">\n <thead>\n <tr>\n <th>MONTH</th>\n <th>NUMBER OF STORES BILLED</th>\n <th>INVOICE AMOUNT</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let row of monthlyBillingSummary; let i = index\">\n <tr *ngIf=\"i < 2 || monthlySummaryExpanded\" [class.curr]=\"row.tag === 'Current'\">\n <td>\n <strong>{{ row.monthLabel }}</strong>\n <span *ngIf=\"row.tag === 'Current'\" class=\"badge badge-light-primary ms-2\">Current</span>\n <span *ngIf=\"row.tag === 'Last generated'\" class=\"badge bg-light text-dark ms-2\">Last generated</span>\n </td>\n <td>\n <strong>{{ row.storesBilled }}</strong>\n <span *ngIf=\"row.storesDelta !== null\" class=\"ind ms-2\"\n [class.up]=\"row.storesDelta > 0\"\n [class.down]=\"row.storesDelta < 0\"\n [class.flat]=\"row.storesDelta === 0\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"row.storesDelta > 0\">\u25B2 {{ row.storesDelta }}</ng-container>\n <ng-container *ngSwitchCase=\"row.storesDelta < 0\">\u25BC {{ -row.storesDelta }}</ng-container>\n <ng-container *ngSwitchDefault>\u25AC 0</ng-container>\n </ng-container>\n </span>\n </td>\n <td>\n <strong>{{ row.currencySymbol }}{{ row.invoiceAmount | number:'1.2-2':'en-IN' }}</strong>\n <span *ngIf=\"row.amountDelta !== null\" class=\"ind ms-2\"\n [class.up]=\"row.amountDelta > 0\"\n [class.down]=\"row.amountDelta < 0\"\n [class.flat]=\"row.amountDelta === 0\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"row.amountDelta > 0\">\u25B2 {{ row.currencySymbol }}{{ row.amountDelta | number:'1.2-2':'en-IN' }}</ng-container>\n <ng-container *ngSwitchCase=\"row.amountDelta < 0\">\u25BC {{ row.currencySymbol }}{{ -row.amountDelta | number:'1.2-2':'en-IN' }}</ng-container>\n <ng-container *ngSwitchDefault>\u25AC 0</ng-container>\n </ng-container>\n </span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n <div *ngIf=\"monthlyBillingSummary.length > 2\" class=\"msum-toggle\" (click)=\"toggleMonthlySummaryHistory()\">\n <ng-container *ngIf=\"!monthlySummaryExpanded\">\u25BE Show older months ({{ monthlyBillingSummary.length - 2 }})</ng-container>\n <ng-container *ngIf=\"monthlySummaryExpanded\">\u25B4 Hide older months</ng-container>\n </div>\n </div>\n\n <!-- Additional Products \u2014 non-standard products billed for this client only\n (e.g. clientId 11: Eyetest, Planogram). Hidden when the client has none. -->\n <div class=\"monthly-billing-summary\" *ngIf=\"additionalProducts?.length\">\n <div class=\"msum-header\">Additional Products</div>\n <div class=\"table-responsive\">\n <table class=\"table mb-0\">\n <thead>\n <tr>\n <th>Product Name</th>\n <th class=\"text-end\">Quantity</th>\n <th class=\"text-end\">Price</th>\n <th class=\"text-end\">Total</th>\n <th class=\"text-center\">Action</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let p of additionalProducts\">\n <td>{{ p.productName }}</td>\n <td class=\"text-end\">{{ p.quantity | number:'1.0-0':'en-IN' }}</td>\n <td class=\"text-end\">{{ (additionalProductsCurrency === 'dollar' ? '$' : '\u20B9') }}{{ p.price | number:'1.2-2':'en-IN' }}</td>\n <td class=\"text-end\"><strong>{{ (additionalProductsCurrency === 'dollar' ? '$' : '\u20B9') }}{{ p.total | number:'1.2-2':'en-IN' }}</strong></td>\n <td class=\"text-center\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\"\n *ngIf=\"canExportAdditionalProduct(p.productName)\"\n (click)=\"exportAdditionalProduct(p.productName)\">\n Download\n </button>\n </td>\n </tr>\n <tr>\n <td colspan=\"3\" class=\"text-end\"><strong>Grand Total</strong></td>\n <td class=\"text-end\"><strong>{{ (additionalProductsCurrency === 'dollar' ? '$' : '\u20B9') }}{{ additionalProductsTotal | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Search + Filter Row -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar\">\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Store name or ID...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"storeFilterObject\" (appliedFilters)=\"applyStoreFilters($event)\"></lib-filters>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"storeLoading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- No Data -->\n <ng-container *ngIf=\"storeNoData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Stores Table -->\n <div *ngIf=\"!storeLoading && !storeNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th class=\"cursor-pointer\" (click)=\"sortData('storeName')\">STORE NAME\n <svg [ngClass]=\"sortColumName === 'storeName' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'storeName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STORE ID</th>\n <th>PRODUCTS</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('trafficCameraCount')\">TRAFFIC CAMERAS\n <svg [ngClass]=\"sortColumName === 'trafficCameraCount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'trafficCameraCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('zoneCameraCount')\">ZONE CAMERAS\n <svg [ngClass]=\"sortColumName === 'zoneCameraCount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'zoneCameraCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('zoneCount')\">ZONES\n <svg [ngClass]=\"sortColumName === 'zoneCount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'zoneCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>FIRST FILE DATE</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('daysDifference')\">WORKING DAYS\n <svg [ngClass]=\"sortColumName === 'daysDifference' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'daysDifference' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STATUS</th>\n <th class=\"text-end\">INVOICE AMOUNT</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let store of storeList\">\n <td>\n <div class=\"table-title table-title-primary\">{{ store?.storeName }}</div>\n </td>\n <td>\n <div class=\"table-title\">{{ store?.storeId }}</div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngFor=\"let product of store?.products\" class=\"badge badge-light-primary me-1\">\n {{ formatProductName(product?.productName) }}\n </span>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <div class=\"d-flex align-items-center gap-2\">\n <ng-container *ngIf=\"!isEditingField(store?.storeId, 'trafficCameraCount')\">\n <strong>{{ store?.trafficCameraCount || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startFieldEdit(store, 'trafficCameraCount')\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n <ng-container *ngIf=\"isEditingField(store?.storeId, 'trafficCameraCount')\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingField[getFieldEditKey(store?.storeId, 'trafficCameraCount')]\"\n (keydown.enter)=\"saveFieldEdit(store, 'trafficCameraCount')\"\n (keydown.escape)=\"cancelFieldEdit(store, 'trafficCameraCount')\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveFieldEdit(store, 'trafficCameraCount')\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelFieldEdit(store, 'trafficCameraCount')\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <div class=\"d-flex align-items-center gap-2\">\n <ng-container *ngIf=\"!isEditingField(store?.storeId, 'zoneCameraCount')\">\n <strong>{{ store?.zoneCameraCount || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startFieldEdit(store, 'zoneCameraCount')\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n <ng-container *ngIf=\"isEditingField(store?.storeId, 'zoneCameraCount')\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingField[getFieldEditKey(store?.storeId, 'zoneCameraCount')]\"\n (keydown.enter)=\"saveFieldEdit(store, 'zoneCameraCount')\"\n (keydown.escape)=\"cancelFieldEdit(store, 'zoneCameraCount')\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveFieldEdit(store, 'zoneCameraCount')\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelFieldEdit(store, 'zoneCameraCount')\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <div class=\"d-flex align-items-center gap-2\">\n <ng-container *ngIf=\"!isEditingField(store?.storeId, 'zoneCount')\">\n <strong>{{ store?.zoneCount || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startFieldEdit(store, 'zoneCount')\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n <ng-container *ngIf=\"isEditingField(store?.storeId, 'zoneCount')\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingField[getFieldEditKey(store?.storeId, 'zoneCount')]\"\n (keydown.enter)=\"saveFieldEdit(store, 'zoneCount')\"\n (keydown.escape)=\"cancelFieldEdit(store, 'zoneCount')\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveFieldEdit(store, 'zoneCount')\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelFieldEdit(store, 'zoneCount')\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ store?.edgefirstFileDate ? (store?.edgefirstFileDate | date: 'dd MMM yyyy') : '\u2014' }}</div>\n </td>\n <td>\n <div class=\"table-title\" *ngFor=\"let product of store?.products\">\n <div class=\"d-flex align-items-center gap-2 mb-1\">\n <span class=\"small text-muted\">{{ formatProductName(product?.productName) }}:</span>\n\n <!-- View mode -->\n <ng-container *ngIf=\"!isEditing(store?.storeId, product?.productName)\">\n <strong>{{ product?.workingdays || 0 }}</strong>\n <span class=\"cursor-pointer edit-icon\" (click)=\"startEdit(store, product)\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.91667 1.75004C10.0698 1.59683 10.2518 1.47533 10.4519 1.39238C10.6522 1.30946 10.8667 1.26679 11.0833 1.26679C11.3 1.26679 11.5145 1.30946 11.7148 1.39238C11.9149 1.47533 12.0969 1.59683 12.25 1.75004C12.4032 1.90325 12.5247 2.08529 12.6077 2.28546C12.6906 2.48567 12.7333 2.70013 12.7333 2.91671C12.7333 3.13329 12.6906 3.34775 12.6077 3.54796C12.5247 3.74813 12.4032 3.93017 12.25 4.08338L4.375 11.9584L1.16667 12.8334L2.04167 9.62504L9.91667 1.75004Z\" stroke=\"#667085\" stroke-width=\"1.16\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n\n <!-- Edit mode -->\n <ng-container *ngIf=\"isEditing(store?.storeId, product?.productName)\">\n <input type=\"number\" class=\"form-control form-control-sm edit-input\"\n [(ngModel)]=\"editingProduct[getEditKey(store?.storeId, product?.productName)]\"\n (keydown.enter)=\"saveWorkingDays(store, product)\"\n (keydown.escape)=\"cancelEdit(store, product)\">\n <span class=\"cursor-pointer text-success\" (click)=\"saveWorkingDays(store, product)\" title=\"Save\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.3334 4L6.00008 11.3333L2.66675 8\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer text-danger\" (click)=\"cancelEdit(store, product)\" title=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </ng-container>\n </div>\n </div>\n </td>\n <td>\n <div class=\"mt-3\" [ngClass]=\"store?.status === 'active' ? 'badge badge-light-success' : 'badge badge-light-danger'\">\n {{ store?.status }}\n </div>\n </td>\n <td class=\"text-end\">\n <!-- Per-product breakdown (Traffic: \u20B9x, Zone: \u20B9y \u2026) + total. -->\n <div *ngFor=\"let b of store?.invoiceBreakdown\" class=\"inv-breakdown-row\">\n <span class=\"inv-breakdown-label\">{{ b.label }}:</span>\n {{ storeCurrencySymbol(store) }}{{ (b.amount || 0) | number:'1.2-2':'en-IN' }}\n </div>\n <div class=\"table-title inv-breakdown-total\">\n <strong>{{ storeCurrencySymbol(store) }}{{ (store?.invoiceAmount || 0) | number:'1.2-2':'en-IN' }}</strong>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div *ngIf=\"!storeLoading && !storeNoData\">\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </div>\n</div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.rotate{rotate:180deg;transition:1s}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.billingheader{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.table-title{font-family:Inter;font-size:14px;font-weight:500;line-height:3!important}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:3!important}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.edit-input{width:70px!important;padding:4px 8px!important;font-size:13px!important;text-align:center;border-radius:6px!important}.edit-icon{opacity:.4;transition:opacity .2s}.edit-icon:hover{opacity:1}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.date-filter{border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:8px;font-family:Inter;font-size:14px;color:var(--Gray-700, #344054);padding:6px 12px;min-width:160px}.monthly-billing-summary{border:1px solid #E4E7EC;border-radius:12px;margin:0 0 18px;overflow:hidden;background:#fff}.monthly-billing-summary .msum-header{padding:12px 18px;font-weight:700;color:#101828;background:#f9fafb;border-bottom:1px solid #E4E7EC;font-size:14px}.monthly-billing-summary table{margin:0}.monthly-billing-summary table thead th{background:#fff;font-size:11.5px;letter-spacing:.04em;color:#8a93a2;font-weight:600;text-transform:uppercase;padding:12px 18px;border-bottom:1px solid #E4E7EC}.monthly-billing-summary table tbody td{padding:14px 18px;font-size:13.5px;color:#344054;border-bottom:1px solid #E4E7EC;vertical-align:middle}.monthly-billing-summary table tbody tr:last-child td{border-bottom:0}.monthly-billing-summary table tbody tr.curr{background:#f5faff}.monthly-billing-summary .ind{font-size:11.5px;font-weight:700;white-space:nowrap}.monthly-billing-summary .ind.up{color:#138a52}.monthly-billing-summary .ind.down{color:#d64545}.monthly-billing-summary .ind.flat{color:#98a2b3}.monthly-billing-summary .msum-toggle{padding:11px 18px;text-align:center;color:#00a3ff;font-weight:600;font-size:13px;background:#f9fafb;border-top:1px solid #E4E7EC;cursor:pointer;-webkit-user-select:none;user-select:none}.monthly-billing-summary .msum-toggle:hover{background:#f2f6fb}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}.inv-breakdown-row{font-size:12px;color:#667085;line-height:1.5}.inv-breakdown-label{color:#98a2b3;margin-right:4px}.inv-breakdown-total{border-top:1px solid #eceef1;margin-top:4px;padding-top:4px;color:#101828}\n"] }]
391
455
  }], ctorParameters: () => [{ type: i1.BillingService }, { type: i0.ChangeDetectorRef }, { type: i2.ToastService }, { type: i3.NgbModal }], propDecorators: { clientId: [{
392
456
  type: Input
393
457
  }] } });
394
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFpbHktcHJpY2luZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtYmlsbGluZy9zcmMvbGliL2NvbXBvbmVudHMvZGFpbHktcHJpY2luZy9kYWlseS1wcmljaW5nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9kYWlseS1wcmljaW5nL2RhaWx5LXByaWNpbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUErQyxNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkxQyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQzs7Ozs7OztBQU8xRyxNQUFNLE9BQU8scUJBQXFCO0lBa0R0QjtJQUNBO0lBQ0E7SUFDQTtJQXBETyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUVqQyxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBRS9CLEdBQUcsQ0FBTTtJQUNULGNBQWMsR0FBWSxLQUFLLENBQUM7SUFFaEMsV0FBVztJQUNYLGdCQUFnQixHQUFRLEVBQUUsQ0FBQztJQUUzQix5RUFBeUU7SUFDekUsY0FBYyxHQUFRLEVBQUUsQ0FBQztJQUN6Qix3RkFBd0Y7SUFDeEYsWUFBWSxHQUFRLEVBQUUsQ0FBQztJQUV2QixjQUFjO0lBQ2QsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUV4Qiw2RUFBNkU7SUFDN0UseUVBQXlFO0lBQ3pFLFlBQVksR0FBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLGlCQUFpQixHQUFHO1FBQ2xCLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FB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RUFBRTtnQkFDekQsR0FBRztnQkFDSCxXQUFXO2dCQUNYLFdBQVc7Z0JBQ1gsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFO2FBQ25FLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwyQkFBMkI7UUFDekIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQzdELENBQUM7d0dBL1pVLHFCQUFxQjs0RkFBckIscUJBQXFCLGdIQ1psQyxpeStCQW1aTTs7NEZEdllPLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUI7cUtBT3BCLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuaW1wb3J0IHsgR2VuZXJhdGVJbnZvaWNlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuL2dlbmVyYXRlLWludm9pY2UtbW9kYWwvZ2VuZXJhdGUtaW52b2ljZS1tb2RhbC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGFpbHktcHJpY2luZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYWlseS1wcmljaW5nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2RhaWx5LXByaWNpbmcuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIERhaWx5UHJpY2luZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nID0gJyc7XG5cbiAgbGVuOiBhbnk7XG4gIHNlYXJjaERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gTWV0YWRhdGFcbiAgZGFpbHlQcmljaW5nSW5mbzogYW55ID0ge307XG5cbiAgLy8gRWRpdCB0cmFja2luZzoga2V5ID0gJ3N0b3JlSWRfcHJvZHVjdE5hbWUnLCB2YWx1ZSA9IGVkaXRlZCB3b3JraW5nZGF5c1xuICBlZGl0aW5nUHJvZHVjdDogYW55ID0ge307XG4gIC8vIEVkaXQgdHJhY2tpbmcgZm9yIHN0b3JlLWxldmVsIGZpZWxkcyAodHJhZmZpY0NhbWVyYUNvdW50LCB6b25lQ2FtZXJhQ291bnQsIHpvbmVDb3VudClcbiAgZWRpdGluZ0ZpZWxkOiBhbnkgPSB7fTtcblxuICAvLyBEYXRlIGZpbHRlclxuICBkYXRlRmlsdGVyOiBzdHJpbmcgPSAnJztcblxuICAvLyBGaWx0ZXIg4oCUIG11bHRpLXNlbGVjdCBzdGF0dXMuIERlZmF1bHQgdG8gQWN0aXZlIHNvIHRoZSB0YWJsZSBvcGVucyBzaG93aW5nXG4gIC8vIG9ubHkgYWN0aXZlIHN0b3JlczsgdGhlIGRyb3Bkb3duIG1hcmtzIEFjdGl2ZSBjaGVja2VkIHRvIHJlZmxlY3QgdGhhdC5cbiAgc3RhdHVzRmlsdGVyOiBzdHJpbmdbXSA9IFsnYWN0aXZlJ107XG4gIHN0b3JlRmlsdGVyT2JqZWN0ID0gW1xuICAgIHsgRGVzY3JpcHRpb246ICdTdGF0dXMnLCB0eXBlOiAnbXVsdGknLCBJc3N1ZXM6IFt7IGlkOiAnYWN0aXZlJywgdGV4dDogJ0FjdGl2ZScsIGNoZWNrZWQ6IHRydWUgfSwgeyBpZDogJ2RlYWN0aXZlJywgdGV4dDogJ0RlYWN0aXZlJyB9XSB9LFxuICBdO1xuXG4gIC8vIE1vbnRobHkgQmlsbGluZyBTdW1tYXJ5IOKAlCBkZXJpdmVkIGZyb20gaW52b2ljZSBoaXN0b3J5IGZvciB0aGUgYnJhbmQuXG4gIC8vIE5ld2VzdCBmaXJzdDsgZWFjaCByb3cgY2FycmllcyBwcmlvci1tb250aCBkZWx0YXMgZm9yIHRoZSB0cmVuZCBpbmRpY2F0b3IuXG4gIG1vbnRobHlCaWxsaW5nU3VtbWFyeTogYW55W10gPSBbXTtcbiAgbW9udGhseVN1bW1hcnlFeHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFRhYmxlXG4gIHN0b3JlTGlzdDogYW55ID0gW107XG4gIHN0b3JlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG4gIHN0b3JlTm9EYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIHRvdGFsSXRlbXM6IG51bWJlciA9IDA7XG4gIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgY3VycmVudFBhZ2U6IG51bWJlciA9IDE7XG4gIGl0ZW1zUGVyUGFnZTogbnVtYmVyID0gMTA7XG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcbiAgc29ydENvbHVtTmFtZTogc3RyaW5nID0gJ3N0b3JlTmFtZSc7XG4gIHNvcnRCeTogbnVtYmVyID0gMTtcbiAgZ2VuZXJhdGluZ0ludm9pY2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBBZGRpdGlvbmFsIChub24tc3RhbmRhcmQpIHByb2R1Y3RzIGF2YWlsYWJsZSBvbmx5IGZvciBzcGVjaWZpYyBjbGllbnRzXG4gIC8vIChjdXJyZW50bHkgY2xpZW50SWQgMTEpLiBFbXB0eSBmb3IgZXZlcnlvbmUgZWxzZSAtPiB0aGUgdGFibGUgaXMgaGlkZGVuLlxuICBhZGRpdGlvbmFsUHJvZHVjdHM6IGFueVtdID0gW107XG4gIGFkZGl0aW9uYWxQcm9kdWN0c0N1cnJlbmN5OiBzdHJpbmcgPSAnaW5yJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGJpbGxpbmdTZXJ2aWNlOiBCaWxsaW5nU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGllbnRJZCkge1xuICAgICAgdGhpcy5sb2FkRGFpbHlQcmljaW5nKCk7XG4gICAgICB0aGlzLmxvYWRBZGRpdGlvbmFsUHJvZHVjdHMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NsaWVudElkJ10gJiYgIWNoYW5nZXNbJ2NsaWVudElkJ10uZmlyc3RDaGFuZ2UgJiYgdGhpcy5jbGllbnRJZCkge1xuICAgICAgdGhpcy5sb2FkRGFpbHlQcmljaW5nKCk7XG4gICAgICB0aGlzLmxvYWRBZGRpdGlvbmFsUHJvZHVjdHMoKTtcbiAgICB9XG4gIH1cblxuICAvLyBHcmFuZCB0b3RhbCBhY3Jvc3MgYWxsIGFkZGl0aW9uYWwtcHJvZHVjdCByb3dzLlxuICBnZXQgYWRkaXRpb25hbFByb2R1Y3RzVG90YWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuYWRkaXRpb25hbFByb2R1Y3RzIHx8IFtdKS5yZWR1Y2UoKGEsIHApID0+IGEgKyAoTnVtYmVyKHAudG90YWwpIHx8IDApLCAwKTtcbiAgfVxuXG4gIC8vIEZldGNoIHRoZSBhZGRpdGlvbmFsLXByb2R1Y3RzIHRhYmxlIGZvciB0aGlzIGNsaWVudC4gQmFja2VuZCByZXR1cm5zIGFuXG4gIC8vIGVtcHR5IGxpc3QgZm9yIGFueSBjbGllbnQgdGhhdCBoYXMgbm9uZSAoc28gdGhlIHRhYmxlIGp1c3Qgd29uJ3QgcmVuZGVyKS5cbiAgbG9hZEFkZGl0aW9uYWxQcm9kdWN0cygpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmFkZGl0aW9uYWxQcm9kdWN0cyh0aGlzLmNsaWVudElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5hZGRpdGlvbmFsUHJvZHVjdHMgPSByZXM/LmRhdGE/LnByb2R1Y3RzIHx8IFtdO1xuICAgICAgICB0aGlzLmFkZGl0aW9uYWxQcm9kdWN0c0N1cnJlbmN5ID0gcmVzPy5kYXRhPy5jdXJyZW5jeSB8fCAnaW5yJztcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5hZGRpdGlvbmFsUHJvZHVjdHMgPSBbXTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGxvYWREYWlseVByaWNpbmcoKSB7XG4gICAgdGhpcy5zZWFyY2hEaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RvcmVMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnN0b3JlTm9EYXRhID0gZmFsc2U7XG5cbiAgICBsZXQgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgbGltaXQ6IHRoaXMucGFnZVNpemUsXG4gICAgICBvZmZzZXQ6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5sZW4sXG4gICAgICBzb3J0Q29sdW1OYW1lOiB0aGlzLnNvcnRDb2x1bU5hbWUsXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgICAgc3RhdHVzRmlsdGVyOiB0aGlzLnN0YXR1c0ZpbHRlcixcbiAgICAgIGRhdGVGaWx0ZXI6IHRoaXMuZGF0ZUZpbHRlciB8fCAnJyxcbiAgICAgIGV4cG9ydDogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5sYXRlc3REYWlseVByaWNpbmcoZmlsdGVycykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZSkgPT4ge1xuICAgICAgICAvLyBUaGUgTW9udGhseSBCaWxsaW5nIFN1bW1hcnkgY29tZXMgZnJvbSBpbnZvaWNlIGhpc3RvcnksIG5vdCB0aGUgc3RvcmVcbiAgICAgICAgLy8gcm93cyDigJQgYXBwbHkgaXQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzdG9yZSBsaXN0IGlzIGVtcHR5LCBzbyBpdFxuICAgICAgICAvLyBzdGlsbCBzaG93cyB3aGVuIHRoZSBmaWx0ZXJlZCBzdG9yZSB0YWJsZSBoYXMgbm8gcm93cy5cbiAgICAgICAgdGhpcy5tb250aGx5QmlsbGluZ1N1bW1hcnkgPSB0aGlzLmRlY29yYXRlTW9udGhseVN1bW1hcnkoZT8uZGF0YT8ubW9udGhseUJpbGxpbmdTdW1tYXJ5IHx8IFtdKTtcblxuICAgICAgICBpZiAoZT8uZGF0YT8uY291bnQpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuc3RvcmVOb0RhdGEgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IGUuZGF0YT8uZGF0YTtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSBlLmRhdGE/LmNvdW50O1xuXG4gICAgICAgICAgdGhpcy5kYWlseVByaWNpbmdJbmZvID0ge1xuICAgICAgICAgICAgYnJhbmROYW1lOiBlLmRhdGE/LmJyYW5kTmFtZSB8fCAnJyxcbiAgICAgICAgICAgIGRhdGVTdHJpbmc6IGUuZGF0YT8uZGF0ZVN0cmluZyB8fCAnJyxcbiAgICAgICAgICAgIGRhdGVJU086IGUuZGF0YT8uZGF0ZUlTTyB8fCAnJyxcbiAgICAgICAgICAgIGFjdGl2ZVN0b3JlczogZS5kYXRhPy5hY3RpdmVTdG9yZXMgfHwgMCxcbiAgICAgICAgICAgIGFjY291bnRUeXBlOiBlLmRhdGE/LmFjY291bnRUeXBlIHx8ICcnLFxuICAgICAgICAgICAgc3RhdHVzOiBlLmRhdGE/LnN0YXR1cyB8fCAnJyxcbiAgICAgICAgICAgIHByb1JhdGU6IGUuZGF0YT8ucHJvUmF0ZSB8fCAnJyxcbiAgICAgICAgICAgIGNsaWVudElkOiBlLmRhdGE/LmNsaWVudElkIHx8ICcnXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RvcmVMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5zdG9yZU5vRGF0YSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zZWFyY2hEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoaXMubGVuPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5zdG9yZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdG9yZU5vRGF0YSA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XG4gICAgICAgIHRoaXMudG90YWxJdGVtcyA9IDA7XG4gICAgICAgIHRoaXMubW9udGhseUJpbGxpbmdTdW1tYXJ5ID0gW107XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25EYXRlRmlsdGVyKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmRhdGVGaWx0ZXIgPSBldmVudD8udGFyZ2V0Py52YWx1ZSB8fCAnJztcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWREYWlseVByaWNpbmcoKTtcbiAgfVxuXG4gIGNsZWFyRGF0ZUZpbHRlcigpIHtcbiAgICB0aGlzLmRhdGVGaWx0ZXIgPSAnJztcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWREYWlseVByaWNpbmcoKTtcbiAgfVxuXG4gIHNlYXJjaEZpZWxkKCkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZERhaWx5UHJpY2luZygpO1xuICB9XG5cbiAgYXBwbHlTdG9yZUZpbHRlcnMoZXZlbnQ6IGFueSkge1xuICAgIC8vIE11bHRpLXNlbGVjdCBTdGF0dXMg4oCUIGxpYi1maWx0ZXJzIGVtaXRzIGVhY2ggZ3JvdXAncyBzZWxlY3RlZCBvcHRpb25zIGFzXG4gICAgLy8gYW4gQVJSQVkgdW5kZXIgSXNzdWVzIChBcHBseSBzZXRzIElzc3VlcyA9IHNlbGVjdGVkVmFsdWVzQXJyYXlbaW5kZXhdKS5cbiAgICAvLyBDb2xsZWN0IGV2ZXJ5IHNlbGVjdGVkIGlkLCB0b2xlcmF0aW5nIGJvdGggYXJyYXkgYW5kIHNpbmdsZS1vYmplY3Qgc2hhcGVzLlxuICAgIGNvbnN0IHN0YXR1c2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChldmVudD8ubGVuZ3RoKSB7XG4gICAgICBldmVudC5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuRGVzY3JpcHRpb24gPT09ICdTdGF0dXMnKSB7XG4gICAgICAgICAgY29uc3QgaXNzdWVzID0gQXJyYXkuaXNBcnJheShlbGVtZW50Lklzc3VlcykgPyBlbGVtZW50Lklzc3VlcyA6IChlbGVtZW50Lklzc3VlcyA/IFtlbGVtZW50Lklzc3Vlc10gOiBbXSk7XG4gICAgICAgICAgaXNzdWVzLmZvckVhY2goKGk6IGFueSkgPT4geyBpZiAoaT8uaWQpIHN0YXR1c2VzLnB1c2goaS5pZCk7IH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGF0dXNGaWx0ZXIgPSBbLi4ubmV3IFNldChzdGF0dXNlcyldO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZERhaWx5UHJpY2luZygpO1xuICB9XG5cbiAgc29ydERhdGEoY29sdW1uOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNvcnRDb2x1bU5hbWUgPSBjb2x1bW47XG4gICAgdGhpcy5zb3J0QnkgKj0gLTE7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5sb2FkRGFpbHlQcmljaW5nKCk7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UocGFnZU9mZnNldDogYW55KSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhcnNlSW50KHBhZ2VPZmZzZXQpO1xuICAgIHRoaXMubG9hZERhaWx5UHJpY2luZygpO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogYW55KSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IHBhcnNlSW50KHBhZ2VTaXplKTtcbiAgICB0aGlzLmxvYWREYWlseVByaWNpbmcoKTtcbiAgfVxuXG4gIG9uRXhwb3J0KCkge1xuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5sZW4sXG4gICAgICBzb3J0Q29sdW1OYW1lOiB0aGlzLnNvcnRDb2x1bU5hbWUsXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgICAgc3RhdHVzRmlsdGVyOiB0aGlzLnN0YXR1c0ZpbHRlcixcbiAgICAgIGRhdGVGaWx0ZXI6IHRoaXMuZGF0ZUZpbHRlciB8fCAnJyxcbiAgICAgIGV4cG9ydDogdHJ1ZVxuICAgIH07XG5cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmxhdGVzdERhaWx5UHJpY2luZ0V4cG9ydChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5zYXZlQXNFeGNlbEZpbGUocmVzLCAnZGFpbHktcHJpY2luZycpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnU29tZXRoaW5nIHdlbnQgV3JvbmcuLicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0RWRpdEtleShzdG9yZUlkOiBzdHJpbmcsIHByb2R1Y3ROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtzdG9yZUlkfV8ke3Byb2R1Y3ROYW1lfWA7XG4gIH1cblxuICBpc0VkaXRpbmcoc3RvcmVJZDogc3RyaW5nLCBwcm9kdWN0TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGluZ1Byb2R1Y3RbdGhpcy5nZXRFZGl0S2V5KHN0b3JlSWQsIHByb2R1Y3ROYW1lKV0gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHN0YXJ0RWRpdChzdG9yZTogYW55LCBwcm9kdWN0OiBhbnkpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEVkaXRLZXkoc3RvcmUuc3RvcmVJZCwgcHJvZHVjdC5wcm9kdWN0TmFtZSk7XG4gICAgdGhpcy5lZGl0aW5nUHJvZHVjdFtrZXldID0gcHJvZHVjdC53b3JraW5nZGF5cztcbiAgfVxuXG4gIGNhbmNlbEVkaXQoc3RvcmU6IGFueSwgcHJvZHVjdDogYW55KSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRFZGl0S2V5KHN0b3JlLnN0b3JlSWQsIHByb2R1Y3QucHJvZHVjdE5hbWUpO1xuICAgIGRlbGV0ZSB0aGlzLmVkaXRpbmdQcm9kdWN0W2tleV07XG4gIH1cblxuICBzYXZlV29ya2luZ0RheXMoc3RvcmU6IGFueSwgcHJvZHVjdDogYW55KSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRFZGl0S2V5KHN0b3JlLnN0b3JlSWQsIHByb2R1Y3QucHJvZHVjdE5hbWUpO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5lZGl0aW5nUHJvZHVjdFtrZXldO1xuXG4gICAgaWYgKG5ld1ZhbHVlID09PSBwcm9kdWN0LndvcmtpbmdkYXlzKSB7XG4gICAgICBkZWxldGUgdGhpcy5lZGl0aW5nUHJvZHVjdFtrZXldO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcbiAgICAgIGRhdGVTdHJpbmc6IHRoaXMuZGFpbHlQcmljaW5nSW5mby5kYXRlU3RyaW5nLFxuICAgICAgc3RvcmVJZDogc3RvcmUuc3RvcmVJZCxcbiAgICAgIHByb2R1Y3ROYW1lOiBwcm9kdWN0LnByb2R1Y3ROYW1lLFxuICAgICAgd29ya2luZ2RheXM6IE51bWJlcihuZXdWYWx1ZSlcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS51cGRhdGVEYWlseVByaWNpbmdXb3JraW5nRGF5cyhwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgcHJvZHVjdC53b3JraW5nZGF5cyA9IE51bWJlcihuZXdWYWx1ZSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmVkaXRpbmdQcm9kdWN0W2tleV07XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdXb3JraW5nIGRheXMgdXBkYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gdXBkYXRlIHdvcmtpbmcgZGF5cycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0RmllbGRFZGl0S2V5KHN0b3JlSWQ6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtzdG9yZUlkfV8ke2ZpZWxkTmFtZX1gO1xuICB9XG5cbiAgaXNFZGl0aW5nRmllbGQoc3RvcmVJZDogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRpbmdGaWVsZFt0aGlzLmdldEZpZWxkRWRpdEtleShzdG9yZUlkLCBmaWVsZE5hbWUpXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgc3RhcnRGaWVsZEVkaXQoc3RvcmU6IGFueSwgZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEZpZWxkRWRpdEtleShzdG9yZS5zdG9yZUlkLCBmaWVsZE5hbWUpO1xuICAgIHRoaXMuZWRpdGluZ0ZpZWxkW2tleV0gPSBzdG9yZVtmaWVsZE5hbWVdIHx8IDA7XG4gIH1cblxuICBjYW5jZWxGaWVsZEVkaXQoc3RvcmU6IGFueSwgZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEZpZWxkRWRpdEtleShzdG9yZS5zdG9yZUlkLCBmaWVsZE5hbWUpO1xuICAgIGRlbGV0ZSB0aGlzLmVkaXRpbmdGaWVsZFtrZXldO1xuICB9XG5cbiAgc2F2ZUZpZWxkRWRpdChzdG9yZTogYW55LCBmaWVsZE5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0RmllbGRFZGl0S2V5KHN0b3JlLnN0b3JlSWQsIGZpZWxkTmFtZSk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmVkaXRpbmdGaWVsZFtrZXldO1xuXG4gICAgaWYgKG5ld1ZhbHVlID09PSBzdG9yZVtmaWVsZE5hbWVdKSB7XG4gICAgICBkZWxldGUgdGhpcy5lZGl0aW5nRmllbGRba2V5XTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICBkYXRlU3RyaW5nOiB0aGlzLmRhaWx5UHJpY2luZ0luZm8uZGF0ZVN0cmluZyxcbiAgICAgIHN0b3JlSWQ6IHN0b3JlLnN0b3JlSWQsXG4gICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgIHZhbHVlOiBOdW1iZXIobmV3VmFsdWUpXG4gICAgfTtcblxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UudXBkYXRlRGFpbHlQcmljaW5nU3RvcmVGaWVsZChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgc3RvcmVbZmllbGROYW1lXSA9IE51bWJlcihuZXdWYWx1ZSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmVkaXRpbmdGaWVsZFtrZXldO1xuICAgICAgICBjb25zdCBmaWVsZExhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgdHJhZmZpY0NhbWVyYUNvdW50OiAnVHJhZmZpYyBjYW1lcmEgY291bnQnLCB6b25lQ2FtZXJhQ291bnQ6ICdab25lIGNhbWVyYSBjb3VudCcsIHpvbmVDb3VudDogJ1pvbmUgY291bnQnIH07XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGAke2ZpZWxkTGFiZWxzW2ZpZWxkTmFtZV0gfHwgZmllbGROYW1lfSB1cGRhdGVkIHN1Y2Nlc3NmdWxseWApO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICBjb25zdCBlcnJvckxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgdHJhZmZpY0NhbWVyYUNvdW50OiAndHJhZmZpYyBjYW1lcmEgY291bnQnLCB6b25lQ2FtZXJhQ291bnQ6ICd6b25lIGNhbWVyYSBjb3VudCcsIHpvbmVDb3VudDogJ3pvbmUgY291bnQnIH07XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChgRmFpbGVkIHRvIHVwZGF0ZSAke2Vycm9yTGFiZWxzW2ZpZWxkTmFtZV0gfHwgZmllbGROYW1lfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVJbnZvaWNlKCkge1xuICAgIGlmICghdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xuICAgIC8vIE9wZW4gdGhlIHBpY2tlciBmaXJzdCDigJQgdGhlIHVzZXIgY2hvb3NlcyB3aGljaCBiaWxsaW5nIGdyb3VwcyB0b1xuICAgIC8vIGdlbmVyYXRlIGZvci4gTW9kYWwgY2xvc2VzIHdpdGggdGhlIGFycmF5IG9mIHNlbGVjdGVkIGdyb3VwIF9pZHNcbiAgICAvLyAob3IgaXMgZGlzbWlzc2VkID0gbm8tb3ApLlxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihHZW5lcmF0ZUludm9pY2VNb2RhbENvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSB0aGlzLmNsaWVudElkO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChncm91cElkczogc3RyaW5nW10pID0+IHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShncm91cElkcykgfHwgZ3JvdXBJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICB0aGlzLnJ1bkludm9pY2VHZW5lcmF0aW9uKGdyb3VwSWRzKTtcbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBwcml2YXRlIHJ1bkludm9pY2VHZW5lcmF0aW9uKGdyb3VwSWRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuZ2VuZXJhdGluZ0ludm9pY2UgPSB0cnVlO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGFsbENsaWVudDogdHJ1ZSxcbiAgICAgIGNsaWVudExpc3Q6IFt0aGlzLmNsaWVudElkXSxcbiAgICAgIGdyb3VwSWRzLFxuICAgIH07XG5cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmNyZWF0ZUludm9pY2UocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGluZ0ludm9pY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoYEludm9pY2UgZ2VuZXJhdGVkIGZvciAke2dyb3VwSWRzLmxlbmd0aH0gYmlsbGluZyBncm91cChzKWApO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmdlbmVyYXRpbmdJbnZvaWNlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGdlbmVyYXRlIGludm9pY2UnKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmb3JtYXRQcm9kdWN0TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuICcnO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMSAkMicpXG4gICAgICAucmVwbGFjZSgvXi4vLCAoc3RyKSA9PiBzdHIudG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvLyBUYWtlIHRoZSByYXcgYWdncmVnYXRpb24gcm93cyAoYWxyZWFkeSBzb3J0ZWQgbmV3ZXN0LWZpcnN0IGJ5IHRoZSBBUEkpIGFuZFxuICAvLyBhdHRhY2ggKGEpIGEgaHVtYW4tcmVhZGFibGUgbW9udGhMYWJlbCwgKGIpIHRhZyBmb3IgdGhlIGxhdGVzdCB0d28gcm93c1xuICAvLyAoXCJDdXJyZW50XCIgLyBcIkxhc3QgZ2VuZXJhdGVkXCIpIGFuZCAoYykgZGVsdGFzIHZzIHRoZSBpbW1lZGlhdGVseSBvbGRlclxuICAvLyBDdXJyZW5jeSBzeW1ib2wgZm9yIGEgc3RvcmUncyBpbnZvaWNlIGFtb3VudCAobWF0Y2hlcyB0aGUgYmFja2VuZCdzXG4gIC8vIGJhc2VwcmljaW5nIGN1cnJlbmN5OyBBRUQgcmVuZGVyZWQgYXMgdGV4dCkuXG4gIHN0b3JlQ3VycmVuY3lTeW1ib2woc3RvcmU6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3ltYm9sczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgaW5yOiAn4oK5JywgZG9sbGFyOiAnJCcsIHNpbmdhcG9yZWRvbGxhcjogJ1MkJywgZXVybzogJ+KCrCcsIGFlZDogJ0FFRCAnIH07XG4gICAgcmV0dXJuIHN5bWJvbHNbKHN0b3JlPy5pbnZvaWNlQ3VycmVuY3kgfHwgJ2lucicpLnRvTG93ZXJDYXNlKCldIHx8ICfigrknO1xuICB9XG5cbiAgLy8gbW9udGggc28gdGhlIHRlbXBsYXRlIGNhbiByZW5kZXIgdGhlIOKWsi/ilrwv4pasIHRyZW5kIGluZGljYXRvcnMuXG4gIHByaXZhdGUgZGVjb3JhdGVNb250aGx5U3VtbWFyeShyb3dzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocm93cykgfHwgcm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBtb250aE5hbWVzID0gWydKYW4nLCdGZWInLCdNYXInLCdBcHInLCdNYXknLCdKdW4nLCdKdWwnLCdBdWcnLCdTZXAnLCdPY3QnLCdOb3YnLCdEZWMnXTtcbiAgICBjb25zdCBzeW1ib2xzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBpbnI6ICfigrknLCBkb2xsYXI6ICckJywgc2luZ2Fwb3JlZG9sbGFyOiAnUyQnLCBldXJvOiAn4oKsJyB9O1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgaXNDdXJyZW50ID0gKHI6IGFueSkgPT4gci55ZWFyID09PSBub3cuZ2V0RnVsbFllYXIoKSAmJiByLm1vbnRoID09PSAobm93LmdldE1vbnRoKCkgKyAxKTtcbiAgICByZXR1cm4gcm93cy5tYXAoKHIsIGkpID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSByb3dzW2kgKyAxXTtcbiAgICAgIGNvbnN0IHN0b3Jlc0RlbHRhID0gbmV4dCA/IChyLnN0b3Jlc0JpbGxlZCB8fCAwKSAtIChuZXh0LnN0b3Jlc0JpbGxlZCB8fCAwKSA6IG51bGw7XG4gICAgICBjb25zdCBhbW91bnREZWx0YSA9IG5leHQgPyAoci5pbnZvaWNlQW1vdW50IHx8IDApIC0gKG5leHQuaW52b2ljZUFtb3VudCB8fCAwKSA6IG51bGw7XG4gICAgICBsZXQgdGFnID0gJyc7XG4gICAgICBpZiAoaXNDdXJyZW50KHIpKSB0YWcgPSAnQ3VycmVudCc7XG4gICAgICBlbHNlIGlmIChpID09PSAwKSB0YWcgPSAnTGFzdCBnZW5lcmF0ZWQnO1xuICAgICAgZWxzZSBpZiAoaSA9PT0gMSAmJiBpc0N1cnJlbnQocm93c1swXSkpIHRhZyA9ICdMYXN0IGdlbmVyYXRlZCc7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5yLFxuICAgICAgICBtb250aExhYmVsOiBgJHttb250aE5hbWVzWyhyLm1vbnRoIHx8IDEpIC0gMV19ICR7ci55ZWFyfWAsXG4gICAgICAgIHRhZyxcbiAgICAgICAgc3RvcmVzRGVsdGEsXG4gICAgICAgIGFtb3VudERlbHRhLFxuICAgICAgICBjdXJyZW5jeVN5bWJvbDogc3ltYm9sc1soci5jdXJyZW5jeSB8fCAnaW5yJykudG9Mb3dlckNhc2UoKV0gfHwgJycsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlTW9udGhseVN1bW1hcnlIaXN0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMubW9udGhseVN1bW1hcnlFeHBhbmRlZCA9ICF0aGlzLm1vbnRobHlTdW1tYXJ5RXhwYW5kZWQ7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwiaW52b2ljZXMtc2VjdGlvblwiPlxuICAgIDwhLS0gSGVhZGVyIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNjY2NjcgMTBIMTMuMzMzM002LjY2NjY3IDYuNjY2NjdIMTMuMzMzM002LjY2NjY3IDEzLjMzMzNIMTBNNSAxNy41SDE1QzE1LjkyMDUgMTcuNSAxNi42NjY3IDE2Ljc1MzggMTYuNjY2NyAxNS44MzMzVjQuMTY2NjdDMTYuNjY2NyAzLjI0NjE5IDE1LjkyMDUgMi41IDE1IDIuNUg1QzQuMDc5NTMgMi41IDMuMzMzMzMgMy4yNDYxOSAzLjMzMzMzIDQuMTY2NjdWMTUuODMzM0MzLjMzMzMzIDE2Ljc1MzggNC4wNzk1MyAxNy41IDUgMTcuNVpcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJpbGxpbmdoZWFkZXJcIj5CaWxsaW5nIEJyZWFrZG93bjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLWxpZ2h0IHRleHQtZGFyayBtcy0xXCI+e3sgdG90YWxJdGVtcyB9fSBzdG9yZXM8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIiAqbmdJZj1cImRhaWx5UHJpY2luZ0luZm8/LmRhdGVTdHJpbmdcIj5cbiAgICAgICAgICAgICAgICBEYXRlOiA8c3Ryb25nPnt7IGRhaWx5UHJpY2luZ0luZm8/LmRhdGVTdHJpbmcgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm14LTJcIj58PC9zcGFuPlxuICAgICAgICAgICAgICAgIEFjdGl2ZSBTdG9yZXM6IDxzdHJvbmc+e3sgZGFpbHlQcmljaW5nSW5mbz8uYWN0aXZlU3RvcmVzIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJteC0yXCI+fDwvc3Bhbj5cbiAgICAgICAgICAgICAgICBBY2NvdW50IFR5cGU6IDxzdHJvbmc+e3sgZGFpbHlQcmljaW5nSW5mbz8uYWNjb3VudFR5cGUgfX08L3N0cm9uZz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIGRhdGUtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGVGaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRGF0ZUZpbHRlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgYnkgZGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJkYXRlRmlsdGVyXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJEYXRlRmlsdGVyKClcIiB0aXRsZT1cIkNsZWFyIGRhdGUgZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMC41IDMuNUwzLjUgMTAuNU0zLjUgMy41TDEwLjUgMTAuNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZ2VuZXJhdGVJbnZvaWNlKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGFsaWduLWl0ZW1zLWVuZCB0ZXh0LW5vd3JhcCBpbnZoZWFkZXJcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RvcmVMaXN0Lmxlbmd0aCB8fCBnZW5lcmF0aW5nSW52b2ljZVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNjY2NjcgMTBIMTMuMzMzM002LjY2NjY3IDYuNjY2NjdIMTMuMzMzM002LjY2NjY3IDEzLjMzMzNIMTBNNSAxNy41SDE1QzE1LjkyMDUgMTcuNSAxNi42NjY3IDE2Ljc1MzggMTYuNjY2NyAxNS44MzMzVjQuMTY2NjdDMTYuNjY2NyAzLjI0NjE5IDE1LjkyMDUgMi41IDE1IDIuNUg1QzQuMDc5NTMgMi41IDMuMzMzMzMgMy4yNDYxOSAzLjMzMzMzIDQuMTY2NjdWMTUuODMzM0MzLjMzMzMzIDE2Ljc1MzggNC4wNzk1MyAxNy41IDUgMTcuNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI2ZmZlwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMVwiPnt7IGdlbmVyYXRpbmdJbnZvaWNlID8gJ0dlbmVyYXRpbmcuLi4nIDogJ0dlbmVyYXRlIEludm9pY2UnIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FeHBvcnQoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlclwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdG9yZUxpc3QubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMVwiPkV4cG9ydDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTW9udGhseSBCaWxsaW5nIFN1bW1hcnkg4oCUIGludm9pY2UgdHJlbmQgKG5ld2VzdCBmaXJzdCwgd2l0aCBkZWx0YXMgdnMgcHJpb3IgbW9udGgpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtb250aGx5LWJpbGxpbmctc3VtbWFyeVwiICpuZ0lmPVwibW9udGhseUJpbGxpbmdTdW1tYXJ5Py5sZW5ndGhcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1zdW0taGVhZGVyXCI+TW9udGhseSBCaWxsaW5nIFN1bW1hcnk8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIG1iLTBcIj5cbiAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5NT05USDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+TlVNQkVSIE9GIFNUT1JFUyBCSUxMRUQ8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPklOVk9JQ0UgQU1PVU5UPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93IG9mIG1vbnRobHlCaWxsaW5nU3VtbWFyeTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiaSA8IDIgfHwgbW9udGhseVN1bW1hcnlFeHBhbmRlZFwiIFtjbGFzcy5jdXJyXT1cInJvdy50YWcgPT09ICdDdXJyZW50J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyByb3cubW9udGhMYWJlbCB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy50YWcgPT09ICdDdXJyZW50J1wiIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtcHJpbWFyeSBtcy0yXCI+Q3VycmVudDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cudGFnID09PSAnTGFzdCBnZW5lcmF0ZWQnXCIgY2xhc3M9XCJiYWRnZSBiZy1saWdodCB0ZXh0LWRhcmsgbXMtMlwiPkxhc3QgZ2VuZXJhdGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IHJvdy5zdG9yZXNCaWxsZWQgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuc3RvcmVzRGVsdGEgIT09IG51bGxcIiBjbGFzcz1cImluZCBtcy0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy51cF09XCJyb3cuc3RvcmVzRGVsdGEgPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kb3duXT1cInJvdy5zdG9yZXNEZWx0YSA8IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZsYXRdPVwicm93LnN0b3Jlc0RlbHRhID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwicm93LnN0b3Jlc0RlbHRhID4gMFwiPuKWsiB7eyByb3cuc3RvcmVzRGVsdGEgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJyb3cuc3RvcmVzRGVsdGEgPCAwXCI+4pa8IHt7IC1yb3cuc3RvcmVzRGVsdGEgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+4pasIDA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgcm93LmN1cnJlbmN5U3ltYm9sIH19e3sgcm93Lmludm9pY2VBbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LmFtb3VudERlbHRhICE9PSBudWxsXCIgY2xhc3M9XCJpbmQgbXMtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudXBdPVwicm93LmFtb3VudERlbHRhID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZG93bl09XCJyb3cuYW1vdW50RGVsdGEgPCAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5mbGF0XT1cInJvdy5hbW91bnREZWx0YSA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInJvdy5hbW91bnREZWx0YSA+IDBcIj7ilrIge3sgcm93LmN1cnJlbmN5U3ltYm9sIH19e3sgcm93LmFtb3VudERlbHRhIHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInJvdy5hbW91bnREZWx0YSA8IDBcIj7ilrwge3sgcm93LmN1cnJlbmN5U3ltYm9sIH19e3sgLXJvdy5hbW91bnREZWx0YSB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+4pasIDA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm1vbnRobHlCaWxsaW5nU3VtbWFyeS5sZW5ndGggPiAyXCIgY2xhc3M9XCJtc3VtLXRvZ2dsZVwiIChjbGljayk9XCJ0b2dnbGVNb250aGx5U3VtbWFyeUhpc3RvcnkoKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb250aGx5U3VtbWFyeUV4cGFuZGVkXCI+4pa+IFNob3cgb2xkZXIgbW9udGhzICh7eyBtb250aGx5QmlsbGluZ1N1bW1hcnkubGVuZ3RoIC0gMiB9fSk8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb250aGx5U3VtbWFyeUV4cGFuZGVkXCI+4pa0IEhpZGUgb2xkZXIgbW9udGhzPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBZGRpdGlvbmFsIFByb2R1Y3RzIOKAlCBub24tc3RhbmRhcmQgcHJvZHVjdHMgYmlsbGVkIGZvciB0aGlzIGNsaWVudCBvbmx5XG4gICAgICAgICAoZS5nLiBjbGllbnRJZCAxMTogRXlldGVzdCwgUGxhbm9ncmFtKS4gSGlkZGVuIHdoZW4gdGhlIGNsaWVudCBoYXMgbm9uZS4gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1vbnRobHktYmlsbGluZy1zdW1tYXJ5XCIgKm5nSWY9XCJhZGRpdGlvbmFsUHJvZHVjdHM/Lmxlbmd0aFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXN1bS1oZWFkZXJcIj5BZGRpdGlvbmFsIFByb2R1Y3RzPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBtYi0wXCI+XG4gICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+UHJvZHVjdCBOYW1lPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInRleHQtZW5kXCI+UXVhbnRpdHk8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1lbmRcIj5QcmljZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWVuZFwiPlRvdGFsPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBwIG9mIGFkZGl0aW9uYWxQcm9kdWN0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHAucHJvZHVjdE5hbWUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj57eyBwLnF1YW50aXR5IHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZFwiPnt7IChhZGRpdGlvbmFsUHJvZHVjdHNDdXJyZW5jeSA9PT0gJ2RvbGxhcicgPyAnJCcgOiAn4oK5JykgfX17eyBwLnByaWNlIHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZFwiPjxzdHJvbmc+e3sgKGFkZGl0aW9uYWxQcm9kdWN0c0N1cnJlbmN5ID09PSAnZG9sbGFyJyA/ICckJyA6ICfigrknKSB9fXt7IHAudG90YWwgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIzXCIgY2xhc3M9XCJ0ZXh0LWVuZFwiPjxzdHJvbmc+R3JhbmQgVG90YWw8L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPnt7IChhZGRpdGlvbmFsUHJvZHVjdHNDdXJyZW5jeSA9PT0gJ2RvbGxhcicgPyAnJCcgOiAn4oK5JykgfX17eyBhZGRpdGlvbmFsUHJvZHVjdHNUb3RhbCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2VhcmNoICsgRmlsdGVyIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcGF5bWVudGhpc3RvcnkgYm9yZGVyLTAgcHgtMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10b29sYmFyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgbXktMVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIGludm9pY2VzZWFyY2ggc3ZnLWljb24tMSBwb3NpdGlvbi1hYnNvbHV0ZSBtdC02IG1zLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IG9wYWNpdHk9XCIwLjVcIiB4PVwiMTcuMDM2NVwiIHk9XCIxNS4xMjIzXCIgd2lkdGg9XCI4LjE1NTQ2XCIgaGVpZ2h0PVwiMlwiIHJ4PVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSg0NSAxNy4wMzY1IDE1LjEyMjMpXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcmVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExIDE5QzYuNTU1NTYgMTkgMyAxNS40NDQ0IDMgMTFDMyA2LjU1NTU2IDYuNTU1NTYgMyAxMSAzQzE1LjQ0NDQgMyAxOSA2LjU1NTU2IDE5IDExQzE5IDE1LjQ0NDQgMTUuNDQ0NCAxOSAxMSAxOVpNMTEgNUM3LjUzMzMzIDUgNSA3LjUzMzMzIDUgMTFDNSAxNC40NjY3IDcuNTMzMzMgMTcgMTEgMTdDMTQuNDY2NyAxNyAxNyAxNC40NjY3IDE3IDExQzE3IDcuNTMzMzMgMTQuNDY2NyA1IDExIDVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImxlblwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcHMtMTQgaW52b2ljZXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlN0b3JlIG5hbWUgb3IgSUQuLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoY2hhbmdlKT1cInNlYXJjaEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNlYXJjaERpc2FibGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1maWx0ZXJzIFtkYXRhT2JqZWN0XT1cInN0b3JlRmlsdGVyT2JqZWN0XCIgKGFwcGxpZWRGaWx0ZXJzKT1cImFwcGx5U3RvcmVGaWx0ZXJzKCRldmVudClcIj48L2xpYi1maWx0ZXJzPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMb2FkaW5nIFNoaW1tZXIgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0b3JlTG9hZGluZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gTm8gRGF0YSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RvcmVOb0RhdGFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmMgdy0yNVwiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gU3RvcmVzIFRhYmxlIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhc3RvcmVMb2FkaW5nICYmICFzdG9yZU5vRGF0YVwiIGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhY2NvcmRpb24gdGFibGUgYm90dG9tLWJvcmRlciB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ3N0b3JlTmFtZScpXCI+U1RPUkUgTkFNRVxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0Q29sdW1OYW1lID09PSAnc3RvcmVOYW1lJyAmJiBzb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydENvbHVtTmFtZSA9PT0gJ3N0b3JlTmFtZScgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+U1RPUkUgSUQ8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+UFJPRFVDVFM8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgndHJhZmZpY0NhbWVyYUNvdW50JylcIj5UUkFGRklDIENBTUVSQVNcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydENvbHVtTmFtZSA9PT0gJ3RyYWZmaWNDYW1lcmFDb3VudCcgJiYgc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRDb2x1bU5hbWUgPT09ICd0cmFmZmljQ2FtZXJhQ291bnQnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ3pvbmVDYW1lcmFDb3VudCcpXCI+Wk9ORSBDQU1FUkFTXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICd6b25lQ2FtZXJhQ291bnQnICYmIHNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAnem9uZUNhbWVyYUNvdW50JyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCd6b25lQ291bnQnKVwiPlpPTkVTXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICd6b25lQ291bnQnICYmIHNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAnem9uZUNvdW50JyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD5GSVJTVCBGSUxFIERBVEU8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgnZGF5c0RpZmZlcmVuY2UnKVwiPldPUktJTkcgREFZU1xuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0Q29sdW1OYW1lID09PSAnZGF5c0RpZmZlcmVuY2UnICYmIHNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAnZGF5c0RpZmZlcmVuY2UnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoPlNUQVRVUzwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInRleHQtZW5kXCI+SU5WT0lDRSBBTU9VTlQ8L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgc3RvcmUgb2Ygc3RvcmVMaXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZSB0YWJsZS10aXRsZS1wcmltYXJ5XCI+e3sgc3RvcmU/LnN0b3JlTmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57eyBzdG9yZT8uc3RvcmVJZCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBzdG9yZT8ucHJvZHVjdHNcIiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LXByaW1hcnkgbWUtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtYXRQcm9kdWN0TmFtZShwcm9kdWN0Py5wcm9kdWN0TmFtZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0VkaXRpbmdGaWVsZChzdG9yZT8uc3RvcmVJZCwgJ3RyYWZmaWNDYW1lcmFDb3VudCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IHN0b3JlPy50cmFmZmljQ2FtZXJhQ291bnQgfHwgMCB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBlZGl0LWljb25cIiAoY2xpY2spPVwic3RhcnRGaWVsZEVkaXQoc3RvcmUsICd0cmFmZmljQ2FtZXJhQ291bnQnKVwiIHRpdGxlPVwiRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuOTE2NjcgMS43NTAwNEMxMC4wNjk4IDEuNTk2ODMgMTAuMjUxOCAxLjQ3NTMzIDEwLjQ1MTkgMS4zOTIzOEMxMC42NTIyIDEuMzA5NDYgMTAuODY2NyAxLjI2Njc5IDExLjA4MzMgMS4yNjY3OUMxMS4zIDEuMjY2NzkgMTEuNTE0NSAxLjMwOTQ2IDExLjcxNDggMS4zOTIzOEMxMS45MTQ5IDEuNDc1MzMgMTIuMDk2OSAxLjU5NjgzIDEyLjI1IDEuNzUwMDRDMTIuNDAzMiAxLjkwMzI1IDEyLjUyNDcgMi4wODUyOSAxMi42MDc3IDIuMjg1NDZDMTIuNjkwNiAyLjQ4NTY3IDEyLjczMzMgMi43MDAxMyAxMi43MzMzIDIuOTE2NzFDMTIuNzMzMyAzLjEzMzI5IDEyLjY5MDYgMy4zNDc3NSAxMi42MDc3IDMuNTQ3OTZDMTIuNTI0NyAzLjc0ODEzIDEyLjQwMzIgMy45MzAxNyAxMi4yNSA0LjA4MzM4TDQuMzc1IDExLjk1ODRMMS4xNjY2NyAxMi44MzM0TDIuMDQxNjcgOS42MjUwNEw5LjkxNjY3IDEuNzUwMDRaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMTZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFZGl0aW5nRmllbGQoc3RvcmU/LnN0b3JlSWQsICd0cmFmZmljQ2FtZXJhQ291bnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlZGl0aW5nRmllbGRbZ2V0RmllbGRFZGl0S2V5KHN0b3JlPy5zdG9yZUlkLCAndHJhZmZpY0NhbWVyYUNvdW50JyldXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlRmllbGRFZGl0KHN0b3JlLCAndHJhZmZpY0NhbWVyYUNvdW50JylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJjYW5jZWxGaWVsZEVkaXQoc3RvcmUsICd0cmFmZmljQ2FtZXJhQ291bnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciB0ZXh0LXN1Y2Nlc3NcIiAoY2xpY2spPVwic2F2ZUZpZWxkRWRpdChzdG9yZSwgJ3RyYWZmaWNDYW1lcmFDb3VudCcpXCIgdGl0bGU9XCJTYXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTMuMzMzNCA0TDYuMDAwMDggMTEuMzMzM0wyLjY2Njc1IDhcIiBzdHJva2U9XCIjMTJCNzZBXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciB0ZXh0LWRhbmdlclwiIChjbGljayk9XCJjYW5jZWxGaWVsZEVkaXQoc3RvcmUsICd0cmFmZmljQ2FtZXJhQ291bnQnKVwiIHRpdGxlPVwiQ2FuY2VsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgNEw0IDEyTTQgNEwxMiAxMlwiIHN0cm9rZT1cIiNGMDQ0MzhcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFZGl0aW5nRmllbGQoc3RvcmU/LnN0b3JlSWQsICd6b25lQ2FtZXJhQ291bnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyBzdG9yZT8uem9uZUNhbWVyYUNvdW50IHx8IDAgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZWRpdC1pY29uXCIgKGNsaWNrKT1cInN0YXJ0RmllbGRFZGl0KHN0b3JlLCAnem9uZUNhbWVyYUNvdW50JylcIiB0aXRsZT1cIkVkaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05LjkxNjY3IDEuNzUwMDRDMTAuMDY5OCAxLjU5NjgzIDEwLjI1MTggMS40NzUzMyAxMC40NTE5IDEuMzkyMzhDMTAuNjUyMiAxLjMwOTQ2IDEwLjg2NjcgMS4yNjY3OSAxMS4wODMzIDEuMjY2NzlDMTEuMyAxLjI2Njc5IDExLjUxNDUgMS4zMDk0NiAxMS43MTQ4IDEuMzkyMzhDMTEuOTE0OSAxLjQ3NTMzIDEyLjA5NjkgMS41OTY4MyAxMi4yNSAxLjc1MDA0QzEyLjQwMzIgMS45MDMyNSAxMi41MjQ3IDIuMDg1MjkgMTIuNjA3NyAyLjI4NTQ2QzEyLjY5MDYgMi40ODU2NyAxMi43MzMzIDIuNzAwMTMgMTIuNzMzMyAyLjkxNjcxQzEyLjczMzMgMy4xMzMyOSAxMi42OTA2IDMuMzQ3NzUgMTIuNjA3NyAzLjU0Nzk2QzEyLjUyNDcgMy43NDgxMyAxMi40MDMyIDMuOTMwMTcgMTIuMjUgNC4wODMzOEw0LjM3NSAxMS45NTg0TDEuMTY2NjcgMTIuODMzNEwyLjA0MTY3IDkuNjI1MDRMOS45MTY2NyAxLjc1MDA0WlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjE2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRWRpdGluZ0ZpZWxkKHN0b3JlPy5zdG9yZUlkLCAnem9uZUNhbWVyYUNvdW50JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIGVkaXQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZWRpdGluZ0ZpZWxkW2dldEZpZWxkRWRpdEtleShzdG9yZT8uc3RvcmVJZCwgJ3pvbmVDYW1lcmFDb3VudCcpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2F2ZUZpZWxkRWRpdChzdG9yZSwgJ3pvbmVDYW1lcmFDb3VudCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwiY2FuY2VsRmllbGRFZGl0KHN0b3JlLCAnem9uZUNhbWVyYUNvdW50JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC1zdWNjZXNzXCIgKGNsaWNrKT1cInNhdmVGaWVsZEVkaXQoc3RvcmUsICd6b25lQ2FtZXJhQ291bnQnKVwiIHRpdGxlPVwiU2F2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjMzMzQgNEw2LjAwMDA4IDExLjMzMzNMMi42NjY3NSA4XCIgc3Ryb2tlPVwiIzEyQjc2QVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC1kYW5nZXJcIiAoY2xpY2spPVwiY2FuY2VsRmllbGRFZGl0KHN0b3JlLCAnem9uZUNhbWVyYUNvdW50JylcIiB0aXRsZT1cIkNhbmNlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDRMNCAxMk00IDRMMTIgMTJcIiBzdHJva2U9XCIjRjA0NDM4XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRWRpdGluZ0ZpZWxkKHN0b3JlPy5zdG9yZUlkLCAnem9uZUNvdW50JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgc3RvcmU/LnpvbmVDb3VudCB8fCAwIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGVkaXQtaWNvblwiIChjbGljayk9XCJzdGFydEZpZWxkRWRpdChzdG9yZSwgJ3pvbmVDb3VudCcpXCIgdGl0bGU9XCJFZGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOS45MTY2NyAxLjc1MDA0QzEwLjA2OTggMS41OTY4MyAxMC4yNTE4IDEuNDc1MzMgMTAuNDUxOSAxLjM5MjM4QzEwLjY1MjIgMS4zMDk0NiAxMC44NjY3IDEuMjY2NzkgMTEuMDgzMyAxLjI2Njc5QzExLjMgMS4yNjY3OSAxMS41MTQ1IDEuMzA5NDYgMTEuNzE0OCAxLjM5MjM4QzExLjkxNDkgMS40NzUzMyAxMi4wOTY5IDEuNTk2ODMgMTIuMjUgMS43NTAwNEMxMi40MDMyIDEuOTAzMjUgMTIuNTI0NyAyLjA4NTI5IDEyLjYwNzcgMi4yODU0NkMxMi42OTA2IDIuNDg1NjcgMTIuNzMzMyAyLjcwMDEzIDEyLjczMzMgMi45MTY3MUMxMi43MzMzIDMuMTMzMjkgMTIuNjkwNiAzLjM0Nzc1IDEyLjYwNzcgMy41NDc5NkMxMi41MjQ3IDMuNzQ4MTMgMTIuNDAzMiAzLjkzMDE3IDEyLjI1IDQuMDgzMzhMNC4zNzUgMTEuOTU4NEwxLjE2NjY3IDEyLjgzMzRMMi4wNDE2NyA5LjYyNTA0TDkuOTE2NjcgMS43NTAwNFpcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4xNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0VkaXRpbmdGaWVsZChzdG9yZT8uc3RvcmVJZCwgJ3pvbmVDb3VudCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSBlZGl0LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVkaXRpbmdGaWVsZFtnZXRGaWVsZEVkaXRLZXkoc3RvcmU/LnN0b3JlSWQsICd6b25lQ291bnQnKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNhdmVGaWVsZEVkaXQoc3RvcmUsICd6b25lQ291bnQnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImNhbmNlbEZpZWxkRWRpdChzdG9yZSwgJ3pvbmVDb3VudCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHRleHQtc3VjY2Vzc1wiIChjbGljayk9XCJzYXZlRmllbGRFZGl0KHN0b3JlLCAnem9uZUNvdW50JylcIiB0aXRsZT1cIlNhdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMy4zMzM0IDRMNi4wMDAwOCAxMS4zMzMzTDIuNjY2NzUgOFwiIHN0cm9rZT1cIiMxMkI3NkFcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHRleHQtZGFuZ2VyXCIgKGNsaWNrKT1cImNhbmNlbEZpZWxkRWRpdChzdG9yZSwgJ3pvbmVDb3VudCcpXCIgdGl0bGU9XCJDYW5jZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA0TDQgMTJNNCA0TDEyIDEyXCIgc3Ryb2tlPVwiI0YwNDQzOFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+e3sgc3RvcmU/LmVkZ2VmaXJzdEZpbGVEYXRlID8gKHN0b3JlPy5lZGdlZmlyc3RGaWxlRGF0ZSB8IGRhdGU6ICdkZCBNTU0geXl5eScpIDogJ+KAlCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCIgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2Ygc3RvcmU/LnByb2R1Y3RzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgbWItMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWRcIj57eyBmb3JtYXRQcm9kdWN0TmFtZShwcm9kdWN0Py5wcm9kdWN0TmFtZSkgfX06PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVmlldyBtb2RlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRWRpdGluZyhzdG9yZT8uc3RvcmVJZCwgcHJvZHVjdD8ucHJvZHVjdE5hbWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IHByb2R1Y3Q/LndvcmtpbmdkYXlzIHx8IDAgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZWRpdC1pY29uXCIgKGNsaWNrKT1cInN0YXJ0RWRpdChzdG9yZSwgcHJvZHVjdClcIiB0aXRsZT1cIkVkaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05LjkxNjY3IDEuNzUwMDRDMTAuMDY5OCAxLjU5NjgzIDEwLjI1MTggMS40NzUzMyAxMC40NTE5IDEuMzkyMzhDMTAuNjUyMiAxLjMwOTQ2IDEwLjg2NjcgMS4yNjY3OSAxMS4wODMzIDEuMjY2NzlDMTEuMyAxLjI2Njc5IDExLjUxNDUgMS4zMDk0NiAxMS43MTQ4IDEuMzkyMzhDMTEuOTE0OSAxLjQ3NTMzIDEyLjA5NjkgMS41OTY4MyAxMi4yNSAxLjc1MDA0QzEyLjQwMzIgMS45MDMyNSAxMi41MjQ3IDIuMDg1MjkgMTIuNjA3NyAyLjI4NTQ2QzEyLjY5MDYgMi40ODU2NyAxMi43MzMzIDIuNzAwMTMgMTIuNzMzMyAyLjkxNjcxQzEyLjczMzMgMy4xMzMyOSAxMi42OTA2IDMuMzQ3NzUgMTIuNjA3NyAzLjU0Nzk2QzEyLjUyNDcgMy43NDgxMyAxMi40MDMyIDMuOTMwMTcgMTIuMjUgNC4wODMzOEw0LjM3NSAxMS45NTg0TDEuMTY2NjcgMTIuODMzNEwyLjA0MTY3IDkuNjI1MDRMOS45MTY2NyAxLjc1MDA0WlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjE2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVkaXQgbW9kZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRWRpdGluZyhzdG9yZT8uc3RvcmVJZCwgcHJvZHVjdD8ucHJvZHVjdE5hbWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSBlZGl0LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVkaXRpbmdQcm9kdWN0W2dldEVkaXRLZXkoc3RvcmU/LnN0b3JlSWQsIHByb2R1Y3Q/LnByb2R1Y3ROYW1lKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNhdmVXb3JraW5nRGF5cyhzdG9yZSwgcHJvZHVjdClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJjYW5jZWxFZGl0KHN0b3JlLCBwcm9kdWN0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciB0ZXh0LXN1Y2Nlc3NcIiAoY2xpY2spPVwic2F2ZVdvcmtpbmdEYXlzKHN0b3JlLCBwcm9kdWN0KVwiIHRpdGxlPVwiU2F2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjMzMzQgNEw2LjAwMDA4IDExLjMzMzNMMi42NjY3NSA4XCIgc3Ryb2tlPVwiIzEyQjc2QVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC1kYW5nZXJcIiAoY2xpY2spPVwiY2FuY2VsRWRpdChzdG9yZSwgcHJvZHVjdClcIiB0aXRsZT1cIkNhbmNlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDRMNCAxMk00IDRMMTIgMTJcIiBzdHJva2U9XCIjRjA0NDM4XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiIFtuZ0NsYXNzXT1cInN0b3JlPy5zdGF0dXMgPT09ICdhY3RpdmUnID8gJ2JhZGdlIGJhZGdlLWxpZ2h0LXN1Y2Nlc3MnIDogJ2JhZGdlIGJhZGdlLWxpZ2h0LWRhbmdlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzdG9yZT8uc3RhdHVzIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUGVyLXByb2R1Y3QgYnJlYWtkb3duIChUcmFmZmljOiDigrl4LCBab25lOiDigrl5IOKApikgKyB0b3RhbC4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBiIG9mIHN0b3JlPy5pbnZvaWNlQnJlYWtkb3duXCIgY2xhc3M9XCJpbnYtYnJlYWtkb3duLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52LWJyZWFrZG93bi1sYWJlbFwiPnt7IGIubGFiZWwgfX06PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHN0b3JlQ3VycmVuY3lTeW1ib2woc3RvcmUpIH19e3sgKGIuYW1vdW50IHx8IDApIHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgaW52LWJyZWFrZG93bi10b3RhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgc3RvcmVDdXJyZW5jeVN5bWJvbChzdG9yZSkgfX17eyAoc3RvcmU/Lmludm9pY2VBbW91bnQgfHwgMCkgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFzdG9yZUxvYWRpbmcgJiYgIXN0b3JlTm9EYXRhXCI+XG4gICAgICAgICAgICA8bGliLXBhZ2luYXRpb24gY2xhc3M9XCJ0ZXh0LXN0YXJ0XCIgW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2VcIlxuICAgICAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIiAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
458
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFpbHktcHJpY2luZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtYmlsbGluZy9zcmMvbGliL2NvbXBvbmVudHMvZGFpbHktcHJpY2luZy9kYWlseS1wcmljaW5nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9kYWlseS1wcmljaW5nL2RhaWx5LXByaWNpbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUErQyxNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkxQyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUMxRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7Ozs7OztBQU94RixNQUFNLE9BQU8scUJBQXFCO0lBdUR0QjtJQUNBO0lBQ0E7SUFDQTtJQXpETyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUVqQyxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBRS9CLEdBQUcsQ0FBTTtJQUNULGNBQWMsR0FBWSxLQUFLLENBQUM7SUFFaEMsV0FBVztJQUNYLGdCQUFnQixHQUFRLEVBQUUsQ0FBQztJQUUzQix5RUFBeUU7SUFDekUsY0FBYyxHQUFRLEVBQUUsQ0FBQztJQUN6Qix3RkFBd0Y7SUFDeEYsWUFBWSxHQUFRLEVBQUUsQ0FBQztJQUV2QixjQUFjO0lBQ2QsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUV4Qiw2RUFBNkU7SUFDN0UseUVBQXlFO0lBQ3pFLFlBQVksR0FBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLGlCQUFpQixHQUFH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QUFhLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNyRixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQUUsR0FBRyxHQUFHLFNBQVMsQ0FBQztpQkFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFBRSxHQUFHLEdBQUcsZ0JBQWdCLENBQUM7aUJBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFFLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQztZQUMvRCxPQUFPO2dCQUNMLEdBQUcsQ0FBQztnQkFDSixVQUFVLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3pELEdBQUc7Z0JBQ0gsV0FBVztnQkFDWCxXQUFXO2dCQUNYLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRTthQUNuRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsMkJBQTJCO1FBQ3pCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUM3RCxDQUFDO3dHQWxlVSxxQkFBcUI7NEZBQXJCLHFCQUFxQixnSENibEMsdXRpQ0FnYk07OzRGRG5hTyxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsbUJBQW1CO3FLQU9wQixRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBCaWxsaW5nU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2JpbGxpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IEdlbmVyYXRlSW52b2ljZU1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9nZW5lcmF0ZS1pbnZvaWNlLW1vZGFsL2dlbmVyYXRlLWludm9pY2UtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IE5ld1N0b3Jlc01vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9uZXctc3RvcmVzLW1vZGFsL25ldy1zdG9yZXMtbW9kYWwuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWRhaWx5LXByaWNpbmcnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGFpbHktcHJpY2luZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kYWlseS1wcmljaW5nLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBEYWlseVByaWNpbmdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgQElucHV0KCkgY2xpZW50SWQ6IHN0cmluZyA9ICcnO1xuXG4gIGxlbjogYW55O1xuICBzZWFyY2hEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIE1ldGFkYXRhXG4gIGRhaWx5UHJpY2luZ0luZm86IGFueSA9IHt9O1xuXG4gIC8vIEVkaXQgdHJhY2tpbmc6IGtleSA9ICdzdG9yZUlkX3Byb2R1Y3ROYW1lJywgdmFsdWUgPSBlZGl0ZWQgd29ya2luZ2RheXNcbiAgZWRpdGluZ1Byb2R1Y3Q6IGFueSA9IHt9O1xuICAvLyBFZGl0IHRyYWNraW5nIGZvciBzdG9yZS1sZXZlbCBmaWVsZHMgKHRyYWZmaWNDYW1lcmFDb3VudCwgem9uZUNhbWVyYUNvdW50LCB6b25lQ291bnQpXG4gIGVkaXRpbmdGaWVsZDogYW55ID0ge307XG5cbiAgLy8gRGF0ZSBmaWx0ZXJcbiAgZGF0ZUZpbHRlcjogc3RyaW5nID0gJyc7XG5cbiAgLy8gRmlsdGVyIOKAlCBtdWx0aS1zZWxlY3Qgc3RhdHVzLiBEZWZhdWx0IHRvIEFjdGl2ZSBzbyB0aGUgdGFibGUgb3BlbnMgc2hvd2luZ1xuICAvLyBvbmx5IGFjdGl2ZSBzdG9yZXM7IHRoZSBkcm9wZG93biBtYXJrcyBBY3RpdmUgY2hlY2tlZCB0byByZWZsZWN0IHRoYXQuXG4gIHN0YXR1c0ZpbHRlcjogc3RyaW5nW10gPSBbJ2FjdGl2ZSddO1xuICBzdG9yZUZpbHRlck9iamVjdCA9IFtcbiAgICB7IERlc2NyaXB0aW9uOiAnU3RhdHVzJywgdHlwZTogJ211bHRpJywgSXNzdWVzOiBbeyBpZDogJ2FjdGl2ZScsIHRleHQ6ICdBY3RpdmUnLCBjaGVja2VkOiB0cnVlIH0sIHsgaWQ6ICdkZWFjdGl2ZScsIHRleHQ6ICdEZWFjdGl2ZScgfV0gfSxcbiAgXTtcblxuICAvLyBNb250aGx5IEJpbGxpbmcgU3VtbWFyeSDigJQgZGVyaXZlZCBmcm9tIGludm9pY2UgaGlzdG9yeSBmb3IgdGhlIGJyYW5kLlxuICAvLyBOZXdlc3QgZmlyc3Q7IGVhY2ggcm93IGNhcnJpZXMgcHJpb3ItbW9udGggZGVsdGFzIGZvciB0aGUgdHJlbmQgaW5kaWNhdG9yLlxuICBtb250aGx5QmlsbGluZ1N1bW1hcnk6IGFueVtdID0gW107XG4gIG1vbnRobHlTdW1tYXJ5RXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBUYWJsZVxuICBzdG9yZUxpc3Q6IGFueSA9IFtdO1xuICBzdG9yZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBzdG9yZU5vRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICB0b3RhbEl0ZW1zOiBudW1iZXIgPSAwO1xuICBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIGN1cnJlbnRQYWdlOiBudW1iZXIgPSAxO1xuICBpdGVtc1BlclBhZ2U6IG51bWJlciA9IDEwO1xuICBwYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMF07XG4gIHNvcnRDb2x1bU5hbWU6IHN0cmluZyA9ICdzdG9yZU5hbWUnO1xuICBzb3J0Qnk6IG51bWJlciA9IDE7XG4gIGdlbmVyYXRpbmdJbnZvaWNlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gQWRkaXRpb25hbCAobm9uLXN0YW5kYXJkKSBwcm9kdWN0cyBhdmFpbGFibGUgb25seSBmb3Igc3BlY2lmaWMgY2xpZW50c1xuICAvLyAoY3VycmVudGx5IGNsaWVudElkIDExKS4gRW1wdHkgZm9yIGV2ZXJ5b25lIGVsc2UgLT4gdGhlIHRhYmxlIGlzIGhpZGRlbi5cbiAgYWRkaXRpb25hbFByb2R1Y3RzOiBhbnlbXSA9IFtdO1xuICBhZGRpdGlvbmFsUHJvZHVjdHNDdXJyZW5jeTogc3RyaW5nID0gJ2lucic7XG5cbiAgLy8gQ291bnQgKyBsaXN0IG9mIHN0b3JlcyBvbmJvYXJkZWQgdGhpcyBtb250aCAoZmlyc3QgZmlsZSBkYXRlIGluIHRoZSBjdXJyZW50XG4gIC8vIG1vbnRoKS4gVGhlIGxpc3QgZmVlZHMgdGhlIFwiVmlldyBTdG9yZXNcIiBwb3B1cC5cbiAgbmV3bHlPbmJvYXJkZWRTdG9yZXM6IG51bWJlciA9IDA7XG4gIG5ld2x5T25ib2FyZGVkU3RvcmVMaXN0OiBhbnlbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsaWVudElkKSB7XG4gICAgICB0aGlzLmxvYWREYWlseVByaWNpbmcoKTtcbiAgICAgIHRoaXMubG9hZEFkZGl0aW9uYWxQcm9kdWN0cygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY2xpZW50SWQnXSAmJiAhY2hhbmdlc1snY2xpZW50SWQnXS5maXJzdENoYW5nZSAmJiB0aGlzLmNsaWVudElkKSB7XG4gICAgICB0aGlzLmxvYWREYWlseVByaWNpbmcoKTtcbiAgICAgIHRoaXMubG9hZEFkZGl0aW9uYWxQcm9kdWN0cygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdyYW5kIHRvdGFsIGFjcm9zcyBhbGwgYWRkaXRpb25hbC1wcm9kdWN0IHJvd3MuXG4gIGdldCBhZGRpdGlvbmFsUHJvZHVjdHNUb3RhbCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5hZGRpdGlvbmFsUHJvZHVjdHMgfHwgW10pLnJlZHVjZSgoYSwgcCkgPT4gYSArIChOdW1iZXIocC50b3RhbCkgfHwgMCksIDApO1xuICB9XG5cbiAgLy8gUHJvZHVjdHMgdGhhdCBoYXZlIGEgYmFja2VuZCBkZXRhaWxlZCBleHBvcnQuIEtleWVkIGJ5IHRoZSBwcm9kdWN0IGtleSB0aGVcbiAgLy8gZXhwb3J0IGVuZHBvaW50IHVuZGVyc3RhbmRzLiBBZGQgbW9yZSBhcyB0aGVpciBxdWVyaWVzIGFyZSB3aXJlZCB1cC5cbiAgcHJpdmF0ZSByZWFkb25seSBleHBvcnRhYmxlUHJvZHVjdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ2V5ZXRlc3QnOiAnZXlldGVzdCcsXG4gICAgJ3BsYW5vZ3JhbSc6ICdwbGFub2dyYW0nLFxuICAgICdhaSBtYW5hZ2VyJzogJ2FpbWFuYWdlcicsXG4gICAgJ3Ztcyc6ICd2bXMnLFxuICAgICdydW4gYWknOiAncnVuYWknLFxuICAgICdyZW1vdGUgb3B0dW0nOiAncmVtb3Rlb3B0dW0nLFxuICB9O1xuXG4gIGNhbkV4cG9ydEFkZGl0aW9uYWxQcm9kdWN0KHByb2R1Y3ROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmV4cG9ydGFibGVQcm9kdWN0c1socHJvZHVjdE5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCldO1xuICB9XG5cbiAgZXhwb3J0QWRkaXRpb25hbFByb2R1Y3QocHJvZHVjdE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZXhwb3J0YWJsZVByb2R1Y3RzWyhwcm9kdWN0TmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUGFzcyB0b2RheSdzIGRhdGUgKFlZWVktTU0tREQpIOKAlCB1c2VkIGJ5IGRheS1zY29wZWQgcHJvZHVjdHMgKFJlbW90ZSBPcHR1bSkuXG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHRvZGF5U3RyID0gYCR7dG9kYXkuZ2V0RnVsbFllYXIoKX0tJHtTdHJpbmcodG9kYXkuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyl9LSR7U3RyaW5nKHRvZGF5LmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYWRkaXRpb25hbFByb2R1Y3RFeHBvcnQodGhpcy5jbGllbnRJZCwga2V5LCB0b2RheVN0cilcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBBcnJheUJ1ZmZlcikgPT4ge1xuICAgICAgICAgIC8vIEEgcmVhbCAueGxzeCBpcyBhIHppcCDigJQgaXRzIGZpcnN0IHR3byBieXRlcyBhcmUgJ1BLJyAoMHg1MCAweDRCKS5cbiAgICAgICAgICAvLyBBIDIwNC9lbXB0eSBvciBKU09OIGVycm9yIGJvZHkgaXMgTk9ULCBhbmQgc2F2aW5nIGl0IHByb2R1Y2VzIGFcbiAgICAgICAgICAvLyBcImNvcnJ1cHRlZFwiIGZpbGUuIEd1YXJkIHNvIHdlIG9ubHkgc2F2ZSBhIGdlbnVpbmUgd29ya2Jvb2suXG4gICAgICAgICAgY29uc3QgYnl0ZXMgPSByZXMgPyBuZXcgVWludDhBcnJheShyZXMpIDogbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICBjb25zdCBpc1hsc3ggPSBieXRlcy5sZW5ndGggPiAxICYmIGJ5dGVzWzBdID09PSAweDUwICYmIGJ5dGVzWzFdID09PSAweDRiO1xuICAgICAgICAgIGlmICghaXNYbHN4KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ05vIGRhdGEgdG8gZXhwb3J0Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2Uuc2F2ZUFzRXhjZWxGaWxlKHJlcywgYCR7cHJvZHVjdE5hbWV9LSR7dGhpcy5jbGllbnRJZH1gKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0V4cG9ydCBmYWlsZWQnKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gRmV0Y2ggdGhlIGFkZGl0aW9uYWwtcHJvZHVjdHMgdGFibGUgZm9yIHRoaXMgY2xpZW50LiBCYWNrZW5kIHJldHVybnMgYW5cbiAgLy8gZW1wdHkgbGlzdCBmb3IgYW55IGNsaWVudCB0aGF0IGhhcyBub25lIChzbyB0aGUgdGFibGUganVzdCB3b24ndCByZW5kZXIpLlxuICBsb2FkQWRkaXRpb25hbFByb2R1Y3RzKCkge1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYWRkaXRpb25hbFByb2R1Y3RzKHRoaXMuY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmFkZGl0aW9uYWxQcm9kdWN0cyA9IHJlcz8uZGF0YT8ucHJvZHVjdHMgfHwgW107XG4gICAgICAgIHRoaXMuYWRkaXRpb25hbFByb2R1Y3RzQ3VycmVuY3kgPSByZXM/LmRhdGE/LmN1cnJlbmN5IHx8ICdpbnInO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmFkZGl0aW9uYWxQcm9kdWN0cyA9IFtdO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgbG9hZERhaWx5UHJpY2luZygpIHtcbiAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5zdG9yZUxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc3RvcmVOb0RhdGEgPSBmYWxzZTtcblxuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmxlbixcbiAgICAgIHNvcnRDb2x1bU5hbWU6IHRoaXMuc29ydENvbHVtTmFtZSxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICBzdGF0dXNGaWx0ZXI6IHRoaXMuc3RhdHVzRmlsdGVyLFxuICAgICAgZGF0ZUZpbHRlcjogdGhpcy5kYXRlRmlsdGVyIHx8ICcnLFxuICAgICAgZXhwb3J0OiBmYWxzZVxuICAgIH07XG5cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmxhdGVzdERhaWx5UHJpY2luZyhmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChlKSA9PiB7XG4gICAgICAgIC8vIFRoZSBNb250aGx5IEJpbGxpbmcgU3VtbWFyeSBjb21lcyBmcm9tIGludm9pY2UgaGlzdG9yeSwgbm90IHRoZSBzdG9yZVxuICAgICAgICAvLyByb3dzIOKAlCBhcHBseSBpdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHN0b3JlIGxpc3QgaXMgZW1wdHksIHNvIGl0XG4gICAgICAgIC8vIHN0aWxsIHNob3dzIHdoZW4gdGhlIGZpbHRlcmVkIHN0b3JlIHRhYmxlIGhhcyBubyByb3dzLlxuICAgICAgICB0aGlzLm1vbnRobHlCaWxsaW5nU3VtbWFyeSA9IHRoaXMuZGVjb3JhdGVNb250aGx5U3VtbWFyeShlPy5kYXRhPy5tb250aGx5QmlsbGluZ1N1bW1hcnkgfHwgW10pO1xuICAgICAgICAvLyBOZXdseSBvbmJvYXJkZWQgY291bnQvbGlzdCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgc3RvcmUgdGFibGUnc1xuICAgICAgICAvLyBmaWx0ZXJzLCBzbyBjYXB0dXJlIGl0IHdoZXRoZXIgb3Igbm90IHRoZSBmaWx0ZXJlZCBzdG9yZSBsaXN0IGhhcyByb3dzLlxuICAgICAgICB0aGlzLm5ld2x5T25ib2FyZGVkU3RvcmVzID0gZT8uZGF0YT8ubmV3bHlPbmJvYXJkZWRTdG9yZXMgfHwgMDtcbiAgICAgICAgdGhpcy5uZXdseU9uYm9hcmRlZFN0b3JlTGlzdCA9IGU/LmRhdGE/Lm5ld2x5T25ib2FyZGVkU3RvcmVMaXN0IHx8IFtdO1xuXG4gICAgICAgIGlmIChlPy5kYXRhPy5jb3VudCkge1xuICAgICAgICAgIHRoaXMuc3RvcmVMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5zdG9yZU5vRGF0YSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gZS5kYXRhPy5kYXRhO1xuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IGUuZGF0YT8uY291bnQ7XG5cbiAgICAgICAgICB0aGlzLmRhaWx5UHJpY2luZ0luZm8gPSB7XG4gICAgICAgICAgICBicmFuZE5hbWU6IGUuZGF0YT8uYnJhbmROYW1lIHx8ICcnLFxuICAgICAgICAgICAgZGF0ZVN0cmluZzogZS5kYXRhPy5kYXRlU3RyaW5nIHx8ICcnLFxuICAgICAgICAgICAgZGF0ZUlTTzogZS5kYXRhPy5kYXRlSVNPIHx8ICcnLFxuICAgICAgICAgICAgYWN0aXZlU3RvcmVzOiBlLmRhdGE/LmFjdGl2ZVN0b3JlcyB8fCAwLFxuICAgICAgICAgICAgYWNjb3VudFR5cGU6IGUuZGF0YT8uYWNjb3VudFR5cGUgfHwgJycsXG4gICAgICAgICAgICBzdGF0dXM6IGUuZGF0YT8uc3RhdHVzIHx8ICcnLFxuICAgICAgICAgICAgcHJvUmF0ZTogZS5kYXRhPy5wcm9SYXRlIHx8ICcnLFxuICAgICAgICAgICAgY2xpZW50SWQ6IGUuZGF0YT8uY2xpZW50SWQgfHwgJydcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdG9yZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnN0b3JlTm9EYXRhID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodGhpcy5sZW4/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IFtdO1xuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IDA7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnN0b3JlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN0b3JlTm9EYXRhID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMDtcbiAgICAgICAgdGhpcy5tb250aGx5QmlsbGluZ1N1bW1hcnkgPSBbXTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbkRhdGVGaWx0ZXIoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuZGF0ZUZpbHRlciA9IGV2ZW50Py50YXJnZXQ/LnZhbHVlIHx8ICcnO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZERhaWx5UHJpY2luZygpO1xuICB9XG5cbiAgY2xlYXJEYXRlRmlsdGVyKCkge1xuICAgIHRoaXMuZGF0ZUZpbHRlciA9ICcnO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZERhaWx5UHJpY2luZygpO1xuICB9XG5cbiAgc2VhcmNoRmllbGQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkRGFpbHlQcmljaW5nKCk7XG4gIH1cblxuICBhcHBseVN0b3JlRmlsdGVycyhldmVudDogYW55KSB7XG4gICAgLy8gTXVsdGktc2VsZWN0IFN0YXR1cyDigJQgbGliLWZpbHRlcnMgZW1pdHMgZWFjaCBncm91cCdzIHNlbGVjdGVkIG9wdGlvbnMgYXNcbiAgICAvLyBhbiBBUlJBWSB1bmRlciBJc3N1ZXMgKEFwcGx5IHNldHMgSXNzdWVzID0gc2VsZWN0ZWRWYWx1ZXNBcnJheVtpbmRleF0pLlxuICAgIC8vIENvbGxlY3QgZXZlcnkgc2VsZWN0ZWQgaWQsIHRvbGVyYXRpbmcgYm90aCBhcnJheSBhbmQgc2luZ2xlLW9iamVjdCBzaGFwZXMuXG4gICAgY29uc3Qgc3RhdHVzZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKGV2ZW50Py5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5EZXNjcmlwdGlvbiA9PT0gJ1N0YXR1cycpIHtcbiAgICAgICAgICBjb25zdCBpc3N1ZXMgPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuSXNzdWVzKSA/IGVsZW1lbnQuSXNzdWVzIDogKGVsZW1lbnQuSXNzdWVzID8gW2VsZW1lbnQuSXNzdWVzXSA6IFtdKTtcbiAgICAgICAgICBpc3N1ZXMuZm9yRWFjaCgoaTogYW55KSA9PiB7IGlmIChpPy5pZCkgc3RhdHVzZXMucHVzaChpLmlkKTsgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXR1c0ZpbHRlciA9IFsuLi5uZXcgU2V0KHN0YXR1c2VzKV07XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkRGFpbHlQcmljaW5nKCk7XG4gIH1cblxuICBzb3J0RGF0YShjb2x1bW46IHN0cmluZykge1xuICAgIHRoaXMuc29ydENvbHVtTmFtZSA9IGNvbHVtbjtcbiAgICB0aGlzLnNvcnRCeSAqPSAtMTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmxvYWREYWlseVByaWNpbmcoKTtcbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShwYWdlT2Zmc2V0OiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFyc2VJbnQocGFnZU9mZnNldCk7XG4gICAgdGhpcy5sb2FkRGFpbHlQcmljaW5nKCk7XG4gIH1cblxuICBvblBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLnBhZ2VTaXplID0gcGFyc2VJbnQocGFnZVNpemUpO1xuICAgIHRoaXMubG9hZERhaWx5UHJpY2luZygpO1xuICB9XG5cbiAgb25FeHBvcnQoKSB7XG4gICAgbGV0IGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmxlbixcbiAgICAgIHNvcnRDb2x1bU5hbWU6IHRoaXMuc29ydENvbHVtTmFtZSxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICBzdGF0dXNGaWx0ZXI6IHRoaXMuc3RhdHVzRmlsdGVyLFxuICAgICAgZGF0ZUZpbHRlcjogdGhpcy5kYXRlRmlsdGVyIHx8ICcnLFxuICAgICAgZXhwb3J0OiB0cnVlXG4gICAgfTtcblxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UubGF0ZXN0RGFpbHlQcmljaW5nRXhwb3J0KGZpbHRlcnMpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnNhdmVBc0V4Y2VsRmlsZShyZXMsICdkYWlseS1wcmljaW5nJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdTb21ldGhpbmcgd2VudCBXcm9uZy4uJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRFZGl0S2V5KHN0b3JlSWQ6IHN0cmluZywgcHJvZHVjdE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3N0b3JlSWR9XyR7cHJvZHVjdE5hbWV9YDtcbiAgfVxuXG4gIGlzRWRpdGluZyhzdG9yZUlkOiBzdHJpbmcsIHByb2R1Y3ROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nUHJvZHVjdFt0aGlzLmdldEVkaXRLZXkoc3RvcmVJZCwgcHJvZHVjdE5hbWUpXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgc3RhcnRFZGl0KHN0b3JlOiBhbnksIHByb2R1Y3Q6IGFueSkge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0RWRpdEtleShzdG9yZS5zdG9yZUlkLCBwcm9kdWN0LnByb2R1Y3ROYW1lKTtcbiAgICAvLyBDb2VyY2UgdG8gYSBudW1iZXIgc28gYSAwIC8gbWlzc2luZyB2YWx1ZSBzdGlsbCBlbnRlcnMgZWRpdCBtb2RlIHdpdGggYVxuICAgIC8vIGRlZmluZWQgdmFsdWUgKHVuZGVmaW5lZCB3b3VsZCBtYWtlIGlzRWRpdGluZygpIHRoaW5rIHdlJ3JlIG5vdCBlZGl0aW5nKS5cbiAgICB0aGlzLmVkaXRpbmdQcm9kdWN0W2tleV0gPSBOdW1iZXIocHJvZHVjdC53b3JraW5nZGF5cykgfHwgMDtcbiAgfVxuXG4gIGNhbmNlbEVkaXQoc3RvcmU6IGFueSwgcHJvZHVjdDogYW55KSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRFZGl0S2V5KHN0b3JlLnN0b3JlSWQsIHByb2R1Y3QucHJvZHVjdE5hbWUpO1xuICAgIGRlbGV0ZSB0aGlzLmVkaXRpbmdQcm9kdWN0W2tleV07XG4gIH1cblxuICBzYXZlV29ya2luZ0RheXMoc3RvcmU6IGFueSwgcHJvZHVjdDogYW55KSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRFZGl0S2V5KHN0b3JlLnN0b3JlSWQsIHByb2R1Y3QucHJvZHVjdE5hbWUpO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gTnVtYmVyKHRoaXMuZWRpdGluZ1Byb2R1Y3Rba2V5XSkgfHwgMDtcblxuICAgIC8vIFVuY2hhbmdlZCDihpIganVzdCBjbG9zZSB0aGUgZWRpdG9yIChjb21wYXJlIGFzIG51bWJlcnMgc28gMCB2cyBcIjBcIiBldGMuXG4gICAgLy8gZG9uJ3Qgc2xpcCB0aHJvdWdoKS5cbiAgICBpZiAobmV3VmFsdWUgPT09IChOdW1iZXIocHJvZHVjdC53b3JraW5nZGF5cykgfHwgMCkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmVkaXRpbmdQcm9kdWN0W2tleV07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgZGF0ZVN0cmluZzogdGhpcy5kYWlseVByaWNpbmdJbmZvLmRhdGVTdHJpbmcsXG4gICAgICBzdG9yZUlkOiBzdG9yZS5zdG9yZUlkLFxuICAgICAgcHJvZHVjdE5hbWU6IHByb2R1Y3QucHJvZHVjdE5hbWUsXG4gICAgICB3b3JraW5nZGF5czogbmV3VmFsdWVcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS51cGRhdGVEYWlseVByaWNpbmdXb3JraW5nRGF5cyhwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgcHJvZHVjdC53b3JraW5nZGF5cyA9IE51bWJlcihuZXdWYWx1ZSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmVkaXRpbmdQcm9kdWN0W2tleV07XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdXb3JraW5nIGRheXMgdXBkYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gdXBkYXRlIHdvcmtpbmcgZGF5cycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0RmllbGRFZGl0S2V5KHN0b3JlSWQ6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtzdG9yZUlkfV8ke2ZpZWxkTmFtZX1gO1xuICB9XG5cbiAgaXNFZGl0aW5nRmllbGQoc3RvcmVJZDogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRpbmdGaWVsZFt0aGlzLmdldEZpZWxkRWRpdEtleShzdG9yZUlkLCBmaWVsZE5hbWUpXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgc3RhcnRGaWVsZEVkaXQoc3RvcmU6IGFueSwgZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEZpZWxkRWRpdEtleShzdG9yZS5zdG9yZUlkLCBmaWVsZE5hbWUpO1xuICAgIHRoaXMuZWRpdGluZ0ZpZWxkW2tleV0gPSBzdG9yZVtmaWVsZE5hbWVdIHx8IDA7XG4gIH1cblxuICBjYW5jZWxGaWVsZEVkaXQoc3RvcmU6IGFueSwgZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEZpZWxkRWRpdEtleShzdG9yZS5zdG9yZUlkLCBmaWVsZE5hbWUpO1xuICAgIGRlbGV0ZSB0aGlzLmVkaXRpbmdGaWVsZFtrZXldO1xuICB9XG5cbiAgc2F2ZUZpZWxkRWRpdChzdG9yZTogYW55LCBmaWVsZE5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0RmllbGRFZGl0S2V5KHN0b3JlLnN0b3JlSWQsIGZpZWxkTmFtZSk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmVkaXRpbmdGaWVsZFtrZXldO1xuXG4gICAgaWYgKG5ld1ZhbHVlID09PSBzdG9yZVtmaWVsZE5hbWVdKSB7XG4gICAgICBkZWxldGUgdGhpcy5lZGl0aW5nRmllbGRba2V5XTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICBkYXRlU3RyaW5nOiB0aGlzLmRhaWx5UHJpY2luZ0luZm8uZGF0ZVN0cmluZyxcbiAgICAgIHN0b3JlSWQ6IHN0b3JlLnN0b3JlSWQsXG4gICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgIHZhbHVlOiBOdW1iZXIobmV3VmFsdWUpXG4gICAgfTtcblxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UudXBkYXRlRGFpbHlQcmljaW5nU3RvcmVGaWVsZChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgc3RvcmVbZmllbGROYW1lXSA9IE51bWJlcihuZXdWYWx1ZSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmVkaXRpbmdGaWVsZFtrZXldO1xuICAgICAgICBjb25zdCBmaWVsZExhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgdHJhZmZpY0NhbWVyYUNvdW50OiAnVHJhZmZpYyBjYW1lcmEgY291bnQnLCB6b25lQ2FtZXJhQ291bnQ6ICdab25lIGNhbWVyYSBjb3VudCcsIHpvbmVDb3VudDogJ1pvbmUgY291bnQnIH07XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGAke2ZpZWxkTGFiZWxzW2ZpZWxkTmFtZV0gfHwgZmllbGROYW1lfSB1cGRhdGVkIHN1Y2Nlc3NmdWxseWApO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICBjb25zdCBlcnJvckxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgdHJhZmZpY0NhbWVyYUNvdW50OiAndHJhZmZpYyBjYW1lcmEgY291bnQnLCB6b25lQ2FtZXJhQ291bnQ6ICd6b25lIGNhbWVyYSBjb3VudCcsIHpvbmVDb3VudDogJ3pvbmUgY291bnQnIH07XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChgRmFpbGVkIHRvIHVwZGF0ZSAke2Vycm9yTGFiZWxzW2ZpZWxkTmFtZV0gfHwgZmllbGROYW1lfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVJbnZvaWNlKCkge1xuICAgIGlmICghdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xuICAgIC8vIE9wZW4gdGhlIHBpY2tlciBmaXJzdCDigJQgdGhlIHVzZXIgY2hvb3NlcyB3aGljaCBiaWxsaW5nIGdyb3VwcyB0b1xuICAgIC8vIGdlbmVyYXRlIGZvci4gTW9kYWwgY2xvc2VzIHdpdGggdGhlIGFycmF5IG9mIHNlbGVjdGVkIGdyb3VwIF9pZHNcbiAgICAvLyAob3IgaXMgZGlzbWlzc2VkID0gbm8tb3ApLlxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihHZW5lcmF0ZUludm9pY2VNb2RhbENvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSB0aGlzLmNsaWVudElkO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChncm91cElkczogc3RyaW5nW10pID0+IHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShncm91cElkcykgfHwgZ3JvdXBJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICB0aGlzLnJ1bkludm9pY2VHZW5lcmF0aW9uKGdyb3VwSWRzKTtcbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICAvLyBPcGVuIGEgcG9wdXAgbGlzdGluZyB0aGUgbmV3bHkgb25ib2FyZGVkIHN0b3JlcyAod2l0aCBmaXJzdCBmaWxlIGRhdGUpLlxuICAvLyBUaGUgbGlzdCBpcyBhbHJlYWR5IGxvYWRlZCB3aXRoIHRoZSBwYWdlLCBzbyBubyBleHRyYSBBUEkgY2FsbCBpcyBuZWVkZWQuXG4gIHZpZXdOZXdTdG9yZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm5ld2x5T25ib2FyZGVkU3RvcmVMaXN0Lmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihOZXdTdG9yZXNNb2RhbENvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdsZycsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2Uuc3RvcmVzID0gdGhpcy5uZXdseU9uYm9hcmRlZFN0b3JlTGlzdDtcbiAgfVxuXG4gIHByaXZhdGUgcnVuSW52b2ljZUdlbmVyYXRpb24oZ3JvdXBJZHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5nZW5lcmF0aW5nSW52b2ljZSA9IHRydWU7XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgYWxsQ2xpZW50OiB0cnVlLFxuICAgICAgY2xpZW50TGlzdDogW3RoaXMuY2xpZW50SWRdLFxuICAgICAgZ3JvdXBJZHMsXG4gICAgfTtcblxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuY3JlYXRlSW52b2ljZShwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5nZW5lcmF0aW5nSW52b2ljZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdChgSW52b2ljZSBnZW5lcmF0ZWQgZm9yICR7Z3JvdXBJZHMubGVuZ3RofSBiaWxsaW5nIGdyb3VwKHMpYCk7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGluZ0ludm9pY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gZ2VuZXJhdGUgaW52b2ljZScpO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZvcm1hdFByb2R1Y3ROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxICQyJylcbiAgICAgIC5yZXBsYWNlKC9eLi8sIChzdHIpID0+IHN0ci50b1VwcGVyQ2FzZSgpKTtcbiAgfVxuXG4gIC8vIFRha2UgdGhlIHJhdyBhZ2dyZWdhdGlvbiByb3dzIChhbHJlYWR5IHNvcnRlZCBuZXdlc3QtZmlyc3QgYnkgdGhlIEFQSSkgYW5kXG4gIC8vIGF0dGFjaCAoYSkgYSBodW1hbi1yZWFkYWJsZSBtb250aExhYmVsLCAoYikgdGFnIGZvciB0aGUgbGF0ZXN0IHR3byByb3dzXG4gIC8vIChcIkN1cnJlbnRcIiAvIFwiTGFzdCBnZW5lcmF0ZWRcIikgYW5kIChjKSBkZWx0YXMgdnMgdGhlIGltbWVkaWF0ZWx5IG9sZGVyXG4gIC8vIEN1cnJlbmN5IHN5bWJvbCBmb3IgYSBzdG9yZSdzIGludm9pY2UgYW1vdW50IChtYXRjaGVzIHRoZSBiYWNrZW5kJ3NcbiAgLy8gYmFzZXByaWNpbmcgY3VycmVuY3k7IEFFRCByZW5kZXJlZCBhcyB0ZXh0KS5cbiAgc3RvcmVDdXJyZW5jeVN5bWJvbChzdG9yZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBzeW1ib2xzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBpbnI6ICfigrknLCBkb2xsYXI6ICckJywgc2luZ2Fwb3JlZG9sbGFyOiAnUyQnLCBldXJvOiAn4oKsJywgYWVkOiAnQUVEICcgfTtcbiAgICByZXR1cm4gc3ltYm9sc1soc3RvcmU/Lmludm9pY2VDdXJyZW5jeSB8fCAnaW5yJykudG9Mb3dlckNhc2UoKV0gfHwgJ+KCuSc7XG4gIH1cblxuICAvLyBtb250aCBzbyB0aGUgdGVtcGxhdGUgY2FuIHJlbmRlciB0aGUg4payL+KWvC/ilqwgdHJlbmQgaW5kaWNhdG9ycy5cbiAgcHJpdmF0ZSBkZWNvcmF0ZU1vbnRobHlTdW1tYXJ5KHJvd3M6IGFueVtdKTogYW55W10ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShyb3dzKSB8fCByb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSBbJ0phbicsJ0ZlYicsJ01hcicsJ0FwcicsJ01heScsJ0p1bicsJ0p1bCcsJ0F1ZycsJ1NlcCcsJ09jdCcsJ05vdicsJ0RlYyddO1xuICAgIGNvbnN0IHN5bWJvbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IGlucjogJ+KCuScsIGRvbGxhcjogJyQnLCBzaW5nYXBvcmVkb2xsYXI6ICdTJCcsIGV1cm86ICfigqwnIH07XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBpc0N1cnJlbnQgPSAocjogYW55KSA9PiByLnllYXIgPT09IG5vdy5nZXRGdWxsWWVhcigpICYmIHIubW9udGggPT09IChub3cuZ2V0TW9udGgoKSArIDEpO1xuICAgIHJldHVybiByb3dzLm1hcCgociwgaSkgPT4ge1xuICAgICAgY29uc3QgbmV4dCA9IHJvd3NbaSArIDFdO1xuICAgICAgY29uc3Qgc3RvcmVzRGVsdGEgPSBuZXh0ID8gKHIuc3RvcmVzQmlsbGVkIHx8IDApIC0gKG5leHQuc3RvcmVzQmlsbGVkIHx8IDApIDogbnVsbDtcbiAgICAgIGNvbnN0IGFtb3VudERlbHRhID0gbmV4dCA/IChyLmludm9pY2VBbW91bnQgfHwgMCkgLSAobmV4dC5pbnZvaWNlQW1vdW50IHx8IDApIDogbnVsbDtcbiAgICAgIGxldCB0YWcgPSAnJztcbiAgICAgIGlmIChpc0N1cnJlbnQocikpIHRhZyA9ICdDdXJyZW50JztcbiAgICAgIGVsc2UgaWYgKGkgPT09IDApIHRhZyA9ICdMYXN0IGdlbmVyYXRlZCc7XG4gICAgICBlbHNlIGlmIChpID09PSAxICYmIGlzQ3VycmVudChyb3dzWzBdKSkgdGFnID0gJ0xhc3QgZ2VuZXJhdGVkJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnIsXG4gICAgICAgIG1vbnRoTGFiZWw6IGAke21vbnRoTmFtZXNbKHIubW9udGggfHwgMSkgLSAxXX0gJHtyLnllYXJ9YCxcbiAgICAgICAgdGFnLFxuICAgICAgICBzdG9yZXNEZWx0YSxcbiAgICAgICAgYW1vdW50RGVsdGEsXG4gICAgICAgIGN1cnJlbmN5U3ltYm9sOiBzeW1ib2xzWyhyLmN1cnJlbmN5IHx8ICdpbnInKS50b0xvd2VyQ2FzZSgpXSB8fCAnJyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVNb250aGx5U3VtbWFyeUhpc3RvcnkoKTogdm9pZCB7XG4gICAgdGhpcy5tb250aGx5U3VtbWFyeUV4cGFuZGVkID0gIXRoaXMubW9udGhseVN1bW1hcnlFeHBhbmRlZDtcbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJpbnZvaWNlcy1zZWN0aW9uXCI+XG4gICAgPCEtLSBIZWFkZXIgUm93IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi42NjY2NyAxMEgxMy4zMzMzTTYuNjY2NjcgNi42NjY2N0gxMy4zMzMzTTYuNjY2NjcgMTMuMzMzM0gxME01IDE3LjVIMTVDMTUuOTIwNSAxNy41IDE2LjY2NjcgMTYuNzUzOCAxNi42NjY3IDE1LjgzMzNWNC4xNjY2N0MxNi42NjY3IDMuMjQ2MTkgMTUuOTIwNSAyLjUgMTUgMi41SDVDNC4wNzk1MyAyLjUgMy4zMzMzMyAzLjI0NjE5IDMuMzMzMzMgNC4xNjY2N1YxNS44MzMzQzMuMzMzMzMgMTYuNzUzOCA0LjA3OTUzIDE3LjUgNSAxNy41WlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmlsbGluZ2hlYWRlclwiPkJpbGxpbmcgQnJlYWtkb3duPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctbGlnaHQgdGV4dC1kYXJrIG1zLTFcIj57eyB0b3RhbEl0ZW1zIH19IHN0b3Jlczwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbXQtMVwiICpuZ0lmPVwiZGFpbHlQcmljaW5nSW5mbz8uZGF0ZVN0cmluZ1wiPlxuICAgICAgICAgICAgICAgIERhdGU6IDxzdHJvbmc+e3sgZGFpbHlQcmljaW5nSW5mbz8uZGF0ZVN0cmluZyB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMlwiPnw8L3NwYW4+XG4gICAgICAgICAgICAgICAgQWN0aXZlIFN0b3JlczogPHN0cm9uZz57eyBkYWlseVByaWNpbmdJbmZvPy5hY3RpdmVTdG9yZXMgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm14LTJcIj58PC9zcGFuPlxuICAgICAgICAgICAgICAgIEFjY291bnQgVHlwZTogPHN0cm9uZz57eyBkYWlseVByaWNpbmdJbmZvPy5hY2NvdW50VHlwZSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gZGF0ZS1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZGF0ZUZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25EYXRlRmlsdGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciBieSBkYXRlXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImRhdGVGaWx0ZXJcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckRhdGVGaWx0ZXIoKVwiIHRpdGxlPVwiQ2xlYXIgZGF0ZSBmaWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjUgMy41TDMuNSAxMC41TTMuNSAzLjVMMTAuNSAxMC41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJnZW5lcmF0ZUludm9pY2UoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlclwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdG9yZUxpc3QubGVuZ3RoIHx8IGdlbmVyYXRpbmdJbnZvaWNlXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi42NjY2NyAxMEgxMy4zMzMzTTYuNjY2NjcgNi42NjY2N0gxMy4zMzMzTTYuNjY2NjcgMTMuMzMzM0gxME01IDE3LjVIMTVDMTUuOTIwNSAxNy41IDE2LjY2NjcgMTYuNzUzOCAxNi42NjY3IDE1LjgzMzNWNC4xNjY2N0MxNi42NjY3IDMuMjQ2MTkgMTUuOTIwNSAyLjUgMTUgMi41SDVDNC4wNzk1MyAyLjUgMy4zMzMzMyAzLjI0NjE5IDMuMzMzMzMgNC4xNjY2N1YxNS44MzMzQzMuMzMzMzMgMTYuNzUzOCA0LjA3OTUzIDE3LjUgNSAxNy41WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjZmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCI+e3sgZ2VuZXJhdGluZ0ludm9pY2UgPyAnR2VuZXJhdGluZy4uLicgOiAnR2VuZXJhdGUgSW52b2ljZScgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkV4cG9ydCgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN0b3JlTGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCI+RXhwb3J0PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBOZXdseSBPbmJvYXJkZWQgU3RvcmVzIOKAlCBzdG9yZXMgd2hvc2UgZmlyc3QgZmlsZSBkYXRlIGlzIGluIHRoZSBjdXJyZW50IG1vbnRoIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbWItNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibmV3bHktb25ib2FyZGVkLWNhcmRcIlxuICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxNHB4O2JvcmRlcjoxcHggc29saWQgI0U0RTdFQztib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoxNHB4IDE4cHg7YmFja2dyb3VuZDojZmZmO21pbi13aWR0aDoyNDBweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDo0MHB4O2hlaWdodDo0MHB4O2JvcmRlci1yYWRpdXM6OHB4O2JhY2tncm91bmQ6I0VBRjhGRjtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAyMVY4bDktNSA5IDV2MTNNMyAyMWgxOE0zIDIxSDFtMjAgMGgyTTkgMjF2LTZoNnY2TTEyIDcuNWguMDFcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MjRweDtmb250LXdlaWdodDo3MDA7Y29sb3I6IzEwMTgyODtsaW5lLWhlaWdodDoxLjE7XCI+e3sgbmV3bHlPbmJvYXJkZWRTdG9yZXMgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZToxM3B4O2NvbG9yOiM2NjcwODU7XCI+TmV3bHkgT25ib2FyZGVkIFN0b3JlczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MTFweDtjb2xvcjojOThBMkIzO1wiPkZpcnN0IGZpbGUgaW4gY3VycmVudCBtb250aDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBtcy0zXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW5ld2x5T25ib2FyZGVkU3RvcmVzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlld05ld1N0b3JlcygpXCI+VmlldyBTdG9yZXM8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE1vbnRobHkgQmlsbGluZyBTdW1tYXJ5IOKAlCBpbnZvaWNlIHRyZW5kIChuZXdlc3QgZmlyc3QsIHdpdGggZGVsdGFzIHZzIHByaW9yIG1vbnRoKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibW9udGhseS1iaWxsaW5nLXN1bW1hcnlcIiAqbmdJZj1cIm1vbnRobHlCaWxsaW5nU3VtbWFyeT8ubGVuZ3RoXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtc3VtLWhlYWRlclwiPk1vbnRobHkgQmlsbGluZyBTdW1tYXJ5PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBtYi0wXCI+XG4gICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+TU9OVEg8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPk5VTUJFUiBPRiBTVE9SRVMgQklMTEVEPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5JTlZPSUNFIEFNT1VOVDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvdyBvZiBtb250aGx5QmlsbGluZ1N1bW1hcnk7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdJZj1cImkgPCAyIHx8IG1vbnRobHlTdW1tYXJ5RXhwYW5kZWRcIiBbY2xhc3MuY3Vycl09XCJyb3cudGFnID09PSAnQ3VycmVudCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgcm93Lm1vbnRoTGFiZWwgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cudGFnID09PSAnQ3VycmVudCdcIiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LXByaW1hcnkgbXMtMlwiPkN1cnJlbnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LnRhZyA9PT0gJ0xhc3QgZ2VuZXJhdGVkJ1wiIGNsYXNzPVwiYmFkZ2UgYmctbGlnaHQgdGV4dC1kYXJrIG1zLTJcIj5MYXN0IGdlbmVyYXRlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyByb3cuc3RvcmVzQmlsbGVkIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LnN0b3Jlc0RlbHRhICE9PSBudWxsXCIgY2xhc3M9XCJpbmQgbXMtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudXBdPVwicm93LnN0b3Jlc0RlbHRhID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZG93bl09XCJyb3cuc3RvcmVzRGVsdGEgPCAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5mbGF0XT1cInJvdy5zdG9yZXNEZWx0YSA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInJvdy5zdG9yZXNEZWx0YSA+IDBcIj7ilrIge3sgcm93LnN0b3Jlc0RlbHRhIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwicm93LnN0b3Jlc0RlbHRhIDwgMFwiPuKWvCB7eyAtcm93LnN0b3Jlc0RlbHRhIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PuKWrCAwPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IHJvdy5jdXJyZW5jeVN5bWJvbCB9fXt7IHJvdy5pbnZvaWNlQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5hbW91bnREZWx0YSAhPT0gbnVsbFwiIGNsYXNzPVwiaW5kIG1zLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnVwXT1cInJvdy5hbW91bnREZWx0YSA+IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRvd25dPVwicm93LmFtb3VudERlbHRhIDwgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmxhdF09XCJyb3cuYW1vdW50RGVsdGEgPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJyb3cuYW1vdW50RGVsdGEgPiAwXCI+4payIHt7IHJvdy5jdXJyZW5jeVN5bWJvbCB9fXt7IHJvdy5hbW91bnREZWx0YSB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJyb3cuYW1vdW50RGVsdGEgPCAwXCI+4pa8IHt7IHJvdy5jdXJyZW5jeVN5bWJvbCB9fXt7IC1yb3cuYW1vdW50RGVsdGEgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PuKWrCAwPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJtb250aGx5QmlsbGluZ1N1bW1hcnkubGVuZ3RoID4gMlwiIGNsYXNzPVwibXN1bS10b2dnbGVcIiAoY2xpY2spPVwidG9nZ2xlTW9udGhseVN1bW1hcnlIaXN0b3J5KClcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbW9udGhseVN1bW1hcnlFeHBhbmRlZFwiPuKWviBTaG93IG9sZGVyIG1vbnRocyAoe3sgbW9udGhseUJpbGxpbmdTdW1tYXJ5Lmxlbmd0aCAtIDIgfX0pPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9udGhseVN1bW1hcnlFeHBhbmRlZFwiPuKWtCBIaWRlIG9sZGVyIG1vbnRoczwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQWRkaXRpb25hbCBQcm9kdWN0cyDigJQgbm9uLXN0YW5kYXJkIHByb2R1Y3RzIGJpbGxlZCBmb3IgdGhpcyBjbGllbnQgb25seVxuICAgICAgICAgKGUuZy4gY2xpZW50SWQgMTE6IEV5ZXRlc3QsIFBsYW5vZ3JhbSkuIEhpZGRlbiB3aGVuIHRoZSBjbGllbnQgaGFzIG5vbmUuIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtb250aGx5LWJpbGxpbmctc3VtbWFyeVwiICpuZ0lmPVwiYWRkaXRpb25hbFByb2R1Y3RzPy5sZW5ndGhcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1zdW0taGVhZGVyXCI+QWRkaXRpb25hbCBQcm9kdWN0czwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgbWItMFwiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlByb2R1Y3QgTmFtZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWVuZFwiPlF1YW50aXR5PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInRleHQtZW5kXCI+UHJpY2U8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1lbmRcIj5Ub3RhbDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPkFjdGlvbjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcCBvZiBhZGRpdGlvbmFsUHJvZHVjdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBwLnByb2R1Y3ROYW1lIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+e3sgcC5xdWFudGl0eSB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj57eyAoYWRkaXRpb25hbFByb2R1Y3RzQ3VycmVuY3kgPT09ICdkb2xsYXInID8gJyQnIDogJ+KCuScpIH19e3sgcC5wcmljZSB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPnt7IChhZGRpdGlvbmFsUHJvZHVjdHNDdXJyZW5jeSA9PT0gJ2RvbGxhcicgPyAnJCcgOiAn4oK5JykgfX17eyBwLnRvdGFsIHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYW5FeHBvcnRBZGRpdGlvbmFsUHJvZHVjdChwLnByb2R1Y3ROYW1lKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRBZGRpdGlvbmFsUHJvZHVjdChwLnByb2R1Y3ROYW1lKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3dubG9hZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIzXCIgY2xhc3M9XCJ0ZXh0LWVuZFwiPjxzdHJvbmc+R3JhbmQgVG90YWw8L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPnt7IChhZGRpdGlvbmFsUHJvZHVjdHNDdXJyZW5jeSA9PT0gJ2RvbGxhcicgPyAnJCcgOiAn4oK5JykgfX17eyBhZGRpdGlvbmFsUHJvZHVjdHNUb3RhbCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTZWFyY2ggKyBGaWx0ZXIgUm93IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwYXltZW50aGlzdG9yeSBib3JkZXItMCBweC0wXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwb3NpdGlvbi1yZWxhdGl2ZSBteS0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gaW52b2ljZXNlYXJjaCBzdmctaWNvbi0xIHBvc2l0aW9uLWFic29sdXRlIG10LTYgbXMtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgb3BhY2l0eT1cIjAuNVwiIHg9XCIxNy4wMzY1XCIgeT1cIjE1LjEyMjNcIiB3aWR0aD1cIjguMTU1NDZcIiBoZWlnaHQ9XCIyXCIgcng9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKDQ1IDE3LjAzNjUgMTUuMTIyMylcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9yZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEgMTlDNi41NTU1NiAxOSAzIDE1LjQ0NDQgMyAxMUMzIDYuNTU1NTYgNi41NTU1NiAzIDExIDNDMTUuNDQ0NCAzIDE5IDYuNTU1NTYgMTkgMTFDMTkgMTUuNDQ0NCAxNS40NDQ0IDE5IDExIDE5Wk0xMSA1QzcuNTMzMzMgNSA1IDcuNTMzMzMgNSAxMUM1IDE0LjQ2NjcgNy41MzMzMyAxNyAxMSAxN0MxNC40NjY3IDE3IDE3IDE0LjQ2NjcgMTcgMTFDMTcgNy41MzMzMyAxNC40NjY3IDUgMTEgNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwibGVuXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBpbnZvaWNlc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU3RvcmUgbmFtZSBvciBJRC4uLlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChjaGFuZ2UpPVwic2VhcmNoRmllbGQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VhcmNoRGlzYWJsZWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWZpbHRlcnMgW2RhdGFPYmplY3RdPVwic3RvcmVGaWx0ZXJPYmplY3RcIiAoYXBwbGllZEZpbHRlcnMpPVwiYXBwbHlTdG9yZUZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIExvYWRpbmcgU2hpbW1lciAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RvcmVMb2FkaW5nXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBObyBEYXRhIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdG9yZU5vRGF0YVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG1iLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyYyB3LTI1XCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhLnN2Z1wiIGFsdD1cIlwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBTdG9yZXMgVGFibGUgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFzdG9yZUxvYWRpbmcgJiYgIXN0b3JlTm9EYXRhXCIgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGFjY29yZGlvbiB0YWJsZSBib3R0b20tYm9yZGVyIHRleHQtbm93cmFwXCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgnc3RvcmVOYW1lJylcIj5TVE9SRSBOQU1FXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICdzdG9yZU5hbWUnICYmIHNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAnc3RvcmVOYW1lJyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD5TVE9SRSBJRDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD5QUk9EVUNUUzwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCd0cmFmZmljQ2FtZXJhQ291bnQnKVwiPlRSQUZGSUMgQ0FNRVJBU1xuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0Q29sdW1OYW1lID09PSAndHJhZmZpY0NhbWVyYUNvdW50JyAmJiBzb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydENvbHVtTmFtZSA9PT0gJ3RyYWZmaWNDYW1lcmFDb3VudCcgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgnem9uZUNhbWVyYUNvdW50JylcIj5aT05FIENBTUVSQVNcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydENvbHVtTmFtZSA9PT0gJ3pvbmVDYW1lcmFDb3VudCcgJiYgc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRDb2x1bU5hbWUgPT09ICd6b25lQ2FtZXJhQ291bnQnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ3pvbmVDb3VudCcpXCI+Wk9ORVNcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydENvbHVtTmFtZSA9PT0gJ3pvbmVDb3VudCcgJiYgc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRDb2x1bU5hbWUgPT09ICd6b25lQ291bnQnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoPkZJUlNUIEZJTEUgREFURTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCdkYXlzRGlmZmVyZW5jZScpXCI+V09SS0lORyBEQVlTXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICdkYXlzRGlmZmVyZW5jZScgJiYgc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRDb2x1bU5hbWUgPT09ICdkYXlzRGlmZmVyZW5jZScgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+U1RBVFVTPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1lbmRcIj5JTlZPSUNFIEFNT1VOVDwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBzdG9yZSBvZiBzdG9yZUxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlIHRhYmxlLXRpdGxlLXByaW1hcnlcIj57eyBzdG9yZT8uc3RvcmVOYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPnt7IHN0b3JlPy5zdG9yZUlkIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIHN0b3JlPy5wcm9kdWN0c1wiIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtcHJpbWFyeSBtZS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdFByb2R1Y3ROYW1lKHByb2R1Y3Q/LnByb2R1Y3ROYW1lKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRWRpdGluZ0ZpZWxkKHN0b3JlPy5zdG9yZUlkLCAndHJhZmZpY0NhbWVyYUNvdW50JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgc3RvcmU/LnRyYWZmaWNDYW1lcmFDb3VudCB8fCAwIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGVkaXQtaWNvblwiIChjbGljayk9XCJzdGFydEZpZWxkRWRpdChzdG9yZSwgJ3RyYWZmaWNDYW1lcmFDb3VudCcpXCIgdGl0bGU9XCJFZGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOS45MTY2NyAxLjc1MDA0QzEwLjA2OTggMS41OTY4MyAxMC4yNTE4IDEuNDc1MzMgMTAuNDUxOSAxLjM5MjM4QzEwLjY1MjIgMS4zMDk0NiAxMC44NjY3IDEuMjY2NzkgMTEuMDgzMyAxLjI2Njc5QzExLjMgMS4yNjY3OSAxMS41MTQ1IDEuMzA5NDYgMTEuNzE0OCAxLjM5MjM4QzExLjkxNDkgMS40NzUzMyAxMi4wOTY5IDEuNTk2ODMgMTIuMjUgMS43NTAwNEMxMi40MDMyIDEuOTAzMjUgMTIuNTI0NyAyLjA4NTI5IDEyLjYwNzcgMi4yODU0NkMxMi42OTA2IDIuNDg1NjcgMTIuNzMzMyAyLjcwMDEzIDEyLjczMzMgMi45MTY3MUMxMi43MzMzIDMuMTMzMjkgMTIuNjkwNiAzLjM0Nzc1IDEyLjYwNzcgMy41NDc5NkMxMi41MjQ3IDMuNzQ4MTMgMTIuNDAzMiAzLjkzMDE3IDEyLjI1IDQuMDgzMzhMNC4zNzUgMTEuOTU4NEwxLjE2NjY3IDEyLjgzMzRMMi4wNDE2NyA5LjYyNTA0TDkuOTE2NjcgMS43NTAwNFpcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4xNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0VkaXRpbmdGaWVsZChzdG9yZT8uc3RvcmVJZCwgJ3RyYWZmaWNDYW1lcmFDb3VudCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSBlZGl0LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVkaXRpbmdGaWVsZFtnZXRGaWVsZEVkaXRLZXkoc3RvcmU/LnN0b3JlSWQsICd0cmFmZmljQ2FtZXJhQ291bnQnKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNhdmVGaWVsZEVkaXQoc3RvcmUsICd0cmFmZmljQ2FtZXJhQ291bnQnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImNhbmNlbEZpZWxkRWRpdChzdG9yZSwgJ3RyYWZmaWNDYW1lcmFDb3VudCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHRleHQtc3VjY2Vzc1wiIChjbGljayk9XCJzYXZlRmllbGRFZGl0KHN0b3JlLCAndHJhZmZpY0NhbWVyYUNvdW50JylcIiB0aXRsZT1cIlNhdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMy4zMzM0IDRMNi4wMDAwOCAxMS4zMzMzTDIuNjY2NzUgOFwiIHN0cm9rZT1cIiMxMkI3NkFcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHRleHQtZGFuZ2VyXCIgKGNsaWNrKT1cImNhbmNlbEZpZWxkRWRpdChzdG9yZSwgJ3RyYWZmaWNDYW1lcmFDb3VudCcpXCIgdGl0bGU9XCJDYW5jZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA0TDQgMTJNNCA0TDEyIDEyXCIgc3Ryb2tlPVwiI0YwNDQzOFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0VkaXRpbmdGaWVsZChzdG9yZT8uc3RvcmVJZCwgJ3pvbmVDYW1lcmFDb3VudCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IHN0b3JlPy56b25lQ2FtZXJhQ291bnQgfHwgMCB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBlZGl0LWljb25cIiAoY2xpY2spPVwic3RhcnRGaWVsZEVkaXQoc3RvcmUsICd6b25lQ2FtZXJhQ291bnQnKVwiIHRpdGxlPVwiRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuOTE2NjcgMS43NTAwNEMxMC4wNjk4IDEuNTk2ODMgMTAuMjUxOCAxLjQ3NTMzIDEwLjQ1MTkgMS4zOTIzOEMxMC42NTIyIDEuMzA5NDYgMTAuODY2NyAxLjI2Njc5IDExLjA4MzMgMS4yNjY3OUMxMS4zIDEuMjY2NzkgMTEuNTE0NSAxLjMwOTQ2IDExLjcxNDggMS4zOTIzOEMxMS45MTQ5IDEuNDc1MzMgMTIuMDk2OSAxLjU5NjgzIDEyLjI1IDEuNzUwMDRDMTIuNDAzMiAxLjkwMzI1IDEyLjUyNDcgMi4wODUyOSAxMi42MDc3IDIuMjg1NDZDMTIuNjkwNiAyLjQ4NTY3IDEyLjczMzMgMi43MDAxMyAxMi43MzMzIDIuOTE2NzFDMTIuNzMzMyAzLjEzMzI5IDEyLjY5MDYgMy4zNDc3NSAxMi42MDc3IDMuNTQ3OTZDMTIuNTI0NyAzLjc0ODEzIDEyLjQwMzIgMy45MzAxNyAxMi4yNSA0LjA4MzM4TDQuMzc1IDExLjk1ODRMMS4xNjY2NyAxMi44MzM0TDIuMDQxNjcgOS42MjUwNEw5LjkxNjY3IDEuNzUwMDRaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMTZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFZGl0aW5nRmllbGQoc3RvcmU/LnN0b3JlSWQsICd6b25lQ2FtZXJhQ291bnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gZWRpdC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlZGl0aW5nRmllbGRbZ2V0RmllbGRFZGl0S2V5KHN0b3JlPy5zdG9yZUlkLCAnem9uZUNhbWVyYUNvdW50JyldXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlRmllbGRFZGl0KHN0b3JlLCAnem9uZUNhbWVyYUNvdW50JylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJjYW5jZWxGaWVsZEVkaXQoc3RvcmUsICd6b25lQ2FtZXJhQ291bnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciB0ZXh0LXN1Y2Nlc3NcIiAoY2xpY2spPVwic2F2ZUZpZWxkRWRpdChzdG9yZSwgJ3pvbmVDYW1lcmFDb3VudCcpXCIgdGl0bGU9XCJTYXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTMuMzMzNCA0TDYuMDAwMDggMTEuMzMzM0wyLjY2Njc1IDhcIiBzdHJva2U9XCIjMTJCNzZBXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciB0ZXh0LWRhbmdlclwiIChjbGljayk9XCJjYW5jZWxGaWVsZEVkaXQoc3RvcmUsICd6b25lQ2FtZXJhQ291bnQnKVwiIHRpdGxlPVwiQ2FuY2VsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgNEw0IDEyTTQgNEwxMiAxMlwiIHN0cm9rZT1cIiNGMDQ0MzhcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFZGl0aW5nRmllbGQoc3RvcmU/LnN0b3JlSWQsICd6b25lQ291bnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyBzdG9yZT8uem9uZUNvdW50IHx8IDAgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZWRpdC1pY29uXCIgKGNsaWNrKT1cInN0YXJ0RmllbGRFZGl0KHN0b3JlLCAnem9uZUNvdW50JylcIiB0aXRsZT1cIkVkaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05LjkxNjY3IDEuNzUwMDRDMTAuMDY5OCAxLjU5NjgzIDEwLjI1MTggMS40NzUzMyAxMC40NTE5IDEuMzkyMzhDMTAuNjUyMiAxLjMwOTQ2IDEwLjg2NjcgMS4yNjY3OSAxMS4wODMzIDEuMjY2NzlDMTEuMyAxLjI2Njc5IDExLjUxNDUgMS4zMDk0NiAxMS43MTQ4IDEuMzkyMzhDMTEuOTE0OSAxLjQ3NTMzIDEyLjA5NjkgMS41OTY4MyAxMi4yNSAxLjc1MDA0QzEyLjQwMzIgMS45MDMyNSAxMi41MjQ3IDIuMDg1MjkgMTIuNjA3NyAyLjI4NTQ2QzEyLjY5MDYgMi40ODU2NyAxMi43MzMzIDIuNzAwMTMgMTIuNzMzMyAyLjkxNjcxQzEyLjczMzMgMy4xMzMyOSAxMi42OTA2IDMuMzQ3NzUgMTIuNjA3NyAzLjU0Nzk2QzEyLjUyNDcgMy43NDgxMyAxMi40MDMyIDMuOTMwMTcgMTIuMjUgNC4wODMzOEw0LjM3NSAxMS45NTg0TDEuMTY2NjcgMTIuODMzNEwyLjA0MTY3IDkuNjI1MDRMOS45MTY2NyAxLjc1MDA0WlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjE2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRWRpdGluZ0ZpZWxkKHN0b3JlPy5zdG9yZUlkLCAnem9uZUNvdW50JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIGVkaXQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZWRpdGluZ0ZpZWxkW2dldEZpZWxkRWRpdEtleShzdG9yZT8uc3RvcmVJZCwgJ3pvbmVDb3VudCcpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2F2ZUZpZWxkRWRpdChzdG9yZSwgJ3pvbmVDb3VudCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwiY2FuY2VsRmllbGRFZGl0KHN0b3JlLCAnem9uZUNvdW50JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC1zdWNjZXNzXCIgKGNsaWNrKT1cInNhdmVGaWVsZEVkaXQoc3RvcmUsICd6b25lQ291bnQnKVwiIHRpdGxlPVwiU2F2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjMzMzQgNEw2LjAwMDA4IDExLjMzMzNMMi42NjY3NSA4XCIgc3Ryb2tlPVwiIzEyQjc2QVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC1kYW5nZXJcIiAoY2xpY2spPVwiY2FuY2VsRmllbGRFZGl0KHN0b3JlLCAnem9uZUNvdW50JylcIiB0aXRsZT1cIkNhbmNlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDRMNCAxMk00IDRMMTIgMTJcIiBzdHJva2U9XCIjRjA0NDM4XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57eyBzdG9yZT8uZWRnZWZpcnN0RmlsZURhdGUgPyAoc3RvcmU/LmVkZ2VmaXJzdEZpbGVEYXRlIHwgZGF0ZTogJ2RkIE1NTSB5eXl5JykgOiAn4oCUJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBzdG9yZT8ucHJvZHVjdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBtYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21hbGwgdGV4dC1tdXRlZFwiPnt7IGZvcm1hdFByb2R1Y3ROYW1lKHByb2R1Y3Q/LnByb2R1Y3ROYW1lKSB9fTo8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBWaWV3IG1vZGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFZGl0aW5nKHN0b3JlPy5zdG9yZUlkLCBwcm9kdWN0Py5wcm9kdWN0TmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgcHJvZHVjdD8ud29ya2luZ2RheXMgfHwgMCB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBlZGl0LWljb25cIiAoY2xpY2spPVwic3RhcnRFZGl0KHN0b3JlLCBwcm9kdWN0KVwiIHRpdGxlPVwiRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuOTE2NjcgMS43NTAwNEMxMC4wNjk4IDEuNTk2ODMgMTAuMjUxOCAxLjQ3NTMzIDEwLjQ1MTkgMS4zOTIzOEMxMC42NTIyIDEuMzA5NDYgMTAuODY2NyAxLjI2Njc5IDExLjA4MzMgMS4yNjY3OUMxMS4zIDEuMjY2NzkgMTEuNTE0NSAxLjMwOTQ2IDExLjcxNDggMS4zOTIzOEMxMS45MTQ5IDEuNDc1MzMgMTIuMDk2OSAxLjU5NjgzIDEyLjI1IDEuNzUwMDRDMTIuNDAzMiAxLjkwMzI1IDEyLjUyNDcgMi4wODUyOSAxMi42MDc3IDIuMjg1NDZDMTIuNjkwNiAyLjQ4NTY3IDEyLjczMzMgMi43MDAxMyAxMi43MzMzIDIuOTE2NzFDMTIuNzMzMyAzLjEzMzI5IDEyLjY5MDYgMy4zNDc3NSAxMi42MDc3IDMuNTQ3OTZDMTIuNTI0NyAzLjc0ODEzIDEyLjQwMzIgMy45MzAxNyAxMi4yNSA0LjA4MzM4TDQuMzc1IDExLjk1ODRMMS4xNjY2NyAxMi44MzM0TDIuMDQxNjcgOS42MjUwNEw5LjkxNjY3IDEuNzUwMDRaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMTZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRWRpdCBtb2RlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFZGl0aW5nKHN0b3JlPy5zdG9yZUlkLCBwcm9kdWN0Py5wcm9kdWN0TmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIGVkaXQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZWRpdGluZ1Byb2R1Y3RbZ2V0RWRpdEtleShzdG9yZT8uc3RvcmVJZCwgcHJvZHVjdD8ucHJvZHVjdE5hbWUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2F2ZVdvcmtpbmdEYXlzKHN0b3JlLCBwcm9kdWN0KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImNhbmNlbEVkaXQoc3RvcmUsIHByb2R1Y3QpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHRleHQtc3VjY2Vzc1wiIChjbGljayk9XCJzYXZlV29ya2luZ0RheXMoc3RvcmUsIHByb2R1Y3QpXCIgdGl0bGU9XCJTYXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTMuMzMzNCA0TDYuMDAwMDggMTEuMzMzM0wyLjY2Njc1IDhcIiBzdHJva2U9XCIjMTJCNzZBXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciB0ZXh0LWRhbmdlclwiIChjbGljayk9XCJjYW5jZWxFZGl0KHN0b3JlLCBwcm9kdWN0KVwiIHRpdGxlPVwiQ2FuY2VsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgNEw0IDEyTTQgNEwxMiAxMlwiIHN0cm9rZT1cIiNGMDQ0MzhcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCIgW25nQ2xhc3NdPVwic3RvcmU/LnN0YXR1cyA9PT0gJ2FjdGl2ZScgPyAnYmFkZ2UgYmFkZ2UtbGlnaHQtc3VjY2VzcycgOiAnYmFkZ2UgYmFkZ2UtbGlnaHQtZGFuZ2VyJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHN0b3JlPy5zdGF0dXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQZXItcHJvZHVjdCBicmVha2Rvd24gKFRyYWZmaWM6IOKCuXgsIFpvbmU6IOKCuXkg4oCmKSArIHRvdGFsLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGIgb2Ygc3RvcmU/Lmludm9pY2VCcmVha2Rvd25cIiBjbGFzcz1cImludi1icmVha2Rvd24tcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnYtYnJlYWtkb3duLWxhYmVsXCI+e3sgYi5sYWJlbCB9fTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc3RvcmVDdXJyZW5jeVN5bWJvbChzdG9yZSkgfX17eyAoYi5hbW91bnQgfHwgMCkgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZSBpbnYtYnJlYWtkb3duLXRvdGFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyBzdG9yZUN1cnJlbmN5U3ltYm9sKHN0b3JlKSB9fXt7IChzdG9yZT8uaW52b2ljZUFtb3VudCB8fCAwKSB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXN0b3JlTG9hZGluZyAmJiAhc3RvcmVOb0RhdGFcIj5cbiAgICAgICAgICAgIDxsaWItcGFnaW5hdGlvbiBjbGFzcz1cInRleHQtc3RhcnRcIiBbaXRlbXNQZXJQYWdlXT1cIml0ZW1zUGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZVwiXG4gICAgICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwidG90YWxJdGVtc1wiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==