tango-app-ui-manage-billing 3.3.37 → 3.3.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/billing-groups/billing-groups.component.mjs +39 -3
- package/esm2022/lib/components/brand-invoices/brand-invoices.component.mjs +61 -6
- package/esm2022/lib/components/daily-pricing/daily-pricing.component.mjs +10 -4
- package/esm2022/lib/components/daily-pricing/new-stores-modal/new-stores-modal.component.mjs +57 -7
- package/esm2022/lib/components/invoice-preview/invoice-preview.component.mjs +15 -8
- package/esm2022/lib/components/services/billing.service.mjs +25 -2
- package/esm2022/lib/components/tango-manage-billing/cancel-invoice/cancel-invoice.component.mjs +29 -0
- package/esm2022/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.mjs +106 -32
- package/esm2022/lib/components/tango-manage-billing/invoice-logs/invoice-logs.component.mjs +104 -0
- package/esm2022/lib/components/tango-manage-billing/tango-manage-billing.component.mjs +54 -6
- package/esm2022/lib/tango-manage-billing.module.mjs +7 -1
- package/fesm2022/tango-app-ui-manage-billing.mjs +575 -157
- package/fesm2022/tango-app-ui-manage-billing.mjs.map +1 -1
- package/lib/components/billing-groups/billing-groups.component.d.ts +2 -0
- package/lib/components/brand-invoices/brand-invoices.component.d.ts +3 -0
- package/lib/components/daily-pricing/new-stores-modal/new-stores-modal.component.d.ts +14 -3
- package/lib/components/invoice-preview/invoice-preview.component.d.ts +2 -1
- package/lib/components/services/billing.service.d.ts +6 -1
- package/lib/components/tango-manage-billing/cancel-invoice/cancel-invoice.component.d.ts +11 -0
- package/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.d.ts +4 -0
- package/lib/components/tango-manage-billing/invoice-logs/invoice-logs.component.d.ts +34 -0
- package/lib/components/tango-manage-billing/tango-manage-billing.component.d.ts +3 -0
- package/lib/tango-manage-billing.module.d.ts +50 -48
- package/package.json +1 -1
|
@@ -20,6 +20,9 @@ export class BillingGroupsComponent {
|
|
|
20
20
|
searchDisabled = false;
|
|
21
21
|
bulkDownloading = false;
|
|
22
22
|
bulkUploading = false;
|
|
23
|
+
// _id of the group whose per-group download is in flight ('' = none), so only
|
|
24
|
+
// that row's icon shows a busy state.
|
|
25
|
+
downloadingGroupId = '';
|
|
23
26
|
bulkUploadInput;
|
|
24
27
|
// Summary
|
|
25
28
|
summary = {};
|
|
@@ -324,6 +327,39 @@ export class BillingGroupsComponent {
|
|
|
324
327
|
}
|
|
325
328
|
});
|
|
326
329
|
}
|
|
330
|
+
// Per-group download (icon next to Edit). Same workbook as Bulk Download,
|
|
331
|
+
// scoped to this one group via groupId.
|
|
332
|
+
downloadBillingGroup(group) {
|
|
333
|
+
const groupId = group?._id;
|
|
334
|
+
if (!groupId || this.downloadingGroupId)
|
|
335
|
+
return;
|
|
336
|
+
if (!this.clientId) {
|
|
337
|
+
this.toast.getErrorToast('Select a brand first');
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
this.downloadingGroupId = groupId;
|
|
341
|
+
this.billingService.bulkDownloadBillingGroups(this.clientId, groupId).pipe(takeUntil(this.destroy$)).subscribe({
|
|
342
|
+
next: (res) => {
|
|
343
|
+
this.downloadingGroupId = '';
|
|
344
|
+
// A 404/JSON error body isn't a zip — saving it yields a "corrupted"
|
|
345
|
+
// file, so only save when the buffer really is an .xlsx ('PK').
|
|
346
|
+
const bytes = res ? new Uint8Array(res) : new Uint8Array();
|
|
347
|
+
if (!(bytes.length > 1 && bytes[0] === 0x50 && bytes[1] === 0x4b)) {
|
|
348
|
+
this.toast.getErrorToast('No data to download');
|
|
349
|
+
this.changeDetector.detectChanges();
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
const safeName = String(group?.groupName || 'billing-group').replace(/[\\/:*?"<>|]/g, '-');
|
|
353
|
+
this.billingService.saveAsTemplate(res, `${safeName}-${new Date().toISOString().slice(0, 10)}`);
|
|
354
|
+
this.changeDetector.detectChanges();
|
|
355
|
+
},
|
|
356
|
+
error: () => {
|
|
357
|
+
this.downloadingGroupId = '';
|
|
358
|
+
this.toast.getErrorToast('Download failed');
|
|
359
|
+
this.changeDetector.detectChanges();
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
}
|
|
327
363
|
onBulkUploadFileSelected(event) {
|
|
328
364
|
const file = event?.target?.files?.[0];
|
|
329
365
|
if (!file)
|
|
@@ -372,15 +408,15 @@ export class BillingGroupsComponent {
|
|
|
372
408
|
});
|
|
373
409
|
}
|
|
374
410
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingGroupsComponent, deps: [{ token: i1.BillingService }, { token: i0.ChangeDetectorRef }, { token: i2.ToastService }, { token: i3.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
|
|
375
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingGroupsComponent, selector: "lib-billing-groups", inputs: { clientId: "clientId" }, viewQueries: [{ propertyName: "bulkUploadInput", first: true, predicate: ["bulkUploadInput"], descendants: true }], 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 Groups</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ summary?.totalGroups || 0 }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Manage GST entities for consolidated invoicing. Each group gets its own invoice.</div>\n </div>\n <div></div>\n </div>\n\n <!-- Summary Cards -->\n <div class=\"row g-3 mb-4\" *ngIf=\"summary?.totalGroups\">\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Groups</div>\n <div class=\"summary-value-sm\">{{ summary?.totalGroups }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Active</div>\n <div class=\"summary-value-sm text-primary\">{{ summary?.active }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Receivers</div>\n <div class=\"summary-value-sm\">{{ summary?.totalReceivers }}</div>\n </div>\n </div>\n </div>\n\n <!-- Search + Filter + Export + Add Row -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar w-100\">\n <div class=\"d-flex justify-content-end\">\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=\"Search...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"groupFilterObject\" (appliedFilters)=\"applyGroupFilters($event)\"></lib-filters>\n <button type=\"button\" (click)=\"bulkDownload()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader me-2\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\" *ngIf=\"!bulkDownloading\">Bulk Download</span>\n <span class=\"ms-2\" *ngIf=\"bulkDownloading\">Downloading...</span>\n </button>\n <button type=\"button\" (click)=\"bulkUploadInput.click()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader me-2\"\n [disabled]=\"bulkUploading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\" *ngIf=\"!bulkUploading\">Bulk Upload</span>\n <span class=\"ms-2\" *ngIf=\"bulkUploading\">Uploading...</span>\n </button>\n <input #bulkUploadInput type=\"file\" accept=\".xlsx,.xls\" hidden (change)=\"onBulkUploadFileSelected($event)\">\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!groupList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\">Export</span>\n </button>\n <button type=\"button\" class=\"btn btn-primary text-nowrap ms-3\" (click)=\"addBillingGroup()\">\n + Add Billing Group\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"groupLoading\">\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=\"groupNoData\">\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 <!-- Groups List -->\n <div *ngIf=\"!groupLoading && !groupNoData\">\n <div *ngFor=\"let group of groupList\" class=\"group-card mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"d-flex align-items-center gap-3\">\n <div class=\"group-icon\">\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=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"group-name\">{{ group?.groupName }}</span>\n <span class=\"badge badge-light-success\">Active</span>\n </div>\n <div class=\"text-muted small\">\n <span *ngIf=\"group?.gst\">GST: {{ group?.gst }}</span>\n <span *ngIf=\"group?.gst && group?.registeredCompanyName\" class=\"mx-2\">·</span>\n <span *ngIf=\"group?.registeredCompanyName\">{{ group?.registeredCompanyName }}</span>\n </div>\n </div>\n </div>\n <div class=\"d-flex gap-2\">\n <button class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"editBillingGroup(group)\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M11.3333 2.00004C11.5083 1.82494 11.7163 1.68605 11.9451 1.59129C12.1739 1.49653 12.4191 1.44775 12.6667 1.44775C12.9143 1.44775 13.1594 1.49653 13.3882 1.59129C13.617 1.68605 13.825 1.82494 14 2.00004C14.1751 2.17513 14.314 2.38318 14.4088 2.61197C14.5035 2.84076 14.5523 3.08586 14.5523 3.33337C14.5523 3.58089 14.5035 3.82599 14.4088 4.05478C14.314 4.28357 14.1751 4.49162 14 4.66671L5 13.6667L1.33333 14.6667L2.33333 11L11.3333 2.00004Z\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button *ngIf=\"!group?.isPrimary\" class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"deleteBillingGroup(group)\" title=\"Delete\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M2 4H3.33333H14M12.6667 4V13.3333C12.6667 13.687 12.5262 14.0261 12.2761 14.2761C12.0261 14.5262 11.687 14.6667 11.3333 14.6667H4.66667C4.31304 14.6667 3.97391 14.5262 3.72386 14.2761C3.47381 14.0261 3.33333 13.687 3.33333 13.3333V4M5.33333 4V2.66667C5.33333 2.31304 5.47381 1.97391 5.72386 1.72386C5.97391 1.47381 6.31304 1.33333 6.66667 1.33333H9.33333C9.68696 1.33333 10.0261 1.47381 10.2761 1.72386C10.5262 1.97391 10.6667 2.31304 10.6667 2.66667V4\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n <div class=\"row g-3 mt-2\">\n <div class=\"col\">\n <div class=\"group-detail-label\">Contact Email</div>\n <div class=\"group-detail-value\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M1.16667 4.08325L6.14617 7.40617C6.50533 7.64558 6.685 7.76525 6.87933 7.81042C7.05133 7.85042 7.23033 7.85042 7.40233 7.81042C7.59667 7.76525 7.77633 7.64558 8.1355 7.40617L13.115 4.08325M3.96667 11.6666H10.3147C11.1948 11.6666 11.6348 11.6666 11.9717 11.4951C12.2687 11.3439 12.5105 11.1021 12.6617 10.8051C12.8333 10.4682 12.8333 10.0282 12.8333 9.14808V5.13508C12.8333 4.25499 12.8333 3.81499 12.6617 3.47808C12.5105 3.18108 12.2687 2.93933 11.9717 2.78808C11.6348 2.61658 11.1948 2.61658 10.3147 2.61658H3.96667C3.08658 2.61658 2.64658 2.61658 2.30967 2.78808C2.01267 2.93933 1.77092 3.18108 1.61967 3.47808C1.44817 3.81499 1.44817 4.25499 1.44817 5.13508V9.14808C1.44817 10.0282 1.44817 10.4682 1.61967 10.8051C1.77092 11.1021 2.01267 11.3439 2.30967 11.4951C2.64658 11.6666 3.08658 11.6666 3.96667 11.6666Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span *ngIf=\"group?.generateInvoiceTo?.length\">{{ group?.generateInvoiceTo[0] }}</span>\n <span *ngIf=\"!group?.generateInvoiceTo?.length\" class=\"text-muted\">\u2014</span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Stores</div>\n <div class=\"group-detail-value\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M1.16667 7.00008L6.56483 1.60192C6.78683 1.37992 6.89783 1.26892 7.02583 1.22192C7.13883 1.18025 7.26283 1.18025 7.37583 1.22192C7.50383 1.26892 7.61483 1.37992 7.83683 1.60192L13.235 7.00008M2.91667 5.54175V11.0251C2.91667 11.4651 2.91667 11.6851 3.00242 11.8536C3.07808 12.0021 3.19825 12.1223 3.34675 12.1979C3.51533 12.2837 3.73533 12.2837 4.17533 12.2837H5.83333V9.33342C5.83333 8.87508 5.83333 8.64592 5.92208 8.46892C6.00033 8.31308 6.12617 8.18725 6.282 8.10908C6.459 8.02025 6.68817 8.02025 7.14667 8.02025H7.25417C7.71267 8.02025 7.94183 8.02025 8.11883 8.10908C8.27467 8.18725 8.40067 8.31308 8.47883 8.46892C8.5675 8.64592 8.5675 8.87508 8.5675 9.33342V12.2837H10.226C10.666 12.2837 10.886 12.2837 11.0545 12.1979C11.203 12.1223 11.3232 12.0021 11.3988 11.8536C11.4847 11.6851 11.4847 11.4651 11.4847 11.0251V5.54175\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.storeCount || 0 }}\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Annexure Attachment</div>\n <div class=\"group-detail-value\">\n <span class=\"badge\" [ngClass]=\"group?.attachAnnexure ? 'badge-light-success' : 'badge-light-secondary'\">\n {{ group?.attachAnnexure ? 'Attached' : 'Not attached' }}\n </span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Invoice Receivers</div>\n <div class=\"group-detail-value\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M9.33333 12.25V11.0833C9.33333 10.4645 9.08735 9.871 8.64976 9.43342C8.21218 8.99583 7.61868 8.75 7 8.75H2.91667C2.29799 8.75 1.70449 8.99583 1.2669 9.43342C0.829316 9.871 0.583333 10.4645 0.583333 11.0833V12.25M12.8333 12.25V11.0833C12.833 10.5735 12.6688 10.0778 12.3654 9.66858C12.0621 9.25933 11.636 8.95858 11.1458 8.81083M9.04167 1.81083C9.53308 1.95792 9.96058 2.25858 10.265 2.66825C10.5694 3.07792 10.734 3.57467 10.734 4.08542C10.734 4.59617 10.5694 5.09292 10.265 5.50258C9.96058 5.91225 9.53308 6.21292 9.04167 6.36M7.29167 4.08333C7.29167 5.37242 6.24742 6.41667 4.95833 6.41667C3.66925 6.41667 2.625 5.37242 2.625 4.08333C2.625 2.79425 3.66925 1.75 4.95833 1.75C6.24742 1.75 7.29167 2.79425 7.29167 4.08333Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.receiverCount || 0 }} recipients\n </div>\n </div>\n </div>\n </div>\n\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\n<!-- ===================== Payment Reminders ===================== -->\n<div class=\"pr-panel mt-4\">\n <div class=\"pr-head\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#1493f5\" stroke-width=\"2\"><path d=\"M18 8a6 6 0 0 0-12 0c0 7-3 9-3 9h18s-3-2-3-9M13.7 21a2 2 0 0 1-3.4 0\"/></svg>\n <div>\n <div class=\"pr-title\">Payment Reminders</div>\n <div class=\"pr-sub\">These recipients receive payment-reminder emails for all billing groups in this brand.</div>\n </div>\n </div>\n\n <!-- Recipients -->\n <div class=\"pr-field mt-3\">\n <label class=\"pr-label\">Reminder Recipients</label>\n <div class=\"pr-chips\">\n <span class=\"pr-chip\" *ngFor=\"let e of reminderEmails\">\n {{ e }}<span class=\"pr-chip-x\" (click)=\"removeReminderEmail(e)\">\u00D7</span>\n </span>\n <input class=\"pr-chip-input\" [(ngModel)]=\"reminderEmailInput\" placeholder=\"Add email + Enter\"\n (keydown.enter)=\"$event.preventDefault(); addReminderEmail()\"\n (blur)=\"addReminderEmail()\">\n </div>\n <div class=\"pr-hint\">Applied to every billing group for this brand.</div>\n </div>\n\n <!-- Schedule -->\n <div class=\"mt-4\">\n <div class=\"d-flex align-items-center gap-2\">\n <label class=\"pr-schedule-label\">Reminder Schedule</label>\n <span class=\"pr-count\">{{ reminderEnabledCount }} of 5 enabled</span>\n </div>\n <div class=\"pr-hint mb-3\">Predefined reminder flows. Enable the templates you want \u2014 timings are fixed except where noted.</div>\n\n <!-- Due Date Reminder -->\n <div class=\"pr-tmpl\" [class.on]=\"reminderTemplates.preDue.enabled || reminderTemplates.onDue.enabled\">\n <div class=\"pr-tmpl-head\">\n <span class=\"pr-dot amber\"></span>\n <div class=\"flex-grow-1\">\n <div class=\"pr-tmpl-name\">Due Date Reminder</div>\n <div class=\"pr-hint\">Remind the customer around the invoice due date. Enable each stage independently.</div>\n </div>\n <span class=\"pr-tag amber\">Around due</span>\n </div>\n <div class=\"pr-tmpl-body\">\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>Before due</b> \u2014 send\n <input type=\"number\" min=\"1\" max=\"365\" class=\"pr-day-input\"\n [ngModel]=\"reminderTemplates.preDue.daysBefore\"\n (ngModelChange)=\"onPreDueDaysChange($event)\"> day(s) before the due date\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.preDue.enabled\"\n (click)=\"toggleReminderTemplate('preDue')\"></div>\n </div>\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>On due date</b> \u2014 sent on the invoice due date</div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.onDue.enabled\"\n (click)=\"toggleReminderTemplate('onDue')\"></div>\n </div>\n </div>\n </div>\n\n <!-- Payment Overdue Reminder -->\n <div class=\"pr-tmpl mt-3\"\n [class.on]=\"reminderTemplates.onHold.enabled || reminderTemplates.suspend.enabled || reminderTemplates.deactivated.enabled\">\n <div class=\"pr-tmpl-head\">\n <span class=\"pr-dot red\"></span>\n <div class=\"flex-grow-1\">\n <div class=\"pr-tmpl-name\">Payment Overdue Reminder</div>\n <div class=\"pr-hint\">Sent after the invoice crosses the due date. Enable each stage independently.</div>\n </div>\n <span class=\"pr-tag red\">After due</span>\n </div>\n <div class=\"pr-tmpl-body\">\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>On Hold</b>\n <span class=\"pr-info\" ngbTooltip=\"Data collected and processed; hidden from UI; login still works.\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </span>\n \u2014 account on hold immediately after due date\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.onHold.enabled\"\n (click)=\"toggleReminderTemplate('onHold')\"></div>\n </div>\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>Suspended</b>\n <span class=\"pr-info\" ngbTooltip=\"Data collected, not processed; hidden from UI; login blocked.\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </span>\n \u2014 account suspended automatically after <b>30 days</b> unpaid\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.suspend.enabled\"\n (click)=\"toggleReminderTemplate('suspend')\"></div>\n </div>\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>Deactivated</b>\n <span class=\"pr-info\" ngbTooltip=\"Data not collected or processed; hidden from UI; access disabled.\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </span>\n \u2014 account deactivated automatically after <b>60 days</b> unpaid\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.deactivated.enabled\"\n (click)=\"toggleReminderTemplate('deactivated')\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex justify-content-end mt-4\">\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"reminderSaving\" (click)=\"savePaymentReminder()\">\n {{ reminderSaving ? 'Saving\u2026' : 'Save' }}\n </button>\n </div>\n</div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.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}.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);border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important}.summary-card-sm{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:8px;padding:16px 20px}.summary-label-sm{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085)}.summary-value-sm{font-family:Inter;font-size:24px;font-weight:600;color:var(--Gray-900, #101828);margin-top:4px}.group-card{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:20px 24px}.group-icon{width:40px;height:40px;border-radius:8px;background:var(--Primary-50, #EAF8FF);display:flex;align-items:center;justify-content:center}.group-name{font-family:Inter;font-size:16px;font-weight:600;color:var(--Gray-900, #101828)}.group-detail-label{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085);margin-bottom:4px}.group-detail-value{font-family:Inter;font-size:14px;font-weight:500;color:var(--Gray-700, #344054)}.badge-light-secondary{background:var(--Gray-100, #F2F4F7);color:var(--Gray-500, #667085)}.btn-icon{width:36px;height:36px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid var(--Gray-200, #EAECF0)}.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}}.pr-panel{background:#fff;border:1px solid #E4E7EC;border-radius:14px;padding:22px 24px}.pr-head{display:flex;align-items:flex-start;gap:12px}.pr-title{font-size:16px;font-weight:800;color:#101828}.pr-sub,.pr-hint{color:#8a93a2;font-size:12.5px}.pr-hint{margin-top:4px}.pr-label,.pr-schedule-label{display:block;font-weight:700;color:#101828;font-size:13.5px;margin-bottom:7px}.pr-schedule-label{margin-bottom:0}.pr-chips{display:flex;flex-wrap:wrap;gap:8px;border:1px solid #D0D5DD;border-radius:10px;padding:9px 11px;min-height:46px;align-items:center}.pr-chip{background:#eef1f5;border-radius:8px;padding:6px 9px;display:flex;align-items:center;gap:8px;font-size:13px;color:#344054}.pr-chip-x{cursor:pointer;color:#98a2b3;font-weight:700}.pr-chip-x:hover{color:#d64545}.pr-chip-input{border:0;outline:0;flex:1;min-width:140px;padding:6px}.pr-count{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:2px 9px}.pr-tmpl{border:1px solid #e4e6ea;border-radius:11px;padding:13px 15px;background:#fff;transition:border-color .15s,background .15s}.pr-tmpl.on{border-color:#bcd9f7;background:#fbfdff}.pr-tmpl-head{display:flex;align-items:flex-start;gap:11px}.pr-tmpl-name{font-weight:700;color:#101828;font-size:14px}.pr-dot{width:9px;height:9px;border-radius:50%;margin-top:5px;flex:none}.pr-dot.amber{background:#e7920b}.pr-dot.red{background:#d64545}.pr-tag{font-size:11px;font-weight:700;padding:2px 9px;border-radius:999px;white-space:nowrap}.pr-tag.amber{background:#fdf0d8;color:#92600c}.pr-tag.red{background:#fde3e3;color:#b42318}.pr-tmpl-body{margin-top:11px;padding-top:11px;border-top:1px solid #eceef1}.pr-row{display:flex;align-items:center;gap:12px;padding:6px 0}.pr-row-text{flex:1;color:#475467;font-size:13px;line-height:1.5}.pr-row-text b{color:#344054}.pr-day-input{width:60px;border:1px solid #D0D5DD;border-radius:6px;padding:4px 8px;text-align:center}.pr-toggle{width:40px;height:22px;border-radius:999px;background:#d7dbe2;position:relative;cursor:pointer;transition:.15s;flex:0 0 40px}.pr-toggle:after{content:\"\";position:absolute;width:16px;height:16px;border-radius:50%;background:#fff;top:3px;left:3px;transition:.15s}.pr-toggle.on{background:#1493f5}.pr-toggle.on:after{left:21px}.pr-row-text .pr-info{display:inline-flex;align-items:center;vertical-align:middle;margin:0 8px;cursor:help}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.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.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i5.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { 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"] }] });
|
|
411
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingGroupsComponent, selector: "lib-billing-groups", inputs: { clientId: "clientId" }, viewQueries: [{ propertyName: "bulkUploadInput", first: true, predicate: ["bulkUploadInput"], descendants: true }], 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 Groups</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ summary?.totalGroups || 0 }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Manage GST entities for consolidated invoicing. Each group gets its own invoice.</div>\n </div>\n <div></div>\n </div>\n\n <!-- Summary Cards -->\n <div class=\"row g-3 mb-4\" *ngIf=\"summary?.totalGroups\">\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Groups</div>\n <div class=\"summary-value-sm\">{{ summary?.totalGroups }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Active</div>\n <div class=\"summary-value-sm text-primary\">{{ summary?.active }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Receivers</div>\n <div class=\"summary-value-sm\">{{ summary?.totalReceivers }}</div>\n </div>\n </div>\n </div>\n\n <!-- Search + Filter + Export + Add Row -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar w-100\">\n <div class=\"d-flex justify-content-end\">\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=\"Search...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"groupFilterObject\" (appliedFilters)=\"applyGroupFilters($event)\"></lib-filters>\n <button type=\"button\" (click)=\"bulkDownload()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader me-2\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\" *ngIf=\"!bulkDownloading\">Bulk Download</span>\n <span class=\"ms-2\" *ngIf=\"bulkDownloading\">Downloading...</span>\n </button>\n <button type=\"button\" (click)=\"bulkUploadInput.click()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader me-2\"\n [disabled]=\"bulkUploading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\" *ngIf=\"!bulkUploading\">Bulk Upload</span>\n <span class=\"ms-2\" *ngIf=\"bulkUploading\">Uploading...</span>\n </button>\n <input #bulkUploadInput type=\"file\" accept=\".xlsx,.xls\" hidden (change)=\"onBulkUploadFileSelected($event)\">\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!groupList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\">Export</span>\n </button>\n <button type=\"button\" class=\"btn btn-primary text-nowrap ms-3\" (click)=\"addBillingGroup()\">\n + Add Billing Group\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"groupLoading\">\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=\"groupNoData\">\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 <!-- Groups List -->\n <div *ngIf=\"!groupLoading && !groupNoData\">\n <div *ngFor=\"let group of groupList\" class=\"group-card mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"d-flex align-items-center gap-3\">\n <div class=\"group-icon\">\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=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"group-name\">{{ group?.groupName }}</span>\n <span class=\"badge badge-light-success\">Active</span>\n </div>\n <div class=\"text-muted small\">\n <span *ngIf=\"group?.gst\">GST: {{ group?.gst }}</span>\n <span *ngIf=\"group?.gst && group?.registeredCompanyName\" class=\"mx-2\">·</span>\n <span *ngIf=\"group?.registeredCompanyName\">{{ group?.registeredCompanyName }}</span>\n </div>\n </div>\n </div>\n <div class=\"d-flex gap-2\">\n <button class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"downloadBillingGroup(group)\"\n [disabled]=\"downloadingGroupId === group?._id\" title=\"Download\">\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.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"editBillingGroup(group)\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M11.3333 2.00004C11.5083 1.82494 11.7163 1.68605 11.9451 1.59129C12.1739 1.49653 12.4191 1.44775 12.6667 1.44775C12.9143 1.44775 13.1594 1.49653 13.3882 1.59129C13.617 1.68605 13.825 1.82494 14 2.00004C14.1751 2.17513 14.314 2.38318 14.4088 2.61197C14.5035 2.84076 14.5523 3.08586 14.5523 3.33337C14.5523 3.58089 14.5035 3.82599 14.4088 4.05478C14.314 4.28357 14.1751 4.49162 14 4.66671L5 13.6667L1.33333 14.6667L2.33333 11L11.3333 2.00004Z\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button *ngIf=\"!group?.isPrimary\" class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"deleteBillingGroup(group)\" title=\"Delete\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M2 4H3.33333H14M12.6667 4V13.3333C12.6667 13.687 12.5262 14.0261 12.2761 14.2761C12.0261 14.5262 11.687 14.6667 11.3333 14.6667H4.66667C4.31304 14.6667 3.97391 14.5262 3.72386 14.2761C3.47381 14.0261 3.33333 13.687 3.33333 13.3333V4M5.33333 4V2.66667C5.33333 2.31304 5.47381 1.97391 5.72386 1.72386C5.97391 1.47381 6.31304 1.33333 6.66667 1.33333H9.33333C9.68696 1.33333 10.0261 1.47381 10.2761 1.72386C10.5262 1.97391 10.6667 2.31304 10.6667 2.66667V4\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n <div class=\"row g-3 mt-2\">\n <div class=\"col\">\n <div class=\"group-detail-label\">Contact Email</div>\n <div class=\"group-detail-value\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M1.16667 4.08325L6.14617 7.40617C6.50533 7.64558 6.685 7.76525 6.87933 7.81042C7.05133 7.85042 7.23033 7.85042 7.40233 7.81042C7.59667 7.76525 7.77633 7.64558 8.1355 7.40617L13.115 4.08325M3.96667 11.6666H10.3147C11.1948 11.6666 11.6348 11.6666 11.9717 11.4951C12.2687 11.3439 12.5105 11.1021 12.6617 10.8051C12.8333 10.4682 12.8333 10.0282 12.8333 9.14808V5.13508C12.8333 4.25499 12.8333 3.81499 12.6617 3.47808C12.5105 3.18108 12.2687 2.93933 11.9717 2.78808C11.6348 2.61658 11.1948 2.61658 10.3147 2.61658H3.96667C3.08658 2.61658 2.64658 2.61658 2.30967 2.78808C2.01267 2.93933 1.77092 3.18108 1.61967 3.47808C1.44817 3.81499 1.44817 4.25499 1.44817 5.13508V9.14808C1.44817 10.0282 1.44817 10.4682 1.61967 10.8051C1.77092 11.1021 2.01267 11.3439 2.30967 11.4951C2.64658 11.6666 3.08658 11.6666 3.96667 11.6666Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span *ngIf=\"group?.generateInvoiceTo?.length\">{{ group?.generateInvoiceTo[0] }}</span>\n <span *ngIf=\"!group?.generateInvoiceTo?.length\" class=\"text-muted\">\u2014</span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Stores</div>\n <div class=\"group-detail-value\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M1.16667 7.00008L6.56483 1.60192C6.78683 1.37992 6.89783 1.26892 7.02583 1.22192C7.13883 1.18025 7.26283 1.18025 7.37583 1.22192C7.50383 1.26892 7.61483 1.37992 7.83683 1.60192L13.235 7.00008M2.91667 5.54175V11.0251C2.91667 11.4651 2.91667 11.6851 3.00242 11.8536C3.07808 12.0021 3.19825 12.1223 3.34675 12.1979C3.51533 12.2837 3.73533 12.2837 4.17533 12.2837H5.83333V9.33342C5.83333 8.87508 5.83333 8.64592 5.92208 8.46892C6.00033 8.31308 6.12617 8.18725 6.282 8.10908C6.459 8.02025 6.68817 8.02025 7.14667 8.02025H7.25417C7.71267 8.02025 7.94183 8.02025 8.11883 8.10908C8.27467 8.18725 8.40067 8.31308 8.47883 8.46892C8.5675 8.64592 8.5675 8.87508 8.5675 9.33342V12.2837H10.226C10.666 12.2837 10.886 12.2837 11.0545 12.1979C11.203 12.1223 11.3232 12.0021 11.3988 11.8536C11.4847 11.6851 11.4847 11.4651 11.4847 11.0251V5.54175\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.storeCount || 0 }}\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Annexure Attachment</div>\n <div class=\"group-detail-value\">\n <span class=\"badge\" [ngClass]=\"group?.attachAnnexure ? 'badge-light-success' : 'badge-light-secondary'\">\n {{ group?.attachAnnexure ? 'Attached' : 'Not attached' }}\n </span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Invoice Receivers</div>\n <div class=\"group-detail-value\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M9.33333 12.25V11.0833C9.33333 10.4645 9.08735 9.871 8.64976 9.43342C8.21218 8.99583 7.61868 8.75 7 8.75H2.91667C2.29799 8.75 1.70449 8.99583 1.2669 9.43342C0.829316 9.871 0.583333 10.4645 0.583333 11.0833V12.25M12.8333 12.25V11.0833C12.833 10.5735 12.6688 10.0778 12.3654 9.66858C12.0621 9.25933 11.636 8.95858 11.1458 8.81083M9.04167 1.81083C9.53308 1.95792 9.96058 2.25858 10.265 2.66825C10.5694 3.07792 10.734 3.57467 10.734 4.08542C10.734 4.59617 10.5694 5.09292 10.265 5.50258C9.96058 5.91225 9.53308 6.21292 9.04167 6.36M7.29167 4.08333C7.29167 5.37242 6.24742 6.41667 4.95833 6.41667C3.66925 6.41667 2.625 5.37242 2.625 4.08333C2.625 2.79425 3.66925 1.75 4.95833 1.75C6.24742 1.75 7.29167 2.79425 7.29167 4.08333Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.receiverCount || 0 }} recipients\n </div>\n </div>\n </div>\n </div>\n\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\n<!-- ===================== Payment Reminders ===================== -->\n<div class=\"pr-panel mt-4\">\n <div class=\"pr-head\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#1493f5\" stroke-width=\"2\"><path d=\"M18 8a6 6 0 0 0-12 0c0 7-3 9-3 9h18s-3-2-3-9M13.7 21a2 2 0 0 1-3.4 0\"/></svg>\n <div>\n <div class=\"pr-title\">Payment Reminders</div>\n <div class=\"pr-sub\">These recipients receive payment-reminder emails for all billing groups in this brand.</div>\n </div>\n </div>\n\n <!-- Recipients -->\n <div class=\"pr-field mt-3\">\n <label class=\"pr-label\">Reminder Recipients</label>\n <div class=\"pr-chips\">\n <span class=\"pr-chip\" *ngFor=\"let e of reminderEmails\">\n {{ e }}<span class=\"pr-chip-x\" (click)=\"removeReminderEmail(e)\">\u00D7</span>\n </span>\n <input class=\"pr-chip-input\" [(ngModel)]=\"reminderEmailInput\" placeholder=\"Add email + Enter\"\n (keydown.enter)=\"$event.preventDefault(); addReminderEmail()\"\n (blur)=\"addReminderEmail()\">\n </div>\n <div class=\"pr-hint\">Applied to every billing group for this brand.</div>\n </div>\n\n <!-- Schedule -->\n <div class=\"mt-4\">\n <div class=\"d-flex align-items-center gap-2\">\n <label class=\"pr-schedule-label\">Reminder Schedule</label>\n <span class=\"pr-count\">{{ reminderEnabledCount }} of 5 enabled</span>\n </div>\n <div class=\"pr-hint mb-3\">Predefined reminder flows. Enable the templates you want \u2014 timings are fixed except where noted.</div>\n\n <!-- Due Date Reminder -->\n <div class=\"pr-tmpl\" [class.on]=\"reminderTemplates.preDue.enabled || reminderTemplates.onDue.enabled\">\n <div class=\"pr-tmpl-head\">\n <span class=\"pr-dot amber\"></span>\n <div class=\"flex-grow-1\">\n <div class=\"pr-tmpl-name\">Due Date Reminder</div>\n <div class=\"pr-hint\">Remind the customer around the invoice due date. Enable each stage independently.</div>\n </div>\n <span class=\"pr-tag amber\">Around due</span>\n </div>\n <div class=\"pr-tmpl-body\">\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>Before due</b> \u2014 send\n <input type=\"number\" min=\"1\" max=\"365\" class=\"pr-day-input\"\n [ngModel]=\"reminderTemplates.preDue.daysBefore\"\n (ngModelChange)=\"onPreDueDaysChange($event)\"> day(s) before the due date\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.preDue.enabled\"\n (click)=\"toggleReminderTemplate('preDue')\"></div>\n </div>\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>On due date</b> \u2014 sent on the invoice due date</div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.onDue.enabled\"\n (click)=\"toggleReminderTemplate('onDue')\"></div>\n </div>\n </div>\n </div>\n\n <!-- Payment Overdue Reminder -->\n <div class=\"pr-tmpl mt-3\"\n [class.on]=\"reminderTemplates.onHold.enabled || reminderTemplates.suspend.enabled || reminderTemplates.deactivated.enabled\">\n <div class=\"pr-tmpl-head\">\n <span class=\"pr-dot red\"></span>\n <div class=\"flex-grow-1\">\n <div class=\"pr-tmpl-name\">Payment Overdue Reminder</div>\n <div class=\"pr-hint\">Sent after the invoice crosses the due date. Enable each stage independently.</div>\n </div>\n <span class=\"pr-tag red\">After due</span>\n </div>\n <div class=\"pr-tmpl-body\">\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>On Hold</b>\n <span class=\"pr-info\" ngbTooltip=\"Data collected and processed; hidden from UI; login still works.\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </span>\n \u2014 account on hold immediately after due date\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.onHold.enabled\"\n (click)=\"toggleReminderTemplate('onHold')\"></div>\n </div>\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>Suspended</b>\n <span class=\"pr-info\" ngbTooltip=\"Data collected, not processed; hidden from UI; login blocked.\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </span>\n \u2014 account suspended automatically after <b>30 days</b> unpaid\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.suspend.enabled\"\n (click)=\"toggleReminderTemplate('suspend')\"></div>\n </div>\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>Deactivated</b>\n <span class=\"pr-info\" ngbTooltip=\"Data not collected or processed; hidden from UI; access disabled.\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </span>\n \u2014 account deactivated automatically after <b>60 days</b> unpaid\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.deactivated.enabled\"\n (click)=\"toggleReminderTemplate('deactivated')\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex justify-content-end mt-4\">\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"reminderSaving\" (click)=\"savePaymentReminder()\">\n {{ reminderSaving ? 'Saving\u2026' : 'Save' }}\n </button>\n </div>\n</div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.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}.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);border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important}.summary-card-sm{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:8px;padding:16px 20px}.summary-label-sm{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085)}.summary-value-sm{font-family:Inter;font-size:24px;font-weight:600;color:var(--Gray-900, #101828);margin-top:4px}.group-card{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:20px 24px}.group-icon{width:40px;height:40px;border-radius:8px;background:var(--Primary-50, #EAF8FF);display:flex;align-items:center;justify-content:center}.group-name{font-family:Inter;font-size:16px;font-weight:600;color:var(--Gray-900, #101828)}.group-detail-label{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085);margin-bottom:4px}.group-detail-value{font-family:Inter;font-size:14px;font-weight:500;color:var(--Gray-700, #344054)}.badge-light-secondary{background:var(--Gray-100, #F2F4F7);color:var(--Gray-500, #667085)}.btn-icon{width:36px;height:36px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid var(--Gray-200, #EAECF0)}.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}}.pr-panel{background:#fff;border:1px solid #E4E7EC;border-radius:14px;padding:22px 24px}.pr-head{display:flex;align-items:flex-start;gap:12px}.pr-title{font-size:16px;font-weight:800;color:#101828}.pr-sub,.pr-hint{color:#8a93a2;font-size:12.5px}.pr-hint{margin-top:4px}.pr-label,.pr-schedule-label{display:block;font-weight:700;color:#101828;font-size:13.5px;margin-bottom:7px}.pr-schedule-label{margin-bottom:0}.pr-chips{display:flex;flex-wrap:wrap;gap:8px;border:1px solid #D0D5DD;border-radius:10px;padding:9px 11px;min-height:46px;align-items:center}.pr-chip{background:#eef1f5;border-radius:8px;padding:6px 9px;display:flex;align-items:center;gap:8px;font-size:13px;color:#344054}.pr-chip-x{cursor:pointer;color:#98a2b3;font-weight:700}.pr-chip-x:hover{color:#d64545}.pr-chip-input{border:0;outline:0;flex:1;min-width:140px;padding:6px}.pr-count{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:2px 9px}.pr-tmpl{border:1px solid #e4e6ea;border-radius:11px;padding:13px 15px;background:#fff;transition:border-color .15s,background .15s}.pr-tmpl.on{border-color:#bcd9f7;background:#fbfdff}.pr-tmpl-head{display:flex;align-items:flex-start;gap:11px}.pr-tmpl-name{font-weight:700;color:#101828;font-size:14px}.pr-dot{width:9px;height:9px;border-radius:50%;margin-top:5px;flex:none}.pr-dot.amber{background:#e7920b}.pr-dot.red{background:#d64545}.pr-tag{font-size:11px;font-weight:700;padding:2px 9px;border-radius:999px;white-space:nowrap}.pr-tag.amber{background:#fdf0d8;color:#92600c}.pr-tag.red{background:#fde3e3;color:#b42318}.pr-tmpl-body{margin-top:11px;padding-top:11px;border-top:1px solid #eceef1}.pr-row{display:flex;align-items:center;gap:12px;padding:6px 0}.pr-row-text{flex:1;color:#475467;font-size:13px;line-height:1.5}.pr-row-text b{color:#344054}.pr-day-input{width:60px;border:1px solid #D0D5DD;border-radius:6px;padding:4px 8px;text-align:center}.pr-toggle{width:40px;height:22px;border-radius:999px;background:#d7dbe2;position:relative;cursor:pointer;transition:.15s;flex:0 0 40px}.pr-toggle:after{content:\"\";position:absolute;width:16px;height:16px;border-radius:50%;background:#fff;top:3px;left:3px;transition:.15s}.pr-toggle.on{background:#1493f5}.pr-toggle.on:after{left:21px}.pr-row-text .pr-info{display:inline-flex;align-items:center;vertical-align:middle;margin:0 8px;cursor:help}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.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.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i5.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { 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"] }] });
|
|
376
412
|
}
|
|
377
413
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingGroupsComponent, decorators: [{
|
|
378
414
|
type: Component,
|
|
379
|
-
args: [{ selector: 'lib-billing-groups', 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 Groups</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ summary?.totalGroups || 0 }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Manage GST entities for consolidated invoicing. Each group gets its own invoice.</div>\n </div>\n <div></div>\n </div>\n\n <!-- Summary Cards -->\n <div class=\"row g-3 mb-4\" *ngIf=\"summary?.totalGroups\">\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Groups</div>\n <div class=\"summary-value-sm\">{{ summary?.totalGroups }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Active</div>\n <div class=\"summary-value-sm text-primary\">{{ summary?.active }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Receivers</div>\n <div class=\"summary-value-sm\">{{ summary?.totalReceivers }}</div>\n </div>\n </div>\n </div>\n\n <!-- Search + Filter + Export + Add Row -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar w-100\">\n <div class=\"d-flex justify-content-end\">\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=\"Search...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"groupFilterObject\" (appliedFilters)=\"applyGroupFilters($event)\"></lib-filters>\n <button type=\"button\" (click)=\"bulkDownload()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader me-2\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\" *ngIf=\"!bulkDownloading\">Bulk Download</span>\n <span class=\"ms-2\" *ngIf=\"bulkDownloading\">Downloading...</span>\n </button>\n <button type=\"button\" (click)=\"bulkUploadInput.click()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader me-2\"\n [disabled]=\"bulkUploading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\" *ngIf=\"!bulkUploading\">Bulk Upload</span>\n <span class=\"ms-2\" *ngIf=\"bulkUploading\">Uploading...</span>\n </button>\n <input #bulkUploadInput type=\"file\" accept=\".xlsx,.xls\" hidden (change)=\"onBulkUploadFileSelected($event)\">\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!groupList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\">Export</span>\n </button>\n <button type=\"button\" class=\"btn btn-primary text-nowrap ms-3\" (click)=\"addBillingGroup()\">\n + Add Billing Group\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"groupLoading\">\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=\"groupNoData\">\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 <!-- Groups List -->\n <div *ngIf=\"!groupLoading && !groupNoData\">\n <div *ngFor=\"let group of groupList\" class=\"group-card mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"d-flex align-items-center gap-3\">\n <div class=\"group-icon\">\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=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"group-name\">{{ group?.groupName }}</span>\n <span class=\"badge badge-light-success\">Active</span>\n </div>\n <div class=\"text-muted small\">\n <span *ngIf=\"group?.gst\">GST: {{ group?.gst }}</span>\n <span *ngIf=\"group?.gst && group?.registeredCompanyName\" class=\"mx-2\">·</span>\n <span *ngIf=\"group?.registeredCompanyName\">{{ group?.registeredCompanyName }}</span>\n </div>\n </div>\n </div>\n <div class=\"d-flex gap-2\">\n <button class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"editBillingGroup(group)\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M11.3333 2.00004C11.5083 1.82494 11.7163 1.68605 11.9451 1.59129C12.1739 1.49653 12.4191 1.44775 12.6667 1.44775C12.9143 1.44775 13.1594 1.49653 13.3882 1.59129C13.617 1.68605 13.825 1.82494 14 2.00004C14.1751 2.17513 14.314 2.38318 14.4088 2.61197C14.5035 2.84076 14.5523 3.08586 14.5523 3.33337C14.5523 3.58089 14.5035 3.82599 14.4088 4.05478C14.314 4.28357 14.1751 4.49162 14 4.66671L5 13.6667L1.33333 14.6667L2.33333 11L11.3333 2.00004Z\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button *ngIf=\"!group?.isPrimary\" class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"deleteBillingGroup(group)\" title=\"Delete\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M2 4H3.33333H14M12.6667 4V13.3333C12.6667 13.687 12.5262 14.0261 12.2761 14.2761C12.0261 14.5262 11.687 14.6667 11.3333 14.6667H4.66667C4.31304 14.6667 3.97391 14.5262 3.72386 14.2761C3.47381 14.0261 3.33333 13.687 3.33333 13.3333V4M5.33333 4V2.66667C5.33333 2.31304 5.47381 1.97391 5.72386 1.72386C5.97391 1.47381 6.31304 1.33333 6.66667 1.33333H9.33333C9.68696 1.33333 10.0261 1.47381 10.2761 1.72386C10.5262 1.97391 10.6667 2.31304 10.6667 2.66667V4\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n <div class=\"row g-3 mt-2\">\n <div class=\"col\">\n <div class=\"group-detail-label\">Contact Email</div>\n <div class=\"group-detail-value\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M1.16667 4.08325L6.14617 7.40617C6.50533 7.64558 6.685 7.76525 6.87933 7.81042C7.05133 7.85042 7.23033 7.85042 7.40233 7.81042C7.59667 7.76525 7.77633 7.64558 8.1355 7.40617L13.115 4.08325M3.96667 11.6666H10.3147C11.1948 11.6666 11.6348 11.6666 11.9717 11.4951C12.2687 11.3439 12.5105 11.1021 12.6617 10.8051C12.8333 10.4682 12.8333 10.0282 12.8333 9.14808V5.13508C12.8333 4.25499 12.8333 3.81499 12.6617 3.47808C12.5105 3.18108 12.2687 2.93933 11.9717 2.78808C11.6348 2.61658 11.1948 2.61658 10.3147 2.61658H3.96667C3.08658 2.61658 2.64658 2.61658 2.30967 2.78808C2.01267 2.93933 1.77092 3.18108 1.61967 3.47808C1.44817 3.81499 1.44817 4.25499 1.44817 5.13508V9.14808C1.44817 10.0282 1.44817 10.4682 1.61967 10.8051C1.77092 11.1021 2.01267 11.3439 2.30967 11.4951C2.64658 11.6666 3.08658 11.6666 3.96667 11.6666Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span *ngIf=\"group?.generateInvoiceTo?.length\">{{ group?.generateInvoiceTo[0] }}</span>\n <span *ngIf=\"!group?.generateInvoiceTo?.length\" class=\"text-muted\">\u2014</span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Stores</div>\n <div class=\"group-detail-value\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M1.16667 7.00008L6.56483 1.60192C6.78683 1.37992 6.89783 1.26892 7.02583 1.22192C7.13883 1.18025 7.26283 1.18025 7.37583 1.22192C7.50383 1.26892 7.61483 1.37992 7.83683 1.60192L13.235 7.00008M2.91667 5.54175V11.0251C2.91667 11.4651 2.91667 11.6851 3.00242 11.8536C3.07808 12.0021 3.19825 12.1223 3.34675 12.1979C3.51533 12.2837 3.73533 12.2837 4.17533 12.2837H5.83333V9.33342C5.83333 8.87508 5.83333 8.64592 5.92208 8.46892C6.00033 8.31308 6.12617 8.18725 6.282 8.10908C6.459 8.02025 6.68817 8.02025 7.14667 8.02025H7.25417C7.71267 8.02025 7.94183 8.02025 8.11883 8.10908C8.27467 8.18725 8.40067 8.31308 8.47883 8.46892C8.5675 8.64592 8.5675 8.87508 8.5675 9.33342V12.2837H10.226C10.666 12.2837 10.886 12.2837 11.0545 12.1979C11.203 12.1223 11.3232 12.0021 11.3988 11.8536C11.4847 11.6851 11.4847 11.4651 11.4847 11.0251V5.54175\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.storeCount || 0 }}\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Annexure Attachment</div>\n <div class=\"group-detail-value\">\n <span class=\"badge\" [ngClass]=\"group?.attachAnnexure ? 'badge-light-success' : 'badge-light-secondary'\">\n {{ group?.attachAnnexure ? 'Attached' : 'Not attached' }}\n </span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Invoice Receivers</div>\n <div class=\"group-detail-value\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M9.33333 12.25V11.0833C9.33333 10.4645 9.08735 9.871 8.64976 9.43342C8.21218 8.99583 7.61868 8.75 7 8.75H2.91667C2.29799 8.75 1.70449 8.99583 1.2669 9.43342C0.829316 9.871 0.583333 10.4645 0.583333 11.0833V12.25M12.8333 12.25V11.0833C12.833 10.5735 12.6688 10.0778 12.3654 9.66858C12.0621 9.25933 11.636 8.95858 11.1458 8.81083M9.04167 1.81083C9.53308 1.95792 9.96058 2.25858 10.265 2.66825C10.5694 3.07792 10.734 3.57467 10.734 4.08542C10.734 4.59617 10.5694 5.09292 10.265 5.50258C9.96058 5.91225 9.53308 6.21292 9.04167 6.36M7.29167 4.08333C7.29167 5.37242 6.24742 6.41667 4.95833 6.41667C3.66925 6.41667 2.625 5.37242 2.625 4.08333C2.625 2.79425 3.66925 1.75 4.95833 1.75C6.24742 1.75 7.29167 2.79425 7.29167 4.08333Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.receiverCount || 0 }} recipients\n </div>\n </div>\n </div>\n </div>\n\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\n<!-- ===================== Payment Reminders ===================== -->\n<div class=\"pr-panel mt-4\">\n <div class=\"pr-head\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#1493f5\" stroke-width=\"2\"><path d=\"M18 8a6 6 0 0 0-12 0c0 7-3 9-3 9h18s-3-2-3-9M13.7 21a2 2 0 0 1-3.4 0\"/></svg>\n <div>\n <div class=\"pr-title\">Payment Reminders</div>\n <div class=\"pr-sub\">These recipients receive payment-reminder emails for all billing groups in this brand.</div>\n </div>\n </div>\n\n <!-- Recipients -->\n <div class=\"pr-field mt-3\">\n <label class=\"pr-label\">Reminder Recipients</label>\n <div class=\"pr-chips\">\n <span class=\"pr-chip\" *ngFor=\"let e of reminderEmails\">\n {{ e }}<span class=\"pr-chip-x\" (click)=\"removeReminderEmail(e)\">\u00D7</span>\n </span>\n <input class=\"pr-chip-input\" [(ngModel)]=\"reminderEmailInput\" placeholder=\"Add email + Enter\"\n (keydown.enter)=\"$event.preventDefault(); addReminderEmail()\"\n (blur)=\"addReminderEmail()\">\n </div>\n <div class=\"pr-hint\">Applied to every billing group for this brand.</div>\n </div>\n\n <!-- Schedule -->\n <div class=\"mt-4\">\n <div class=\"d-flex align-items-center gap-2\">\n <label class=\"pr-schedule-label\">Reminder Schedule</label>\n <span class=\"pr-count\">{{ reminderEnabledCount }} of 5 enabled</span>\n </div>\n <div class=\"pr-hint mb-3\">Predefined reminder flows. Enable the templates you want \u2014 timings are fixed except where noted.</div>\n\n <!-- Due Date Reminder -->\n <div class=\"pr-tmpl\" [class.on]=\"reminderTemplates.preDue.enabled || reminderTemplates.onDue.enabled\">\n <div class=\"pr-tmpl-head\">\n <span class=\"pr-dot amber\"></span>\n <div class=\"flex-grow-1\">\n <div class=\"pr-tmpl-name\">Due Date Reminder</div>\n <div class=\"pr-hint\">Remind the customer around the invoice due date. Enable each stage independently.</div>\n </div>\n <span class=\"pr-tag amber\">Around due</span>\n </div>\n <div class=\"pr-tmpl-body\">\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>Before due</b> \u2014 send\n <input type=\"number\" min=\"1\" max=\"365\" class=\"pr-day-input\"\n [ngModel]=\"reminderTemplates.preDue.daysBefore\"\n (ngModelChange)=\"onPreDueDaysChange($event)\"> day(s) before the due date\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.preDue.enabled\"\n (click)=\"toggleReminderTemplate('preDue')\"></div>\n </div>\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>On due date</b> \u2014 sent on the invoice due date</div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.onDue.enabled\"\n (click)=\"toggleReminderTemplate('onDue')\"></div>\n </div>\n </div>\n </div>\n\n <!-- Payment Overdue Reminder -->\n <div class=\"pr-tmpl mt-3\"\n [class.on]=\"reminderTemplates.onHold.enabled || reminderTemplates.suspend.enabled || reminderTemplates.deactivated.enabled\">\n <div class=\"pr-tmpl-head\">\n <span class=\"pr-dot red\"></span>\n <div class=\"flex-grow-1\">\n <div class=\"pr-tmpl-name\">Payment Overdue Reminder</div>\n <div class=\"pr-hint\">Sent after the invoice crosses the due date. Enable each stage independently.</div>\n </div>\n <span class=\"pr-tag red\">After due</span>\n </div>\n <div class=\"pr-tmpl-body\">\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>On Hold</b>\n <span class=\"pr-info\" ngbTooltip=\"Data collected and processed; hidden from UI; login still works.\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </span>\n \u2014 account on hold immediately after due date\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.onHold.enabled\"\n (click)=\"toggleReminderTemplate('onHold')\"></div>\n </div>\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>Suspended</b>\n <span class=\"pr-info\" ngbTooltip=\"Data collected, not processed; hidden from UI; login blocked.\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </span>\n \u2014 account suspended automatically after <b>30 days</b> unpaid\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.suspend.enabled\"\n (click)=\"toggleReminderTemplate('suspend')\"></div>\n </div>\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>Deactivated</b>\n <span class=\"pr-info\" ngbTooltip=\"Data not collected or processed; hidden from UI; access disabled.\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </span>\n \u2014 account deactivated automatically after <b>60 days</b> unpaid\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.deactivated.enabled\"\n (click)=\"toggleReminderTemplate('deactivated')\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex justify-content-end mt-4\">\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"reminderSaving\" (click)=\"savePaymentReminder()\">\n {{ reminderSaving ? 'Saving\u2026' : 'Save' }}\n </button>\n </div>\n</div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.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}.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);border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important}.summary-card-sm{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:8px;padding:16px 20px}.summary-label-sm{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085)}.summary-value-sm{font-family:Inter;font-size:24px;font-weight:600;color:var(--Gray-900, #101828);margin-top:4px}.group-card{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:20px 24px}.group-icon{width:40px;height:40px;border-radius:8px;background:var(--Primary-50, #EAF8FF);display:flex;align-items:center;justify-content:center}.group-name{font-family:Inter;font-size:16px;font-weight:600;color:var(--Gray-900, #101828)}.group-detail-label{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085);margin-bottom:4px}.group-detail-value{font-family:Inter;font-size:14px;font-weight:500;color:var(--Gray-700, #344054)}.badge-light-secondary{background:var(--Gray-100, #F2F4F7);color:var(--Gray-500, #667085)}.btn-icon{width:36px;height:36px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid var(--Gray-200, #EAECF0)}.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}}.pr-panel{background:#fff;border:1px solid #E4E7EC;border-radius:14px;padding:22px 24px}.pr-head{display:flex;align-items:flex-start;gap:12px}.pr-title{font-size:16px;font-weight:800;color:#101828}.pr-sub,.pr-hint{color:#8a93a2;font-size:12.5px}.pr-hint{margin-top:4px}.pr-label,.pr-schedule-label{display:block;font-weight:700;color:#101828;font-size:13.5px;margin-bottom:7px}.pr-schedule-label{margin-bottom:0}.pr-chips{display:flex;flex-wrap:wrap;gap:8px;border:1px solid #D0D5DD;border-radius:10px;padding:9px 11px;min-height:46px;align-items:center}.pr-chip{background:#eef1f5;border-radius:8px;padding:6px 9px;display:flex;align-items:center;gap:8px;font-size:13px;color:#344054}.pr-chip-x{cursor:pointer;color:#98a2b3;font-weight:700}.pr-chip-x:hover{color:#d64545}.pr-chip-input{border:0;outline:0;flex:1;min-width:140px;padding:6px}.pr-count{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:2px 9px}.pr-tmpl{border:1px solid #e4e6ea;border-radius:11px;padding:13px 15px;background:#fff;transition:border-color .15s,background .15s}.pr-tmpl.on{border-color:#bcd9f7;background:#fbfdff}.pr-tmpl-head{display:flex;align-items:flex-start;gap:11px}.pr-tmpl-name{font-weight:700;color:#101828;font-size:14px}.pr-dot{width:9px;height:9px;border-radius:50%;margin-top:5px;flex:none}.pr-dot.amber{background:#e7920b}.pr-dot.red{background:#d64545}.pr-tag{font-size:11px;font-weight:700;padding:2px 9px;border-radius:999px;white-space:nowrap}.pr-tag.amber{background:#fdf0d8;color:#92600c}.pr-tag.red{background:#fde3e3;color:#b42318}.pr-tmpl-body{margin-top:11px;padding-top:11px;border-top:1px solid #eceef1}.pr-row{display:flex;align-items:center;gap:12px;padding:6px 0}.pr-row-text{flex:1;color:#475467;font-size:13px;line-height:1.5}.pr-row-text b{color:#344054}.pr-day-input{width:60px;border:1px solid #D0D5DD;border-radius:6px;padding:4px 8px;text-align:center}.pr-toggle{width:40px;height:22px;border-radius:999px;background:#d7dbe2;position:relative;cursor:pointer;transition:.15s;flex:0 0 40px}.pr-toggle:after{content:\"\";position:absolute;width:16px;height:16px;border-radius:50%;background:#fff;top:3px;left:3px;transition:.15s}.pr-toggle.on{background:#1493f5}.pr-toggle.on:after{left:21px}.pr-row-text .pr-info{display:inline-flex;align-items:center;vertical-align:middle;margin:0 8px;cursor:help}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}\n"] }]
|
|
415
|
+
args: [{ selector: 'lib-billing-groups', 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 Groups</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ summary?.totalGroups || 0 }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Manage GST entities for consolidated invoicing. Each group gets its own invoice.</div>\n </div>\n <div></div>\n </div>\n\n <!-- Summary Cards -->\n <div class=\"row g-3 mb-4\" *ngIf=\"summary?.totalGroups\">\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Groups</div>\n <div class=\"summary-value-sm\">{{ summary?.totalGroups }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Active</div>\n <div class=\"summary-value-sm text-primary\">{{ summary?.active }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Receivers</div>\n <div class=\"summary-value-sm\">{{ summary?.totalReceivers }}</div>\n </div>\n </div>\n </div>\n\n <!-- Search + Filter + Export + Add Row -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar w-100\">\n <div class=\"d-flex justify-content-end\">\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=\"Search...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"groupFilterObject\" (appliedFilters)=\"applyGroupFilters($event)\"></lib-filters>\n <button type=\"button\" (click)=\"bulkDownload()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader me-2\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\" *ngIf=\"!bulkDownloading\">Bulk Download</span>\n <span class=\"ms-2\" *ngIf=\"bulkDownloading\">Downloading...</span>\n </button>\n <button type=\"button\" (click)=\"bulkUploadInput.click()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader me-2\"\n [disabled]=\"bulkUploading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\" *ngIf=\"!bulkUploading\">Bulk Upload</span>\n <span class=\"ms-2\" *ngIf=\"bulkUploading\">Uploading...</span>\n </button>\n <input #bulkUploadInput type=\"file\" accept=\".xlsx,.xls\" hidden (change)=\"onBulkUploadFileSelected($event)\">\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!groupList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\">Export</span>\n </button>\n <button type=\"button\" class=\"btn btn-primary text-nowrap ms-3\" (click)=\"addBillingGroup()\">\n + Add Billing Group\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"groupLoading\">\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=\"groupNoData\">\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 <!-- Groups List -->\n <div *ngIf=\"!groupLoading && !groupNoData\">\n <div *ngFor=\"let group of groupList\" class=\"group-card mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"d-flex align-items-center gap-3\">\n <div class=\"group-icon\">\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=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"group-name\">{{ group?.groupName }}</span>\n <span class=\"badge badge-light-success\">Active</span>\n </div>\n <div class=\"text-muted small\">\n <span *ngIf=\"group?.gst\">GST: {{ group?.gst }}</span>\n <span *ngIf=\"group?.gst && group?.registeredCompanyName\" class=\"mx-2\">·</span>\n <span *ngIf=\"group?.registeredCompanyName\">{{ group?.registeredCompanyName }}</span>\n </div>\n </div>\n </div>\n <div class=\"d-flex gap-2\">\n <button class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"downloadBillingGroup(group)\"\n [disabled]=\"downloadingGroupId === group?._id\" title=\"Download\">\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.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"editBillingGroup(group)\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M11.3333 2.00004C11.5083 1.82494 11.7163 1.68605 11.9451 1.59129C12.1739 1.49653 12.4191 1.44775 12.6667 1.44775C12.9143 1.44775 13.1594 1.49653 13.3882 1.59129C13.617 1.68605 13.825 1.82494 14 2.00004C14.1751 2.17513 14.314 2.38318 14.4088 2.61197C14.5035 2.84076 14.5523 3.08586 14.5523 3.33337C14.5523 3.58089 14.5035 3.82599 14.4088 4.05478C14.314 4.28357 14.1751 4.49162 14 4.66671L5 13.6667L1.33333 14.6667L2.33333 11L11.3333 2.00004Z\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button *ngIf=\"!group?.isPrimary\" class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"deleteBillingGroup(group)\" title=\"Delete\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M2 4H3.33333H14M12.6667 4V13.3333C12.6667 13.687 12.5262 14.0261 12.2761 14.2761C12.0261 14.5262 11.687 14.6667 11.3333 14.6667H4.66667C4.31304 14.6667 3.97391 14.5262 3.72386 14.2761C3.47381 14.0261 3.33333 13.687 3.33333 13.3333V4M5.33333 4V2.66667C5.33333 2.31304 5.47381 1.97391 5.72386 1.72386C5.97391 1.47381 6.31304 1.33333 6.66667 1.33333H9.33333C9.68696 1.33333 10.0261 1.47381 10.2761 1.72386C10.5262 1.97391 10.6667 2.31304 10.6667 2.66667V4\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n <div class=\"row g-3 mt-2\">\n <div class=\"col\">\n <div class=\"group-detail-label\">Contact Email</div>\n <div class=\"group-detail-value\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M1.16667 4.08325L6.14617 7.40617C6.50533 7.64558 6.685 7.76525 6.87933 7.81042C7.05133 7.85042 7.23033 7.85042 7.40233 7.81042C7.59667 7.76525 7.77633 7.64558 8.1355 7.40617L13.115 4.08325M3.96667 11.6666H10.3147C11.1948 11.6666 11.6348 11.6666 11.9717 11.4951C12.2687 11.3439 12.5105 11.1021 12.6617 10.8051C12.8333 10.4682 12.8333 10.0282 12.8333 9.14808V5.13508C12.8333 4.25499 12.8333 3.81499 12.6617 3.47808C12.5105 3.18108 12.2687 2.93933 11.9717 2.78808C11.6348 2.61658 11.1948 2.61658 10.3147 2.61658H3.96667C3.08658 2.61658 2.64658 2.61658 2.30967 2.78808C2.01267 2.93933 1.77092 3.18108 1.61967 3.47808C1.44817 3.81499 1.44817 4.25499 1.44817 5.13508V9.14808C1.44817 10.0282 1.44817 10.4682 1.61967 10.8051C1.77092 11.1021 2.01267 11.3439 2.30967 11.4951C2.64658 11.6666 3.08658 11.6666 3.96667 11.6666Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span *ngIf=\"group?.generateInvoiceTo?.length\">{{ group?.generateInvoiceTo[0] }}</span>\n <span *ngIf=\"!group?.generateInvoiceTo?.length\" class=\"text-muted\">\u2014</span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Stores</div>\n <div class=\"group-detail-value\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M1.16667 7.00008L6.56483 1.60192C6.78683 1.37992 6.89783 1.26892 7.02583 1.22192C7.13883 1.18025 7.26283 1.18025 7.37583 1.22192C7.50383 1.26892 7.61483 1.37992 7.83683 1.60192L13.235 7.00008M2.91667 5.54175V11.0251C2.91667 11.4651 2.91667 11.6851 3.00242 11.8536C3.07808 12.0021 3.19825 12.1223 3.34675 12.1979C3.51533 12.2837 3.73533 12.2837 4.17533 12.2837H5.83333V9.33342C5.83333 8.87508 5.83333 8.64592 5.92208 8.46892C6.00033 8.31308 6.12617 8.18725 6.282 8.10908C6.459 8.02025 6.68817 8.02025 7.14667 8.02025H7.25417C7.71267 8.02025 7.94183 8.02025 8.11883 8.10908C8.27467 8.18725 8.40067 8.31308 8.47883 8.46892C8.5675 8.64592 8.5675 8.87508 8.5675 9.33342V12.2837H10.226C10.666 12.2837 10.886 12.2837 11.0545 12.1979C11.203 12.1223 11.3232 12.0021 11.3988 11.8536C11.4847 11.6851 11.4847 11.4651 11.4847 11.0251V5.54175\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.storeCount || 0 }}\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Annexure Attachment</div>\n <div class=\"group-detail-value\">\n <span class=\"badge\" [ngClass]=\"group?.attachAnnexure ? 'badge-light-success' : 'badge-light-secondary'\">\n {{ group?.attachAnnexure ? 'Attached' : 'Not attached' }}\n </span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Invoice Receivers</div>\n <div class=\"group-detail-value\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M9.33333 12.25V11.0833C9.33333 10.4645 9.08735 9.871 8.64976 9.43342C8.21218 8.99583 7.61868 8.75 7 8.75H2.91667C2.29799 8.75 1.70449 8.99583 1.2669 9.43342C0.829316 9.871 0.583333 10.4645 0.583333 11.0833V12.25M12.8333 12.25V11.0833C12.833 10.5735 12.6688 10.0778 12.3654 9.66858C12.0621 9.25933 11.636 8.95858 11.1458 8.81083M9.04167 1.81083C9.53308 1.95792 9.96058 2.25858 10.265 2.66825C10.5694 3.07792 10.734 3.57467 10.734 4.08542C10.734 4.59617 10.5694 5.09292 10.265 5.50258C9.96058 5.91225 9.53308 6.21292 9.04167 6.36M7.29167 4.08333C7.29167 5.37242 6.24742 6.41667 4.95833 6.41667C3.66925 6.41667 2.625 5.37242 2.625 4.08333C2.625 2.79425 3.66925 1.75 4.95833 1.75C6.24742 1.75 7.29167 2.79425 7.29167 4.08333Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.receiverCount || 0 }} recipients\n </div>\n </div>\n </div>\n </div>\n\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\n<!-- ===================== Payment Reminders ===================== -->\n<div class=\"pr-panel mt-4\">\n <div class=\"pr-head\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#1493f5\" stroke-width=\"2\"><path d=\"M18 8a6 6 0 0 0-12 0c0 7-3 9-3 9h18s-3-2-3-9M13.7 21a2 2 0 0 1-3.4 0\"/></svg>\n <div>\n <div class=\"pr-title\">Payment Reminders</div>\n <div class=\"pr-sub\">These recipients receive payment-reminder emails for all billing groups in this brand.</div>\n </div>\n </div>\n\n <!-- Recipients -->\n <div class=\"pr-field mt-3\">\n <label class=\"pr-label\">Reminder Recipients</label>\n <div class=\"pr-chips\">\n <span class=\"pr-chip\" *ngFor=\"let e of reminderEmails\">\n {{ e }}<span class=\"pr-chip-x\" (click)=\"removeReminderEmail(e)\">\u00D7</span>\n </span>\n <input class=\"pr-chip-input\" [(ngModel)]=\"reminderEmailInput\" placeholder=\"Add email + Enter\"\n (keydown.enter)=\"$event.preventDefault(); addReminderEmail()\"\n (blur)=\"addReminderEmail()\">\n </div>\n <div class=\"pr-hint\">Applied to every billing group for this brand.</div>\n </div>\n\n <!-- Schedule -->\n <div class=\"mt-4\">\n <div class=\"d-flex align-items-center gap-2\">\n <label class=\"pr-schedule-label\">Reminder Schedule</label>\n <span class=\"pr-count\">{{ reminderEnabledCount }} of 5 enabled</span>\n </div>\n <div class=\"pr-hint mb-3\">Predefined reminder flows. Enable the templates you want \u2014 timings are fixed except where noted.</div>\n\n <!-- Due Date Reminder -->\n <div class=\"pr-tmpl\" [class.on]=\"reminderTemplates.preDue.enabled || reminderTemplates.onDue.enabled\">\n <div class=\"pr-tmpl-head\">\n <span class=\"pr-dot amber\"></span>\n <div class=\"flex-grow-1\">\n <div class=\"pr-tmpl-name\">Due Date Reminder</div>\n <div class=\"pr-hint\">Remind the customer around the invoice due date. Enable each stage independently.</div>\n </div>\n <span class=\"pr-tag amber\">Around due</span>\n </div>\n <div class=\"pr-tmpl-body\">\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>Before due</b> \u2014 send\n <input type=\"number\" min=\"1\" max=\"365\" class=\"pr-day-input\"\n [ngModel]=\"reminderTemplates.preDue.daysBefore\"\n (ngModelChange)=\"onPreDueDaysChange($event)\"> day(s) before the due date\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.preDue.enabled\"\n (click)=\"toggleReminderTemplate('preDue')\"></div>\n </div>\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>On due date</b> \u2014 sent on the invoice due date</div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.onDue.enabled\"\n (click)=\"toggleReminderTemplate('onDue')\"></div>\n </div>\n </div>\n </div>\n\n <!-- Payment Overdue Reminder -->\n <div class=\"pr-tmpl mt-3\"\n [class.on]=\"reminderTemplates.onHold.enabled || reminderTemplates.suspend.enabled || reminderTemplates.deactivated.enabled\">\n <div class=\"pr-tmpl-head\">\n <span class=\"pr-dot red\"></span>\n <div class=\"flex-grow-1\">\n <div class=\"pr-tmpl-name\">Payment Overdue Reminder</div>\n <div class=\"pr-hint\">Sent after the invoice crosses the due date. Enable each stage independently.</div>\n </div>\n <span class=\"pr-tag red\">After due</span>\n </div>\n <div class=\"pr-tmpl-body\">\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>On Hold</b>\n <span class=\"pr-info\" ngbTooltip=\"Data collected and processed; hidden from UI; login still works.\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </span>\n \u2014 account on hold immediately after due date\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.onHold.enabled\"\n (click)=\"toggleReminderTemplate('onHold')\"></div>\n </div>\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>Suspended</b>\n <span class=\"pr-info\" ngbTooltip=\"Data collected, not processed; hidden from UI; login blocked.\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </span>\n \u2014 account suspended automatically after <b>30 days</b> unpaid\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.suspend.enabled\"\n (click)=\"toggleReminderTemplate('suspend')\"></div>\n </div>\n <div class=\"pr-row\">\n <div class=\"pr-row-text\"><b>Deactivated</b>\n <span class=\"pr-info\" ngbTooltip=\"Data not collected or processed; hidden from UI; access disabled.\" placement=\"top\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </span>\n \u2014 account deactivated automatically after <b>60 days</b> unpaid\n </div>\n <div class=\"pr-toggle\" [class.on]=\"reminderTemplates.deactivated.enabled\"\n (click)=\"toggleReminderTemplate('deactivated')\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex justify-content-end mt-4\">\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"reminderSaving\" (click)=\"savePaymentReminder()\">\n {{ reminderSaving ? 'Saving\u2026' : 'Save' }}\n </button>\n </div>\n</div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.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}.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);border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important}.summary-card-sm{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:8px;padding:16px 20px}.summary-label-sm{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085)}.summary-value-sm{font-family:Inter;font-size:24px;font-weight:600;color:var(--Gray-900, #101828);margin-top:4px}.group-card{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:20px 24px}.group-icon{width:40px;height:40px;border-radius:8px;background:var(--Primary-50, #EAF8FF);display:flex;align-items:center;justify-content:center}.group-name{font-family:Inter;font-size:16px;font-weight:600;color:var(--Gray-900, #101828)}.group-detail-label{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085);margin-bottom:4px}.group-detail-value{font-family:Inter;font-size:14px;font-weight:500;color:var(--Gray-700, #344054)}.badge-light-secondary{background:var(--Gray-100, #F2F4F7);color:var(--Gray-500, #667085)}.btn-icon{width:36px;height:36px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid var(--Gray-200, #EAECF0)}.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}}.pr-panel{background:#fff;border:1px solid #E4E7EC;border-radius:14px;padding:22px 24px}.pr-head{display:flex;align-items:flex-start;gap:12px}.pr-title{font-size:16px;font-weight:800;color:#101828}.pr-sub,.pr-hint{color:#8a93a2;font-size:12.5px}.pr-hint{margin-top:4px}.pr-label,.pr-schedule-label{display:block;font-weight:700;color:#101828;font-size:13.5px;margin-bottom:7px}.pr-schedule-label{margin-bottom:0}.pr-chips{display:flex;flex-wrap:wrap;gap:8px;border:1px solid #D0D5DD;border-radius:10px;padding:9px 11px;min-height:46px;align-items:center}.pr-chip{background:#eef1f5;border-radius:8px;padding:6px 9px;display:flex;align-items:center;gap:8px;font-size:13px;color:#344054}.pr-chip-x{cursor:pointer;color:#98a2b3;font-weight:700}.pr-chip-x:hover{color:#d64545}.pr-chip-input{border:0;outline:0;flex:1;min-width:140px;padding:6px}.pr-count{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:2px 9px}.pr-tmpl{border:1px solid #e4e6ea;border-radius:11px;padding:13px 15px;background:#fff;transition:border-color .15s,background .15s}.pr-tmpl.on{border-color:#bcd9f7;background:#fbfdff}.pr-tmpl-head{display:flex;align-items:flex-start;gap:11px}.pr-tmpl-name{font-weight:700;color:#101828;font-size:14px}.pr-dot{width:9px;height:9px;border-radius:50%;margin-top:5px;flex:none}.pr-dot.amber{background:#e7920b}.pr-dot.red{background:#d64545}.pr-tag{font-size:11px;font-weight:700;padding:2px 9px;border-radius:999px;white-space:nowrap}.pr-tag.amber{background:#fdf0d8;color:#92600c}.pr-tag.red{background:#fde3e3;color:#b42318}.pr-tmpl-body{margin-top:11px;padding-top:11px;border-top:1px solid #eceef1}.pr-row{display:flex;align-items:center;gap:12px;padding:6px 0}.pr-row-text{flex:1;color:#475467;font-size:13px;line-height:1.5}.pr-row-text b{color:#344054}.pr-day-input{width:60px;border:1px solid #D0D5DD;border-radius:6px;padding:4px 8px;text-align:center}.pr-toggle{width:40px;height:22px;border-radius:999px;background:#d7dbe2;position:relative;cursor:pointer;transition:.15s;flex:0 0 40px}.pr-toggle:after{content:\"\";position:absolute;width:16px;height:16px;border-radius:50%;background:#fff;top:3px;left:3px;transition:.15s}.pr-toggle.on{background:#1493f5}.pr-toggle.on:after{left:21px}.pr-row-text .pr-info{display:inline-flex;align-items:center;vertical-align:middle;margin:0 8px;cursor:help}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}\n"] }]
|
|
380
416
|
}], ctorParameters: () => [{ type: i1.BillingService }, { type: i0.ChangeDetectorRef }, { type: i2.ToastService }, { type: i3.NgbModal }], propDecorators: { clientId: [{
|
|
381
417
|
type: Input
|
|
382
418
|
}], bulkUploadInput: [{
|
|
383
419
|
type: ViewChild,
|
|
384
420
|
args: ['bulkUploadInput']
|
|
385
421
|
}] } });
|
|
386
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1ncm91cHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2JpbGxpbmctZ3JvdXBzL2JpbGxpbmctZ3JvdXBzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3Vwcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBYyxLQUFLLEVBQStDLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkxQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM5RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQzs7Ozs7OztBQU8zRixNQUFNLE9BQU8sc0JBQXNCO0lBNkN2QjtJQUNBO0lBQ0E7SUFDQTtJQS9DTyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUVqQyxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBRS9CLEdBQUcsQ0FBTTtJQUNULGNBQWMsR0FBWSxLQUFLLENBQUM7SUFDaEMsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUNqQyxhQUFhLEdBQVksS0FBSyxDQUFDO0lBQ0QsZUFBZSxDQUFnQztJQUU3RSxVQUFVO0lBQ1YsT0FBTyxHQUFRLEVBQUUsQ0FBQztJQUVsQixRQUFRO0lBQ1IsU0FBUyxHQUFRLEVBQUUsQ0FBQztJQUNwQixZQUFZLEdBQVksSUFBSSxDQUFDO0lBQzdC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QUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQy9CO3FCQUFNLElBQUksR0FBRyxFQUFFLE1BQU0sS0FBSyxHQUFHLEVBQUU7b0JBQzlCLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQztvQkFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsa0NBQWtDLE9BQU8sMkNBQTJDLENBQUMsQ0FBQztvQkFDL0csSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7aUJBQzFCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7aUJBQ2hEO2dCQUNELElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBM1hVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLHFPQ2RuQyxxNnVCQThUTTs7NEZEaFRPLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxvQkFBb0I7cUtBT3JCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTXdCLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuaW1wb3J0IHsgQmlsbGluZ0dyb3VwRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vYmlsbGluZy1ncm91cC1mb3JtL2JpbGxpbmctZ3JvdXAtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVsZXRlV2FybmluZ0NvbXBvbmVudCB9IGZyb20gJy4vZGVsZXRlLXdhcm5pbmcvZGVsZXRlLXdhcm5pbmcuY29tcG9uZW50JztcbmltcG9ydCB7IEJ1bGtVcGxvYWRFcnJvckNvbXBvbmVudCB9IGZyb20gJy4vYnVsay11cGxvYWQtZXJyb3IvYnVsay11cGxvYWQtZXJyb3IuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJpbGxpbmctZ3JvdXBzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JpbGxpbmctZ3JvdXBzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2JpbGxpbmctZ3JvdXBzLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBCaWxsaW5nR3JvdXBzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIEBJbnB1dCgpIGNsaWVudElkOiBzdHJpbmcgPSAnJztcblxuICBsZW46IGFueTtcbiAgc2VhcmNoRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYnVsa0Rvd25sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGJ1bGtVcGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQFZpZXdDaGlsZCgnYnVsa1VwbG9hZElucHV0JykgYnVsa1VwbG9hZElucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICAvLyBTdW1tYXJ5XG4gIHN1bW1hcnk6IGFueSA9IHt9O1xuXG4gIC8vIFRhYmxlXG4gIGdyb3VwTGlzdDogYW55ID0gW107XG4gIGdyb3VwTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG4gIGdyb3VwTm9EYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIHRvdGFsSXRlbXM6IG51bWJlciA9IDA7XG4gIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgY3VycmVudFBhZ2U6IG51bWJlciA9IDE7XG4gIGl0ZW1zUGVyUGFnZTogbnVtYmVyID0gMTA7XG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcbiAgc29ydENvbHVtTmFtZTogc3RyaW5nID0gJ2NyZWF0ZWRBdCc7XG4gIHNvcnRCeTogbnVtYmVyID0gLTE7XG5cbiAgLy8gRmlsdGVyXG4gIGdyb3VwRmlsdGVyT2JqZWN0ID0gW1xuICAgIHsgRGVzY3JpcHRpb246ICdBbm5leHVyZScsIHR5cGU6ICdzaW5nbGUnLCBJc3N1ZXM6IFt7IGlkOiAnYXR0YWNoZWQnLCB0ZXh0OiAnQXR0YWNoZWQnIH0sIHsgaWQ6ICdub3RBdHRhY2hlZCcsIHRleHQ6ICdOb3QgQXR0YWNoZWQnIH1dIH0sXG4gIF07XG4gIGFubmV4dXJlRmlsdGVyOiBzdHJpbmcgPSAnJztcblxuICAvLyA9PT09PSBQYXltZW50IFJlbWluZGVycyA9PT09PVxuICByZW1pbmRlckVtYWlsczogc3RyaW5nW10gPSBbXTtcbiAgcmVtaW5kZXJFbWFpbElucHV0OiBzdHJpbmcgPSAnJztcbiAgcmVtaW5kZXJUZW1wbGF0ZXM6IGFueSA9IHtcbiAgICBwcmVEdWU6IHsgZW5hYmxlZDogdHJ1ZSwgZGF5c0JlZm9yZTogMyB9LFxuICAgIG9uRHVlOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICBvbkhvbGQ6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgIHN1c3BlbmQ6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgIGRlYWN0aXZhdGVkOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gIH07XG4gIHJlbWluZGVyU2F2aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xpZW50SWQpIHtcbiAgICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgICAgIHRoaXMubG9hZFBheW1lbnRSZW1pbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY2xpZW50SWQnXSAmJiAhY2hhbmdlc1snY2xpZW50SWQnXS5maXJzdENoYW5nZSAmJiB0aGlzLmNsaWVudElkKSB7XG4gICAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gICAgICB0aGlzLmxvYWRQYXltZW50UmVtaW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLy8gPT09PT0gUGF5bWVudCBSZW1pbmRlcnMgPT09PT1cbiAgbG9hZFBheW1lbnRSZW1pbmRlcigpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldFBheW1lbnRSZW1pbmRlcih0aGlzLmNsaWVudElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBkID0gcmVzPy5kYXRhO1xuICAgICAgICBpZiAoZCkge1xuICAgICAgICAgIHRoaXMucmVtaW5kZXJFbWFpbHMgPSBBcnJheS5pc0FycmF5KGQucmVtaW5kZXJFbWFpbHMpID8gZC5yZW1pbmRlckVtYWlscyA6IFtdO1xuICAgICAgICAgIGlmIChkLnRlbXBsYXRlcykge1xuICAgICAgICAgICAgLy8gTWVyZ2Ugb3ZlciBkZWZhdWx0cyBzbyBhIHBhcnRpYWwgZG9jIG5ldmVyIGRyb3BzIGEgdGVtcGxhdGUuXG4gICAgICAgICAgICB0aGlzLnJlbWluZGVyVGVtcGxhdGVzID0ge1xuICAgICAgICAgICAgICBwcmVEdWU6IHsgZW5hYmxlZDogZC50ZW1wbGF0ZXMucHJlRHVlPy5lbmFibGVkID8/IHRydWUsIGRheXNCZWZvcmU6IGQudGVtcGxhdGVzLnByZUR1ZT8uZGF5c0JlZm9yZSA/PyAzIH0sXG4gICAgICAgICAgICAgIG9uRHVlOiB7IGVuYWJsZWQ6IGQudGVtcGxhdGVzLm9uRHVlPy5lbmFibGVkID8/IHRydWUgfSxcbiAgICAgICAgICAgICAgb25Ib2xkOiB7IGVuYWJsZWQ6IGQudGVtcGxhdGVzLm9uSG9sZD8uZW5hYmxlZCA/PyB0cnVlIH0sXG4gICAgICAgICAgICAgIHN1c3BlbmQ6IHsgZW5hYmxlZDogZC50ZW1wbGF0ZXMuc3VzcGVuZD8uZW5hYmxlZCA/PyB0cnVlIH0sXG4gICAgICAgICAgICAgIGRlYWN0aXZhdGVkOiB7IGVuYWJsZWQ6IGQudGVtcGxhdGVzLmRlYWN0aXZhdGVkPy5lbmFibGVkID8/IGZhbHNlIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7fSxcbiAgICB9KTtcbiAgfVxuXG4gIGdldCByZW1pbmRlckVuYWJsZWRDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHQgPSB0aGlzLnJlbWluZGVyVGVtcGxhdGVzO1xuICAgIHJldHVybiBbJ3ByZUR1ZScsICdvbkR1ZScsICdvbkhvbGQnLCAnc3VzcGVuZCcsICdkZWFjdGl2YXRlZCddXG4gICAgICAuZmlsdGVyKGsgPT4gdFtrXT8uZW5hYmxlZCkubGVuZ3RoO1xuICB9XG5cbiAgYWRkUmVtaW5kZXJFbWFpbCgpIHtcbiAgICBjb25zdCBlbWFpbCA9ICh0aGlzLnJlbWluZGVyRW1haWxJbnB1dCB8fCAnJykudHJpbSgpO1xuICAgIGlmICghZW1haWwpIHJldHVybjtcbiAgICBpZiAoIXRoaXMucmVtaW5kZXJFbWFpbHMuaW5jbHVkZXMoZW1haWwpKSB7XG4gICAgICB0aGlzLnJlbWluZGVyRW1haWxzLnB1c2goZW1haWwpO1xuICAgICAgLy8gQXV0b3NhdmUgc28gdGhlIHJlY2lwaWVudCBwZXJzaXN0cyBpbW1lZGlhdGVseSAobm8gc2VwYXJhdGUgU2F2ZSBjbGljaykuXG4gICAgICB0aGlzLnBlcnNpc3RQYXltZW50UmVtaW5kZXIodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMucmVtaW5kZXJFbWFpbElucHV0ID0gJyc7XG4gIH1cblxuICByZW1vdmVSZW1pbmRlckVtYWlsKGVtYWlsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlbWluZGVyRW1haWxzID0gdGhpcy5yZW1pbmRlckVtYWlscy5maWx0ZXIoZSA9PiBlICE9PSBlbWFpbCk7XG4gICAgdGhpcy5wZXJzaXN0UGF5bWVudFJlbWluZGVyKHRydWUpO1xuICB9XG5cbiAgdG9nZ2xlUmVtaW5kZXJUZW1wbGF0ZShrZXk6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnJlbWluZGVyVGVtcGxhdGVzW2tleV0pIHtcbiAgICAgIHRoaXMucmVtaW5kZXJUZW1wbGF0ZXNba2V5XS5lbmFibGVkID0gIXRoaXMucmVtaW5kZXJUZW1wbGF0ZXNba2V5XS5lbmFibGVkO1xuICAgICAgdGhpcy5kZWJvdW5jZWRQZXJzaXN0UmVtaW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICBvblByZUR1ZURheXNDaGFuZ2UodmFsdWU6IGFueSkge1xuICAgIGxldCBuID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSkgbiA9IDE7XG4gICAgdGhpcy5yZW1pbmRlclRlbXBsYXRlcy5wcmVEdWUuZGF5c0JlZm9yZSA9IE1hdGgubWluKDM2NSwgTWF0aC5tYXgoMSwgbikpO1xuICAgIHRoaXMuZGVib3VuY2VkUGVyc2lzdFJlbWluZGVyKCk7XG4gIH1cblxuICAvLyBDb2FsZXNjZSByYXBpZCBzY2hlZHVsZSBlZGl0cyAodG9nZ2xlcywgZGF5IGNoYW5nZXMpIGludG8gb25lIHNhdmUuXG4gIHByaXZhdGUgcmVtaW5kZXJTYXZlVGltZXI6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgZGVib3VuY2VkUGVyc2lzdFJlbWluZGVyKCkge1xuICAgIGlmICh0aGlzLnJlbWluZGVyU2F2ZVRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5yZW1pbmRlclNhdmVUaW1lcik7XG4gICAgdGhpcy5yZW1pbmRlclNhdmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wZXJzaXN0UGF5bWVudFJlbWluZGVyKHRydWUpLCA2MDApO1xuICB9XG5cbiAgLy8gU2hhcmVkIHNhdmUuIHNpbGVudD10cnVlIOKGkiBhdXRvc2F2ZSAobm8gdG9hc3QpOyBzaWxlbnQ9ZmFsc2Ug4oaSIGV4cGxpY2l0XG4gIC8vIFNhdmUgYnV0dG9uIChzaG93cyBjb25maXJtYXRpb24gdG9hc3QpLlxuICBwcml2YXRlIHBlcnNpc3RQYXltZW50UmVtaW5kZXIoc2lsZW50OiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLmNsaWVudElkKSByZXR1cm47XG4gICAgdGhpcy5yZW1pbmRlclNhdmluZyA9IHRydWU7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgcmVtaW5kZXJFbWFpbHM6IHRoaXMucmVtaW5kZXJFbWFpbHMsXG4gICAgICB0ZW1wbGF0ZXM6IHRoaXMucmVtaW5kZXJUZW1wbGF0ZXMsXG4gICAgfTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnNhdmVQYXltZW50UmVtaW5kZXIocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVtaW5kZXJTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdChgUGF5bWVudCByZW1pbmRlciBzY2hlZHVsZSBzYXZlZCDCtyAke3RoaXMucmVtaW5kZXJFbmFibGVkQ291bnR9IG9mIDUgZW5hYmxlZGApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnJlbWluZGVyU2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gc2F2ZSByZW1pbmRlcnMnKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBzYXZlUGF5bWVudFJlbWluZGVyKCkge1xuICAgIHRoaXMucGVyc2lzdFBheW1lbnRSZW1pbmRlcihmYWxzZSk7XG4gIH1cblxuICBsb2FkQmlsbGluZ0dyb3VwcygpIHtcbiAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5ncm91cExvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZ3JvdXBOb0RhdGEgPSBmYWxzZTtcblxuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmxlbixcbiAgICAgIHNvcnRDb2x1bU5hbWU6IHRoaXMuc29ydENvbHVtTmFtZSxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICBhbm5leHVyZUZpbHRlcjogdGhpcy5hbm5leHVyZUZpbHRlcixcbiAgICAgIGV4cG9ydDogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5icmFuZEJpbGxpbmdHcm91cHMoZmlsdGVycykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZSkgPT4ge1xuICAgICAgICBpZiAoZT8uZGF0YT8uY291bnQpIHtcbiAgICAgICAgICB0aGlzLmdyb3VwTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZ3JvdXBOb0RhdGEgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmdyb3VwTGlzdCA9IGUuZGF0YT8uZGF0YTtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSBlLmRhdGE/LmNvdW50O1xuICAgICAgICAgIHRoaXMuc3VtbWFyeSA9IGUuZGF0YT8uc3VtbWFyeSB8fCB7fTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdyb3VwTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZ3JvdXBOb0RhdGEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGlzLmxlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZ3JvdXBMaXN0ID0gW107XG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMDtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZ3JvdXBMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZ3JvdXBOb0RhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLmdyb3VwTGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFkZEJpbGxpbmdHcm91cCgpIHtcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oQmlsbGluZ0dyb3VwRm9ybUNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdsZycsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSB0aGlzLmNsaWVudElkO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmVkaXRNb2RlID0gZmFsc2U7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIGVkaXRCaWxsaW5nR3JvdXAoZ3JvdXA6IGFueSkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihCaWxsaW5nR3JvdXBGb3JtQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ2xnJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XG4gICAgLy8gVGhlIGZvcm0gYXV0by1leHBhbmRzIHRoZSBhY2NvcmRpb24gZm9yIHRoZSBncm91cCB3aG9zZSBfaWQgbWF0Y2hlc1xuICAgIC8vIGBncm91cElkYC4gSXQgaGFzIG5vIGBncm91cERhdGFgL2BlZGl0TW9kZWAgaW5wdXRzLCBzbyBwYXNzaW5nIHRob3NlIGxlZnRcbiAgICAvLyBncm91cElkIHVuZGVmaW5lZCBhbmQgdGhlIGZvcm0gYWx3YXlzIG9wZW5lZCB0aGUgZGVmYXVsdCAoaW5kZXggMCkgZ3JvdXAuXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZ3JvdXBJZCA9IGdyb3VwPy5faWQ7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIGRlbGV0ZUJpbGxpbmdHcm91cChncm91cDogYW55KSB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKERlbGV0ZVdhcm5pbmdDb21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmdyb3VwTmFtZSA9IGdyb3VwPy5ncm91cE5hbWUgfHwgJyc7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnWWVzJykge1xuICAgICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmRlbGV0ZUJpbGxpbmdHcm91cChncm91cC5faWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdCaWxsaW5nIGdyb3VwIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gZGVsZXRlIGJpbGxpbmcgZ3JvdXAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIGFwcGx5R3JvdXBGaWx0ZXJzKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZXZlbnQ/Lmxlbmd0aCkge1xuICAgICAgZXZlbnQuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LkRlc2NyaXB0aW9uID09PSAnQW5uZXh1cmUnKSB7XG4gICAgICAgICAgdGhpcy5hbm5leHVyZUZpbHRlciA9IGVsZW1lbnQuSXNzdWVzPy5pZCB8fCAnJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYW5uZXh1cmVGaWx0ZXIgPSAnJztcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICB9XG5cbiAgc2VhcmNoRmllbGQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICB9XG5cbiAgc29ydERhdGEoY29sdW1uOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNvcnRDb2x1bU5hbWUgPSBjb2x1bW47XG4gICAgdGhpcy5zb3J0QnkgKj0gLTE7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICB9XG5cbiAgb25QYWdlQ2hhbmdlKHBhZ2VPZmZzZXQ6IGFueSkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYXJzZUludChwYWdlT2Zmc2V0KTtcbiAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gIH1cblxuICBvblBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLnBhZ2VTaXplID0gcGFyc2VJbnQocGFnZVNpemUpO1xuICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgfVxuXG4gIG9uRXhwb3J0KCkge1xuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5sZW4sXG4gICAgICBzb3J0Q29sdW1OYW1lOiB0aGlzLnNvcnRDb2x1bU5hbWUsXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgICAgZXhwb3J0OiB0cnVlXG4gICAgfTtcblxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYnJhbmRCaWxsaW5nR3JvdXBzRXhwb3J0KGZpbHRlcnMpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnNhdmVBc0V4Y2VsRmlsZShyZXMsICdiaWxsaW5nLWdyb3VwcycpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnU29tZXRoaW5nIHdlbnQgV3JvbmcuLicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYnVsa0Rvd25sb2FkKCkge1xuICAgIGlmICh0aGlzLmJ1bGtEb3dubG9hZGluZykgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jbGllbnRJZCkge1xuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdTZWxlY3QgYSBicmFuZCBmaXJzdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmJ1bGtEb3dubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5idWxrRG93bmxvYWRCaWxsaW5nR3JvdXBzKHRoaXMuY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2Uuc2F2ZUFzVGVtcGxhdGUocmVzLCBgYmlsbGluZy1ncm91cHMtJHt0aGlzLmNsaWVudElkfS0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCl9YCk7XG4gICAgICAgIHRoaXMuYnVsa0Rvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuYnVsa0Rvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQnVsayBkb3dubG9hZCBmYWlsZWQnKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbkJ1bGtVcGxvYWRGaWxlU2VsZWN0ZWQoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGUgPSBldmVudD8udGFyZ2V0Py5maWxlcz8uWzBdO1xuICAgIGlmICghZmlsZSkgcmV0dXJuO1xuICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xuICAgIGlmICghdGhpcy5jbGllbnRJZCkge1xuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdTZWxlY3QgYSBicmFuZCBmaXJzdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmJ1bGtVcGxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYnVsa1VwZGF0ZUJpbGxpbmdHcm91cHMoZmlsZSwgdGhpcy5jbGllbnRJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5idWxrVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWQgPSByZXM/LmRhdGE/LnN1bW1hcnk/LnVwZGF0ZWQgPz8gMDtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoYFVwZGF0ZWQgJHt1cGRhdGVkfSBiaWxsaW5nIGdyb3VwKHMpYCk7XG4gICAgICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYnVsa1VwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBlcnJQYXlsb2FkID0gZXJyPy5lcnJvcj8uZGF0YSB8fCBlcnI/LmVycm9yO1xuICAgICAgICBpZiAoZXJyPy5zdGF0dXMgPT09IDQyMiAmJiBlcnJQYXlsb2FkPy5lcnJvcnMpIHtcbiAgICAgICAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oQnVsa1VwbG9hZEVycm9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ2xnJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5lcnJvcnMgPSBlcnJQYXlsb2FkLmVycm9ycztcbiAgICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50b3RhbCA9IGVyclBheWxvYWQuc3VtbWFyeT8udG90YWwgPz8gMDtcbiAgICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5mYWlsZWQgPSBlcnJQYXlsb2FkLnN1bW1hcnk/LmZhaWxlZCA/PyAwO1xuICAgICAgICB9IGVsc2UgaWYgKGVycj8uc3RhdHVzID09PSA0MTMpIHtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZpbGUgdG9vIGxhcmdlIChtYXggNU1CKScpO1xuICAgICAgICB9IGVsc2UgaWYgKGVycj8uc3RhdHVzID09PSA0MDApIHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVyclBheWxvYWQ/Lm1lc3NhZ2UgfHwgJ0ludmFsaWQgZmlsZSBmb3JtYXQg4oCUIHVzZSBYTFNYJztcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QobXNnKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnI/LnN0YXR1cyA9PT0gMjA3KSB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZCA9IGVyclBheWxvYWQ/LnN1bW1hcnk/LnVwZGF0ZWQgPz8gMDtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoYEJ1bGsgdXBsb2FkIHBhcnRpYWxseSBhcHBsaWVkOiAke3VwZGF0ZWR9IHVwZGF0ZWQsIHRoZW4gYWJvcnRlZC4gUGxlYXNlIHJlLXVwbG9hZC5gKTtcbiAgICAgICAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdCdWxrIHVwbG9hZCBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJpbnZvaWNlcy1zZWN0aW9uXCI+XG4gICAgPCEtLSBIZWFkZXIgUm93IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi42NjY2NyAxMEgxMy4zMzMzTTYuNjY2NjcgNi42NjY2N0gxMy4zMzMzTTYuNjY2NjcgMTMuMzMzM0gxME01IDE3LjVIMTVDMTUuOTIwNSAxNy41IDE2LjY2NjcgMTYuNzUzOCAxNi42NjY3IDE1LjgzMzNWNC4xNjY2N0MxNi42NjY3IDMuMjQ2MTkgMTUuOTIwNSAyLjUgMTUgMi41SDVDNC4wNzk1MyAyLjUgMy4zMzMzMyAzLjI0NjE5IDMuMzMzMzMgNC4xNjY2N1YxNS44MzMzQzMuMzMzMzMgMTYuNzUzOCA0LjA3OTUzIDE3LjUgNSAxNy41WlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmlsbGluZ2hlYWRlclwiPkJpbGxpbmcgR3JvdXBzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctbGlnaHQgdGV4dC1kYXJrIG1zLTFcIj57eyBzdW1tYXJ5Py50b3RhbEdyb3VwcyB8fCAwIH19IHRvdGFsPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtdC0xXCI+TWFuYWdlIEdTVCBlbnRpdGllcyBmb3IgY29uc29saWRhdGVkIGludm9pY2luZy4gRWFjaCBncm91cCBnZXRzIGl0cyBvd24gaW52b2ljZS48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFN1bW1hcnkgQ2FyZHMgLS0+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBnLTMgbWItNFwiICpuZ0lmPVwic3VtbWFyeT8udG90YWxHcm91cHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktY2FyZC1zbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsLXNtXCI+VG90YWwgR3JvdXBzPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWUtc21cIj57eyBzdW1tYXJ5Py50b3RhbEdyb3VwcyB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1jYXJkLXNtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWwtc21cIj5BY3RpdmU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZS1zbSB0ZXh0LXByaW1hcnlcIj57eyBzdW1tYXJ5Py5hY3RpdmUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktY2FyZC1zbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsLXNtXCI+VG90YWwgUmVjZWl2ZXJzPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWUtc21cIj57eyBzdW1tYXJ5Py50b3RhbFJlY2VpdmVycyB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTZWFyY2ggKyBGaWx0ZXIgKyBFeHBvcnQgKyBBZGQgUm93IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwYXltZW50aGlzdG9yeSBib3JkZXItMCBweC0wXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXIgdy0xMDBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBpbnZvaWNlc2VhcmNoIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgbXQtNiBtcy0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBvcGFjaXR5PVwiMC41XCIgeD1cIjE3LjAzNjVcIiB5PVwiMTUuMTIyM1wiIHdpZHRoPVwiOC4xNTU0NlwiIGhlaWdodD1cIjJcIiByeD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoNDUgMTcuMDM2NSAxNS4xMjIzKVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3JlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMSAxOUM2LjU1NTU2IDE5IDMgMTUuNDQ0NCAzIDExQzMgNi41NTU1NiA2LjU1NTU2IDMgMTEgM0MxNS40NDQ0IDMgMTkgNi41NTU1NiAxOSAxMUMxOSAxNS40NDQ0IDE1LjQ0NDQgMTkgMTEgMTlaTTExIDVDNy41MzMzMyA1IDUgNy41MzMzMyA1IDExQzUgMTQuNDY2NyA3LjUzMzMzIDE3IDExIDE3QzE0LjQ2NjcgMTcgMTcgMTQuNDY2NyAxNyAxMUMxNyA3LjUzMzMzIDE0LjQ2NjcgNSAxMSA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJsZW5cIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBzLTE0IGludm9pY2VzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoY2hhbmdlKT1cInNlYXJjaEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNlYXJjaERpc2FibGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1maWx0ZXJzIFtkYXRhT2JqZWN0XT1cImdyb3VwRmlsdGVyT2JqZWN0XCIgKGFwcGxpZWRGaWx0ZXJzKT1cImFwcGx5R3JvdXBGaWx0ZXJzKCRldmVudClcIj48L2xpYi1maWx0ZXJzPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYnVsa0Rvd25sb2FkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtZS0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidWxrRG93bmxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU01LjgzMzMzIDguMzMzMzNMMTAgMTIuNU0xMCAxMi41TDE0LjE2NjcgOC4zMzMzM00xMCAxMi41VjIuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCIgKm5nSWY9XCIhYnVsa0Rvd25sb2FkaW5nXCI+QnVsayBEb3dubG9hZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiICpuZ0lmPVwiYnVsa0Rvd25sb2FkaW5nXCI+RG93bmxvYWRpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYnVsa1VwbG9hZElucHV0LmNsaWNrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtZS0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidWxrVXBsb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIiAqbmdJZj1cIiFidWxrVXBsb2FkaW5nXCI+QnVsayBVcGxvYWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIiAqbmdJZj1cImJ1bGtVcGxvYWRpbmdcIj5VcGxvYWRpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI2J1bGtVcGxvYWRJbnB1dCB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIi54bHN4LC54bHNcIiBoaWRkZW4gKGNoYW5nZSk9XCJvbkJ1bGtVcGxvYWRGaWxlU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FeHBvcnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZ3JvdXBMaXN0Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RXhwb3J0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGV4dC1ub3dyYXAgbXMtM1wiIChjbGljayk9XCJhZGRCaWxsaW5nR3JvdXAoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgKyBBZGQgQmlsbGluZyBHcm91cFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTG9hZGluZyBTaGltbWVyIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cExvYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIE5vIERhdGEgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyb3VwTm9EYXRhXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjIHctMjVcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEdyb3VwcyBMaXN0IC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhZ3JvdXBMb2FkaW5nICYmICFncm91cE5vRGF0YVwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cExpc3RcIiBjbGFzcz1cImdyb3VwLWNhcmQgbWItM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjY2NjY3IDEwSDEzLjMzMzNNNi42NjY2NyA2LjY2NjY3SDEzLjMzMzNNNi42NjY2NyAxMy4zMzMzSDEwTTUgMTcuNUgxNUMxNS45MjA1IDE3LjUgMTYuNjY2NyAxNi43NTM4IDE2LjY2NjcgMTUuODMzM1Y0LjE2NjY3QzE2LjY2NjcgMy4yNDYxOSAxNS45MjA1IDIuNSAxNSAyLjVINUM0LjA3OTUzIDIuNSAzLjMzMzMzIDMuMjQ2MTkgMy4zMzMzMyA0LjE2NjY3VjE1LjgzMzNDMy4zMzMzMyAxNi43NTM4IDQuMDc5NTMgMTcuNSA1IDE3LjVaXCIgc3Ryb2tlPVwiIzAwOUJGM1wiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtbmFtZVwiPnt7IGdyb3VwPy5ncm91cE5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1zdWNjZXNzXCI+QWN0aXZlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXA/LmdzdFwiPkdTVDoge3sgZ3JvdXA/LmdzdCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdyb3VwPy5nc3QgJiYgZ3JvdXA/LnJlZ2lzdGVyZWRDb21wYW55TmFtZVwiIGNsYXNzPVwibXgtMlwiPiZtaWRkb3Q7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXA/LnJlZ2lzdGVyZWRDb21wYW55TmFtZVwiPnt7IGdyb3VwPy5yZWdpc3RlcmVkQ29tcGFueU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLWljb25cIiAoY2xpY2spPVwiZWRpdEJpbGxpbmdHcm91cChncm91cClcIiB0aXRsZT1cIkVkaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEuMzMzMyAyLjAwMDA0QzExLjUwODMgMS44MjQ5NCAxMS43MTYzIDEuNjg2MDUgMTEuOTQ1MSAxLjU5MTI5QzEyLjE3MzkgMS40OTY1MyAxMi40MTkxIDEuNDQ3NzUgMTIuNjY2NyAxLjQ0Nzc1QzEyLjkxNDMgMS40NDc3NSAxMy4xNTk0IDEuNDk2NTMgMTMuMzg4MiAxLjU5MTI5QzEzLjYxNyAxLjY4NjA1IDEzLjgyNSAxLjgyNDk0IDE0IDIuMDAwMDRDMTQuMTc1MSAyLjE3NTEzIDE0LjMxNCAyLjM4MzE4IDE0LjQwODggMi42MTE5N0MxNC41MDM1IDIuODQwNzYgMTQuNTUyMyAzLjA4NTg2IDE0LjU1MjMgMy4zMzMzN0MxNC41NTIzIDMuNTgwODkgMTQuNTAzNSAzLjgyNTk5IDE0LjQwODggNC4wNTQ3OEMxNC4zMTQgNC4yODM1NyAxNC4xNzUxIDQuNDkxNjIgMTQgNC42NjY3MUw1IDEzLjY2NjdMMS4zMzMzMyAxNC42NjY3TDIuMzMzMzMgMTFMMTEuMzMzMyAyLjAwMDA0WlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWdyb3VwPy5pc1ByaW1hcnlcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1pY29uXCIgKGNsaWNrKT1cImRlbGV0ZUJpbGxpbmdHcm91cChncm91cClcIiB0aXRsZT1cIkRlbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yIDRIMy4zMzMzM0gxNE0xMi42NjY3IDRWMTMuMzMzM0MxMi42NjY3IDEzLjY4NyAxMi41MjYyIDE0LjAyNjEgMTIuMjc2MSAxNC4yNzYxQzEyLjAyNjEgMTQuNTI2MiAxMS42ODcgMTQuNjY2NyAxMS4zMzMzIDE0LjY2NjdINC42NjY2N0M0LjMxMzA0IDE0LjY2NjcgMy45NzM5MSAxNC41MjYyIDMuNzIzODYgMTQuMjc2MUMzLjQ3MzgxIDE0LjAyNjEgMy4zMzMzMyAxMy42ODcgMy4zMzMzMyAxMy4zMzMzVjRNNS4zMzMzMyA0VjIuNjY2NjdDNS4zMzMzMyAyLjMxMzA0IDUuNDczODEgMS45NzM5MSA1LjcyMzg2IDEuNzIzODZDNS45NzM5MSAxLjQ3MzgxIDYuMzEzMDQgMS4zMzMzMyA2LjY2NjY3IDEuMzMzMzNIOS4zMzMzM0M5LjY4Njk2IDEuMzMzMzMgMTAuMDI2MSAxLjQ3MzgxIDEwLjI3NjEgMS43MjM4NkMxMC41MjYyIDEuOTczOTEgMTAuNjY2NyAyLjMxMzA0IDEwLjY2NjcgMi42NjY2N1Y0XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1kZXRhaWwtbGFiZWxcIj5Db250YWN0IEVtYWlsPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1kZXRhaWwtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwibWUtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS4xNjY2NyA0LjA4MzI1TDYuMTQ2MTcgNy40MDYxN0M2LjUwNTMzIDcuNjQ1NTggNi42ODUgNy43NjUyNSA2Ljg3OTMzIDcuODEwNDJDNy4wNTEzMyA3Ljg1MDQyIDcuMjMwMzMgNy44NTA0MiA3LjQwMjMzIDcuODEwNDJDNy41OTY2NyA3Ljc2NTI1IDcuNzc2MzMgNy42NDU1OCA4LjEzNTUgNy40MDYxN0wxMy4xMTUgNC4wODMyNU0zLjk2NjY3IDExLjY2NjZIMTAuMzE0N0MxMS4xOTQ4IDExLjY2NjYgMTEuNjM0OCAxMS42NjY2IDExLjk3MTcgMTEuNDk1MUMxMi4yNjg3IDExLjM0MzkgMTIuNTEwNSAxMS4xMDIxIDEyLjY2MTcgMTAuODA1MUMxMi44MzMzIDEwLjQ2ODIgMTIuODMzMyAxMC4wMjgyIDEyLjgzMzMgOS4xNDgwOFY1LjEzNTA4QzEyLjgzMzMgNC4yNTQ5OSAxMi44MzMzIDMuODE0OTkgMTIuNjYxNyAzLjQ3ODA4QzEyLjUxMDUgMy4xODEwOCAxMi4yNjg3IDIuOTM5MzMgMTEuOTcxNyAyLjc4ODA4QzExLjYzNDggMi42MTY1OCAxMS4xOTQ4IDIuNjE2NTggMTAuMzE0NyAyLjYxNjU4SDMuOTY2NjdDMy4wODY1OCAyLjYxNjU4IDIuNjQ2NTggMi42MTY1OCAyLjMwOTY3IDIuNzg4MDhDMi4wMTI2NyAyLjkzOTMzIDEuNzcwOTIgMy4xODEwOCAxLjYxOTY3IDMuNDc4MDhDMS40NDgxNyAzLjgxNDk5IDEuNDQ4MTcgNC4yNTQ5OSAxLjQ0ODE3IDUuMTM1MDhWOS4xNDgwOEMxLjQ0ODE3IDEwLjAyODIgMS40NDgxNyAxMC40NjgyIDEuNjE5NjcgMTAuODA1MUMxLjc3MDkyIDExLjEwMjEgMi4wMTI2NyAxMS4zNDM5IDIuMzA5NjcgMTEuNDk1MUMyLjY0NjU4IDExLjY2NjYgMy4wODY1OCAxMS42NjY2IDMuOTY2NjcgMTEuNjY2NlpcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdyb3VwPy5nZW5lcmF0ZUludm9pY2VUbz8ubGVuZ3RoXCI+e3sgZ3JvdXA/LmdlbmVyYXRlSW52b2ljZVRvWzBdIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZ3JvdXA/LmdlbmVyYXRlSW52b2ljZVRvPy5sZW5ndGhcIiBjbGFzcz1cInRleHQtbXV0ZWRcIj7igJQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC1sYWJlbFwiPlN0b3JlczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtZGV0YWlsLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuMTY2NjcgNy4wMDAwOEw2LjU2NDgzIDEuNjAxOTJDNi43ODY4MyAxLjM3OTkyIDYuODk3ODMgMS4yNjg5MiA3LjAyNTgzIDEuMjIxOTJDNy4xMzg4MyAxLjE4MDI1IDcuMjYyODMgMS4xODAyNSA3LjM3NTgzIDEuMjIxOTJDNy41MDM4MyAxLjI2ODkyIDcuNjE0ODMgMS4zNzk5MiA3LjgzNjgzIDEuNjAxOTJMMTMuMjM1IDcuMDAwMDhNMi45MTY2NyA1LjU0MTc1VjExLjAyNTFDMi45MTY2NyAxMS40NjUxIDIuOTE2NjcgMTEuNjg1MSAzLjAwMjQyIDExLjg1MzZDMy4wNzgwOCAxMi4wMDIxIDMuMTk4MjUgMTIuMTIyMyAzLjM0Njc1IDEyLjE5NzlDMy41MTUzMyAxMi4yODM3IDMuNzM1MzMgMTIuMjgzNyA0LjE3NTMzIDEyLjI4MzdINS44MzMzM1Y5LjMzMzQyQzUuODMzMzMgOC44NzUwOCA1LjgzMzMzIDguNjQ1OTIgNS45MjIwOCA4LjQ2ODkyQzYuMDAwMzMgOC4zMTMwOCA2LjEyNjE3IDguMTg3MjUgNi4yODIgOC4xMDkwOEM2LjQ1OSA4LjAyMDI1IDYuNjg4MTcgOC4wMjAyNSA3LjE0NjY3IDguMDIwMjVINy4yNTQxN0M3LjcxMjY3IDguMDIwMjUgNy45NDE4MyA4LjAyMDI1IDguMTE4ODMgOC4xMDkwOEM4LjI3NDY3IDguMTg3MjUgOC40MDA2NyA4LjMxMzA4IDguNDc4ODMgOC40Njg5MkM4LjU2NzUgOC42NDU5MiA4LjU2NzUgOC44NzUwOCA4LjU2NzUgOS4zMzM0MlYxMi4yODM3SDEwLjIyNkMxMC42NjYgMTIuMjgzNyAxMC44ODYgMTIuMjgzNyAxMS4wNTQ1IDEyLjE5NzlDMTEuMjAzIDEyLjEyMjMgMTEuMzIzMiAxMi4wMDIxIDExLjM5ODggMTEuODUzNkMxMS40ODQ3IDExLjY4NTEgMTEuNDg0NyAxMS40NjUxIDExLjQ4NDcgMTEuMDI1MVY1LjU0MTc1XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXA/LnN0b3JlQ291bnQgfHwgMCB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1kZXRhaWwtbGFiZWxcIj5Bbm5leHVyZSBBdHRhY2htZW50PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1kZXRhaWwtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2VcIiBbbmdDbGFzc109XCJncm91cD8uYXR0YWNoQW5uZXh1cmUgPyAnYmFkZ2UtbGlnaHQtc3VjY2VzcycgOiAnYmFkZ2UtbGlnaHQtc2Vjb25kYXJ5J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdyb3VwPy5hdHRhY2hBbm5leHVyZSA/ICdBdHRhY2hlZCcgOiAnTm90IGF0dGFjaGVkJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1kZXRhaWwtbGFiZWxcIj5JbnZvaWNlIFJlY2VpdmVyczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtZGV0YWlsLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuMzMzMzMgMTIuMjVWMTEuMDgzM0M5LjMzMzMzIDEwLjQ2NDUgOS4wODczNSA5Ljg3MSA4LjY0OTc2IDkuNDMzNDJDOC4yMTIxOCA4Ljk5NTgzIDcuNjE4NjggOC43NSA3IDguNzVIMi45MTY2N0MyLjI5Nzk5IDguNzUgMS43MDQ0OSA4Ljk5NTgzIDEuMjY2OSA5LjQzMzQyQzAuODI5MzE2IDkuODcxIDAuNTgzMzMzIDEwLjQ2NDUgMC41ODMzMzMgMTEuMDgzM1YxMi4yNU0xMi44MzMzIDEyLjI1VjExLjA4MzNDMTIuODMzIDEwLjU3MzUgMTIuNjY4OCAxMC4wNzc4IDEyLjM2NTQgOS42Njg1OEMxMi4wNjIxIDkuMjU5MzMgMTEuNjM2IDguOTU4NTggMTEuMTQ1OCA4LjgxMDgzTTkuMDQxNjcgMS44MTA4M0M5LjUzMzA4IDEuOTU3OTIgOS45NjA1OCAyLjI1ODU4IDEwLjI2NSAyLjY2ODI1QzEwLjU2OTQgMy4wNzc5MiAxMC43MzQgMy41NzQ2NyAxMC43MzQgNC4wODU0MkMxMC43MzQgNC41OTYxNyAxMC41Njk0IDUuMDkyOTIgMTAuMjY1IDUuNTAyNThDOS45NjA1OCA1LjkxMjI1IDkuNTMzMDggNi4yMTI5MiA5LjA0MTY3IDYuMzZNNy4yOTE2NyA0LjA4MzMzQzcuMjkxNjcgNS4zNzI0MiA2LjI0NzQyIDYuNDE2NjcgNC45NTgzMyA2LjQxNjY3QzMuNjY5MjUgNi40MTY2NyAyLjYyNSA1LjM3MjQyIDIuNjI1IDQuMDgzMzNDMi42MjUgMi43OTQyNSAzLjY2OTI1IDEuNzUgNC45NTgzMyAxLjc1QzYuMjQ3NDIgMS43NSA3LjI5MTY3IDIuNzk0MjUgNy4yOTE2NyA0LjA4MzMzWlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdyb3VwPy5yZWNlaXZlckNvdW50IHx8IDAgfX0gcmVjaXBpZW50c1xuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bGliLXBhZ2luYXRpb24gY2xhc3M9XCJ0ZXh0LXN0YXJ0XCIgW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2VcIlxuICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwidG90YWxJdGVtc1wiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCIgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gUGF5bWVudCBSZW1pbmRlcnMgPT09PT09PT09PT09PT09PT09PT09IC0tPlxuPGRpdiBjbGFzcz1cInByLXBhbmVsIG10LTRcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHItaGVhZFwiPlxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiIzE0OTNmNVwiIHN0cm9rZS13aWR0aD1cIjJcIj48cGF0aCBkPVwiTTE4IDhhNiA2IDAgMCAwLTEyIDBjMCA3LTMgOS0zIDloMThzLTMtMi0zLTlNMTMuNyAyMWEyIDIgMCAwIDEtMy40IDBcIi8+PC9zdmc+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItdGl0bGVcIj5QYXltZW50IFJlbWluZGVyczwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXN1YlwiPlRoZXNlIHJlY2lwaWVudHMgcmVjZWl2ZSBwYXltZW50LXJlbWluZGVyIGVtYWlscyBmb3IgYWxsIGJpbGxpbmcgZ3JvdXBzIGluIHRoaXMgYnJhbmQuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBSZWNpcGllbnRzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJwci1maWVsZCBtdC0zXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInByLWxhYmVsXCI+UmVtaW5kZXIgUmVjaXBpZW50czwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwci1jaGlwc1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwci1jaGlwXCIgKm5nRm9yPVwibGV0IGUgb2YgcmVtaW5kZXJFbWFpbHNcIj5cbiAgICAgICAgICAgICAgICB7eyBlIH19PHNwYW4gY2xhc3M9XCJwci1jaGlwLXhcIiAoY2xpY2spPVwicmVtb3ZlUmVtaW5kZXJFbWFpbChlKVwiPsOXPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwicHItY2hpcC1pbnB1dFwiIFsobmdNb2RlbCldPVwicmVtaW5kZXJFbWFpbElucHV0XCIgcGxhY2Vob2xkZXI9XCJBZGQgZW1haWwgKyBFbnRlclwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGFkZFJlbWluZGVyRW1haWwoKVwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwiYWRkUmVtaW5kZXJFbWFpbCgpXCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHItaGludFwiPkFwcGxpZWQgdG8gZXZlcnkgYmlsbGluZyBncm91cCBmb3IgdGhpcyBicmFuZC48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2NoZWR1bGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInByLXNjaGVkdWxlLWxhYmVsXCI+UmVtaW5kZXIgU2NoZWR1bGU8L2xhYmVsPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwci1jb3VudFwiPnt7IHJlbWluZGVyRW5hYmxlZENvdW50IH19IG9mIDUgZW5hYmxlZDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwci1oaW50IG1iLTNcIj5QcmVkZWZpbmVkIHJlbWluZGVyIGZsb3dzLiBFbmFibGUgdGhlIHRlbXBsYXRlcyB5b3Ugd2FudCDigJQgdGltaW5ncyBhcmUgZml4ZWQgZXhjZXB0IHdoZXJlIG5vdGVkLjwvZGl2PlxuXG4gICAgICAgIDwhLS0gRHVlIERhdGUgUmVtaW5kZXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwci10bXBsXCIgW2NsYXNzLm9uXT1cInJlbWluZGVyVGVtcGxhdGVzLnByZUR1ZS5lbmFibGVkIHx8IHJlbWluZGVyVGVtcGxhdGVzLm9uRHVlLmVuYWJsZWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci10bXBsLWhlYWRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByLWRvdCBhbWJlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXRtcGwtbmFtZVwiPkR1ZSBEYXRlIFJlbWluZGVyPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci1oaW50XCI+UmVtaW5kIHRoZSBjdXN0b21lciBhcm91bmQgdGhlIGludm9pY2UgZHVlIGRhdGUuIEVuYWJsZSBlYWNoIHN0YWdlIGluZGVwZW5kZW50bHkuPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwci10YWcgYW1iZXJcIj5Bcm91bmQgZHVlPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItdG1wbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItcm93LXRleHRcIj48Yj5CZWZvcmUgZHVlPC9iPiDigJQgc2VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIxXCIgbWF4PVwiMzY1XCIgY2xhc3M9XCJwci1kYXktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJlbWluZGVyVGVtcGxhdGVzLnByZUR1ZS5kYXlzQmVmb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblByZUR1ZURheXNDaGFuZ2UoJGV2ZW50KVwiPiBkYXkocykgYmVmb3JlIHRoZSBkdWUgZGF0ZVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXRvZ2dsZVwiIFtjbGFzcy5vbl09XCJyZW1pbmRlclRlbXBsYXRlcy5wcmVEdWUuZW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUmVtaW5kZXJUZW1wbGF0ZSgncHJlRHVlJylcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci1yb3ctdGV4dFwiPjxiPk9uIGR1ZSBkYXRlPC9iPiDigJQgc2VudCBvbiB0aGUgaW52b2ljZSBkdWUgZGF0ZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItdG9nZ2xlXCIgW2NsYXNzLm9uXT1cInJlbWluZGVyVGVtcGxhdGVzLm9uRHVlLmVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVJlbWluZGVyVGVtcGxhdGUoJ29uRHVlJylcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBheW1lbnQgT3ZlcmR1ZSBSZW1pbmRlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByLXRtcGwgbXQtM1wiXG4gICAgICAgICAgICBbY2xhc3Mub25dPVwicmVtaW5kZXJUZW1wbGF0ZXMub25Ib2xkLmVuYWJsZWQgfHwgcmVtaW5kZXJUZW1wbGF0ZXMuc3VzcGVuZC5lbmFibGVkIHx8IHJlbWluZGVyVGVtcGxhdGVzLmRlYWN0aXZhdGVkLmVuYWJsZWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci10bXBsLWhlYWRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByLWRvdCByZWRcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci10bXBsLW5hbWVcIj5QYXltZW50IE92ZXJkdWUgUmVtaW5kZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLWhpbnRcIj5TZW50IGFmdGVyIHRoZSBpbnZvaWNlIGNyb3NzZXMgdGhlIGR1ZSBkYXRlLiBFbmFibGUgZWFjaCBzdGFnZSBpbmRlcGVuZGVudGx5LjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItdGFnIHJlZFwiPkFmdGVyIGR1ZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXRtcGwtYm9keVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXJvdy10ZXh0XCI+PGI+T24gSG9sZDwvYj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItaW5mb1wiIG5nYlRvb2x0aXA9XCJEYXRhIGNvbGxlY3RlZCBhbmQgcHJvY2Vzc2VkOyBoaWRkZW4gZnJvbSBVSTsgbG9naW4gc3RpbGwgd29ya3MuXCIgcGxhY2VtZW50PVwidG9wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjlcIi8+PHBhdGggZD1cIk0xMiAxMXY1TTEyIDhoLjAxXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAg4oCUIGFjY291bnQgb24gaG9sZCBpbW1lZGlhdGVseSBhZnRlciBkdWUgZGF0ZVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXRvZ2dsZVwiIFtjbGFzcy5vbl09XCJyZW1pbmRlclRlbXBsYXRlcy5vbkhvbGQuZW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUmVtaW5kZXJUZW1wbGF0ZSgnb25Ib2xkJylcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci1yb3ctdGV4dFwiPjxiPlN1c3BlbmRlZDwvYj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItaW5mb1wiIG5nYlRvb2x0aXA9XCJEYXRhIGNvbGxlY3RlZCwgbm90IHByb2Nlc3NlZDsgaGlkZGVuIGZyb20gVUk7IGxvZ2luIGJsb2NrZWQuXCIgcGxhY2VtZW50PVwidG9wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjlcIi8+PHBhdGggZD1cIk0xMiAxMXY1TTEyIDhoLjAxXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAg4oCUIGFjY291bnQgc3VzcGVuZGVkIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgPGI+MzAgZGF5czwvYj4gdW5wYWlkXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItdG9nZ2xlXCIgW2NsYXNzLm9uXT1cInJlbWluZGVyVGVtcGxhdGVzLnN1c3BlbmQuZW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUmVtaW5kZXJUZW1wbGF0ZSgnc3VzcGVuZCcpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItcm93LXRleHRcIj48Yj5EZWFjdGl2YXRlZDwvYj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItaW5mb1wiIG5nYlRvb2x0aXA9XCJEYXRhIG5vdCBjb2xsZWN0ZWQgb3IgcHJvY2Vzc2VkOyBoaWRkZW4gZnJvbSBVSTsgYWNjZXNzIGRpc2FibGVkLlwiIHBsYWNlbWVudD1cInRvcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCI5XCIvPjxwYXRoIGQ9XCJNMTIgMTF2NU0xMiA4aC4wMVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIOKAlCBhY2NvdW50IGRlYWN0aXZhdGVkIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgPGI+NjAgZGF5czwvYj4gdW5wYWlkXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItdG9nZ2xlXCIgW2NsYXNzLm9uXT1cInJlbWluZGVyVGVtcGxhdGVzLmRlYWN0aXZhdGVkLmVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVJlbWluZGVyVGVtcGxhdGUoJ2RlYWN0aXZhdGVkJylcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtdC00XCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgW2Rpc2FibGVkXT1cInJlbWluZGVyU2F2aW5nXCIgKGNsaWNrKT1cInNhdmVQYXltZW50UmVtaW5kZXIoKVwiPlxuICAgICAgICAgICAge3sgcmVtaW5kZXJTYXZpbmcgPyAnU2F2aW5n4oCmJyA6ICdTYXZlJyB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
422
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1ncm91cHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2JpbGxpbmctZ3JvdXBzL2JpbGxpbmctZ3JvdXBzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3Vwcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBYyxLQUFLLEVBQStDLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkxQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM5RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQzs7Ozs7OztBQU8zRixNQUFNLE9BQU8sc0JBQXNCO0lBZ0R2QjtJQUNBO0lBQ0E7SUFDQTtJQWxETyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUVqQyxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBRS9CLEdBQUcsQ0FBTTtJQUNULGNBQWMsR0FBWSxLQUFLLENBQUM7SUFDaEMsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUNqQyxhQUFhLEdBQVksS0FBSyxDQUFDO0lBQy9CLDhFQUE4RTtJQUM5RSxzQ0FBc0M7SUFDdEMsa0JBQWtCLEdBQVcsRUFBRSxDQUFDO0lBQ0YsZUFBZSxDQUFnQztJQUU3RSxVQUFVO0lBQ1YsT0FBTyxHQUFRLEVBQUUsQ0FBQztJQUVsQixRQUFRO0lB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TCxDQUFDO3dHQS9aVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixxT0NkbkMsK3V3QkFxVU07OzRGRHZUTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CO3FLQU9yQixRQUFRO3NCQUFoQixLQUFLO2dCQVN3QixlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBCaWxsaW5nU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2JpbGxpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IEJpbGxpbmdHcm91cEZvcm1Db21wb25lbnQgfSBmcm9tICcuL2JpbGxpbmctZ3JvdXAtZm9ybS9iaWxsaW5nLWdyb3VwLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IERlbGV0ZVdhcm5pbmdDb21wb25lbnQgfSBmcm9tICcuL2RlbGV0ZS13YXJuaW5nL2RlbGV0ZS13YXJuaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCdWxrVXBsb2FkRXJyb3JDb21wb25lbnQgfSBmcm9tICcuL2J1bGstdXBsb2FkLWVycm9yL2J1bGstdXBsb2FkLWVycm9yLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1iaWxsaW5nLWdyb3VwcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9iaWxsaW5nLWdyb3Vwcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9iaWxsaW5nLWdyb3Vwcy5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQmlsbGluZ0dyb3Vwc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nID0gJyc7XG5cbiAgbGVuOiBhbnk7XG4gIHNlYXJjaERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGJ1bGtEb3dubG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBidWxrVXBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIF9pZCBvZiB0aGUgZ3JvdXAgd2hvc2UgcGVyLWdyb3VwIGRvd25sb2FkIGlzIGluIGZsaWdodCAoJycgPSBub25lKSwgc28gb25seVxuICAvLyB0aGF0IHJvdydzIGljb24gc2hvd3MgYSBidXN5IHN0YXRlLlxuICBkb3dubG9hZGluZ0dyb3VwSWQ6IHN0cmluZyA9ICcnO1xuICBAVmlld0NoaWxkKCdidWxrVXBsb2FkSW5wdXQnKSBidWxrVXBsb2FkSW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIC8vIFN1bW1hcnlcbiAgc3VtbWFyeTogYW55ID0ge307XG5cbiAgLy8gVGFibGVcbiAgZ3JvdXBMaXN0OiBhbnkgPSBbXTtcbiAgZ3JvdXBMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgZ3JvdXBOb0RhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdG90YWxJdGVtczogbnVtYmVyID0gMDtcbiAgcGFnZVNpemU6IG51bWJlciA9IDEwO1xuICBjdXJyZW50UGFnZTogbnVtYmVyID0gMTtcbiAgaXRlbXNQZXJQYWdlOiBudW1iZXIgPSAxMDtcbiAgcGFnaW5hdGlvblNpemVzID0gWzEwLCAyMCwgMzBdO1xuICBzb3J0Q29sdW1OYW1lOiBzdHJpbmcgPSAnY3JlYXRlZEF0JztcbiAgc29ydEJ5OiBudW1iZXIgPSAtMTtcblxuICAvLyBGaWx0ZXJcbiAgZ3JvdXBGaWx0ZXJPYmplY3QgPSBbXG4gICAgeyBEZXNjcmlwdGlvbjogJ0FubmV4dXJlJywgdHlwZTogJ3NpbmdsZScsIElzc3VlczogW3sgaWQ6ICdhdHRhY2hlZCcsIHRleHQ6ICdBdHRhY2hlZCcgfSwgeyBpZDogJ25vdEF0dGFjaGVkJywgdGV4dDogJ05vdCBBdHRhY2hlZCcgfV0gfSxcbiAgXTtcbiAgYW5uZXh1cmVGaWx0ZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8vID09PT09IFBheW1lbnQgUmVtaW5kZXJzID09PT09XG4gIHJlbWluZGVyRW1haWxzOiBzdHJpbmdbXSA9IFtdO1xuICByZW1pbmRlckVtYWlsSW5wdXQ6IHN0cmluZyA9ICcnO1xuICByZW1pbmRlclRlbXBsYXRlczogYW55ID0ge1xuICAgIHByZUR1ZTogeyBlbmFibGVkOiB0cnVlLCBkYXlzQmVmb3JlOiAzIH0sXG4gICAgb25EdWU6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgIG9uSG9sZDogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgc3VzcGVuZDogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgZGVhY3RpdmF0ZWQ6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgfTtcbiAgcmVtaW5kZXJTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGJpbGxpbmdTZXJ2aWNlOiBCaWxsaW5nU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGllbnRJZCkge1xuICAgICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICAgICAgdGhpcy5sb2FkUGF5bWVudFJlbWluZGVyKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjbGllbnRJZCddICYmICFjaGFuZ2VzWydjbGllbnRJZCddLmZpcnN0Q2hhbmdlICYmIHRoaXMuY2xpZW50SWQpIHtcbiAgICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgICAgIHRoaXMubG9hZFBheW1lbnRSZW1pbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyA9PT09PSBQYXltZW50IFJlbWluZGVycyA9PT09PVxuICBsb2FkUGF5bWVudFJlbWluZGVyKCkge1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0UGF5bWVudFJlbWluZGVyKHRoaXMuY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGQgPSByZXM/LmRhdGE7XG4gICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgdGhpcy5yZW1pbmRlckVtYWlscyA9IEFycmF5LmlzQXJyYXkoZC5yZW1pbmRlckVtYWlscykgPyBkLnJlbWluZGVyRW1haWxzIDogW107XG4gICAgICAgICAgaWYgKGQudGVtcGxhdGVzKSB7XG4gICAgICAgICAgICAvLyBNZXJnZSBvdmVyIGRlZmF1bHRzIHNvIGEgcGFydGlhbCBkb2MgbmV2ZXIgZHJvcHMgYSB0ZW1wbGF0ZS5cbiAgICAgICAgICAgIHRoaXMucmVtaW5kZXJUZW1wbGF0ZXMgPSB7XG4gICAgICAgICAgICAgIHByZUR1ZTogeyBlbmFibGVkOiBkLnRlbXBsYXRlcy5wcmVEdWU/LmVuYWJsZWQgPz8gdHJ1ZSwgZGF5c0JlZm9yZTogZC50ZW1wbGF0ZXMucHJlRHVlPy5kYXlzQmVmb3JlID8/IDMgfSxcbiAgICAgICAgICAgICAgb25EdWU6IHsgZW5hYmxlZDogZC50ZW1wbGF0ZXMub25EdWU/LmVuYWJsZWQgPz8gdHJ1ZSB9LFxuICAgICAgICAgICAgICBvbkhvbGQ6IHsgZW5hYmxlZDogZC50ZW1wbGF0ZXMub25Ib2xkPy5lbmFibGVkID8/IHRydWUgfSxcbiAgICAgICAgICAgICAgc3VzcGVuZDogeyBlbmFibGVkOiBkLnRlbXBsYXRlcy5zdXNwZW5kPy5lbmFibGVkID8/IHRydWUgfSxcbiAgICAgICAgICAgICAgZGVhY3RpdmF0ZWQ6IHsgZW5hYmxlZDogZC50ZW1wbGF0ZXMuZGVhY3RpdmF0ZWQ/LmVuYWJsZWQgPz8gZmFsc2UgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHt9LFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHJlbWluZGVyRW5hYmxlZENvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgdCA9IHRoaXMucmVtaW5kZXJUZW1wbGF0ZXM7XG4gICAgcmV0dXJuIFsncHJlRHVlJywgJ29uRHVlJywgJ29uSG9sZCcsICdzdXNwZW5kJywgJ2RlYWN0aXZhdGVkJ11cbiAgICAgIC5maWx0ZXIoayA9PiB0W2tdPy5lbmFibGVkKS5sZW5ndGg7XG4gIH1cblxuICBhZGRSZW1pbmRlckVtYWlsKCkge1xuICAgIGNvbnN0IGVtYWlsID0gKHRoaXMucmVtaW5kZXJFbWFpbElucHV0IHx8ICcnKS50cmltKCk7XG4gICAgaWYgKCFlbWFpbCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5yZW1pbmRlckVtYWlscy5pbmNsdWRlcyhlbWFpbCkpIHtcbiAgICAgIHRoaXMucmVtaW5kZXJFbWFpbHMucHVzaChlbWFpbCk7XG4gICAgICAvLyBBdXRvc2F2ZSBzbyB0aGUgcmVjaXBpZW50IHBlcnNpc3RzIGltbWVkaWF0ZWx5IChubyBzZXBhcmF0ZSBTYXZlIGNsaWNrKS5cbiAgICAgIHRoaXMucGVyc2lzdFBheW1lbnRSZW1pbmRlcih0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5yZW1pbmRlckVtYWlsSW5wdXQgPSAnJztcbiAgfVxuXG4gIHJlbW92ZVJlbWluZGVyRW1haWwoZW1haWw6IHN0cmluZykge1xuICAgIHRoaXMucmVtaW5kZXJFbWFpbHMgPSB0aGlzLnJlbWluZGVyRW1haWxzLmZpbHRlcihlID0+IGUgIT09IGVtYWlsKTtcbiAgICB0aGlzLnBlcnNpc3RQYXltZW50UmVtaW5kZXIodHJ1ZSk7XG4gIH1cblxuICB0b2dnbGVSZW1pbmRlclRlbXBsYXRlKGtleTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMucmVtaW5kZXJUZW1wbGF0ZXNba2V5XSkge1xuICAgICAgdGhpcy5yZW1pbmRlclRlbXBsYXRlc1trZXldLmVuYWJsZWQgPSAhdGhpcy5yZW1pbmRlclRlbXBsYXRlc1trZXldLmVuYWJsZWQ7XG4gICAgICB0aGlzLmRlYm91bmNlZFBlcnNpc3RSZW1pbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIG9uUHJlRHVlRGF5c0NoYW5nZSh2YWx1ZTogYW55KSB7XG4gICAgbGV0IG4gPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG4pKSBuID0gMTtcbiAgICB0aGlzLnJlbWluZGVyVGVtcGxhdGVzLnByZUR1ZS5kYXlzQmVmb3JlID0gTWF0aC5taW4oMzY1LCBNYXRoLm1heCgxLCBuKSk7XG4gICAgdGhpcy5kZWJvdW5jZWRQZXJzaXN0UmVtaW5kZXIoKTtcbiAgfVxuXG4gIC8vIENvYWxlc2NlIHJhcGlkIHNjaGVkdWxlIGVkaXRzICh0b2dnbGVzLCBkYXkgY2hhbmdlcykgaW50byBvbmUgc2F2ZS5cbiAgcHJpdmF0ZSByZW1pbmRlclNhdmVUaW1lcjogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBkZWJvdW5jZWRQZXJzaXN0UmVtaW5kZXIoKSB7XG4gICAgaWYgKHRoaXMucmVtaW5kZXJTYXZlVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnJlbWluZGVyU2F2ZVRpbWVyKTtcbiAgICB0aGlzLnJlbWluZGVyU2F2ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnBlcnNpc3RQYXltZW50UmVtaW5kZXIodHJ1ZSksIDYwMCk7XG4gIH1cblxuICAvLyBTaGFyZWQgc2F2ZS4gc2lsZW50PXRydWUg4oaSIGF1dG9zYXZlIChubyB0b2FzdCk7IHNpbGVudD1mYWxzZSDihpIgZXhwbGljaXRcbiAgLy8gU2F2ZSBidXR0b24gKHNob3dzIGNvbmZpcm1hdGlvbiB0b2FzdCkuXG4gIHByaXZhdGUgcGVyc2lzdFBheW1lbnRSZW1pbmRlcihzaWxlbnQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuY2xpZW50SWQpIHJldHVybjtcbiAgICB0aGlzLnJlbWluZGVyU2F2aW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICByZW1pbmRlckVtYWlsczogdGhpcy5yZW1pbmRlckVtYWlscyxcbiAgICAgIHRlbXBsYXRlczogdGhpcy5yZW1pbmRlclRlbXBsYXRlcyxcbiAgICB9O1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2Uuc2F2ZVBheW1lbnRSZW1pbmRlcihwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5yZW1pbmRlclNhdmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGBQYXltZW50IHJlbWluZGVyIHNjaGVkdWxlIHNhdmVkIMK3ICR7dGhpcy5yZW1pbmRlckVuYWJsZWRDb3VudH0gb2YgNSBlbmFibGVkYCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucmVtaW5kZXJTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBzYXZlIHJlbWluZGVycycpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmVQYXltZW50UmVtaW5kZXIoKSB7XG4gICAgdGhpcy5wZXJzaXN0UGF5bWVudFJlbWluZGVyKGZhbHNlKTtcbiAgfVxuXG4gIGxvYWRCaWxsaW5nR3JvdXBzKCkge1xuICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmdyb3VwTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5ncm91cE5vRGF0YSA9IGZhbHNlO1xuXG4gICAgbGV0IGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcbiAgICAgIGxpbWl0OiB0aGlzLnBhZ2VTaXplLFxuICAgICAgb2Zmc2V0OiB0aGlzLmN1cnJlbnRQYWdlLFxuICAgICAgc2VhcmNoVmFsdWU6IHRoaXMubGVuLFxuICAgICAgc29ydENvbHVtTmFtZTogdGhpcy5zb3J0Q29sdW1OYW1lLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICAgIGFubmV4dXJlRmlsdGVyOiB0aGlzLmFubmV4dXJlRmlsdGVyLFxuICAgICAgZXhwb3J0OiBmYWxzZVxuICAgIH07XG5cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJyYW5kQmlsbGluZ0dyb3VwcyhmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChlKSA9PiB7XG4gICAgICAgIGlmIChlPy5kYXRhPy5jb3VudCkge1xuICAgICAgICAgIHRoaXMuZ3JvdXBMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5ncm91cE5vRGF0YSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZ3JvdXBMaXN0ID0gZS5kYXRhPy5kYXRhO1xuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IGUuZGF0YT8uY291bnQ7XG4gICAgICAgICAgdGhpcy5zdW1tYXJ5ID0gZS5kYXRhPy5zdW1tYXJ5IHx8IHt9O1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZ3JvdXBMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5ncm91cE5vRGF0YSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zZWFyY2hEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoaXMubGVuPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5ncm91cExpc3QgPSBbXTtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5ncm91cExvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ncm91cE5vRGF0YSA9IHRydWU7XG4gICAgICAgIHRoaXMuZ3JvdXBMaXN0ID0gW107XG4gICAgICAgIHRoaXMudG90YWxJdGVtcyA9IDA7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWRkQmlsbGluZ0dyb3VwKCkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihCaWxsaW5nR3JvdXBGb3JtQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ2xnJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZWRpdE1vZGUgPSBmYWxzZTtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzdWNjZXNzJykge1xuICAgICAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgZWRpdEJpbGxpbmdHcm91cChncm91cDogYW55KSB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEJpbGxpbmdHcm91cEZvcm1Db21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbGcnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNsaWVudElkID0gdGhpcy5jbGllbnRJZDtcbiAgICAvLyBUaGUgZm9ybSBhdXRvLWV4cGFuZHMgdGhlIGFjY29yZGlvbiBmb3IgdGhlIGdyb3VwIHdob3NlIF9pZCBtYXRjaGVzXG4gICAgLy8gYGdyb3VwSWRgLiBJdCBoYXMgbm8gYGdyb3VwRGF0YWAvYGVkaXRNb2RlYCBpbnB1dHMsIHNvIHBhc3NpbmcgdGhvc2UgbGVmdFxuICAgIC8vIGdyb3VwSWQgdW5kZWZpbmVkIGFuZCB0aGUgZm9ybSBhbHdheXMgb3BlbmVkIHRoZSBkZWZhdWx0IChpbmRleCAwKSBncm91cC5cbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5ncm91cElkID0gZ3JvdXA/Ll9pZDtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzdWNjZXNzJykge1xuICAgICAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgZGVsZXRlQmlsbGluZ0dyb3VwKGdyb3VwOiBhbnkpIHtcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRGVsZXRlV2FybmluZ0NvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZ3JvdXBOYW1lID0gZ3JvdXA/Lmdyb3VwTmFtZSB8fCAnJztcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdZZXMnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZGVsZXRlQmlsbGluZ0dyb3VwKGdyb3VwLl9pZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoJ0JpbGxpbmcgZ3JvdXAgZGVsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBkZWxldGUgYmlsbGluZyBncm91cCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgYXBwbHlHcm91cEZpbHRlcnMoZXZlbnQ6IGFueSkge1xuICAgIGlmIChldmVudD8ubGVuZ3RoKSB7XG4gICAgICBldmVudC5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuRGVzY3JpcHRpb24gPT09ICdBbm5leHVyZScpIHtcbiAgICAgICAgICB0aGlzLmFubmV4dXJlRmlsdGVyID0gZWxlbWVudC5Jc3N1ZXM/LmlkIHx8ICcnO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hbm5leHVyZUZpbHRlciA9ICcnO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gIH1cblxuICBzZWFyY2hGaWVsZCgpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gIH1cblxuICBzb3J0RGF0YShjb2x1bW46IHN0cmluZykge1xuICAgIHRoaXMuc29ydENvbHVtTmFtZSA9IGNvbHVtbjtcbiAgICB0aGlzLnNvcnRCeSAqPSAtMTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UocGFnZU9mZnNldDogYW55KSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhcnNlSW50KHBhZ2VPZmZzZXQpO1xuICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgfVxuXG4gIG9uUGFnZVNpemVDaGFuZ2UocGFnZVNpemU6IGFueSkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMucGFnZVNpemUgPSBwYXJzZUludChwYWdlU2l6ZSk7XG4gICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICB9XG5cbiAgb25FeHBvcnQoKSB7XG4gICAgbGV0IGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmxlbixcbiAgICAgIHNvcnRDb2x1bU5hbWU6IHRoaXMuc29ydENvbHVtTmFtZSxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICBleHBvcnQ6IHRydWVcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5icmFuZEJpbGxpbmdHcm91cHNFeHBvcnQoZmlsdGVycykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2Uuc2F2ZUFzRXhjZWxGaWxlKHJlcywgJ2JpbGxpbmctZ3JvdXBzJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdTb21ldGhpbmcgd2VudCBXcm9uZy4uJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBidWxrRG93bmxvYWQoKSB7XG4gICAgaWYgKHRoaXMuYnVsa0Rvd25sb2FkaW5nKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNsaWVudElkKSB7XG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1NlbGVjdCBhIGJyYW5kIGZpcnN0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYnVsa0Rvd25sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJ1bGtEb3dubG9hZEJpbGxpbmdHcm91cHModGhpcy5jbGllbnRJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5zYXZlQXNUZW1wbGF0ZShyZXMsIGBiaWxsaW5nLWdyb3Vwcy0ke3RoaXMuY2xpZW50SWR9LSR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKX1gKTtcbiAgICAgICAgdGhpcy5idWxrRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5idWxrRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdCdWxrIGRvd25sb2FkIGZhaWxlZCcpO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFBlci1ncm91cCBkb3dubG9hZCAoaWNvbiBuZXh0IHRvIEVkaXQpLiBTYW1lIHdvcmtib29rIGFzIEJ1bGsgRG93bmxvYWQsXG4gIC8vIHNjb3BlZCB0byB0aGlzIG9uZSBncm91cCB2aWEgZ3JvdXBJZC5cbiAgZG93bmxvYWRCaWxsaW5nR3JvdXAoZ3JvdXA6IGFueSkge1xuICAgIGNvbnN0IGdyb3VwSWQgPSBncm91cD8uX2lkO1xuICAgIGlmICghZ3JvdXBJZCB8fCB0aGlzLmRvd25sb2FkaW5nR3JvdXBJZCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jbGllbnRJZCkge1xuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdTZWxlY3QgYSBicmFuZCBmaXJzdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRvd25sb2FkaW5nR3JvdXBJZCA9IGdyb3VwSWQ7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5idWxrRG93bmxvYWRCaWxsaW5nR3JvdXBzKHRoaXMuY2xpZW50SWQsIGdyb3VwSWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZG93bmxvYWRpbmdHcm91cElkID0gJyc7XG4gICAgICAgIC8vIEEgNDA0L0pTT04gZXJyb3IgYm9keSBpc24ndCBhIHppcCDigJQgc2F2aW5nIGl0IHlpZWxkcyBhIFwiY29ycnVwdGVkXCJcbiAgICAgICAgLy8gZmlsZSwgc28gb25seSBzYXZlIHdoZW4gdGhlIGJ1ZmZlciByZWFsbHkgaXMgYW4gLnhsc3ggKCdQSycpLlxuICAgICAgICBjb25zdCBieXRlcyA9IHJlcyA/IG5ldyBVaW50OEFycmF5KHJlcykgOiBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICBpZiAoIShieXRlcy5sZW5ndGggPiAxICYmIGJ5dGVzWzBdID09PSAweDUwICYmIGJ5dGVzWzFdID09PSAweDRiKSkge1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm8gZGF0YSB0byBkb3dubG9hZCcpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzYWZlTmFtZSA9IFN0cmluZyhncm91cD8uZ3JvdXBOYW1lIHx8ICdiaWxsaW5nLWdyb3VwJykucmVwbGFjZSgvW1xcXFwvOio/XCI8PnxdL2csICctJyk7XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2Uuc2F2ZUFzVGVtcGxhdGUocmVzLCBgJHtzYWZlTmFtZX0tJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApfWApO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmRvd25sb2FkaW5nR3JvdXBJZCA9ICcnO1xuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0Rvd25sb2FkIGZhaWxlZCcpO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uQnVsa1VwbG9hZEZpbGVTZWxlY3RlZChldmVudDogYW55KSB7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50Py50YXJnZXQ/LmZpbGVzPy5bMF07XG4gICAgaWYgKCFmaWxlKSByZXR1cm47XG4gICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7XG4gICAgaWYgKCF0aGlzLmNsaWVudElkKSB7XG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1NlbGVjdCBhIGJyYW5kIGZpcnN0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYnVsa1VwbG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5idWxrVXBkYXRlQmlsbGluZ0dyb3VwcyhmaWxlLCB0aGlzLmNsaWVudElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmJ1bGtVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IHJlcz8uZGF0YT8uc3VtbWFyeT8udXBkYXRlZCA/PyAwO1xuICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdChgVXBkYXRlZCAke3VwZGF0ZWR9IGJpbGxpbmcgZ3JvdXAocylgKTtcbiAgICAgICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5idWxrVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGVyclBheWxvYWQgPSBlcnI/LmVycm9yPy5kYXRhIHx8IGVycj8uZXJyb3I7XG4gICAgICAgIGlmIChlcnI/LnN0YXR1cyA9PT0gNDIyICYmIGVyclBheWxvYWQ/LmVycm9ycykge1xuICAgICAgICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihCdWxrVXBsb2FkRXJyb3JDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbGcnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmVycm9ycyA9IGVyclBheWxvYWQuZXJyb3JzO1xuICAgICAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRvdGFsID0gZXJyUGF5bG9hZC5zdW1tYXJ5Py50b3RhbCA/PyAwO1xuICAgICAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmZhaWxlZCA9IGVyclBheWxvYWQuc3VtbWFyeT8uZmFpbGVkID8/IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyPy5zdGF0dXMgPT09IDQxMykge1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmlsZSB0b28gbGFyZ2UgKG1heCA1TUIpJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyPy5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyUGF5bG9hZD8ubWVzc2FnZSB8fCAnSW52YWxpZCBmaWxlIGZvcm1hdCDigJQgdXNlIFhMU1gnO1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChtc2cpO1xuICAgICAgICB9IGVsc2UgaWYgKGVycj8uc3RhdHVzID09PSAyMDcpIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkID0gZXJyUGF5bG9hZD8uc3VtbWFyeT8udXBkYXRlZCA/PyAwO1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChgQnVsayB1cGxvYWQgcGFydGlhbGx5IGFwcGxpZWQ6ICR7dXBkYXRlZH0gdXBkYXRlZCwgdGhlbiBhYm9ydGVkLiBQbGVhc2UgcmUtdXBsb2FkLmApO1xuICAgICAgICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0J1bGsgdXBsb2FkIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IiwiPGRpdiBjbGFzcz1cImludm9pY2VzLXNlY3Rpb25cIj5cbiAgICA8IS0tIEhlYWRlciBSb3cgLS0+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjY2NjY3IDEwSDEzLjMzMzNNNi42NjY2NyA2LjY2NjY3SDEzLjMzMzNNNi42NjY2NyAxMy4zMzMzSDEwTTUgMTcuNUgxNUMxNS45MjA1IDE3LjUgMTYuNjY2NyAxNi43NTM4IDE2LjY2NjcgMTUuODMzM1Y0LjE2NjY3QzE2LjY2NjcgMy4yNDYxOSAxNS45MjA1IDIuNSAxNSAyLjVINUM0LjA3OTUzIDIuNSAzLjMzMzMzIDMuMjQ2MTkgMy4zMzMzMyA0LjE2NjY3VjE1LjgzMzNDMy4zMzMzMyAxNi43NTM4IDQuMDc5NTMgMTcuNSA1IDE3LjVaXCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiaWxsaW5naGVhZGVyXCI+QmlsbGluZyBHcm91cHM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1saWdodCB0ZXh0LWRhcmsgbXMtMVwiPnt7IHN1bW1hcnk/LnRvdGFsR3JvdXBzIHx8IDAgfX0gdG90YWw8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIj5NYW5hZ2UgR1NUIGVudGl0aWVzIGZvciBjb25zb2xpZGF0ZWQgaW52b2ljaW5nLiBFYWNoIGdyb3VwIGdldHMgaXRzIG93biBpbnZvaWNlLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3VtbWFyeSBDYXJkcyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwicm93IGctMyBtYi00XCIgKm5nSWY9XCJzdW1tYXJ5Py50b3RhbEdyb3Vwc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1jYXJkLXNtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWwtc21cIj5Ub3RhbCBHcm91cHM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZS1zbVwiPnt7IHN1bW1hcnk/LnRvdGFsR3JvdXBzIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWNhcmQtc21cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbC1zbVwiPkFjdGl2ZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlLXNtIHRleHQtcHJpbWFyeVwiPnt7IHN1bW1hcnk/LmFjdGl2ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1jYXJkLXNtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWwtc21cIj5Ub3RhbCBSZWNlaXZlcnM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZS1zbVwiPnt7IHN1bW1hcnk/LnRvdGFsUmVjZWl2ZXJzIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFNlYXJjaCArIEZpbHRlciArIEV4cG9ydCArIEFkZCBSb3cgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHBheW1lbnRoaXN0b3J5IGJvcmRlci0wIHB4LTBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhciB3LTEwMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgbXktMVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIGludm9pY2VzZWFyY2ggc3ZnLWljb24tMSBwb3NpdGlvbi1hYnNvbHV0ZSBtdC02IG1zLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IG9wYWNpdHk9XCIwLjVcIiB4PVwiMTcuMDM2NVwiIHk9XCIxNS4xMjIzXCIgd2lkdGg9XCI4LjE1NTQ2XCIgaGVpZ2h0PVwiMlwiIHJ4PVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSg0NSAxNy4wMzY1IDE1LjEyMjMpXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcmVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExIDE5QzYuNTU1NTYgMTkgMyAxNS40NDQ0IDMgMTFDMyA2LjU1NTU2IDYuNTU1NTYgMyAxMSAzQzE1LjQ0NDQgMyAxOSA2LjU1NTU2IDE5IDExQzE5IDE1LjQ0NDQgMTUuNDQ0NCAxOSAxMSAxOVpNMTEgNUM3LjUzMzMzIDUgNSA3LjUzMzMzIDUgMTFDNSAxNC40NjY3IDcuNTMzMzMgMTcgMTEgMTdDMTQuNDY2NyAxNyAxNyAxNC40NjY3IDE3IDExQzE3IDcuNTMzMzMgMTQuNDY2NyA1IDExIDVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImxlblwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcHMtMTQgaW52b2ljZXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChjaGFuZ2UpPVwic2VhcmNoRmllbGQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VhcmNoRGlzYWJsZWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWZpbHRlcnMgW2RhdGFPYmplY3RdPVwiZ3JvdXBGaWx0ZXJPYmplY3RcIiAoYXBwbGllZEZpbHRlcnMpPVwiYXBwbHlHcm91cEZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJidWxrRG93bmxvYWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1bGtEb3dubG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTUuODMzMzMgOC4zMzMzM0wxMCAxMi41TTEwIDEyLjVMMTQuMTY2NyA4LjMzMzMzTTEwIDEyLjVWMi41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIiAqbmdJZj1cIiFidWxrRG93bmxvYWRpbmdcIj5CdWxrIERvd25sb2FkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCIgKm5nSWY9XCJidWxrRG93bmxvYWRpbmdcIj5Eb3dubG9hZGluZy4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJidWxrVXBsb2FkSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1bGtVcGxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiICpuZ0lmPVwiIWJ1bGtVcGxvYWRpbmdcIj5CdWxrIFVwbG9hZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiICpuZ0lmPVwiYnVsa1VwbG9hZGluZ1wiPlVwbG9hZGluZy4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjYnVsa1VwbG9hZElucHV0IHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiLnhsc3gsLnhsc1wiIGhpZGRlbiAoY2hhbmdlKT1cIm9uQnVsa1VwbG9hZEZpbGVTZWxlY3RlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkV4cG9ydCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLW91dGxpbmUgYnRuIGFsaWduLWl0ZW1zLWVuZCB0ZXh0LW5vd3JhcCBpbnZoZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFncm91cExpc3QubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIj5FeHBvcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LW5vd3JhcCBtcy0zXCIgKGNsaWNrKT1cImFkZEJpbGxpbmdHcm91cCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICArIEFkZCBCaWxsaW5nIEdyb3VwXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMb2FkaW5nIFNoaW1tZXIgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyb3VwTG9hZGluZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gTm8gRGF0YSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JvdXBOb0RhdGFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmMgdy0yNVwiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gR3JvdXBzIExpc3QgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFncm91cExvYWRpbmcgJiYgIWdyb3VwTm9EYXRhXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGdyb3VwTGlzdFwiIGNsYXNzPVwiZ3JvdXAtY2FyZCBtYi0zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1pY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNjY2NjcgMTBIMTMuMzMzM002LjY2NjY3IDYuNjY2NjdIMTMuMzMzM002LjY2NjY3IDEzLjMzMzNIMTBNNSAxNy41SDE1QzE1LjkyMDUgMTcuNSAxNi42NjY3IDE2Ljc1MzggMTYuNjY2NyAxNS44MzMzVjQuMTY2NjdDMTYuNjY2NyAzLjI0NjE5IDE1LjkyMDUgMi41IDE1IDIuNUg1QzQuMDc5NTMgMi41IDMuMzMzMzMgMy4yNDYxOSAzLjMzMzMzIDQuMTY2NjdWMTUuODMzM0MzLjMzMzMzIDE2Ljc1MzggNC4wNzk1MyAxNy41IDUgMTcuNVpcIiBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC1uYW1lXCI+e3sgZ3JvdXA/Lmdyb3VwTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LXN1Y2Nlc3NcIj5BY3RpdmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cD8uZ3N0XCI+R1NUOiB7eyBncm91cD8uZ3N0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXA/LmdzdCAmJiBncm91cD8ucmVnaXN0ZXJlZENvbXBhbnlOYW1lXCIgY2xhc3M9XCJteC0yXCI+Jm1pZGRvdDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cD8ucmVnaXN0ZXJlZENvbXBhbnlOYW1lXCI+e3sgZ3JvdXA/LnJlZ2lzdGVyZWRDb21wYW55TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4taWNvblwiIChjbGljayk9XCJkb3dubG9hZEJpbGxpbmdHcm91cChncm91cClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRvd25sb2FkaW5nR3JvdXBJZCA9PT0gZ3JvdXA/Ll9pZFwiIHRpdGxlPVwiRG93bmxvYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU01LjgzMzMzIDguMzMzMzNMMTAgMTIuNU0xMCAxMi41TDE0LjE2NjcgOC4zMzMzM00xMCAxMi41VjIuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1pY29uXCIgKGNsaWNrKT1cImVkaXRCaWxsaW5nR3JvdXAoZ3JvdXApXCIgdGl0bGU9XCJFZGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTExLjMzMzMgMi4wMDAwNEMxMS41MDgzIDEuODI0OTQgMTEuNzE2MyAxLjY4NjA1IDExLjk0NTEgMS41OTEyOUMxMi4xNzM5IDEuNDk2NTMgMTIuNDE5MSAxLjQ0Nzc1IDEyLjY2NjcgMS40NDc3NUMxMi45MTQzIDEuNDQ3NzUgMTMuMTU5NCAxLjQ5NjUzIDEzLjM4ODIgMS41OTEyOUMxMy42MTcgMS42ODYwNSAxMy44MjUgMS44MjQ5NCAxNCAyLjAwMDA0QzE0LjE3NTEgMi4xNzUxMyAxNC4zMTQgMi4zODMxOCAxNC40MDg4IDIuNjExOTdDMTQuNTAzNSAyLjg0MDc2IDE0LjU1MjMgMy4wODU4NiAxNC41NTIzIDMuMzMzMzdDMTQuNTUyMyAzLjU4MDg5IDE0LjUwMzUgMy44MjU5OSAxNC40MDg4IDQuMDU0NzhDMTQuMzE0IDQuMjgzNTcgMTQuMTc1MSA0LjQ5MTYyIDE0IDQuNjY2NzFMNSAxMy42NjY3TDEuMzMzMzMgMTQuNjY2N0wyLjMzMzMzIDExTDExLjMzMzMgMi4wMDAwNFpcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4zM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFncm91cD8uaXNQcmltYXJ5XCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4taWNvblwiIChjbGljayk9XCJkZWxldGVCaWxsaW5nR3JvdXAoZ3JvdXApXCIgdGl0bGU9XCJEZWxldGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMiA0SDMuMzMzMzNIMTRNMTIuNjY2NyA0VjEzLjMzMzNDMTIuNjY2NyAxMy42ODcgMTIuNTI2MiAxNC4wMjYxIDEyLjI3NjEgMTQuMjc2MUMxMi4wMjYxIDE0LjUyNjIgMTEuNjg3IDE0LjY2NjcgMTEuMzMzMyAxNC42NjY3SDQuNjY2NjdDNC4zMTMwNCAxNC42NjY3IDMuOTczOTEgMTQuNTI2MiAzLjcyMzg2IDE0LjI3NjFDMy40NzM4MSAxNC4wMjYxIDMuMzMzMzMgMTMuNjg3IDMuMzMzMzMgMTMuMzMzM1Y0TTUuMzMzMzMgNFYyLjY2NjY3QzUuMzMzMzMgMi4zMTMwNCA1LjQ3MzgxIDEuOTczOTEgNS43MjM4NiAxLjcyMzg2QzUuOTczOTEgMS40NzM4MSA2LjMxMzA0IDEuMzMzMzMgNi42NjY2NyAxLjMzMzMzSDkuMzMzMzNDOS42ODY5NiAxLjMzMzMzIDEwLjAyNjEgMS40NzM4MSAxMC4yNzYxIDEuNzIzODZDMTAuNTI2MiAxLjk3MzkxIDEwLjY2NjcgMi4zMTMwNCAxMC42NjY3IDIuNjY2NjdWNFwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctMyBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtZGV0YWlsLWxhYmVsXCI+Q29udGFjdCBFbWFpbDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtZGV0YWlsLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuMTY2NjcgNC4wODMyNUw2LjE0NjE3IDcuNDA2MTdDNi41MDUzMyA3LjY0NTU4IDYuNjg1IDcuNzY1MjUgNi44NzkzMyA3LjgxMDQyQzcuMDUxMzMgNy44NTA0MiA3LjIzMDMzIDcuODUwNDIgNy40MDIzMyA3LjgxMDQyQzcuNTk2NjcgNy43NjUyNSA3Ljc3NjMzIDcuNjQ1NTggOC4xMzU1IDcuNDA2MTdMMTMuMTE1IDQuMDgzMjVNMy45NjY2NyAxMS42NjY2SDEwLjMxNDdDMTEuMTk0OCAxMS42NjY2IDExLjYzNDggMTEuNjY2NiAxMS45NzE3IDExLjQ5NTFDMTIuMjY4NyAxMS4zNDM5IDEyLjUxMDUgMTEuMTAyMSAxMi42NjE3IDEwLjgwNTFDMTIuODMzMyAxMC40NjgyIDEyLjgzMzMgMTAuMDI4MiAxMi44MzMzIDkuMTQ4MDhWNS4xMzUwOEMxMi44MzMzIDQuMjU0OTkgMTIuODMzMyAzLjgxNDk5IDEyLjY2MTcgMy40NzgwOEMxMi41MTA1IDMuMTgxMDggMTIuMjY4NyAyLjkzOTMzIDExLjk3MTcgMi43ODgwOEMxMS42MzQ4IDIuNjE2NTggMTEuMTk0OCAyLjYxNjU4IDEwLjMxNDcgMi42MTY1OEgzLjk2NjY3QzMuMDg2NTggMi42MTY1OCAyLjY0NjU4IDIuNjE2NTggMi4zMDk2NyAyLjc4ODA4QzIuMDEyNjcgMi45MzkzMyAxLjc3MDkyIDMuMTgxMDggMS42MTk2NyAzLjQ3ODA4QzEuNDQ4MTcgMy44MTQ5OSAxLjQ0ODE3IDQuMjU0OTkgMS40NDgxNyA1LjEzNTA4VjkuMTQ4MDhDMS40NDgxNyAxMC4wMjgyIDEuNDQ4MTcgMTAuNDY4MiAxLjYxOTY3IDEwLjgwNTFDMS43NzA5MiAxMS4xMDIxIDIuMDEyNjcgMTEuMzQzOSAyLjMwOTY3IDExLjQ5NTFDMi42NDY1OCAxMS42NjY2IDMuMDg2NTggMTEuNjY2NiAzLjk2NjY3IDExLjY2NjZaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cD8uZ2VuZXJhdGVJbnZvaWNlVG8/Lmxlbmd0aFwiPnt7IGdyb3VwPy5nZW5lcmF0ZUludm9pY2VUb1swXSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWdyb3VwPy5nZW5lcmF0ZUludm9pY2VUbz8ubGVuZ3RoXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+4oCUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1kZXRhaWwtbGFiZWxcIj5TdG9yZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtZS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjE2NjY3IDcuMDAwMDhMNi41NjQ4MyAxLjYwMTkyQzYuNzg2ODMgMS4zNzk5MiA2Ljg5NzgzIDEuMjY4OTIgNy4wMjU4MyAxLjIyMTkyQzcuMTM4ODMgMS4xODAyNSA3LjI2MjgzIDEuMTgwMjUgNy4zNzU4MyAxLjIyMTkyQzcuNTAzODMgMS4yNjg5MiA3LjYxNDgzIDEuMzc5OTIgNy44MzY4MyAxLjYwMTkyTDEzLjIzNSA3LjAwMDA4TTIuOTE2NjcgNS41NDE3NVYxMS4wMjUxQzIuOTE2NjcgMTEuNDY1MSAyLjkxNjY3IDExLjY4NTEgMy4wMDI0MiAxMS44NTM2QzMuMDc4MDggMTIuMDAyMSAzLjE5ODI1IDEyLjEyMjMgMy4zNDY3NSAxMi4xOTc5QzMuNTE1MzMgMTIuMjgzNyAzLjczNTMzIDEyLjI4MzcgNC4xNzUzMyAxMi4yODM3SDUuODMzMzNWOS4zMzM0MkM1LjgzMzMzIDguODc1MDggNS44MzMzMyA4LjY0NTkyIDUuOTIyMDggOC40Njg5MkM2LjAwMDMzIDguMzEzMDggNi4xMjYxNyA4LjE4NzI1IDYuMjgyIDguMTA5MDhDNi40NTkgOC4wMjAyNSA2LjY4ODE3IDguMDIwMjUgNy4xNDY2NyA4LjAyMDI1SDcuMjU0MTdDNy43MTI2NyA4LjAyMDI1IDcuOTQxODMgOC4wMjAyNSA4LjExODgzIDguMTA5MDhDOC4yNzQ2NyA4LjE4NzI1IDguNDAwNjcgOC4zMTMwOCA4LjQ3ODgzIDguNDY4OTJDOC41Njc1IDguNjQ1OTIgOC41Njc1IDguODc1MDggOC41Njc1IDkuMzMzNDJWMTIuMjgzN0gxMC4yMjZDMTAuNjY2IDEyLjI4MzcgMTAuODg2IDEyLjI4MzcgMTEuMDU0NSAxMi4xOTc5QzExLjIwMyAxMi4xMjIzIDExLjMyMzIgMTIuMDAyMSAxMS4zOTg4IDExLjg1MzZDMTEuNDg0NyAxMS42ODUxIDExLjQ4NDcgMTEuNDY1MSAxMS40ODQ3IDExLjAyNTFWNS41NDE3NVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdyb3VwPy5zdG9yZUNvdW50IHx8IDAgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtZGV0YWlsLWxhYmVsXCI+QW5uZXh1cmUgQXR0YWNobWVudDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtZGV0YWlsLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlXCIgW25nQ2xhc3NdPVwiZ3JvdXA/LmF0dGFjaEFubmV4dXJlID8gJ2JhZGdlLWxpZ2h0LXN1Y2Nlc3MnIDogJ2JhZGdlLWxpZ2h0LXNlY29uZGFyeSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cD8uYXR0YWNoQW5uZXh1cmUgPyAnQXR0YWNoZWQnIDogJ05vdCBhdHRhY2hlZCcgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtZGV0YWlsLWxhYmVsXCI+SW52b2ljZSBSZWNlaXZlcnM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtZS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05LjMzMzMzIDEyLjI1VjExLjA4MzNDOS4zMzMzMyAxMC40NjQ1IDkuMDg3MzUgOS44NzEgOC42NDk3NiA5LjQzMzQyQzguMjEyMTggOC45OTU4MyA3LjYxODY4IDguNzUgNyA4Ljc1SDIuOTE2NjdDMi4yOTc5OSA4Ljc1IDEuNzA0NDkgOC45OTU4MyAxLjI2NjkgOS40MzM0MkMwLjgyOTMxNiA5Ljg3MSAwLjU4MzMzMyAxMC40NjQ1IDAuNTgzMzMzIDExLjA4MzNWMTIuMjVNMTIuODMzMyAxMi4yNVYxMS4wODMzQzEyLjgzMyAxMC41NzM1IDEyLjY2ODggMTAuMDc3OCAxMi4zNjU0IDkuNjY4NThDMTIuMDYyMSA5LjI1OTMzIDExLjYzNiA4Ljk1ODU4IDExLjE0NTggOC44MTA4M005LjA0MTY3IDEuODEwODNDOS41MzMwOCAxLjk1NzkyIDkuOTYwNTggMi4yNTg1OCAxMC4yNjUgMi42NjgyNUMxMC41Njk0IDMuMDc3OTIgMTAuNzM0IDMuNTc0NjcgMTAuNzM0IDQuMDg1NDJDMTAuNzM0IDQuNTk2MTcgMTAuNTY5NCA1LjA5MjkyIDEwLjI2NSA1LjUwMjU4QzkuOTYwNTggNS45MTIyNSA5LjUzMzA4IDYuMjEyOTIgOS4wNDE2NyA2LjM2TTcuMjkxNjcgNC4wODMzM0M3LjI5MTY3IDUuMzcyNDIgNi4yNDc0MiA2LjQxNjY3IDQuOTU4MzMgNi40MTY2N0MzLjY2OTI1IDYuNDE2NjcgMi42MjUgNS4zNzI0MiAyLjYyNSA0LjA4MzMzQzIuNjI1IDIuNzk0MjUgMy42NjkyNSAxLjc1IDQuOTU4MzMgMS43NUM2LjI0NzQyIDEuNzUgNy4yOTE2NyAyLjc5NDI1IDcuMjkxNjcgNC4wODMzM1pcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cD8ucmVjZWl2ZXJDb3VudCB8fCAwIH19IHJlY2lwaWVudHNcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGxpYi1wYWdpbmF0aW9uIGNsYXNzPVwidGV4dC1zdGFydFwiIFtpdGVtc1BlclBhZ2VdPVwiaXRlbXNQZXJQYWdlXCIgW2N1cnJlbnRQYWdlXT1cImN1cnJlbnRQYWdlXCJcbiAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gPT09PT09PT09PT09PT09PT09PT09IFBheW1lbnQgUmVtaW5kZXJzID09PT09PT09PT09PT09PT09PT09PSAtLT5cbjxkaXYgY2xhc3M9XCJwci1wYW5lbCBtdC00XCI+XG4gICAgPGRpdiBjbGFzcz1cInByLWhlYWRcIj5cbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgIHN0cm9rZT1cIiMxNDkzZjVcIiBzdHJva2Utd2lkdGg9XCIyXCI+PHBhdGggZD1cIk0xOCA4YTYgNiAwIDAgMC0xMiAwYzAgNy0zIDktMyA5aDE4cy0zLTItMy05TTEzLjcgMjFhMiAyIDAgMCAxLTMuNCAwXCIvPjwvc3ZnPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXRpdGxlXCI+UGF5bWVudCBSZW1pbmRlcnM8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci1zdWJcIj5UaGVzZSByZWNpcGllbnRzIHJlY2VpdmUgcGF5bWVudC1yZW1pbmRlciBlbWFpbHMgZm9yIGFsbCBiaWxsaW5nIGdyb3VwcyBpbiB0aGlzIGJyYW5kLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUmVjaXBpZW50cyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwicHItZmllbGQgbXQtM1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJwci1sYWJlbFwiPlJlbWluZGVyIFJlY2lwaWVudHM8L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHItY2hpcHNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItY2hpcFwiICpuZ0Zvcj1cImxldCBlIG9mIHJlbWluZGVyRW1haWxzXCI+XG4gICAgICAgICAgICAgICAge3sgZSB9fTxzcGFuIGNsYXNzPVwicHItY2hpcC14XCIgKGNsaWNrKT1cInJlbW92ZVJlbWluZGVyRW1haWwoZSlcIj7Dlzwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInByLWNoaXAtaW5wdXRcIiBbKG5nTW9kZWwpXT1cInJlbWluZGVyRW1haWxJbnB1dFwiIHBsYWNlaG9sZGVyPVwiQWRkIGVtYWlsICsgRW50ZXJcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBhZGRSZW1pbmRlckVtYWlsKClcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cImFkZFJlbWluZGVyRW1haWwoKVwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByLWhpbnRcIj5BcHBsaWVkIHRvIGV2ZXJ5IGJpbGxpbmcgZ3JvdXAgZm9yIHRoaXMgYnJhbmQuPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFNjaGVkdWxlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwci1zY2hlZHVsZS1sYWJlbFwiPlJlbWluZGVyIFNjaGVkdWxlPC9sYWJlbD5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItY291bnRcIj57eyByZW1pbmRlckVuYWJsZWRDb3VudCB9fSBvZiA1IGVuYWJsZWQ8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHItaGludCBtYi0zXCI+UHJlZGVmaW5lZCByZW1pbmRlciBmbG93cy4gRW5hYmxlIHRoZSB0ZW1wbGF0ZXMgeW91IHdhbnQg4oCUIHRpbWluZ3MgYXJlIGZpeGVkIGV4Y2VwdCB3aGVyZSBub3RlZC48L2Rpdj5cblxuICAgICAgICA8IS0tIER1ZSBEYXRlIFJlbWluZGVyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHItdG1wbFwiIFtjbGFzcy5vbl09XCJyZW1pbmRlclRlbXBsYXRlcy5wcmVEdWUuZW5hYmxlZCB8fCByZW1pbmRlclRlbXBsYXRlcy5vbkR1ZS5lbmFibGVkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItdG1wbC1oZWFkXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwci1kb3QgYW1iZXJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci10bXBsLW5hbWVcIj5EdWUgRGF0ZSBSZW1pbmRlcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItaGludFwiPlJlbWluZCB0aGUgY3VzdG9tZXIgYXJvdW5kIHRoZSBpbnZvaWNlIGR1ZSBkYXRlLiBFbmFibGUgZWFjaCBzdGFnZSBpbmRlcGVuZGVudGx5LjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItdGFnIGFtYmVyXCI+QXJvdW5kIGR1ZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXRtcGwtYm9keVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXJvdy10ZXh0XCI+PGI+QmVmb3JlIGR1ZTwvYj4g4oCUIHNlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIG1heD1cIjM2NVwiIGNsYXNzPVwicHItZGF5LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyZW1pbmRlclRlbXBsYXRlcy5wcmVEdWUuZGF5c0JlZm9yZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25QcmVEdWVEYXlzQ2hhbmdlKCRldmVudClcIj4gZGF5KHMpIGJlZm9yZSB0aGUgZHVlIGRhdGVcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci10b2dnbGVcIiBbY2xhc3Mub25dPVwicmVtaW5kZXJUZW1wbGF0ZXMucHJlRHVlLmVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVJlbWluZGVyVGVtcGxhdGUoJ3ByZUR1ZScpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItcm93LXRleHRcIj48Yj5PbiBkdWUgZGF0ZTwvYj4g4oCUIHNlbnQgb24gdGhlIGludm9pY2UgZHVlIGRhdGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXRvZ2dsZVwiIFtjbGFzcy5vbl09XCJyZW1pbmRlclRlbXBsYXRlcy5vbkR1ZS5lbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVSZW1pbmRlclRlbXBsYXRlKCdvbkR1ZScpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBQYXltZW50IE92ZXJkdWUgUmVtaW5kZXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwci10bXBsIG10LTNcIlxuICAgICAgICAgICAgW2NsYXNzLm9uXT1cInJlbWluZGVyVGVtcGxhdGVzLm9uSG9sZC5lbmFibGVkIHx8IHJlbWluZGVyVGVtcGxhdGVzLnN1c3BlbmQuZW5hYmxlZCB8fCByZW1pbmRlclRlbXBsYXRlcy5kZWFjdGl2YXRlZC5lbmFibGVkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItdG1wbC1oZWFkXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwci1kb3QgcmVkXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItdG1wbC1uYW1lXCI+UGF5bWVudCBPdmVyZHVlIFJlbWluZGVyPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci1oaW50XCI+U2VudCBhZnRlciB0aGUgaW52b2ljZSBjcm9zc2VzIHRoZSBkdWUgZGF0ZS4gRW5hYmxlIGVhY2ggc3RhZ2UgaW5kZXBlbmRlbnRseS48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByLXRhZyByZWRcIj5BZnRlciBkdWU8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci10bXBsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci1yb3ctdGV4dFwiPjxiPk9uIEhvbGQ8L2I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByLWluZm9cIiBuZ2JUb29sdGlwPVwiRGF0YSBjb2xsZWN0ZWQgYW5kIHByb2Nlc3NlZDsgaGlkZGVuIGZyb20gVUk7IGxvZ2luIHN0aWxsIHdvcmtzLlwiIHBsYWNlbWVudD1cInRvcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCI5XCIvPjxwYXRoIGQ9XCJNMTIgMTF2NU0xMiA4aC4wMVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIOKAlCBhY2NvdW50IG9uIGhvbGQgaW1tZWRpYXRlbHkgYWZ0ZXIgZHVlIGRhdGVcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci10b2dnbGVcIiBbY2xhc3Mub25dPVwicmVtaW5kZXJUZW1wbGF0ZXMub25Ib2xkLmVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVJlbWluZGVyVGVtcGxhdGUoJ29uSG9sZCcpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHItcm93LXRleHRcIj48Yj5TdXNwZW5kZWQ8L2I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByLWluZm9cIiBuZ2JUb29sdGlwPVwiRGF0YSBjb2xsZWN0ZWQsIG5vdCBwcm9jZXNzZWQ7IGhpZGRlbiBmcm9tIFVJOyBsb2dpbiBibG9ja2VkLlwiIHBsYWNlbWVudD1cInRvcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCI5XCIvPjxwYXRoIGQ9XCJNMTIgMTF2NU0xMiA4aC4wMVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIOKAlCBhY2NvdW50IHN1c3BlbmRlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIDxiPjMwIGRheXM8L2I+IHVucGFpZFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXRvZ2dsZVwiIFtjbGFzcy5vbl09XCJyZW1pbmRlclRlbXBsYXRlcy5zdXNwZW5kLmVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVJlbWluZGVyVGVtcGxhdGUoJ3N1c3BlbmQnKVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXJvdy10ZXh0XCI+PGI+RGVhY3RpdmF0ZWQ8L2I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByLWluZm9cIiBuZ2JUb29sdGlwPVwiRGF0YSBub3QgY29sbGVjdGVkIG9yIHByb2Nlc3NlZDsgaGlkZGVuIGZyb20gVUk7IGFjY2VzcyBkaXNhYmxlZC5cIiBwbGFjZW1lbnQ9XCJ0b3BcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiOVwiLz48cGF0aCBkPVwiTTEyIDExdjVNMTIgOGguMDFcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICDigJQgYWNjb3VudCBkZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIDxiPjYwIGRheXM8L2I+IHVucGFpZFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByLXRvZ2dsZVwiIFtjbGFzcy5vbl09XCJyZW1pbmRlclRlbXBsYXRlcy5kZWFjdGl2YXRlZC5lbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVSZW1pbmRlclRlbXBsYXRlKCdkZWFjdGl2YXRlZCcpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgbXQtNFwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIFtkaXNhYmxlZF09XCJyZW1pbmRlclNhdmluZ1wiIChjbGljayk9XCJzYXZlUGF5bWVudFJlbWluZGVyKClcIj5cbiAgICAgICAgICAgIHt7IHJlbWluZGVyU2F2aW5nID8gJ1NhdmluZ+KApicgOiAnU2F2ZScgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
|