tango-app-ui-manage-billing 3.3.19 → 3.3.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/billing-summary/billing-summary.component.mjs +25 -17
- package/esm2022/lib/components/brand-invoices/brand-invoices.component.mjs +13 -5
- package/esm2022/lib/components/daily-pricing/daily-pricing.component.mjs +71 -7
- package/esm2022/lib/components/daily-pricing/generate-invoice-modal/generate-invoice-modal.component.mjs +3 -3
- package/esm2022/lib/components/daily-pricing/new-stores-modal/new-stores-modal.component.mjs +25 -0
- package/esm2022/lib/components/invoice-preview/invoice-preview.component.mjs +3 -3
- package/esm2022/lib/components/plans-subscription/payments-subscription.component.mjs +184 -13
- package/esm2022/lib/components/plans-subscription/subscription-popups/upload-document/upload-document.component.mjs +82 -0
- package/esm2022/lib/components/purchase-order/purchase-order-details/purchase-order-details.component.mjs +62 -0
- package/esm2022/lib/components/purchase-order/purchase-order-form/purchase-order-form.component.mjs +87 -0
- package/esm2022/lib/components/purchase-order/purchase-order.component.mjs +104 -0
- package/esm2022/lib/components/services/billing.service.mjs +15 -1
- package/esm2022/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.mjs +25 -3
- package/esm2022/lib/services/payment-subscription.service.mjs +17 -6
- package/esm2022/lib/tango-manage-billing.module.mjs +16 -1
- package/fesm2022/tango-app-ui-manage-billing.mjs +724 -96
- package/fesm2022/tango-app-ui-manage-billing.mjs.map +1 -1
- package/lib/components/billing-summary/billing-summary.component.d.ts +1 -0
- package/lib/components/brand-invoices/brand-invoices.component.d.ts +3 -0
- package/lib/components/daily-pricing/daily-pricing.component.d.ts +6 -0
- package/lib/components/daily-pricing/new-stores-modal/new-stores-modal.component.d.ts +10 -0
- package/lib/components/plans-subscription/payments-subscription.component.d.ts +15 -0
- package/lib/components/plans-subscription/subscription-popups/upload-document/upload-document.component.d.ts +23 -0
- package/lib/components/purchase-order/purchase-order-details/purchase-order-details.component.d.ts +18 -0
- package/lib/components/purchase-order/purchase-order-form/purchase-order-form.component.d.ts +25 -0
- package/lib/components/purchase-order/purchase-order.component.d.ts +28 -0
- package/lib/components/services/billing.service.d.ts +3 -0
- package/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.d.ts +2 -0
- package/lib/services/payment-subscription.service.d.ts +4 -0
- package/lib/tango-manage-billing.module.d.ts +42 -37
- package/package.json +1 -1
|
@@ -82,12 +82,12 @@ export class GenerateInvoiceModalComponent {
|
|
|
82
82
|
this.destroy$.complete();
|
|
83
83
|
}
|
|
84
84
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GenerateInvoiceModalComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.BillingService }], target: i0.ɵɵFactoryTarget.Component });
|
|
85
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: GenerateInvoiceModalComponent, selector: "lib-generate-invoice-modal", inputs: { clientId: "clientId" }, ngImport: i0, template: "<div class=\"modal-content\">\n <div class=\"px-5 pt-5 pb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"heading\">Generate Invoice</div>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\"></button>\n </div>\n <div class=\"subheading mt-2\">Select the billing groups to generate invoices for.</div>\n </div>\n\n <div class=\"modal-body px-5 py-2\">\n <div *ngIf=\"loading\" class=\"state-row\">Loading billing groups...</div>\n\n <div *ngIf=\"!loading && loadError\" class=\"state-row text-danger\">\n Failed to load billing groups. Close and try again.\n </div>\n\n <div *ngIf=\"!loading && !loadError && groups.length === 0\" class=\"state-row\">\n No billing groups configured for this client.\n </div>\n\n <ng-container *ngIf=\"!loading && !loadError && groups.length > 0\">\n <div class=\"select-all-row\">\n <label class=\"select-all-label\">\n <input type=\"checkbox\"\n [checked]=\"allSelected\"\n (change)=\"toggleSelectAll($any($event.target).checked)\">\n <span>Select all billable groups</span>\n </label>\n <span class=\"count-pill\">{{ selectionCount }} selected</span>\n </div>\n\n <div class=\"group-list\">\n <label *ngFor=\"let g of groups\"\n class=\"group-row\"\n [class.disabled]=\"isEmpty(g)\">\n <input type=\"checkbox\"\n [checked]=\"isSelected(g)\"\n [disabled]=\"isEmpty(g)\"\n (change)=\"toggle(g)\">\n <div class=\"group-meta\">\n <div class=\"group-name\">\n {{ g.groupName || 'Untitled group' }}\n <span *ngIf=\"g.isPrimary\" class=\"badge-primary\">Primary</span>\n </div>\n <div class=\"group-sub\">\n <span>{{ g.stores?.length || 0 }} store(s)</span>\n <span *ngIf=\"isEmpty(g)\" class=\"empty-note\">\u2014 no stores, cannot generate</span>\n <span *ngIf=\"g.registeredCompanyName\"> · {{ g.registeredCompanyName }}</span>\n </div>\n </div>\n </label>\n </div>\n </ng-container>\n </div>\n\n <div class=\"modal-footer footer-row px-5 pb-5\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn btn-outline cancel me-3 w-50\">Cancel</button>\n <button type=\"button\" (click)=\"confirm()\"\n [disabled]=\"selectionCount === 0\"\n class=\"btn btn-primary w-50\">\n Generate ({{ selectionCount }})\n </button>\n </div>\n</div>", styles: [".heading{color:#101828;font-family:Inter;font-size:18px;font-weight:600;line-height:28px}.subheading{color:#667085;font-family:Inter;font-size:14px;font-weight:400;line-height:20px}.state-row{padding:24px 0;text-align:center;color:#667085;font-size:14px}.select-all-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0 12px;border-bottom:1px solid #EAECF0;margin-bottom:8px}.select-all-label{display:inline-flex;align-items:center;gap:10px;cursor:pointer;color:#344054;font-size:13px;font-weight:500;margin:0}.count-pill{background:#eff8ff;color:#175cd3;font-size:12px;font-weight:600;padding:2px 10px;border-radius:12px}.group-list{max-height:360px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.group-row{display:flex;align-items:flex-start;gap:12px;padding:10px 12px;border:1px solid #EAECF0;border-radius:8px;cursor:pointer;transition:background .12s ease;margin:0}.group-row:hover:not(.disabled){background:#f9fafb}.group-row.disabled{opacity:.55;cursor:not-allowed;background:#fafafb}.group-row input[type=checkbox]{margin-top:3px}.group-meta{flex:1;min-width:0}.group-name{color:#101828;font-size:14px;font-weight:600;line-height:20px;display:flex;align-items:center;gap:8px}.badge-primary{background:#ecfdf3;color:#027a48;font-size:11px;font-weight:500;padding:2px 8px;border-radius:8px}.group-sub{color:#667085;font-size:12px;line-height:18px;margin-top:2px}.empty-note{color:#b54708;margin-left:4px}.cancel{color:#344054;font-weight:600;border:1px solid #D0D5DD;background:#fff;border-radius:8px}.footer-row{display:flex;flex-wrap:nowrap;justify-content:stretch;border-top:none}.footer-row>.btn{flex:1 1 50%;min-width:0}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
85
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: GenerateInvoiceModalComponent, selector: "lib-generate-invoice-modal", inputs: { clientId: "clientId" }, ngImport: i0, template: "<div class=\"modal-content\">\n <div class=\"px-5 pt-5 pb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"heading\">Generate Invoice</div>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\"></button>\n </div>\n <div class=\"subheading mt-2\">Select the billing groups to generate invoices for.</div>\n </div>\n\n <div class=\"modal-body px-5 py-2\">\n <div *ngIf=\"loading\" class=\"state-row\">Loading billing groups...</div>\n\n <div *ngIf=\"!loading && loadError\" class=\"state-row text-danger\">\n Failed to load billing groups. Close and try again.\n </div>\n\n <div *ngIf=\"!loading && !loadError && groups.length === 0\" class=\"state-row\">\n No billing groups configured for this client.\n </div>\n\n <ng-container *ngIf=\"!loading && !loadError && groups.length > 0\">\n <div class=\"select-all-row\">\n <label class=\"select-all-label\">\n <input type=\"checkbox\"\n [checked]=\"allSelected\"\n (change)=\"toggleSelectAll($any($event.target).checked)\">\n <span>Select all billable groups</span>\n </label>\n <span class=\"count-pill\">{{ selectionCount }} selected</span>\n </div>\n\n <div class=\"group-list\">\n <label *ngFor=\"let g of groups\"\n class=\"group-row\"\n [class.disabled]=\"isEmpty(g)\">\n <input type=\"checkbox\"\n [checked]=\"isSelected(g)\"\n [disabled]=\"isEmpty(g)\"\n (change)=\"toggle(g)\">\n <div class=\"group-meta\">\n <div class=\"group-name\">\n {{ g.groupName || 'Untitled group' }}\n <span *ngIf=\"g.isPrimary\" class=\"badge-primary\">Primary</span>\n </div>\n <div class=\"group-sub\">\n <span>{{ g.stores?.length || 0 }} store(s)</span>\n <span *ngIf=\"isEmpty(g)\" class=\"empty-note\">\u2014 no stores, cannot generate</span>\n <span *ngIf=\"g.registeredCompanyName\"> · {{ g.registeredCompanyName }}</span>\n </div>\n <!-- Advance invoice already covers the current month \u2192 a\n normal monthly invoice will be generated instead. -->\n <div class=\"advance-note\" *ngIf=\"g.advanceCoverage\">\n Advance invoice <strong>{{ g.advanceCoverage.invoice }}</strong>\n <span *ngIf=\"g.advanceCoverage.period\"> ({{ g.advanceCoverage.period }})</span>\n already covers this month \u2014 a monthly invoice will be created.\n </div>\n </div>\n </label>\n </div>\n </ng-container>\n </div>\n\n <div class=\"modal-footer footer-row px-5 pb-5\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn btn-outline cancel me-3 w-50\">Cancel</button>\n <button type=\"button\" (click)=\"confirm()\"\n [disabled]=\"selectionCount === 0\"\n class=\"btn btn-primary w-50\">\n Generate ({{ selectionCount }})\n </button>\n </div>\n</div>", styles: [".heading{color:#101828;font-family:Inter;font-size:18px;font-weight:600;line-height:28px}.subheading{color:#667085;font-family:Inter;font-size:14px;font-weight:400;line-height:20px}.state-row{padding:24px 0;text-align:center;color:#667085;font-size:14px}.select-all-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0 12px;border-bottom:1px solid #EAECF0;margin-bottom:8px}.select-all-label{display:inline-flex;align-items:center;gap:10px;cursor:pointer;color:#344054;font-size:13px;font-weight:500;margin:0}.count-pill{background:#eff8ff;color:#175cd3;font-size:12px;font-weight:600;padding:2px 10px;border-radius:12px}.group-list{max-height:360px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.group-row{display:flex;align-items:flex-start;gap:12px;padding:10px 12px;border:1px solid #EAECF0;border-radius:8px;cursor:pointer;transition:background .12s ease;margin:0}.group-row:hover:not(.disabled){background:#f9fafb}.group-row.disabled{opacity:.55;cursor:not-allowed;background:#fafafb}.group-row input[type=checkbox]{margin-top:3px}.group-meta{flex:1;min-width:0}.group-name{color:#101828;font-size:14px;font-weight:600;line-height:20px;display:flex;align-items:center;gap:8px}.badge-primary{background:#ecfdf3;color:#027a48;font-size:11px;font-weight:500;padding:2px 8px;border-radius:8px}.group-sub{color:#667085;font-size:12px;line-height:18px;margin-top:2px}.empty-note{color:#b54708;margin-left:4px}.cancel{color:#344054;font-weight:600;border:1px solid #D0D5DD;background:#fff;border-radius:8px}.footer-row{display:flex;flex-wrap:nowrap;justify-content:stretch;border-top:none}.footer-row>.btn{flex:1 1 50%;min-width:0}.advance-note{margin-top:4px;font-size:12px;color:#b54708;background:#fffaeb;border:1px solid #FEDF89;border-radius:6px;padding:4px 8px;display:inline-block}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
86
86
|
}
|
|
87
87
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GenerateInvoiceModalComponent, decorators: [{
|
|
88
88
|
type: Component,
|
|
89
|
-
args: [{ selector: 'lib-generate-invoice-modal', template: "<div class=\"modal-content\">\n <div class=\"px-5 pt-5 pb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"heading\">Generate Invoice</div>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\"></button>\n </div>\n <div class=\"subheading mt-2\">Select the billing groups to generate invoices for.</div>\n </div>\n\n <div class=\"modal-body px-5 py-2\">\n <div *ngIf=\"loading\" class=\"state-row\">Loading billing groups...</div>\n\n <div *ngIf=\"!loading && loadError\" class=\"state-row text-danger\">\n Failed to load billing groups. Close and try again.\n </div>\n\n <div *ngIf=\"!loading && !loadError && groups.length === 0\" class=\"state-row\">\n No billing groups configured for this client.\n </div>\n\n <ng-container *ngIf=\"!loading && !loadError && groups.length > 0\">\n <div class=\"select-all-row\">\n <label class=\"select-all-label\">\n <input type=\"checkbox\"\n [checked]=\"allSelected\"\n (change)=\"toggleSelectAll($any($event.target).checked)\">\n <span>Select all billable groups</span>\n </label>\n <span class=\"count-pill\">{{ selectionCount }} selected</span>\n </div>\n\n <div class=\"group-list\">\n <label *ngFor=\"let g of groups\"\n class=\"group-row\"\n [class.disabled]=\"isEmpty(g)\">\n <input type=\"checkbox\"\n [checked]=\"isSelected(g)\"\n [disabled]=\"isEmpty(g)\"\n (change)=\"toggle(g)\">\n <div class=\"group-meta\">\n <div class=\"group-name\">\n {{ g.groupName || 'Untitled group' }}\n <span *ngIf=\"g.isPrimary\" class=\"badge-primary\">Primary</span>\n </div>\n <div class=\"group-sub\">\n <span>{{ g.stores?.length || 0 }} store(s)</span>\n <span *ngIf=\"isEmpty(g)\" class=\"empty-note\">\u2014 no stores, cannot generate</span>\n <span *ngIf=\"g.registeredCompanyName\"> · {{ g.registeredCompanyName }}</span>\n </div>\n </div>\n </label>\n </div>\n </ng-container>\n </div>\n\n <div class=\"modal-footer footer-row px-5 pb-5\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn btn-outline cancel me-3 w-50\">Cancel</button>\n <button type=\"button\" (click)=\"confirm()\"\n [disabled]=\"selectionCount === 0\"\n class=\"btn btn-primary w-50\">\n Generate ({{ selectionCount }})\n </button>\n </div>\n</div>", styles: [".heading{color:#101828;font-family:Inter;font-size:18px;font-weight:600;line-height:28px}.subheading{color:#667085;font-family:Inter;font-size:14px;font-weight:400;line-height:20px}.state-row{padding:24px 0;text-align:center;color:#667085;font-size:14px}.select-all-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0 12px;border-bottom:1px solid #EAECF0;margin-bottom:8px}.select-all-label{display:inline-flex;align-items:center;gap:10px;cursor:pointer;color:#344054;font-size:13px;font-weight:500;margin:0}.count-pill{background:#eff8ff;color:#175cd3;font-size:12px;font-weight:600;padding:2px 10px;border-radius:12px}.group-list{max-height:360px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.group-row{display:flex;align-items:flex-start;gap:12px;padding:10px 12px;border:1px solid #EAECF0;border-radius:8px;cursor:pointer;transition:background .12s ease;margin:0}.group-row:hover:not(.disabled){background:#f9fafb}.group-row.disabled{opacity:.55;cursor:not-allowed;background:#fafafb}.group-row input[type=checkbox]{margin-top:3px}.group-meta{flex:1;min-width:0}.group-name{color:#101828;font-size:14px;font-weight:600;line-height:20px;display:flex;align-items:center;gap:8px}.badge-primary{background:#ecfdf3;color:#027a48;font-size:11px;font-weight:500;padding:2px 8px;border-radius:8px}.group-sub{color:#667085;font-size:12px;line-height:18px;margin-top:2px}.empty-note{color:#b54708;margin-left:4px}.cancel{color:#344054;font-weight:600;border:1px solid #D0D5DD;background:#fff;border-radius:8px}.footer-row{display:flex;flex-wrap:nowrap;justify-content:stretch;border-top:none}.footer-row>.btn{flex:1 1 50%;min-width:0}\n"] }]
|
|
89
|
+
args: [{ selector: 'lib-generate-invoice-modal', template: "<div class=\"modal-content\">\n <div class=\"px-5 pt-5 pb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"heading\">Generate Invoice</div>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\"></button>\n </div>\n <div class=\"subheading mt-2\">Select the billing groups to generate invoices for.</div>\n </div>\n\n <div class=\"modal-body px-5 py-2\">\n <div *ngIf=\"loading\" class=\"state-row\">Loading billing groups...</div>\n\n <div *ngIf=\"!loading && loadError\" class=\"state-row text-danger\">\n Failed to load billing groups. Close and try again.\n </div>\n\n <div *ngIf=\"!loading && !loadError && groups.length === 0\" class=\"state-row\">\n No billing groups configured for this client.\n </div>\n\n <ng-container *ngIf=\"!loading && !loadError && groups.length > 0\">\n <div class=\"select-all-row\">\n <label class=\"select-all-label\">\n <input type=\"checkbox\"\n [checked]=\"allSelected\"\n (change)=\"toggleSelectAll($any($event.target).checked)\">\n <span>Select all billable groups</span>\n </label>\n <span class=\"count-pill\">{{ selectionCount }} selected</span>\n </div>\n\n <div class=\"group-list\">\n <label *ngFor=\"let g of groups\"\n class=\"group-row\"\n [class.disabled]=\"isEmpty(g)\">\n <input type=\"checkbox\"\n [checked]=\"isSelected(g)\"\n [disabled]=\"isEmpty(g)\"\n (change)=\"toggle(g)\">\n <div class=\"group-meta\">\n <div class=\"group-name\">\n {{ g.groupName || 'Untitled group' }}\n <span *ngIf=\"g.isPrimary\" class=\"badge-primary\">Primary</span>\n </div>\n <div class=\"group-sub\">\n <span>{{ g.stores?.length || 0 }} store(s)</span>\n <span *ngIf=\"isEmpty(g)\" class=\"empty-note\">\u2014 no stores, cannot generate</span>\n <span *ngIf=\"g.registeredCompanyName\"> · {{ g.registeredCompanyName }}</span>\n </div>\n <!-- Advance invoice already covers the current month \u2192 a\n normal monthly invoice will be generated instead. -->\n <div class=\"advance-note\" *ngIf=\"g.advanceCoverage\">\n Advance invoice <strong>{{ g.advanceCoverage.invoice }}</strong>\n <span *ngIf=\"g.advanceCoverage.period\"> ({{ g.advanceCoverage.period }})</span>\n already covers this month \u2014 a monthly invoice will be created.\n </div>\n </div>\n </label>\n </div>\n </ng-container>\n </div>\n\n <div class=\"modal-footer footer-row px-5 pb-5\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn btn-outline cancel me-3 w-50\">Cancel</button>\n <button type=\"button\" (click)=\"confirm()\"\n [disabled]=\"selectionCount === 0\"\n class=\"btn btn-primary w-50\">\n Generate ({{ selectionCount }})\n </button>\n </div>\n</div>", styles: [".heading{color:#101828;font-family:Inter;font-size:18px;font-weight:600;line-height:28px}.subheading{color:#667085;font-family:Inter;font-size:14px;font-weight:400;line-height:20px}.state-row{padding:24px 0;text-align:center;color:#667085;font-size:14px}.select-all-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0 12px;border-bottom:1px solid #EAECF0;margin-bottom:8px}.select-all-label{display:inline-flex;align-items:center;gap:10px;cursor:pointer;color:#344054;font-size:13px;font-weight:500;margin:0}.count-pill{background:#eff8ff;color:#175cd3;font-size:12px;font-weight:600;padding:2px 10px;border-radius:12px}.group-list{max-height:360px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.group-row{display:flex;align-items:flex-start;gap:12px;padding:10px 12px;border:1px solid #EAECF0;border-radius:8px;cursor:pointer;transition:background .12s ease;margin:0}.group-row:hover:not(.disabled){background:#f9fafb}.group-row.disabled{opacity:.55;cursor:not-allowed;background:#fafafb}.group-row input[type=checkbox]{margin-top:3px}.group-meta{flex:1;min-width:0}.group-name{color:#101828;font-size:14px;font-weight:600;line-height:20px;display:flex;align-items:center;gap:8px}.badge-primary{background:#ecfdf3;color:#027a48;font-size:11px;font-weight:500;padding:2px 8px;border-radius:8px}.group-sub{color:#667085;font-size:12px;line-height:18px;margin-top:2px}.empty-note{color:#b54708;margin-left:4px}.cancel{color:#344054;font-weight:600;border:1px solid #D0D5DD;background:#fff;border-radius:8px}.footer-row{display:flex;flex-wrap:nowrap;justify-content:stretch;border-top:none}.footer-row>.btn{flex:1 1 50%;min-width:0}.advance-note{margin-top:4px;font-size:12px;color:#b54708;background:#fffaeb;border:1px solid #FEDF89;border-radius:6px;padding:4px 8px;display:inline-block}\n"] }]
|
|
90
90
|
}], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.BillingService }], propDecorators: { clientId: [{
|
|
91
91
|
type: Input
|
|
92
92
|
}] } });
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtaW52b2ljZS1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtYmlsbGluZy9zcmMvbGliL2NvbXBvbmVudHMvZGFpbHktcHJpY2luZy9nZW5lcmF0ZS1pbnZvaWNlLW1vZGFsL2dlbmVyYXRlLWludm9pY2UtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2RhaWx5LXByaWNpbmcvZ2VuZXJhdGUtaW52b2ljZS1tb2RhbC9nZW5lcmF0ZS1pbnZvaWNlLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7OztBQVExQyxNQUFNLE9BQU8sNkJBQTZCO0lBVy9CO0lBQ0M7SUFYRCxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBRWQsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFaEQsTUFBTSxHQUFVLEVBQUUsQ0FBQztJQUNuQixXQUFXLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDckMsT0FBTyxHQUFZLElBQUksQ0FBQztJQUN4QixTQUFTLEdBQVksS0FBSyxDQUFDO0lBRTNCLFlBQ1MsV0FBMkIsRUFDMUIsY0FBOEI7UUFEL0IsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQzFCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUNyQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFFB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V0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQW5GVSw2QkFBNkI7NEZBQTdCLDZCQUE2QixvR0NWMUMseStGQWdFTTs7NEZEdERPLDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSw0QkFBNEI7Z0hBSzdCLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCaWxsaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2JpbGxpbmcuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1nZW5lcmF0ZS1pbnZvaWNlLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyYXRlLWludm9pY2UtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZ2VuZXJhdGUtaW52b2ljZS1tb2RhbC5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgR2VuZXJhdGVJbnZvaWNlTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgZ3JvdXBzOiBhbnlbXSA9IFtdO1xuICBzZWxlY3RlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIGxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBsb2FkRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxuICAgIHByaXZhdGUgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRHcm91cHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEdyb3VwcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2xpZW50SWQpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEFsbEJpbGxpbmdHcm91cHModGhpcy5jbGllbnRJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5ncm91cHMgPSByZXM/LmRhdGEgfHwgW107XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvYWRFcnJvciA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBBIGdyb3VwIGlzIHVuYmlsbGFibGUgd2hlbiBpdCBoYXMgbm8gc3RvcmVzIGF0dGFjaGVkIOKAlCB0aGUgYmFja2VuZCdzXG4gIC8vIHN0b3JlLWZpbHRlciB3b3VsZCBwcm9kdWNlIHplcm8gcHJvZHVjdHMsIHNvIGdlbmVyYXRpbmcgd291bGQgYmUgYSBuby1vcC5cbiAgaXNFbXB0eShncm91cDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEoZ3JvdXA/LnN0b3Jlcz8ubGVuZ3RoID4gMCk7XG4gIH1cblxuICB0b2dnbGUoZ3JvdXA6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoZ3JvdXApKSByZXR1cm47XG4gICAgY29uc3QgaWQgPSBncm91cC5faWQ7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJZHMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZElkcy5kZWxldGUoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSWRzLmFkZChpZCk7XG4gICAgfVxuICB9XG5cbiAgaXNTZWxlY3RlZChncm91cDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJZHMuaGFzKGdyb3VwLl9pZCk7XG4gIH1cblxuICB0b2dnbGVTZWxlY3RBbGwoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICB0aGlzLmdyb3Vwc1xuICAgICAgICAuZmlsdGVyKChnKSA9PiAhdGhpcy5pc0VtcHR5KGcpKVxuICAgICAgICAuZm9yRWFjaCgoZykgPT4gdGhpcy5zZWxlY3RlZElkcy5hZGQoZy5faWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBiaWxsYWJsZSA9IHRoaXMuZ3JvdXBzLmZpbHRlcigoZykgPT4gIXRoaXMuaXNFbXB0eShnKSk7XG4gICAgcmV0dXJuIGJpbGxhYmxlLmxlbmd0aCA+IDAgJiYgYmlsbGFibGUuZXZlcnkoKGcpID0+IHRoaXMuc2VsZWN0ZWRJZHMuaGFzKGcuX2lkKSk7XG4gIH1cblxuICBnZXQgc2VsZWN0aW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZElkcy5zaXplO1xuICB9XG5cbiAgY29uZmlybSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Db3VudCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkSWRzKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgIDxkaXYgY2xhc3M9XCJweC01IHB0LTUgcGItM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmdcIj5HZW5lcmF0ZSBJbnZvaWNlPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIChjbGljayk9XCJhY3RpdmVNb2RhbC5kaXNtaXNzKClcIj48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJoZWFkaW5nIG10LTJcIj5TZWxlY3QgdGhlIGJpbGxpbmcgZ3JvdXBzIHRvIGdlbmVyYXRlIGludm9pY2VzIGZvci48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHB4LTUgcHktMlwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwic3RhdGUtcm93XCI+TG9hZGluZyBiaWxsaW5nIGdyb3Vwcy4uLjwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiBsb2FkRXJyb3JcIiBjbGFzcz1cInN0YXRlLXJvdyB0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGxvYWQgYmlsbGluZyBncm91cHMuIENsb3NlIGFuZCB0cnkgYWdhaW4uXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiAhbG9hZEVycm9yICYmIGdyb3Vwcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cInN0YXRlLXJvd1wiPlxuICAgICAgICAgICAgTm8gYmlsbGluZyBncm91cHMgY29uZmlndXJlZCBmb3IgdGhpcyBjbGllbnQuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZyAmJiAhbG9hZEVycm9yICYmIGdyb3Vwcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LWFsbC1yb3dcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZWxlY3QtYWxsLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGwoJGFueSgkZXZlbnQudGFyZ2V0KS5jaGVja2VkKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TZWxlY3QgYWxsIGJpbGxhYmxlIGdyb3Vwczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnQtcGlsbFwiPnt7IHNlbGVjdGlvbkNvdW50IH19IHNlbGVjdGVkPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsICpuZ0Zvcj1cImxldCBnIG9mIGdyb3Vwc1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JvdXAtcm93XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRW1wdHkoZylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKGcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0VtcHR5KGcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlKGcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1tZXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGcuZ3JvdXBOYW1lIHx8ICdVbnRpdGxlZCBncm91cCcgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImcuaXNQcmltYXJ5XCIgY2xhc3M9XCJiYWRnZS1wcmltYXJ5XCI+UHJpbWFyeTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXN1YlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGcuc3RvcmVzPy5sZW5ndGggfHwgMCB9fSBzdG9yZShzKTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzRW1wdHkoZylcIiBjbGFzcz1cImVtcHR5LW5vdGVcIj7igJQgbm8gc3RvcmVzLCBjYW5ub3QgZ2VuZXJhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnLnJlZ2lzdGVyZWRDb21wYW55TmFtZVwiPiAmbWlkZG90OyB7eyBnLnJlZ2lzdGVyZWRDb21wYW55TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlciBmb290ZXItcm93IHB4LTUgcGItNVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWN0aXZlTW9kYWwuZGlzbWlzcygpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGNhbmNlbCBtZS0zIHctNTBcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNvbmZpcm0oKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0aW9uQ291bnQgPT09IDBcIlxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy01MFwiPlxuICAgICAgICAgICAgR2VuZXJhdGUgKHt7IHNlbGVjdGlvbkNvdW50IH19KVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtaW52b2ljZS1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtYmlsbGluZy9zcmMvbGliL2NvbXBvbmVudHMvZGFpbHktcHJpY2luZy9nZW5lcmF0ZS1pbnZvaWNlLW1vZGFsL2dlbmVyYXRlLWludm9pY2UtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2RhaWx5LXByaWNpbmcvZ2VuZXJhdGUtaW52b2ljZS1tb2RhbC9nZW5lcmF0ZS1pbnZvaWNlLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7OztBQVExQyxNQUFNLE9BQU8sNkJBQTZCO0lBVy9CO0lBQ0M7SUFYRCxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBRWQsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFaEQsTUFBTSxHQUFVLEVBQUUsQ0FBQztJQUNuQixXQUFXLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDckMsT0FBTyxHQUFZLElBQUksQ0FBQztJQUN4QixTQUFTLEdBQVksS0FBSyxDQUFDO0lBRTNCLFlBQ1MsV0FBMkIsRUFDMUIsY0FBOEI7UUFEL0IsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQzFCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUNyQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFFB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V0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQW5GVSw2QkFBNkI7NEZBQTdCLDZCQUE2QixvR0NWMUMscWpIQXVFTTs7NEZEN0RPLDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSw0QkFBNEI7Z0hBSzdCLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCaWxsaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2JpbGxpbmcuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1nZW5lcmF0ZS1pbnZvaWNlLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyYXRlLWludm9pY2UtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZ2VuZXJhdGUtaW52b2ljZS1tb2RhbC5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgR2VuZXJhdGVJbnZvaWNlTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgZ3JvdXBzOiBhbnlbXSA9IFtdO1xuICBzZWxlY3RlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIGxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBsb2FkRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxuICAgIHByaXZhdGUgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRHcm91cHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEdyb3VwcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2xpZW50SWQpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEFsbEJpbGxpbmdHcm91cHModGhpcy5jbGllbnRJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5ncm91cHMgPSByZXM/LmRhdGEgfHwgW107XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvYWRFcnJvciA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBBIGdyb3VwIGlzIHVuYmlsbGFibGUgd2hlbiBpdCBoYXMgbm8gc3RvcmVzIGF0dGFjaGVkIOKAlCB0aGUgYmFja2VuZCdzXG4gIC8vIHN0b3JlLWZpbHRlciB3b3VsZCBwcm9kdWNlIHplcm8gcHJvZHVjdHMsIHNvIGdlbmVyYXRpbmcgd291bGQgYmUgYSBuby1vcC5cbiAgaXNFbXB0eShncm91cDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEoZ3JvdXA/LnN0b3Jlcz8ubGVuZ3RoID4gMCk7XG4gIH1cblxuICB0b2dnbGUoZ3JvdXA6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoZ3JvdXApKSByZXR1cm47XG4gICAgY29uc3QgaWQgPSBncm91cC5faWQ7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJZHMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZElkcy5kZWxldGUoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSWRzLmFkZChpZCk7XG4gICAgfVxuICB9XG5cbiAgaXNTZWxlY3RlZChncm91cDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJZHMuaGFzKGdyb3VwLl9pZCk7XG4gIH1cblxuICB0b2dnbGVTZWxlY3RBbGwoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICB0aGlzLmdyb3Vwc1xuICAgICAgICAuZmlsdGVyKChnKSA9PiAhdGhpcy5pc0VtcHR5KGcpKVxuICAgICAgICAuZm9yRWFjaCgoZykgPT4gdGhpcy5zZWxlY3RlZElkcy5hZGQoZy5faWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBiaWxsYWJsZSA9IHRoaXMuZ3JvdXBzLmZpbHRlcigoZykgPT4gIXRoaXMuaXNFbXB0eShnKSk7XG4gICAgcmV0dXJuIGJpbGxhYmxlLmxlbmd0aCA+IDAgJiYgYmlsbGFibGUuZXZlcnkoKGcpID0+IHRoaXMuc2VsZWN0ZWRJZHMuaGFzKGcuX2lkKSk7XG4gIH1cblxuICBnZXQgc2VsZWN0aW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZElkcy5zaXplO1xuICB9XG5cbiAgY29uZmlybSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Db3VudCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkSWRzKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgIDxkaXYgY2xhc3M9XCJweC01IHB0LTUgcGItM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmdcIj5HZW5lcmF0ZSBJbnZvaWNlPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIChjbGljayk9XCJhY3RpdmVNb2RhbC5kaXNtaXNzKClcIj48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJoZWFkaW5nIG10LTJcIj5TZWxlY3QgdGhlIGJpbGxpbmcgZ3JvdXBzIHRvIGdlbmVyYXRlIGludm9pY2VzIGZvci48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHB4LTUgcHktMlwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwic3RhdGUtcm93XCI+TG9hZGluZyBiaWxsaW5nIGdyb3Vwcy4uLjwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiBsb2FkRXJyb3JcIiBjbGFzcz1cInN0YXRlLXJvdyB0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGxvYWQgYmlsbGluZyBncm91cHMuIENsb3NlIGFuZCB0cnkgYWdhaW4uXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiAhbG9hZEVycm9yICYmIGdyb3Vwcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cInN0YXRlLXJvd1wiPlxuICAgICAgICAgICAgTm8gYmlsbGluZyBncm91cHMgY29uZmlndXJlZCBmb3IgdGhpcyBjbGllbnQuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZyAmJiAhbG9hZEVycm9yICYmIGdyb3Vwcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LWFsbC1yb3dcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZWxlY3QtYWxsLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGwoJGFueSgkZXZlbnQudGFyZ2V0KS5jaGVja2VkKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TZWxlY3QgYWxsIGJpbGxhYmxlIGdyb3Vwczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnQtcGlsbFwiPnt7IHNlbGVjdGlvbkNvdW50IH19IHNlbGVjdGVkPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsICpuZ0Zvcj1cImxldCBnIG9mIGdyb3Vwc1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JvdXAtcm93XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRW1wdHkoZylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKGcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0VtcHR5KGcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlKGcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1tZXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGcuZ3JvdXBOYW1lIHx8ICdVbnRpdGxlZCBncm91cCcgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImcuaXNQcmltYXJ5XCIgY2xhc3M9XCJiYWRnZS1wcmltYXJ5XCI+UHJpbWFyeTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXN1YlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGcuc3RvcmVzPy5sZW5ndGggfHwgMCB9fSBzdG9yZShzKTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzRW1wdHkoZylcIiBjbGFzcz1cImVtcHR5LW5vdGVcIj7igJQgbm8gc3RvcmVzLCBjYW5ub3QgZ2VuZXJhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnLnJlZ2lzdGVyZWRDb21wYW55TmFtZVwiPiAmbWlkZG90OyB7eyBnLnJlZ2lzdGVyZWRDb21wYW55TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZHZhbmNlIGludm9pY2UgYWxyZWFkeSBjb3ZlcnMgdGhlIGN1cnJlbnQgbW9udGgg4oaSIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsIG1vbnRobHkgaW52b2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbnN0ZWFkLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZHZhbmNlLW5vdGVcIiAqbmdJZj1cImcuYWR2YW5jZUNvdmVyYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR2YW5jZSBpbnZvaWNlIDxzdHJvbmc+e3sgZy5hZHZhbmNlQ292ZXJhZ2UuaW52b2ljZSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZy5hZHZhbmNlQ292ZXJhZ2UucGVyaW9kXCI+ICh7eyBnLmFkdmFuY2VDb3ZlcmFnZS5wZXJpb2QgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgY292ZXJzIHRoaXMgbW9udGgg4oCUIGEgbW9udGhseSBpbnZvaWNlIHdpbGwgYmUgY3JlYXRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlciBmb290ZXItcm93IHB4LTUgcGItNVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWN0aXZlTW9kYWwuZGlzbWlzcygpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGNhbmNlbCBtZS0zIHctNTBcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNvbmZpcm0oKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0aW9uQ291bnQgPT09IDBcIlxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy01MFwiPlxuICAgICAgICAgICAgR2VuZXJhdGUgKHt7IHNlbGVjdGlvbkNvdW50IH19KVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
4
|
+
import * as i2 from "@angular/common";
|
|
5
|
+
export class NewStoresModalComponent {
|
|
6
|
+
activeModal;
|
|
7
|
+
// Newly onboarded stores (first file in the current month). Passed in from the
|
|
8
|
+
// Billing Breakdown page so the modal needs no extra API call.
|
|
9
|
+
stores = [];
|
|
10
|
+
monthLabel = '';
|
|
11
|
+
constructor(activeModal) {
|
|
12
|
+
this.activeModal = activeModal;
|
|
13
|
+
}
|
|
14
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NewStoresModalComponent, deps: [{ token: i1.NgbActiveModal }], target: i0.ɵɵFactoryTarget.Component });
|
|
15
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NewStoresModalComponent, selector: "lib-new-stores-modal", inputs: { stores: "stores", monthLabel: "monthLabel" }, ngImport: i0, template: "<div class=\"modal-header\">\n <div>\n <h5 class=\"modal-title mb-0\">Newly Onboarded Stores</h5>\n <div class=\"text-muted small\">First file in {{ monthLabel || 'current month' }} \u00B7 {{ stores?.length || 0 }} stores</div>\n </div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"activeModal.dismiss()\"></button>\n</div>\n<div class=\"modal-body p-0\">\n <div class=\"table-responsive\" style=\"max-height:420px;overflow-y:auto;\">\n <table class=\"table table-row-bordered align-middle mb-0\">\n <thead class=\"sticky-top bg-white\">\n <tr class=\"fw-bold fs-7 text-gray-600\">\n <th class=\"ps-5\">Store ID</th>\n <th>Store Name</th>\n <th>Status</th>\n <th class=\"pe-5\">First File Date</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let s of stores\">\n <td class=\"ps-5 fs-7\">{{ s.storeId }}</td>\n <td class=\"fs-7\">{{ s.storeName || '\u2014' }}</td>\n <td class=\"fs-7\">\n <span class=\"badge\"\n [ngClass]=\"s.status === 'active' ? 'badge-light-success' : 'badge-light-secondary'\">\n {{ s.status || '\u2014' }}\n </span>\n </td>\n <td class=\"pe-5 fs-7\">{{ s.firstFileDate || '\u2014' }}</td>\n </tr>\n <tr *ngIf=\"!stores?.length\">\n <td colspan=\"4\" class=\"text-center text-muted py-5\">No newly onboarded stores this month.</td>\n </tr>\n </tbody>\n </table>\n </div>\n</div>\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-light\" (click)=\"activeModal.dismiss()\">Close</button>\n</div>", styles: [".modal-title{font-weight:700;color:#101828}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
16
|
+
}
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NewStoresModalComponent, decorators: [{
|
|
18
|
+
type: Component,
|
|
19
|
+
args: [{ selector: 'lib-new-stores-modal', template: "<div class=\"modal-header\">\n <div>\n <h5 class=\"modal-title mb-0\">Newly Onboarded Stores</h5>\n <div class=\"text-muted small\">First file in {{ monthLabel || 'current month' }} \u00B7 {{ stores?.length || 0 }} stores</div>\n </div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"activeModal.dismiss()\"></button>\n</div>\n<div class=\"modal-body p-0\">\n <div class=\"table-responsive\" style=\"max-height:420px;overflow-y:auto;\">\n <table class=\"table table-row-bordered align-middle mb-0\">\n <thead class=\"sticky-top bg-white\">\n <tr class=\"fw-bold fs-7 text-gray-600\">\n <th class=\"ps-5\">Store ID</th>\n <th>Store Name</th>\n <th>Status</th>\n <th class=\"pe-5\">First File Date</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let s of stores\">\n <td class=\"ps-5 fs-7\">{{ s.storeId }}</td>\n <td class=\"fs-7\">{{ s.storeName || '\u2014' }}</td>\n <td class=\"fs-7\">\n <span class=\"badge\"\n [ngClass]=\"s.status === 'active' ? 'badge-light-success' : 'badge-light-secondary'\">\n {{ s.status || '\u2014' }}\n </span>\n </td>\n <td class=\"pe-5 fs-7\">{{ s.firstFileDate || '\u2014' }}</td>\n </tr>\n <tr *ngIf=\"!stores?.length\">\n <td colspan=\"4\" class=\"text-center text-muted py-5\">No newly onboarded stores this month.</td>\n </tr>\n </tbody>\n </table>\n </div>\n</div>\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-light\" (click)=\"activeModal.dismiss()\">Close</button>\n</div>", styles: [".modal-title{font-weight:700;color:#101828}\n"] }]
|
|
20
|
+
}], ctorParameters: () => [{ type: i1.NgbActiveModal }], propDecorators: { stores: [{
|
|
21
|
+
type: Input
|
|
22
|
+
}], monthLabel: [{
|
|
23
|
+
type: Input
|
|
24
|
+
}] } });
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXN0b3Jlcy1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtYmlsbGluZy9zcmMvbGliL2NvbXBvbmVudHMvZGFpbHktcHJpY2luZy9uZXctc3RvcmVzLW1vZGFsL25ldy1zdG9yZXMtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2RhaWx5LXByaWNpbmcvbmV3LXN0b3Jlcy1tb2RhbC9uZXctc3RvcmVzLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBUWpELE1BQU0sT0FBTyx1QkFBdUI7SUFNZjtJQUxuQiwrRUFBK0U7SUFDL0UsK0RBQStEO0lBQ3RELE1BQU0sR0FBVSxFQUFFLENBQUM7SUFDbkIsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUVqQyxZQUFtQixXQUEyQjtRQUEzQixnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7SUFBRyxDQUFDO3dHQU52Qyx1QkFBdUI7NEZBQXZCLHVCQUF1QixvSENScEMscTVEQXVDTTs7NEZEL0JPLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0I7bUZBT3ZCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1uZXctc3RvcmVzLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25ldy1zdG9yZXMtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vbmV3LXN0b3Jlcy1tb2RhbC5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgTmV3U3RvcmVzTW9kYWxDb21wb25lbnQge1xuICAvLyBOZXdseSBvbmJvYXJkZWQgc3RvcmVzIChmaXJzdCBmaWxlIGluIHRoZSBjdXJyZW50IG1vbnRoKS4gUGFzc2VkIGluIGZyb20gdGhlXG4gIC8vIEJpbGxpbmcgQnJlYWtkb3duIHBhZ2Ugc28gdGhlIG1vZGFsIG5lZWRzIG5vIGV4dHJhIEFQSSBjYWxsLlxuICBASW5wdXQoKSBzdG9yZXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIG1vbnRoTGFiZWw6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwpIHt9XG59IiwiPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxkaXY+XG4gICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlIG1iLTBcIj5OZXdseSBPbmJvYXJkZWQgU3RvcmVzPC9oNT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5GaXJzdCBmaWxlIGluIHt7IG1vbnRoTGFiZWwgfHwgJ2N1cnJlbnQgbW9udGgnIH19IMK3IHt7IHN0b3Jlcz8ubGVuZ3RoIHx8IDAgfX0gc3RvcmVzPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwiYWN0aXZlTW9kYWwuZGlzbWlzcygpXCI+PC9idXR0b24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHAtMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OjQyMHB4O292ZXJmbG93LXk6YXV0bztcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtcm93LWJvcmRlcmVkIGFsaWduLW1pZGRsZSBtYi0wXCI+XG4gICAgICAgICAgICA8dGhlYWQgY2xhc3M9XCJzdGlja3ktdG9wIGJnLXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZnctYm9sZCBmcy03IHRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwicHMtNVwiPlN0b3JlIElEPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoPlN0b3JlIE5hbWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+U3RhdHVzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwicGUtNVwiPkZpcnN0IEZpbGUgRGF0ZTwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBzIG9mIHN0b3Jlc1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwcy01IGZzLTdcIj57eyBzLnN0b3JlSWQgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJmcy03XCI+e3sgcy5zdG9yZU5hbWUgfHwgJ+KAlCcgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJmcy03XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzLnN0YXR1cyA9PT0gJ2FjdGl2ZScgPyAnYmFkZ2UtbGlnaHQtc3VjY2VzcycgOiAnYmFkZ2UtbGlnaHQtc2Vjb25kYXJ5J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHMuc3RhdHVzIHx8ICfigJQnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInBlLTUgZnMtN1wiPnt7IHMuZmlyc3RGaWxlRGF0ZSB8fCAn4oCUJyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCIhc3RvcmVzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI0XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIHB5LTVcIj5ObyBuZXdseSBvbmJvYXJkZWQgc3RvcmVzIHRoaXMgbW9udGguPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIChjbGljayk9XCJhY3RpdmVNb2RhbC5kaXNtaXNzKClcIj5DbG9zZTwvYnV0dG9uPlxuPC9kaXY+Il19
|
|
@@ -223,12 +223,12 @@ export class InvoicePreviewComponent {
|
|
|
223
223
|
return index;
|
|
224
224
|
}
|
|
225
225
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InvoicePreviewComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.BillingService }, { token: i3.ToastService }], target: i0.ɵɵFactoryTarget.Component });
|
|
226
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: InvoicePreviewComponent, selector: "lib-invoice-preview", inputs: { invoiceData: "invoiceData" }, ngImport: i0, template: "<div class=\"invoice-preview-modal\">\n <div class=\"modal-header\">\n <ul class=\"nav nav-tabs preview-tabs\" role=\"tablist\">\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'invoice'\"\n (click)=\"selectTab('invoice')\" type=\"button\">Invoice</button>\n </li>\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'annexure'\"\n (click)=\"selectTab('annexure')\" type=\"button\">Annexure</button>\n </li>\n </ul>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\" aria-label=\"Close\"></button>\n </div>\n\n <div class=\"modal-body p-0\">\n <!-- INVOICE TAB -->\n <div *ngIf=\"activeTab === 'invoice'\" class=\"invoice-page\">\n <!-- Header row -->\n <div class=\"row align-items-start\">\n <div class=\"col-7\">\n <div class=\"brand\">\n <img src=\"./assets/tango/Images/tangoeye-logo.svg\" alt=\"TangoEye\" class=\"brand-logo\" onerror=\"this.style.display='none'\">\n </div>\n <div class=\"company-block mt-3\">\n <div class=\"company-name\">TANGO IT SOLUTIONS INDIA PRIVATE LTD</div>\n <div>2nd Floor, Apeejay Business Centre, No.12/39,</div>\n <div>Haddows Road, Nungambakkam</div>\n <div>Chennai Tamil Nadu 600006, India</div>\n <div class=\"mt-1\"><strong>GSTIN 33AAGCT3124R1Z2</strong></div>\n <div class=\"mt-1\">MSME / Udyam type : Micro</div>\n <div>MSME / Udyam No. : UDYAM-TN-03-0212399</div>\n </div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"tax-invoice-label\">TAX INVOICE</div>\n <div class=\"invoice-number\"># {{ invoiceData?.invoice }}</div>\n </div>\n </div>\n\n <!-- Bill-to + totals row -->\n <div class=\"row mt-4\">\n <div class=\"col-7\">\n <div class=\"bill-to-label\">BILL TO :</div>\n <div class=\"client-name mt-1\">{{ (invoiceData?.clientName || invoiceData?.companyName) | uppercase }}</div>\n <div class=\"mt-1\" *ngIf=\"invoiceData?.billingAddressLineOne || invoiceData?.companyAddress\">\n {{ invoiceData?.billingAddressLineOne || invoiceData?.companyAddress }}\n </div>\n <div *ngIf=\"invoiceData?.billingAddressLineTwo\">{{ invoiceData?.billingAddressLineTwo }}</div>\n <div *ngIf=\"invoiceData?.billingCity || invoiceData?.billingPinCode || invoiceData?.billingState\">\n {{ invoiceData?.billingCity }}<span *ngIf=\"invoiceData?.billingPinCode\">, {{ invoiceData?.billingPinCode }}</span><span *ngIf=\"invoiceData?.billingState\">, {{ invoiceData?.billingState }}</span><span *ngIf=\"invoiceData?.billingCountry\">, {{ invoiceData?.billingCountry }}</span>\n </div>\n <div class=\"mt-2\" *ngIf=\"invoiceData?.GSTNumber\"><strong>GSTIN {{ invoiceData?.GSTNumber }}</strong></div>\n <div *ngIf=\"invoiceData?.PlaceOfSupply\">Place Of Supply: {{ invoiceData?.PlaceOfSupply }}</div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"invoice-total-label\">Invoice Total <span class=\"invoice-total-amount\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</span></div>\n <table class=\"meta-table ms-auto mt-3\">\n <tr><td class=\"meta-label\">Invoice date :</td><td class=\"meta-value\">{{ invoiceData?.billingDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr><td class=\"meta-label\">Terms :</td><td class=\"meta-value\">Term {{ paymentTermDays }}</td></tr>\n <tr><td class=\"meta-label\">Due Date :</td><td class=\"meta-value\">{{ invoiceData?.dueDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr *ngIf=\"invoiceData?.PoNum || invoiceData?.poNumber\"><td class=\"meta-label\">P.O.# :</td><td class=\"meta-value\">{{ invoiceData?.PoNum || invoiceData?.poNumber }}</td></tr>\n </table>\n </div>\n </div>\n\n <!-- Line items -->\n <table class=\"items-table mt-4\">\n <thead>\n <tr>\n <th class=\"col-index\">#</th>\n <th class=\"col-product\">Product & Description</th>\n <th class=\"col-month\">Month</th>\n <th class=\"col-hsn\">HSN/SAC</th>\n <th class=\"col-count text-center\">Quantity</th>\n <th class=\"col-rate text-end\">Rate</th>\n <th class=\"col-amount text-end\">Amount</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of invoiceData?.products; let i = index; trackBy: trackByIndex\">\n <td>{{ i + 1 }}</td>\n <td>\n <div class=\"product-name\">{{ formatProductName(item?.productName) }}</div>\n <div class=\"product-desc\">{{ item?.description }}</div>\n </td>\n <!-- Month is the product's billing month stored on the line item\n (advance invoices bill a future month while billingDate is the\n creation date). Fall back to billingDate for legacy rows. -->\n <td class=\"nowrap\">{{ item?.month || (invoiceData?.billingDate | date:'MMM yyyy') }}</td>\n <td>{{ item?.hsn || item?.hsnCode || '998314' }}</td>\n <td class=\"text-center\"><strong>{{ item?.storeCount || invoiceData?.stores?.length || '' }}</strong></td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.price) }}</td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.amount) }}</td>\n </tr>\n </tbody>\n </table>\n\n <!-- Totals -->\n <div class=\"row mt-3\">\n <div class=\"col-7\"></div>\n <div class=\"col-5\">\n <table class=\"totals-table ms-auto\">\n <tr><td class=\"totals-label\">Sub Total</td><td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.amount) }}</td></tr>\n <tr *ngFor=\"let t of invoiceData?.tax\">\n <td class=\"totals-label\">{{ t?.type || t?.taxName || t?.name }} ({{ t?.value ?? t?.taxPercentage ?? t?.percentage }}%)</td>\n <td class=\"totals-value nowrap\">{{ currencySymbol() }} {{ formatINR(t?.taxAmount) }}</td>\n </tr>\n <tr class=\"totals-total-row\">\n <td class=\"totals-label\">Total Amount</td>\n <td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</td>\n </tr>\n <tr class=\"totals-words-row\">\n <td class=\"totals-label\">Total In Words</td>\n <td class=\"totals-value words\">{{ totalInWords }}</td>\n </tr>\n </table>\n </div>\n </div>\n\n <!-- Payment details -->\n <div class=\"thanks mt-4\">Thanks for your business!</div>\n <table class=\"payment-table mt-2\">\n <tr><td class=\"payment-label\">Beneficiary Name</td><td class=\"payment-value\"><strong>{{ bankDetails?.beneficiaryName }}</strong></td></tr>\n <tr><td class=\"payment-label\">Account Number</td><td class=\"payment-value\"><strong>{{ bankDetails?.accountNumber }}</strong></td></tr>\n <tr><td class=\"payment-label\">IFSC Code</td><td class=\"payment-value\"><strong>{{ bankDetails?.ifsc }}</strong></td></tr>\n <tr><td class=\"payment-label\">Payment Type</td><td class=\"payment-value\"><strong>{{ bankDetails?.paymentType }}</strong></td></tr>\n <tr><td class=\"payment-label\">SWIFT Code</td><td class=\"payment-value\"><strong>{{ bankDetails?.swift }}</strong></td></tr>\n <tr><td class=\"payment-label\">Branch</td><td class=\"payment-value\"><strong>{{ bankDetails?.branch }}</strong></td></tr>\n </table>\n\n <div class=\"system-note mt-4\">This is a system generated invoice. No signature required</div>\n </div>\n\n <!-- ANNEXURE TAB -->\n <div *ngIf=\"activeTab === 'annexure'\" class=\"annexure-page\">\n <div *ngIf=\"annexureLoading\" class=\"loading-state\">\n <div class=\"spinner-border text-primary\" role=\"status\"><span class=\"visually-hidden\">Loading...</span></div>\n </div>\n <div *ngIf=\"!annexureLoading && annexureError\" class=\"error-state\">\n <p>Failed to load annexure.</p>\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"retryAnnexure()\">Retry</button>\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData !== null && annexureData.length === 0\" class=\"empty-state\">\n No annexure data for this invoice.\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\"\n class=\"annexure-toolbar\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"downloadAnnexureXlsx()\">\n Export as XLSX\n </button>\n </div>\n <table *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\" class=\"annexure-table\">\n <thead>\n <tr>\n <th>Store Name</th>\n <th>Products</th>\n <th>Store ID</th>\n <th>Deployment Date</th>\n <th>Period</th>\n <th>Pricing Method</th>\n <th class=\"text-center\">Billing Days</th>\n <th class=\"text-center\">Qty</th>\n <th class=\"text-end\">Unit Price</th>\n <th class=\"text-end\">Price Per Month</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of annexureData; trackBy: trackByIndex\">\n <td>{{ row?.storeName }}</td>\n <td>{{ row?.productName }}</td>\n <td>{{ row?.storeId }}</td>\n <td>{{ row?.edgefirstFileDate }}</td>\n <td>{{ row?.period === 'prorate' ? 'Pro-rate' : 'Full month' }}</td>\n <td>{{ row?.unitBasis || 'Per Store' }}</td>\n <td class=\"text-center\"><strong>{{ row?.workingdays }}</strong></td>\n <td class=\"text-center\">{{ row?.units ?? 1 }}</td>\n <td class=\"text-end\">\n {{ row?.currencyType }} {{ formatINR(row?.standardPrice) }}\n <div class=\"unit-basis\">{{ row?.unitBasis || 'Per Store' }}</div>\n </td>\n <td class=\"text-end\"><strong>{{ row?.currencyType }} {{ formatINR(row?.runningCost) }}</strong></td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"annexureTotal != null\">\n <tr>\n <td colspan=\"9\" class=\"text-end\"><strong>Total</strong></td>\n <td class=\"text-end\"><strong>{{ annexureData[0]?.currencyType }} {{ formatINR(annexureTotal) }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-link\" (click)=\"activeModal.dismiss()\">Close</button>\n <button class=\"btn btn-outline-primary\" (click)=\"downloadPdf()\" [disabled]=\"downloading\">\n <span *ngIf=\"!downloading\">Download PDF</span>\n <span *ngIf=\"downloading\">Downloading...</span>\n </button>\n </div>\n</div>", styles: [".invoice-preview-modal{font-family:inherit;font-size:13px;color:#344054;display:flex;flex-direction:column;max-height:calc(100vh - 3.5rem)}.invoice-preview-modal .modal-header{flex:0 0 auto;padding:0 1rem;border-bottom:1px solid #EAECF0;display:flex;align-items:stretch;justify-content:space-between}.invoice-preview-modal .modal-header .preview-tabs{border-bottom:none}.invoice-preview-modal .modal-header .preview-tabs .nav-link{border:none;border-radius:0;color:#667085;padding:12px 16px;background:transparent}.invoice-preview-modal .modal-header .preview-tabs .nav-link.active{color:#00a3ff;border-bottom:2px solid #00A3FF;background:transparent}.invoice-preview-modal .modal-header .btn-close{align-self:center}.invoice-preview-modal .modal-body{background:#fff;flex:1 1 auto;overflow-y:auto;min-height:0}.invoice-preview-modal .invoice-page,.invoice-preview-modal .annexure-page{padding:32px 40px}.invoice-preview-modal .tax-invoice-label{font-size:22px;font-weight:600;color:#00a3ff}.invoice-preview-modal .invoice-number{font-size:18px;font-weight:600;color:#00a3ff}.invoice-preview-modal .company-name{font-weight:700;color:#101828}.invoice-preview-modal .bill-to-label{font-weight:600;color:#667085}.invoice-preview-modal .client-name{font-weight:700;color:#101828;font-size:15px}.invoice-preview-modal .invoice-total-label{font-weight:600;font-size:15px}.invoice-preview-modal .invoice-total-label .invoice-total-amount{color:#101828;font-weight:700;margin-left:8px}.invoice-preview-modal .meta-table td{padding:2px 8px}.invoice-preview-modal .meta-table .meta-label{color:#667085;text-align:right}.invoice-preview-modal .meta-table .meta-value{color:#101828;font-weight:600}.invoice-preview-modal .items-table{width:100%;border-collapse:collapse}.invoice-preview-modal .items-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .items-table td{padding:14px 12px;border-bottom:1px solid #EAECF0;vertical-align:top}.invoice-preview-modal .items-table .product-name{font-weight:600;color:#101828}.invoice-preview-modal .items-table .product-desc{color:#667085;font-size:12px}.invoice-preview-modal .items-table .col-index{width:40px}.invoice-preview-modal .items-table .col-month,.invoice-preview-modal .items-table .col-hsn,.invoice-preview-modal .items-table .col-count{width:100px}.invoice-preview-modal .items-table .col-rate{width:110px}.invoice-preview-modal .items-table .col-amount{width:140px}.invoice-preview-modal .items-table .nowrap{white-space:nowrap}.invoice-preview-modal .totals-table{width:100%}.invoice-preview-modal .totals-table td{padding:6px 12px}.invoice-preview-modal .totals-table .totals-label{color:#667085;text-align:right}.invoice-preview-modal .totals-table .totals-value{color:#101828;font-weight:600;text-align:right}.invoice-preview-modal .totals-table .totals-total-row td{padding-top:12px}.invoice-preview-modal .totals-table .totals-total-row .totals-value{font-size:15px;font-weight:700}.invoice-preview-modal .totals-table .totals-words-row .words{font-weight:600;max-width:280px;white-space:normal;word-wrap:break-word}.invoice-preview-modal .totals-table .nowrap{white-space:nowrap}.invoice-preview-modal .thanks{font-weight:600;color:#101828}.invoice-preview-modal .payment-table{border-collapse:collapse}.invoice-preview-modal .payment-table td{padding:6px 12px}.invoice-preview-modal .payment-table .payment-label{color:#667085}.invoice-preview-modal .system-note{color:#667085;font-size:12px;font-weight:600}.invoice-preview-modal .annexure-table{width:100%;border-collapse:collapse}.invoice-preview-modal .annexure-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .annexure-table td{padding:14px 12px;border-bottom:1px solid #EAECF0}.invoice-preview-modal .annexure-table .unit-basis{font-size:11px;color:#98a2b3;margin-top:2px}.invoice-preview-modal .annexure-table tfoot td{background:#f9fafb;border-top:2px solid #EAECF0;font-size:15px}.invoice-preview-modal .loading-state,.invoice-preview-modal .empty-state,.invoice-preview-modal .error-state{padding:40px;text-align:center;color:#667085}.invoice-preview-modal .modal-footer{flex:0 0 auto}.invoice-preview-modal .annexure-toolbar{display:flex;justify-content:flex-end;padding:8px 0 12px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i4.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i4.DatePipe, name: "date" }] });
|
|
226
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: InvoicePreviewComponent, selector: "lib-invoice-preview", inputs: { invoiceData: "invoiceData" }, ngImport: i0, template: "<div class=\"invoice-preview-modal\">\n <div class=\"modal-header\">\n <ul class=\"nav nav-tabs preview-tabs\" role=\"tablist\">\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'invoice'\"\n (click)=\"selectTab('invoice')\" type=\"button\">Invoice</button>\n </li>\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'annexure'\"\n (click)=\"selectTab('annexure')\" type=\"button\">Annexure</button>\n </li>\n </ul>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\" aria-label=\"Close\"></button>\n </div>\n\n <div class=\"modal-body p-0\">\n <!-- INVOICE TAB -->\n <div *ngIf=\"activeTab === 'invoice'\" class=\"invoice-page\">\n <!-- Header row -->\n <div class=\"row align-items-start\">\n <div class=\"col-7\">\n <div class=\"brand\">\n <img src=\"./assets/tango/Images/tangoeye-logo.svg\" alt=\"TangoEye\" class=\"brand-logo\" onerror=\"this.style.display='none'\">\n </div>\n <div class=\"company-block mt-3\">\n <div class=\"company-name\">TANGO IT SOLUTIONS INDIA PRIVATE LTD</div>\n <div>2nd Floor, Apeejay Business Centre, No.12/39,</div>\n <div>Haddows Road, Nungambakkam</div>\n <div>Chennai Tamil Nadu 600006, India</div>\n <div class=\"mt-1\"><strong>GSTIN 33AAGCT3124R1Z2</strong></div>\n <div class=\"mt-1\">MSME / Udyam type : Micro</div>\n <div>MSME / Udyam No. : UDYAM-TN-03-0212399</div>\n </div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"tax-invoice-label\">TAX INVOICE</div>\n <div class=\"invoice-number\"># {{ invoiceData?.invoice }}</div>\n </div>\n </div>\n\n <!-- Bill-to + totals row -->\n <div class=\"row mt-4\">\n <div class=\"col-7\">\n <div class=\"bill-to-label\">BILL TO :</div>\n <div class=\"client-name mt-1\">{{ (invoiceData?.clientName || invoiceData?.companyName) | uppercase }}</div>\n <div class=\"mt-1\" *ngIf=\"invoiceData?.billingAddressLineOne || invoiceData?.companyAddress\">\n {{ invoiceData?.billingAddressLineOne || invoiceData?.companyAddress }}\n </div>\n <div *ngIf=\"invoiceData?.billingAddressLineTwo\">{{ invoiceData?.billingAddressLineTwo }}</div>\n <div *ngIf=\"invoiceData?.billingCity || invoiceData?.billingPinCode || invoiceData?.billingState\">\n {{ invoiceData?.billingCity }}<span *ngIf=\"invoiceData?.billingPinCode\">, {{ invoiceData?.billingPinCode }}</span><span *ngIf=\"invoiceData?.billingState\">, {{ invoiceData?.billingState }}</span><span *ngIf=\"invoiceData?.billingCountry\">, {{ invoiceData?.billingCountry }}</span>\n </div>\n <div class=\"mt-2\" *ngIf=\"invoiceData?.GSTNumber\"><strong>GSTIN {{ invoiceData?.GSTNumber }}</strong></div>\n <div *ngIf=\"invoiceData?.PlaceOfSupply\">Place Of Supply: {{ invoiceData?.PlaceOfSupply }}</div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"invoice-total-label\">Invoice Total <span class=\"invoice-total-amount\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</span></div>\n <table class=\"meta-table ms-auto mt-3\">\n <tr><td class=\"meta-label\">Invoice date :</td><td class=\"meta-value\">{{ invoiceData?.billingDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr><td class=\"meta-label\">Terms :</td><td class=\"meta-value\">Term {{ paymentTermDays }}</td></tr>\n <tr><td class=\"meta-label\">Due Date :</td><td class=\"meta-value\">{{ invoiceData?.dueDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr *ngIf=\"invoiceData?.purchaseOrderNumber || invoiceData?.PoNum || invoiceData?.poNumber\"><td class=\"meta-label\">P.O.# :</td><td class=\"meta-value\">{{ invoiceData?.purchaseOrderNumber || invoiceData?.PoNum || invoiceData?.poNumber }}</td></tr>\n </table>\n </div>\n </div>\n\n <!-- Line items -->\n <table class=\"items-table mt-4\">\n <thead>\n <tr>\n <th class=\"col-index\">#</th>\n <th class=\"col-product\">Product & Description</th>\n <th class=\"col-month\">Month</th>\n <th class=\"col-hsn\">HSN/SAC</th>\n <th class=\"col-count text-center\">Quantity</th>\n <th class=\"col-rate text-end\">Rate</th>\n <th class=\"col-amount text-end\">Amount</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of invoiceData?.products; let i = index; trackBy: trackByIndex\">\n <td>{{ i + 1 }}</td>\n <td>\n <div class=\"product-name\">{{ formatProductName(item?.productName) }}</div>\n <div class=\"product-desc\">{{ item?.description }}</div>\n </td>\n <!-- Month is the product's billing month stored on the line item\n (advance invoices bill a future month while billingDate is the\n creation date). Fall back to billingDate for legacy rows. -->\n <td class=\"nowrap\">{{ item?.month || (invoiceData?.billingDate | date:'MMM yyyy') }}</td>\n <td>{{ item?.hsn || item?.hsnCode || '998314' }}</td>\n <td class=\"text-center\"><strong>{{ item?.storeCount || invoiceData?.stores?.length || '' }}</strong></td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.price) }}</td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.amount) }}</td>\n </tr>\n </tbody>\n </table>\n\n <!-- Totals -->\n <div class=\"row mt-3\">\n <div class=\"col-7\"></div>\n <div class=\"col-5\">\n <table class=\"totals-table ms-auto\">\n <tr><td class=\"totals-label\">Sub Total</td><td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.amount) }}</td></tr>\n <tr *ngFor=\"let t of invoiceData?.tax\">\n <td class=\"totals-label\">{{ t?.type || t?.taxName || t?.name }} ({{ t?.value ?? t?.taxPercentage ?? t?.percentage }}%)</td>\n <td class=\"totals-value nowrap\">{{ currencySymbol() }} {{ formatINR(t?.taxAmount) }}</td>\n </tr>\n <tr class=\"totals-total-row\">\n <td class=\"totals-label\">Total Amount</td>\n <td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</td>\n </tr>\n <tr class=\"totals-words-row\">\n <td class=\"totals-label\">Total In Words</td>\n <td class=\"totals-value words\">{{ totalInWords }}</td>\n </tr>\n </table>\n </div>\n </div>\n\n <!-- Payment details -->\n <div class=\"thanks mt-4\">Thanks for your business!</div>\n <table class=\"payment-table mt-2\">\n <tr><td class=\"payment-label\">Beneficiary Name</td><td class=\"payment-value\"><strong>{{ bankDetails?.beneficiaryName }}</strong></td></tr>\n <tr><td class=\"payment-label\">Account Number</td><td class=\"payment-value\"><strong>{{ bankDetails?.accountNumber }}</strong></td></tr>\n <tr><td class=\"payment-label\">IFSC Code</td><td class=\"payment-value\"><strong>{{ bankDetails?.ifsc }}</strong></td></tr>\n <tr><td class=\"payment-label\">Payment Type</td><td class=\"payment-value\"><strong>{{ bankDetails?.paymentType }}</strong></td></tr>\n <tr><td class=\"payment-label\">SWIFT Code</td><td class=\"payment-value\"><strong>{{ bankDetails?.swift }}</strong></td></tr>\n <tr><td class=\"payment-label\">Branch</td><td class=\"payment-value\"><strong>{{ bankDetails?.branch }}</strong></td></tr>\n </table>\n\n <div class=\"system-note mt-4\">This is a system generated invoice. No signature required</div>\n </div>\n\n <!-- ANNEXURE TAB -->\n <div *ngIf=\"activeTab === 'annexure'\" class=\"annexure-page\">\n <div *ngIf=\"annexureLoading\" class=\"loading-state\">\n <div class=\"spinner-border text-primary\" role=\"status\"><span class=\"visually-hidden\">Loading...</span></div>\n </div>\n <div *ngIf=\"!annexureLoading && annexureError\" class=\"error-state\">\n <p>Failed to load annexure.</p>\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"retryAnnexure()\">Retry</button>\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData !== null && annexureData.length === 0\" class=\"empty-state\">\n No annexure data for this invoice.\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\"\n class=\"annexure-toolbar\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"downloadAnnexureXlsx()\">\n Export as XLSX\n </button>\n </div>\n <table *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\" class=\"annexure-table\">\n <thead>\n <tr>\n <th>Store Name</th>\n <th>Products</th>\n <th>Store ID</th>\n <th>Deployment Date</th>\n <th>Period</th>\n <th>Pricing Method</th>\n <th class=\"text-center\">Billing Days</th>\n <th class=\"text-center\">Qty</th>\n <th class=\"text-end\">Unit Price</th>\n <th class=\"text-end\">Price Per Month</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of annexureData; trackBy: trackByIndex\">\n <td>{{ row?.storeName }}</td>\n <td>{{ row?.productName }}</td>\n <td>{{ row?.storeId }}</td>\n <td>{{ row?.edgefirstFileDate }}</td>\n <td>{{ row?.period === 'prorate' ? 'Pro-rate' : 'Full month' }}</td>\n <td>{{ row?.unitBasis || 'Per Store' }}</td>\n <td class=\"text-center\"><strong>{{ row?.workingdays }}</strong></td>\n <td class=\"text-center\">{{ row?.units ?? 1 }}</td>\n <td class=\"text-end\">\n {{ row?.currencyType }} {{ formatINR(row?.standardPrice) }}\n <div class=\"unit-basis\">{{ row?.unitBasis || 'Per Store' }}</div>\n </td>\n <td class=\"text-end\"><strong>{{ row?.currencyType }} {{ formatINR(row?.runningCost) }}</strong></td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"annexureTotal != null\">\n <tr>\n <td colspan=\"9\" class=\"text-end\"><strong>Total</strong></td>\n <td class=\"text-end\"><strong>{{ annexureData[0]?.currencyType }} {{ formatINR(annexureTotal) }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-link\" (click)=\"activeModal.dismiss()\">Close</button>\n <button class=\"btn btn-outline-primary\" (click)=\"downloadPdf()\" [disabled]=\"downloading\">\n <span *ngIf=\"!downloading\">Download PDF</span>\n <span *ngIf=\"downloading\">Downloading...</span>\n </button>\n </div>\n</div>", styles: [".invoice-preview-modal{font-family:inherit;font-size:13px;color:#344054;display:flex;flex-direction:column;max-height:calc(100vh - 3.5rem)}.invoice-preview-modal .modal-header{flex:0 0 auto;padding:0 1rem;border-bottom:1px solid #EAECF0;display:flex;align-items:stretch;justify-content:space-between}.invoice-preview-modal .modal-header .preview-tabs{border-bottom:none}.invoice-preview-modal .modal-header .preview-tabs .nav-link{border:none;border-radius:0;color:#667085;padding:12px 16px;background:transparent}.invoice-preview-modal .modal-header .preview-tabs .nav-link.active{color:#00a3ff;border-bottom:2px solid #00A3FF;background:transparent}.invoice-preview-modal .modal-header .btn-close{align-self:center}.invoice-preview-modal .modal-body{background:#fff;flex:1 1 auto;overflow-y:auto;min-height:0}.invoice-preview-modal .invoice-page,.invoice-preview-modal .annexure-page{padding:32px 40px}.invoice-preview-modal .tax-invoice-label{font-size:22px;font-weight:600;color:#00a3ff}.invoice-preview-modal .invoice-number{font-size:18px;font-weight:600;color:#00a3ff}.invoice-preview-modal .company-name{font-weight:700;color:#101828}.invoice-preview-modal .bill-to-label{font-weight:600;color:#667085}.invoice-preview-modal .client-name{font-weight:700;color:#101828;font-size:15px}.invoice-preview-modal .invoice-total-label{font-weight:600;font-size:15px}.invoice-preview-modal .invoice-total-label .invoice-total-amount{color:#101828;font-weight:700;margin-left:8px}.invoice-preview-modal .meta-table td{padding:2px 8px}.invoice-preview-modal .meta-table .meta-label{color:#667085;text-align:right}.invoice-preview-modal .meta-table .meta-value{color:#101828;font-weight:600}.invoice-preview-modal .items-table{width:100%;border-collapse:collapse}.invoice-preview-modal .items-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .items-table td{padding:14px 12px;border-bottom:1px solid #EAECF0;vertical-align:top}.invoice-preview-modal .items-table .product-name{font-weight:600;color:#101828}.invoice-preview-modal .items-table .product-desc{color:#667085;font-size:12px}.invoice-preview-modal .items-table .col-index{width:40px}.invoice-preview-modal .items-table .col-month,.invoice-preview-modal .items-table .col-hsn,.invoice-preview-modal .items-table .col-count{width:100px}.invoice-preview-modal .items-table .col-rate{width:110px}.invoice-preview-modal .items-table .col-amount{width:140px}.invoice-preview-modal .items-table .nowrap{white-space:nowrap}.invoice-preview-modal .totals-table{width:100%}.invoice-preview-modal .totals-table td{padding:6px 12px}.invoice-preview-modal .totals-table .totals-label{color:#667085;text-align:right}.invoice-preview-modal .totals-table .totals-value{color:#101828;font-weight:600;text-align:right}.invoice-preview-modal .totals-table .totals-total-row td{padding-top:12px}.invoice-preview-modal .totals-table .totals-total-row .totals-value{font-size:15px;font-weight:700}.invoice-preview-modal .totals-table .totals-words-row .words{font-weight:600;max-width:280px;white-space:normal;word-wrap:break-word}.invoice-preview-modal .totals-table .nowrap{white-space:nowrap}.invoice-preview-modal .thanks{font-weight:600;color:#101828}.invoice-preview-modal .payment-table{border-collapse:collapse}.invoice-preview-modal .payment-table td{padding:6px 12px}.invoice-preview-modal .payment-table .payment-label{color:#667085}.invoice-preview-modal .system-note{color:#667085;font-size:12px;font-weight:600}.invoice-preview-modal .annexure-table{width:100%;border-collapse:collapse}.invoice-preview-modal .annexure-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .annexure-table td{padding:14px 12px;border-bottom:1px solid #EAECF0}.invoice-preview-modal .annexure-table .unit-basis{font-size:11px;color:#98a2b3;margin-top:2px}.invoice-preview-modal .annexure-table tfoot td{background:#f9fafb;border-top:2px solid #EAECF0;font-size:15px}.invoice-preview-modal .loading-state,.invoice-preview-modal .empty-state,.invoice-preview-modal .error-state{padding:40px;text-align:center;color:#667085}.invoice-preview-modal .modal-footer{flex:0 0 auto}.invoice-preview-modal .annexure-toolbar{display:flex;justify-content:flex-end;padding:8px 0 12px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i4.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i4.DatePipe, name: "date" }] });
|
|
227
227
|
}
|
|
228
228
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InvoicePreviewComponent, decorators: [{
|
|
229
229
|
type: Component,
|
|
230
|
-
args: [{ selector: 'lib-invoice-preview', template: "<div class=\"invoice-preview-modal\">\n <div class=\"modal-header\">\n <ul class=\"nav nav-tabs preview-tabs\" role=\"tablist\">\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'invoice'\"\n (click)=\"selectTab('invoice')\" type=\"button\">Invoice</button>\n </li>\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'annexure'\"\n (click)=\"selectTab('annexure')\" type=\"button\">Annexure</button>\n </li>\n </ul>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\" aria-label=\"Close\"></button>\n </div>\n\n <div class=\"modal-body p-0\">\n <!-- INVOICE TAB -->\n <div *ngIf=\"activeTab === 'invoice'\" class=\"invoice-page\">\n <!-- Header row -->\n <div class=\"row align-items-start\">\n <div class=\"col-7\">\n <div class=\"brand\">\n <img src=\"./assets/tango/Images/tangoeye-logo.svg\" alt=\"TangoEye\" class=\"brand-logo\" onerror=\"this.style.display='none'\">\n </div>\n <div class=\"company-block mt-3\">\n <div class=\"company-name\">TANGO IT SOLUTIONS INDIA PRIVATE LTD</div>\n <div>2nd Floor, Apeejay Business Centre, No.12/39,</div>\n <div>Haddows Road, Nungambakkam</div>\n <div>Chennai Tamil Nadu 600006, India</div>\n <div class=\"mt-1\"><strong>GSTIN 33AAGCT3124R1Z2</strong></div>\n <div class=\"mt-1\">MSME / Udyam type : Micro</div>\n <div>MSME / Udyam No. : UDYAM-TN-03-0212399</div>\n </div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"tax-invoice-label\">TAX INVOICE</div>\n <div class=\"invoice-number\"># {{ invoiceData?.invoice }}</div>\n </div>\n </div>\n\n <!-- Bill-to + totals row -->\n <div class=\"row mt-4\">\n <div class=\"col-7\">\n <div class=\"bill-to-label\">BILL TO :</div>\n <div class=\"client-name mt-1\">{{ (invoiceData?.clientName || invoiceData?.companyName) | uppercase }}</div>\n <div class=\"mt-1\" *ngIf=\"invoiceData?.billingAddressLineOne || invoiceData?.companyAddress\">\n {{ invoiceData?.billingAddressLineOne || invoiceData?.companyAddress }}\n </div>\n <div *ngIf=\"invoiceData?.billingAddressLineTwo\">{{ invoiceData?.billingAddressLineTwo }}</div>\n <div *ngIf=\"invoiceData?.billingCity || invoiceData?.billingPinCode || invoiceData?.billingState\">\n {{ invoiceData?.billingCity }}<span *ngIf=\"invoiceData?.billingPinCode\">, {{ invoiceData?.billingPinCode }}</span><span *ngIf=\"invoiceData?.billingState\">, {{ invoiceData?.billingState }}</span><span *ngIf=\"invoiceData?.billingCountry\">, {{ invoiceData?.billingCountry }}</span>\n </div>\n <div class=\"mt-2\" *ngIf=\"invoiceData?.GSTNumber\"><strong>GSTIN {{ invoiceData?.GSTNumber }}</strong></div>\n <div *ngIf=\"invoiceData?.PlaceOfSupply\">Place Of Supply: {{ invoiceData?.PlaceOfSupply }}</div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"invoice-total-label\">Invoice Total <span class=\"invoice-total-amount\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</span></div>\n <table class=\"meta-table ms-auto mt-3\">\n <tr><td class=\"meta-label\">Invoice date :</td><td class=\"meta-value\">{{ invoiceData?.billingDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr><td class=\"meta-label\">Terms :</td><td class=\"meta-value\">Term {{ paymentTermDays }}</td></tr>\n <tr><td class=\"meta-label\">Due Date :</td><td class=\"meta-value\">{{ invoiceData?.dueDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr *ngIf=\"invoiceData?.PoNum || invoiceData?.poNumber\"><td class=\"meta-label\">P.O.# :</td><td class=\"meta-value\">{{ invoiceData?.PoNum || invoiceData?.poNumber }}</td></tr>\n </table>\n </div>\n </div>\n\n <!-- Line items -->\n <table class=\"items-table mt-4\">\n <thead>\n <tr>\n <th class=\"col-index\">#</th>\n <th class=\"col-product\">Product & Description</th>\n <th class=\"col-month\">Month</th>\n <th class=\"col-hsn\">HSN/SAC</th>\n <th class=\"col-count text-center\">Quantity</th>\n <th class=\"col-rate text-end\">Rate</th>\n <th class=\"col-amount text-end\">Amount</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of invoiceData?.products; let i = index; trackBy: trackByIndex\">\n <td>{{ i + 1 }}</td>\n <td>\n <div class=\"product-name\">{{ formatProductName(item?.productName) }}</div>\n <div class=\"product-desc\">{{ item?.description }}</div>\n </td>\n <!-- Month is the product's billing month stored on the line item\n (advance invoices bill a future month while billingDate is the\n creation date). Fall back to billingDate for legacy rows. -->\n <td class=\"nowrap\">{{ item?.month || (invoiceData?.billingDate | date:'MMM yyyy') }}</td>\n <td>{{ item?.hsn || item?.hsnCode || '998314' }}</td>\n <td class=\"text-center\"><strong>{{ item?.storeCount || invoiceData?.stores?.length || '' }}</strong></td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.price) }}</td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.amount) }}</td>\n </tr>\n </tbody>\n </table>\n\n <!-- Totals -->\n <div class=\"row mt-3\">\n <div class=\"col-7\"></div>\n <div class=\"col-5\">\n <table class=\"totals-table ms-auto\">\n <tr><td class=\"totals-label\">Sub Total</td><td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.amount) }}</td></tr>\n <tr *ngFor=\"let t of invoiceData?.tax\">\n <td class=\"totals-label\">{{ t?.type || t?.taxName || t?.name }} ({{ t?.value ?? t?.taxPercentage ?? t?.percentage }}%)</td>\n <td class=\"totals-value nowrap\">{{ currencySymbol() }} {{ formatINR(t?.taxAmount) }}</td>\n </tr>\n <tr class=\"totals-total-row\">\n <td class=\"totals-label\">Total Amount</td>\n <td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</td>\n </tr>\n <tr class=\"totals-words-row\">\n <td class=\"totals-label\">Total In Words</td>\n <td class=\"totals-value words\">{{ totalInWords }}</td>\n </tr>\n </table>\n </div>\n </div>\n\n <!-- Payment details -->\n <div class=\"thanks mt-4\">Thanks for your business!</div>\n <table class=\"payment-table mt-2\">\n <tr><td class=\"payment-label\">Beneficiary Name</td><td class=\"payment-value\"><strong>{{ bankDetails?.beneficiaryName }}</strong></td></tr>\n <tr><td class=\"payment-label\">Account Number</td><td class=\"payment-value\"><strong>{{ bankDetails?.accountNumber }}</strong></td></tr>\n <tr><td class=\"payment-label\">IFSC Code</td><td class=\"payment-value\"><strong>{{ bankDetails?.ifsc }}</strong></td></tr>\n <tr><td class=\"payment-label\">Payment Type</td><td class=\"payment-value\"><strong>{{ bankDetails?.paymentType }}</strong></td></tr>\n <tr><td class=\"payment-label\">SWIFT Code</td><td class=\"payment-value\"><strong>{{ bankDetails?.swift }}</strong></td></tr>\n <tr><td class=\"payment-label\">Branch</td><td class=\"payment-value\"><strong>{{ bankDetails?.branch }}</strong></td></tr>\n </table>\n\n <div class=\"system-note mt-4\">This is a system generated invoice. No signature required</div>\n </div>\n\n <!-- ANNEXURE TAB -->\n <div *ngIf=\"activeTab === 'annexure'\" class=\"annexure-page\">\n <div *ngIf=\"annexureLoading\" class=\"loading-state\">\n <div class=\"spinner-border text-primary\" role=\"status\"><span class=\"visually-hidden\">Loading...</span></div>\n </div>\n <div *ngIf=\"!annexureLoading && annexureError\" class=\"error-state\">\n <p>Failed to load annexure.</p>\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"retryAnnexure()\">Retry</button>\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData !== null && annexureData.length === 0\" class=\"empty-state\">\n No annexure data for this invoice.\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\"\n class=\"annexure-toolbar\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"downloadAnnexureXlsx()\">\n Export as XLSX\n </button>\n </div>\n <table *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\" class=\"annexure-table\">\n <thead>\n <tr>\n <th>Store Name</th>\n <th>Products</th>\n <th>Store ID</th>\n <th>Deployment Date</th>\n <th>Period</th>\n <th>Pricing Method</th>\n <th class=\"text-center\">Billing Days</th>\n <th class=\"text-center\">Qty</th>\n <th class=\"text-end\">Unit Price</th>\n <th class=\"text-end\">Price Per Month</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of annexureData; trackBy: trackByIndex\">\n <td>{{ row?.storeName }}</td>\n <td>{{ row?.productName }}</td>\n <td>{{ row?.storeId }}</td>\n <td>{{ row?.edgefirstFileDate }}</td>\n <td>{{ row?.period === 'prorate' ? 'Pro-rate' : 'Full month' }}</td>\n <td>{{ row?.unitBasis || 'Per Store' }}</td>\n <td class=\"text-center\"><strong>{{ row?.workingdays }}</strong></td>\n <td class=\"text-center\">{{ row?.units ?? 1 }}</td>\n <td class=\"text-end\">\n {{ row?.currencyType }} {{ formatINR(row?.standardPrice) }}\n <div class=\"unit-basis\">{{ row?.unitBasis || 'Per Store' }}</div>\n </td>\n <td class=\"text-end\"><strong>{{ row?.currencyType }} {{ formatINR(row?.runningCost) }}</strong></td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"annexureTotal != null\">\n <tr>\n <td colspan=\"9\" class=\"text-end\"><strong>Total</strong></td>\n <td class=\"text-end\"><strong>{{ annexureData[0]?.currencyType }} {{ formatINR(annexureTotal) }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-link\" (click)=\"activeModal.dismiss()\">Close</button>\n <button class=\"btn btn-outline-primary\" (click)=\"downloadPdf()\" [disabled]=\"downloading\">\n <span *ngIf=\"!downloading\">Download PDF</span>\n <span *ngIf=\"downloading\">Downloading...</span>\n </button>\n </div>\n</div>", styles: [".invoice-preview-modal{font-family:inherit;font-size:13px;color:#344054;display:flex;flex-direction:column;max-height:calc(100vh - 3.5rem)}.invoice-preview-modal .modal-header{flex:0 0 auto;padding:0 1rem;border-bottom:1px solid #EAECF0;display:flex;align-items:stretch;justify-content:space-between}.invoice-preview-modal .modal-header .preview-tabs{border-bottom:none}.invoice-preview-modal .modal-header .preview-tabs .nav-link{border:none;border-radius:0;color:#667085;padding:12px 16px;background:transparent}.invoice-preview-modal .modal-header .preview-tabs .nav-link.active{color:#00a3ff;border-bottom:2px solid #00A3FF;background:transparent}.invoice-preview-modal .modal-header .btn-close{align-self:center}.invoice-preview-modal .modal-body{background:#fff;flex:1 1 auto;overflow-y:auto;min-height:0}.invoice-preview-modal .invoice-page,.invoice-preview-modal .annexure-page{padding:32px 40px}.invoice-preview-modal .tax-invoice-label{font-size:22px;font-weight:600;color:#00a3ff}.invoice-preview-modal .invoice-number{font-size:18px;font-weight:600;color:#00a3ff}.invoice-preview-modal .company-name{font-weight:700;color:#101828}.invoice-preview-modal .bill-to-label{font-weight:600;color:#667085}.invoice-preview-modal .client-name{font-weight:700;color:#101828;font-size:15px}.invoice-preview-modal .invoice-total-label{font-weight:600;font-size:15px}.invoice-preview-modal .invoice-total-label .invoice-total-amount{color:#101828;font-weight:700;margin-left:8px}.invoice-preview-modal .meta-table td{padding:2px 8px}.invoice-preview-modal .meta-table .meta-label{color:#667085;text-align:right}.invoice-preview-modal .meta-table .meta-value{color:#101828;font-weight:600}.invoice-preview-modal .items-table{width:100%;border-collapse:collapse}.invoice-preview-modal .items-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .items-table td{padding:14px 12px;border-bottom:1px solid #EAECF0;vertical-align:top}.invoice-preview-modal .items-table .product-name{font-weight:600;color:#101828}.invoice-preview-modal .items-table .product-desc{color:#667085;font-size:12px}.invoice-preview-modal .items-table .col-index{width:40px}.invoice-preview-modal .items-table .col-month,.invoice-preview-modal .items-table .col-hsn,.invoice-preview-modal .items-table .col-count{width:100px}.invoice-preview-modal .items-table .col-rate{width:110px}.invoice-preview-modal .items-table .col-amount{width:140px}.invoice-preview-modal .items-table .nowrap{white-space:nowrap}.invoice-preview-modal .totals-table{width:100%}.invoice-preview-modal .totals-table td{padding:6px 12px}.invoice-preview-modal .totals-table .totals-label{color:#667085;text-align:right}.invoice-preview-modal .totals-table .totals-value{color:#101828;font-weight:600;text-align:right}.invoice-preview-modal .totals-table .totals-total-row td{padding-top:12px}.invoice-preview-modal .totals-table .totals-total-row .totals-value{font-size:15px;font-weight:700}.invoice-preview-modal .totals-table .totals-words-row .words{font-weight:600;max-width:280px;white-space:normal;word-wrap:break-word}.invoice-preview-modal .totals-table .nowrap{white-space:nowrap}.invoice-preview-modal .thanks{font-weight:600;color:#101828}.invoice-preview-modal .payment-table{border-collapse:collapse}.invoice-preview-modal .payment-table td{padding:6px 12px}.invoice-preview-modal .payment-table .payment-label{color:#667085}.invoice-preview-modal .system-note{color:#667085;font-size:12px;font-weight:600}.invoice-preview-modal .annexure-table{width:100%;border-collapse:collapse}.invoice-preview-modal .annexure-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .annexure-table td{padding:14px 12px;border-bottom:1px solid #EAECF0}.invoice-preview-modal .annexure-table .unit-basis{font-size:11px;color:#98a2b3;margin-top:2px}.invoice-preview-modal .annexure-table tfoot td{background:#f9fafb;border-top:2px solid #EAECF0;font-size:15px}.invoice-preview-modal .loading-state,.invoice-preview-modal .empty-state,.invoice-preview-modal .error-state{padding:40px;text-align:center;color:#667085}.invoice-preview-modal .modal-footer{flex:0 0 auto}.invoice-preview-modal .annexure-toolbar{display:flex;justify-content:flex-end;padding:8px 0 12px}\n"] }]
|
|
230
|
+
args: [{ selector: 'lib-invoice-preview', template: "<div class=\"invoice-preview-modal\">\n <div class=\"modal-header\">\n <ul class=\"nav nav-tabs preview-tabs\" role=\"tablist\">\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'invoice'\"\n (click)=\"selectTab('invoice')\" type=\"button\">Invoice</button>\n </li>\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'annexure'\"\n (click)=\"selectTab('annexure')\" type=\"button\">Annexure</button>\n </li>\n </ul>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\" aria-label=\"Close\"></button>\n </div>\n\n <div class=\"modal-body p-0\">\n <!-- INVOICE TAB -->\n <div *ngIf=\"activeTab === 'invoice'\" class=\"invoice-page\">\n <!-- Header row -->\n <div class=\"row align-items-start\">\n <div class=\"col-7\">\n <div class=\"brand\">\n <img src=\"./assets/tango/Images/tangoeye-logo.svg\" alt=\"TangoEye\" class=\"brand-logo\" onerror=\"this.style.display='none'\">\n </div>\n <div class=\"company-block mt-3\">\n <div class=\"company-name\">TANGO IT SOLUTIONS INDIA PRIVATE LTD</div>\n <div>2nd Floor, Apeejay Business Centre, No.12/39,</div>\n <div>Haddows Road, Nungambakkam</div>\n <div>Chennai Tamil Nadu 600006, India</div>\n <div class=\"mt-1\"><strong>GSTIN 33AAGCT3124R1Z2</strong></div>\n <div class=\"mt-1\">MSME / Udyam type : Micro</div>\n <div>MSME / Udyam No. : UDYAM-TN-03-0212399</div>\n </div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"tax-invoice-label\">TAX INVOICE</div>\n <div class=\"invoice-number\"># {{ invoiceData?.invoice }}</div>\n </div>\n </div>\n\n <!-- Bill-to + totals row -->\n <div class=\"row mt-4\">\n <div class=\"col-7\">\n <div class=\"bill-to-label\">BILL TO :</div>\n <div class=\"client-name mt-1\">{{ (invoiceData?.clientName || invoiceData?.companyName) | uppercase }}</div>\n <div class=\"mt-1\" *ngIf=\"invoiceData?.billingAddressLineOne || invoiceData?.companyAddress\">\n {{ invoiceData?.billingAddressLineOne || invoiceData?.companyAddress }}\n </div>\n <div *ngIf=\"invoiceData?.billingAddressLineTwo\">{{ invoiceData?.billingAddressLineTwo }}</div>\n <div *ngIf=\"invoiceData?.billingCity || invoiceData?.billingPinCode || invoiceData?.billingState\">\n {{ invoiceData?.billingCity }}<span *ngIf=\"invoiceData?.billingPinCode\">, {{ invoiceData?.billingPinCode }}</span><span *ngIf=\"invoiceData?.billingState\">, {{ invoiceData?.billingState }}</span><span *ngIf=\"invoiceData?.billingCountry\">, {{ invoiceData?.billingCountry }}</span>\n </div>\n <div class=\"mt-2\" *ngIf=\"invoiceData?.GSTNumber\"><strong>GSTIN {{ invoiceData?.GSTNumber }}</strong></div>\n <div *ngIf=\"invoiceData?.PlaceOfSupply\">Place Of Supply: {{ invoiceData?.PlaceOfSupply }}</div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"invoice-total-label\">Invoice Total <span class=\"invoice-total-amount\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</span></div>\n <table class=\"meta-table ms-auto mt-3\">\n <tr><td class=\"meta-label\">Invoice date :</td><td class=\"meta-value\">{{ invoiceData?.billingDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr><td class=\"meta-label\">Terms :</td><td class=\"meta-value\">Term {{ paymentTermDays }}</td></tr>\n <tr><td class=\"meta-label\">Due Date :</td><td class=\"meta-value\">{{ invoiceData?.dueDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr *ngIf=\"invoiceData?.purchaseOrderNumber || invoiceData?.PoNum || invoiceData?.poNumber\"><td class=\"meta-label\">P.O.# :</td><td class=\"meta-value\">{{ invoiceData?.purchaseOrderNumber || invoiceData?.PoNum || invoiceData?.poNumber }}</td></tr>\n </table>\n </div>\n </div>\n\n <!-- Line items -->\n <table class=\"items-table mt-4\">\n <thead>\n <tr>\n <th class=\"col-index\">#</th>\n <th class=\"col-product\">Product & Description</th>\n <th class=\"col-month\">Month</th>\n <th class=\"col-hsn\">HSN/SAC</th>\n <th class=\"col-count text-center\">Quantity</th>\n <th class=\"col-rate text-end\">Rate</th>\n <th class=\"col-amount text-end\">Amount</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of invoiceData?.products; let i = index; trackBy: trackByIndex\">\n <td>{{ i + 1 }}</td>\n <td>\n <div class=\"product-name\">{{ formatProductName(item?.productName) }}</div>\n <div class=\"product-desc\">{{ item?.description }}</div>\n </td>\n <!-- Month is the product's billing month stored on the line item\n (advance invoices bill a future month while billingDate is the\n creation date). Fall back to billingDate for legacy rows. -->\n <td class=\"nowrap\">{{ item?.month || (invoiceData?.billingDate | date:'MMM yyyy') }}</td>\n <td>{{ item?.hsn || item?.hsnCode || '998314' }}</td>\n <td class=\"text-center\"><strong>{{ item?.storeCount || invoiceData?.stores?.length || '' }}</strong></td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.price) }}</td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.amount) }}</td>\n </tr>\n </tbody>\n </table>\n\n <!-- Totals -->\n <div class=\"row mt-3\">\n <div class=\"col-7\"></div>\n <div class=\"col-5\">\n <table class=\"totals-table ms-auto\">\n <tr><td class=\"totals-label\">Sub Total</td><td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.amount) }}</td></tr>\n <tr *ngFor=\"let t of invoiceData?.tax\">\n <td class=\"totals-label\">{{ t?.type || t?.taxName || t?.name }} ({{ t?.value ?? t?.taxPercentage ?? t?.percentage }}%)</td>\n <td class=\"totals-value nowrap\">{{ currencySymbol() }} {{ formatINR(t?.taxAmount) }}</td>\n </tr>\n <tr class=\"totals-total-row\">\n <td class=\"totals-label\">Total Amount</td>\n <td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</td>\n </tr>\n <tr class=\"totals-words-row\">\n <td class=\"totals-label\">Total In Words</td>\n <td class=\"totals-value words\">{{ totalInWords }}</td>\n </tr>\n </table>\n </div>\n </div>\n\n <!-- Payment details -->\n <div class=\"thanks mt-4\">Thanks for your business!</div>\n <table class=\"payment-table mt-2\">\n <tr><td class=\"payment-label\">Beneficiary Name</td><td class=\"payment-value\"><strong>{{ bankDetails?.beneficiaryName }}</strong></td></tr>\n <tr><td class=\"payment-label\">Account Number</td><td class=\"payment-value\"><strong>{{ bankDetails?.accountNumber }}</strong></td></tr>\n <tr><td class=\"payment-label\">IFSC Code</td><td class=\"payment-value\"><strong>{{ bankDetails?.ifsc }}</strong></td></tr>\n <tr><td class=\"payment-label\">Payment Type</td><td class=\"payment-value\"><strong>{{ bankDetails?.paymentType }}</strong></td></tr>\n <tr><td class=\"payment-label\">SWIFT Code</td><td class=\"payment-value\"><strong>{{ bankDetails?.swift }}</strong></td></tr>\n <tr><td class=\"payment-label\">Branch</td><td class=\"payment-value\"><strong>{{ bankDetails?.branch }}</strong></td></tr>\n </table>\n\n <div class=\"system-note mt-4\">This is a system generated invoice. No signature required</div>\n </div>\n\n <!-- ANNEXURE TAB -->\n <div *ngIf=\"activeTab === 'annexure'\" class=\"annexure-page\">\n <div *ngIf=\"annexureLoading\" class=\"loading-state\">\n <div class=\"spinner-border text-primary\" role=\"status\"><span class=\"visually-hidden\">Loading...</span></div>\n </div>\n <div *ngIf=\"!annexureLoading && annexureError\" class=\"error-state\">\n <p>Failed to load annexure.</p>\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"retryAnnexure()\">Retry</button>\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData !== null && annexureData.length === 0\" class=\"empty-state\">\n No annexure data for this invoice.\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\"\n class=\"annexure-toolbar\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"downloadAnnexureXlsx()\">\n Export as XLSX\n </button>\n </div>\n <table *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\" class=\"annexure-table\">\n <thead>\n <tr>\n <th>Store Name</th>\n <th>Products</th>\n <th>Store ID</th>\n <th>Deployment Date</th>\n <th>Period</th>\n <th>Pricing Method</th>\n <th class=\"text-center\">Billing Days</th>\n <th class=\"text-center\">Qty</th>\n <th class=\"text-end\">Unit Price</th>\n <th class=\"text-end\">Price Per Month</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of annexureData; trackBy: trackByIndex\">\n <td>{{ row?.storeName }}</td>\n <td>{{ row?.productName }}</td>\n <td>{{ row?.storeId }}</td>\n <td>{{ row?.edgefirstFileDate }}</td>\n <td>{{ row?.period === 'prorate' ? 'Pro-rate' : 'Full month' }}</td>\n <td>{{ row?.unitBasis || 'Per Store' }}</td>\n <td class=\"text-center\"><strong>{{ row?.workingdays }}</strong></td>\n <td class=\"text-center\">{{ row?.units ?? 1 }}</td>\n <td class=\"text-end\">\n {{ row?.currencyType }} {{ formatINR(row?.standardPrice) }}\n <div class=\"unit-basis\">{{ row?.unitBasis || 'Per Store' }}</div>\n </td>\n <td class=\"text-end\"><strong>{{ row?.currencyType }} {{ formatINR(row?.runningCost) }}</strong></td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"annexureTotal != null\">\n <tr>\n <td colspan=\"9\" class=\"text-end\"><strong>Total</strong></td>\n <td class=\"text-end\"><strong>{{ annexureData[0]?.currencyType }} {{ formatINR(annexureTotal) }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-link\" (click)=\"activeModal.dismiss()\">Close</button>\n <button class=\"btn btn-outline-primary\" (click)=\"downloadPdf()\" [disabled]=\"downloading\">\n <span *ngIf=\"!downloading\">Download PDF</span>\n <span *ngIf=\"downloading\">Downloading...</span>\n </button>\n </div>\n</div>", styles: [".invoice-preview-modal{font-family:inherit;font-size:13px;color:#344054;display:flex;flex-direction:column;max-height:calc(100vh - 3.5rem)}.invoice-preview-modal .modal-header{flex:0 0 auto;padding:0 1rem;border-bottom:1px solid #EAECF0;display:flex;align-items:stretch;justify-content:space-between}.invoice-preview-modal .modal-header .preview-tabs{border-bottom:none}.invoice-preview-modal .modal-header .preview-tabs .nav-link{border:none;border-radius:0;color:#667085;padding:12px 16px;background:transparent}.invoice-preview-modal .modal-header .preview-tabs .nav-link.active{color:#00a3ff;border-bottom:2px solid #00A3FF;background:transparent}.invoice-preview-modal .modal-header .btn-close{align-self:center}.invoice-preview-modal .modal-body{background:#fff;flex:1 1 auto;overflow-y:auto;min-height:0}.invoice-preview-modal .invoice-page,.invoice-preview-modal .annexure-page{padding:32px 40px}.invoice-preview-modal .tax-invoice-label{font-size:22px;font-weight:600;color:#00a3ff}.invoice-preview-modal .invoice-number{font-size:18px;font-weight:600;color:#00a3ff}.invoice-preview-modal .company-name{font-weight:700;color:#101828}.invoice-preview-modal .bill-to-label{font-weight:600;color:#667085}.invoice-preview-modal .client-name{font-weight:700;color:#101828;font-size:15px}.invoice-preview-modal .invoice-total-label{font-weight:600;font-size:15px}.invoice-preview-modal .invoice-total-label .invoice-total-amount{color:#101828;font-weight:700;margin-left:8px}.invoice-preview-modal .meta-table td{padding:2px 8px}.invoice-preview-modal .meta-table .meta-label{color:#667085;text-align:right}.invoice-preview-modal .meta-table .meta-value{color:#101828;font-weight:600}.invoice-preview-modal .items-table{width:100%;border-collapse:collapse}.invoice-preview-modal .items-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .items-table td{padding:14px 12px;border-bottom:1px solid #EAECF0;vertical-align:top}.invoice-preview-modal .items-table .product-name{font-weight:600;color:#101828}.invoice-preview-modal .items-table .product-desc{color:#667085;font-size:12px}.invoice-preview-modal .items-table .col-index{width:40px}.invoice-preview-modal .items-table .col-month,.invoice-preview-modal .items-table .col-hsn,.invoice-preview-modal .items-table .col-count{width:100px}.invoice-preview-modal .items-table .col-rate{width:110px}.invoice-preview-modal .items-table .col-amount{width:140px}.invoice-preview-modal .items-table .nowrap{white-space:nowrap}.invoice-preview-modal .totals-table{width:100%}.invoice-preview-modal .totals-table td{padding:6px 12px}.invoice-preview-modal .totals-table .totals-label{color:#667085;text-align:right}.invoice-preview-modal .totals-table .totals-value{color:#101828;font-weight:600;text-align:right}.invoice-preview-modal .totals-table .totals-total-row td{padding-top:12px}.invoice-preview-modal .totals-table .totals-total-row .totals-value{font-size:15px;font-weight:700}.invoice-preview-modal .totals-table .totals-words-row .words{font-weight:600;max-width:280px;white-space:normal;word-wrap:break-word}.invoice-preview-modal .totals-table .nowrap{white-space:nowrap}.invoice-preview-modal .thanks{font-weight:600;color:#101828}.invoice-preview-modal .payment-table{border-collapse:collapse}.invoice-preview-modal .payment-table td{padding:6px 12px}.invoice-preview-modal .payment-table .payment-label{color:#667085}.invoice-preview-modal .system-note{color:#667085;font-size:12px;font-weight:600}.invoice-preview-modal .annexure-table{width:100%;border-collapse:collapse}.invoice-preview-modal .annexure-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .annexure-table td{padding:14px 12px;border-bottom:1px solid #EAECF0}.invoice-preview-modal .annexure-table .unit-basis{font-size:11px;color:#98a2b3;margin-top:2px}.invoice-preview-modal .annexure-table tfoot td{background:#f9fafb;border-top:2px solid #EAECF0;font-size:15px}.invoice-preview-modal .loading-state,.invoice-preview-modal .empty-state,.invoice-preview-modal .error-state{padding:40px;text-align:center;color:#667085}.invoice-preview-modal .modal-footer{flex:0 0 auto}.invoice-preview-modal .annexure-toolbar{display:flex;justify-content:flex-end;padding:8px 0 12px}\n"] }]
|
|
231
231
|
}], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.BillingService }, { type: i3.ToastService }], propDecorators: { invoiceData: [{
|
|
232
232
|
type: Input
|
|
233
233
|
}] } });
|
|
234
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9pbnZvaWNlLXByZXZpZXcvaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9pbnZvaWNlLXByZXZpZXcvaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssU0FBUyxNQUFNLFlBQVksQ0FBQztBQUd4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7OztBQU92RCxNQUFNLE9BQU8sdUJBQXVCO0lBNEJ6QjtJQUNDO0lBQ0E7SUE3Qk8sUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFdkMsV0FBVyxDQUFNO0lBRTFCLFNBQVMsR0FBMkIsU0FBUyxDQUFDO0lBRTlDLFlBQVksR0FBaUIsSUFBSSxDQUFDO0lBQ2xDLDBFQUEwRTtJQUMxRSxpREFBaUQ7SUFDakQsYUFBYSxHQUFrQixJQUFJLENBQUM7SUFDcEMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRXRCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFcEIsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSxXQUFXLEdBQVE7UUFDakIsZUFBZSxFQUFFLDBDQUEwQztRQUMz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bnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHsgQmlsbGluZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9iaWxsaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XG5pbXBvcnQgeyBhbW91bnRJbldvcmRzIH0gZnJvbSAnLi9hbW91bnQtaW4td29yZHMudXRpbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1pbnZvaWNlLXByZXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2ludm9pY2UtcHJldmlldy5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgSW52b2ljZVByZXZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBJbnB1dCgpIGludm9pY2VEYXRhOiBhbnk7XG5cbiAgYWN0aXZlVGFiOiAnaW52b2ljZScgfCAnYW5uZXh1cmUnID0gJ2ludm9pY2UnO1xuXG4gIGFubmV4dXJlRGF0YTogYW55W10gfCBudWxsID0gbnVsbDtcbiAgLy8gR3JhbmQgdG90YWwgb2YgYWxsIGFubmV4dXJlIHJvd3MgKGNvbXB1dGVkIGJ5IHRoZSBiYWNrZW5kIHdpdGggdGhlIHNhbWVcbiAgLy8gcGVyLWNhbWVyYSAvIHBlci16b25lIHJ1bGVzIHRoZSBpbnZvaWNlIHVzZXMpLlxuICBhbm5leHVyZVRvdGFsOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgYW5uZXh1cmVMb2FkaW5nID0gZmFsc2U7XG4gIGFubmV4dXJlRXJyb3IgPSBmYWxzZTtcblxuICBkb3dubG9hZGluZyA9IGZhbHNlO1xuXG4gIC8vIEZpeGVkIGJlbmVmaWNpYXJ5IGFjY291bnQg4oCUIGhhcmRjb2RlZCB0byBtYXRjaCB0aGUgUERGIGV4YWN0bHkgKE5PVCBmcm9tXG4gIC8vIHRoZSBEQiksIHNvIHRoZSBwcmV2aWV3IGFuZCB0aGUgZG93bmxvYWRlZCBQREYgYWx3YXlzIHNob3cgdGhlIHNhbWUgdGhpbmcuXG4gIGJhbmtEZXRhaWxzOiBhbnkgPSB7XG4gICAgYmVuZWZpY2lhcnlOYW1lOiAnVGFuZ28gSVQgU29sdXRpb25zIEluZGlhIFByaXZhdGUgTGltaXRlZCcsXG4gICAgYWNjb3VudE51bWJlcjogJzUwMjAwMDI3NDQxNDMzJyxcbiAgICBpZnNjOiAnSERGQzAwMDAzODYnLFxuICAgIHN3aWZ0OiAnSERGQ0lOQkJDSEUnLFxuICAgIGJyYW5jaDogJ1NhbnRob21lLCBDaGVubmFpJyxcbiAgICBwYXltZW50VHlwZTogJ09ubGluZScsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCxcbiAgICBwcml2YXRlIGJpbGxpbmdTZXJ2aWNlOiBCaWxsaW5nU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBCYW5rIGRldGFpbHMgYXJlIGZpeGVkIChzZWUgYmFua0RldGFpbHMgYWJvdmUpIOKAlCBub3RoaW5nIHRvIGZldGNoLlxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgc2VsZWN0VGFiKHRhYjogJ2ludm9pY2UnIHwgJ2FubmV4dXJlJykge1xuICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiO1xuICAgIGlmICh0YWIgPT09ICdhbm5leHVyZScgJiYgdGhpcy5hbm5leHVyZURhdGEgPT09IG51bGwgJiYgIXRoaXMuYW5uZXh1cmVMb2FkaW5nKSB7XG4gICAgICB0aGlzLmxvYWRBbm5leHVyZSgpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRBbm5leHVyZSgpIHtcbiAgICBpZiAoIXRoaXMuaW52b2ljZURhdGE/Ll9pZCkgcmV0dXJuO1xuICAgIHRoaXMuYW5uZXh1cmVMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmFubmV4dXJlRXJyb3IgPSBmYWxzZTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEludm9pY2VBbm5leHVyZSh0aGlzLmludm9pY2VEYXRhLl9pZClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBCYWNrZW5kIGVudmVsb3BlIGlzIHsgY29kZSwgc3RhdHVzLCBkYXRhOiB7IGRhdGE6IFsuLi5dIH0gfSDigJRcbiAgICAgICAgICAvLyB0aGUgY29udHJvbGxlciBjYWxscyBzZW5kU3VjY2Vzcyh7IGRhdGE6IGFubmV4dXJlRGF0YSB9KSBhbmQgdGhlXG4gICAgICAgICAgLy8gcmVzcG9uc2UgbWlkZGxld2FyZSB3cmFwcyB0aGF0IHVuZGVyIGl0cyBvd24gYGRhdGFgIGtleS4gUmVhZFxuICAgICAgICAgIC8vIHRocm91Z2ggYm90aCBsYXllcnMgdG8gZ2V0IHRoZSByb3cgYXJyYXkuXG4gICAgICAgICAgdGhpcy5hbm5leHVyZURhdGEgPSByZXM/LmRhdGE/LmRhdGEgfHwgW107XG4gICAgICAgICAgdGhpcy5hbm5leHVyZVRvdGFsID0gcmVzPy5kYXRhPy50b3RhbEFtb3VudCA/PyBudWxsO1xuICAgICAgICAgIHRoaXMuYW5uZXh1cmVMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hbm5leHVyZUVycm9yID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmFubmV4dXJlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIEV4cG9ydCB0aGUgbG9hZGVkIGFubmV4dXJlIHJvd3MgYXMgYW4gLnhsc3ggZmlsZS4gTWlycm9ycyB0aGUgY29sdW1uc1xuICAvLyBzaG93biBpbiB0aGUgQW5uZXh1cmUgdGFiIHNvIHRoZSBzcHJlYWRzaGVldCBtYXRjaGVzIHdoYXQgdGhlIHVzZXJcbiAgLy8gc2F3IG9uIHNjcmVlbi4gRmlsZW5hbWUgaXMgYCR7aW52b2ljZU51bWJlcn0tYW5uZXh1cmUueGxzeGAuXG4gIGRvd25sb2FkQW5uZXh1cmVYbHN4KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hbm5leHVyZURhdGEgfHwgdGhpcy5hbm5leHVyZURhdGEubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN5bWJvbCA9IHRoaXMuY3VycmVuY3lTeW1ib2woKTtcbiAgICAgIGNvbnN0IHJvd3M6IGFueVtdID0gdGhpcy5hbm5leHVyZURhdGEubWFwKChyb3c6IGFueSkgPT4gKHtcbiAgICAgICAgJ1N0b3JlIE5hbWUnOiByb3c/LnN0b3JlTmFtZSB8fCAnJyxcbiAgICAgICAgJ1Byb2R1Y3QnOiB0aGlzLmZvcm1hdFByb2R1Y3ROYW1lKHJvdz8ucHJvZHVjdE5hbWUpLFxuICAgICAgICAnU3RvcmUgSUQnOiByb3c/LnN0b3JlSWQgfHwgJycsXG4gICAgICAgICdEZXBsb3ltZW50IERhdGUnOiByb3c/LmVkZ2VmaXJzdEZpbGVEYXRlIHx8ICcnLFxuICAgICAgICAnUGVyaW9kJzogcm93Py5wZXJpb2QgPT09ICdwcm9yYXRlJyA/ICdQcm8tcmF0ZScgOiAnRnVsbCBtb250aCcsXG4gICAgICAgICdQcmljaW5nIE1ldGhvZCc6IHJvdz8udW5pdEJhc2lzIHx8ICdQZXIgU3RvcmUnLFxuICAgICAgICAnQmlsbGluZyBEYXlzJzogcm93Py53b3JraW5nZGF5cyA/PyAwLFxuICAgICAgICAnUXR5Jzogcm93Py51bml0cyA/PyAxLFxuICAgICAgICAnVW5pdCBQcmljZSc6IHJvdz8uc3RhbmRhcmRQcmljZSAhPSBudWxsXG4gICAgICAgICAgPyBgJHtzeW1ib2x9ICR7dGhpcy5mb3JtYXRJTlIocm93LnN0YW5kYXJkUHJpY2UpfSAoJHtyb3c/LnVuaXRCYXNpcyB8fCAnUGVyIFN0b3JlJ30pYFxuICAgICAgICAgIDogJycsXG4gICAgICAgICdQcmljZSBQZXIgTW9udGgnOiByb3c/LnJ1bm5pbmdDb3N0ICE9IG51bGxcbiAgICAgICAgICA/IGAke3N5bWJvbH0gJHt0aGlzLmZvcm1hdElOUihyb3cucnVubmluZ0Nvc3QpfWBcbiAgICAgICAgICA6ICcnLFxuICAgICAgfSkpO1xuICAgICAgaWYgKHRoaXMuYW5uZXh1cmVUb3RhbCAhPSBudWxsKSB7XG4gICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgJ1N0b3JlIE5hbWUnOiAnJywgJ1Byb2R1Y3QnOiAnJywgJ1N0b3JlIElEJzogJycsICdEZXBsb3ltZW50IERhdGUnOiAnJyxcbiAgICAgICAgICAnUGVyaW9kJzogJycsICdQcmljaW5nIE1ldGhvZCc6ICcnLFxuICAgICAgICAgICdCaWxsaW5nIERheXMnOiAnJywgJ1F0eSc6ICcnLCAnVW5pdCBQcmljZSc6ICdUb3RhbCcsXG4gICAgICAgICAgJ1ByaWNlIFBlciBNb250aCc6IGAke3N5bWJvbH0gJHt0aGlzLmZvcm1hdElOUih0aGlzLmFubmV4dXJlVG90YWwpfWAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgd29ya3NoZWV0ID0gWExTWC51dGlscy5qc29uX3RvX3NoZWV0KHJvd3MpO1xuICAgICAgY29uc3Qgd29ya2Jvb2sgPSB7IFNoZWV0czogeyBBbm5leHVyZTogd29ya3NoZWV0IH0sIFNoZWV0TmFtZXM6IFsnQW5uZXh1cmUnXSB9O1xuICAgICAgY29uc3QgYnVmZmVyOiBBcnJheUJ1ZmZlciA9IFhMU1gud3JpdGUod29ya2Jvb2ssIHsgYm9va1R5cGU6ICd4bHN4JywgdHlwZTogJ2FycmF5JyB9KTtcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xuICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7Y2hhcnNldD1VVEYtOCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNhZmVJbnZvaWNlTm8gPSAodGhpcy5pbnZvaWNlRGF0YT8uaW52b2ljZSB8fCAnaW52b2ljZScpLnJlcGxhY2UoL1tcXFxcLzoqP1wiPD58XFxyXFxuXS9nLCAnJyk7XG4gICAgICBGaWxlU2F2ZXIuc2F2ZUFzKGJsb2IsIGAke3NhZmVJbnZvaWNlTm99LWFubmV4dXJlLnhsc3hgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBleHBvcnQgYW5uZXh1cmUnKTtcbiAgICB9XG4gIH1cblxuICByZXRyeUFubmV4dXJlKCkge1xuICAgIHRoaXMuYW5uZXh1cmVEYXRhID0gbnVsbDtcbiAgICB0aGlzLmxvYWRBbm5leHVyZSgpO1xuICB9XG5cbiAgZG93bmxvYWRQZGYoKSB7XG4gICAgaWYgKCF0aGlzLmludm9pY2VEYXRhPy5faWQgfHwgdGhpcy5kb3dubG9hZGluZykgcmV0dXJuO1xuICAgIHRoaXMuZG93bmxvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlcSA9IHsgLi4udGhpcy5pbnZvaWNlRGF0YSB9O1xuICAgIHJlcS5jbGllbnRJZCA9IFt0aGlzLmludm9pY2VEYXRhLmNsaWVudElkXTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmludm9pY2VEb3dubG9hZChyZXEpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtyZXNdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnIH0pO1xuICAgICAgICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5pbnZvaWNlRGF0YT8uYmlsbGluZ0RhdGVcbiAgICAgICAgICAgID8gbmV3IERhdGUodGhpcy5pbnZvaWNlRGF0YS5iaWxsaW5nRGF0ZSkudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ2xvbmcnIH0pXG4gICAgICAgICAgICA6ICcnO1xuICAgICAgICAgIGNvbnN0IGJyYW5kTmFtZSA9IHRoaXMuaW52b2ljZURhdGE/LnJlZ2lzdGVyZWRDb21wYW55TmFtZSB8fCB0aGlzLmludm9pY2VEYXRhPy5jb21wYW55TmFtZSB8fCAnJztcbiAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGAke3RoaXMuaW52b2ljZURhdGE/Lmludm9pY2UgfHwgJ2ludm9pY2UnfS0ke21vbnRofS0ke2JyYW5kTmFtZX0ucGRmYFxuICAgICAgICAgICAgLnJlcGxhY2UoL1tcXFxcLzoqP1wiPD58XFxyXFxuXS9nLCAnJykudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgbGluay5ocmVmID0gdXJsO1xuICAgICAgICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgICAgdGhpcy5kb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBkb3dubG9hZCBpbnZvaWNlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gTWlycm9ycyB0aGUgYmFja2VuZCBDVVJSRU5DWV9TWU1CT0xTIG1hcCAodXRpbHMvY3VycmVuY3kuanMpIHNvIHRoZVxuICAvLyBwcmV2aWV3IHNob3dzIHRoZSBzYW1lIHN5bWJvbCB0aGUgUERGIHdpbGwgcmVuZGVyLiBGYWxsYmFjayBpcyAnJCcgZm9yXG4gIC8vIHVua25vd24gY29kZXMgdG8gbWF0Y2ggdGhlIGJhY2tlbmQuXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVuY3lTeW1ib2xzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGlucjogJ+KCuScsXG4gICAgZG9sbGFyOiAnJCcsXG4gICAgc2luZ2Fwb3JlZG9sbGFyOiAnUyQnLFxuICAgIGV1cm86ICfigqwnLFxuICAgIGFlZDogJ0FFRCcsXG4gIH07XG5cbiAgLy8gV29yZHMgZm9ybSBvZiBlYWNoIGN1cnJlbmN5IGZvciB0aGUgXCJBbW91bnQgaW4gd29yZHNcIiBsaW5lLlxuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbmN5V29yZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaW5yOiAnSW5kaWFuIFJ1cGVlJyxcbiAgICBkb2xsYXI6ICdVUyBEb2xsYXInLFxuICAgIHNpbmdhcG9yZWRvbGxhcjogJ1NpbmdhcG9yZSBEb2xsYXInLFxuICAgIGV1cm86ICdFdXJvJyxcbiAgfTtcblxuICAvLyBMb2NhbGUgdXNlZCBmb3IgZ3JvdXBpbmcgbnVtYmVycy4gZW4tSU4gaXMgbGFraHMvY3JvcmVzOyBldmVyeXRoaW5nIGVsc2VcbiAgLy8gZ2V0cyB3ZXN0ZXJuIHRob3VzYW5kcyBncm91cGluZy5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW5jeUxvY2FsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaW5yOiAnZW4tSU4nLFxuICAgIGRvbGxhcjogJ2VuLVVTJyxcbiAgICBzaW5nYXBvcmVkb2xsYXI6ICdlbi1TRycsXG4gICAgZXVybzogJ2VuLUlFJyxcbiAgfTtcblxuICBjdXJyZW5jeVN5bWJvbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLmludm9pY2VEYXRhPy5jdXJyZW5jeTtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW5jeVN5bWJvbHNbY29kZSB8fCAnJ10gfHwgJyQnO1xuICB9XG5cbiAgLy8gUGF5bWVudCB0ZXJtIGluIGRheXMuIFRoZSBpbnZvaWNlIGRvYyBkb2Vzbid0IHN0b3JlIHBheW1lbnRUZXJtIChpdCBsaXZlc1xuICAvLyBvbiB0aGUgYmlsbGluZyBncm91cCksIHNvIGRlcml2ZSBpdCBmcm9tIGR1ZURhdGUg4oiSIGJpbGxpbmdEYXRlLCB3aGljaCBpc1xuICAvLyBhY2N1cmF0ZSBmb3IgZXZlcnkgaW52b2ljZS4gRmFsbHMgYmFjayB0byBhIHN0b3JlZCBwYXltZW50VGVybSwgZWxzZSAzMC5cbiAgZ2V0IHBheW1lbnRUZXJtRGF5cygpOiBudW1iZXIge1xuICAgIGNvbnN0IGludiA9IHRoaXMuaW52b2ljZURhdGE7XG4gICAgaWYgKGludj8uYmlsbGluZ0RhdGUgJiYgaW52Py5kdWVEYXRlKSB7XG4gICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKGludi5iaWxsaW5nRGF0ZSkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBjb25zdCBkdWUgPSBuZXcgRGF0ZShpbnYuZHVlRGF0ZSkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBjb25zdCBkYXlzID0gTWF0aC5yb3VuZCgoZHVlIC0gc3RhcnQpIC8gODY0MDAwMDApO1xuICAgICAgaWYgKGRheXMgPiAwKSByZXR1cm4gZGF5cztcbiAgICB9XG4gICAgcmV0dXJuIE51bWJlcihpbnY/LnBheW1lbnRUZXJtKSB8fCAzMDtcbiAgfVxuXG4gIGdldCB0b3RhbEluV29yZHMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2RlID0gdGhpcy5pbnZvaWNlRGF0YT8uY3VycmVuY3k7XG4gICAgY29uc3Qgd29yZHMgPSB0aGlzLmN1cnJlbmN5V29yZHNbY29kZSB8fCAnJ10gfHwgJ1VTIERvbGxhcic7XG4gICAgY29uc3QgdG90YWwgPSBNYXRoLnJvdW5kKE51bWJlcih0aGlzLmludm9pY2VEYXRhPy50b3RhbEFtb3VudCB8fCAwKSk7XG4gICAgcmV0dXJuIGAke3dvcmRzfSAke2Ftb3VudEluV29yZHModG90YWwpfSBPbmx5YDtcbiAgfVxuXG4gIGZvcm1hdElOUih2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBuID0gTnVtYmVyKHZhbHVlKTtcbiAgICBpZiAoIWlzRmluaXRlKG4pKSByZXR1cm4gJzAuMDAnO1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLmludm9pY2VEYXRhPy5jdXJyZW5jeTtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmN1cnJlbmN5TG9jYWxlc1tjb2RlIHx8ICcnXSB8fCAnZW4tVVMnO1xuICAgIHJldHVybiBuLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIsIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMiB9KTtcbiAgfVxuXG4gIC8vIE1pcnJvcnMgdGhlIGJhY2tlbmQgdHJhbnNmb3JtOiBgdGFuZ29UcmFmZmljYCAtPiBgVGFuZ28gVHJhZmZpY2AuXG4gIGZvcm1hdFByb2R1Y3ROYW1lKG5hbWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gICAgY29uc3QgcGFydHMgPSBTdHJpbmcobmFtZSkucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxICQyJykuc3BsaXQoJyAnKTtcbiAgICByZXR1cm4gcGFydHMubWFwKCh3KSA9PiB3LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdy5zbGljZSgxKSkuam9pbignICcpO1xuICB9XG5cbiAgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwiaW52b2ljZS1wcmV2aWV3LW1vZGFsXCI+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgcHJldmlldy10YWJzXCIgcm9sZT1cInRhYmxpc3RcIj5cbiAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtbGlua1wiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09PSAnaW52b2ljZSdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ2ludm9pY2UnKVwiIHR5cGU9XCJidXR0b25cIj5JbnZvaWNlPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1saW5rXCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIgPT09ICdhbm5leHVyZSdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ2FubmV4dXJlJylcIiB0eXBlPVwiYnV0dG9uXCI+QW5uZXh1cmU8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIChjbGljayk9XCJhY3RpdmVNb2RhbC5kaXNtaXNzKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgcC0wXCI+XG4gICAgPCEtLSBJTlZPSUNFIFRBQiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnaW52b2ljZSdcIiBjbGFzcz1cImludm9pY2UtcGFnZVwiPlxuICAgICAgPCEtLSBIZWFkZXIgcm93IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1zdGFydFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnJhbmRcIj5cbiAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvdGFuZ28vSW1hZ2VzL3RhbmdvZXllLWxvZ28uc3ZnXCIgYWx0PVwiVGFuZ29FeWVcIiBjbGFzcz1cImJyYW5kLWxvZ29cIiBvbmVycm9yPVwidGhpcy5zdHlsZS5kaXNwbGF5PSdub25lJ1wiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wYW55LWJsb2NrIG10LTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wYW55LW5hbWVcIj5UQU5HTyBJVCBTT0xVVElPTlMgSU5ESUEgUFJJVkFURSBMVEQ8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+Mm5kIEZsb29yLCBBcGVlamF5IEJ1c2luZXNzIENlbnRyZSwgTm8uMTIvMzksPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PkhhZGRvd3MgUm9hZCwgTnVuZ2FtYmFra2FtPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PkNoZW5uYWkgVGFtaWwgTmFkdSA2MDAwMDYsIEluZGlhPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMVwiPjxzdHJvbmc+R1NUSU4gMzNBQUdDVDMxMjRSMVoyPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMVwiPk1TTUUgLyBVZHlhbSB0eXBlIDogTWljcm88L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+TVNNRSAvIFVkeWFtIE5vLiA6IFVEWUFNLVROLTAzLTAyMTIzOTk8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNSB0ZXh0LWVuZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YXgtaW52b2ljZS1sYWJlbFwiPlRBWCBJTlZPSUNFPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtbnVtYmVyXCI+IyB7eyBpbnZvaWNlRGF0YT8uaW52b2ljZSB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEJpbGwtdG8gKyB0b3RhbHMgcm93IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtN1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiaWxsLXRvLWxhYmVsXCI+QklMTCBUTyA6PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNsaWVudC1uYW1lIG10LTFcIj57eyAoaW52b2ljZURhdGE/LmNsaWVudE5hbWUgfHwgaW52b2ljZURhdGE/LmNvbXBhbnlOYW1lKSB8IHVwcGVyY2FzZSB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xXCIgKm5nSWY9XCJpbnZvaWNlRGF0YT8uYmlsbGluZ0FkZHJlc3NMaW5lT25lIHx8IGludm9pY2VEYXRhPy5jb21wYW55QWRkcmVzc1wiPlxuICAgICAgICAgICAge3sgaW52b2ljZURhdGE/LmJpbGxpbmdBZGRyZXNzTGluZU9uZSB8fCBpbnZvaWNlRGF0YT8uY29tcGFueUFkZHJlc3MgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW52b2ljZURhdGE/LmJpbGxpbmdBZGRyZXNzTGluZVR3b1wiPnt7IGludm9pY2VEYXRhPy5iaWxsaW5nQWRkcmVzc0xpbmVUd28gfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW52b2ljZURhdGE/LmJpbGxpbmdDaXR5IHx8IGludm9pY2VEYXRhPy5iaWxsaW5nUGluQ29kZSB8fCBpbnZvaWNlRGF0YT8uYmlsbGluZ1N0YXRlXCI+XG4gICAgICAgICAgICB7eyBpbnZvaWNlRGF0YT8uYmlsbGluZ0NpdHkgfX08c3BhbiAqbmdJZj1cImludm9pY2VEYXRhPy5iaWxsaW5nUGluQ29kZVwiPiwge3sgaW52b2ljZURhdGE/LmJpbGxpbmdQaW5Db2RlIH19PC9zcGFuPjxzcGFuICpuZ0lmPVwiaW52b2ljZURhdGE/LmJpbGxpbmdTdGF0ZVwiPiwge3sgaW52b2ljZURhdGE/LmJpbGxpbmdTdGF0ZSB9fTwvc3Bhbj48c3BhbiAqbmdJZj1cImludm9pY2VEYXRhPy5iaWxsaW5nQ291bnRyeVwiPiwge3sgaW52b2ljZURhdGE/LmJpbGxpbmdDb3VudHJ5IH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJpbnZvaWNlRGF0YT8uR1NUTnVtYmVyXCI+PHN0cm9uZz5HU1RJTiB7eyBpbnZvaWNlRGF0YT8uR1NUTnVtYmVyIH19PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImludm9pY2VEYXRhPy5QbGFjZU9mU3VwcGx5XCI+UGxhY2UgT2YgU3VwcGx5OiB7eyBpbnZvaWNlRGF0YT8uUGxhY2VPZlN1cHBseSB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC01IHRleHQtZW5kXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtdG90YWwtbGFiZWxcIj5JbnZvaWNlIFRvdGFsIDxzcGFuIGNsYXNzPVwiaW52b2ljZS10b3RhbC1hbW91bnRcIj57eyBjdXJyZW5jeVN5bWJvbCgpIH19IHt7IGZvcm1hdElOUihpbnZvaWNlRGF0YT8udG90YWxBbW91bnQpIH19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDx0YWJsZSBjbGFzcz1cIm1ldGEtdGFibGUgbXMtYXV0byBtdC0zXCI+XG4gICAgICAgICAgICA8dHI+PHRkIGNsYXNzPVwibWV0YS1sYWJlbFwiPkludm9pY2UgZGF0ZSA6PC90ZD48dGQgY2xhc3M9XCJtZXRhLXZhbHVlXCI+e3sgaW52b2ljZURhdGE/LmJpbGxpbmdEYXRlIHwgZGF0ZTonZGQvTU0veXl5eScgfX08L3RkPjwvdHI+XG4gICAgICAgICAgICA8dHI+PHRkIGNsYXNzPVwibWV0YS1sYWJlbFwiPlRlcm1zIDo8L3RkPjx0ZCBjbGFzcz1cIm1ldGEtdmFsdWVcIj5UZXJtIHt7IHBheW1lbnRUZXJtRGF5cyB9fTwvdGQ+PC90cj5cbiAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9XCJtZXRhLWxhYmVsXCI+RHVlIERhdGUgOjwvdGQ+PHRkIGNsYXNzPVwibWV0YS12YWx1ZVwiPnt7IGludm9pY2VEYXRhPy5kdWVEYXRlIHwgZGF0ZTonZGQvTU0veXl5eScgfX08L3RkPjwvdHI+XG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJpbnZvaWNlRGF0YT8uUG9OdW0gfHwgaW52b2ljZURhdGE/LnBvTnVtYmVyXCI+PHRkIGNsYXNzPVwibWV0YS1sYWJlbFwiPlAuTy4jIDo8L3RkPjx0ZCBjbGFzcz1cIm1ldGEtdmFsdWVcIj57eyBpbnZvaWNlRGF0YT8uUG9OdW0gfHwgaW52b2ljZURhdGE/LnBvTnVtYmVyIH19PC90ZD48L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTGluZSBpdGVtcyAtLT5cbiAgICAgIDx0YWJsZSBjbGFzcz1cIml0ZW1zLXRhYmxlIG10LTRcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1pbmRleFwiPiM8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiY29sLXByb2R1Y3RcIj5Qcm9kdWN0ICZhbXA7IERlc2NyaXB0aW9uPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1tb250aFwiPk1vbnRoPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1oc25cIj5IU04vU0FDPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1jb3VudCB0ZXh0LWNlbnRlclwiPlF1YW50aXR5PC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1yYXRlIHRleHQtZW5kXCI+UmF0ZTwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJjb2wtYW1vdW50IHRleHQtZW5kXCI+QW1vdW50PC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGludm9pY2VEYXRhPy5wcm9kdWN0czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgICA8dGQ+e3sgaSArIDEgfX08L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1uYW1lXCI+e3sgZm9ybWF0UHJvZHVjdE5hbWUoaXRlbT8ucHJvZHVjdE5hbWUpIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWRlc2NcIj57eyBpdGVtPy5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwhLS0gTW9udGggaXMgdGhlIHByb2R1Y3QncyBiaWxsaW5nIG1vbnRoIHN0b3JlZCBvbiB0aGUgbGluZSBpdGVtXG4gICAgICAgICAgICAgICAgIChhZHZhbmNlIGludm9pY2VzIGJpbGwgYSBmdXR1cmUgbW9udGggd2hpbGUgYmlsbGluZ0RhdGUgaXMgdGhlXG4gICAgICAgICAgICAgICAgIGNyZWF0aW9uIGRhdGUpLiBGYWxsIGJhY2sgdG8gYmlsbGluZ0RhdGUgZm9yIGxlZ2FjeSByb3dzLiAtLT5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm5vd3JhcFwiPnt7IGl0ZW0/Lm1vbnRoIHx8IChpbnZvaWNlRGF0YT8uYmlsbGluZ0RhdGUgfCBkYXRlOidNTU0geXl5eScpIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyBpdGVtPy5oc24gfHwgaXRlbT8uaHNuQ29kZSB8fCAnOTk4MzE0JyB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPjxzdHJvbmc+e3sgaXRlbT8uc3RvcmVDb3VudCB8fCBpbnZvaWNlRGF0YT8uc3RvcmVzPy5sZW5ndGggfHwgJycgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmQgbm93cmFwXCI+e3sgY3VycmVuY3lTeW1ib2woKSB9fSB7eyBmb3JtYXRJTlIoaXRlbT8ucHJpY2UpIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kIG5vd3JhcFwiPnt7IGN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZm9ybWF0SU5SKGl0ZW0/LmFtb3VudCkgfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuXG4gICAgICA8IS0tIFRvdGFscyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC01XCI+XG4gICAgICAgICAgPHRhYmxlIGNsYXNzPVwidG90YWxzLXRhYmxlIG1zLWF1dG9cIj5cbiAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9XCJ0b3RhbHMtbGFiZWxcIj5TdWIgVG90YWw8L3RkPjx0ZCBjbGFzcz1cInRvdGFscy12YWx1ZVwiPnt7IGN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZm9ybWF0SU5SKGludm9pY2VEYXRhPy5hbW91bnQpIH19PC90ZD48L3RyPlxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCB0IG9mIGludm9pY2VEYXRhPy50YXhcIj5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLWxhYmVsXCI+e3sgdD8udHlwZSB8fCB0Py50YXhOYW1lIHx8IHQ/Lm5hbWUgfX0gKHt7IHQ/LnZhbHVlID8/IHQ/LnRheFBlcmNlbnRhZ2UgPz8gdD8ucGVyY2VudGFnZSB9fSUpPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLXZhbHVlIG5vd3JhcFwiPnt7IGN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZm9ybWF0SU5SKHQ/LnRheEFtb3VudCkgfX08L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0ciBjbGFzcz1cInRvdGFscy10b3RhbC1yb3dcIj5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLWxhYmVsXCI+VG90YWwgQW1vdW50PC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLXZhbHVlXCI+e3sgY3VycmVuY3lTeW1ib2woKSB9fSB7eyBmb3JtYXRJTlIoaW52b2ljZURhdGE/LnRvdGFsQW1vdW50KSB9fTwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyIGNsYXNzPVwidG90YWxzLXdvcmRzLXJvd1wiPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0b3RhbHMtbGFiZWxcIj5Ub3RhbCBJbiBXb3JkczwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRvdGFscy12YWx1ZSB3b3Jkc1wiPnt7IHRvdGFsSW5Xb3JkcyB9fTwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGF5bWVudCBkZXRhaWxzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRoYW5rcyBtdC00XCI+VGhhbmtzIGZvciB5b3VyIGJ1c2luZXNzITwvZGl2PlxuICAgICAgPHRhYmxlIGNsYXNzPVwicGF5bWVudC10YWJsZSBtdC0yXCI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+QmVuZWZpY2lhcnkgTmFtZTwvdGQ+PHRkIGNsYXNzPVwicGF5bWVudC12YWx1ZVwiPjxzdHJvbmc+e3sgYmFua0RldGFpbHM/LmJlbmVmaWNpYXJ5TmFtZSB9fTwvc3Ryb25nPjwvdGQ+PC90cj5cbiAgICAgICAgPHRyPjx0ZCBjbGFzcz1cInBheW1lbnQtbGFiZWxcIj5BY2NvdW50IE51bWJlcjwvdGQ+PHRkIGNsYXNzPVwicGF5bWVudC12YWx1ZVwiPjxzdHJvbmc+e3sgYmFua0RldGFpbHM/LmFjY291bnROdW1iZXIgfX08L3N0cm9uZz48L3RkPjwvdHI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+SUZTQyBDb2RlPC90ZD48dGQgY2xhc3M9XCJwYXltZW50LXZhbHVlXCI+PHN0cm9uZz57eyBiYW5rRGV0YWlscz8uaWZzYyB9fTwvc3Ryb25nPjwvdGQ+PC90cj5cbiAgICAgICAgPHRyPjx0ZCBjbGFzcz1cInBheW1lbnQtbGFiZWxcIj5QYXltZW50IFR5cGU8L3RkPjx0ZCBjbGFzcz1cInBheW1lbnQtdmFsdWVcIj48c3Ryb25nPnt7IGJhbmtEZXRhaWxzPy5wYXltZW50VHlwZSB9fTwvc3Ryb25nPjwvdGQ+PC90cj5cbiAgICAgICAgPHRyPjx0ZCBjbGFzcz1cInBheW1lbnQtbGFiZWxcIj5TV0lGVCBDb2RlPC90ZD48dGQgY2xhc3M9XCJwYXltZW50LXZhbHVlXCI+PHN0cm9uZz57eyBiYW5rRGV0YWlscz8uc3dpZnQgfX08L3N0cm9uZz48L3RkPjwvdHI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+QnJhbmNoPC90ZD48dGQgY2xhc3M9XCJwYXltZW50LXZhbHVlXCI+PHN0cm9uZz57eyBiYW5rRGV0YWlscz8uYnJhbmNoIH19PC9zdHJvbmc+PC90ZD48L3RyPlxuICAgICAgPC90YWJsZT5cblxuICAgICAgPGRpdiBjbGFzcz1cInN5c3RlbS1ub3RlIG10LTRcIj5UaGlzIGlzIGEgc3lzdGVtIGdlbmVyYXRlZCBpbnZvaWNlLiBObyBzaWduYXR1cmUgcmVxdWlyZWQ8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQU5ORVhVUkUgVEFCIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdhbm5leHVyZSdcIiBjbGFzcz1cImFubmV4dXJlLXBhZ2VcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCJhbm5leHVyZUxvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmctc3RhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHRleHQtcHJpbWFyeVwiIHJvbGU9XCJzdGF0dXNcIj48c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhYW5uZXh1cmVMb2FkaW5nICYmIGFubmV4dXJlRXJyb3JcIiBjbGFzcz1cImVycm9yLXN0YXRlXCI+XG4gICAgICAgIDxwPkZhaWxlZCB0byBsb2FkIGFubmV4dXJlLjwvcD5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeVwiIChjbGljayk9XCJyZXRyeUFubmV4dXJlKClcIj5SZXRyeTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWFubmV4dXJlTG9hZGluZyAmJiAhYW5uZXh1cmVFcnJvciAmJiBhbm5leHVyZURhdGEgIT09IG51bGwgJiYgYW5uZXh1cmVEYXRhLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZW1wdHktc3RhdGVcIj5cbiAgICAgICAgTm8gYW5uZXh1cmUgZGF0YSBmb3IgdGhpcyBpbnZvaWNlLlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWFubmV4dXJlTG9hZGluZyAmJiAhYW5uZXh1cmVFcnJvciAmJiBhbm5leHVyZURhdGEgJiYgYW5uZXh1cmVEYXRhLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICBjbGFzcz1cImFubmV4dXJlLXRvb2xiYXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiAoY2xpY2spPVwiZG93bmxvYWRBbm5leHVyZVhsc3goKVwiPlxuICAgICAgICAgIEV4cG9ydCBhcyBYTFNYXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8dGFibGUgKm5nSWY9XCIhYW5uZXh1cmVMb2FkaW5nICYmICFhbm5leHVyZUVycm9yICYmIGFubmV4dXJlRGF0YSAmJiBhbm5leHVyZURhdGEubGVuZ3RoID4gMFwiIGNsYXNzPVwiYW5uZXh1cmUtdGFibGVcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aD5TdG9yZSBOYW1lPC90aD5cbiAgICAgICAgICAgIDx0aD5Qcm9kdWN0czwvdGg+XG4gICAgICAgICAgICA8dGg+U3RvcmUgSUQ8L3RoPlxuICAgICAgICAgICAgPHRoPkRlcGxveW1lbnQgRGF0ZTwvdGg+XG4gICAgICAgICAgICA8dGg+UGVyaW9kPC90aD5cbiAgICAgICAgICAgIDx0aD5QcmljaW5nIE1ldGhvZDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPkJpbGxpbmcgRGF5czwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlF0eTwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWVuZFwiPlVuaXQgUHJpY2U8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1lbmRcIj5QcmljZSBQZXIgTW9udGg8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBhbm5leHVyZURhdGE7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiPlxuICAgICAgICAgICAgPHRkPnt7IHJvdz8uc3RvcmVOYW1lIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyByb3c/LnByb2R1Y3ROYW1lIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyByb3c/LnN0b3JlSWQgfX08L3RkPlxuICAgICAgICAgICAgPHRkPnt7IHJvdz8uZWRnZWZpcnN0RmlsZURhdGUgfX08L3RkPlxuICAgICAgICAgICAgPHRkPnt7IHJvdz8ucGVyaW9kID09PSAncHJvcmF0ZScgPyAnUHJvLXJhdGUnIDogJ0Z1bGwgbW9udGgnIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyByb3c/LnVuaXRCYXNpcyB8fCAnUGVyIFN0b3JlJyB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPjxzdHJvbmc+e3sgcm93Py53b3JraW5nZGF5cyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7IHJvdz8udW5pdHMgPz8gMSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICB7eyByb3c/LmN1cnJlbmN5VHlwZSB9fSB7eyBmb3JtYXRJTlIocm93Py5zdGFuZGFyZFByaWNlKSB9fVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidW5pdC1iYXNpc1wiPnt7IHJvdz8udW5pdEJhc2lzIHx8ICdQZXIgU3RvcmUnIH19PC9kaXY+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPnt7IHJvdz8uY3VycmVuY3lUeXBlIH19IHt7IGZvcm1hdElOUihyb3c/LnJ1bm5pbmdDb3N0KSB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPHRmb290ICpuZ0lmPVwiYW5uZXh1cmVUb3RhbCAhPSBudWxsXCI+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI5XCIgY2xhc3M9XCJ0ZXh0LWVuZFwiPjxzdHJvbmc+VG90YWw8L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPnt7IGFubmV4dXJlRGF0YVswXT8uY3VycmVuY3lUeXBlIH19IHt7IGZvcm1hdElOUihhbm5leHVyZVRvdGFsKSB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Zm9vdD5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCIgKGNsaWNrKT1cImFjdGl2ZU1vZGFsLmRpc21pc3MoKVwiPkNsb3NlPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5XCIgKGNsaWNrKT1cImRvd25sb2FkUGRmKClcIiBbZGlzYWJsZWRdPVwiZG93bmxvYWRpbmdcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWRvd25sb2FkaW5nXCI+RG93bmxvYWQgUERGPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJkb3dubG9hZGluZ1wiPkRvd25sb2FkaW5nLi4uPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
234
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9pbnZvaWNlLXByZXZpZXcvaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9pbnZvaWNlLXByZXZpZXcvaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssU0FBUyxNQUFNLFlBQVksQ0FBQztBQUd4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7OztBQU92RCxNQUFNLE9BQU8sdUJBQXVCO0lBNEJ6QjtJQUNDO0lBQ0E7SUE3Qk8sUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFdkMsV0FBVyxDQUFNO0lBRTFCLFNBQVMsR0FBMkIsU0FBUyxDQUFDO0lBRTlDLFlBQVksR0FBaUIsSUFBSSxDQUFDO0lBQ2xDLDBFQUEwRTtJQUMxRSxpREFBaUQ7SUFDakQsYUFBYSxHQUFrQixJQUFJLENBQUM7SUFDcEMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRXRCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFcEIsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSxXQUFXLEdBQVE7UUFDakIsZUFBZSxFQUFFLDBDQUEwQztRQUMz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bnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHsgQmlsbGluZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9iaWxsaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XG5pbXBvcnQgeyBhbW91bnRJbldvcmRzIH0gZnJvbSAnLi9hbW91bnQtaW4td29yZHMudXRpbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1pbnZvaWNlLXByZXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2ludm9pY2UtcHJldmlldy5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgSW52b2ljZVByZXZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBJbnB1dCgpIGludm9pY2VEYXRhOiBhbnk7XG5cbiAgYWN0aXZlVGFiOiAnaW52b2ljZScgfCAnYW5uZXh1cmUnID0gJ2ludm9pY2UnO1xuXG4gIGFubmV4dXJlRGF0YTogYW55W10gfCBudWxsID0gbnVsbDtcbiAgLy8gR3JhbmQgdG90YWwgb2YgYWxsIGFubmV4dXJlIHJvd3MgKGNvbXB1dGVkIGJ5IHRoZSBiYWNrZW5kIHdpdGggdGhlIHNhbWVcbiAgLy8gcGVyLWNhbWVyYSAvIHBlci16b25lIHJ1bGVzIHRoZSBpbnZvaWNlIHVzZXMpLlxuICBhbm5leHVyZVRvdGFsOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgYW5uZXh1cmVMb2FkaW5nID0gZmFsc2U7XG4gIGFubmV4dXJlRXJyb3IgPSBmYWxzZTtcblxuICBkb3dubG9hZGluZyA9IGZhbHNlO1xuXG4gIC8vIEZpeGVkIGJlbmVmaWNpYXJ5IGFjY291bnQg4oCUIGhhcmRjb2RlZCB0byBtYXRjaCB0aGUgUERGIGV4YWN0bHkgKE5PVCBmcm9tXG4gIC8vIHRoZSBEQiksIHNvIHRoZSBwcmV2aWV3IGFuZCB0aGUgZG93bmxvYWRlZCBQREYgYWx3YXlzIHNob3cgdGhlIHNhbWUgdGhpbmcuXG4gIGJhbmtEZXRhaWxzOiBhbnkgPSB7XG4gICAgYmVuZWZpY2lhcnlOYW1lOiAnVGFuZ28gSVQgU29sdXRpb25zIEluZGlhIFByaXZhdGUgTGltaXRlZCcsXG4gICAgYWNjb3VudE51bWJlcjogJzUwMjAwMDI3NDQxNDMzJyxcbiAgICBpZnNjOiAnSERGQzAwMDAzODYnLFxuICAgIHN3aWZ0OiAnSERGQ0lOQkJDSEUnLFxuICAgIGJyYW5jaDogJ1NhbnRob21lLCBDaGVubmFpJyxcbiAgICBwYXltZW50VHlwZTogJ09ubGluZScsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCxcbiAgICBwcml2YXRlIGJpbGxpbmdTZXJ2aWNlOiBCaWxsaW5nU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBCYW5rIGRldGFpbHMgYXJlIGZpeGVkIChzZWUgYmFua0RldGFpbHMgYWJvdmUpIOKAlCBub3RoaW5nIHRvIGZldGNoLlxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgc2VsZWN0VGFiKHRhYjogJ2ludm9pY2UnIHwgJ2FubmV4dXJlJykge1xuICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiO1xuICAgIGlmICh0YWIgPT09ICdhbm5leHVyZScgJiYgdGhpcy5hbm5leHVyZURhdGEgPT09IG51bGwgJiYgIXRoaXMuYW5uZXh1cmVMb2FkaW5nKSB7XG4gICAgICB0aGlzLmxvYWRBbm5leHVyZSgpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRBbm5leHVyZSgpIHtcbiAgICBpZiAoIXRoaXMuaW52b2ljZURhdGE/Ll9pZCkgcmV0dXJuO1xuICAgIHRoaXMuYW5uZXh1cmVMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmFubmV4dXJlRXJyb3IgPSBmYWxzZTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEludm9pY2VBbm5leHVyZSh0aGlzLmludm9pY2VEYXRhLl9pZClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBCYWNrZW5kIGVudmVsb3BlIGlzIHsgY29kZSwgc3RhdHVzLCBkYXRhOiB7IGRhdGE6IFsuLi5dIH0gfSDigJRcbiAgICAgICAgICAvLyB0aGUgY29udHJvbGxlciBjYWxscyBzZW5kU3VjY2Vzcyh7IGRhdGE6IGFubmV4dXJlRGF0YSB9KSBhbmQgdGhlXG4gICAgICAgICAgLy8gcmVzcG9uc2UgbWlkZGxld2FyZSB3cmFwcyB0aGF0IHVuZGVyIGl0cyBvd24gYGRhdGFgIGtleS4gUmVhZFxuICAgICAgICAgIC8vIHRocm91Z2ggYm90aCBsYXllcnMgdG8gZ2V0IHRoZSByb3cgYXJyYXkuXG4gICAgICAgICAgdGhpcy5hbm5leHVyZURhdGEgPSByZXM/LmRhdGE/LmRhdGEgfHwgW107XG4gICAgICAgICAgdGhpcy5hbm5leHVyZVRvdGFsID0gcmVzPy5kYXRhPy50b3RhbEFtb3VudCA/PyBudWxsO1xuICAgICAgICAgIHRoaXMuYW5uZXh1cmVMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hbm5leHVyZUVycm9yID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmFubmV4dXJlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIEV4cG9ydCB0aGUgbG9hZGVkIGFubmV4dXJlIHJvd3MgYXMgYW4gLnhsc3ggZmlsZS4gTWlycm9ycyB0aGUgY29sdW1uc1xuICAvLyBzaG93biBpbiB0aGUgQW5uZXh1cmUgdGFiIHNvIHRoZSBzcHJlYWRzaGVldCBtYXRjaGVzIHdoYXQgdGhlIHVzZXJcbiAgLy8gc2F3IG9uIHNjcmVlbi4gRmlsZW5hbWUgaXMgYCR7aW52b2ljZU51bWJlcn0tYW5uZXh1cmUueGxzeGAuXG4gIGRvd25sb2FkQW5uZXh1cmVYbHN4KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hbm5leHVyZURhdGEgfHwgdGhpcy5hbm5leHVyZURhdGEubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN5bWJvbCA9IHRoaXMuY3VycmVuY3lTeW1ib2woKTtcbiAgICAgIGNvbnN0IHJvd3M6IGFueVtdID0gdGhpcy5hbm5leHVyZURhdGEubWFwKChyb3c6IGFueSkgPT4gKHtcbiAgICAgICAgJ1N0b3JlIE5hbWUnOiByb3c/LnN0b3JlTmFtZSB8fCAnJyxcbiAgICAgICAgJ1Byb2R1Y3QnOiB0aGlzLmZvcm1hdFByb2R1Y3ROYW1lKHJvdz8ucHJvZHVjdE5hbWUpLFxuICAgICAgICAnU3RvcmUgSUQnOiByb3c/LnN0b3JlSWQgfHwgJycsXG4gICAgICAgICdEZXBsb3ltZW50IERhdGUnOiByb3c/LmVkZ2VmaXJzdEZpbGVEYXRlIHx8ICcnLFxuICAgICAgICAnUGVyaW9kJzogcm93Py5wZXJpb2QgPT09ICdwcm9yYXRlJyA/ICdQcm8tcmF0ZScgOiAnRnVsbCBtb250aCcsXG4gICAgICAgICdQcmljaW5nIE1ldGhvZCc6IHJvdz8udW5pdEJhc2lzIHx8ICdQZXIgU3RvcmUnLFxuICAgICAgICAnQmlsbGluZyBEYXlzJzogcm93Py53b3JraW5nZGF5cyA/PyAwLFxuICAgICAgICAnUXR5Jzogcm93Py51bml0cyA/PyAxLFxuICAgICAgICAnVW5pdCBQcmljZSc6IHJvdz8uc3RhbmRhcmRQcmljZSAhPSBudWxsXG4gICAgICAgICAgPyBgJHtzeW1ib2x9ICR7dGhpcy5mb3JtYXRJTlIocm93LnN0YW5kYXJkUHJpY2UpfSAoJHtyb3c/LnVuaXRCYXNpcyB8fCAnUGVyIFN0b3JlJ30pYFxuICAgICAgICAgIDogJycsXG4gICAgICAgICdQcmljZSBQZXIgTW9udGgnOiByb3c/LnJ1bm5pbmdDb3N0ICE9IG51bGxcbiAgICAgICAgICA/IGAke3N5bWJvbH0gJHt0aGlzLmZvcm1hdElOUihyb3cucnVubmluZ0Nvc3QpfWBcbiAgICAgICAgICA6ICcnLFxuICAgICAgfSkpO1xuICAgICAgaWYgKHRoaXMuYW5uZXh1cmVUb3RhbCAhPSBudWxsKSB7XG4gICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgJ1N0b3JlIE5hbWUnOiAnJywgJ1Byb2R1Y3QnOiAnJywgJ1N0b3JlIElEJzogJycsICdEZXBsb3ltZW50IERhdGUnOiAnJyxcbiAgICAgICAgICAnUGVyaW9kJzogJycsICdQcmljaW5nIE1ldGhvZCc6ICcnLFxuICAgICAgICAgICdCaWxsaW5nIERheXMnOiAnJywgJ1F0eSc6ICcnLCAnVW5pdCBQcmljZSc6ICdUb3RhbCcsXG4gICAgICAgICAgJ1ByaWNlIFBlciBNb250aCc6IGAke3N5bWJvbH0gJHt0aGlzLmZvcm1hdElOUih0aGlzLmFubmV4dXJlVG90YWwpfWAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgd29ya3NoZWV0ID0gWExTWC51dGlscy5qc29uX3RvX3NoZWV0KHJvd3MpO1xuICAgICAgY29uc3Qgd29ya2Jvb2sgPSB7IFNoZWV0czogeyBBbm5leHVyZTogd29ya3NoZWV0IH0sIFNoZWV0TmFtZXM6IFsnQW5uZXh1cmUnXSB9O1xuICAgICAgY29uc3QgYnVmZmVyOiBBcnJheUJ1ZmZlciA9IFhMU1gud3JpdGUod29ya2Jvb2ssIHsgYm9va1R5cGU6ICd4bHN4JywgdHlwZTogJ2FycmF5JyB9KTtcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xuICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7Y2hhcnNldD1VVEYtOCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNhZmVJbnZvaWNlTm8gPSAodGhpcy5pbnZvaWNlRGF0YT8uaW52b2ljZSB8fCAnaW52b2ljZScpLnJlcGxhY2UoL1tcXFxcLzoqP1wiPD58XFxyXFxuXS9nLCAnJyk7XG4gICAgICBGaWxlU2F2ZXIuc2F2ZUFzKGJsb2IsIGAke3NhZmVJbnZvaWNlTm99LWFubmV4dXJlLnhsc3hgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBleHBvcnQgYW5uZXh1cmUnKTtcbiAgICB9XG4gIH1cblxuICByZXRyeUFubmV4dXJlKCkge1xuICAgIHRoaXMuYW5uZXh1cmVEYXRhID0gbnVsbDtcbiAgICB0aGlzLmxvYWRBbm5leHVyZSgpO1xuICB9XG5cbiAgZG93bmxvYWRQZGYoKSB7XG4gICAgaWYgKCF0aGlzLmludm9pY2VEYXRhPy5faWQgfHwgdGhpcy5kb3dubG9hZGluZykgcmV0dXJuO1xuICAgIHRoaXMuZG93bmxvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlcSA9IHsgLi4udGhpcy5pbnZvaWNlRGF0YSB9O1xuICAgIHJlcS5jbGllbnRJZCA9IFt0aGlzLmludm9pY2VEYXRhLmNsaWVudElkXTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmludm9pY2VEb3dubG9hZChyZXEpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtyZXNdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnIH0pO1xuICAgICAgICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5pbnZvaWNlRGF0YT8uYmlsbGluZ0RhdGVcbiAgICAgICAgICAgID8gbmV3IERhdGUodGhpcy5pbnZvaWNlRGF0YS5iaWxsaW5nRGF0ZSkudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ2xvbmcnIH0pXG4gICAgICAgICAgICA6ICcnO1xuICAgICAgICAgIGNvbnN0IGJyYW5kTmFtZSA9IHRoaXMuaW52b2ljZURhdGE/LnJlZ2lzdGVyZWRDb21wYW55TmFtZSB8fCB0aGlzLmludm9pY2VEYXRhPy5jb21wYW55TmFtZSB8fCAnJztcbiAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGAke3RoaXMuaW52b2ljZURhdGE/Lmludm9pY2UgfHwgJ2ludm9pY2UnfS0ke21vbnRofS0ke2JyYW5kTmFtZX0ucGRmYFxuICAgICAgICAgICAgLnJlcGxhY2UoL1tcXFxcLzoqP1wiPD58XFxyXFxuXS9nLCAnJykudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgbGluay5ocmVmID0gdXJsO1xuICAgICAgICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgICAgdGhpcy5kb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBkb3dubG9hZCBpbnZvaWNlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gTWlycm9ycyB0aGUgYmFja2VuZCBDVVJSRU5DWV9TWU1CT0xTIG1hcCAodXRpbHMvY3VycmVuY3kuanMpIHNvIHRoZVxuICAvLyBwcmV2aWV3IHNob3dzIHRoZSBzYW1lIHN5bWJvbCB0aGUgUERGIHdpbGwgcmVuZGVyLiBGYWxsYmFjayBpcyAnJCcgZm9yXG4gIC8vIHVua25vd24gY29kZXMgdG8gbWF0Y2ggdGhlIGJhY2tlbmQuXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVuY3lTeW1ib2xzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGlucjogJ+KCuScsXG4gICAgZG9sbGFyOiAnJCcsXG4gICAgc2luZ2Fwb3JlZG9sbGFyOiAnUyQnLFxuICAgIGV1cm86ICfigqwnLFxuICAgIGFlZDogJ0FFRCcsXG4gIH07XG5cbiAgLy8gV29yZHMgZm9ybSBvZiBlYWNoIGN1cnJlbmN5IGZvciB0aGUgXCJBbW91bnQgaW4gd29yZHNcIiBsaW5lLlxuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbmN5V29yZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaW5yOiAnSW5kaWFuIFJ1cGVlJyxcbiAgICBkb2xsYXI6ICdVUyBEb2xsYXInLFxuICAgIHNpbmdhcG9yZWRvbGxhcjogJ1NpbmdhcG9yZSBEb2xsYXInLFxuICAgIGV1cm86ICdFdXJvJyxcbiAgfTtcblxuICAvLyBMb2NhbGUgdXNlZCBmb3IgZ3JvdXBpbmcgbnVtYmVycy4gZW4tSU4gaXMgbGFraHMvY3JvcmVzOyBldmVyeXRoaW5nIGVsc2VcbiAgLy8gZ2V0cyB3ZXN0ZXJuIHRob3VzYW5kcyBncm91cGluZy5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW5jeUxvY2FsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaW5yOiAnZW4tSU4nLFxuICAgIGRvbGxhcjogJ2VuLVVTJyxcbiAgICBzaW5nYXBvcmVkb2xsYXI6ICdlbi1TRycsXG4gICAgZXVybzogJ2VuLUlFJyxcbiAgfTtcblxuICBjdXJyZW5jeVN5bWJvbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLmludm9pY2VEYXRhPy5jdXJyZW5jeTtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW5jeVN5bWJvbHNbY29kZSB8fCAnJ10gfHwgJyQnO1xuICB9XG5cbiAgLy8gUGF5bWVudCB0ZXJtIGluIGRheXMuIFRoZSBpbnZvaWNlIGRvYyBkb2Vzbid0IHN0b3JlIHBheW1lbnRUZXJtIChpdCBsaXZlc1xuICAvLyBvbiB0aGUgYmlsbGluZyBncm91cCksIHNvIGRlcml2ZSBpdCBmcm9tIGR1ZURhdGUg4oiSIGJpbGxpbmdEYXRlLCB3aGljaCBpc1xuICAvLyBhY2N1cmF0ZSBmb3IgZXZlcnkgaW52b2ljZS4gRmFsbHMgYmFjayB0byBhIHN0b3JlZCBwYXltZW50VGVybSwgZWxzZSAzMC5cbiAgZ2V0IHBheW1lbnRUZXJtRGF5cygpOiBudW1iZXIge1xuICAgIGNvbnN0IGludiA9IHRoaXMuaW52b2ljZURhdGE7XG4gICAgaWYgKGludj8uYmlsbGluZ0RhdGUgJiYgaW52Py5kdWVEYXRlKSB7XG4gICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKGludi5iaWxsaW5nRGF0ZSkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBjb25zdCBkdWUgPSBuZXcgRGF0ZShpbnYuZHVlRGF0ZSkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBjb25zdCBkYXlzID0gTWF0aC5yb3VuZCgoZHVlIC0gc3RhcnQpIC8gODY0MDAwMDApO1xuICAgICAgaWYgKGRheXMgPiAwKSByZXR1cm4gZGF5cztcbiAgICB9XG4gICAgcmV0dXJuIE51bWJlcihpbnY/LnBheW1lbnRUZXJtKSB8fCAzMDtcbiAgfVxuXG4gIGdldCB0b3RhbEluV29yZHMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2RlID0gdGhpcy5pbnZvaWNlRGF0YT8uY3VycmVuY3k7XG4gICAgY29uc3Qgd29yZHMgPSB0aGlzLmN1cnJlbmN5V29yZHNbY29kZSB8fCAnJ10gfHwgJ1VTIERvbGxhcic7XG4gICAgY29uc3QgdG90YWwgPSBNYXRoLnJvdW5kKE51bWJlcih0aGlzLmludm9pY2VEYXRhPy50b3RhbEFtb3VudCB8fCAwKSk7XG4gICAgcmV0dXJuIGAke3dvcmRzfSAke2Ftb3VudEluV29yZHModG90YWwpfSBPbmx5YDtcbiAgfVxuXG4gIGZvcm1hdElOUih2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBuID0gTnVtYmVyKHZhbHVlKTtcbiAgICBpZiAoIWlzRmluaXRlKG4pKSByZXR1cm4gJzAuMDAnO1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLmludm9pY2VEYXRhPy5jdXJyZW5jeTtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmN1cnJlbmN5TG9jYWxlc1tjb2RlIHx8ICcnXSB8fCAnZW4tVVMnO1xuICAgIHJldHVybiBuLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIsIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMiB9KTtcbiAgfVxuXG4gIC8vIE1pcnJvcnMgdGhlIGJhY2tlbmQgdHJhbnNmb3JtOiBgdGFuZ29UcmFmZmljYCAtPiBgVGFuZ28gVHJhZmZpY2AuXG4gIGZvcm1hdFByb2R1Y3ROYW1lKG5hbWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gICAgY29uc3QgcGFydHMgPSBTdHJpbmcobmFtZSkucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxICQyJykuc3BsaXQoJyAnKTtcbiAgICByZXR1cm4gcGFydHMubWFwKCh3KSA9PiB3LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdy5zbGljZSgxKSkuam9pbignICcpO1xuICB9XG5cbiAgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwiaW52b2ljZS1wcmV2aWV3LW1vZGFsXCI+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgcHJldmlldy10YWJzXCIgcm9sZT1cInRhYmxpc3RcIj5cbiAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtbGlua1wiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09PSAnaW52b2ljZSdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ2ludm9pY2UnKVwiIHR5cGU9XCJidXR0b25cIj5JbnZvaWNlPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1saW5rXCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIgPT09ICdhbm5leHVyZSdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ2FubmV4dXJlJylcIiB0eXBlPVwiYnV0dG9uXCI+QW5uZXh1cmU8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIChjbGljayk9XCJhY3RpdmVNb2RhbC5kaXNtaXNzKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgcC0wXCI+XG4gICAgPCEtLSBJTlZPSUNFIFRBQiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnaW52b2ljZSdcIiBjbGFzcz1cImludm9pY2UtcGFnZVwiPlxuICAgICAgPCEtLSBIZWFkZXIgcm93IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1zdGFydFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnJhbmRcIj5cbiAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvdGFuZ28vSW1hZ2VzL3RhbmdvZXllLWxvZ28uc3ZnXCIgYWx0PVwiVGFuZ29FeWVcIiBjbGFzcz1cImJyYW5kLWxvZ29cIiBvbmVycm9yPVwidGhpcy5zdHlsZS5kaXNwbGF5PSdub25lJ1wiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wYW55LWJsb2NrIG10LTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wYW55LW5hbWVcIj5UQU5HTyBJVCBTT0xVVElPTlMgSU5ESUEgUFJJVkFURSBMVEQ8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+Mm5kIEZsb29yLCBBcGVlamF5IEJ1c2luZXNzIENlbnRyZSwgTm8uMTIvMzksPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PkhhZGRvd3MgUm9hZCwgTnVuZ2FtYmFra2FtPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PkNoZW5uYWkgVGFtaWwgTmFkdSA2MDAwMDYsIEluZGlhPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMVwiPjxzdHJvbmc+R1NUSU4gMzNBQUdDVDMxMjRSMVoyPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMVwiPk1TTUUgLyBVZHlhbSB0eXBlIDogTWljcm88L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+TVNNRSAvIFVkeWFtIE5vLiA6IFVEWUFNLVROLTAzLTAyMTIzOTk8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNSB0ZXh0LWVuZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YXgtaW52b2ljZS1sYWJlbFwiPlRBWCBJTlZPSUNFPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtbnVtYmVyXCI+IyB7eyBpbnZvaWNlRGF0YT8uaW52b2ljZSB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEJpbGwtdG8gKyB0b3RhbHMgcm93IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtN1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiaWxsLXRvLWxhYmVsXCI+QklMTCBUTyA6PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNsaWVudC1uYW1lIG10LTFcIj57eyAoaW52b2ljZURhdGE/LmNsaWVudE5hbWUgfHwgaW52b2ljZURhdGE/LmNvbXBhbnlOYW1lKSB8IHVwcGVyY2FzZSB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xXCIgKm5nSWY9XCJpbnZvaWNlRGF0YT8uYmlsbGluZ0FkZHJlc3NMaW5lT25lIHx8IGludm9pY2VEYXRhPy5jb21wYW55QWRkcmVzc1wiPlxuICAgICAgICAgICAge3sgaW52b2ljZURhdGE/LmJpbGxpbmdBZGRyZXNzTGluZU9uZSB8fCBpbnZvaWNlRGF0YT8uY29tcGFueUFkZHJlc3MgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW52b2ljZURhdGE/LmJpbGxpbmdBZGRyZXNzTGluZVR3b1wiPnt7IGludm9pY2VEYXRhPy5iaWxsaW5nQWRkcmVzc0xpbmVUd28gfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW52b2ljZURhdGE/LmJpbGxpbmdDaXR5IHx8IGludm9pY2VEYXRhPy5iaWxsaW5nUGluQ29kZSB8fCBpbnZvaWNlRGF0YT8uYmlsbGluZ1N0YXRlXCI+XG4gICAgICAgICAgICB7eyBpbnZvaWNlRGF0YT8uYmlsbGluZ0NpdHkgfX08c3BhbiAqbmdJZj1cImludm9pY2VEYXRhPy5iaWxsaW5nUGluQ29kZVwiPiwge3sgaW52b2ljZURhdGE/LmJpbGxpbmdQaW5Db2RlIH19PC9zcGFuPjxzcGFuICpuZ0lmPVwiaW52b2ljZURhdGE/LmJpbGxpbmdTdGF0ZVwiPiwge3sgaW52b2ljZURhdGE/LmJpbGxpbmdTdGF0ZSB9fTwvc3Bhbj48c3BhbiAqbmdJZj1cImludm9pY2VEYXRhPy5iaWxsaW5nQ291bnRyeVwiPiwge3sgaW52b2ljZURhdGE/LmJpbGxpbmdDb3VudHJ5IH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJpbnZvaWNlRGF0YT8uR1NUTnVtYmVyXCI+PHN0cm9uZz5HU1RJTiB7eyBpbnZvaWNlRGF0YT8uR1NUTnVtYmVyIH19PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImludm9pY2VEYXRhPy5QbGFjZU9mU3VwcGx5XCI+UGxhY2UgT2YgU3VwcGx5OiB7eyBpbnZvaWNlRGF0YT8uUGxhY2VPZlN1cHBseSB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC01IHRleHQtZW5kXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtdG90YWwtbGFiZWxcIj5JbnZvaWNlIFRvdGFsIDxzcGFuIGNsYXNzPVwiaW52b2ljZS10b3RhbC1hbW91bnRcIj57eyBjdXJyZW5jeVN5bWJvbCgpIH19IHt7IGZvcm1hdElOUihpbnZvaWNlRGF0YT8udG90YWxBbW91bnQpIH19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDx0YWJsZSBjbGFzcz1cIm1ldGEtdGFibGUgbXMtYXV0byBtdC0zXCI+XG4gICAgICAgICAgICA8dHI+PHRkIGNsYXNzPVwibWV0YS1sYWJlbFwiPkludm9pY2UgZGF0ZSA6PC90ZD48dGQgY2xhc3M9XCJtZXRhLXZhbHVlXCI+e3sgaW52b2ljZURhdGE/LmJpbGxpbmdEYXRlIHwgZGF0ZTonZGQvTU0veXl5eScgfX08L3RkPjwvdHI+XG4gICAgICAgICAgICA8dHI+PHRkIGNsYXNzPVwibWV0YS1sYWJlbFwiPlRlcm1zIDo8L3RkPjx0ZCBjbGFzcz1cIm1ldGEtdmFsdWVcIj5UZXJtIHt7IHBheW1lbnRUZXJtRGF5cyB9fTwvdGQ+PC90cj5cbiAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9XCJtZXRhLWxhYmVsXCI+RHVlIERhdGUgOjwvdGQ+PHRkIGNsYXNzPVwibWV0YS12YWx1ZVwiPnt7IGludm9pY2VEYXRhPy5kdWVEYXRlIHwgZGF0ZTonZGQvTU0veXl5eScgfX08L3RkPjwvdHI+XG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJpbnZvaWNlRGF0YT8ucHVyY2hhc2VPcmRlck51bWJlciB8fCBpbnZvaWNlRGF0YT8uUG9OdW0gfHwgaW52b2ljZURhdGE/LnBvTnVtYmVyXCI+PHRkIGNsYXNzPVwibWV0YS1sYWJlbFwiPlAuTy4jIDo8L3RkPjx0ZCBjbGFzcz1cIm1ldGEtdmFsdWVcIj57eyBpbnZvaWNlRGF0YT8ucHVyY2hhc2VPcmRlck51bWJlciB8fCBpbnZvaWNlRGF0YT8uUG9OdW0gfHwgaW52b2ljZURhdGE/LnBvTnVtYmVyIH19PC90ZD48L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTGluZSBpdGVtcyAtLT5cbiAgICAgIDx0YWJsZSBjbGFzcz1cIml0ZW1zLXRhYmxlIG10LTRcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1pbmRleFwiPiM8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiY29sLXByb2R1Y3RcIj5Qcm9kdWN0ICZhbXA7IERlc2NyaXB0aW9uPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1tb250aFwiPk1vbnRoPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1oc25cIj5IU04vU0FDPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1jb3VudCB0ZXh0LWNlbnRlclwiPlF1YW50aXR5PC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1yYXRlIHRleHQtZW5kXCI+UmF0ZTwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJjb2wtYW1vdW50IHRleHQtZW5kXCI+QW1vdW50PC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGludm9pY2VEYXRhPy5wcm9kdWN0czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgICA8dGQ+e3sgaSArIDEgfX08L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1uYW1lXCI+e3sgZm9ybWF0UHJvZHVjdE5hbWUoaXRlbT8ucHJvZHVjdE5hbWUpIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWRlc2NcIj57eyBpdGVtPy5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwhLS0gTW9udGggaXMgdGhlIHByb2R1Y3QncyBiaWxsaW5nIG1vbnRoIHN0b3JlZCBvbiB0aGUgbGluZSBpdGVtXG4gICAgICAgICAgICAgICAgIChhZHZhbmNlIGludm9pY2VzIGJpbGwgYSBmdXR1cmUgbW9udGggd2hpbGUgYmlsbGluZ0RhdGUgaXMgdGhlXG4gICAgICAgICAgICAgICAgIGNyZWF0aW9uIGRhdGUpLiBGYWxsIGJhY2sgdG8gYmlsbGluZ0RhdGUgZm9yIGxlZ2FjeSByb3dzLiAtLT5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm5vd3JhcFwiPnt7IGl0ZW0/Lm1vbnRoIHx8IChpbnZvaWNlRGF0YT8uYmlsbGluZ0RhdGUgfCBkYXRlOidNTU0geXl5eScpIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyBpdGVtPy5oc24gfHwgaXRlbT8uaHNuQ29kZSB8fCAnOTk4MzE0JyB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPjxzdHJvbmc+e3sgaXRlbT8uc3RvcmVDb3VudCB8fCBpbnZvaWNlRGF0YT8uc3RvcmVzPy5sZW5ndGggfHwgJycgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmQgbm93cmFwXCI+e3sgY3VycmVuY3lTeW1ib2woKSB9fSB7eyBmb3JtYXRJTlIoaXRlbT8ucHJpY2UpIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kIG5vd3JhcFwiPnt7IGN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZm9ybWF0SU5SKGl0ZW0/LmFtb3VudCkgfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuXG4gICAgICA8IS0tIFRvdGFscyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC01XCI+XG4gICAgICAgICAgPHRhYmxlIGNsYXNzPVwidG90YWxzLXRhYmxlIG1zLWF1dG9cIj5cbiAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9XCJ0b3RhbHMtbGFiZWxcIj5TdWIgVG90YWw8L3RkPjx0ZCBjbGFzcz1cInRvdGFscy12YWx1ZVwiPnt7IGN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZm9ybWF0SU5SKGludm9pY2VEYXRhPy5hbW91bnQpIH19PC90ZD48L3RyPlxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCB0IG9mIGludm9pY2VEYXRhPy50YXhcIj5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLWxhYmVsXCI+e3sgdD8udHlwZSB8fCB0Py50YXhOYW1lIHx8IHQ/Lm5hbWUgfX0gKHt7IHQ/LnZhbHVlID8/IHQ/LnRheFBlcmNlbnRhZ2UgPz8gdD8ucGVyY2VudGFnZSB9fSUpPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLXZhbHVlIG5vd3JhcFwiPnt7IGN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZm9ybWF0SU5SKHQ/LnRheEFtb3VudCkgfX08L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0ciBjbGFzcz1cInRvdGFscy10b3RhbC1yb3dcIj5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLWxhYmVsXCI+VG90YWwgQW1vdW50PC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLXZhbHVlXCI+e3sgY3VycmVuY3lTeW1ib2woKSB9fSB7eyBmb3JtYXRJTlIoaW52b2ljZURhdGE/LnRvdGFsQW1vdW50KSB9fTwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyIGNsYXNzPVwidG90YWxzLXdvcmRzLXJvd1wiPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0b3RhbHMtbGFiZWxcIj5Ub3RhbCBJbiBXb3JkczwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRvdGFscy12YWx1ZSB3b3Jkc1wiPnt7IHRvdGFsSW5Xb3JkcyB9fTwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGF5bWVudCBkZXRhaWxzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRoYW5rcyBtdC00XCI+VGhhbmtzIGZvciB5b3VyIGJ1c2luZXNzITwvZGl2PlxuICAgICAgPHRhYmxlIGNsYXNzPVwicGF5bWVudC10YWJsZSBtdC0yXCI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+QmVuZWZpY2lhcnkgTmFtZTwvdGQ+PHRkIGNsYXNzPVwicGF5bWVudC12YWx1ZVwiPjxzdHJvbmc+e3sgYmFua0RldGFpbHM/LmJlbmVmaWNpYXJ5TmFtZSB9fTwvc3Ryb25nPjwvdGQ+PC90cj5cbiAgICAgICAgPHRyPjx0ZCBjbGFzcz1cInBheW1lbnQtbGFiZWxcIj5BY2NvdW50IE51bWJlcjwvdGQ+PHRkIGNsYXNzPVwicGF5bWVudC12YWx1ZVwiPjxzdHJvbmc+e3sgYmFua0RldGFpbHM/LmFjY291bnROdW1iZXIgfX08L3N0cm9uZz48L3RkPjwvdHI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+SUZTQyBDb2RlPC90ZD48dGQgY2xhc3M9XCJwYXltZW50LXZhbHVlXCI+PHN0cm9uZz57eyBiYW5rRGV0YWlscz8uaWZzYyB9fTwvc3Ryb25nPjwvdGQ+PC90cj5cbiAgICAgICAgPHRyPjx0ZCBjbGFzcz1cInBheW1lbnQtbGFiZWxcIj5QYXltZW50IFR5cGU8L3RkPjx0ZCBjbGFzcz1cInBheW1lbnQtdmFsdWVcIj48c3Ryb25nPnt7IGJhbmtEZXRhaWxzPy5wYXltZW50VHlwZSB9fTwvc3Ryb25nPjwvdGQ+PC90cj5cbiAgICAgICAgPHRyPjx0ZCBjbGFzcz1cInBheW1lbnQtbGFiZWxcIj5TV0lGVCBDb2RlPC90ZD48dGQgY2xhc3M9XCJwYXltZW50LXZhbHVlXCI+PHN0cm9uZz57eyBiYW5rRGV0YWlscz8uc3dpZnQgfX08L3N0cm9uZz48L3RkPjwvdHI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+QnJhbmNoPC90ZD48dGQgY2xhc3M9XCJwYXltZW50LXZhbHVlXCI+PHN0cm9uZz57eyBiYW5rRGV0YWlscz8uYnJhbmNoIH19PC9zdHJvbmc+PC90ZD48L3RyPlxuICAgICAgPC90YWJsZT5cblxuICAgICAgPGRpdiBjbGFzcz1cInN5c3RlbS1ub3RlIG10LTRcIj5UaGlzIGlzIGEgc3lzdGVtIGdlbmVyYXRlZCBpbnZvaWNlLiBObyBzaWduYXR1cmUgcmVxdWlyZWQ8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQU5ORVhVUkUgVEFCIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdhbm5leHVyZSdcIiBjbGFzcz1cImFubmV4dXJlLXBhZ2VcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCJhbm5leHVyZUxvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmctc3RhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHRleHQtcHJpbWFyeVwiIHJvbGU9XCJzdGF0dXNcIj48c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhYW5uZXh1cmVMb2FkaW5nICYmIGFubmV4dXJlRXJyb3JcIiBjbGFzcz1cImVycm9yLXN0YXRlXCI+XG4gICAgICAgIDxwPkZhaWxlZCB0byBsb2FkIGFubmV4dXJlLjwvcD5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeVwiIChjbGljayk9XCJyZXRyeUFubmV4dXJlKClcIj5SZXRyeTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWFubmV4dXJlTG9hZGluZyAmJiAhYW5uZXh1cmVFcnJvciAmJiBhbm5leHVyZURhdGEgIT09IG51bGwgJiYgYW5uZXh1cmVEYXRhLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZW1wdHktc3RhdGVcIj5cbiAgICAgICAgTm8gYW5uZXh1cmUgZGF0YSBmb3IgdGhpcyBpbnZvaWNlLlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWFubmV4dXJlTG9hZGluZyAmJiAhYW5uZXh1cmVFcnJvciAmJiBhbm5leHVyZURhdGEgJiYgYW5uZXh1cmVEYXRhLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICBjbGFzcz1cImFubmV4dXJlLXRvb2xiYXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiAoY2xpY2spPVwiZG93bmxvYWRBbm5leHVyZVhsc3goKVwiPlxuICAgICAgICAgIEV4cG9ydCBhcyBYTFNYXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8dGFibGUgKm5nSWY9XCIhYW5uZXh1cmVMb2FkaW5nICYmICFhbm5leHVyZUVycm9yICYmIGFubmV4dXJlRGF0YSAmJiBhbm5leHVyZURhdGEubGVuZ3RoID4gMFwiIGNsYXNzPVwiYW5uZXh1cmUtdGFibGVcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aD5TdG9yZSBOYW1lPC90aD5cbiAgICAgICAgICAgIDx0aD5Qcm9kdWN0czwvdGg+XG4gICAgICAgICAgICA8dGg+U3RvcmUgSUQ8L3RoPlxuICAgICAgICAgICAgPHRoPkRlcGxveW1lbnQgRGF0ZTwvdGg+XG4gICAgICAgICAgICA8dGg+UGVyaW9kPC90aD5cbiAgICAgICAgICAgIDx0aD5QcmljaW5nIE1ldGhvZDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPkJpbGxpbmcgRGF5czwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlF0eTwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWVuZFwiPlVuaXQgUHJpY2U8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1lbmRcIj5QcmljZSBQZXIgTW9udGg8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBhbm5leHVyZURhdGE7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiPlxuICAgICAgICAgICAgPHRkPnt7IHJvdz8uc3RvcmVOYW1lIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyByb3c/LnByb2R1Y3ROYW1lIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyByb3c/LnN0b3JlSWQgfX08L3RkPlxuICAgICAgICAgICAgPHRkPnt7IHJvdz8uZWRnZWZpcnN0RmlsZURhdGUgfX08L3RkPlxuICAgICAgICAgICAgPHRkPnt7IHJvdz8ucGVyaW9kID09PSAncHJvcmF0ZScgPyAnUHJvLXJhdGUnIDogJ0Z1bGwgbW9udGgnIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyByb3c/LnVuaXRCYXNpcyB8fCAnUGVyIFN0b3JlJyB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPjxzdHJvbmc+e3sgcm93Py53b3JraW5nZGF5cyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7IHJvdz8udW5pdHMgPz8gMSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICB7eyByb3c/LmN1cnJlbmN5VHlwZSB9fSB7eyBmb3JtYXRJTlIocm93Py5zdGFuZGFyZFByaWNlKSB9fVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidW5pdC1iYXNpc1wiPnt7IHJvdz8udW5pdEJhc2lzIHx8ICdQZXIgU3RvcmUnIH19PC9kaXY+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPnt7IHJvdz8uY3VycmVuY3lUeXBlIH19IHt7IGZvcm1hdElOUihyb3c/LnJ1bm5pbmdDb3N0KSB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPHRmb290ICpuZ0lmPVwiYW5uZXh1cmVUb3RhbCAhPSBudWxsXCI+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI5XCIgY2xhc3M9XCJ0ZXh0LWVuZFwiPjxzdHJvbmc+VG90YWw8L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPnt7IGFubmV4dXJlRGF0YVswXT8uY3VycmVuY3lUeXBlIH19IHt7IGZvcm1hdElOUihhbm5leHVyZVRvdGFsKSB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Zm9vdD5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCIgKGNsaWNrKT1cImFjdGl2ZU1vZGFsLmRpc21pc3MoKVwiPkNsb3NlPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5XCIgKGNsaWNrKT1cImRvd25sb2FkUGRmKClcIiBbZGlzYWJsZWRdPVwiZG93bmxvYWRpbmdcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWRvd25sb2FkaW5nXCI+RG93bmxvYWQgUERGPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJkb3dubG9hZGluZ1wiPkRvd25sb2FkaW5nLi4uPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|