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

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.
@@ -497,14 +497,14 @@ export class EditInvoiceComponent {
497
497
  this.creditNoteForm = this.fb.group({
498
498
  amount: [''],
499
499
  revisedAmount: ['', Validators.required],
500
- discount: ['', [Validators.required, Validators.max(10)]],
500
+ discount: ['', [Validators.required]],
501
501
  });
502
502
  this.creditNoteForm.get('revisedAmount')?.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((e) => {
503
503
  if (e) {
504
504
  const amount = this.creditNoteForm.get('amount')?.value;
505
505
  if (amount) {
506
506
  const discount = ((amount - e) / amount * 100).toFixed(2);
507
- this.creditMoreThanTenPercent = parseFloat(discount) > 10 || isNaN(e) || parseFloat(discount) < 0 || e < 0;
507
+ this.creditMoreThanTenPercent = isNaN(e) || parseFloat(discount) < 0 || e < 0;
508
508
  this.creditNoteForm.get('discount')?.setValue(discount, { emitEvent: false });
509
509
  }
510
510
  }
@@ -517,7 +517,7 @@ export class EditInvoiceComponent {
517
517
  if (e) {
518
518
  const amount = this.creditNoteForm.get('amount')?.value;
519
519
  const revised = parseInt((amount * (1 - e / 100)).toFixed());
520
- this.creditMoreThanTenPercent = parseFloat(e) > 10 || isNaN(e) || e < 0 || revised < 0;
520
+ this.creditMoreThanTenPercent = isNaN(e) || e < 0 || revised < 0;
521
521
  this.creditNoteForm.get('revisedAmount')?.setValue(revised, { emitEvent: false });
522
522
  }
523
523
  else {
@@ -607,11 +607,11 @@ export class EditInvoiceComponent {
607
607
  });
608
608
  }
609
609
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditInvoiceComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.FormBuilder }, { token: i3.BillingService }, { token: i0.ChangeDetectorRef }, { token: i4.ToastService }], target: i0.ɵɵFactoryTarget.Component });
610
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EditInvoiceComponent, selector: "lib-edit-invoice", inputs: { invoiceData: "invoiceData", mode: "mode", clientId: "clientId", billingGroups: "billingGroups" }, ngImport: i0, template: "<div class=\"modal-content\">\n <div class=\"p-5 px-6 pb-0\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"heading mt-2\">{{ mode === 'edit' ? 'Invoice' : (mode === 'estimate' ? 'Generate Estimate' : (mode === 'editEstimate' ? 'Edit Estimate' : 'Create Invoice')) }}\n <span *ngIf=\"mode === 'edit'\" class=\"invoice-number\">{{ invoiceData?.invoice }}</span>\n <span *ngIf=\"mode === 'editEstimate'\" class=\"invoice-number\">{{ invoiceData?.estimate }}</span>\n </div>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\"></button>\n </div>\n\n <!-- Tabs (only in edit mode) -->\n <div class=\"tab-bar mt-3\" *ngIf=\"mode === 'edit'\">\n <button class=\"tab-btn\" [ngClass]=\"activeTab === 'edit' ? 'tab-active' : ''\"\n (click)=\"setTab('edit')\">Edit Invoice</button>\n <button class=\"tab-btn\" [ngClass]=\"activeTab === 'creditNote' ? 'tab-active' : ''\"\n (click)=\"setTab('creditNote')\">Credit Note</button>\n <button class=\"tab-btn\" [ngClass]=\"activeTab === 'oneTimeFee' ? 'tab-active' : ''\"\n (click)=\"setTab('oneTimeFee')\">One Time Fee</button>\n </div>\n </div>\n\n <!-- ======================== EDIT INVOICE TAB ======================== -->\n <div class=\"modal-body mb-4\" *ngIf=\"activeTab === 'edit' || mode !== 'edit'\">\n <form [formGroup]=\"invoiceForm\" class=\"form\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Company Details Section -->\n <div class=\"section-title mb-3\">Company Details</div>\n\n <div class=\"row\">\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Company Name <span class=\"text-danger\">*</span></label>\n <input type=\"text\" formControlName=\"companyName\" class=\"form-control\"\n [class.is-invalid]=\"controlInvalid('companyName')\"\n [readonly]=\"mode === 'edit'\">\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('companyName')\">Company Name is required</div>\n </div>\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">GST Number</label>\n <input type=\"text\" formControlName=\"GSTNumber\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Company Address</label>\n <input type=\"text\" formControlName=\"companyAddress\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Place of Supply</label>\n <input type=\"text\" formControlName=\"PlaceOfSupply\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n </div>\n\n <!-- Billing Group -->\n <div class=\"row\" *ngIf=\"billingGroups.length > 0\">\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Billing Group <span *ngIf=\"mode !== 'edit'\" class=\"text-danger\">*</span></label>\n <select *ngIf=\"mode !== 'edit'\" class=\"form-select\" formControlName=\"groupId\"\n [class.is-invalid]=\"controlInvalid('groupId')\"\n (change)=\"onGroupChange($event)\">\n <option value=\"\">Select billing group</option>\n <option *ngFor=\"let g of billingGroups\" [value]=\"g._id\">{{ g.groupName }}</option>\n </select>\n <input *ngIf=\"mode === 'edit'\" type=\"text\" [value]=\"invoiceForm.get('groupName')?.value || 'Default Group'\" class=\"form-control\" readonly>\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('groupId')\">Billing Group is required</div>\n </div>\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Group Name</label>\n <input type=\"text\" formControlName=\"groupName\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n </div>\n\n <!-- Invoice Details Section -->\n <div class=\"section-title mb-3 mt-2\">Invoice Details</div>\n\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">Billing Date <span class=\"text-danger\">*</span></label>\n <input type=\"date\" formControlName=\"billingDate\" class=\"form-control\"\n [class.is-invalid]=\"controlInvalid('billingDate')\">\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('billingDate')\">Billing Date is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">Due Date <span class=\"text-danger\">*</span></label>\n <input type=\"date\" formControlName=\"dueDate\" class=\"form-control\"\n [class.is-invalid]=\"controlInvalid('dueDate')\">\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('dueDate')\">Due Date is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">Currency <span class=\"text-danger\">*</span></label>\n <select class=\"form-select\" formControlName=\"currency\"\n [class.is-invalid]=\"controlInvalid('currency')\">\n <option *ngFor=\"let c of currencyOptions\" [value]=\"c\">\n {{ currencyLabels[c] }}\n </option>\n </select>\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('currency')\">Currency is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">No. of Stores</label>\n <input type=\"number\" formControlName=\"stores\" class=\"form-control\" readonly>\n </div>\n <!-- Purchase Order mapping (optional). Mapping deducts this\n invoice's amount from the selected PO's remaining balance. -->\n <div class=\"col-md-3 form-group mb-3\" *ngIf=\"mode !== 'estimate' && mode !== 'editEstimate'\">\n <label class=\"headingtext mb-1\">Purchase Order</label>\n <select class=\"form-select\" formControlName=\"purchaseOrderNumber\">\n <option value=\"\">None</option>\n <option *ngFor=\"let po of purchaseOrders\" [value]=\"po.purchaseOrderNumber\">\n {{ po.purchaseOrderNumber }} ({{ getCurrencySymbol() }}{{ po.remainingAmount | number:'1.0-0':'en-IN' }} left)\n </option>\n </select>\n </div>\n </div>\n\n <!-- Advance Invoice (create only): bill several future months upfront.\n Each month becomes its own line item server-side. -->\n <div class=\"row\" *ngIf=\"mode === 'create'\">\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1 d-block\">Advance Invoice</label>\n <div class=\"form-check form-switch mt-1\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"advanceInvoiceCreate\"\n formControlName=\"advanceInvoice\">\n <label class=\"form-check-label\" for=\"advanceInvoiceCreate\">Bill future months upfront</label>\n </div>\n </div>\n <div class=\"col-md-3 form-group mb-3\" *ngIf=\"invoiceForm.get('advanceInvoice')?.value\">\n <label class=\"headingtext mb-1\">Advance frequency</label>\n <select class=\"form-select\" formControlName=\"advancePeriod\">\n <option *ngFor=\"let opt of advancePeriodOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n </div>\n </div>\n\n\n <!-- Products Section -->\n <div class=\"section-title mb-3 mt-2\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <span>Products</span>\n <div class=\"d-flex gap-2\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"addProduct()\">\n + Add Product\n </button>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"addCustomProduct()\">\n + Add Custom Product\n </button>\n </div>\n </div>\n </div>\n\n <div formArrayName=\"products\">\n <div *ngFor=\"let product of products.controls; let i = index\" [formGroupName]=\"i\"\n class=\"product-row mb-3 p-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span class=\"product-label\">Product {{ i + 1 }}</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger\" (click)=\"removeProduct(i)\"\n *ngIf=\"products.length > 1\">\n Remove\n </button>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4 form-group mb-2\">\n <label class=\"headingtext mb-1\">Product Name <span class=\"text-danger\">*</span></label>\n <!-- Base-pricing dropdown (with a \"+ Custom product\" choice) when\n products exist and this row isn't custom; otherwise a free-text\n name input for a custom product. -->\n <select *ngIf=\"availableProducts.length > 0 && !product.get('isCustom')?.value\" formControlName=\"productName\"\n class=\"form-select\"\n [class.is-invalid]=\"arrayControlInvalid('products', i, 'productName')\"\n (change)=\"onProductChange(i)\">\n <option value=\"\">Select product</option>\n <option *ngFor=\"let p of availableProducts\" [value]=\"p.productName\">\n {{ formatProductName(p.productName) }}\n </option>\n <option value=\"__custom__\">+ Custom product</option>\n </select>\n <input *ngIf=\"availableProducts.length === 0 || product.get('isCustom')?.value\" type=\"text\" formControlName=\"productName\"\n class=\"form-control\"\n [class.is-invalid]=\"arrayControlInvalid('products', i, 'productName')\"\n placeholder=\"e.g. Custom Service\">\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('products', i, 'productName')\">Product Name is required</div>\n </div>\n <div class=\"col-md-4 form-group mb-2\">\n <label class=\"headingtext mb-1\">Description</label>\n <input type=\"text\" formControlName=\"description\" class=\"form-control\"\n placeholder=\"e.g. Customer Footfall Analytics\">\n </div>\n <div class=\"col-md-4 form-group mb-2\">\n <label class=\"headingtext mb-1\">Month</label>\n <input type=\"text\" formControlName=\"month\" class=\"form-control\"\n placeholder=\"e.g. Mar 2026\">\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">HSN/SAC</label>\n <input type=\"text\" formControlName=\"HsnNumber\" class=\"form-control\">\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Quantity</label>\n <input type=\"number\" formControlName=\"storeCount\" class=\"form-control\"\n (input)=\"recalculate()\">\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Rate/Price <span class=\"text-danger\">*</span></label>\n <input type=\"number\" formControlName=\"price\" class=\"form-control\"\n [class.is-invalid]=\"arrayControlInvalid('products', i, 'price')\"\n (input)=\"recalculate()\">\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('products', i, 'price')\">Rate/Price is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Amount</label>\n <input type=\"number\" formControlName=\"amount\" class=\"form-control\" readonly>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Period</label>\n <select class=\"form-select\" formControlName=\"period\">\n <option value=\"monthly\">Monthly</option>\n <option value=\"quarterly\">Quarterly</option>\n <option value=\"halfyearly\">Half-yearly</option>\n <option value=\"yearly\">Yearly</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Tax Section -->\n <div class=\"section-title mb-3 mt-2\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <span>Tax</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"addTax()\">\n + Add Tax\n </button>\n </div>\n </div>\n\n <div formArrayName=\"tax\">\n <div *ngFor=\"let t of taxArray.controls; let j = index\" [formGroupName]=\"j\"\n class=\"tax-row mb-3 p-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span class=\"product-label\">Tax {{ j + 1 }}</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger\" (click)=\"removeTax(j)\"\n *ngIf=\"taxArray.length > 1\">\n Remove\n </button>\n </div>\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Tax Type <span class=\"text-danger\">*</span></label>\n <select class=\"form-select\" formControlName=\"type\"\n [class.is-invalid]=\"arrayControlInvalid('tax', j, 'type')\">\n <option *ngFor=\"let tt of taxTypes\" [value]=\"tt\">{{ tt }}</option>\n </select>\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('tax', j, 'type')\">Tax Type is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Tax % <span class=\"text-danger\">*</span></label>\n <input type=\"number\" formControlName=\"value\" class=\"form-control\"\n [class.is-invalid]=\"arrayControlInvalid('tax', j, 'value')\"\n (input)=\"recalculate()\">\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('tax', j, 'value')\">Tax % is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Tax Amount</label>\n <input type=\"text\" formControlName=\"taxAmount\" class=\"form-control\" readonly>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Currency Symbol</label>\n <input type=\"text\" formControlName=\"currency\" class=\"form-control\">\n </div>\n </div>\n </div>\n </div>\n\n <!-- Summary -->\n <div class=\"summary-section p-3 mt-3\">\n <div class=\"d-flex justify-content-between mb-2\">\n <span class=\"summary-label\">Subtotal</span>\n <span class=\"summary-value\">{{ getCurrencySymbol() }} {{ getSubtotal() | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"d-flex justify-content-between mb-2\">\n <span class=\"summary-label\">Total Tax</span>\n <span class=\"summary-value\">{{ getCurrencySymbol() }} {{ getTotalTax() | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"d-flex justify-content-between summary-total\">\n <span class=\"summary-label-bold\">Total Amount</span>\n <span class=\"summary-value-bold\">{{ getCurrencySymbol() }} {{ getTotalAmount() | number:'1.2-2':'en-IN'\n }}</span>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"d-flex mt-4\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn-outline btn cancel me-4 w-50\">Cancel</button>\n <button type=\"submit\" [disabled]=\"saving\"\n class=\"btn btn-primary px-4 w-50\" style=\"white-space: nowrap;\">\n <span *ngIf=\"!saving\" class=\"submit\">{{ mode === 'edit' ? 'Update Invoice' : (mode === 'estimate' ? 'Generate Estimate' : (mode === 'editEstimate' ? 'Update Estimate' : 'Create Invoice'))\n }}</span>\n <span *ngIf=\"saving\" class=\"submit\">Saving...</span>\n </button>\n </div>\n </form>\n </div>\n\n <!-- ======================== CREDIT NOTE TAB ======================== -->\n <div class=\"modal-body mb-4\" *ngIf=\"activeTab === 'creditNote' && mode === 'edit'\">\n <form [formGroup]=\"creditNoteForm\" class=\"form\">\n <div class=\"contenttext mb-3\">\n Apply a credit note / discount to this invoice. Maximum 10% discount allowed.\n </div>\n\n <div class=\"d-flex flex-column\">\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Invoice ID</label>\n <input type=\"text\" class=\"form-control\" [value]=\"invoiceData?.invoice\" readonly>\n </div>\n\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Total Amount</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input formControlName=\"amount\" type=\"text\" readonly class=\"form-control amount-input\">\n </div>\n </div>\n\n <div class=\"form-group mt-2\">\n <div class=\"py-2\">\n <label class=\"headingtext mb-2\">Revised Amount</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input type=\"text\" formControlName=\"revisedAmount\"\n (keypress)=\"omitSpecialChar($event)\"\n class=\"form-control amount-input\"\n [ngClass]=\"creditMoreThanTenPercent ? 'errorinput' : ''\">\n <span class=\"input-icon\" *ngIf=\"creditMoreThanTenPercent\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\">\n <g clip-path=\"url(#clip_cn_err)\">\n <path\n d=\"M7.99967 5.33301V7.99967M7.99967 10.6663H8.00634M14.6663 7.99967C14.6663 11.6816 11.6816 14.6663 7.99967 14.6663C4.31778 14.6663 1.33301 11.6816 1.33301 7.99967C1.33301 4.31778 4.31778 1.33301 7.99967 1.33301C11.6816 1.33301 14.6663 4.31778 14.6663 7.99967Z\"\n stroke=\"#F04438\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip_cn_err\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n </div>\n </div>\n <span [ngClass]=\"creditMoreThanTenPercent ? 'text-danger' : 'contenttext'\" class=\"small\">\n More than 10% can't be revised from total amount\n </span>\n </div>\n\n <div class=\"form-group mt-2\">\n <div class=\"py-2\">\n <label class=\"headingtext mb-2\">Discount</label>\n <div class=\"input-group\">\n <input type=\"text\" formControlName=\"discount\"\n (keypress)=\"omitSpecialChar($event)\"\n class=\"form-control\"\n [ngClass]=\"creditMoreThanTenPercent ? 'errorinput' : ''\">\n <span class=\"input-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\">\n <path\n d=\"M12.667 3.33366L3.33366 12.667M6.00033 4.33366C6.00033 5.25413 5.25413 6.00033 4.33366 6.00033C3.41318 6.00033 2.66699 5.25413 2.66699 4.33366C2.66699 3.41318 3.41318 2.66699 4.33366 2.66699C5.25413 2.66699 6.00033 3.41318 6.00033 4.33366ZM13.3337 11.667C13.3337 12.5875 12.5875 13.3337 11.667 13.3337C10.7465 13.3337 10.0003 12.5875 10.0003 11.667C10.0003 10.7465 10.7465 10.0003 11.667 10.0003C12.5875 10.0003 13.3337 10.7465 13.3337 11.667Z\"\n [attr.stroke]=\"creditMoreThanTenPercent ? '#F04438' : '#98A2B3'\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n </div>\n </div>\n <span [ngClass]=\"creditMoreThanTenPercent ? 'text-danger' : 'contenttext'\" class=\"small\">\n In percentage\n </span>\n </div>\n </div>\n\n <div class=\"d-flex mt-5\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn-outline btn cancel me-4 w-50\">Cancel</button>\n <button [disabled]=\"creditMoreThanTenPercent || saving\" type=\"button\" (click)=\"applyCreditNote()\"\n class=\"btn btn-primary px-4 w-50\" style=\"white-space: nowrap;\">\n <span *ngIf=\"!saving\">Apply Credit Note</span>\n <span *ngIf=\"saving\">Applying...</span>\n </button>\n </div>\n </form>\n </div>\n\n <!-- ======================== ONE TIME FEE TAB ======================== -->\n <div class=\"modal-body mb-4\" *ngIf=\"activeTab === 'oneTimeFee' && mode === 'edit'\">\n <form [formGroup]=\"oneTimeFeeForm\" class=\"form\">\n <div class=\"contenttext mb-3\">\n Add a one-time fee (e.g. installation) to this invoice.\n </div>\n\n <div class=\"d-flex flex-column\">\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Invoice ID</label>\n <input type=\"text\" class=\"form-control\" [value]=\"invoiceData?.invoice\" readonly>\n </div>\n\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Current Invoice Amount</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input formControlName=\"amount\" type=\"text\" readonly class=\"form-control amount-input\">\n </div>\n </div>\n\n <div class=\"form-group mt-2\">\n <div class=\"py-2\">\n <label class=\"headingtext mb-2\">One Time Fee (Installation)</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input type=\"text\" formControlName=\"oneTimeFee\"\n (keypress)=\"omitSpecialChar($event)\"\n class=\"form-control amount-input\"\n placeholder=\"Enter fee amount\">\n </div>\n </div>\n </div>\n\n <div class=\"d-flex flex-stack mt-3 fee-summary p-3\">\n <div class=\"summary-label\">Selected Invoice Amount + One Time Fee</div>\n <div class=\"d-flex align-items-center\">\n <span class=\"summary-value-bold\">{{ getInvoiceCurrencySymbol() }}{{\n oneTimeFeeTotal | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex mt-5\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn-outline btn cancel me-4 w-50\">Cancel</button>\n <button [disabled]=\"saving || !oneTimeFeeForm.get('oneTimeFee')?.value\" type=\"button\"\n (click)=\"applyOneTimeFee()\"\n class=\"btn btn-primary px-4 w-50\" style=\"white-space: nowrap;\">\n <span *ngIf=\"!saving\">Apply Fee</span>\n <span *ngIf=\"saving\">Applying...</span>\n </button>\n </div>\n </form>\n </div>\n</div>", styles: [".heading{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.invoice-number{color:var(--Primary-700, #009BF3);font-weight:500;margin-left:4px}.contenttext{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-style:normal;font-weight:400;line-height:20px}.headingtext{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.tab-bar{display:flex;gap:4px;border-bottom:1px solid var(--Gray-200, #EAECF0);padding-bottom:0}.tab-btn{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500;line-height:20px;padding:8px 16px;border:none;background:none;cursor:pointer;border-bottom:2px solid transparent;transition:all .2s}.tab-btn:hover{color:var(--Gray-700, #344054)}.tab-btn.tab-active{color:var(--Primary-700, #009BF3);border-bottom:2px solid var(--Primary-700, #009BF3);font-weight:600}.section-title{color:var(--Gray-900, #101828);font-family:Inter;font-size:16px;font-weight:600;line-height:24px;padding-bottom:8px;border-bottom:1px solid var(--Gray-200, #EAECF0)}.product-row,.tax-row{background:var(--Gray-50, #F9FAFB);border:1px solid var(--Gray-200, #EAECF0);border-radius:8px}.product-label{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:600}input,.form-control{color:#101828;border:1px solid #D0D5DD!important;box-shadow:0 1px 2px #1018280d;border-radius:8px;font-size:14px;width:100%;padding:8px 12px;font-family:Inter;font-weight:400;line-height:24px}input:active,input:focus,input:focus-visible{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD)!important;box-shadow:0 1px 2px #1018280d;outline:none!important;background:var(--Gray-50, #F9FAFB)}input[readonly]{background:var(--Gray-50, #F9FAFB);color:var(--Gray-500, #667085)}.form-select{color:#101828;border:1px solid #D0D5DD!important;box-shadow:0 1px 2px #1018280d;border-radius:8px;font-size:14px;padding:8px 12px;font-family:Inter;font-weight:400;height:auto}.cancel{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:600;line-height:24px;text-transform:capitalize;border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF)}.summary-section,.fee-summary{background:var(--Gray-50, #F9FAFB);border:1px solid var(--Gray-200, #EAECF0);border-radius:8px}.summary-label{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500}.summary-value{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500}.summary-total{padding-top:8px;border-top:1px solid var(--Gray-200, #EAECF0)}.summary-label-bold,.summary-value-bold{color:var(--Gray-900, #101828);font-family:Inter;font-size:16px;font-weight:600}.text-danger{color:var(--Error-500, #F04438)!important;font-family:Inter;font-size:12px!important;font-weight:400}.modal-body{max-height:70vh;overflow-y:auto}.input-group{position:relative}.input-group .dollar-sign{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--Gray-900, #101828);font-family:Inter;font-size:16px;font-weight:400;line-height:24px;z-index:1}.input-group .amount-input{padding-left:30px}.input-group .input-icon{position:absolute;top:50%;right:12px;transform:translateY(-50%);display:inline-flex;align-items:center}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){border-radius:8px!important}.input-group>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-radius:8px!important}.errorinput{border-radius:8px;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF);box-shadow:0 1px 2px #1018280d}.errorinput:focus{border:1px solid var(--Error-300, #FDA29B)!important}.form-control.is-invalid,.form-select.is-invalid{border:1px solid var(--Error-300, #FDA29B)!important;background:#fef3f2}.form-control.is-invalid:focus,.form-control.is-invalid:active,.form-control.is-invalid:focus-visible,.form-select.is-invalid:focus,.form-select.is-invalid:active,.form-select.is-invalid:focus-visible{border:1px solid var(--Error-300, #FDA29B)!important;box-shadow:0 0 0 4px #f044381f!important;background:#fef3f2}.invalid-msg{color:#b42318;font-family:Inter;font-size:12px;font-weight:500;line-height:18px;margin-top:4px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i5.DecimalPipe, name: "number" }] });
610
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EditInvoiceComponent, selector: "lib-edit-invoice", inputs: { invoiceData: "invoiceData", mode: "mode", clientId: "clientId", billingGroups: "billingGroups" }, ngImport: i0, template: "<div class=\"modal-content\">\n <div class=\"p-5 px-6 pb-0\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"heading mt-2\">{{ mode === 'edit' ? 'Invoice' : (mode === 'estimate' ? 'Generate Estimate' : (mode === 'editEstimate' ? 'Edit Estimate' : 'Create Invoice')) }}\n <span *ngIf=\"mode === 'edit'\" class=\"invoice-number\">{{ invoiceData?.invoice }}</span>\n <span *ngIf=\"mode === 'editEstimate'\" class=\"invoice-number\">{{ invoiceData?.estimate }}</span>\n </div>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\"></button>\n </div>\n\n <!-- Tabs (only in edit mode) -->\n <div class=\"tab-bar mt-3\" *ngIf=\"mode === 'edit'\">\n <button class=\"tab-btn\" [ngClass]=\"activeTab === 'edit' ? 'tab-active' : ''\"\n (click)=\"setTab('edit')\">Edit Invoice</button>\n <button class=\"tab-btn\" [ngClass]=\"activeTab === 'creditNote' ? 'tab-active' : ''\"\n (click)=\"setTab('creditNote')\">Credit Note</button>\n <button class=\"tab-btn\" [ngClass]=\"activeTab === 'oneTimeFee' ? 'tab-active' : ''\"\n (click)=\"setTab('oneTimeFee')\">One Time Fee</button>\n </div>\n </div>\n\n <!-- ======================== EDIT INVOICE TAB ======================== -->\n <div class=\"modal-body mb-4\" *ngIf=\"activeTab === 'edit' || mode !== 'edit'\">\n <form [formGroup]=\"invoiceForm\" class=\"form\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Company Details Section -->\n <div class=\"section-title mb-3\">Company Details</div>\n\n <div class=\"row\">\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Company Name <span class=\"text-danger\">*</span></label>\n <input type=\"text\" formControlName=\"companyName\" class=\"form-control\"\n [class.is-invalid]=\"controlInvalid('companyName')\"\n [readonly]=\"mode === 'edit'\">\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('companyName')\">Company Name is required</div>\n </div>\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">GST Number</label>\n <input type=\"text\" formControlName=\"GSTNumber\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Company Address</label>\n <input type=\"text\" formControlName=\"companyAddress\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Place of Supply</label>\n <input type=\"text\" formControlName=\"PlaceOfSupply\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n </div>\n\n <!-- Billing Group -->\n <div class=\"row\" *ngIf=\"billingGroups.length > 0\">\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Billing Group <span *ngIf=\"mode !== 'edit'\" class=\"text-danger\">*</span></label>\n <select *ngIf=\"mode !== 'edit'\" class=\"form-select\" formControlName=\"groupId\"\n [class.is-invalid]=\"controlInvalid('groupId')\"\n (change)=\"onGroupChange($event)\">\n <option value=\"\">Select billing group</option>\n <option *ngFor=\"let g of billingGroups\" [value]=\"g._id\">{{ g.groupName }}</option>\n </select>\n <input *ngIf=\"mode === 'edit'\" type=\"text\" [value]=\"invoiceForm.get('groupName')?.value || 'Default Group'\" class=\"form-control\" readonly>\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('groupId')\">Billing Group is required</div>\n </div>\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Group Name</label>\n <input type=\"text\" formControlName=\"groupName\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n </div>\n\n <!-- Invoice Details Section -->\n <div class=\"section-title mb-3 mt-2\">Invoice Details</div>\n\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">Billing Date <span class=\"text-danger\">*</span></label>\n <input type=\"date\" formControlName=\"billingDate\" class=\"form-control\"\n [class.is-invalid]=\"controlInvalid('billingDate')\">\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('billingDate')\">Billing Date is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">Due Date <span class=\"text-danger\">*</span></label>\n <input type=\"date\" formControlName=\"dueDate\" class=\"form-control\"\n [class.is-invalid]=\"controlInvalid('dueDate')\">\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('dueDate')\">Due Date is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">Currency <span class=\"text-danger\">*</span></label>\n <select class=\"form-select\" formControlName=\"currency\"\n [class.is-invalid]=\"controlInvalid('currency')\">\n <option *ngFor=\"let c of currencyOptions\" [value]=\"c\">\n {{ currencyLabels[c] }}\n </option>\n </select>\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('currency')\">Currency is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">No. of Stores</label>\n <input type=\"number\" formControlName=\"stores\" class=\"form-control\" readonly>\n </div>\n <!-- Purchase Order mapping (optional). Mapping deducts this\n invoice's amount from the selected PO's remaining balance. -->\n <div class=\"col-md-3 form-group mb-3\" *ngIf=\"mode !== 'estimate' && mode !== 'editEstimate'\">\n <label class=\"headingtext mb-1\">Purchase Order</label>\n <select class=\"form-select\" formControlName=\"purchaseOrderNumber\">\n <option value=\"\">None</option>\n <option *ngFor=\"let po of purchaseOrders\" [value]=\"po.purchaseOrderNumber\">\n {{ po.purchaseOrderNumber }} ({{ getCurrencySymbol() }}{{ po.remainingAmount | number:'1.0-0':'en-IN' }} left)\n </option>\n </select>\n </div>\n </div>\n\n <!-- Advance Invoice (create only): bill several future months upfront.\n Each month becomes its own line item server-side. -->\n <div class=\"row\" *ngIf=\"mode === 'create'\">\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1 d-block\">Advance Invoice</label>\n <div class=\"form-check form-switch mt-1\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"advanceInvoiceCreate\"\n formControlName=\"advanceInvoice\">\n <label class=\"form-check-label\" for=\"advanceInvoiceCreate\">Bill future months upfront</label>\n </div>\n </div>\n <div class=\"col-md-3 form-group mb-3\" *ngIf=\"invoiceForm.get('advanceInvoice')?.value\">\n <label class=\"headingtext mb-1\">Advance frequency</label>\n <select class=\"form-select\" formControlName=\"advancePeriod\">\n <option *ngFor=\"let opt of advancePeriodOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n </div>\n </div>\n\n\n <!-- Products Section -->\n <div class=\"section-title mb-3 mt-2\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <span>Products</span>\n <div class=\"d-flex gap-2\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"addProduct()\">\n + Add Product\n </button>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"addCustomProduct()\">\n + Add Custom Product\n </button>\n </div>\n </div>\n </div>\n\n <div formArrayName=\"products\">\n <div *ngFor=\"let product of products.controls; let i = index\" [formGroupName]=\"i\"\n class=\"product-row mb-3 p-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span class=\"product-label\">Product {{ i + 1 }}</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger\" (click)=\"removeProduct(i)\"\n *ngIf=\"products.length > 1\">\n Remove\n </button>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4 form-group mb-2\">\n <label class=\"headingtext mb-1\">Product Name <span class=\"text-danger\">*</span></label>\n <!-- Base-pricing dropdown (with a \"+ Custom product\" choice) when\n products exist and this row isn't custom; otherwise a free-text\n name input for a custom product. -->\n <select *ngIf=\"availableProducts.length > 0 && !product.get('isCustom')?.value\" formControlName=\"productName\"\n class=\"form-select\"\n [class.is-invalid]=\"arrayControlInvalid('products', i, 'productName')\"\n (change)=\"onProductChange(i)\">\n <option value=\"\">Select product</option>\n <option *ngFor=\"let p of availableProducts\" [value]=\"p.productName\">\n {{ formatProductName(p.productName) }}\n </option>\n <option value=\"__custom__\">+ Custom product</option>\n </select>\n <input *ngIf=\"availableProducts.length === 0 || product.get('isCustom')?.value\" type=\"text\" formControlName=\"productName\"\n class=\"form-control\"\n [class.is-invalid]=\"arrayControlInvalid('products', i, 'productName')\"\n placeholder=\"e.g. Custom Service\">\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('products', i, 'productName')\">Product Name is required</div>\n </div>\n <div class=\"col-md-4 form-group mb-2\">\n <label class=\"headingtext mb-1\">Description</label>\n <input type=\"text\" formControlName=\"description\" class=\"form-control\"\n placeholder=\"e.g. Customer Footfall Analytics\">\n </div>\n <div class=\"col-md-4 form-group mb-2\">\n <label class=\"headingtext mb-1\">Month</label>\n <input type=\"text\" formControlName=\"month\" class=\"form-control\"\n placeholder=\"e.g. Mar 2026\">\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">HSN/SAC</label>\n <input type=\"text\" formControlName=\"HsnNumber\" class=\"form-control\">\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Quantity</label>\n <input type=\"number\" formControlName=\"storeCount\" class=\"form-control\"\n (input)=\"recalculate()\">\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Rate/Price <span class=\"text-danger\">*</span></label>\n <input type=\"number\" formControlName=\"price\" class=\"form-control\"\n [class.is-invalid]=\"arrayControlInvalid('products', i, 'price')\"\n (input)=\"recalculate()\">\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('products', i, 'price')\">Rate/Price is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Amount</label>\n <input type=\"number\" formControlName=\"amount\" class=\"form-control\" readonly>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Period</label>\n <select class=\"form-select\" formControlName=\"period\">\n <option value=\"monthly\">Monthly</option>\n <option value=\"quarterly\">Quarterly</option>\n <option value=\"halfyearly\">Half-yearly</option>\n <option value=\"yearly\">Yearly</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Tax Section -->\n <div class=\"section-title mb-3 mt-2\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <span>Tax</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"addTax()\">\n + Add Tax\n </button>\n </div>\n </div>\n\n <div formArrayName=\"tax\">\n <div *ngFor=\"let t of taxArray.controls; let j = index\" [formGroupName]=\"j\"\n class=\"tax-row mb-3 p-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span class=\"product-label\">Tax {{ j + 1 }}</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger\" (click)=\"removeTax(j)\"\n *ngIf=\"taxArray.length > 1\">\n Remove\n </button>\n </div>\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Tax Type <span class=\"text-danger\">*</span></label>\n <select class=\"form-select\" formControlName=\"type\"\n [class.is-invalid]=\"arrayControlInvalid('tax', j, 'type')\">\n <option *ngFor=\"let tt of taxTypes\" [value]=\"tt\">{{ tt }}</option>\n </select>\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('tax', j, 'type')\">Tax Type is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Tax % <span class=\"text-danger\">*</span></label>\n <input type=\"number\" formControlName=\"value\" class=\"form-control\"\n [class.is-invalid]=\"arrayControlInvalid('tax', j, 'value')\"\n (input)=\"recalculate()\">\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('tax', j, 'value')\">Tax % is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Tax Amount</label>\n <input type=\"text\" formControlName=\"taxAmount\" class=\"form-control\" readonly>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Currency Symbol</label>\n <input type=\"text\" formControlName=\"currency\" class=\"form-control\">\n </div>\n </div>\n </div>\n </div>\n\n <!-- Summary -->\n <div class=\"summary-section p-3 mt-3\">\n <div class=\"d-flex justify-content-between mb-2\">\n <span class=\"summary-label\">Subtotal</span>\n <span class=\"summary-value\">{{ getCurrencySymbol() }} {{ getSubtotal() | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"d-flex justify-content-between mb-2\">\n <span class=\"summary-label\">Total Tax</span>\n <span class=\"summary-value\">{{ getCurrencySymbol() }} {{ getTotalTax() | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"d-flex justify-content-between summary-total\">\n <span class=\"summary-label-bold\">Total Amount</span>\n <span class=\"summary-value-bold\">{{ getCurrencySymbol() }} {{ getTotalAmount() | number:'1.2-2':'en-IN'\n }}</span>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"d-flex mt-4\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn-outline btn cancel me-4 w-50\">Cancel</button>\n <button type=\"submit\" [disabled]=\"saving\"\n class=\"btn btn-primary px-4 w-50\" style=\"white-space: nowrap;\">\n <span *ngIf=\"!saving\" class=\"submit\">{{ mode === 'edit' ? 'Update Invoice' : (mode === 'estimate' ? 'Generate Estimate' : (mode === 'editEstimate' ? 'Update Estimate' : 'Create Invoice'))\n }}</span>\n <span *ngIf=\"saving\" class=\"submit\">Saving...</span>\n </button>\n </div>\n </form>\n </div>\n\n <!-- ======================== CREDIT NOTE TAB ======================== -->\n <div class=\"modal-body mb-4\" *ngIf=\"activeTab === 'creditNote' && mode === 'edit'\">\n <form [formGroup]=\"creditNoteForm\" class=\"form\">\n <div class=\"contenttext mb-3\">\n Apply a credit note / discount to this invoice.\n </div>\n\n <div class=\"d-flex flex-column\">\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Invoice ID</label>\n <input type=\"text\" class=\"form-control\" [value]=\"invoiceData?.invoice\" readonly>\n </div>\n\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Total Amount</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input formControlName=\"amount\" type=\"text\" readonly class=\"form-control amount-input\">\n </div>\n </div>\n\n <div class=\"form-group mt-2\">\n <div class=\"py-2\">\n <label class=\"headingtext mb-2\">Revised Amount</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input type=\"text\" formControlName=\"revisedAmount\"\n (keypress)=\"omitSpecialChar($event)\"\n class=\"form-control amount-input\"\n [ngClass]=\"creditMoreThanTenPercent ? 'errorinput' : ''\">\n <span class=\"input-icon\" *ngIf=\"creditMoreThanTenPercent\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\">\n <g clip-path=\"url(#clip_cn_err)\">\n <path\n d=\"M7.99967 5.33301V7.99967M7.99967 10.6663H8.00634M14.6663 7.99967C14.6663 11.6816 11.6816 14.6663 7.99967 14.6663C4.31778 14.6663 1.33301 11.6816 1.33301 7.99967C1.33301 4.31778 4.31778 1.33301 7.99967 1.33301C11.6816 1.33301 14.6663 4.31778 14.6663 7.99967Z\"\n stroke=\"#F04438\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip_cn_err\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n </div>\n </div>\n <span [ngClass]=\"creditMoreThanTenPercent ? 'text-danger' : 'contenttext'\" class=\"small\">\n Enter a valid revised amount\n </span>\n </div>\n\n <div class=\"form-group mt-2\">\n <div class=\"py-2\">\n <label class=\"headingtext mb-2\">Discount</label>\n <div class=\"input-group\">\n <input type=\"text\" formControlName=\"discount\"\n (keypress)=\"omitSpecialChar($event)\"\n class=\"form-control\"\n [ngClass]=\"creditMoreThanTenPercent ? 'errorinput' : ''\">\n <span class=\"input-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\">\n <path\n d=\"M12.667 3.33366L3.33366 12.667M6.00033 4.33366C6.00033 5.25413 5.25413 6.00033 4.33366 6.00033C3.41318 6.00033 2.66699 5.25413 2.66699 4.33366C2.66699 3.41318 3.41318 2.66699 4.33366 2.66699C5.25413 2.66699 6.00033 3.41318 6.00033 4.33366ZM13.3337 11.667C13.3337 12.5875 12.5875 13.3337 11.667 13.3337C10.7465 13.3337 10.0003 12.5875 10.0003 11.667C10.0003 10.7465 10.7465 10.0003 11.667 10.0003C12.5875 10.0003 13.3337 10.7465 13.3337 11.667Z\"\n [attr.stroke]=\"creditMoreThanTenPercent ? '#F04438' : '#98A2B3'\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n </div>\n </div>\n <span [ngClass]=\"creditMoreThanTenPercent ? 'text-danger' : 'contenttext'\" class=\"small\">\n In percentage\n </span>\n </div>\n </div>\n\n <div class=\"d-flex mt-5\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn-outline btn cancel me-4 w-50\">Cancel</button>\n <button [disabled]=\"creditMoreThanTenPercent || saving\" type=\"button\" (click)=\"applyCreditNote()\"\n class=\"btn btn-primary px-4 w-50\" style=\"white-space: nowrap;\">\n <span *ngIf=\"!saving\">Apply Credit Note</span>\n <span *ngIf=\"saving\">Applying...</span>\n </button>\n </div>\n </form>\n </div>\n\n <!-- ======================== ONE TIME FEE TAB ======================== -->\n <div class=\"modal-body mb-4\" *ngIf=\"activeTab === 'oneTimeFee' && mode === 'edit'\">\n <form [formGroup]=\"oneTimeFeeForm\" class=\"form\">\n <div class=\"contenttext mb-3\">\n Add a one-time fee (e.g. installation) to this invoice.\n </div>\n\n <div class=\"d-flex flex-column\">\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Invoice ID</label>\n <input type=\"text\" class=\"form-control\" [value]=\"invoiceData?.invoice\" readonly>\n </div>\n\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Current Invoice Amount</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input formControlName=\"amount\" type=\"text\" readonly class=\"form-control amount-input\">\n </div>\n </div>\n\n <div class=\"form-group mt-2\">\n <div class=\"py-2\">\n <label class=\"headingtext mb-2\">One Time Fee (Installation)</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input type=\"text\" formControlName=\"oneTimeFee\"\n (keypress)=\"omitSpecialChar($event)\"\n class=\"form-control amount-input\"\n placeholder=\"Enter fee amount\">\n </div>\n </div>\n </div>\n\n <div class=\"d-flex flex-stack mt-3 fee-summary p-3\">\n <div class=\"summary-label\">Selected Invoice Amount + One Time Fee</div>\n <div class=\"d-flex align-items-center\">\n <span class=\"summary-value-bold\">{{ getInvoiceCurrencySymbol() }}{{\n oneTimeFeeTotal | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex mt-5\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn-outline btn cancel me-4 w-50\">Cancel</button>\n <button [disabled]=\"saving || !oneTimeFeeForm.get('oneTimeFee')?.value\" type=\"button\"\n (click)=\"applyOneTimeFee()\"\n class=\"btn btn-primary px-4 w-50\" style=\"white-space: nowrap;\">\n <span *ngIf=\"!saving\">Apply Fee</span>\n <span *ngIf=\"saving\">Applying...</span>\n </button>\n </div>\n </form>\n </div>\n</div>", styles: [".heading{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.invoice-number{color:var(--Primary-700, #009BF3);font-weight:500;margin-left:4px}.contenttext{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-style:normal;font-weight:400;line-height:20px}.headingtext{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.tab-bar{display:flex;gap:4px;border-bottom:1px solid var(--Gray-200, #EAECF0);padding-bottom:0}.tab-btn{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500;line-height:20px;padding:8px 16px;border:none;background:none;cursor:pointer;border-bottom:2px solid transparent;transition:all .2s}.tab-btn:hover{color:var(--Gray-700, #344054)}.tab-btn.tab-active{color:var(--Primary-700, #009BF3);border-bottom:2px solid var(--Primary-700, #009BF3);font-weight:600}.section-title{color:var(--Gray-900, #101828);font-family:Inter;font-size:16px;font-weight:600;line-height:24px;padding-bottom:8px;border-bottom:1px solid var(--Gray-200, #EAECF0)}.product-row,.tax-row{background:var(--Gray-50, #F9FAFB);border:1px solid var(--Gray-200, #EAECF0);border-radius:8px}.product-label{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:600}input,.form-control{color:#101828;border:1px solid #D0D5DD!important;box-shadow:0 1px 2px #1018280d;border-radius:8px;font-size:14px;width:100%;padding:8px 12px;font-family:Inter;font-weight:400;line-height:24px}input:active,input:focus,input:focus-visible{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD)!important;box-shadow:0 1px 2px #1018280d;outline:none!important;background:var(--Gray-50, #F9FAFB)}input[readonly]{background:var(--Gray-50, #F9FAFB);color:var(--Gray-500, #667085)}.form-select{color:#101828;border:1px solid #D0D5DD!important;box-shadow:0 1px 2px #1018280d;border-radius:8px;font-size:14px;padding:8px 12px;font-family:Inter;font-weight:400;height:auto}.cancel{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:600;line-height:24px;text-transform:capitalize;border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF)}.summary-section,.fee-summary{background:var(--Gray-50, #F9FAFB);border:1px solid var(--Gray-200, #EAECF0);border-radius:8px}.summary-label{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500}.summary-value{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500}.summary-total{padding-top:8px;border-top:1px solid var(--Gray-200, #EAECF0)}.summary-label-bold,.summary-value-bold{color:var(--Gray-900, #101828);font-family:Inter;font-size:16px;font-weight:600}.text-danger{color:var(--Error-500, #F04438)!important;font-family:Inter;font-size:12px!important;font-weight:400}.modal-body{max-height:70vh;overflow-y:auto}.input-group{position:relative}.input-group .dollar-sign{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--Gray-900, #101828);font-family:Inter;font-size:16px;font-weight:400;line-height:24px;z-index:1}.input-group .amount-input{padding-left:30px}.input-group .input-icon{position:absolute;top:50%;right:12px;transform:translateY(-50%);display:inline-flex;align-items:center}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){border-radius:8px!important}.input-group>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-radius:8px!important}.errorinput{border-radius:8px;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF);box-shadow:0 1px 2px #1018280d}.errorinput:focus{border:1px solid var(--Error-300, #FDA29B)!important}.form-control.is-invalid,.form-select.is-invalid{border:1px solid var(--Error-300, #FDA29B)!important;background:#fef3f2}.form-control.is-invalid:focus,.form-control.is-invalid:active,.form-control.is-invalid:focus-visible,.form-select.is-invalid:focus,.form-select.is-invalid:active,.form-select.is-invalid:focus-visible{border:1px solid var(--Error-300, #FDA29B)!important;box-shadow:0 0 0 4px #f044381f!important;background:#fef3f2}.invalid-msg{color:#b42318;font-family:Inter;font-size:12px;font-weight:500;line-height:18px;margin-top:4px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i5.DecimalPipe, name: "number" }] });
611
611
  }
612
612
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditInvoiceComponent, decorators: [{
613
613
  type: Component,
614
- args: [{ selector: 'lib-edit-invoice', template: "<div class=\"modal-content\">\n <div class=\"p-5 px-6 pb-0\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"heading mt-2\">{{ mode === 'edit' ? 'Invoice' : (mode === 'estimate' ? 'Generate Estimate' : (mode === 'editEstimate' ? 'Edit Estimate' : 'Create Invoice')) }}\n <span *ngIf=\"mode === 'edit'\" class=\"invoice-number\">{{ invoiceData?.invoice }}</span>\n <span *ngIf=\"mode === 'editEstimate'\" class=\"invoice-number\">{{ invoiceData?.estimate }}</span>\n </div>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\"></button>\n </div>\n\n <!-- Tabs (only in edit mode) -->\n <div class=\"tab-bar mt-3\" *ngIf=\"mode === 'edit'\">\n <button class=\"tab-btn\" [ngClass]=\"activeTab === 'edit' ? 'tab-active' : ''\"\n (click)=\"setTab('edit')\">Edit Invoice</button>\n <button class=\"tab-btn\" [ngClass]=\"activeTab === 'creditNote' ? 'tab-active' : ''\"\n (click)=\"setTab('creditNote')\">Credit Note</button>\n <button class=\"tab-btn\" [ngClass]=\"activeTab === 'oneTimeFee' ? 'tab-active' : ''\"\n (click)=\"setTab('oneTimeFee')\">One Time Fee</button>\n </div>\n </div>\n\n <!-- ======================== EDIT INVOICE TAB ======================== -->\n <div class=\"modal-body mb-4\" *ngIf=\"activeTab === 'edit' || mode !== 'edit'\">\n <form [formGroup]=\"invoiceForm\" class=\"form\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Company Details Section -->\n <div class=\"section-title mb-3\">Company Details</div>\n\n <div class=\"row\">\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Company Name <span class=\"text-danger\">*</span></label>\n <input type=\"text\" formControlName=\"companyName\" class=\"form-control\"\n [class.is-invalid]=\"controlInvalid('companyName')\"\n [readonly]=\"mode === 'edit'\">\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('companyName')\">Company Name is required</div>\n </div>\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">GST Number</label>\n <input type=\"text\" formControlName=\"GSTNumber\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Company Address</label>\n <input type=\"text\" formControlName=\"companyAddress\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Place of Supply</label>\n <input type=\"text\" formControlName=\"PlaceOfSupply\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n </div>\n\n <!-- Billing Group -->\n <div class=\"row\" *ngIf=\"billingGroups.length > 0\">\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Billing Group <span *ngIf=\"mode !== 'edit'\" class=\"text-danger\">*</span></label>\n <select *ngIf=\"mode !== 'edit'\" class=\"form-select\" formControlName=\"groupId\"\n [class.is-invalid]=\"controlInvalid('groupId')\"\n (change)=\"onGroupChange($event)\">\n <option value=\"\">Select billing group</option>\n <option *ngFor=\"let g of billingGroups\" [value]=\"g._id\">{{ g.groupName }}</option>\n </select>\n <input *ngIf=\"mode === 'edit'\" type=\"text\" [value]=\"invoiceForm.get('groupName')?.value || 'Default Group'\" class=\"form-control\" readonly>\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('groupId')\">Billing Group is required</div>\n </div>\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Group Name</label>\n <input type=\"text\" formControlName=\"groupName\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n </div>\n\n <!-- Invoice Details Section -->\n <div class=\"section-title mb-3 mt-2\">Invoice Details</div>\n\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">Billing Date <span class=\"text-danger\">*</span></label>\n <input type=\"date\" formControlName=\"billingDate\" class=\"form-control\"\n [class.is-invalid]=\"controlInvalid('billingDate')\">\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('billingDate')\">Billing Date is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">Due Date <span class=\"text-danger\">*</span></label>\n <input type=\"date\" formControlName=\"dueDate\" class=\"form-control\"\n [class.is-invalid]=\"controlInvalid('dueDate')\">\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('dueDate')\">Due Date is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">Currency <span class=\"text-danger\">*</span></label>\n <select class=\"form-select\" formControlName=\"currency\"\n [class.is-invalid]=\"controlInvalid('currency')\">\n <option *ngFor=\"let c of currencyOptions\" [value]=\"c\">\n {{ currencyLabels[c] }}\n </option>\n </select>\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('currency')\">Currency is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">No. of Stores</label>\n <input type=\"number\" formControlName=\"stores\" class=\"form-control\" readonly>\n </div>\n <!-- Purchase Order mapping (optional). Mapping deducts this\n invoice's amount from the selected PO's remaining balance. -->\n <div class=\"col-md-3 form-group mb-3\" *ngIf=\"mode !== 'estimate' && mode !== 'editEstimate'\">\n <label class=\"headingtext mb-1\">Purchase Order</label>\n <select class=\"form-select\" formControlName=\"purchaseOrderNumber\">\n <option value=\"\">None</option>\n <option *ngFor=\"let po of purchaseOrders\" [value]=\"po.purchaseOrderNumber\">\n {{ po.purchaseOrderNumber }} ({{ getCurrencySymbol() }}{{ po.remainingAmount | number:'1.0-0':'en-IN' }} left)\n </option>\n </select>\n </div>\n </div>\n\n <!-- Advance Invoice (create only): bill several future months upfront.\n Each month becomes its own line item server-side. -->\n <div class=\"row\" *ngIf=\"mode === 'create'\">\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1 d-block\">Advance Invoice</label>\n <div class=\"form-check form-switch mt-1\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"advanceInvoiceCreate\"\n formControlName=\"advanceInvoice\">\n <label class=\"form-check-label\" for=\"advanceInvoiceCreate\">Bill future months upfront</label>\n </div>\n </div>\n <div class=\"col-md-3 form-group mb-3\" *ngIf=\"invoiceForm.get('advanceInvoice')?.value\">\n <label class=\"headingtext mb-1\">Advance frequency</label>\n <select class=\"form-select\" formControlName=\"advancePeriod\">\n <option *ngFor=\"let opt of advancePeriodOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n </div>\n </div>\n\n\n <!-- Products Section -->\n <div class=\"section-title mb-3 mt-2\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <span>Products</span>\n <div class=\"d-flex gap-2\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"addProduct()\">\n + Add Product\n </button>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"addCustomProduct()\">\n + Add Custom Product\n </button>\n </div>\n </div>\n </div>\n\n <div formArrayName=\"products\">\n <div *ngFor=\"let product of products.controls; let i = index\" [formGroupName]=\"i\"\n class=\"product-row mb-3 p-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span class=\"product-label\">Product {{ i + 1 }}</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger\" (click)=\"removeProduct(i)\"\n *ngIf=\"products.length > 1\">\n Remove\n </button>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4 form-group mb-2\">\n <label class=\"headingtext mb-1\">Product Name <span class=\"text-danger\">*</span></label>\n <!-- Base-pricing dropdown (with a \"+ Custom product\" choice) when\n products exist and this row isn't custom; otherwise a free-text\n name input for a custom product. -->\n <select *ngIf=\"availableProducts.length > 0 && !product.get('isCustom')?.value\" formControlName=\"productName\"\n class=\"form-select\"\n [class.is-invalid]=\"arrayControlInvalid('products', i, 'productName')\"\n (change)=\"onProductChange(i)\">\n <option value=\"\">Select product</option>\n <option *ngFor=\"let p of availableProducts\" [value]=\"p.productName\">\n {{ formatProductName(p.productName) }}\n </option>\n <option value=\"__custom__\">+ Custom product</option>\n </select>\n <input *ngIf=\"availableProducts.length === 0 || product.get('isCustom')?.value\" type=\"text\" formControlName=\"productName\"\n class=\"form-control\"\n [class.is-invalid]=\"arrayControlInvalid('products', i, 'productName')\"\n placeholder=\"e.g. Custom Service\">\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('products', i, 'productName')\">Product Name is required</div>\n </div>\n <div class=\"col-md-4 form-group mb-2\">\n <label class=\"headingtext mb-1\">Description</label>\n <input type=\"text\" formControlName=\"description\" class=\"form-control\"\n placeholder=\"e.g. Customer Footfall Analytics\">\n </div>\n <div class=\"col-md-4 form-group mb-2\">\n <label class=\"headingtext mb-1\">Month</label>\n <input type=\"text\" formControlName=\"month\" class=\"form-control\"\n placeholder=\"e.g. Mar 2026\">\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">HSN/SAC</label>\n <input type=\"text\" formControlName=\"HsnNumber\" class=\"form-control\">\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Quantity</label>\n <input type=\"number\" formControlName=\"storeCount\" class=\"form-control\"\n (input)=\"recalculate()\">\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Rate/Price <span class=\"text-danger\">*</span></label>\n <input type=\"number\" formControlName=\"price\" class=\"form-control\"\n [class.is-invalid]=\"arrayControlInvalid('products', i, 'price')\"\n (input)=\"recalculate()\">\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('products', i, 'price')\">Rate/Price is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Amount</label>\n <input type=\"number\" formControlName=\"amount\" class=\"form-control\" readonly>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Period</label>\n <select class=\"form-select\" formControlName=\"period\">\n <option value=\"monthly\">Monthly</option>\n <option value=\"quarterly\">Quarterly</option>\n <option value=\"halfyearly\">Half-yearly</option>\n <option value=\"yearly\">Yearly</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Tax Section -->\n <div class=\"section-title mb-3 mt-2\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <span>Tax</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"addTax()\">\n + Add Tax\n </button>\n </div>\n </div>\n\n <div formArrayName=\"tax\">\n <div *ngFor=\"let t of taxArray.controls; let j = index\" [formGroupName]=\"j\"\n class=\"tax-row mb-3 p-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span class=\"product-label\">Tax {{ j + 1 }}</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger\" (click)=\"removeTax(j)\"\n *ngIf=\"taxArray.length > 1\">\n Remove\n </button>\n </div>\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Tax Type <span class=\"text-danger\">*</span></label>\n <select class=\"form-select\" formControlName=\"type\"\n [class.is-invalid]=\"arrayControlInvalid('tax', j, 'type')\">\n <option *ngFor=\"let tt of taxTypes\" [value]=\"tt\">{{ tt }}</option>\n </select>\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('tax', j, 'type')\">Tax Type is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Tax % <span class=\"text-danger\">*</span></label>\n <input type=\"number\" formControlName=\"value\" class=\"form-control\"\n [class.is-invalid]=\"arrayControlInvalid('tax', j, 'value')\"\n (input)=\"recalculate()\">\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('tax', j, 'value')\">Tax % is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Tax Amount</label>\n <input type=\"text\" formControlName=\"taxAmount\" class=\"form-control\" readonly>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Currency Symbol</label>\n <input type=\"text\" formControlName=\"currency\" class=\"form-control\">\n </div>\n </div>\n </div>\n </div>\n\n <!-- Summary -->\n <div class=\"summary-section p-3 mt-3\">\n <div class=\"d-flex justify-content-between mb-2\">\n <span class=\"summary-label\">Subtotal</span>\n <span class=\"summary-value\">{{ getCurrencySymbol() }} {{ getSubtotal() | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"d-flex justify-content-between mb-2\">\n <span class=\"summary-label\">Total Tax</span>\n <span class=\"summary-value\">{{ getCurrencySymbol() }} {{ getTotalTax() | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"d-flex justify-content-between summary-total\">\n <span class=\"summary-label-bold\">Total Amount</span>\n <span class=\"summary-value-bold\">{{ getCurrencySymbol() }} {{ getTotalAmount() | number:'1.2-2':'en-IN'\n }}</span>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"d-flex mt-4\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn-outline btn cancel me-4 w-50\">Cancel</button>\n <button type=\"submit\" [disabled]=\"saving\"\n class=\"btn btn-primary px-4 w-50\" style=\"white-space: nowrap;\">\n <span *ngIf=\"!saving\" class=\"submit\">{{ mode === 'edit' ? 'Update Invoice' : (mode === 'estimate' ? 'Generate Estimate' : (mode === 'editEstimate' ? 'Update Estimate' : 'Create Invoice'))\n }}</span>\n <span *ngIf=\"saving\" class=\"submit\">Saving...</span>\n </button>\n </div>\n </form>\n </div>\n\n <!-- ======================== CREDIT NOTE TAB ======================== -->\n <div class=\"modal-body mb-4\" *ngIf=\"activeTab === 'creditNote' && mode === 'edit'\">\n <form [formGroup]=\"creditNoteForm\" class=\"form\">\n <div class=\"contenttext mb-3\">\n Apply a credit note / discount to this invoice. Maximum 10% discount allowed.\n </div>\n\n <div class=\"d-flex flex-column\">\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Invoice ID</label>\n <input type=\"text\" class=\"form-control\" [value]=\"invoiceData?.invoice\" readonly>\n </div>\n\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Total Amount</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input formControlName=\"amount\" type=\"text\" readonly class=\"form-control amount-input\">\n </div>\n </div>\n\n <div class=\"form-group mt-2\">\n <div class=\"py-2\">\n <label class=\"headingtext mb-2\">Revised Amount</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input type=\"text\" formControlName=\"revisedAmount\"\n (keypress)=\"omitSpecialChar($event)\"\n class=\"form-control amount-input\"\n [ngClass]=\"creditMoreThanTenPercent ? 'errorinput' : ''\">\n <span class=\"input-icon\" *ngIf=\"creditMoreThanTenPercent\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\">\n <g clip-path=\"url(#clip_cn_err)\">\n <path\n d=\"M7.99967 5.33301V7.99967M7.99967 10.6663H8.00634M14.6663 7.99967C14.6663 11.6816 11.6816 14.6663 7.99967 14.6663C4.31778 14.6663 1.33301 11.6816 1.33301 7.99967C1.33301 4.31778 4.31778 1.33301 7.99967 1.33301C11.6816 1.33301 14.6663 4.31778 14.6663 7.99967Z\"\n stroke=\"#F04438\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip_cn_err\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n </div>\n </div>\n <span [ngClass]=\"creditMoreThanTenPercent ? 'text-danger' : 'contenttext'\" class=\"small\">\n More than 10% can't be revised from total amount\n </span>\n </div>\n\n <div class=\"form-group mt-2\">\n <div class=\"py-2\">\n <label class=\"headingtext mb-2\">Discount</label>\n <div class=\"input-group\">\n <input type=\"text\" formControlName=\"discount\"\n (keypress)=\"omitSpecialChar($event)\"\n class=\"form-control\"\n [ngClass]=\"creditMoreThanTenPercent ? 'errorinput' : ''\">\n <span class=\"input-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\">\n <path\n d=\"M12.667 3.33366L3.33366 12.667M6.00033 4.33366C6.00033 5.25413 5.25413 6.00033 4.33366 6.00033C3.41318 6.00033 2.66699 5.25413 2.66699 4.33366C2.66699 3.41318 3.41318 2.66699 4.33366 2.66699C5.25413 2.66699 6.00033 3.41318 6.00033 4.33366ZM13.3337 11.667C13.3337 12.5875 12.5875 13.3337 11.667 13.3337C10.7465 13.3337 10.0003 12.5875 10.0003 11.667C10.0003 10.7465 10.7465 10.0003 11.667 10.0003C12.5875 10.0003 13.3337 10.7465 13.3337 11.667Z\"\n [attr.stroke]=\"creditMoreThanTenPercent ? '#F04438' : '#98A2B3'\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n </div>\n </div>\n <span [ngClass]=\"creditMoreThanTenPercent ? 'text-danger' : 'contenttext'\" class=\"small\">\n In percentage\n </span>\n </div>\n </div>\n\n <div class=\"d-flex mt-5\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn-outline btn cancel me-4 w-50\">Cancel</button>\n <button [disabled]=\"creditMoreThanTenPercent || saving\" type=\"button\" (click)=\"applyCreditNote()\"\n class=\"btn btn-primary px-4 w-50\" style=\"white-space: nowrap;\">\n <span *ngIf=\"!saving\">Apply Credit Note</span>\n <span *ngIf=\"saving\">Applying...</span>\n </button>\n </div>\n </form>\n </div>\n\n <!-- ======================== ONE TIME FEE TAB ======================== -->\n <div class=\"modal-body mb-4\" *ngIf=\"activeTab === 'oneTimeFee' && mode === 'edit'\">\n <form [formGroup]=\"oneTimeFeeForm\" class=\"form\">\n <div class=\"contenttext mb-3\">\n Add a one-time fee (e.g. installation) to this invoice.\n </div>\n\n <div class=\"d-flex flex-column\">\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Invoice ID</label>\n <input type=\"text\" class=\"form-control\" [value]=\"invoiceData?.invoice\" readonly>\n </div>\n\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Current Invoice Amount</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input formControlName=\"amount\" type=\"text\" readonly class=\"form-control amount-input\">\n </div>\n </div>\n\n <div class=\"form-group mt-2\">\n <div class=\"py-2\">\n <label class=\"headingtext mb-2\">One Time Fee (Installation)</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input type=\"text\" formControlName=\"oneTimeFee\"\n (keypress)=\"omitSpecialChar($event)\"\n class=\"form-control amount-input\"\n placeholder=\"Enter fee amount\">\n </div>\n </div>\n </div>\n\n <div class=\"d-flex flex-stack mt-3 fee-summary p-3\">\n <div class=\"summary-label\">Selected Invoice Amount + One Time Fee</div>\n <div class=\"d-flex align-items-center\">\n <span class=\"summary-value-bold\">{{ getInvoiceCurrencySymbol() }}{{\n oneTimeFeeTotal | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex mt-5\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn-outline btn cancel me-4 w-50\">Cancel</button>\n <button [disabled]=\"saving || !oneTimeFeeForm.get('oneTimeFee')?.value\" type=\"button\"\n (click)=\"applyOneTimeFee()\"\n class=\"btn btn-primary px-4 w-50\" style=\"white-space: nowrap;\">\n <span *ngIf=\"!saving\">Apply Fee</span>\n <span *ngIf=\"saving\">Applying...</span>\n </button>\n </div>\n </form>\n </div>\n</div>", styles: [".heading{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.invoice-number{color:var(--Primary-700, #009BF3);font-weight:500;margin-left:4px}.contenttext{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-style:normal;font-weight:400;line-height:20px}.headingtext{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.tab-bar{display:flex;gap:4px;border-bottom:1px solid var(--Gray-200, #EAECF0);padding-bottom:0}.tab-btn{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500;line-height:20px;padding:8px 16px;border:none;background:none;cursor:pointer;border-bottom:2px solid transparent;transition:all .2s}.tab-btn:hover{color:var(--Gray-700, #344054)}.tab-btn.tab-active{color:var(--Primary-700, #009BF3);border-bottom:2px solid var(--Primary-700, #009BF3);font-weight:600}.section-title{color:var(--Gray-900, #101828);font-family:Inter;font-size:16px;font-weight:600;line-height:24px;padding-bottom:8px;border-bottom:1px solid var(--Gray-200, #EAECF0)}.product-row,.tax-row{background:var(--Gray-50, #F9FAFB);border:1px solid var(--Gray-200, #EAECF0);border-radius:8px}.product-label{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:600}input,.form-control{color:#101828;border:1px solid #D0D5DD!important;box-shadow:0 1px 2px #1018280d;border-radius:8px;font-size:14px;width:100%;padding:8px 12px;font-family:Inter;font-weight:400;line-height:24px}input:active,input:focus,input:focus-visible{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD)!important;box-shadow:0 1px 2px #1018280d;outline:none!important;background:var(--Gray-50, #F9FAFB)}input[readonly]{background:var(--Gray-50, #F9FAFB);color:var(--Gray-500, #667085)}.form-select{color:#101828;border:1px solid #D0D5DD!important;box-shadow:0 1px 2px #1018280d;border-radius:8px;font-size:14px;padding:8px 12px;font-family:Inter;font-weight:400;height:auto}.cancel{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:600;line-height:24px;text-transform:capitalize;border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF)}.summary-section,.fee-summary{background:var(--Gray-50, #F9FAFB);border:1px solid var(--Gray-200, #EAECF0);border-radius:8px}.summary-label{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500}.summary-value{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500}.summary-total{padding-top:8px;border-top:1px solid var(--Gray-200, #EAECF0)}.summary-label-bold,.summary-value-bold{color:var(--Gray-900, #101828);font-family:Inter;font-size:16px;font-weight:600}.text-danger{color:var(--Error-500, #F04438)!important;font-family:Inter;font-size:12px!important;font-weight:400}.modal-body{max-height:70vh;overflow-y:auto}.input-group{position:relative}.input-group .dollar-sign{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--Gray-900, #101828);font-family:Inter;font-size:16px;font-weight:400;line-height:24px;z-index:1}.input-group .amount-input{padding-left:30px}.input-group .input-icon{position:absolute;top:50%;right:12px;transform:translateY(-50%);display:inline-flex;align-items:center}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){border-radius:8px!important}.input-group>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-radius:8px!important}.errorinput{border-radius:8px;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF);box-shadow:0 1px 2px #1018280d}.errorinput:focus{border:1px solid var(--Error-300, #FDA29B)!important}.form-control.is-invalid,.form-select.is-invalid{border:1px solid var(--Error-300, #FDA29B)!important;background:#fef3f2}.form-control.is-invalid:focus,.form-control.is-invalid:active,.form-control.is-invalid:focus-visible,.form-select.is-invalid:focus,.form-select.is-invalid:active,.form-select.is-invalid:focus-visible{border:1px solid var(--Error-300, #FDA29B)!important;box-shadow:0 0 0 4px #f044381f!important;background:#fef3f2}.invalid-msg{color:#b42318;font-family:Inter;font-size:12px;font-weight:500;line-height:18px;margin-top:4px}\n"] }]
614
+ args: [{ selector: 'lib-edit-invoice', template: "<div class=\"modal-content\">\n <div class=\"p-5 px-6 pb-0\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"heading mt-2\">{{ mode === 'edit' ? 'Invoice' : (mode === 'estimate' ? 'Generate Estimate' : (mode === 'editEstimate' ? 'Edit Estimate' : 'Create Invoice')) }}\n <span *ngIf=\"mode === 'edit'\" class=\"invoice-number\">{{ invoiceData?.invoice }}</span>\n <span *ngIf=\"mode === 'editEstimate'\" class=\"invoice-number\">{{ invoiceData?.estimate }}</span>\n </div>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\"></button>\n </div>\n\n <!-- Tabs (only in edit mode) -->\n <div class=\"tab-bar mt-3\" *ngIf=\"mode === 'edit'\">\n <button class=\"tab-btn\" [ngClass]=\"activeTab === 'edit' ? 'tab-active' : ''\"\n (click)=\"setTab('edit')\">Edit Invoice</button>\n <button class=\"tab-btn\" [ngClass]=\"activeTab === 'creditNote' ? 'tab-active' : ''\"\n (click)=\"setTab('creditNote')\">Credit Note</button>\n <button class=\"tab-btn\" [ngClass]=\"activeTab === 'oneTimeFee' ? 'tab-active' : ''\"\n (click)=\"setTab('oneTimeFee')\">One Time Fee</button>\n </div>\n </div>\n\n <!-- ======================== EDIT INVOICE TAB ======================== -->\n <div class=\"modal-body mb-4\" *ngIf=\"activeTab === 'edit' || mode !== 'edit'\">\n <form [formGroup]=\"invoiceForm\" class=\"form\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Company Details Section -->\n <div class=\"section-title mb-3\">Company Details</div>\n\n <div class=\"row\">\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Company Name <span class=\"text-danger\">*</span></label>\n <input type=\"text\" formControlName=\"companyName\" class=\"form-control\"\n [class.is-invalid]=\"controlInvalid('companyName')\"\n [readonly]=\"mode === 'edit'\">\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('companyName')\">Company Name is required</div>\n </div>\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">GST Number</label>\n <input type=\"text\" formControlName=\"GSTNumber\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Company Address</label>\n <input type=\"text\" formControlName=\"companyAddress\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Place of Supply</label>\n <input type=\"text\" formControlName=\"PlaceOfSupply\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n </div>\n\n <!-- Billing Group -->\n <div class=\"row\" *ngIf=\"billingGroups.length > 0\">\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Billing Group <span *ngIf=\"mode !== 'edit'\" class=\"text-danger\">*</span></label>\n <select *ngIf=\"mode !== 'edit'\" class=\"form-select\" formControlName=\"groupId\"\n [class.is-invalid]=\"controlInvalid('groupId')\"\n (change)=\"onGroupChange($event)\">\n <option value=\"\">Select billing group</option>\n <option *ngFor=\"let g of billingGroups\" [value]=\"g._id\">{{ g.groupName }}</option>\n </select>\n <input *ngIf=\"mode === 'edit'\" type=\"text\" [value]=\"invoiceForm.get('groupName')?.value || 'Default Group'\" class=\"form-control\" readonly>\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('groupId')\">Billing Group is required</div>\n </div>\n <div class=\"col-md-6 form-group mb-3\">\n <label class=\"headingtext mb-1\">Group Name</label>\n <input type=\"text\" formControlName=\"groupName\" class=\"form-control\" [readonly]=\"mode === 'edit'\">\n </div>\n </div>\n\n <!-- Invoice Details Section -->\n <div class=\"section-title mb-3 mt-2\">Invoice Details</div>\n\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">Billing Date <span class=\"text-danger\">*</span></label>\n <input type=\"date\" formControlName=\"billingDate\" class=\"form-control\"\n [class.is-invalid]=\"controlInvalid('billingDate')\">\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('billingDate')\">Billing Date is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">Due Date <span class=\"text-danger\">*</span></label>\n <input type=\"date\" formControlName=\"dueDate\" class=\"form-control\"\n [class.is-invalid]=\"controlInvalid('dueDate')\">\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('dueDate')\">Due Date is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">Currency <span class=\"text-danger\">*</span></label>\n <select class=\"form-select\" formControlName=\"currency\"\n [class.is-invalid]=\"controlInvalid('currency')\">\n <option *ngFor=\"let c of currencyOptions\" [value]=\"c\">\n {{ currencyLabels[c] }}\n </option>\n </select>\n <div class=\"invalid-msg\" *ngIf=\"controlInvalid('currency')\">Currency is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1\">No. of Stores</label>\n <input type=\"number\" formControlName=\"stores\" class=\"form-control\" readonly>\n </div>\n <!-- Purchase Order mapping (optional). Mapping deducts this\n invoice's amount from the selected PO's remaining balance. -->\n <div class=\"col-md-3 form-group mb-3\" *ngIf=\"mode !== 'estimate' && mode !== 'editEstimate'\">\n <label class=\"headingtext mb-1\">Purchase Order</label>\n <select class=\"form-select\" formControlName=\"purchaseOrderNumber\">\n <option value=\"\">None</option>\n <option *ngFor=\"let po of purchaseOrders\" [value]=\"po.purchaseOrderNumber\">\n {{ po.purchaseOrderNumber }} ({{ getCurrencySymbol() }}{{ po.remainingAmount | number:'1.0-0':'en-IN' }} left)\n </option>\n </select>\n </div>\n </div>\n\n <!-- Advance Invoice (create only): bill several future months upfront.\n Each month becomes its own line item server-side. -->\n <div class=\"row\" *ngIf=\"mode === 'create'\">\n <div class=\"col-md-3 form-group mb-3\">\n <label class=\"headingtext mb-1 d-block\">Advance Invoice</label>\n <div class=\"form-check form-switch mt-1\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"advanceInvoiceCreate\"\n formControlName=\"advanceInvoice\">\n <label class=\"form-check-label\" for=\"advanceInvoiceCreate\">Bill future months upfront</label>\n </div>\n </div>\n <div class=\"col-md-3 form-group mb-3\" *ngIf=\"invoiceForm.get('advanceInvoice')?.value\">\n <label class=\"headingtext mb-1\">Advance frequency</label>\n <select class=\"form-select\" formControlName=\"advancePeriod\">\n <option *ngFor=\"let opt of advancePeriodOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n </div>\n </div>\n\n\n <!-- Products Section -->\n <div class=\"section-title mb-3 mt-2\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <span>Products</span>\n <div class=\"d-flex gap-2\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"addProduct()\">\n + Add Product\n </button>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"addCustomProduct()\">\n + Add Custom Product\n </button>\n </div>\n </div>\n </div>\n\n <div formArrayName=\"products\">\n <div *ngFor=\"let product of products.controls; let i = index\" [formGroupName]=\"i\"\n class=\"product-row mb-3 p-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span class=\"product-label\">Product {{ i + 1 }}</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger\" (click)=\"removeProduct(i)\"\n *ngIf=\"products.length > 1\">\n Remove\n </button>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4 form-group mb-2\">\n <label class=\"headingtext mb-1\">Product Name <span class=\"text-danger\">*</span></label>\n <!-- Base-pricing dropdown (with a \"+ Custom product\" choice) when\n products exist and this row isn't custom; otherwise a free-text\n name input for a custom product. -->\n <select *ngIf=\"availableProducts.length > 0 && !product.get('isCustom')?.value\" formControlName=\"productName\"\n class=\"form-select\"\n [class.is-invalid]=\"arrayControlInvalid('products', i, 'productName')\"\n (change)=\"onProductChange(i)\">\n <option value=\"\">Select product</option>\n <option *ngFor=\"let p of availableProducts\" [value]=\"p.productName\">\n {{ formatProductName(p.productName) }}\n </option>\n <option value=\"__custom__\">+ Custom product</option>\n </select>\n <input *ngIf=\"availableProducts.length === 0 || product.get('isCustom')?.value\" type=\"text\" formControlName=\"productName\"\n class=\"form-control\"\n [class.is-invalid]=\"arrayControlInvalid('products', i, 'productName')\"\n placeholder=\"e.g. Custom Service\">\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('products', i, 'productName')\">Product Name is required</div>\n </div>\n <div class=\"col-md-4 form-group mb-2\">\n <label class=\"headingtext mb-1\">Description</label>\n <input type=\"text\" formControlName=\"description\" class=\"form-control\"\n placeholder=\"e.g. Customer Footfall Analytics\">\n </div>\n <div class=\"col-md-4 form-group mb-2\">\n <label class=\"headingtext mb-1\">Month</label>\n <input type=\"text\" formControlName=\"month\" class=\"form-control\"\n placeholder=\"e.g. Mar 2026\">\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">HSN/SAC</label>\n <input type=\"text\" formControlName=\"HsnNumber\" class=\"form-control\">\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Quantity</label>\n <input type=\"number\" formControlName=\"storeCount\" class=\"form-control\"\n (input)=\"recalculate()\">\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Rate/Price <span class=\"text-danger\">*</span></label>\n <input type=\"number\" formControlName=\"price\" class=\"form-control\"\n [class.is-invalid]=\"arrayControlInvalid('products', i, 'price')\"\n (input)=\"recalculate()\">\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('products', i, 'price')\">Rate/Price is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Amount</label>\n <input type=\"number\" formControlName=\"amount\" class=\"form-control\" readonly>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Period</label>\n <select class=\"form-select\" formControlName=\"period\">\n <option value=\"monthly\">Monthly</option>\n <option value=\"quarterly\">Quarterly</option>\n <option value=\"halfyearly\">Half-yearly</option>\n <option value=\"yearly\">Yearly</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Tax Section -->\n <div class=\"section-title mb-3 mt-2\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <span>Tax</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"addTax()\">\n + Add Tax\n </button>\n </div>\n </div>\n\n <div formArrayName=\"tax\">\n <div *ngFor=\"let t of taxArray.controls; let j = index\" [formGroupName]=\"j\"\n class=\"tax-row mb-3 p-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span class=\"product-label\">Tax {{ j + 1 }}</span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger\" (click)=\"removeTax(j)\"\n *ngIf=\"taxArray.length > 1\">\n Remove\n </button>\n </div>\n <div class=\"row\">\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Tax Type <span class=\"text-danger\">*</span></label>\n <select class=\"form-select\" formControlName=\"type\"\n [class.is-invalid]=\"arrayControlInvalid('tax', j, 'type')\">\n <option *ngFor=\"let tt of taxTypes\" [value]=\"tt\">{{ tt }}</option>\n </select>\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('tax', j, 'type')\">Tax Type is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Tax % <span class=\"text-danger\">*</span></label>\n <input type=\"number\" formControlName=\"value\" class=\"form-control\"\n [class.is-invalid]=\"arrayControlInvalid('tax', j, 'value')\"\n (input)=\"recalculate()\">\n <div class=\"invalid-msg\" *ngIf=\"arrayControlInvalid('tax', j, 'value')\">Tax % is required</div>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Tax Amount</label>\n <input type=\"text\" formControlName=\"taxAmount\" class=\"form-control\" readonly>\n </div>\n <div class=\"col-md-3 form-group mb-2\">\n <label class=\"headingtext mb-1\">Currency Symbol</label>\n <input type=\"text\" formControlName=\"currency\" class=\"form-control\">\n </div>\n </div>\n </div>\n </div>\n\n <!-- Summary -->\n <div class=\"summary-section p-3 mt-3\">\n <div class=\"d-flex justify-content-between mb-2\">\n <span class=\"summary-label\">Subtotal</span>\n <span class=\"summary-value\">{{ getCurrencySymbol() }} {{ getSubtotal() | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"d-flex justify-content-between mb-2\">\n <span class=\"summary-label\">Total Tax</span>\n <span class=\"summary-value\">{{ getCurrencySymbol() }} {{ getTotalTax() | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"d-flex justify-content-between summary-total\">\n <span class=\"summary-label-bold\">Total Amount</span>\n <span class=\"summary-value-bold\">{{ getCurrencySymbol() }} {{ getTotalAmount() | number:'1.2-2':'en-IN'\n }}</span>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"d-flex mt-4\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn-outline btn cancel me-4 w-50\">Cancel</button>\n <button type=\"submit\" [disabled]=\"saving\"\n class=\"btn btn-primary px-4 w-50\" style=\"white-space: nowrap;\">\n <span *ngIf=\"!saving\" class=\"submit\">{{ mode === 'edit' ? 'Update Invoice' : (mode === 'estimate' ? 'Generate Estimate' : (mode === 'editEstimate' ? 'Update Estimate' : 'Create Invoice'))\n }}</span>\n <span *ngIf=\"saving\" class=\"submit\">Saving...</span>\n </button>\n </div>\n </form>\n </div>\n\n <!-- ======================== CREDIT NOTE TAB ======================== -->\n <div class=\"modal-body mb-4\" *ngIf=\"activeTab === 'creditNote' && mode === 'edit'\">\n <form [formGroup]=\"creditNoteForm\" class=\"form\">\n <div class=\"contenttext mb-3\">\n Apply a credit note / discount to this invoice.\n </div>\n\n <div class=\"d-flex flex-column\">\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Invoice ID</label>\n <input type=\"text\" class=\"form-control\" [value]=\"invoiceData?.invoice\" readonly>\n </div>\n\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Total Amount</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input formControlName=\"amount\" type=\"text\" readonly class=\"form-control amount-input\">\n </div>\n </div>\n\n <div class=\"form-group mt-2\">\n <div class=\"py-2\">\n <label class=\"headingtext mb-2\">Revised Amount</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input type=\"text\" formControlName=\"revisedAmount\"\n (keypress)=\"omitSpecialChar($event)\"\n class=\"form-control amount-input\"\n [ngClass]=\"creditMoreThanTenPercent ? 'errorinput' : ''\">\n <span class=\"input-icon\" *ngIf=\"creditMoreThanTenPercent\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\">\n <g clip-path=\"url(#clip_cn_err)\">\n <path\n d=\"M7.99967 5.33301V7.99967M7.99967 10.6663H8.00634M14.6663 7.99967C14.6663 11.6816 11.6816 14.6663 7.99967 14.6663C4.31778 14.6663 1.33301 11.6816 1.33301 7.99967C1.33301 4.31778 4.31778 1.33301 7.99967 1.33301C11.6816 1.33301 14.6663 4.31778 14.6663 7.99967Z\"\n stroke=\"#F04438\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip_cn_err\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n </div>\n </div>\n <span [ngClass]=\"creditMoreThanTenPercent ? 'text-danger' : 'contenttext'\" class=\"small\">\n Enter a valid revised amount\n </span>\n </div>\n\n <div class=\"form-group mt-2\">\n <div class=\"py-2\">\n <label class=\"headingtext mb-2\">Discount</label>\n <div class=\"input-group\">\n <input type=\"text\" formControlName=\"discount\"\n (keypress)=\"omitSpecialChar($event)\"\n class=\"form-control\"\n [ngClass]=\"creditMoreThanTenPercent ? 'errorinput' : ''\">\n <span class=\"input-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\">\n <path\n d=\"M12.667 3.33366L3.33366 12.667M6.00033 4.33366C6.00033 5.25413 5.25413 6.00033 4.33366 6.00033C3.41318 6.00033 2.66699 5.25413 2.66699 4.33366C2.66699 3.41318 3.41318 2.66699 4.33366 2.66699C5.25413 2.66699 6.00033 3.41318 6.00033 4.33366ZM13.3337 11.667C13.3337 12.5875 12.5875 13.3337 11.667 13.3337C10.7465 13.3337 10.0003 12.5875 10.0003 11.667C10.0003 10.7465 10.7465 10.0003 11.667 10.0003C12.5875 10.0003 13.3337 10.7465 13.3337 11.667Z\"\n [attr.stroke]=\"creditMoreThanTenPercent ? '#F04438' : '#98A2B3'\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n </div>\n </div>\n <span [ngClass]=\"creditMoreThanTenPercent ? 'text-danger' : 'contenttext'\" class=\"small\">\n In percentage\n </span>\n </div>\n </div>\n\n <div class=\"d-flex mt-5\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn-outline btn cancel me-4 w-50\">Cancel</button>\n <button [disabled]=\"creditMoreThanTenPercent || saving\" type=\"button\" (click)=\"applyCreditNote()\"\n class=\"btn btn-primary px-4 w-50\" style=\"white-space: nowrap;\">\n <span *ngIf=\"!saving\">Apply Credit Note</span>\n <span *ngIf=\"saving\">Applying...</span>\n </button>\n </div>\n </form>\n </div>\n\n <!-- ======================== ONE TIME FEE TAB ======================== -->\n <div class=\"modal-body mb-4\" *ngIf=\"activeTab === 'oneTimeFee' && mode === 'edit'\">\n <form [formGroup]=\"oneTimeFeeForm\" class=\"form\">\n <div class=\"contenttext mb-3\">\n Add a one-time fee (e.g. installation) to this invoice.\n </div>\n\n <div class=\"d-flex flex-column\">\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Invoice ID</label>\n <input type=\"text\" class=\"form-control\" [value]=\"invoiceData?.invoice\" readonly>\n </div>\n\n <div class=\"form-group py-2\">\n <label class=\"headingtext mb-2\">Current Invoice Amount</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input formControlName=\"amount\" type=\"text\" readonly class=\"form-control amount-input\">\n </div>\n </div>\n\n <div class=\"form-group mt-2\">\n <div class=\"py-2\">\n <label class=\"headingtext mb-2\">One Time Fee (Installation)</label>\n <div class=\"input-group\">\n <span class=\"dollar-sign\">{{ getInvoiceCurrencySymbol() }}</span>\n <input type=\"text\" formControlName=\"oneTimeFee\"\n (keypress)=\"omitSpecialChar($event)\"\n class=\"form-control amount-input\"\n placeholder=\"Enter fee amount\">\n </div>\n </div>\n </div>\n\n <div class=\"d-flex flex-stack mt-3 fee-summary p-3\">\n <div class=\"summary-label\">Selected Invoice Amount + One Time Fee</div>\n <div class=\"d-flex align-items-center\">\n <span class=\"summary-value-bold\">{{ getInvoiceCurrencySymbol() }}{{\n oneTimeFeeTotal | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex mt-5\">\n <button type=\"button\" (click)=\"activeModal.dismiss()\"\n class=\"btn-outline btn cancel me-4 w-50\">Cancel</button>\n <button [disabled]=\"saving || !oneTimeFeeForm.get('oneTimeFee')?.value\" type=\"button\"\n (click)=\"applyOneTimeFee()\"\n class=\"btn btn-primary px-4 w-50\" style=\"white-space: nowrap;\">\n <span *ngIf=\"!saving\">Apply Fee</span>\n <span *ngIf=\"saving\">Applying...</span>\n </button>\n </div>\n </form>\n </div>\n</div>", styles: [".heading{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.invoice-number{color:var(--Primary-700, #009BF3);font-weight:500;margin-left:4px}.contenttext{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-style:normal;font-weight:400;line-height:20px}.headingtext{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.tab-bar{display:flex;gap:4px;border-bottom:1px solid var(--Gray-200, #EAECF0);padding-bottom:0}.tab-btn{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500;line-height:20px;padding:8px 16px;border:none;background:none;cursor:pointer;border-bottom:2px solid transparent;transition:all .2s}.tab-btn:hover{color:var(--Gray-700, #344054)}.tab-btn.tab-active{color:var(--Primary-700, #009BF3);border-bottom:2px solid var(--Primary-700, #009BF3);font-weight:600}.section-title{color:var(--Gray-900, #101828);font-family:Inter;font-size:16px;font-weight:600;line-height:24px;padding-bottom:8px;border-bottom:1px solid var(--Gray-200, #EAECF0)}.product-row,.tax-row{background:var(--Gray-50, #F9FAFB);border:1px solid var(--Gray-200, #EAECF0);border-radius:8px}.product-label{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:600}input,.form-control{color:#101828;border:1px solid #D0D5DD!important;box-shadow:0 1px 2px #1018280d;border-radius:8px;font-size:14px;width:100%;padding:8px 12px;font-family:Inter;font-weight:400;line-height:24px}input:active,input:focus,input:focus-visible{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD)!important;box-shadow:0 1px 2px #1018280d;outline:none!important;background:var(--Gray-50, #F9FAFB)}input[readonly]{background:var(--Gray-50, #F9FAFB);color:var(--Gray-500, #667085)}.form-select{color:#101828;border:1px solid #D0D5DD!important;box-shadow:0 1px 2px #1018280d;border-radius:8px;font-size:14px;padding:8px 12px;font-family:Inter;font-weight:400;height:auto}.cancel{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:600;line-height:24px;text-transform:capitalize;border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF)}.summary-section,.fee-summary{background:var(--Gray-50, #F9FAFB);border:1px solid var(--Gray-200, #EAECF0);border-radius:8px}.summary-label{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500}.summary-value{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500}.summary-total{padding-top:8px;border-top:1px solid var(--Gray-200, #EAECF0)}.summary-label-bold,.summary-value-bold{color:var(--Gray-900, #101828);font-family:Inter;font-size:16px;font-weight:600}.text-danger{color:var(--Error-500, #F04438)!important;font-family:Inter;font-size:12px!important;font-weight:400}.modal-body{max-height:70vh;overflow-y:auto}.input-group{position:relative}.input-group .dollar-sign{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--Gray-900, #101828);font-family:Inter;font-size:16px;font-weight:400;line-height:24px;z-index:1}.input-group .amount-input{padding-left:30px}.input-group .input-icon{position:absolute;top:50%;right:12px;transform:translateY(-50%);display:inline-flex;align-items:center}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){border-radius:8px!important}.input-group>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-radius:8px!important}.errorinput{border-radius:8px;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF);box-shadow:0 1px 2px #1018280d}.errorinput:focus{border:1px solid var(--Error-300, #FDA29B)!important}.form-control.is-invalid,.form-select.is-invalid{border:1px solid var(--Error-300, #FDA29B)!important;background:#fef3f2}.form-control.is-invalid:focus,.form-control.is-invalid:active,.form-control.is-invalid:focus-visible,.form-select.is-invalid:focus,.form-select.is-invalid:active,.form-select.is-invalid:focus-visible{border:1px solid var(--Error-300, #FDA29B)!important;box-shadow:0 0 0 4px #f044381f!important;background:#fef3f2}.invalid-msg{color:#b42318;font-family:Inter;font-size:12px;font-weight:500;line-height:18px;margin-top:4px}\n"] }]
615
615
  }], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.FormBuilder }, { type: i3.BillingService }, { type: i0.ChangeDetectorRef }, { type: i4.ToastService }], propDecorators: { invoiceData: [{
616
616
  type: Input
617
617
  }], mode: [{
@@ -621,4 +621,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
621
621
  }], billingGroups: [{
622
622
  type: Input
623
623
  }] } });
624
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC1pbnZvaWNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1tYW5hZ2UtYmlsbGluZy9lZGl0LWludm9pY2UvZWRpdC1pbnZvaWNlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1tYW5hZ2UtYmlsbGluZy9lZGl0LWludm9pY2UvZWRpdC1pbnZvaWNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFdkYsT0FBTyxFQUFxQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7OztBQVMxQyxNQUFNLE9BQU8sb0JBQW9CO0lBaUR0QjtJQUNDO0lBQ0E7SUFDQTtJQUNBO0lBcERELFdBQVcsQ0FBTTtJQUMxQiwwRUFBMEU7SUFDMUUsOERBQThEO0lBQ3JELElBQUksR0FBb0QsTUFBTSxDQUFDO0lBQy9ELFFBQVEsR0FBVyxFQUFFLENBQUM7SUFDdEIsYUFBYSxHQUFVLEVBQUUsQ0FBQztJQUVuQyxXQUFXLENBQWE7SUFDUCxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUMxQyxNQUFNLEdBQVksS0FBSyxDQUFDO0lBRXhCLHVDQUF1QztJQUN2QyxTQUFTLEdBQVcsTUFBTSxDQUFDO0lBRTNCLFFBQVEsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsZUFBZSxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEUsY0FBYyxHQUEyQjtRQUN2QyxHQUFHLEVBQUUsU0FBUztRQUNkLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLGVBQWUsRUFBRSxVQUFVO1FBQzNCLElBQUksRUFBRSxTQUFTO1FBQ2YsR0FBRyxFQUFFLFdBQVc7S0FDakIsQ0FBQztJQUNGLDRFQUE0RTtJQUM1RSwwRUFBMEU7SUFDMUUsc0NBQXNDO0lBQ3JCLGVBQWUsR0FBMkI7UUFDekQsR0FBRyxFQUFFLEdBQUc7UUFDUixNQUFNLEVBQUUsR0FBRztRQUNYLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLElBQUksRUFBRSxHQUFHO1FBQ1QsR0FBRyxFQUFFLEtBQUs7S0FDWCxDQUFDO0lBQ0YsYUFBYSxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3hDLG9CQUFvQixHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTFDLGNBQWM7SUFDZCxjQUFjLENBQWE7SUFDM0Isd0JBQXdCLEdBQVksS0FBSyxDQUFDO0lBRTFDLDZCQUE2QjtJQUM3QixpQkFBaUIsR0FBVSxFQUFFLENBQUM7SUFFOUIsZUFBZTtJQUNmLGNBQWMsQ0FBYTtJQUMzQixlQUFlLEdBQVcsQ0FBQyxDQUFDO0lBRTVCLFlBQ1MsV0FBMkIsRUFDMUIsRUFBZSxFQUNmLGNBQThCLEVBQzlCLGNBQWlDLEVBQ2pDLEtBQW1CO1FBSnBCLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMxQixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxVQUFLLEdBQUwsS0FBSyxDQUFjO0lBQzFCLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUM1QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7U0FDaEM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDM0QseUVBQXlFO1lBQ3pFLG9FQUFvRTtZQUNwRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDbEI7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUM7UUFDeEQsSUFBSSxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNyRixJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDakIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN0QyxDQUFDO2dCQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7b0JBQ1YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztnQkFDOUIsQ0FBQzthQUNGLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFhO1FBQzNCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQzVELDZFQUE2RTtRQUM3RSxvRUFBb0U7UUFDcEUsSUFBSSxZQUFZLEtBQUssWUFBWSxFQUFFO1lBQ2pDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4RixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsT0FBTztTQUNSO1FBQ0QsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLENBQUM7UUFDakYsSUFBSSxPQUFPLEVBQUU7WUFDWCxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsd0NBQXdDO1lBQ3hDLE1BQU0sWUFBWSxHQUEyQjtnQkFDM0MsWUFBWSxFQUFFLDZCQUE2QjtnQkFDM0MsU0FBUyxFQUFFLG9DQUFvQztnQkFDL0MsU0FBUyxFQUFFLDRCQUE0QjtnQkFDdkMsZUFBZSxFQUFFLGtCQUFrQjthQUNwQyxDQUFDO1lBQ0YsWUFBWSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzVFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsdUNBQXVDO0lBQ3ZDLGdCQUFnQjtRQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQVk7UUFDNUIsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyQiw2RUFBNkU7UUFDN0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQzthQUM1QyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQztRQUN4RCxJQUFJLEdBQUcsRUFBRTtZQUNQLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3BGLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO29CQUNqQixJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN0QyxDQUFDO2dCQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7b0JBQ1YsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7Z0JBQzFCLENBQUM7YUFDRixDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQVc7UUFDaEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7SUFDdkIsQ0FBQztJQUVELDJEQUEyRDtJQUUzRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUMvQixXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUN0QyxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDcEIsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2YsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ25CLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNmLG9FQUFvRTtZQUNwRSw0Q0FBNEM7WUFDNUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUQsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDdEMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDbEMsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDdEMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ25CLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN6QixzRUFBc0U7WUFDdEUscUVBQXFFO1lBQ3JFLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN2QixhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDMUIsMkVBQTJFO1lBQzNFLG1CQUFtQixFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3pCLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsaUVBQWlFO0lBQ2pFLGNBQWMsR0FBVSxFQUFFLENBQUM7SUFFM0Isa0JBQWtCO1FBQ2hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUM7UUFDeEQsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbEYsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO1lBQ3hELENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1lBQzNCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsb0JBQW9CLEdBQUc7UUFDckIsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRTtRQUNuRCxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFO1FBQzFELEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsNkJBQTZCLEVBQUU7UUFDN0QsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSx5QkFBeUIsRUFBRTtLQUN0RCxDQUFDO0lBRUYsMkVBQTJFO0lBQzNFLDJFQUEyRTtJQUMzRSw0REFBNEQ7SUFDNUQsY0FBYyxDQUFDLElBQVk7UUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUNoRCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsU0FBNkIsRUFBRSxLQUFhLEVBQUUsSUFBWTtRQUM1RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQXFCLENBQUM7UUFDakUsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUNoRCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLDBFQUEwRTtRQUMxRSx3RUFBd0U7UUFDeEUsNEJBQTRCO1FBQzVCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN0RCxNQUFNLEtBQUssR0FBRyxJQUFJLEVBQUUsYUFBYSxDQUFDLGFBQWEsQ0FBdUIsQ0FBQztRQUN2RSxJQUFJLEtBQUssRUFBRTtZQUNULEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzlELElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxLQUFLLFVBQVUsRUFBRTtnQkFDckMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQ3RDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQWMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQWMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsT0FBYTtRQUM5QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLFdBQVcsRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLElBQUksRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDOUQsMkVBQTJFO1lBQzNFLHNFQUFzRTtZQUN0RSxvQkFBb0I7WUFDcEIsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsSUFBSSxLQUFLLENBQUM7WUFDdEMsV0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDekMsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsSUFBSSxRQUFRLENBQUM7WUFDM0MsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDO1lBQzlCLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDO1NBQ3ZDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBUztRQUN0QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDaEQsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksR0FBRyxDQUFDO1lBQ2xDLHNFQUFzRTtZQUN0RSwrREFBK0Q7WUFDL0QsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3RGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxTQUFTLENBQUMsSUFBK0I7UUFDL0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDakQsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxhQUFhLENBQUMsS0FBYTtRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUU3QixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztZQUMxQixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFO1lBQ2xDLGNBQWMsRUFBRSxHQUFHLENBQUMsY0FBYyxJQUFJLEVBQUU7WUFDeEMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRTtZQUM5QixhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQWEsSUFBSSxFQUFFO1lBQ3RDLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUyxJQUFJLEVBQUU7WUFDOUIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRTtZQUMxQixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQ3ZCLFdBQVcsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUNyRCxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDN0MsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLElBQUksS0FBSztZQUMvQixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBSSxTQUFTO1lBQy9CLGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYSxJQUFJLFFBQVE7WUFDNUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLG1CQUFtQixJQUFJLEVBQUU7U0FDbkQsQ0FBQyxDQUFDO1FBRUgsaUJBQWlCO1FBQ2pCLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUU7WUFDeEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO1FBRUQsWUFBWTtRQUNaLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUU7WUFDbkIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNmO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQVM7UUFDMUIsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyQixNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQVU7UUFDdEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakYsSUFBSSxhQUFhLEVBQUU7WUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUztnQkFDbEMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxHQUFHO2dCQUMxQixXQUFXLEVBQUUsYUFBYSxDQUFDLHFCQUFxQixJQUFJLEVBQUU7Z0JBQ3RELGNBQWMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQzlMLFNBQVMsRUFBRSxhQUFhLENBQUMsR0FBRyxJQUFJLEVBQUU7Z0JBQ2xDLGFBQWEsRUFBRSxhQUFhLENBQUMsYUFBYSxJQUFJLEVBQUU7YUFDakQsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDdkQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQzdDLE1BQU0sTUFBTSxHQUFHLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLFFBQVEsSUFBSSxNQUFNLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDN0MsTUFBTSxTQUFTLEdBQUcsQ0FBQyxRQUFRLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RCxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QyxXQUFXLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRTVFLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUdELFdBQVc7UUFDVCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkMsUUFBUSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3ZDLFFBQVEsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFO1lBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNwQyxnRUFBZ0U7WUFDaEUsc0VBQXNFO1lBQ3RFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWpELE1BQU0sT0FBTyxHQUFRO1lBQ25CLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVztZQUNsQyxjQUFjLEVBQUUsU0FBUyxDQUFDLGNBQWM7WUFDeEMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTO1lBQzlCLGFBQWEsRUFBRSxTQUFTLENBQUMsYUFBYTtZQUN0QyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7WUFDOUIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO1lBQzFCLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtZQUN4QixXQUFXLEVBQUUsU0FBUyxDQUFDLFdBQVc7WUFDbEMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO1lBQzFCLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtZQUM1QixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07WUFDeEIsYUFBYSxFQUFFLFNBQVMsQ0FBQyxhQUFhO1lBQ3RDLGNBQWMsRUFBRSxTQUFTLENBQUMsY0FBYztZQUN4QyxhQUFhLEVBQUUsU0FBUyxDQUFDLGFBQWE7WUFDdEMsbUVBQW1FO1lBQ25FLG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsSUFBSSxTQUFTO1lBQy9ELFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtZQUM1QixHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUc7WUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDMUIsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQy9DLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUM7WUFDbkMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztZQUMzQyxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1lBQzdDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNsRixJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ3BCLElBQUksR0FBRyxFQUFFO3dCQUNQLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLDhCQUE4QixDQUFDLENBQUM7d0JBQzNELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3FCQUNuQztnQkFDSCxDQUFDO2dCQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7b0JBQ1YsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLENBQUM7Z0JBQ3ZELENBQUM7YUFDRixDQUFDLENBQUM7U0FDSjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUU7WUFDdkMsc0VBQXNFO1lBQ3RFLDBFQUEwRTtZQUMxRSxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM5RCxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxXQUFXO2dCQUNwQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztnQkFDOUYsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztZQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDbkYsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNwQixJQUFJLEdBQUcsRUFBRTt3QkFDUCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO3dCQUM1RCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDbkM7Z0JBQ0gsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLDJCQUEyQixDQUFDLENBQUM7Z0JBQy9FLENBQUM7YUFDRixDQUFDLENBQUM7U0FDSjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7WUFDbkMsd0VBQXdFO1lBQ3hFLHVFQUF1RTtZQUN2RSxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDakMsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsV0FBVztnQkFDcEMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQzlGLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDZCxPQUFPLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ25GLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO29CQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztvQkFDcEIsSUFBSSxHQUFHLEVBQUU7d0JBQ1AsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsaUNBQWlDLENBQUMsQ0FBQzt3QkFDOUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQ25DO2dCQUNILENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSw2QkFBNkIsQ0FBQyxDQUFDO2dCQUNqRixDQUFDO2FBQ0YsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNqQyx1RUFBdUU7WUFDdkUsb0VBQW9FO1lBQ3BFLG1FQUFtRTtZQUNuRSwyQ0FBMkM7WUFDM0MsT0FBTyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ2xGLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO29CQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztvQkFDcEIsSUFBSSxHQUFHLEVBQUU7d0JBQ1AsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsOEJBQThCLENBQUMsQ0FBQzt3QkFDM0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQ25DO2dCQUNILENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNwQixNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQztvQkFDOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7YUFDRixDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCwwREFBMEQ7SUFFMUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbEMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ1osYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDeEMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDMUQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDcEcsSUFBSSxDQUFDLEVBQUU7Z0JBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDO2dCQUN4RCxJQUFJLE1BQU0sRUFBRTtvQkFDVixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzNHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztpQkFDL0U7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7YUFDdkM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQy9GLElBQUksQ0FBQyxFQUFFO2dCQUNMLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQztnQkFDeEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7Z0JBQ3ZGLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUNuRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQzdFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7YUFDdkM7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUM7Z0JBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsSUFBSSxDQUFDO2FBQ3JFLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyx3QkFBd0I7WUFBRSxPQUFPO1FBQzFDLE1BQU0sV0FBVyxHQUFHO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFDakMsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUs7WUFDOUQsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUs7U0FDckQsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RGLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7b0JBQy9ELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUN6QztZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQzFELENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQVU7UUFDeEIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUN6QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsMkRBQTJEO0lBRTNELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2xDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNaLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ3RDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUM3RSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDO2dCQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLElBQUksQ0FBQzthQUNyRSxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztTQUNqQztJQUNILENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQztRQUMzRSxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQzlELElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUN0QixNQUFNLFdBQVcsR0FBRztZQUNsQixVQUFVLEVBQUUsUUFBUTtTQUNyQixDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDN0csSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNwQixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRTtvQkFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsbUNBQW1DLENBQUMsQ0FBQztvQkFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ3RDO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLDhCQUE4QixDQUFDLENBQUM7WUFDM0QsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBcm9CVSxvQkFBb0I7NEZBQXBCLG9CQUFvQixvS0NaakMsOGs0QkFxY007OzRGRHpiTyxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usa0JBQWtCO3FNQUtuQixXQUFXO3NCQUFuQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUFycmF5LCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCaWxsaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2JpbGxpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWVkaXQtaW52b2ljZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0LWludm9pY2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZWRpdC1pbnZvaWNlLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBFZGl0SW52b2ljZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgaW52b2ljZURhdGE6IGFueTtcbiAgLy8gJ2VzdGltYXRlJyByZXVzZXMgdGhlIHdob2xlIGNyZWF0ZSBmb3JtIGJ1dCBzdWJtaXRzIHRvIHRoZSBlc3RpbWF0ZSBBUElcbiAgLy8gYW5kIHdyaXRlcyB0byB0aGUgZXN0aW1hdGVzIGNvbGxlY3Rpb24gaW5zdGVhZCBvZiBpbnZvaWNlcy5cbiAgQElucHV0KCkgbW9kZTogJ2VkaXQnIHwgJ2NyZWF0ZScgfCAnZXN0aW1hdGUnIHwgJ2VkaXRFc3RpbWF0ZScgPSAnZWRpdCc7XG4gIEBJbnB1dCgpIGNsaWVudElkOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgYmlsbGluZ0dyb3VwczogYW55W10gPSBbXTtcblxuICBpbnZvaWNlRm9ybSE6IEZvcm1Hcm91cDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG4gIHNhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFRhYnM6IGVkaXQgfCBjcmVkaXROb3RlIHwgb25lVGltZUZlZVxuICBhY3RpdmVUYWI6IHN0cmluZyA9ICdlZGl0JztcblxuICB0YXhUeXBlcyA9IFsnSUdTVCcsICdDR1NUJywgJ1NHU1QnXTtcbiAgY3VycmVuY3lPcHRpb25zID0gWydpbnInLCAnZG9sbGFyJywgJ3NpbmdhcG9yZWRvbGxhcicsICdldXJvJywgJ2FlZCddO1xuICBjdXJyZW5jeUxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBpbnI6ICdJTlIgKOKCuSknLFxuICAgIGRvbGxhcjogJ1VTRCAoJCknLFxuICAgIHNpbmdhcG9yZWRvbGxhcjogJ1NHRCAoUyQpJyxcbiAgICBldXJvOiAnRVVSICjigqwpJyxcbiAgICBhZWQ6ICdBRUQgKEFFRCknXG4gIH07XG4gIC8vIFN5bWJvbCBtYXAgbWlycm9ycyB0aGUgYmFja2VuZCdzIENVUlJFTkNZX1NZTUJPTFMgaW4gdXRpbHMvY3VycmVuY3kuanMgc29cbiAgLy8gdGhlIG1vZGFsLCBpbnZvaWNlIGxpc3QsIGNyZWRpdC1ub3RlIGFuZCBvbmUtdGltZS1mZWUgcG9wdXBzIGFsbCByZW5kZXJcbiAgLy8gdGhlIHNhbWUgc3ltYm9sIHRoZSBQREYvZW1haWwgdXNlcy5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW5jeVN5bWJvbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaW5yOiAn4oK5JyxcbiAgICBkb2xsYXI6ICckJyxcbiAgICBzaW5nYXBvcmVkb2xsYXI6ICdTJCcsXG4gICAgZXVybzogJ+KCrCcsXG4gICAgYWVkOiAnQUVEJyxcbiAgfTtcbiAgc3RhdHVzT3B0aW9ucyA9IFsncGVuZGluZycsICdhcHByb3ZlZCddO1xuICBwYXltZW50U3RhdHVzT3B0aW9ucyA9IFsndW5wYWlkJywgJ3BhaWQnXTtcblxuICAvLyBDcmVkaXQgTm90ZVxuICBjcmVkaXROb3RlRm9ybSE6IEZvcm1Hcm91cDtcbiAgY3JlZGl0TW9yZVRoYW5UZW5QZXJjZW50OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gUHJvZHVjdHMgZnJvbSBiYXNlIHByaWNpbmdcbiAgYXZhaWxhYmxlUHJvZHVjdHM6IGFueVtdID0gW107XG5cbiAgLy8gT25lIFRpbWUgRmVlXG4gIG9uZVRpbWVGZWVGb3JtITogRm9ybUdyb3VwO1xuICBvbmVUaW1lRmVlVG90YWw6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCxcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGJpbGxpbmdTZXJ2aWNlOiBCaWxsaW5nU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgICB0aGlzLmxvYWRDbGllbnRQcm9kdWN0cygpO1xuICAgIHRoaXMubG9hZFB1cmNoYXNlT3JkZXJzKCk7XG4gICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgIHRoaXMuaW5pdENyZWRpdE5vdGVGb3JtKCk7XG4gICAgdGhpcy5pbml0T25lVGltZUZlZUZvcm0oKTtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZWRpdCcgJiYgdGhpcy5pbnZvaWNlRGF0YSkge1xuICAgICAgdGhpcy5wYXRjaEZvcm0oKTtcbiAgICAgIHRoaXMucGF0Y2hDcmVkaXROb3RlRGVmYXVsdHMoKTtcbiAgICAgIHRoaXMucGF0Y2hPbmVUaW1lRmVlRGVmYXVsdHMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2VkaXRFc3RpbWF0ZScgJiYgdGhpcy5pbnZvaWNlRGF0YSkge1xuICAgICAgLy8gRWRpdGluZyBhbiBlc3RpbWF0ZSByZXVzZXMgdGhlIHNhbWUgZm9ybSBmaWVsZHM7IHRoZSBlc3RpbWF0ZSBkb2N1bWVudFxuICAgICAgLy8gc2hhcmVzIHRoZSBpbnZvaWNlIHNoYXBlIChjb21wYW55TmFtZSwgcHJvZHVjdHMsIHRheCwgc3RvcmVzLCDigKYpLlxuICAgICAgdGhpcy5wYXRjaEZvcm0oKTtcbiAgICB9XG4gIH1cblxuICBsb2FkQ2xpZW50UHJvZHVjdHMoKSB7XG4gICAgY29uc3QgY0lkID0gdGhpcy5jbGllbnRJZCB8fCB0aGlzLmludm9pY2VEYXRhPy5jbGllbnRJZDtcbiAgICBpZiAoY0lkKSB7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldENsaWVudEJhc2VQcmljaW5nKGNJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlUHJvZHVjdHMgPSByZXM/LmRhdGEgfHwgW107XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hdmFpbGFibGVQcm9kdWN0cyA9IFtdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvblByb2R1Y3RDaGFuZ2UoaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHByb2R1Y3RHcm91cCA9IHRoaXMucHJvZHVjdHMuYXQoaW5kZXgpO1xuICAgIGNvbnN0IHNlbGVjdGVkTmFtZSA9IHByb2R1Y3RHcm91cC5nZXQoJ3Byb2R1Y3ROYW1lJyk/LnZhbHVlO1xuICAgIC8vIFwiKyBDdXN0b20gcHJvZHVjdFwiIHBpY2tlZCBmcm9tIHRoZSBkcm9wZG93biDigJQgc3dpdGNoIHRoaXMgcm93IHRvIGZyZWUtdGV4dFxuICAgIC8vIGVudHJ5IChjdXN0b20gbmFtZSArIHByaWNlKSwgY2xlYXJpbmcgdGhlIGJhc2UtcHJpY2luZyBzZWxlY3Rpb24uXG4gICAgaWYgKHNlbGVjdGVkTmFtZSA9PT0gJ19fY3VzdG9tX18nKSB7XG4gICAgICBwcm9kdWN0R3JvdXAucGF0Y2hWYWx1ZSh7IGlzQ3VzdG9tOiB0cnVlLCBwcm9kdWN0TmFtZTogJycsIHByaWNlOiAwLCBkZXNjcmlwdGlvbjogJycgfSk7XG4gICAgICB0aGlzLnJlY2FsY3VsYXRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHByb2R1Y3RHcm91cC5nZXQoJ2lzQ3VzdG9tJyk/LnNldFZhbHVlKGZhbHNlKTtcbiAgICBjb25zdCBwcm9kdWN0ID0gdGhpcy5hdmFpbGFibGVQcm9kdWN0cy5maW5kKHAgPT4gcC5wcm9kdWN0TmFtZSA9PT0gc2VsZWN0ZWROYW1lKTtcbiAgICBpZiAocHJvZHVjdCkge1xuICAgICAgcHJvZHVjdEdyb3VwLmdldCgncHJpY2UnKT8uc2V0VmFsdWUocHJvZHVjdC5wcmljZSk7XG4gICAgICAvLyBTZXQgZGVzY3JpcHRpb24gYmFzZWQgb24gcHJvZHVjdCBuYW1lXG4gICAgICBjb25zdCBkZXNjcmlwdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIHRhbmdvVHJhZmZpYzogJ0N1c3RvbWVyIEZvb3RmYWxsIEFuYWx5dGljcycsXG4gICAgICAgIHRhbmdvWm9uZTogJ1Byb2R1Y3QgY2F0ZWdvcnkvc2VjdGlvbiBhbmFseXRpY3MnLFxuICAgICAgICB0YW5nb1RyYXg6ICdDdXN0b21lciBKb3VybmV5IEFuYWx5dGljcycsXG4gICAgICAgIHByaW9yaXR5U3VwcG9ydDogJ1ByaW9yaXR5IFN1cHBvcnQnLFxuICAgICAgfTtcbiAgICAgIHByb2R1Y3RHcm91cC5nZXQoJ2Rlc2NyaXB0aW9uJyk/LnNldFZhbHVlKGRlc2NyaXB0aW9uc1tzZWxlY3RlZE5hbWVdIHx8ICcnKTtcbiAgICAgIHRoaXMucmVjYWxjdWxhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYSBibGFuayBwcm9kdWN0IHJvdyBhbHJlYWR5IGluIGN1c3RvbSAoZnJlZS10ZXh0KSBtb2RlLCByZWdhcmRsZXNzIG9mXG4gIC8vIHdoZXRoZXIgYmFzZS1wcmljaW5nIHByb2R1Y3RzIGV4aXN0LlxuICBhZGRDdXN0b21Qcm9kdWN0KCkge1xuICAgIHRoaXMucHJvZHVjdHMucHVzaCh0aGlzLmNyZWF0ZVByb2R1Y3RHcm91cCh7IGlzQ3VzdG9tOiB0cnVlIH0pKTtcbiAgfVxuXG4gIGZvcm1hdFByb2R1Y3ROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gICAgLy8gQ29udmVydCBjYW1lbENhc2UgdG8gVGl0bGUgQ2FzZSB3aXRoIHNwYWNlczogdGFuZ29UcmFmZmljIC0+IFRhbmdvIFRyYWZmaWNcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEgJDInKVxuICAgICAgLnJlcGxhY2UoL14uLywgKHN0cikgPT4gc3RyLnRvVXBwZXJDYXNlKCkpO1xuICB9XG5cbiAgbG9hZEJpbGxpbmdHcm91cHMoKSB7XG4gICAgY29uc3QgY0lkID0gdGhpcy5jbGllbnRJZCB8fCB0aGlzLmludm9pY2VEYXRhPy5jbGllbnRJZDtcbiAgICBpZiAoY0lkKSB7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEFsbEJpbGxpbmdHcm91cHMoY0lkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzID0gcmVzPy5kYXRhIHx8IFtdO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3VwcyA9IFtdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgc2V0VGFiKHRhYjogc3RyaW5nKSB7XG4gICAgdGhpcy5hY3RpdmVUYWIgPSB0YWI7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRURJVCBJTlZPSUNFID09PT09PT09PT09PT09PT09PT09PVxuXG4gIGluaXRGb3JtKCkge1xuICAgIHRoaXMuaW52b2ljZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNvbXBhbnlOYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgY29tcGFueUFkZHJlc3M6IFsnJ10sXG4gICAgICBHU1ROdW1iZXI6IFsnJ10sXG4gICAgICBQbGFjZU9mU3VwcGx5OiBbJyddLFxuICAgICAgZ3JvdXBOYW1lOiBbJyddLFxuICAgICAgLy8gQmlsbGluZyBHcm91cCBpcyByZXF1aXJlZCB3aGVuIGNyZWF0aW5nIOKAlCB0aGUgcmVzdCBvZiB0aGUgY29tcGFueVxuICAgICAgLy8gZmllbGRzIGF1dG8tZmlsbCBmcm9tIHRoZSBzZWxlY3RlZCBncm91cC5cbiAgICAgIGdyb3VwSWQ6IFsnJywgdGhpcy5tb2RlICE9PSAnZWRpdCcgPyBWYWxpZGF0b3JzLnJlcXVpcmVkIDogW11dLFxuICAgICAgc3RvcmVzOiBbMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDApXV0sXG4gICAgICBiaWxsaW5nRGF0ZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGR1ZURhdGU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBjdXJyZW5jeTogWydpbnInLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHN0YXR1czogWydwZW5kaW5nJ10sXG4gICAgICBwYXltZW50U3RhdHVzOiBbJ3VucGFpZCddLFxuICAgICAgLy8gQWR2YW5jZSBpbnZvaWNlOiB3aGVuIG9uLCB0aGUgY2hvc2VuIGZyZXF1ZW5jeSBiaWxscyBzZXZlcmFsIGZ1dHVyZVxuICAgICAgLy8gbW9udGhzIHVwZnJvbnQgKGVhY2ggbW9udGggYmVjb21lcyBpdHMgb3duIGxpbmUgaXRlbSBzZXJ2ZXItc2lkZSkuXG4gICAgICBhZHZhbmNlSW52b2ljZTogW2ZhbHNlXSxcbiAgICAgIGFkdmFuY2VQZXJpb2Q6IFsnbW9udGhseSddLFxuICAgICAgLy8gT3B0aW9uYWw6IG1hcCB0aGlzIGludm9pY2UgdG8gYSBwdXJjaGFzZSBvcmRlciAocmVkdWNlcyB0aGUgUE8gYmFsYW5jZSkuXG4gICAgICBwdXJjaGFzZU9yZGVyTnVtYmVyOiBbJyddLFxuICAgICAgcHJvZHVjdHM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgICAgdGF4OiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFB1cmNoYXNlIG9yZGVycyBhdmFpbGFibGUgZm9yIHRoaXMgY2xpZW50IChmb3IgdGhlIFBPIHBpY2tlcikuXG4gIHB1cmNoYXNlT3JkZXJzOiBhbnlbXSA9IFtdO1xuXG4gIGxvYWRQdXJjaGFzZU9yZGVycygpIHtcbiAgICBjb25zdCBjSWQgPSB0aGlzLmNsaWVudElkIHx8IHRoaXMuaW52b2ljZURhdGE/LmNsaWVudElkO1xuICAgIGlmICghY0lkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0UHVyY2hhc2VPcmRlcnMoY0lkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnB1cmNoYXNlT3JkZXJzID0gcmVzPy5kYXRhPy5wdXJjaGFzZU9yZGVycyB8fCBbXTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnB1cmNoYXNlT3JkZXJzID0gW107XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYWR2YW5jZVBlcmlvZE9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ21vbnRobHknLCBsYWJlbDogJ01vbnRobHkgKG5leHQgbW9udGgpJyB9LFxuICAgIHsgdmFsdWU6ICdxdWFydGVybHknLCBsYWJlbDogJ1F1YXJ0ZXJseSAobmV4dCAzIG1vbnRocyknIH0sXG4gICAgeyB2YWx1ZTogJ2hhbGZ5ZWFybHknLCBsYWJlbDogJ0hhbGYteWVhcmx5IChuZXh0IDYgbW9udGhzKScgfSxcbiAgICB7IHZhbHVlOiAneWVhcmx5JywgbGFiZWw6ICdZZWFybHkgKG5leHQgMTIgbW9udGhzKScgfSxcbiAgXTtcblxuICAvLyBUZW1wbGF0ZSBoZWxwZXJzOiBzdXJmYWNlIFwidG91Y2hlZCAmJiBpbnZhbGlkXCIgc28gdGhlIEhUTUwgY2FuIGhpZ2hsaWdodFxuICAvLyB0aGUgZmllbGQgYW5kIHJlbmRlciBhbiBpbmxpbmUgZXJyb3IuIERlZmVuc2l2ZSBhZ2FpbnN0IHRoZSBmb3JtIG5vdCB5ZXRcbiAgLy8gYmVpbmcgaW5pdGlhbGlzZWQgZHVyaW5nIHRoZSBmaXJzdCBjaGFuZ2UtZGV0ZWN0aW9uIHBhc3MuXG4gIGNvbnRyb2xJbnZhbGlkKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmludm9pY2VGb3JtPy5nZXQobmFtZSk7XG4gICAgcmV0dXJuICEhY3RybCAmJiBjdHJsLnRvdWNoZWQgJiYgY3RybC5pbnZhbGlkO1xuICB9XG5cbiAgYXJyYXlDb250cm9sSW52YWxpZChhcnJheU5hbWU6ICdwcm9kdWN0cycgfCAndGF4JywgaW5kZXg6IG51bWJlciwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYXJyID0gdGhpcy5pbnZvaWNlRm9ybT8uZ2V0KGFycmF5TmFtZSkgYXMgRm9ybUFycmF5IHwgbnVsbDtcbiAgICBjb25zdCBjdHJsID0gYXJyPy5hdChpbmRleCk/LmdldChuYW1lKTtcbiAgICByZXR1cm4gISFjdHJsICYmIGN0cmwudG91Y2hlZCAmJiBjdHJsLmludmFsaWQ7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvRmlyc3RJbnZhbGlkKCk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIGZpcnN0IGludmFsaWQgY29udHJvbCBpbnNpZGUgdGhlIG1vZGFsIGFuZCBicmluZyBpdCBpbnRvIHZpZXcuXG4gICAgLy8gU2NvcGVkIHRvIC5tb2RhbC1jb250ZW50IHNvIHdlIGRvbid0IGdyYWIgZmllbGRzIGZyb20gb3RoZXIgbW9kYWxzIG9uXG4gICAgLy8gdGhlIHBhZ2UgaWYgYW55IGFyZSBvcGVuLlxuICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubW9kYWwtY29udGVudCcpO1xuICAgIGNvbnN0IGZpcnN0ID0gcm9vdD8ucXVlcnlTZWxlY3RvcignLmlzLWludmFsaWQnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKGZpcnN0KSB7XG4gICAgICBmaXJzdC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgICAgaWYgKHR5cGVvZiBmaXJzdC5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaXJzdC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHByb2R1Y3RzKCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuaW52b2ljZUZvcm0uZ2V0KCdwcm9kdWN0cycpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIGdldCB0YXhBcnJheSgpOiBGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmludm9pY2VGb3JtLmdldCgndGF4JykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgY3JlYXRlUHJvZHVjdEdyb3VwKHByb2R1Y3Q/OiBhbnkpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHByb2R1Y3ROYW1lOiBbcHJvZHVjdD8ucHJvZHVjdE5hbWUgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgLy8gV2hlbiB0cnVlLCB0aGUgbmFtZSBpcyBhIGZyZWUtdGV4dCBjdXN0b20gcHJvZHVjdCAobm90IGZyb20gdGhlIGNsaWVudCdzXG4gICAgICAvLyBiYXNlLXByaWNpbmcgbGlzdCkg4oCUIHRoZSB0ZW1wbGF0ZSBzaG93cyBhIHRleHQgaW5wdXQgaW5zdGVhZCBvZiB0aGVcbiAgICAgIC8vIHByb2R1Y3QgZHJvcGRvd24uXG4gICAgICBpc0N1c3RvbTogW3Byb2R1Y3Q/LmlzQ3VzdG9tIHx8IGZhbHNlXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBbcHJvZHVjdD8uZGVzY3JpcHRpb24gfHwgJyddLFxuICAgICAgbW9udGg6IFtwcm9kdWN0Py5tb250aCB8fCAnJ10sXG4gICAgICBIc25OdW1iZXI6IFtwcm9kdWN0Py5Ic25OdW1iZXIgfHwgJzk5ODMxNCddLFxuICAgICAgc3RvcmVDb3VudDogW3Byb2R1Y3Q/LnN0b3JlQ291bnQgfHwgMCwgVmFsaWRhdG9ycy5taW4oMCldLFxuICAgICAgcHJpY2U6IFtwcm9kdWN0Py5wcmljZSB8fCAwLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMCldXSxcbiAgICAgIGFtb3VudDogW3Byb2R1Y3Q/LmFtb3VudCB8fCAwXSxcbiAgICAgIHBlcmlvZDogW3Byb2R1Y3Q/LnBlcmlvZCB8fCAnbW9udGhseSddLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlVGF4R3JvdXAodGF4PzogYW55KTogRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XG4gICAgICB0eXBlOiBbdGF4Py50eXBlIHx8ICdJR1NUJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB2YWx1ZTogW3RheD8udmFsdWUgfHwgMTgsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwKSwgVmFsaWRhdG9ycy5tYXgoMTAwKV1dLFxuICAgICAgdGF4QW1vdW50OiBbdGF4Py50YXhBbW91bnQgfHwgJzAnXSxcbiAgICAgIC8vIERlZmF1bHQgdGhlIHRheC1yb3cgc3ltYm9sIHRvIHRoZSBpbnZvaWNlJ3MgY3VycmVuY3kgKHdhcyBoYXJkY29kZWRcbiAgICAgIC8vIHRvIOKCuSwgd2hpY2ggbGVha2VkIGludG8gdGhlIHNhdmVkIGRvYyBmb3Igbm9uLUlOUiBpbnZvaWNlcykuXG4gICAgICBjdXJyZW5jeTogW3RheD8uY3VycmVuY3kgfHwgdGhpcy5zeW1ib2xGb3IodGhpcy5pbnZvaWNlRm9ybT8uZ2V0KCdjdXJyZW5jeScpPy52YWx1ZSldLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW1ib2xGb3IoY29kZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVuY3lTeW1ib2xzW2NvZGUgfHwgJyddIHx8ICckJztcbiAgfVxuXG4gIGFkZFByb2R1Y3QoKSB7XG4gICAgdGhpcy5wcm9kdWN0cy5wdXNoKHRoaXMuY3JlYXRlUHJvZHVjdEdyb3VwKCkpO1xuICB9XG5cbiAgcmVtb3ZlUHJvZHVjdChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5wcm9kdWN0cy5yZW1vdmVBdChpbmRleCk7XG4gICAgdGhpcy5yZWNhbGN1bGF0ZSgpO1xuICB9XG5cbiAgYWRkVGF4KCkge1xuICAgIHRoaXMudGF4QXJyYXkucHVzaCh0aGlzLmNyZWF0ZVRheEdyb3VwKCkpO1xuICB9XG5cbiAgcmVtb3ZlVGF4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnRheEFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLnJlY2FsY3VsYXRlKCk7XG4gIH1cblxuICBwYXRjaEZvcm0oKSB7XG4gICAgY29uc3QgaW52ID0gdGhpcy5pbnZvaWNlRGF0YTtcblxuICAgIHRoaXMuaW52b2ljZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBjb21wYW55TmFtZTogaW52LmNvbXBhbnlOYW1lIHx8ICcnLFxuICAgICAgY29tcGFueUFkZHJlc3M6IGludi5jb21wYW55QWRkcmVzcyB8fCAnJyxcbiAgICAgIEdTVE51bWJlcjogaW52LkdTVE51bWJlciB8fCAnJyxcbiAgICAgIFBsYWNlT2ZTdXBwbHk6IGludi5QbGFjZU9mU3VwcGx5IHx8ICcnLFxuICAgICAgZ3JvdXBOYW1lOiBpbnYuZ3JvdXBOYW1lIHx8ICcnLFxuICAgICAgZ3JvdXBJZDogaW52Lmdyb3VwSWQgfHwgJycsXG4gICAgICBzdG9yZXM6IGludi5zdG9yZXMgfHwgMCxcbiAgICAgIGJpbGxpbmdEYXRlOiB0aGlzLmZvcm1hdERhdGVGb3JJbnB1dChpbnYuYmlsbGluZ0RhdGUpLFxuICAgICAgZHVlRGF0ZTogdGhpcy5mb3JtYXREYXRlRm9ySW5wdXQoaW52LmR1ZURhdGUpLFxuICAgICAgY3VycmVuY3k6IGludi5jdXJyZW5jeSB8fCAnaW5yJyxcbiAgICAgIHN0YXR1czogaW52LnN0YXR1cyB8fCAncGVuZGluZycsXG4gICAgICBwYXltZW50U3RhdHVzOiBpbnYucGF5bWVudFN0YXR1cyB8fCAndW5wYWlkJyxcbiAgICAgIHB1cmNoYXNlT3JkZXJOdW1iZXI6IGludi5wdXJjaGFzZU9yZGVyTnVtYmVyIHx8ICcnLFxuICAgIH0pO1xuXG4gICAgLy8gUGF0Y2ggcHJvZHVjdHNcbiAgICBpZiAoaW52LnByb2R1Y3RzPy5sZW5ndGgpIHtcbiAgICAgIGludi5wcm9kdWN0cy5mb3JFYWNoKChwOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5wcm9kdWN0cy5wdXNoKHRoaXMuY3JlYXRlUHJvZHVjdEdyb3VwKHApKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFByb2R1Y3QoKTtcbiAgICB9XG5cbiAgICAvLyBQYXRjaCB0YXhcbiAgICBpZiAoaW52LnRheD8ubGVuZ3RoKSB7XG4gICAgICBpbnYudGF4LmZvckVhY2goKHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRheEFycmF5LnB1c2godGhpcy5jcmVhdGVUYXhHcm91cCh0KSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRUYXgoKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXREYXRlRm9ySW5wdXQoZGF0ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIWRhdGUpIHJldHVybiAnJztcbiAgICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZT8uJGRhdGUgfHwgZGF0ZSk7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuICcnO1xuICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcbiAgfVxuXG4gIG9uR3JvdXBDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHNlbGVjdGVkR3JvdXAgPSB0aGlzLmJpbGxpbmdHcm91cHMuZmluZChnID0+IGcuX2lkID09PSBldmVudC50YXJnZXQudmFsdWUpO1xuICAgIGlmIChzZWxlY3RlZEdyb3VwKSB7XG4gICAgICB0aGlzLmludm9pY2VGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBncm91cE5hbWU6IHNlbGVjdGVkR3JvdXAuZ3JvdXBOYW1lLFxuICAgICAgICBncm91cElkOiBzZWxlY3RlZEdyb3VwLl9pZCxcbiAgICAgICAgY29tcGFueU5hbWU6IHNlbGVjdGVkR3JvdXAucmVnaXN0ZXJlZENvbXBhbnlOYW1lIHx8ICcnLFxuICAgICAgICBjb21wYW55QWRkcmVzczogW3NlbGVjdGVkR3JvdXAuYWRkcmVzc0xpbmVPbmUsIHNlbGVjdGVkR3JvdXAuYWRkcmVzc0xpbmVUd28sIHNlbGVjdGVkR3JvdXAuY2l0eSwgc2VsZWN0ZWRHcm91cC5zdGF0ZSwgc2VsZWN0ZWRHcm91cC5jb3VudHJ5LCBzZWxlY3RlZEdyb3VwLnBpbkNvZGVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpLFxuICAgICAgICBHU1ROdW1iZXI6IHNlbGVjdGVkR3JvdXAuZ3N0IHx8ICcnLFxuICAgICAgICBQbGFjZU9mU3VwcGx5OiBzZWxlY3RlZEdyb3VwLnBsYWNlT2ZTdXBwbHkgfHwgJycsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZWNhbGN1bGF0ZSgpIHtcbiAgICBsZXQgc3VidG90YWwgPSAwO1xuICAgIHRoaXMucHJvZHVjdHMuY29udHJvbHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlQ291bnQgPSBncm91cC5nZXQoJ3N0b3JlQ291bnQnKT8udmFsdWUgfHwgMDtcbiAgICAgIGNvbnN0IHByaWNlID0gZ3JvdXAuZ2V0KCdwcmljZScpPy52YWx1ZSB8fCAwO1xuICAgICAgY29uc3QgYW1vdW50ID0gc3RvcmVDb3VudCAqIHByaWNlO1xuICAgICAgZ3JvdXAuZ2V0KCdhbW91bnQnKT8uc2V0VmFsdWUocGFyc2VGbG9hdChhbW91bnQudG9GaXhlZCgyKSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHN1YnRvdGFsICs9IGFtb3VudDtcbiAgICB9KTtcblxuICAgIHRoaXMudGF4QXJyYXkuY29udHJvbHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ3JvdXAuZ2V0KCd2YWx1ZScpPy52YWx1ZSB8fCAwO1xuICAgICAgY29uc3QgdGF4QW1vdW50ID0gKHN1YnRvdGFsICogdmFsdWUgLyAxMDApLnRvRml4ZWQoMik7XG4gICAgICBncm91cC5nZXQoJ3RheEFtb3VudCcpPy5zZXRWYWx1ZSh0YXhBbW91bnQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9KTtcblxuICAgIGxldCB0b3RhbFN0b3JlcyA9IDA7XG4gICAgdGhpcy5wcm9kdWN0cy5jb250cm9scy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgdG90YWxTdG9yZXMgKz0gZ3JvdXAuZ2V0KCdzdG9yZUNvdW50Jyk/LnZhbHVlIHx8IDA7XG4gICAgfSk7XG4gICAgdGhpcy5pbnZvaWNlRm9ybS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZSh0b3RhbFN0b3JlcywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuXG4gIGdldFN1YnRvdGFsKCk6IG51bWJlciB7XG4gICAgbGV0IHN1YnRvdGFsID0gMDtcbiAgICB0aGlzLnByb2R1Y3RzLmNvbnRyb2xzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICBzdWJ0b3RhbCArPSBncm91cC5nZXQoJ2Ftb3VudCcpPy52YWx1ZSB8fCAwO1xuICAgIH0pO1xuICAgIHJldHVybiBzdWJ0b3RhbDtcbiAgfVxuXG4gIGdldFRvdGFsVGF4KCk6IG51bWJlciB7XG4gICAgbGV0IHRvdGFsVGF4ID0gMDtcbiAgICB0aGlzLnRheEFycmF5LmNvbnRyb2xzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICB0b3RhbFRheCArPSBwYXJzZUZsb2F0KGdyb3VwLmdldCgndGF4QW1vdW50Jyk/LnZhbHVlIHx8ICcwJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvdGFsVGF4O1xuICB9XG5cbiAgZ2V0VG90YWxBbW91bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJ0b3RhbCgpICsgdGhpcy5nZXRUb3RhbFRheCgpO1xuICB9XG5cbiAgZ2V0Q3VycmVuY3lTeW1ib2woKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xGb3IodGhpcy5pbnZvaWNlRm9ybS5nZXQoJ2N1cnJlbmN5Jyk/LnZhbHVlKTtcbiAgfVxuXG4gIGdldEludm9pY2VDdXJyZW5jeVN5bWJvbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbEZvcih0aGlzLmludm9pY2VEYXRhPy5jdXJyZW5jeSk7XG4gIH1cblxuICBvblN1Ym1pdCgpIHtcbiAgICBpZiAodGhpcy5pbnZvaWNlRm9ybS5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmludm9pY2VGb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgIC8vIERlZmVyIHRvIG5leHQgdGljayBzbyBBbmd1bGFyIHJlbmRlcnMgdGhlIC5pcy1pbnZhbGlkIGNsYXNzZXNcbiAgICAgIC8vIGJlZm9yZSB3ZSBxdWVyeSB0aGUgRE9NIGZvciB0aGUgZmlyc3QgaW52YWxpZCBjb250cm9sIHRvIHNjcm9sbCB0by5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0ZpcnN0SW52YWxpZCgpLCAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5pbnZvaWNlRm9ybS5nZXRSYXdWYWx1ZSgpO1xuXG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgY29tcGFueU5hbWU6IGZvcm1WYWx1ZS5jb21wYW55TmFtZSxcbiAgICAgIGNvbXBhbnlBZGRyZXNzOiBmb3JtVmFsdWUuY29tcGFueUFkZHJlc3MsXG4gICAgICBHU1ROdW1iZXI6IGZvcm1WYWx1ZS5HU1ROdW1iZXIsXG4gICAgICBQbGFjZU9mU3VwcGx5OiBmb3JtVmFsdWUuUGxhY2VPZlN1cHBseSxcbiAgICAgIGdyb3VwTmFtZTogZm9ybVZhbHVlLmdyb3VwTmFtZSxcbiAgICAgIGdyb3VwSWQ6IGZvcm1WYWx1ZS5ncm91cElkLFxuICAgICAgc3RvcmVzOiBmb3JtVmFsdWUuc3RvcmVzLFxuICAgICAgYmlsbGluZ0RhdGU6IGZvcm1WYWx1ZS5iaWxsaW5nRGF0ZSxcbiAgICAgIGR1ZURhdGU6IGZvcm1WYWx1ZS5kdWVEYXRlLFxuICAgICAgY3VycmVuY3k6IGZvcm1WYWx1ZS5jdXJyZW5jeSxcbiAgICAgIHN0YXR1czogZm9ybVZhbHVlLnN0YXR1cyxcbiAgICAgIHBheW1lbnRTdGF0dXM6IGZvcm1WYWx1ZS5wYXltZW50U3RhdHVzLFxuICAgICAgYWR2YW5jZUludm9pY2U6IGZvcm1WYWx1ZS5hZHZhbmNlSW52b2ljZSxcbiAgICAgIGFkdmFuY2VQZXJpb2Q6IGZvcm1WYWx1ZS5hZHZhbmNlUGVyaW9kLFxuICAgICAgLy8gTWFwIGludm9pY2UgdG8gYSBwdXJjaGFzZSBvcmRlciAoc2VydmVyIGRlZHVjdHMgdGhlIFBPIGJhbGFuY2UpLlxuICAgICAgcHVyY2hhc2VPcmRlck51bWJlcjogZm9ybVZhbHVlLnB1cmNoYXNlT3JkZXJOdW1iZXIgfHwgdW5kZWZpbmVkLFxuICAgICAgcHJvZHVjdHM6IGZvcm1WYWx1ZS5wcm9kdWN0cyxcbiAgICAgIHRheDogZm9ybVZhbHVlLnRheCxcbiAgICAgIGFtb3VudDogdGhpcy5nZXRTdWJ0b3RhbCgpLFxuICAgICAgdG90YWxBbW91bnQ6IE1hdGgucm91bmQodGhpcy5nZXRUb3RhbEFtb3VudCgpKSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2VkaXQnKSB7XG4gICAgICBwYXlsb2FkLl9pZCA9IHRoaXMuaW52b2ljZURhdGEuX2lkO1xuICAgICAgcGF5bG9hZC5pbnZvaWNlID0gdGhpcy5pbnZvaWNlRGF0YS5pbnZvaWNlO1xuICAgICAgcGF5bG9hZC5jbGllbnRJZCA9IHRoaXMuaW52b2ljZURhdGEuY2xpZW50SWQ7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnVwZGF0ZUludm9pY2UocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoJ0ludm9pY2UgdXBkYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3VwZGF0ZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byB1cGRhdGUgaW52b2ljZScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2VkaXRFc3RpbWF0ZScpIHtcbiAgICAgIC8vIFVwZGF0ZSBhbiBleGlzdGluZyBlc3RpbWF0ZS4gSWRlbnRpdHkgZmllbGRzIChlc3RpbWF0ZSAjLCBjbGllbnRJZCxcbiAgICAgIC8vIGNyZWF0ZWREYXRlKSBhcmUgcHJlc2VydmVkIHNlcnZlci1zaWRlOyB3ZSBzZW5kIHRoZSBlZGl0YWJsZSBmb3JtIGRhdGEuXG4gICAgICBwYXlsb2FkLl9pZCA9IHRoaXMuaW52b2ljZURhdGEuX2lkO1xuICAgICAgcGF5bG9hZC5jbGllbnRJZCA9IHRoaXMuaW52b2ljZURhdGEuY2xpZW50SWQgfHwgdGhpcy5jbGllbnRJZDtcbiAgICAgIHBheWxvYWQucGVyaW9kID0gZm9ybVZhbHVlLmJpbGxpbmdEYXRlXG4gICAgICAgID8gbmV3IERhdGUoZm9ybVZhbHVlLmJpbGxpbmdEYXRlKS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnc2hvcnQnLCB5ZWFyOiAnbnVtZXJpYycgfSlcbiAgICAgICAgOiB0aGlzLmludm9pY2VEYXRhLnBlcmlvZDtcbiAgICAgIHBheWxvYWQudmFsaWRUaWxsID0gZm9ybVZhbHVlLmR1ZURhdGU7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnVwZGF0ZUVzdGltYXRlKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdFc3RpbWF0ZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgndXBkYXRlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byB1cGRhdGUgZXN0aW1hdGUnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdlc3RpbWF0ZScpIHtcbiAgICAgIC8vIFNhbWUgZm9ybSwgc2VwYXJhdGUgZG9jdW1lbnQ6IHBvc3QgdG8gdGhlIGVzdGltYXRlIEFQSSBzbyBpdCBsYW5kcyBpblxuICAgICAgLy8gdGhlIGVzdGltYXRlcyBjb2xsZWN0aW9uIHdpdGggYW4gRVNULeKApiBudW1iZXIgaW5zdGVhZCBvZiBhbiBpbnZvaWNlLlxuICAgICAgcGF5bG9hZC5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XG4gICAgICBwYXlsb2FkLnBlcmlvZCA9IGZvcm1WYWx1ZS5iaWxsaW5nRGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKGZvcm1WYWx1ZS5iaWxsaW5nRGF0ZSkudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnIH0pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgcGF5bG9hZC52YWxpZFRpbGwgPSBmb3JtVmFsdWUuZHVlRGF0ZTtcbiAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuY3JlYXRlRXN0aW1hdGUocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoJ0VzdGltYXRlIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ2NyZWF0ZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZ2VuZXJhdGUgZXN0aW1hdGUnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBheWxvYWQuY2xpZW50SWQgPSB0aGlzLmNsaWVudElkO1xuICAgICAgLy8gRmxhZyB0aGUgYmFja2VuZCB0byB0YWtlIHRoZSBcImN1c3RvbSBjcmVhdGVcIiBwYXRoIHRoYXQgcGVyc2lzdHMgd2hhdFxuICAgICAgLy8gdGhlIGZvcm0gYnVpbHQuIFRoZSBsZWdhY3kgL2NyZWF0ZUludm9pY2UgY29udHJhY3QgZXhwZWN0cyBlaXRoZXJcbiAgICAgIC8vIGFsbENsaWVudCtjbGllbnRMaXN0IG9yIGludm9pY2VJZDsgd2l0aG91dCB0aGlzIGZsYWcsIHRoZSBzZXJ2ZXJcbiAgICAgIC8vIHNpbGVudGx5IHJldHVybnMgMnh4IGFuZCB3cml0ZXMgbm90aGluZy5cbiAgICAgIHBheWxvYWQuY3VzdG9tSW52b2ljZSA9IHRydWU7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmNyZWF0ZUludm9pY2UocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoJ0ludm9pY2UgY3JlYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ2NyZWF0ZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBjcmVhdGUgaW52b2ljZSc7XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KG1zZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBDUkVESVQgTk9URSA9PT09PT09PT09PT09PT09PT09PT1cblxuICBpbml0Q3JlZGl0Tm90ZUZvcm0oKSB7XG4gICAgdGhpcy5jcmVkaXROb3RlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgYW1vdW50OiBbJyddLFxuICAgICAgcmV2aXNlZEFtb3VudDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGRpc2NvdW50OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heCgxMCldXSxcbiAgICB9KTtcblxuICAgIHRoaXMuY3JlZGl0Tm90ZUZvcm0uZ2V0KCdyZXZpc2VkQW1vdW50Jyk/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICBjb25zdCBhbW91bnQgPSB0aGlzLmNyZWRpdE5vdGVGb3JtLmdldCgnYW1vdW50Jyk/LnZhbHVlO1xuICAgICAgICBpZiAoYW1vdW50KSB7XG4gICAgICAgICAgY29uc3QgZGlzY291bnQgPSAoKGFtb3VudCAtIGUpIC8gYW1vdW50ICogMTAwKS50b0ZpeGVkKDIpO1xuICAgICAgICAgIHRoaXMuY3JlZGl0TW9yZVRoYW5UZW5QZXJjZW50ID0gcGFyc2VGbG9hdChkaXNjb3VudCkgPiAxMCB8fCBpc05hTihlKSB8fCBwYXJzZUZsb2F0KGRpc2NvdW50KSA8IDAgfHwgZSA8IDA7XG4gICAgICAgICAgdGhpcy5jcmVkaXROb3RlRm9ybS5nZXQoJ2Rpc2NvdW50Jyk/LnNldFZhbHVlKGRpc2NvdW50LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3JlZGl0Tm90ZUZvcm0uZ2V0KCdkaXNjb3VudCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLmNyZWRpdE1vcmVUaGFuVGVuUGVyY2VudCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5jcmVkaXROb3RlRm9ybS5nZXQoJ2Rpc2NvdW50Jyk/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICBjb25zdCBhbW91bnQgPSB0aGlzLmNyZWRpdE5vdGVGb3JtLmdldCgnYW1vdW50Jyk/LnZhbHVlO1xuICAgICAgICBjb25zdCByZXZpc2VkID0gcGFyc2VJbnQoKGFtb3VudCAqICgxIC0gZSAvIDEwMCkpLnRvRml4ZWQoKSk7XG4gICAgICAgIHRoaXMuY3JlZGl0TW9yZVRoYW5UZW5QZXJjZW50ID0gcGFyc2VGbG9hdChlKSA+IDEwIHx8IGlzTmFOKGUpIHx8IGUgPCAwIHx8IHJldmlzZWQgPCAwO1xuICAgICAgICB0aGlzLmNyZWRpdE5vdGVGb3JtLmdldCgncmV2aXNlZEFtb3VudCcpPy5zZXRWYWx1ZShyZXZpc2VkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNyZWRpdE5vdGVGb3JtLmdldCgncmV2aXNlZEFtb3VudCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLmNyZWRpdE1vcmVUaGFuVGVuUGVyY2VudCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwYXRjaENyZWRpdE5vdGVEZWZhdWx0cygpIHtcbiAgICBpZiAodGhpcy5pbnZvaWNlRGF0YSkge1xuICAgICAgdGhpcy5jcmVkaXROb3RlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgYW1vdW50OiB0aGlzLmludm9pY2VEYXRhLmFtb3VudCB8fCB0aGlzLmludm9pY2VEYXRhLnRvdGFsQW1vdW50IHx8IDAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhcHBseUNyZWRpdE5vdGUoKSB7XG4gICAgaWYgKHRoaXMuY3JlZGl0TW9yZVRoYW5UZW5QZXJjZW50KSByZXR1cm47XG4gICAgY29uc3QgcmVxdWVzdERhdGEgPSB7XG4gICAgICBpbnZvaWNlOiB0aGlzLmludm9pY2VEYXRhLmludm9pY2UsXG4gICAgICByZXZpc2VkQW1vdW50OiB0aGlzLmNyZWRpdE5vdGVGb3JtLmdldCgncmV2aXNlZEFtb3VudCcpPy52YWx1ZSxcbiAgICAgIGRpc2NvdW50OiB0aGlzLmNyZWRpdE5vdGVGb3JtLmdldCgnZGlzY291bnQnKT8udmFsdWUsXG4gICAgfTtcbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5hcHBseURpc2NvdW50KHJlcXVlc3REYXRhKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdDcmVkaXQgbm90ZSBhcHBsaWVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ2NyZWRpdEFwcGxpZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGFwcGx5IGNyZWRpdCBub3RlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbWl0U3BlY2lhbENoYXIoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGsgPSBldmVudC5jaGFyQ29kZTtcbiAgICByZXR1cm4gKGsgPT0gOCB8fCBrID09IDMyIHx8IChrID49IDQ4ICYmIGsgPD0gNTcpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBPTkUgVElNRSBGRUUgPT09PT09PT09PT09PT09PT09PT09XG5cbiAgaW5pdE9uZVRpbWVGZWVGb3JtKCkge1xuICAgIHRoaXMub25lVGltZUZlZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGFtb3VudDogWycnXSxcbiAgICAgIG9uZVRpbWVGZWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm9uZVRpbWVGZWVGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlT25lVGltZUZlZVRvdGFsKCk7XG4gICAgfSk7XG4gIH1cblxuICBwYXRjaE9uZVRpbWVGZWVEZWZhdWx0cygpIHtcbiAgICBpZiAodGhpcy5pbnZvaWNlRGF0YSkge1xuICAgICAgdGhpcy5vbmVUaW1lRmVlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgYW1vdW50OiB0aGlzLmludm9pY2VEYXRhLmFtb3VudCB8fCB0aGlzLmludm9pY2VEYXRhLnRvdGFsQW1vdW50IHx8IDAsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlT25lVGltZUZlZVRvdGFsKCk7XG4gICAgfVxuICB9XG5cbiAgY2FsY3VsYXRlT25lVGltZUZlZVRvdGFsKCkge1xuICAgIGNvbnN0IGFtb3VudCA9IHBhcnNlRmxvYXQodGhpcy5vbmVUaW1lRmVlRm9ybS5nZXQoJ2Ftb3VudCcpPy52YWx1ZSB8fCAnMCcpO1xuICAgIGNvbnN0IGZlZSA9IHBhcnNlRmxvYXQodGhpcy5vbmVUaW1lRmVlRm9ybS5nZXQoJ29uZVRpbWVGZWUnKT8udmFsdWUgfHwgJzAnKTtcbiAgICB0aGlzLm9uZVRpbWVGZWVUb3RhbCA9IHBhcnNlRmxvYXQoKGFtb3VudCArIGZlZSkudG9GaXhlZCgyKSk7XG4gIH1cblxuICBhcHBseU9uZVRpbWVGZWUoKSB7XG4gICAgY29uc3QgZmVlVmFsdWUgPSB0aGlzLm9uZVRpbWVGZWVGb3JtLmdldCgnb25lVGltZUZlZScpPy52YWx1ZTtcbiAgICBpZiAoIWZlZVZhbHVlKSByZXR1cm47XG4gICAgY29uc3QgcmVxdWVzdERhdGEgPSB7XG4gICAgICBvbmVUaW1lRmVlOiBmZWVWYWx1ZSxcbiAgICB9O1xuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLm9uZVRpbWVGZWUocmVxdWVzdERhdGEsIHRoaXMuaW52b2ljZURhdGEuaW52b2ljZSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnT25lIHRpbWUgZmVlIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnZmVlQXBwbGllZCcpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gYXBwbHkgb25lIHRpbWUgZmVlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgIDxkaXYgY2xhc3M9XCJwLTUgcHgtNiBwYi0wXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZyBtdC0yXCI+e3sgbW9kZSA9PT0gJ2VkaXQnID8gJ0ludm9pY2UnIDogKG1vZGUgPT09ICdlc3RpbWF0ZScgPyAnR2VuZXJhdGUgRXN0aW1hdGUnIDogKG1vZGUgPT09ICdlZGl0RXN0aW1hdGUnID8gJ0VkaXQgRXN0aW1hdGUnIDogJ0NyZWF0ZSBJbnZvaWNlJykpIH19XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2RlID09PSAnZWRpdCdcIiBjbGFzcz1cImludm9pY2UtbnVtYmVyXCI+e3sgaW52b2ljZURhdGE/Lmludm9pY2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2RlID09PSAnZWRpdEVzdGltYXRlJ1wiIGNsYXNzPVwiaW52b2ljZS1udW1iZXJcIj57eyBpbnZvaWNlRGF0YT8uZXN0aW1hdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgKGNsaWNrKT1cImFjdGl2ZU1vZGFsLmRpc21pc3MoKVwiPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFRhYnMgKG9ubHkgaW4gZWRpdCBtb2RlKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXIgbXQtM1wiICpuZ0lmPVwibW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGFiLWJ0blwiIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ2VkaXQnID8gJ3RhYi1hY3RpdmUnIDogJydcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRUYWIoJ2VkaXQnKVwiPkVkaXQgSW52b2ljZTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRhYi1idG5cIiBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdjcmVkaXROb3RlJyA/ICd0YWItYWN0aXZlJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0VGFiKCdjcmVkaXROb3RlJylcIj5DcmVkaXQgTm90ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRhYi1idG5cIiBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdvbmVUaW1lRmVlJyA/ICd0YWItYWN0aXZlJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0VGFiKCdvbmVUaW1lRmVlJylcIj5PbmUgVGltZSBGZWU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PSBFRElUIElOVk9JQ0UgVEFCID09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBtYi00XCIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdlZGl0JyB8fCBtb2RlICE9PSAnZWRpdCdcIj5cbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJpbnZvaWNlRm9ybVwiIGNsYXNzPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCI+XG5cbiAgICAgICAgICAgIDwhLS0gQ29tcGFueSBEZXRhaWxzIFNlY3Rpb24gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi10aXRsZSBtYi0zXCI+Q29tcGFueSBEZXRhaWxzPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgZm9ybS1ncm91cCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5Db21wYW55IE5hbWUgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGFueU5hbWVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJjb250cm9sSW52YWxpZCgnY29tcGFueU5hbWUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwibW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLW1zZ1wiICpuZ0lmPVwiY29udHJvbEludmFsaWQoJ2NvbXBhbnlOYW1lJylcIj5Db21wYW55IE5hbWUgaXMgcmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgZm9ybS1ncm91cCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5HU1QgTnVtYmVyPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiR1NUTnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbcmVhZG9ubHldPVwibW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBmb3JtLWdyb3VwIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPkNvbXBhbnkgQWRkcmVzczwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNvbXBhbnlBZGRyZXNzXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbcmVhZG9ubHldPVwibW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IGZvcm0tZ3JvdXAgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+UGxhY2Ugb2YgU3VwcGx5PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiUGxhY2VPZlN1cHBseVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3JlYWRvbmx5XT1cIm1vZGUgPT09ICdlZGl0J1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gQmlsbGluZyBHcm91cCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cImJpbGxpbmdHcm91cHMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBmb3JtLWdyb3VwIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPkJpbGxpbmcgR3JvdXAgPHNwYW4gKm5nSWY9XCJtb2RlICE9PSAnZWRpdCdcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwibW9kZSAhPT0gJ2VkaXQnXCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGZvcm1Db250cm9sTmFtZT1cImdyb3VwSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiY29udHJvbEludmFsaWQoJ2dyb3VwSWQnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uR3JvdXBDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdCBiaWxsaW5nIGdyb3VwPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBnIG9mIGJpbGxpbmdHcm91cHNcIiBbdmFsdWVdPVwiZy5faWRcIj57eyBnLmdyb3VwTmFtZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwibW9kZSA9PT0gJ2VkaXQnXCIgdHlwZT1cInRleHRcIiBbdmFsdWVdPVwiaW52b2ljZUZvcm0uZ2V0KCdncm91cE5hbWUnKT8udmFsdWUgfHwgJ0RlZmF1bHQgR3JvdXAnXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZWFkb25seT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtbXNnXCIgKm5nSWY9XCJjb250cm9sSW52YWxpZCgnZ3JvdXBJZCcpXCI+QmlsbGluZyBHcm91cCBpcyByZXF1aXJlZDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBmb3JtLWdyb3VwIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPkdyb3VwIE5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJncm91cE5hbWVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFtyZWFkb25seV09XCJtb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEludm9pY2UgRGV0YWlscyBTZWN0aW9uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tdGl0bGUgbWItMyBtdC0yXCI+SW52b2ljZSBEZXRhaWxzPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5CaWxsaW5nIERhdGUgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwiYmlsbGluZ0RhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJjb250cm9sSW52YWxpZCgnYmlsbGluZ0RhdGUnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1tc2dcIiAqbmdJZj1cImNvbnRyb2xJbnZhbGlkKCdiaWxsaW5nRGF0ZScpXCI+QmlsbGluZyBEYXRlIGlzIHJlcXVpcmVkPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGZvcm0tZ3JvdXAgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+RHVlIERhdGUgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwiZHVlRGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImNvbnRyb2xJbnZhbGlkKCdkdWVEYXRlJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtbXNnXCIgKm5nSWY9XCJjb250cm9sSW52YWxpZCgnZHVlRGF0ZScpXCI+RHVlIERhdGUgaXMgcmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5DdXJyZW5jeSA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBmb3JtQ29udHJvbE5hbWU9XCJjdXJyZW5jeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJjb250cm9sSW52YWxpZCgnY3VycmVuY3knKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYyBvZiBjdXJyZW5jeU9wdGlvbnNcIiBbdmFsdWVdPVwiY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGN1cnJlbmN5TGFiZWxzW2NdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLW1zZ1wiICpuZ0lmPVwiY29udHJvbEludmFsaWQoJ2N1cnJlbmN5JylcIj5DdXJyZW5jeSBpcyByZXF1aXJlZDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPk5vLiBvZiBTdG9yZXM8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cInN0b3Jlc1wiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVhZG9ubHk+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBQdXJjaGFzZSBPcmRlciBtYXBwaW5nIChvcHRpb25hbCkuIE1hcHBpbmcgZGVkdWN0cyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICBpbnZvaWNlJ3MgYW1vdW50IGZyb20gdGhlIHNlbGVjdGVkIFBPJ3MgcmVtYWluaW5nIGJhbGFuY2UuIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwIG1iLTNcIiAqbmdJZj1cIm1vZGUgIT09ICdlc3RpbWF0ZScgJiYgbW9kZSAhPT0gJ2VkaXRFc3RpbWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPlB1cmNoYXNlIE9yZGVyPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZm9ybUNvbnRyb2xOYW1lPVwicHVyY2hhc2VPcmRlck51bWJlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPk5vbmU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHBvIG9mIHB1cmNoYXNlT3JkZXJzXCIgW3ZhbHVlXT1cInBvLnB1cmNoYXNlT3JkZXJOdW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwby5wdXJjaGFzZU9yZGVyTnVtYmVyIH19ICh7eyBnZXRDdXJyZW5jeVN5bWJvbCgpIH19e3sgcG8ucmVtYWluaW5nQW1vdW50IHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJyB9fSBsZWZ0KVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gQWR2YW5jZSBJbnZvaWNlIChjcmVhdGUgb25seSk6IGJpbGwgc2V2ZXJhbCBmdXR1cmUgbW9udGhzIHVwZnJvbnQuXG4gICAgICAgICAgICAgICAgIEVhY2ggbW9udGggYmVjb21lcyBpdHMgb3duIGxpbmUgaXRlbSBzZXJ2ZXItc2lkZS4gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJtb2RlID09PSAnY3JlYXRlJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMSBkLWJsb2NrXCI+QWR2YW5jZSBJbnZvaWNlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2ggbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGlkPVwiYWR2YW5jZUludm9pY2VDcmVhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkdmFuY2VJbnZvaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiYWR2YW5jZUludm9pY2VDcmVhdGVcIj5CaWxsIGZ1dHVyZSBtb250aHMgdXBmcm9udDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwIG1iLTNcIiAqbmdJZj1cImludm9pY2VGb3JtLmdldCgnYWR2YW5jZUludm9pY2UnKT8udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPkFkdmFuY2UgZnJlcXVlbmN5PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZm9ybUNvbnRyb2xOYW1lPVwiYWR2YW5jZVBlcmlvZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0IG9mIGFkdmFuY2VQZXJpb2RPcHRpb25zXCIgW3ZhbHVlXT1cIm9wdC52YWx1ZVwiPnt7IG9wdC5sYWJlbCB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgIDwhLS0gUHJvZHVjdHMgU2VjdGlvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLXRpdGxlIG1iLTMgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlByb2R1Y3RzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeVwiIChjbGljayk9XCJhZGRQcm9kdWN0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFkZCBQcm9kdWN0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiAoY2xpY2spPVwiYWRkQ3VzdG9tUHJvZHVjdCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBZGQgQ3VzdG9tIFByb2R1Y3RcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJwcm9kdWN0c1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgcHJvZHVjdHMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9kdWN0LXJvdyBtYi0zIHAtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByb2R1Y3QtbGFiZWxcIj5Qcm9kdWN0IHt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLWRhbmdlclwiIChjbGljayk9XCJyZW1vdmVQcm9kdWN0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb2R1Y3RzLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGZvcm0tZ3JvdXAgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5Qcm9kdWN0IE5hbWUgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJhc2UtcHJpY2luZyBkcm9wZG93biAod2l0aCBhIFwiKyBDdXN0b20gcHJvZHVjdFwiIGNob2ljZSkgd2hlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdHMgZXhpc3QgYW5kIHRoaXMgcm93IGlzbid0IGN1c3RvbTsgb3RoZXJ3aXNlIGEgZnJlZS10ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIGlucHV0IGZvciBhIGN1c3RvbSBwcm9kdWN0LiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwiYXZhaWxhYmxlUHJvZHVjdHMubGVuZ3RoID4gMCAmJiAhcHJvZHVjdC5nZXQoJ2lzQ3VzdG9tJyk/LnZhbHVlXCIgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdE5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiYXJyYXlDb250cm9sSW52YWxpZCgncHJvZHVjdHMnLCBpLCAncHJvZHVjdE5hbWUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Qcm9kdWN0Q2hhbmdlKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgcHJvZHVjdDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBwIG9mIGF2YWlsYWJsZVByb2R1Y3RzXCIgW3ZhbHVlXT1cInAucHJvZHVjdE5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdFByb2R1Y3ROYW1lKHAucHJvZHVjdE5hbWUpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiX19jdXN0b21fX1wiPisgQ3VzdG9tIHByb2R1Y3Q8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJhdmFpbGFibGVQcm9kdWN0cy5sZW5ndGggPT09IDAgfHwgcHJvZHVjdC5nZXQoJ2lzQ3VzdG9tJyk/LnZhbHVlXCIgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiYXJyYXlDb250cm9sSW52YWxpZCgncHJvZHVjdHMnLCBpLCAncHJvZHVjdE5hbWUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBDdXN0b20gU2VydmljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLW1zZ1wiICpuZ0lmPVwiYXJyYXlDb250cm9sSW52YWxpZCgncHJvZHVjdHMnLCBpLCAncHJvZHVjdE5hbWUnKVwiPlByb2R1Y3QgTmFtZSBpcyByZXF1aXJlZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgZm9ybS1ncm91cCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPkRlc2NyaXB0aW9uPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIEN1c3RvbWVyIEZvb3RmYWxsIEFuYWx5dGljc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgZm9ybS1ncm91cCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPk1vbnRoPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJtb250aFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIE1hciAyMDI2XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+SFNOL1NBQzwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiSHNuTnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGZvcm0tZ3JvdXAgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5RdWFudGl0eTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJzdG9yZUNvdW50XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwicmVjYWxjdWxhdGUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPlJhdGUvUHJpY2UgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cInByaWNlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJhcnJheUNvbnRyb2xJbnZhbGlkKCdwcm9kdWN0cycsIGksICdwcmljZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInJlY2FsY3VsYXRlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1tc2dcIiAqbmdJZj1cImFycmF5Q29udHJvbEludmFsaWQoJ3Byb2R1Y3RzJywgaSwgJ3ByaWNlJylcIj5SYXRlL1ByaWNlIGlzIHJlcXVpcmVkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+QW1vdW50PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cImFtb3VudFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVhZG9ubHk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+UGVyaW9kPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBmb3JtQ29udHJvbE5hbWU9XCJwZXJpb2RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1vbnRobHlcIj5Nb250aGx5PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJxdWFydGVybHlcIj5RdWFydGVybHk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImhhbGZ5ZWFybHlcIj5IYWxmLXllYXJseTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwieWVhcmx5XCI+WWVhcmx5PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBUYXggU2VjdGlvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLXRpdGxlIG1iLTMgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlRheDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiAoY2xpY2spPVwiYWRkVGF4KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICsgQWRkIFRheFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJ0YXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB0IG9mIHRheEFycmF5LmNvbnRyb2xzOyBsZXQgaiA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwialwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGF4LXJvdyBtYi0zIHAtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByb2R1Y3QtbGFiZWxcIj5UYXgge3sgaiArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtZGFuZ2VyXCIgKGNsaWNrKT1cInJlbW92ZVRheChqKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0YXhBcnJheS5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+VGF4IFR5cGUgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiYXJyYXlDb250cm9sSW52YWxpZCgndGF4JywgaiwgJ3R5cGUnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB0dCBvZiB0YXhUeXBlc1wiIFt2YWx1ZV09XCJ0dFwiPnt7IHR0IH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtbXNnXCIgKm5nSWY9XCJhcnJheUNvbnRyb2xJbnZhbGlkKCd0YXgnLCBqLCAndHlwZScpXCI+VGF4IFR5cGUgaXMgcmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGZvcm0tZ3JvdXAgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5UYXggJSA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImFycmF5Q29udHJvbEludmFsaWQoJ3RheCcsIGosICd2YWx1ZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInJlY2FsY3VsYXRlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1tc2dcIiAqbmdJZj1cImFycmF5Q29udHJvbEludmFsaWQoJ3RheCcsIGosICd2YWx1ZScpXCI+VGF4ICUgaXMgcmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGZvcm0tZ3JvdXAgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5UYXggQW1vdW50PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YXhBbW91bnRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlYWRvbmx5PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPkN1cnJlbmN5IFN5bWJvbDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiY3VycmVuY3lcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gU3VtbWFyeSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXNlY3Rpb24gcC0zIG10LTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+U3VidG90YWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPnt7IGdldEN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZ2V0U3VidG90YWwoKSB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlRvdGFsIFRheDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+e3sgZ2V0Q3VycmVuY3lTeW1ib2woKSB9fSB7eyBnZXRUb3RhbFRheCgpIHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHN1bW1hcnktdG90YWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LWxhYmVsLWJvbGRcIj5Ub3RhbCBBbW91bnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS12YWx1ZS1ib2xkXCI+e3sgZ2V0Q3VycmVuY3lTeW1ib2woKSB9fSB7eyBnZXRUb3RhbEFtb3VudCgpIHwgbnVtYmVyOicxLjItMic6J2VuLUlOJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBBY3Rpb25zIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBtdC00XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImFjdGl2ZU1vZGFsLmRpc21pc3MoKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLW91dGxpbmUgYnRuIGNhbmNlbCBtZS00IHctNTBcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwic2F2aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcHgtNCB3LTUwXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFzYXZpbmdcIiBjbGFzcz1cInN1Ym1pdFwiPnt7IG1vZGUgPT09ICdlZGl0JyA/ICdVcGRhdGUgSW52b2ljZScgOiAobW9kZSA9PT0gJ2VzdGltYXRlJyA/ICdHZW5lcmF0ZSBFc3RpbWF0ZScgOiAobW9kZSA9PT0gJ2VkaXRFc3RpbWF0ZScgPyAnVXBkYXRlIEVzdGltYXRlJyA6ICdDcmVhdGUgSW52b2ljZScpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2F2aW5nXCIgY2xhc3M9XCJzdWJtaXRcIj5TYXZpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gQ1JFRElUIE5PVEUgVEFCID09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBtYi00XCIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdjcmVkaXROb3RlJyAmJiBtb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJjcmVkaXROb3RlRm9ybVwiIGNsYXNzPVwiZm9ybVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnR0ZXh0IG1iLTNcIj5cbiAgICAgICAgICAgICAgICBBcHBseSBhIGNyZWRpdCBub3RlIC8gZGlzY291bnQgdG8gdGhpcyBpbnZvaWNlLiBNYXhpbXVtIDEwJSBkaXNjb3VudCBhbGxvd2VkLlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTJcIj5JbnZvaWNlIElEPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdmFsdWVdPVwiaW52b2ljZURhdGE/Lmludm9pY2VcIiByZWFkb25seT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMlwiPlRvdGFsIEFtb3VudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2xsYXItc2lnblwiPnt7IGdldEludm9pY2VDdXJyZW5jeVN5bWJvbCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImFtb3VudFwiIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHkgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYW1vdW50LWlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMlwiPlJldmlzZWQgQW1vdW50PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9sbGFyLXNpZ25cIj57eyBnZXRJbnZvaWNlQ3VycmVuY3lTeW1ib2woKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJyZXZpc2VkQW1vdW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXByZXNzKT1cIm9taXRTcGVjaWFsQ2hhcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYW1vdW50LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY3JlZGl0TW9yZVRoYW5UZW5QZXJjZW50ID8gJ2Vycm9yaW5wdXQnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWljb25cIiAqbmdJZj1cImNyZWRpdE1vcmVUaGFuVGVuUGVyY2VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXBfY25fZXJyKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy45OTk2NyA1LjMzMzAxVjcuOTk5NjdNNy45OTk2NyAxMC42NjYzSDguMDA2MzRNMTQuNjY2MyA3Ljk5OTY3QzE0LjY2NjMgMTEuNjgxNiAxMS42ODE2IDE0LjY2NjMgNy45OTk2NyAxNC42NjYzQzQuMzE3NzggMTQuNjY2MyAxLjMzMzAxIDExLjY4MTYgMS4zMzMwMSA3Ljk5OTY3QzEuMzMzMDEgNC4zMTc3OCA0LjMxNzc4IDEuMzMzMDEgNy45OTk2NyAxLjMzMzAxQzExLjY4MTYgMS4zMzMwMSAxNC42NjYzIDQuMzE3NzggMTQuNjY2MyA3Ljk5OTY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNGMDQ0MzhcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXBfY25fZXJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJjcmVkaXRNb3JlVGhhblRlblBlcmNlbnQgPyAndGV4dC1kYW5nZXInIDogJ2NvbnRlbnR0ZXh0J1wiIGNsYXNzPVwic21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIE1vcmUgdGhhbiAxMCUgY2FuJ3QgYmUgcmV2aXNlZCBmcm9tIHRvdGFsIGFtb3VudFxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0yXCI+RGlzY291bnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGlzY291bnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwib21pdFNwZWNpYWxDaGFyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNyZWRpdE1vcmVUaGFuVGVuUGVyY2VudCA/ICdlcnJvcmlucHV0JyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1pY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMi42NjcgMy4zMzM2NkwzLjMzMzY2IDEyLjY2N002LjAwMDMzIDQuMzMzNjZDNi4wMDAzMyA1LjI1NDEzIDUuMjU0MTMgNi4wMDAzMyA0LjMzMzY2IDYuMDAwMzNDMy40MTMxOCA2LjAwMDMzIDIuNjY2OTkgNS4yNTQxMyAyLjY2Njk5IDQuMzMzNjZDMi42NjY5OSAzLjQxMzE4IDMuNDEzMTggMi42NjY5OSA0LjMzMzY2IDIuNjY2OTlDNS4yNTQxMyAyLjY2Njk5IDYuMDAwMzMgMy40MTMxOCA2LjAwMDMzIDQuMzMzNjZaTTEzLjMzMzcgMTEuNjY3QzEzLjMzMzcgMTIuNTg3NSAxMi41ODc1IDEzLjMzMzcgMTEuNjY3IDEzLjMzMzdDMTAuNzQ2NSAxMy4zMzM3IDEwLjAwMDMgMTIuNTg3NSAxMC4wMDAzIDExLjY2N0MxMC4wMDAzIDEwLjc0NjUgMTAuNzQ2NSAxMC4wMDAzIDExLjY2NyAxMC4wMDAzQzEyLjU4NzUgMTAuMDAwMyAxMy4zMzM3IDEwLjc0NjUgMTMuMzMzNyAxMS42NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwiY3JlZGl0TW9yZVRoYW5UZW5QZXJjZW50ID8gJyNGMDQ0MzgnIDogJyM5OEEyQjMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImNyZWRpdE1vcmVUaGFuVGVuUGVyY2VudCA/ICd0ZXh0LWRhbmdlcicgOiAnY29udGVudHRleHQnXCIgY2xhc3M9XCJzbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgSW4gcGVyY2VudGFnZVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBtdC01XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImFjdGl2ZU1vZGFsLmRpc21pc3MoKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLW91dGxpbmUgYnRuIGNhbmNlbCBtZS00IHctNTBcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJjcmVkaXRNb3JlVGhhblRlblBlcmNlbnQgfHwgc2F2aW5nXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhcHBseUNyZWRpdE5vdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHB4LTQgdy01MFwiIHN0eWxlPVwid2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2F2aW5nXCI+QXBwbHkgQ3JlZGl0IE5vdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2F2aW5nXCI+QXBwbHlpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gT05FIFRJTUUgRkVFIFRBQiA9PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgbWItNFwiICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnb25lVGltZUZlZScgJiYgbW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwib25lVGltZUZlZUZvcm1cIiBjbGFzcz1cImZvcm1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50dGV4dCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgQWRkIGEgb25lLXRpbWUgZmVlIChlLmcuIGluc3RhbGxhdGlvbikgdG8gdGhpcyBpbnZvaWNlLlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTJcIj5JbnZvaWNlIElEPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdmFsdWVdPVwiaW52b2ljZURhdGE/Lmludm9pY2VcIiByZWFkb25seT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMlwiPkN1cnJlbnQgSW52b2ljZSBBbW91bnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9sbGFyLXNpZ25cIj57eyBnZXRJbnZvaWNlQ3VycmVuY3lTeW1ib2woKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJhbW91bnRcIiB0eXBlPVwidGV4dFwiIHJlYWRvbmx5IGNsYXNzPVwiZm9ybS1jb250cm9sIGFtb3VudC1pbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTJcIj5PbmUgVGltZSBGZWUgKEluc3RhbGxhdGlvbik8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2xsYXItc2lnblwiPnt7IGdldEludm9pY2VDdXJyZW5jeVN5bWJvbCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIm9uZVRpbWVGZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwib21pdFNwZWNpYWxDaGFyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBhbW91bnQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGZlZSBhbW91bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1zdGFjayBtdC0zIGZlZS1zdW1tYXJ5IHAtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlNlbGVjdGVkIEludm9pY2UgQW1vdW50ICsgT25lIFRpbWUgRmVlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWUtYm9sZFwiPnt7IGdldEludm9pY2VDdXJyZW5jeVN5bWJvbCgpIH19e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVUaW1lRmVlVG90YWwgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG10LTVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWN0aXZlTW9kYWwuZGlzbWlzcygpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gY2FuY2VsIG1lLTQgdy01MFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cInNhdmluZyB8fCAhb25lVGltZUZlZUZvcm0uZ2V0KCdvbmVUaW1lRmVlJyk/LnZhbHVlXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseU9uZVRpbWVGZWUoKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHB4LTQgdy01MFwiIHN0eWxlPVwid2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2F2aW5nXCI+QXBwbHkgRmVlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNhdmluZ1wiPkFwcGx5aW5nLi4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
624
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC1pbnZvaWNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1tYW5hZ2UtYmlsbGluZy9lZGl0LWludm9pY2UvZWRpdC1pbnZvaWNlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1tYW5hZ2UtYmlsbGluZy9lZGl0LWludm9pY2UvZWRpdC1pbnZvaWNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFdkYsT0FBTyxFQUFxQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7OztBQVMxQyxNQUFNLE9BQU8sb0JBQW9CO0lBaUR0QjtJQUNDO0lBQ0E7SUFDQTtJQUNBO0lBcERELFdBQVcsQ0FBTTtJQUMxQiwwRUFBMEU7SUFDMUUsOERBQThEO0lBQ3JELElBQUksR0FBb0QsTUFBTSxDQUFDO0lBQy9ELFFBQVEsR0FBVyxFQUFFLENBQUM7SUFDdEIsYUFBYSxHQUFVLEVBQUUsQ0FBQztJQUVuQyxXQUFXLENBQWE7SUFDUCxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUMxQyxNQUFNLEdBQVksS0FBSyxDQUFDO0lBRXhCLHVDQUF1QztJQUN2QyxTQUFTLEdBQVcsTUFBTSxDQUFDO0lBRTNCLFFBQVEsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsZUFBZSxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFB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QUcsRUFBRTtvQkFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsbUNBQW1DLENBQUMsQ0FBQztvQkFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ3RDO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLDhCQUE4QixDQUFDLENBQUM7WUFDM0QsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBcm9CVSxvQkFBb0I7NEZBQXBCLG9CQUFvQixvS0NaakMsNGg0QkFxY007OzRGRHpiTyxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usa0JBQWtCO3FNQUtuQixXQUFXO3NCQUFuQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUFycmF5LCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCaWxsaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2JpbGxpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWVkaXQtaW52b2ljZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0LWludm9pY2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZWRpdC1pbnZvaWNlLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBFZGl0SW52b2ljZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgaW52b2ljZURhdGE6IGFueTtcbiAgLy8gJ2VzdGltYXRlJyByZXVzZXMgdGhlIHdob2xlIGNyZWF0ZSBmb3JtIGJ1dCBzdWJtaXRzIHRvIHRoZSBlc3RpbWF0ZSBBUElcbiAgLy8gYW5kIHdyaXRlcyB0byB0aGUgZXN0aW1hdGVzIGNvbGxlY3Rpb24gaW5zdGVhZCBvZiBpbnZvaWNlcy5cbiAgQElucHV0KCkgbW9kZTogJ2VkaXQnIHwgJ2NyZWF0ZScgfCAnZXN0aW1hdGUnIHwgJ2VkaXRFc3RpbWF0ZScgPSAnZWRpdCc7XG4gIEBJbnB1dCgpIGNsaWVudElkOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgYmlsbGluZ0dyb3VwczogYW55W10gPSBbXTtcblxuICBpbnZvaWNlRm9ybSE6IEZvcm1Hcm91cDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG4gIHNhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFRhYnM6IGVkaXQgfCBjcmVkaXROb3RlIHwgb25lVGltZUZlZVxuICBhY3RpdmVUYWI6IHN0cmluZyA9ICdlZGl0JztcblxuICB0YXhUeXBlcyA9IFsnSUdTVCcsICdDR1NUJywgJ1NHU1QnXTtcbiAgY3VycmVuY3lPcHRpb25zID0gWydpbnInLCAnZG9sbGFyJywgJ3NpbmdhcG9yZWRvbGxhcicsICdldXJvJywgJ2FlZCddO1xuICBjdXJyZW5jeUxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBpbnI6ICdJTlIgKOKCuSknLFxuICAgIGRvbGxhcjogJ1VTRCAoJCknLFxuICAgIHNpbmdhcG9yZWRvbGxhcjogJ1NHRCAoUyQpJyxcbiAgICBldXJvOiAnRVVSICjigqwpJyxcbiAgICBhZWQ6ICdBRUQgKEFFRCknXG4gIH07XG4gIC8vIFN5bWJvbCBtYXAgbWlycm9ycyB0aGUgYmFja2VuZCdzIENVUlJFTkNZX1NZTUJPTFMgaW4gdXRpbHMvY3VycmVuY3kuanMgc29cbiAgLy8gdGhlIG1vZGFsLCBpbnZvaWNlIGxpc3QsIGNyZWRpdC1ub3RlIGFuZCBvbmUtdGltZS1mZWUgcG9wdXBzIGFsbCByZW5kZXJcbiAgLy8gdGhlIHNhbWUgc3ltYm9sIHRoZSBQREYvZW1haWwgdXNlcy5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW5jeVN5bWJvbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaW5yOiAn4oK5JyxcbiAgICBkb2xsYXI6ICckJyxcbiAgICBzaW5nYXBvcmVkb2xsYXI6ICdTJCcsXG4gICAgZXVybzogJ+KCrCcsXG4gICAgYWVkOiAnQUVEJyxcbiAgfTtcbiAgc3RhdHVzT3B0aW9ucyA9IFsncGVuZGluZycsICdhcHByb3ZlZCddO1xuICBwYXltZW50U3RhdHVzT3B0aW9ucyA9IFsndW5wYWlkJywgJ3BhaWQnXTtcblxuICAvLyBDcmVkaXQgTm90ZVxuICBjcmVkaXROb3RlRm9ybSE6IEZvcm1Hcm91cDtcbiAgY3JlZGl0TW9yZVRoYW5UZW5QZXJjZW50OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gUHJvZHVjdHMgZnJvbSBiYXNlIHByaWNpbmdcbiAgYXZhaWxhYmxlUHJvZHVjdHM6IGFueVtdID0gW107XG5cbiAgLy8gT25lIFRpbWUgRmVlXG4gIG9uZVRpbWVGZWVGb3JtITogRm9ybUdyb3VwO1xuICBvbmVUaW1lRmVlVG90YWw6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCxcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGJpbGxpbmdTZXJ2aWNlOiBCaWxsaW5nU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgICB0aGlzLmxvYWRDbGllbnRQcm9kdWN0cygpO1xuICAgIHRoaXMubG9hZFB1cmNoYXNlT3JkZXJzKCk7XG4gICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgIHRoaXMuaW5pdENyZWRpdE5vdGVGb3JtKCk7XG4gICAgdGhpcy5pbml0T25lVGltZUZlZUZvcm0oKTtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZWRpdCcgJiYgdGhpcy5pbnZvaWNlRGF0YSkge1xuICAgICAgdGhpcy5wYXRjaEZvcm0oKTtcbiAgICAgIHRoaXMucGF0Y2hDcmVkaXROb3RlRGVmYXVsdHMoKTtcbiAgICAgIHRoaXMucGF0Y2hPbmVUaW1lRmVlRGVmYXVsdHMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2VkaXRFc3RpbWF0ZScgJiYgdGhpcy5pbnZvaWNlRGF0YSkge1xuICAgICAgLy8gRWRpdGluZyBhbiBlc3RpbWF0ZSByZXVzZXMgdGhlIHNhbWUgZm9ybSBmaWVsZHM7IHRoZSBlc3RpbWF0ZSBkb2N1bWVudFxuICAgICAgLy8gc2hhcmVzIHRoZSBpbnZvaWNlIHNoYXBlIChjb21wYW55TmFtZSwgcHJvZHVjdHMsIHRheCwgc3RvcmVzLCDigKYpLlxuICAgICAgdGhpcy5wYXRjaEZvcm0oKTtcbiAgICB9XG4gIH1cblxuICBsb2FkQ2xpZW50UHJvZHVjdHMoKSB7XG4gICAgY29uc3QgY0lkID0gdGhpcy5jbGllbnRJZCB8fCB0aGlzLmludm9pY2VEYXRhPy5jbGllbnRJZDtcbiAgICBpZiAoY0lkKSB7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldENsaWVudEJhc2VQcmljaW5nKGNJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlUHJvZHVjdHMgPSByZXM/LmRhdGEgfHwgW107XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hdmFpbGFibGVQcm9kdWN0cyA9IFtdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvblByb2R1Y3RDaGFuZ2UoaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHByb2R1Y3RHcm91cCA9IHRoaXMucHJvZHVjdHMuYXQoaW5kZXgpO1xuICAgIGNvbnN0IHNlbGVjdGVkTmFtZSA9IHByb2R1Y3RHcm91cC5nZXQoJ3Byb2R1Y3ROYW1lJyk/LnZhbHVlO1xuICAgIC8vIFwiKyBDdXN0b20gcHJvZHVjdFwiIHBpY2tlZCBmcm9tIHRoZSBkcm9wZG93biDigJQgc3dpdGNoIHRoaXMgcm93IHRvIGZyZWUtdGV4dFxuICAgIC8vIGVudHJ5IChjdXN0b20gbmFtZSArIHByaWNlKSwgY2xlYXJpbmcgdGhlIGJhc2UtcHJpY2luZyBzZWxlY3Rpb24uXG4gICAgaWYgKHNlbGVjdGVkTmFtZSA9PT0gJ19fY3VzdG9tX18nKSB7XG4gICAgICBwcm9kdWN0R3JvdXAucGF0Y2hWYWx1ZSh7IGlzQ3VzdG9tOiB0cnVlLCBwcm9kdWN0TmFtZTogJycsIHByaWNlOiAwLCBkZXNjcmlwdGlvbjogJycgfSk7XG4gICAgICB0aGlzLnJlY2FsY3VsYXRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHByb2R1Y3RHcm91cC5nZXQoJ2lzQ3VzdG9tJyk/LnNldFZhbHVlKGZhbHNlKTtcbiAgICBjb25zdCBwcm9kdWN0ID0gdGhpcy5hdmFpbGFibGVQcm9kdWN0cy5maW5kKHAgPT4gcC5wcm9kdWN0TmFtZSA9PT0gc2VsZWN0ZWROYW1lKTtcbiAgICBpZiAocHJvZHVjdCkge1xuICAgICAgcHJvZHVjdEdyb3VwLmdldCgncHJpY2UnKT8uc2V0VmFsdWUocHJvZHVjdC5wcmljZSk7XG4gICAgICAvLyBTZXQgZGVzY3JpcHRpb24gYmFzZWQgb24gcHJvZHVjdCBuYW1lXG4gICAgICBjb25zdCBkZXNjcmlwdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIHRhbmdvVHJhZmZpYzogJ0N1c3RvbWVyIEZvb3RmYWxsIEFuYWx5dGljcycsXG4gICAgICAgIHRhbmdvWm9uZTogJ1Byb2R1Y3QgY2F0ZWdvcnkvc2VjdGlvbiBhbmFseXRpY3MnLFxuICAgICAgICB0YW5nb1RyYXg6ICdDdXN0b21lciBKb3VybmV5IEFuYWx5dGljcycsXG4gICAgICAgIHByaW9yaXR5U3VwcG9ydDogJ1ByaW9yaXR5IFN1cHBvcnQnLFxuICAgICAgfTtcbiAgICAgIHByb2R1Y3RHcm91cC5nZXQoJ2Rlc2NyaXB0aW9uJyk/LnNldFZhbHVlKGRlc2NyaXB0aW9uc1tzZWxlY3RlZE5hbWVdIHx8ICcnKTtcbiAgICAgIHRoaXMucmVjYWxjdWxhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYSBibGFuayBwcm9kdWN0IHJvdyBhbHJlYWR5IGluIGN1c3RvbSAoZnJlZS10ZXh0KSBtb2RlLCByZWdhcmRsZXNzIG9mXG4gIC8vIHdoZXRoZXIgYmFzZS1wcmljaW5nIHByb2R1Y3RzIGV4aXN0LlxuICBhZGRDdXN0b21Qcm9kdWN0KCkge1xuICAgIHRoaXMucHJvZHVjdHMucHVzaCh0aGlzLmNyZWF0ZVByb2R1Y3RHcm91cCh7IGlzQ3VzdG9tOiB0cnVlIH0pKTtcbiAgfVxuXG4gIGZvcm1hdFByb2R1Y3ROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gICAgLy8gQ29udmVydCBjYW1lbENhc2UgdG8gVGl0bGUgQ2FzZSB3aXRoIHNwYWNlczogdGFuZ29UcmFmZmljIC0+IFRhbmdvIFRyYWZmaWNcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEgJDInKVxuICAgICAgLnJlcGxhY2UoL14uLywgKHN0cikgPT4gc3RyLnRvVXBwZXJDYXNlKCkpO1xuICB9XG5cbiAgbG9hZEJpbGxpbmdHcm91cHMoKSB7XG4gICAgY29uc3QgY0lkID0gdGhpcy5jbGllbnRJZCB8fCB0aGlzLmludm9pY2VEYXRhPy5jbGllbnRJZDtcbiAgICBpZiAoY0lkKSB7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEFsbEJpbGxpbmdHcm91cHMoY0lkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzID0gcmVzPy5kYXRhIHx8IFtdO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3VwcyA9IFtdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgc2V0VGFiKHRhYjogc3RyaW5nKSB7XG4gICAgdGhpcy5hY3RpdmVUYWIgPSB0YWI7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRURJVCBJTlZPSUNFID09PT09PT09PT09PT09PT09PT09PVxuXG4gIGluaXRGb3JtKCkge1xuICAgIHRoaXMuaW52b2ljZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNvbXBhbnlOYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgY29tcGFueUFkZHJlc3M6IFsnJ10sXG4gICAgICBHU1ROdW1iZXI6IFsnJ10sXG4gICAgICBQbGFjZU9mU3VwcGx5OiBbJyddLFxuICAgICAgZ3JvdXBOYW1lOiBbJyddLFxuICAgICAgLy8gQmlsbGluZyBHcm91cCBpcyByZXF1aXJlZCB3aGVuIGNyZWF0aW5nIOKAlCB0aGUgcmVzdCBvZiB0aGUgY29tcGFueVxuICAgICAgLy8gZmllbGRzIGF1dG8tZmlsbCBmcm9tIHRoZSBzZWxlY3RlZCBncm91cC5cbiAgICAgIGdyb3VwSWQ6IFsnJywgdGhpcy5tb2RlICE9PSAnZWRpdCcgPyBWYWxpZGF0b3JzLnJlcXVpcmVkIDogW11dLFxuICAgICAgc3RvcmVzOiBbMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDApXV0sXG4gICAgICBiaWxsaW5nRGF0ZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGR1ZURhdGU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBjdXJyZW5jeTogWydpbnInLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHN0YXR1czogWydwZW5kaW5nJ10sXG4gICAgICBwYXltZW50U3RhdHVzOiBbJ3VucGFpZCddLFxuICAgICAgLy8gQWR2YW5jZSBpbnZvaWNlOiB3aGVuIG9uLCB0aGUgY2hvc2VuIGZyZXF1ZW5jeSBiaWxscyBzZXZlcmFsIGZ1dHVyZVxuICAgICAgLy8gbW9udGhzIHVwZnJvbnQgKGVhY2ggbW9udGggYmVjb21lcyBpdHMgb3duIGxpbmUgaXRlbSBzZXJ2ZXItc2lkZSkuXG4gICAgICBhZHZhbmNlSW52b2ljZTogW2ZhbHNlXSxcbiAgICAgIGFkdmFuY2VQZXJpb2Q6IFsnbW9udGhseSddLFxuICAgICAgLy8gT3B0aW9uYWw6IG1hcCB0aGlzIGludm9pY2UgdG8gYSBwdXJjaGFzZSBvcmRlciAocmVkdWNlcyB0aGUgUE8gYmFsYW5jZSkuXG4gICAgICBwdXJjaGFzZU9yZGVyTnVtYmVyOiBbJyddLFxuICAgICAgcHJvZHVjdHM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgICAgdGF4OiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFB1cmNoYXNlIG9yZGVycyBhdmFpbGFibGUgZm9yIHRoaXMgY2xpZW50IChmb3IgdGhlIFBPIHBpY2tlcikuXG4gIHB1cmNoYXNlT3JkZXJzOiBhbnlbXSA9IFtdO1xuXG4gIGxvYWRQdXJjaGFzZU9yZGVycygpIHtcbiAgICBjb25zdCBjSWQgPSB0aGlzLmNsaWVudElkIHx8IHRoaXMuaW52b2ljZURhdGE/LmNsaWVudElkO1xuICAgIGlmICghY0lkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0UHVyY2hhc2VPcmRlcnMoY0lkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnB1cmNoYXNlT3JkZXJzID0gcmVzPy5kYXRhPy5wdXJjaGFzZU9yZGVycyB8fCBbXTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnB1cmNoYXNlT3JkZXJzID0gW107XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYWR2YW5jZVBlcmlvZE9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ21vbnRobHknLCBsYWJlbDogJ01vbnRobHkgKG5leHQgbW9udGgpJyB9LFxuICAgIHsgdmFsdWU6ICdxdWFydGVybHknLCBsYWJlbDogJ1F1YXJ0ZXJseSAobmV4dCAzIG1vbnRocyknIH0sXG4gICAgeyB2YWx1ZTogJ2hhbGZ5ZWFybHknLCBsYWJlbDogJ0hhbGYteWVhcmx5IChuZXh0IDYgbW9udGhzKScgfSxcbiAgICB7IHZhbHVlOiAneWVhcmx5JywgbGFiZWw6ICdZZWFybHkgKG5leHQgMTIgbW9udGhzKScgfSxcbiAgXTtcblxuICAvLyBUZW1wbGF0ZSBoZWxwZXJzOiBzdXJmYWNlIFwidG91Y2hlZCAmJiBpbnZhbGlkXCIgc28gdGhlIEhUTUwgY2FuIGhpZ2hsaWdodFxuICAvLyB0aGUgZmllbGQgYW5kIHJlbmRlciBhbiBpbmxpbmUgZXJyb3IuIERlZmVuc2l2ZSBhZ2FpbnN0IHRoZSBmb3JtIG5vdCB5ZXRcbiAgLy8gYmVpbmcgaW5pdGlhbGlzZWQgZHVyaW5nIHRoZSBmaXJzdCBjaGFuZ2UtZGV0ZWN0aW9uIHBhc3MuXG4gIGNvbnRyb2xJbnZhbGlkKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmludm9pY2VGb3JtPy5nZXQobmFtZSk7XG4gICAgcmV0dXJuICEhY3RybCAmJiBjdHJsLnRvdWNoZWQgJiYgY3RybC5pbnZhbGlkO1xuICB9XG5cbiAgYXJyYXlDb250cm9sSW52YWxpZChhcnJheU5hbWU6ICdwcm9kdWN0cycgfCAndGF4JywgaW5kZXg6IG51bWJlciwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYXJyID0gdGhpcy5pbnZvaWNlRm9ybT8uZ2V0KGFycmF5TmFtZSkgYXMgRm9ybUFycmF5IHwgbnVsbDtcbiAgICBjb25zdCBjdHJsID0gYXJyPy5hdChpbmRleCk/LmdldChuYW1lKTtcbiAgICByZXR1cm4gISFjdHJsICYmIGN0cmwudG91Y2hlZCAmJiBjdHJsLmludmFsaWQ7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvRmlyc3RJbnZhbGlkKCk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIGZpcnN0IGludmFsaWQgY29udHJvbCBpbnNpZGUgdGhlIG1vZGFsIGFuZCBicmluZyBpdCBpbnRvIHZpZXcuXG4gICAgLy8gU2NvcGVkIHRvIC5tb2RhbC1jb250ZW50IHNvIHdlIGRvbid0IGdyYWIgZmllbGRzIGZyb20gb3RoZXIgbW9kYWxzIG9uXG4gICAgLy8gdGhlIHBhZ2UgaWYgYW55IGFyZSBvcGVuLlxuICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubW9kYWwtY29udGVudCcpO1xuICAgIGNvbnN0IGZpcnN0ID0gcm9vdD8ucXVlcnlTZWxlY3RvcignLmlzLWludmFsaWQnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKGZpcnN0KSB7XG4gICAgICBmaXJzdC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgICAgaWYgKHR5cGVvZiBmaXJzdC5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaXJzdC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHByb2R1Y3RzKCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuaW52b2ljZUZvcm0uZ2V0KCdwcm9kdWN0cycpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIGdldCB0YXhBcnJheSgpOiBGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmludm9pY2VGb3JtLmdldCgndGF4JykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgY3JlYXRlUHJvZHVjdEdyb3VwKHByb2R1Y3Q/OiBhbnkpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHByb2R1Y3ROYW1lOiBbcHJvZHVjdD8ucHJvZHVjdE5hbWUgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgLy8gV2hlbiB0cnVlLCB0aGUgbmFtZSBpcyBhIGZyZWUtdGV4dCBjdXN0b20gcHJvZHVjdCAobm90IGZyb20gdGhlIGNsaWVudCdzXG4gICAgICAvLyBiYXNlLXByaWNpbmcgbGlzdCkg4oCUIHRoZSB0ZW1wbGF0ZSBzaG93cyBhIHRleHQgaW5wdXQgaW5zdGVhZCBvZiB0aGVcbiAgICAgIC8vIHByb2R1Y3QgZHJvcGRvd24uXG4gICAgICBpc0N1c3RvbTogW3Byb2R1Y3Q/LmlzQ3VzdG9tIHx8IGZhbHNlXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBbcHJvZHVjdD8uZGVzY3JpcHRpb24gfHwgJyddLFxuICAgICAgbW9udGg6IFtwcm9kdWN0Py5tb250aCB8fCAnJ10sXG4gICAgICBIc25OdW1iZXI6IFtwcm9kdWN0Py5Ic25OdW1iZXIgfHwgJzk5ODMxNCddLFxuICAgICAgc3RvcmVDb3VudDogW3Byb2R1Y3Q/LnN0b3JlQ291bnQgfHwgMCwgVmFsaWRhdG9ycy5taW4oMCldLFxuICAgICAgcHJpY2U6IFtwcm9kdWN0Py5wcmljZSB8fCAwLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMCldXSxcbiAgICAgIGFtb3VudDogW3Byb2R1Y3Q/LmFtb3VudCB8fCAwXSxcbiAgICAgIHBlcmlvZDogW3Byb2R1Y3Q/LnBlcmlvZCB8fCAnbW9udGhseSddLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlVGF4R3JvdXAodGF4PzogYW55KTogRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XG4gICAgICB0eXBlOiBbdGF4Py50eXBlIHx8ICdJR1NUJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB2YWx1ZTogW3RheD8udmFsdWUgfHwgMTgsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwKSwgVmFsaWRhdG9ycy5tYXgoMTAwKV1dLFxuICAgICAgdGF4QW1vdW50OiBbdGF4Py50YXhBbW91bnQgfHwgJzAnXSxcbiAgICAgIC8vIERlZmF1bHQgdGhlIHRheC1yb3cgc3ltYm9sIHRvIHRoZSBpbnZvaWNlJ3MgY3VycmVuY3kgKHdhcyBoYXJkY29kZWRcbiAgICAgIC8vIHRvIOKCuSwgd2hpY2ggbGVha2VkIGludG8gdGhlIHNhdmVkIGRvYyBmb3Igbm9uLUlOUiBpbnZvaWNlcykuXG4gICAgICBjdXJyZW5jeTogW3RheD8uY3VycmVuY3kgfHwgdGhpcy5zeW1ib2xGb3IodGhpcy5pbnZvaWNlRm9ybT8uZ2V0KCdjdXJyZW5jeScpPy52YWx1ZSldLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW1ib2xGb3IoY29kZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVuY3lTeW1ib2xzW2NvZGUgfHwgJyddIHx8ICckJztcbiAgfVxuXG4gIGFkZFByb2R1Y3QoKSB7XG4gICAgdGhpcy5wcm9kdWN0cy5wdXNoKHRoaXMuY3JlYXRlUHJvZHVjdEdyb3VwKCkpO1xuICB9XG5cbiAgcmVtb3ZlUHJvZHVjdChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5wcm9kdWN0cy5yZW1vdmVBdChpbmRleCk7XG4gICAgdGhpcy5yZWNhbGN1bGF0ZSgpO1xuICB9XG5cbiAgYWRkVGF4KCkge1xuICAgIHRoaXMudGF4QXJyYXkucHVzaCh0aGlzLmNyZWF0ZVRheEdyb3VwKCkpO1xuICB9XG5cbiAgcmVtb3ZlVGF4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnRheEFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLnJlY2FsY3VsYXRlKCk7XG4gIH1cblxuICBwYXRjaEZvcm0oKSB7XG4gICAgY29uc3QgaW52ID0gdGhpcy5pbnZvaWNlRGF0YTtcblxuICAgIHRoaXMuaW52b2ljZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBjb21wYW55TmFtZTogaW52LmNvbXBhbnlOYW1lIHx8ICcnLFxuICAgICAgY29tcGFueUFkZHJlc3M6IGludi5jb21wYW55QWRkcmVzcyB8fCAnJyxcbiAgICAgIEdTVE51bWJlcjogaW52LkdTVE51bWJlciB8fCAnJyxcbiAgICAgIFBsYWNlT2ZTdXBwbHk6IGludi5QbGFjZU9mU3VwcGx5IHx8ICcnLFxuICAgICAgZ3JvdXBOYW1lOiBpbnYuZ3JvdXBOYW1lIHx8ICcnLFxuICAgICAgZ3JvdXBJZDogaW52Lmdyb3VwSWQgfHwgJycsXG4gICAgICBzdG9yZXM6IGludi5zdG9yZXMgfHwgMCxcbiAgICAgIGJpbGxpbmdEYXRlOiB0aGlzLmZvcm1hdERhdGVGb3JJbnB1dChpbnYuYmlsbGluZ0RhdGUpLFxuICAgICAgZHVlRGF0ZTogdGhpcy5mb3JtYXREYXRlRm9ySW5wdXQoaW52LmR1ZURhdGUpLFxuICAgICAgY3VycmVuY3k6IGludi5jdXJyZW5jeSB8fCAnaW5yJyxcbiAgICAgIHN0YXR1czogaW52LnN0YXR1cyB8fCAncGVuZGluZycsXG4gICAgICBwYXltZW50U3RhdHVzOiBpbnYucGF5bWVudFN0YXR1cyB8fCAndW5wYWlkJyxcbiAgICAgIHB1cmNoYXNlT3JkZXJOdW1iZXI6IGludi5wdXJjaGFzZU9yZGVyTnVtYmVyIHx8ICcnLFxuICAgIH0pO1xuXG4gICAgLy8gUGF0Y2ggcHJvZHVjdHNcbiAgICBpZiAoaW52LnByb2R1Y3RzPy5sZW5ndGgpIHtcbiAgICAgIGludi5wcm9kdWN0cy5mb3JFYWNoKChwOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5wcm9kdWN0cy5wdXNoKHRoaXMuY3JlYXRlUHJvZHVjdEdyb3VwKHApKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFByb2R1Y3QoKTtcbiAgICB9XG5cbiAgICAvLyBQYXRjaCB0YXhcbiAgICBpZiAoaW52LnRheD8ubGVuZ3RoKSB7XG4gICAgICBpbnYudGF4LmZvckVhY2goKHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRheEFycmF5LnB1c2godGhpcy5jcmVhdGVUYXhHcm91cCh0KSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRUYXgoKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXREYXRlRm9ySW5wdXQoZGF0ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIWRhdGUpIHJldHVybiAnJztcbiAgICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZT8uJGRhdGUgfHwgZGF0ZSk7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuICcnO1xuICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcbiAgfVxuXG4gIG9uR3JvdXBDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHNlbGVjdGVkR3JvdXAgPSB0aGlzLmJpbGxpbmdHcm91cHMuZmluZChnID0+IGcuX2lkID09PSBldmVudC50YXJnZXQudmFsdWUpO1xuICAgIGlmIChzZWxlY3RlZEdyb3VwKSB7XG4gICAgICB0aGlzLmludm9pY2VGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBncm91cE5hbWU6IHNlbGVjdGVkR3JvdXAuZ3JvdXBOYW1lLFxuICAgICAgICBncm91cElkOiBzZWxlY3RlZEdyb3VwLl9pZCxcbiAgICAgICAgY29tcGFueU5hbWU6IHNlbGVjdGVkR3JvdXAucmVnaXN0ZXJlZENvbXBhbnlOYW1lIHx8ICcnLFxuICAgICAgICBjb21wYW55QWRkcmVzczogW3NlbGVjdGVkR3JvdXAuYWRkcmVzc0xpbmVPbmUsIHNlbGVjdGVkR3JvdXAuYWRkcmVzc0xpbmVUd28sIHNlbGVjdGVkR3JvdXAuY2l0eSwgc2VsZWN0ZWRHcm91cC5zdGF0ZSwgc2VsZWN0ZWRHcm91cC5jb3VudHJ5LCBzZWxlY3RlZEdyb3VwLnBpbkNvZGVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpLFxuICAgICAgICBHU1ROdW1iZXI6IHNlbGVjdGVkR3JvdXAuZ3N0IHx8ICcnLFxuICAgICAgICBQbGFjZU9mU3VwcGx5OiBzZWxlY3RlZEdyb3VwLnBsYWNlT2ZTdXBwbHkgfHwgJycsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZWNhbGN1bGF0ZSgpIHtcbiAgICBsZXQgc3VidG90YWwgPSAwO1xuICAgIHRoaXMucHJvZHVjdHMuY29udHJvbHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlQ291bnQgPSBncm91cC5nZXQoJ3N0b3JlQ291bnQnKT8udmFsdWUgfHwgMDtcbiAgICAgIGNvbnN0IHByaWNlID0gZ3JvdXAuZ2V0KCdwcmljZScpPy52YWx1ZSB8fCAwO1xuICAgICAgY29uc3QgYW1vdW50ID0gc3RvcmVDb3VudCAqIHByaWNlO1xuICAgICAgZ3JvdXAuZ2V0KCdhbW91bnQnKT8uc2V0VmFsdWUocGFyc2VGbG9hdChhbW91bnQudG9GaXhlZCgyKSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHN1YnRvdGFsICs9IGFtb3VudDtcbiAgICB9KTtcblxuICAgIHRoaXMudGF4QXJyYXkuY29udHJvbHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ3JvdXAuZ2V0KCd2YWx1ZScpPy52YWx1ZSB8fCAwO1xuICAgICAgY29uc3QgdGF4QW1vdW50ID0gKHN1YnRvdGFsICogdmFsdWUgLyAxMDApLnRvRml4ZWQoMik7XG4gICAgICBncm91cC5nZXQoJ3RheEFtb3VudCcpPy5zZXRWYWx1ZSh0YXhBbW91bnQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9KTtcblxuICAgIGxldCB0b3RhbFN0b3JlcyA9IDA7XG4gICAgdGhpcy5wcm9kdWN0cy5jb250cm9scy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgdG90YWxTdG9yZXMgKz0gZ3JvdXAuZ2V0KCdzdG9yZUNvdW50Jyk/LnZhbHVlIHx8IDA7XG4gICAgfSk7XG4gICAgdGhpcy5pbnZvaWNlRm9ybS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZSh0b3RhbFN0b3JlcywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuXG4gIGdldFN1YnRvdGFsKCk6IG51bWJlciB7XG4gICAgbGV0IHN1YnRvdGFsID0gMDtcbiAgICB0aGlzLnByb2R1Y3RzLmNvbnRyb2xzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICBzdWJ0b3RhbCArPSBncm91cC5nZXQoJ2Ftb3VudCcpPy52YWx1ZSB8fCAwO1xuICAgIH0pO1xuICAgIHJldHVybiBzdWJ0b3RhbDtcbiAgfVxuXG4gIGdldFRvdGFsVGF4KCk6IG51bWJlciB7XG4gICAgbGV0IHRvdGFsVGF4ID0gMDtcbiAgICB0aGlzLnRheEFycmF5LmNvbnRyb2xzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICB0b3RhbFRheCArPSBwYXJzZUZsb2F0KGdyb3VwLmdldCgndGF4QW1vdW50Jyk/LnZhbHVlIHx8ICcwJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvdGFsVGF4O1xuICB9XG5cbiAgZ2V0VG90YWxBbW91bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJ0b3RhbCgpICsgdGhpcy5nZXRUb3RhbFRheCgpO1xuICB9XG5cbiAgZ2V0Q3VycmVuY3lTeW1ib2woKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xGb3IodGhpcy5pbnZvaWNlRm9ybS5nZXQoJ2N1cnJlbmN5Jyk/LnZhbHVlKTtcbiAgfVxuXG4gIGdldEludm9pY2VDdXJyZW5jeVN5bWJvbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbEZvcih0aGlzLmludm9pY2VEYXRhPy5jdXJyZW5jeSk7XG4gIH1cblxuICBvblN1Ym1pdCgpIHtcbiAgICBpZiAodGhpcy5pbnZvaWNlRm9ybS5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmludm9pY2VGb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgIC8vIERlZmVyIHRvIG5leHQgdGljayBzbyBBbmd1bGFyIHJlbmRlcnMgdGhlIC5pcy1pbnZhbGlkIGNsYXNzZXNcbiAgICAgIC8vIGJlZm9yZSB3ZSBxdWVyeSB0aGUgRE9NIGZvciB0aGUgZmlyc3QgaW52YWxpZCBjb250cm9sIHRvIHNjcm9sbCB0by5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0ZpcnN0SW52YWxpZCgpLCAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5pbnZvaWNlRm9ybS5nZXRSYXdWYWx1ZSgpO1xuXG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgY29tcGFueU5hbWU6IGZvcm1WYWx1ZS5jb21wYW55TmFtZSxcbiAgICAgIGNvbXBhbnlBZGRyZXNzOiBmb3JtVmFsdWUuY29tcGFueUFkZHJlc3MsXG4gICAgICBHU1ROdW1iZXI6IGZvcm1WYWx1ZS5HU1ROdW1iZXIsXG4gICAgICBQbGFjZU9mU3VwcGx5OiBmb3JtVmFsdWUuUGxhY2VPZlN1cHBseSxcbiAgICAgIGdyb3VwTmFtZTogZm9ybVZhbHVlLmdyb3VwTmFtZSxcbiAgICAgIGdyb3VwSWQ6IGZvcm1WYWx1ZS5ncm91cElkLFxuICAgICAgc3RvcmVzOiBmb3JtVmFsdWUuc3RvcmVzLFxuICAgICAgYmlsbGluZ0RhdGU6IGZvcm1WYWx1ZS5iaWxsaW5nRGF0ZSxcbiAgICAgIGR1ZURhdGU6IGZvcm1WYWx1ZS5kdWVEYXRlLFxuICAgICAgY3VycmVuY3k6IGZvcm1WYWx1ZS5jdXJyZW5jeSxcbiAgICAgIHN0YXR1czogZm9ybVZhbHVlLnN0YXR1cyxcbiAgICAgIHBheW1lbnRTdGF0dXM6IGZvcm1WYWx1ZS5wYXltZW50U3RhdHVzLFxuICAgICAgYWR2YW5jZUludm9pY2U6IGZvcm1WYWx1ZS5hZHZhbmNlSW52b2ljZSxcbiAgICAgIGFkdmFuY2VQZXJpb2Q6IGZvcm1WYWx1ZS5hZHZhbmNlUGVyaW9kLFxuICAgICAgLy8gTWFwIGludm9pY2UgdG8gYSBwdXJjaGFzZSBvcmRlciAoc2VydmVyIGRlZHVjdHMgdGhlIFBPIGJhbGFuY2UpLlxuICAgICAgcHVyY2hhc2VPcmRlck51bWJlcjogZm9ybVZhbHVlLnB1cmNoYXNlT3JkZXJOdW1iZXIgfHwgdW5kZWZpbmVkLFxuICAgICAgcHJvZHVjdHM6IGZvcm1WYWx1ZS5wcm9kdWN0cyxcbiAgICAgIHRheDogZm9ybVZhbHVlLnRheCxcbiAgICAgIGFtb3VudDogdGhpcy5nZXRTdWJ0b3RhbCgpLFxuICAgICAgdG90YWxBbW91bnQ6IE1hdGgucm91bmQodGhpcy5nZXRUb3RhbEFtb3VudCgpKSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2VkaXQnKSB7XG4gICAgICBwYXlsb2FkLl9pZCA9IHRoaXMuaW52b2ljZURhdGEuX2lkO1xuICAgICAgcGF5bG9hZC5pbnZvaWNlID0gdGhpcy5pbnZvaWNlRGF0YS5pbnZvaWNlO1xuICAgICAgcGF5bG9hZC5jbGllbnRJZCA9IHRoaXMuaW52b2ljZURhdGEuY2xpZW50SWQ7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnVwZGF0ZUludm9pY2UocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoJ0ludm9pY2UgdXBkYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3VwZGF0ZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byB1cGRhdGUgaW52b2ljZScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2VkaXRFc3RpbWF0ZScpIHtcbiAgICAgIC8vIFVwZGF0ZSBhbiBleGlzdGluZyBlc3RpbWF0ZS4gSWRlbnRpdHkgZmllbGRzIChlc3RpbWF0ZSAjLCBjbGllbnRJZCxcbiAgICAgIC8vIGNyZWF0ZWREYXRlKSBhcmUgcHJlc2VydmVkIHNlcnZlci1zaWRlOyB3ZSBzZW5kIHRoZSBlZGl0YWJsZSBmb3JtIGRhdGEuXG4gICAgICBwYXlsb2FkLl9pZCA9IHRoaXMuaW52b2ljZURhdGEuX2lkO1xuICAgICAgcGF5bG9hZC5jbGllbnRJZCA9IHRoaXMuaW52b2ljZURhdGEuY2xpZW50SWQgfHwgdGhpcy5jbGllbnRJZDtcbiAgICAgIHBheWxvYWQucGVyaW9kID0gZm9ybVZhbHVlLmJpbGxpbmdEYXRlXG4gICAgICAgID8gbmV3IERhdGUoZm9ybVZhbHVlLmJpbGxpbmdEYXRlKS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnc2hvcnQnLCB5ZWFyOiAnbnVtZXJpYycgfSlcbiAgICAgICAgOiB0aGlzLmludm9pY2VEYXRhLnBlcmlvZDtcbiAgICAgIHBheWxvYWQudmFsaWRUaWxsID0gZm9ybVZhbHVlLmR1ZURhdGU7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnVwZGF0ZUVzdGltYXRlKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdFc3RpbWF0ZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgndXBkYXRlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byB1cGRhdGUgZXN0aW1hdGUnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdlc3RpbWF0ZScpIHtcbiAgICAgIC8vIFNhbWUgZm9ybSwgc2VwYXJhdGUgZG9jdW1lbnQ6IHBvc3QgdG8gdGhlIGVzdGltYXRlIEFQSSBzbyBpdCBsYW5kcyBpblxuICAgICAgLy8gdGhlIGVzdGltYXRlcyBjb2xsZWN0aW9uIHdpdGggYW4gRVNULeKApiBudW1iZXIgaW5zdGVhZCBvZiBhbiBpbnZvaWNlLlxuICAgICAgcGF5bG9hZC5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XG4gICAgICBwYXlsb2FkLnBlcmlvZCA9IGZvcm1WYWx1ZS5iaWxsaW5nRGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKGZvcm1WYWx1ZS5iaWxsaW5nRGF0ZSkudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnIH0pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgcGF5bG9hZC52YWxpZFRpbGwgPSBmb3JtVmFsdWUuZHVlRGF0ZTtcbiAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuY3JlYXRlRXN0aW1hdGUocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoJ0VzdGltYXRlIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ2NyZWF0ZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZ2VuZXJhdGUgZXN0aW1hdGUnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBheWxvYWQuY2xpZW50SWQgPSB0aGlzLmNsaWVudElkO1xuICAgICAgLy8gRmxhZyB0aGUgYmFja2VuZCB0byB0YWtlIHRoZSBcImN1c3RvbSBjcmVhdGVcIiBwYXRoIHRoYXQgcGVyc2lzdHMgd2hhdFxuICAgICAgLy8gdGhlIGZvcm0gYnVpbHQuIFRoZSBsZWdhY3kgL2NyZWF0ZUludm9pY2UgY29udHJhY3QgZXhwZWN0cyBlaXRoZXJcbiAgICAgIC8vIGFsbENsaWVudCtjbGllbnRMaXN0IG9yIGludm9pY2VJZDsgd2l0aG91dCB0aGlzIGZsYWcsIHRoZSBzZXJ2ZXJcbiAgICAgIC8vIHNpbGVudGx5IHJldHVybnMgMnh4IGFuZCB3cml0ZXMgbm90aGluZy5cbiAgICAgIHBheWxvYWQuY3VzdG9tSW52b2ljZSA9IHRydWU7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmNyZWF0ZUludm9pY2UocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoJ0ludm9pY2UgY3JlYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ2NyZWF0ZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBjcmVhdGUgaW52b2ljZSc7XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KG1zZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBDUkVESVQgTk9URSA9PT09PT09PT09PT09PT09PT09PT1cblxuICBpbml0Q3JlZGl0Tm90ZUZvcm0oKSB7XG4gICAgdGhpcy5jcmVkaXROb3RlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgYW1vdW50OiBbJyddLFxuICAgICAgcmV2aXNlZEFtb3VudDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGRpc2NvdW50OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmNyZWRpdE5vdGVGb3JtLmdldCgncmV2aXNlZEFtb3VudCcpPy52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgY29uc3QgYW1vdW50ID0gdGhpcy5jcmVkaXROb3RlRm9ybS5nZXQoJ2Ftb3VudCcpPy52YWx1ZTtcbiAgICAgICAgaWYgKGFtb3VudCkge1xuICAgICAgICAgIGNvbnN0IGRpc2NvdW50ID0gKChhbW91bnQgLSBlKSAvIGFtb3VudCAqIDEwMCkudG9GaXhlZCgyKTtcbiAgICAgICAgICB0aGlzLmNyZWRpdE1vcmVUaGFuVGVuUGVyY2VudCA9IGlzTmFOKGUpIHx8IHBhcnNlRmxvYXQoZGlzY291bnQpIDwgMCB8fCBlIDwgMDtcbiAgICAgICAgICB0aGlzLmNyZWRpdE5vdGVGb3JtLmdldCgnZGlzY291bnQnKT8uc2V0VmFsdWUoZGlzY291bnQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jcmVkaXROb3RlRm9ybS5nZXQoJ2Rpc2NvdW50Jyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuY3JlZGl0TW9yZVRoYW5UZW5QZXJjZW50ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmNyZWRpdE5vdGVGb3JtLmdldCgnZGlzY291bnQnKT8udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9IHRoaXMuY3JlZGl0Tm90ZUZvcm0uZ2V0KCdhbW91bnQnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHJldmlzZWQgPSBwYXJzZUludCgoYW1vdW50ICogKDEgLSBlIC8gMTAwKSkudG9GaXhlZCgpKTtcbiAgICAgICAgdGhpcy5jcmVkaXRNb3JlVGhhblRlblBlcmNlbnQgPSBpc05hTihlKSB8fCBlIDwgMCB8fCByZXZpc2VkIDwgMDtcbiAgICAgICAgdGhpcy5jcmVkaXROb3RlRm9ybS5nZXQoJ3JldmlzZWRBbW91bnQnKT8uc2V0VmFsdWUocmV2aXNlZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jcmVkaXROb3RlRm9ybS5nZXQoJ3JldmlzZWRBbW91bnQnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgdGhpcy5jcmVkaXRNb3JlVGhhblRlblBlcmNlbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgcGF0Y2hDcmVkaXROb3RlRGVmYXVsdHMoKSB7XG4gICAgaWYgKHRoaXMuaW52b2ljZURhdGEpIHtcbiAgICAgIHRoaXMuY3JlZGl0Tm90ZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGFtb3VudDogdGhpcy5pbnZvaWNlRGF0YS5hbW91bnQgfHwgdGhpcy5pbnZvaWNlRGF0YS50b3RhbEFtb3VudCB8fCAwLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXBwbHlDcmVkaXROb3RlKCkge1xuICAgIGlmICh0aGlzLmNyZWRpdE1vcmVUaGFuVGVuUGVyY2VudCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlcXVlc3REYXRhID0ge1xuICAgICAgaW52b2ljZTogdGhpcy5pbnZvaWNlRGF0YS5pbnZvaWNlLFxuICAgICAgcmV2aXNlZEFtb3VudDogdGhpcy5jcmVkaXROb3RlRm9ybS5nZXQoJ3JldmlzZWRBbW91bnQnKT8udmFsdWUsXG4gICAgICBkaXNjb3VudDogdGhpcy5jcmVkaXROb3RlRm9ybS5nZXQoJ2Rpc2NvdW50Jyk/LnZhbHVlLFxuICAgIH07XG4gICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYXBwbHlEaXNjb3VudChyZXF1ZXN0RGF0YSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnQ3JlZGl0IG5vdGUgYXBwbGllZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdjcmVkaXRBcHBsaWVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBhcHBseSBjcmVkaXQgbm90ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb21pdFNwZWNpYWxDaGFyKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBrID0gZXZlbnQuY2hhckNvZGU7XG4gICAgcmV0dXJuIChrID09IDggfHwgayA9PSAzMiB8fCAoayA+PSA0OCAmJiBrIDw9IDU3KSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gT05FIFRJTUUgRkVFID09PT09PT09PT09PT09PT09PT09PVxuXG4gIGluaXRPbmVUaW1lRmVlRm9ybSgpIHtcbiAgICB0aGlzLm9uZVRpbWVGZWVGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBhbW91bnQ6IFsnJ10sXG4gICAgICBvbmVUaW1lRmVlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5vbmVUaW1lRmVlRm9ybS52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZU9uZVRpbWVGZWVUb3RhbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcGF0Y2hPbmVUaW1lRmVlRGVmYXVsdHMoKSB7XG4gICAgaWYgKHRoaXMuaW52b2ljZURhdGEpIHtcbiAgICAgIHRoaXMub25lVGltZUZlZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGFtb3VudDogdGhpcy5pbnZvaWNlRGF0YS5hbW91bnQgfHwgdGhpcy5pbnZvaWNlRGF0YS50b3RhbEFtb3VudCB8fCAwLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNhbGN1bGF0ZU9uZVRpbWVGZWVUb3RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGN1bGF0ZU9uZVRpbWVGZWVUb3RhbCgpIHtcbiAgICBjb25zdCBhbW91bnQgPSBwYXJzZUZsb2F0KHRoaXMub25lVGltZUZlZUZvcm0uZ2V0KCdhbW91bnQnKT8udmFsdWUgfHwgJzAnKTtcbiAgICBjb25zdCBmZWUgPSBwYXJzZUZsb2F0KHRoaXMub25lVGltZUZlZUZvcm0uZ2V0KCdvbmVUaW1lRmVlJyk/LnZhbHVlIHx8ICcwJyk7XG4gICAgdGhpcy5vbmVUaW1lRmVlVG90YWwgPSBwYXJzZUZsb2F0KChhbW91bnQgKyBmZWUpLnRvRml4ZWQoMikpO1xuICB9XG5cbiAgYXBwbHlPbmVUaW1lRmVlKCkge1xuICAgIGNvbnN0IGZlZVZhbHVlID0gdGhpcy5vbmVUaW1lRmVlRm9ybS5nZXQoJ29uZVRpbWVGZWUnKT8udmFsdWU7XG4gICAgaWYgKCFmZWVWYWx1ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHJlcXVlc3REYXRhID0ge1xuICAgICAgb25lVGltZUZlZTogZmVlVmFsdWUsXG4gICAgfTtcbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5vbmVUaW1lRmVlKHJlcXVlc3REYXRhLCB0aGlzLmludm9pY2VEYXRhLmludm9pY2UpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoJ09uZSB0aW1lIGZlZSBhcHBsaWVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ2ZlZUFwcGxpZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGFwcGx5IG9uZSB0aW1lIGZlZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IiwiPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwicC01IHB4LTYgcGItMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbXQtMlwiPnt7IG1vZGUgPT09ICdlZGl0JyA/ICdJbnZvaWNlJyA6IChtb2RlID09PSAnZXN0aW1hdGUnID8gJ0dlbmVyYXRlIEVzdGltYXRlJyA6IChtb2RlID09PSAnZWRpdEVzdGltYXRlJyA/ICdFZGl0IEVzdGltYXRlJyA6ICdDcmVhdGUgSW52b2ljZScpKSB9fVxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibW9kZSA9PT0gJ2VkaXQnXCIgY2xhc3M9XCJpbnZvaWNlLW51bWJlclwiPnt7IGludm9pY2VEYXRhPy5pbnZvaWNlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibW9kZSA9PT0gJ2VkaXRFc3RpbWF0ZSdcIiBjbGFzcz1cImludm9pY2UtbnVtYmVyXCI+e3sgaW52b2ljZURhdGE/LmVzdGltYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIChjbGljayk9XCJhY3RpdmVNb2RhbC5kaXNtaXNzKClcIj48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUYWJzIChvbmx5IGluIGVkaXQgbW9kZSkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyIG10LTNcIiAqbmdJZj1cIm1vZGUgPT09ICdlZGl0J1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRhYi1idG5cIiBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdlZGl0JyA/ICd0YWItYWN0aXZlJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0VGFiKCdlZGl0JylcIj5FZGl0IEludm9pY2U8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0YWItYnRuXCIgW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnY3JlZGl0Tm90ZScgPyAndGFiLWFjdGl2ZScgOiAnJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldFRhYignY3JlZGl0Tm90ZScpXCI+Q3JlZGl0IE5vdGU8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0YWItYnRuXCIgW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnb25lVGltZUZlZScgPyAndGFiLWFjdGl2ZScgOiAnJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldFRhYignb25lVGltZUZlZScpXCI+T25lIFRpbWUgRmVlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gRURJVCBJTlZPSUNFIFRBQiA9PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgbWItNFwiICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnZWRpdCcgfHwgbW9kZSAhPT0gJ2VkaXQnXCI+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiaW52b2ljZUZvcm1cIiBjbGFzcz1cImZvcm1cIiAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiPlxuXG4gICAgICAgICAgICA8IS0tIENvbXBhbnkgRGV0YWlscyBTZWN0aW9uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tdGl0bGUgbWItM1wiPkNvbXBhbnkgRGV0YWlsczwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IGZvcm0tZ3JvdXAgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+Q29tcGFueSBOYW1lIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNvbXBhbnlOYW1lXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiY29udHJvbEludmFsaWQoJ2NvbXBhbnlOYW1lJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIm1vZGUgPT09ICdlZGl0J1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1tc2dcIiAqbmdJZj1cImNvbnRyb2xJbnZhbGlkKCdjb21wYW55TmFtZScpXCI+Q29tcGFueSBOYW1lIGlzIHJlcXVpcmVkPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IGZvcm0tZ3JvdXAgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+R1NUIE51bWJlcjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIkdTVE51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3JlYWRvbmx5XT1cIm1vZGUgPT09ICdlZGl0J1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgZm9ybS1ncm91cCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5Db21wYW55IEFkZHJlc3M8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJjb21wYW55QWRkcmVzc1wiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3JlYWRvbmx5XT1cIm1vZGUgPT09ICdlZGl0J1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBmb3JtLWdyb3VwIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPlBsYWNlIG9mIFN1cHBseTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIlBsYWNlT2ZTdXBwbHlcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFtyZWFkb25seV09XCJtb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEJpbGxpbmcgR3JvdXAgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJiaWxsaW5nR3JvdXBzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgZm9ybS1ncm91cCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5CaWxsaW5nIEdyb3VwIDxzcGFuICpuZ0lmPVwibW9kZSAhPT0gJ2VkaXQnXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCAqbmdJZj1cIm1vZGUgIT09ICdlZGl0J1wiIGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBmb3JtQ29udHJvbE5hbWU9XCJncm91cElkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImNvbnRyb2xJbnZhbGlkKCdncm91cElkJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkdyb3VwQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYmlsbGluZyBncm91cDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZyBvZiBiaWxsaW5nR3JvdXBzXCIgW3ZhbHVlXT1cImcuX2lkXCI+e3sgZy5ncm91cE5hbWUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIm1vZGUgPT09ICdlZGl0J1wiIHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cImludm9pY2VGb3JtLmdldCgnZ3JvdXBOYW1lJyk/LnZhbHVlIHx8ICdEZWZhdWx0IEdyb3VwJ1wiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVhZG9ubHk+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLW1zZ1wiICpuZ0lmPVwiY29udHJvbEludmFsaWQoJ2dyb3VwSWQnKVwiPkJpbGxpbmcgR3JvdXAgaXMgcmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgZm9ybS1ncm91cCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5Hcm91cCBOYW1lPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZ3JvdXBOYW1lXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbcmVhZG9ubHldPVwibW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBJbnZvaWNlIERldGFpbHMgU2VjdGlvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLXRpdGxlIG1iLTMgbXQtMlwiPkludm9pY2UgRGV0YWlsczwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGZvcm0tZ3JvdXAgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+QmlsbGluZyBEYXRlIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cImJpbGxpbmdEYXRlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiY29udHJvbEludmFsaWQoJ2JpbGxpbmdEYXRlJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtbXNnXCIgKm5nSWY9XCJjb250cm9sSW52YWxpZCgnYmlsbGluZ0RhdGUnKVwiPkJpbGxpbmcgRGF0ZSBpcyByZXF1aXJlZDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPkR1ZSBEYXRlIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cImR1ZURhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJjb250cm9sSW52YWxpZCgnZHVlRGF0ZScpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLW1zZ1wiICpuZ0lmPVwiY29udHJvbEludmFsaWQoJ2R1ZURhdGUnKVwiPkR1ZSBEYXRlIGlzIHJlcXVpcmVkPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGZvcm0tZ3JvdXAgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+Q3VycmVuY3kgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZm9ybUNvbnRyb2xOYW1lPVwiY3VycmVuY3lcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiY29udHJvbEludmFsaWQoJ2N1cnJlbmN5JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGMgb2YgY3VycmVuY3lPcHRpb25zXCIgW3ZhbHVlXT1cImNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW5jeUxhYmVsc1tjXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1tc2dcIiAqbmdJZj1cImNvbnRyb2xJbnZhbGlkKCdjdXJyZW5jeScpXCI+Q3VycmVuY3kgaXMgcmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5Oby4gb2YgU3RvcmVzPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJzdG9yZXNcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlYWRvbmx5PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gUHVyY2hhc2UgT3JkZXIgbWFwcGluZyAob3B0aW9uYWwpLiBNYXBwaW5nIGRlZHVjdHMgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgaW52b2ljZSdzIGFtb3VudCBmcm9tIHRoZSBzZWxlY3RlZCBQTydzIHJlbWFpbmluZyBiYWxhbmNlLiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cCBtYi0zXCIgKm5nSWY9XCJtb2RlICE9PSAnZXN0aW1hdGUnICYmIG1vZGUgIT09ICdlZGl0RXN0aW1hdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5QdXJjaGFzZSBPcmRlcjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGZvcm1Db250cm9sTmFtZT1cInB1cmNoYXNlT3JkZXJOdW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5Ob25lPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBwbyBvZiBwdXJjaGFzZU9yZGVyc1wiIFt2YWx1ZV09XCJwby5wdXJjaGFzZU9yZGVyTnVtYmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcG8ucHVyY2hhc2VPcmRlck51bWJlciB9fSAoe3sgZ2V0Q3VycmVuY3lTeW1ib2woKSB9fXt7IHBvLnJlbWFpbmluZ0Ftb3VudCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX0gbGVmdClcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEFkdmFuY2UgSW52b2ljZSAoY3JlYXRlIG9ubHkpOiBiaWxsIHNldmVyYWwgZnV0dXJlIG1vbnRocyB1cGZyb250LlxuICAgICAgICAgICAgICAgICBFYWNoIG1vbnRoIGJlY29tZXMgaXRzIG93biBsaW5lIGl0ZW0gc2VydmVyLXNpZGUuIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0lmPVwibW9kZSA9PT0gJ2NyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTEgZC1ibG9ja1wiPkFkdmFuY2UgSW52b2ljZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImFkdmFuY2VJbnZvaWNlQ3JlYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZHZhbmNlSW52b2ljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImFkdmFuY2VJbnZvaWNlQ3JlYXRlXCI+QmlsbCBmdXR1cmUgbW9udGhzIHVwZnJvbnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cCBtYi0zXCIgKm5nSWY9XCJpbnZvaWNlRm9ybS5nZXQoJ2FkdmFuY2VJbnZvaWNlJyk/LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5BZHZhbmNlIGZyZXF1ZW5jeTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGZvcm1Db250cm9sTmFtZT1cImFkdmFuY2VQZXJpb2RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBhZHZhbmNlUGVyaW9kT3B0aW9uc1wiIFt2YWx1ZV09XCJvcHQudmFsdWVcIj57eyBvcHQubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICA8IS0tIFByb2R1Y3RzIFNlY3Rpb24gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi10aXRsZSBtYi0zIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm9kdWN0czwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiAoY2xpY2spPVwiYWRkUHJvZHVjdCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBZGQgUHJvZHVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImFkZEN1c3RvbVByb2R1Y3QoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQWRkIEN1c3RvbSBQcm9kdWN0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwicHJvZHVjdHNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIHByb2R1Y3RzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvZHVjdC1yb3cgbWItMyBwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9kdWN0LWxhYmVsXCI+UHJvZHVjdCB7eyBpICsgMSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1kYW5nZXJcIiAoY2xpY2spPVwicmVtb3ZlUHJvZHVjdChpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9kdWN0cy5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBmb3JtLWdyb3VwIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+UHJvZHVjdCBOYW1lIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCYXNlLXByaWNpbmcgZHJvcGRvd24gKHdpdGggYSBcIisgQ3VzdG9tIHByb2R1Y3RcIiBjaG9pY2UpIHdoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzIGV4aXN0IGFuZCB0aGlzIHJvdyBpc24ndCBjdXN0b207IG90aGVyd2lzZSBhIGZyZWUtdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSBpbnB1dCBmb3IgYSBjdXN0b20gcHJvZHVjdC4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCAqbmdJZj1cImF2YWlsYWJsZVByb2R1Y3RzLmxlbmd0aCA+IDAgJiYgIXByb2R1Y3QuZ2V0KCdpc0N1c3RvbScpPy52YWx1ZVwiIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3ROYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImFycmF5Q29udHJvbEludmFsaWQoJ3Byb2R1Y3RzJywgaSwgJ3Byb2R1Y3ROYW1lJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uUHJvZHVjdENoYW5nZShpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IHByb2R1Y3Q8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgcCBvZiBhdmFpbGFibGVQcm9kdWN0c1wiIFt2YWx1ZV09XCJwLnByb2R1Y3ROYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtYXRQcm9kdWN0TmFtZShwLnByb2R1Y3ROYW1lKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIl9fY3VzdG9tX19cIj4rIEN1c3RvbSBwcm9kdWN0PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiYXZhaWxhYmxlUHJvZHVjdHMubGVuZ3RoID09PSAwIHx8IHByb2R1Y3QuZ2V0KCdpc0N1c3RvbScpPy52YWx1ZVwiIHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdE5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImFycmF5Q29udHJvbEludmFsaWQoJ3Byb2R1Y3RzJywgaSwgJ3Byb2R1Y3ROYW1lJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQ3VzdG9tIFNlcnZpY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1tc2dcIiAqbmdJZj1cImFycmF5Q29udHJvbEludmFsaWQoJ3Byb2R1Y3RzJywgaSwgJ3Byb2R1Y3ROYW1lJylcIj5Qcm9kdWN0IE5hbWUgaXMgcmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGZvcm0tZ3JvdXAgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5EZXNjcmlwdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBDdXN0b21lciBGb290ZmFsbCBBbmFseXRpY3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGZvcm0tZ3JvdXAgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5Nb250aDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwibW9udGhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBNYXIgMjAyNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPkhTTi9TQUM8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIkhzbk51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+UXVhbnRpdHk8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RvcmVDb3VudFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInJlY2FsY3VsYXRlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGZvcm0tZ3JvdXAgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5SYXRlL1ByaWNlIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJwcmljZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiYXJyYXlDb250cm9sSW52YWxpZCgncHJvZHVjdHMnLCBpLCAncHJpY2UnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJyZWNhbGN1bGF0ZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtbXNnXCIgKm5nSWY9XCJhcnJheUNvbnRyb2xJbnZhbGlkKCdwcm9kdWN0cycsIGksICdwcmljZScpXCI+UmF0ZS9QcmljZSBpcyByZXF1aXJlZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPkFtb3VudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJhbW91bnRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlYWRvbmx5PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPlBlcmlvZDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZm9ybUNvbnRyb2xOYW1lPVwicGVyaW9kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtb250aGx5XCI+TW9udGhseTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicXVhcnRlcmx5XCI+UXVhcnRlcmx5PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJoYWxmeWVhcmx5XCI+SGFsZi15ZWFybHk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInllYXJseVwiPlllYXJseTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gVGF4IFNlY3Rpb24gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi10aXRsZSBtYi0zIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5UYXg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5XCIgKGNsaWNrKT1cImFkZFRheCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICArIEFkZCBUYXhcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwidGF4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdCBvZiB0YXhBcnJheS5jb250cm9sczsgbGV0IGogPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImpcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRheC1yb3cgbWItMyBwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9kdWN0LWxhYmVsXCI+VGF4IHt7IGogKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLWRhbmdlclwiIChjbGljayk9XCJyZW1vdmVUYXgoailcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGF4QXJyYXkubGVuZ3RoID4gMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMVwiPlRheCBUeXBlIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImFycmF5Q29udHJvbEludmFsaWQoJ3RheCcsIGosICd0eXBlJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdHQgb2YgdGF4VHlwZXNcIiBbdmFsdWVdPVwidHRcIj57eyB0dCB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLW1zZ1wiICpuZ0lmPVwiYXJyYXlDb250cm9sSW52YWxpZCgndGF4JywgaiwgJ3R5cGUnKVwiPlRheCBUeXBlIGlzIHJlcXVpcmVkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+VGF4ICUgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJhcnJheUNvbnRyb2xJbnZhbGlkKCd0YXgnLCBqLCAndmFsdWUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJyZWNhbGN1bGF0ZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtbXNnXCIgKm5nSWY9XCJhcnJheUNvbnRyb2xJbnZhbGlkKCd0YXgnLCBqLCAndmFsdWUnKVwiPlRheCAlIGlzIHJlcXVpcmVkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0xXCI+VGF4IEFtb3VudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGF4QW1vdW50XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZWFkb25seT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGZvcm0tZ3JvdXAgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTFcIj5DdXJyZW5jeSBTeW1ib2w8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImN1cnJlbmN5XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFN1bW1hcnkgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1zZWN0aW9uIHAtMyBtdC0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlN1YnRvdGFsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj57eyBnZXRDdXJyZW5jeVN5bWJvbCgpIH19IHt7IGdldFN1YnRvdGFsKCkgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5Ub3RhbCBUYXg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPnt7IGdldEN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZ2V0VG90YWxUYXgoKSB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBzdW1tYXJ5LXRvdGFsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS1sYWJlbC1ib2xkXCI+VG90YWwgQW1vdW50PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWUtYm9sZFwiPnt7IGdldEN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZ2V0VG90YWxBbW91bnQoKSB8IG51bWJlcjonMS4yLTInOidlbi1JTidcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gQWN0aW9ucyAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbXQtNFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhY3RpdmVNb2RhbC5kaXNtaXNzKClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBjYW5jZWwgbWUtNCB3LTUwXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cInNhdmluZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHB4LTQgdy01MFwiIHN0eWxlPVwid2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2F2aW5nXCIgY2xhc3M9XCJzdWJtaXRcIj57eyBtb2RlID09PSAnZWRpdCcgPyAnVXBkYXRlIEludm9pY2UnIDogKG1vZGUgPT09ICdlc3RpbWF0ZScgPyAnR2VuZXJhdGUgRXN0aW1hdGUnIDogKG1vZGUgPT09ICdlZGl0RXN0aW1hdGUnID8gJ1VwZGF0ZSBFc3RpbWF0ZScgOiAnQ3JlYXRlIEludm9pY2UnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNhdmluZ1wiIGNsYXNzPVwic3VibWl0XCI+U2F2aW5nLi4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IENSRURJVCBOT1RFIFRBQiA9PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgbWItNFwiICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnY3JlZGl0Tm90ZScgJiYgbW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY3JlZGl0Tm90ZUZvcm1cIiBjbGFzcz1cImZvcm1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50dGV4dCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgQXBwbHkgYSBjcmVkaXQgbm90ZSAvIGRpc2NvdW50IHRvIHRoaXMgaW52b2ljZS5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0yXCI+SW52b2ljZSBJRDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cImludm9pY2VEYXRhPy5pbnZvaWNlXCIgcmVhZG9ubHk+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTJcIj5Ub3RhbCBBbW91bnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9sbGFyLXNpZ25cIj57eyBnZXRJbnZvaWNlQ3VycmVuY3lTeW1ib2woKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJhbW91bnRcIiB0eXBlPVwidGV4dFwiIHJlYWRvbmx5IGNsYXNzPVwiZm9ybS1jb250cm9sIGFtb3VudC1pbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTJcIj5SZXZpc2VkIEFtb3VudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvbGxhci1zaWduXCI+e3sgZ2V0SW52b2ljZUN1cnJlbmN5U3ltYm9sKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwicmV2aXNlZEFtb3VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlwcmVzcyk9XCJvbWl0U3BlY2lhbENoYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGFtb3VudC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNyZWRpdE1vcmVUaGFuVGVuUGVyY2VudCA/ICdlcnJvcmlucHV0JyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1pY29uXCIgKm5nSWY9XCJjcmVkaXRNb3JlVGhhblRlblBlcmNlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwX2NuX2VycilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuOTk5NjcgNS4zMzMwMVY3Ljk5OTY3TTcuOTk5NjcgMTAuNjY2M0g4LjAwNjM0TTE0LjY2NjMgNy45OTk2N0MxNC42NjYzIDExLjY4MTYgMTEuNjgxNiAxNC42NjYzIDcuOTk5NjcgMTQuNjY2M0M0LjMxNzc4IDE0LjY2NjMgMS4zMzMwMSAxMS42ODE2IDEuMzMzMDEgNy45OTk2N0MxLjMzMzAxIDQuMzE3NzggNC4zMTc3OCAxLjMzMzAxIDcuOTk5NjcgMS4zMzMwMUMxMS42ODE2IDEuMzMzMDEgMTQuNjY2MyA0LjMxNzc4IDE0LjY2NjMgNy45OTk2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRjA0NDM4XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwX2NuX2VyclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiY3JlZGl0TW9yZVRoYW5UZW5QZXJjZW50ID8gJ3RleHQtZGFuZ2VyJyA6ICdjb250ZW50dGV4dCdcIiBjbGFzcz1cInNtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBFbnRlciBhIHZhbGlkIHJldmlzZWQgYW1vdW50XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhlYWRpbmd0ZXh0IG1iLTJcIj5EaXNjb3VudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJkaXNjb3VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlwcmVzcyk9XCJvbWl0U3BlY2lhbENoYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY3JlZGl0TW9yZVRoYW5UZW5QZXJjZW50ID8gJ2Vycm9yaW5wdXQnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyLjY2NyAzLjMzMzY2TDMuMzMzNjYgMTIuNjY3TTYuMDAwMzMgNC4zMzM2NkM2LjAwMDMzIDUuMjU0MTMgNS4yNTQxMyA2LjAwMDMzIDQuMzMzNjYgNi4wMDAzM0MzLjQxMzE4IDYuMDAwMzMgMi42NjY5OSA1LjI1NDEzIDIuNjY2OTkgNC4zMzM2NkMyLjY2Njk5IDMuNDEzMTggMy40MTMxOCAyLjY2Njk5IDQuMzMzNjYgMi42NjY5OUM1LjI1NDEzIDIuNjY2OTkgNi4wMDAzMyAzLjQxMzE4IDYuMDAwMzMgNC4zMzM2NlpNMTMuMzMzNyAxMS42NjdDMTMuMzMzNyAxMi41ODc1IDEyLjU4NzUgMTMuMzMzNyAxMS42NjcgMTMuMzMzN0MxMC43NDY1IDEzLjMzMzcgMTAuMDAwMyAxMi41ODc1IDEwLjAwMDMgMTEuNjY3QzEwLjAwMDMgMTAuNzQ2NSAxMC43NDY1IDEwLjAwMDMgMTEuNjY3IDEwLjAwMDNDMTIuNTg3NSAxMC4wMDAzIDEzLjMzMzcgMTAuNzQ2NSAxMy4zMzM3IDExLjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJjcmVkaXRNb3JlVGhhblRlblBlcmNlbnQgPyAnI0YwNDQzOCcgOiAnIzk4QTJCMydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiY3JlZGl0TW9yZVRoYW5UZW5QZXJjZW50ID8gJ3RleHQtZGFuZ2VyJyA6ICdjb250ZW50dGV4dCdcIiBjbGFzcz1cInNtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBJbiBwZXJjZW50YWdlXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG10LTVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWN0aXZlTW9kYWwuZGlzbWlzcygpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gY2FuY2VsIG1lLTQgdy01MFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImNyZWRpdE1vcmVUaGFuVGVuUGVyY2VudCB8fCBzYXZpbmdcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImFwcGx5Q3JlZGl0Tm90ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcHgtNCB3LTUwXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFzYXZpbmdcIj5BcHBseSBDcmVkaXQgTm90ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzYXZpbmdcIj5BcHBseWluZy4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PSBPTkUgVElNRSBGRUUgVEFCID09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBtYi00XCIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdvbmVUaW1lRmVlJyAmJiBtb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJvbmVUaW1lRmVlRm9ybVwiIGNsYXNzPVwiZm9ybVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnR0ZXh0IG1iLTNcIj5cbiAgICAgICAgICAgICAgICBBZGQgYSBvbmUtdGltZSBmZWUgKGUuZy4gaW5zdGFsbGF0aW9uKSB0byB0aGlzIGludm9pY2UuXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMlwiPkludm9pY2UgSUQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFt2YWx1ZV09XCJpbnZvaWNlRGF0YT8uaW52b2ljZVwiIHJlYWRvbmx5PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoZWFkaW5ndGV4dCBtYi0yXCI+Q3VycmVudCBJbnZvaWNlIEFtb3VudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2xsYXItc2lnblwiPnt7IGdldEludm9pY2VDdXJyZW5jeVN5bWJvbCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImFtb3VudFwiIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHkgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYW1vdW50LWlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaGVhZGluZ3RleHQgbWItMlwiPk9uZSBUaW1lIEZlZSAoSW5zdGFsbGF0aW9uKTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvbGxhci1zaWduXCI+e3sgZ2V0SW52b2ljZUN1cnJlbmN5U3ltYm9sKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwib25lVGltZUZlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlwcmVzcyk9XCJvbWl0U3BlY2lhbENoYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGFtb3VudC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgZmVlIGFtb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXN0YWNrIG10LTMgZmVlLXN1bW1hcnkgcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+U2VsZWN0ZWQgSW52b2ljZSBBbW91bnQgKyBPbmUgVGltZSBGZWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS12YWx1ZS1ib2xkXCI+e3sgZ2V0SW52b2ljZUN1cnJlbmN5U3ltYm9sKCkgfX17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZVRpbWVGZWVUb3RhbCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbXQtNVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhY3RpdmVNb2RhbC5kaXNtaXNzKClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBjYW5jZWwgbWUtNCB3LTUwXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwic2F2aW5nIHx8ICFvbmVUaW1lRmVlRm9ybS5nZXQoJ29uZVRpbWVGZWUnKT8udmFsdWVcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5T25lVGltZUZlZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcHgtNCB3LTUwXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFzYXZpbmdcIj5BcHBseSBGZWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2F2aW5nXCI+QXBwbHlpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19