ng-easycommerce-v18 0.6.39 → 0.6.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +13 -0
  2. package/assets/ec-i18n/ct.json +2 -0
  3. package/assets/ec-i18n/en.json +2 -0
  4. package/assets/ec-i18n/es.json +3 -0
  5. package/assets/ec-i18n/fr.json +2 -0
  6. package/assets/ec-i18n/gl.json +2 -0
  7. package/assets/ec-i18n/pr.json +2 -0
  8. package/esm2022/lib/ec-components/account-ec/order-ec/order-ec.component.mjs +3 -3
  9. package/esm2022/lib/ec-components/cart-ec/cart-ec.component.mjs +11 -1
  10. package/esm2022/lib/ec-components/checkout-ec/checkout-ec.component.mjs +8 -4
  11. package/esm2022/lib/ec-components/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.mjs +4 -3
  12. package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-ec.component.mjs +20 -3
  13. package/esm2022/lib/ec-components/product-detail-ec/product-detail-ec.component.mjs +41 -9
  14. package/esm2022/lib/ec-components/sidebar-ec/sidebar-ec.component.mjs +7 -3
  15. package/esm2022/lib/ec-components/user-portal-ec/user-portal-ec.component.mjs +4 -4
  16. package/esm2022/lib/ec-components/wishlist-ec/wishlist-ec.component.mjs +3 -3
  17. package/esm2022/lib/ec-components/wishlist-ec/wishlist-item-ec/wishlist-item-ec.component.mjs +3 -3
  18. package/esm2022/lib/ec-components/wishlist-modal-ec/wishlist-modal-ec.component.mjs +3 -3
  19. package/esm2022/lib/ec-services/analytics/google-analytics.service.mjs +4 -2
  20. package/esm2022/lib/ec-services/analytics/gtm.service.mjs +4 -2
  21. package/esm2022/lib/ec-services/cart.service.mjs +7 -1
  22. package/esm2022/lib/ec-services/checkout.service.mjs +8 -1
  23. package/esm2022/lib/ec-services/order-utility.service.mjs +22 -8
  24. package/esm2022/lib/ec-services/profile.service.mjs +37 -4
  25. package/esm2022/lib/interfaces/checkout.mjs +1 -1
  26. package/fesm2022/ng-easycommerce-v18.mjs +170 -41
  27. package/fesm2022/ng-easycommerce-v18.mjs.map +1 -1
  28. package/lib/ec-components/cart-ec/cart-ec.component.d.ts +2 -0
  29. package/lib/ec-components/checkout-ec/checkout-ec.component.d.ts +1 -1
  30. package/lib/ec-components/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +1 -1
  31. package/lib/ec-components/checkout-ec/payment-ec/payment-ec.component.d.ts +3 -0
  32. package/lib/ec-components/product-detail-ec/product-detail-ec.component.d.ts +4 -0
  33. package/lib/ec-components/sidebar-ec/sidebar-ec.component.d.ts +2 -0
  34. package/lib/ec-services/analytics/google-analytics.service.d.ts +1 -1
  35. package/lib/ec-services/analytics/gtm.service.d.ts +1 -1
  36. package/lib/ec-services/cart.service.d.ts +2 -0
  37. package/lib/ec-services/order-utility.service.d.ts +1 -0
  38. package/lib/ec-services/profile.service.d.ts +16 -3
  39. package/lib/interfaces/checkout.d.ts +26 -1
  40. package/package.json +1 -1
@@ -145,7 +145,7 @@ export class OrderEcComponent {
145
145
  return `${base}/media/order_documents/${fileName}`;
146
146
  }
147
147
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OrderEcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
148
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: OrderEcComponent, isStandalone: true, selector: "app-order-ec", viewQueries: [{ propertyName: "orderFileInput", first: true, predicate: ["orderFileInput"], descendants: true }], ngImport: i0, template: "<main class=\"py-5\" id=\"orderEcComponent\">\n <div class=\"container\">\n @if(order$ | async; as order) {\n <div class=\"wrap\">\n @if(order) {\n\n <div class=\"row justify-content-between order-header\">\n <div class=\"col-sm-auto col-12 font-brandon\">\n <h4 class=\"tit1 fw-bold order-title\">{{ ('order' | translate) + ': ' + order.number }}</h4>\n </div>\n @if(order?.invoice) {\n <div class=\"col-sm col-12 font-brandon\">\n <a target=\"_blank\" [href]=\"getUrlBase().slice(0, -1) + order.invoice\"\n class=\"btn btn-link btn-invoice\">\n <i class=\"fas fa-file-download me-1\"></i>\n {{ 'download' | translate }} {{ 'invoices' | translate | titlecase }}\n </a>\n </div>\n }\n <div class=\"col-auto text-end\">\n <button type=\"button\" (click)=\"back()\" class=\"btn btn-outline-dark btvolver border\">{{\n 'back-to-orders' | translate }}</button>\n </div>\n </div>\n\n <section id=\"orders\" class=\"order-meta-section\">\n <div class=\"row pt-2 order-meta-grid\">\n <div class=\"col-md-2 col-12 order-meta-item\">\n <p class=\"st\">{{ 'payment-state' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.payments[0].state | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'shipment-state' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.shipments[0].state | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'payment-method' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.payments[0]?.method?.name | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'shipment-method' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.shipments[0].method.name }}\n </p>\n @if(order.tracking) {\n <a [href]=\"order.tracking\"\n class=\"btn btn-outline-dark btnLogout px-3 py-1 font-size-10 w-auto btn-sm order-tracking-btn\">\n Ver seguimiento</a>\n }\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'date' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }}<br>\n {{ toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </p>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-md-2 col-12 font-brandon order-meta-item order-meta-total\">\n <p class=\"st\">{{ 'total' | translate }}:</p>\n <h5 class=\"fw-bold\">\n {{ (order.totals.total) | ecCurrencySymbol}}\n </h5>\n </div>\n }\n </div>\n </section>\n\n @if(!priceVisibility.hidePrices() && allowRepeatOrders) {\n <div class=\"text-end mt-3 order-repeat-wrap\">\n <button class=\"btn btn-primary mb-2 btnRepeatOrder order-action-primary\" (click)=\"repeatOrder()\">\n {{ 'repeat-order' | translate }}\n </button>\n </div>\n }\n\n <div class=\"container py-3 border-top border-bottom order-items-wrap\">\n @if(order.items.length) {\n <div class=\"row\">\n <div class=\"col-2 font-sm font-brandon d-none d-md-block\">\n {{ 'product' | translate | uppercase }}\n </div>\n <div class=\"col-4 font-sm font-brandon d-none d-md-block\">\n {{ 'description' | translate | uppercase }}\n </div>\n @if(channelConfig.applyOrderLot) {\n <div id=\"colLots\" class=\"col-1 font-sm font-brandon d-none d-md-block\">\n {{ 'lots' | translate | uppercase }}\n </div>\n }\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 text-center font-sm font-brandon d-none d-md-block\">\n {{ 'unit-price' | translate | uppercase }}\n </div>\n }\n <div class=\"col-1 text-center font-sm font-brandon d-none d-md-block\">\n {{ 'quantity' | translate | uppercase }}\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 text-end font-sm font-brandon d-none d-md-block\">\n {{ 'total' | translate | uppercase }}\n </div>\n }\n </div>\n }\n\n @for(item of order.items; track $index; let i = $index) {\n <div class=\"row cart-items order-item-row\">\n <div class=\"col-5 col-md-2 py-2 orderItemThumbWrap\">\n @if(item.product.variants[0]?.images?.length) {\n <img class=\"smc maxwidth img-fluid rounded-custom orderItemThumb\"\n [src]=\"mediaUrl() + item.product.variants[0].images[0]\" alt=\"\">\n } @else {\n @if(item.product.picturesdefault) {\n <img class=\"smc maxwidth img-fluid rounded-custom orderItemThumb\"\n [src]=\"mediaUrl() + item.product.picturesdefault[0]\" alt=\"\">\n }\n }\n </div>\n <div class=\"col-md-4 col-7 flex-column flex-md-row justify-content-start d-flex align-items-center\">\n <div class=\"w-100\">\n <p class=\"font-brandon d-flex w-100 mb-0\">\n {{ item.product.name }} (Cod:{{ item.product.variants[0].code }})\n </p>\n @if(enableFieldNotesInArticleFile && item?.comments) {\n <p class=\"comment-truncated fst-italic small text-muted mt-1 mb-0\">\"{{ item.comments }}\"</p>\n }\n @if(channelConfig.applyOrderLot) {\n <div class=\"d-md-none mt-2 order-lots-mobile-wrap\">\n <button type=\"button\" class=\"btn btn-primary btnSeguir m-0 text-center order-lots-btn order-lots-mobile-btn\"\n [attr.data-bs-toggle]=\"'collapse'\" [attr.data-bs-target]=\"'#collapseExample'+i\"\n aria-expanded=\"false\" [attr.aria-controls]=\"'collapseExample'+i\">\n {{ 'lots' | translate | uppercase }}\n </button>\n </div>\n }\n </div>\n </div>\n @if(channelConfig.applyOrderLot) {\n <div class=\"col-md-1 col-1 flex-column flex-md-row justify-content-start d-none d-md-flex align-items-center\">\n <input type=\"button\" class=\"btn btn-primary btnSeguir m-0 text-center order-lots-btn\"\n [attr.data-bs-toggle]=\"'collapse'\" [attr.data-bs-target]=\"'#collapseExample'+i\"\n aria-expanded=\"false\" [attr.aria-controls]=\"'collapseExample'+i\"\n value=\"{{ 'see' | translate | uppercase }}\">\n </div>\n }\n <div class=\"container d-md-none order-mobile-prices\">\n <div class=\"row\">\n <div class=\"col-4\">\n <p class=\"text-center w-100 m-0\"> {{ item.quantity }}</p>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-4 font-xl\">\n <p class=\"text-center w-100 m-0\"> {{ (item.product.variants[0].saleprice ?\n item.product.variants[0].saleprice : item.product.variants[0].price) |\n ecCurrencySymbol}}</p>\n </div>\n <div class=\"col-4 font-xl\">\n <p class=\"text-center w-100 m-0\"> {{ ((item.product.variants[0].saleprice ?\n item.product.variants[0].saleprice : item.product.variants[0].price) *\n item.quantity) | ecCurrencySymbol}}</p>\n </div>\n }\n </div>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 d-none d-md-flex align-items-center\">\n <p class=\"text-center w-100 m-0\">\n {{ (item.product.variants[0].saleprice ? item.product.variants[0].saleprice :\n item.product.variants[0].price) | ecCurrencySymbol}}\n </p>\n </div>\n }\n <div class=\"col-1 d-none d-md-flex align-items-center\">\n <p class=\"text-center w-100 m-0\"> {{ item.quantity }}</p>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 d-none d-md-flex align-items-center\">\n <p class=\"text-end w-100 m-0\">\n {{ ((item.product.variants[0].saleprice ? item.product.variants[0].saleprice :\n item.product.variants[0].price) * item.quantity) | ecCurrencySymbol}}</p>\n </div>\n }\n <div class=\"collapse\" [attr.id]=\"'collapseExample'+i\">\n <div class=\"card card-body\">\n <div class=\"d-none d-md-block\">\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">Estado</th>\n <th scope=\"col\">Cantidad</th>\n <th scope=\"col\">Fecha Solicitada</th>\n <th scope=\"col\">Fecha Estimada</th>\n <th scope=\"col\">Sede</th>\n <th scope=\"col\">Nota</th>\n <th scope=\"col\">Total Lote</th>\n </tr>\n </thead>\n <tbody>\n @for( lot of item.orderItemLot; track $index) {\n <tr>\n <th scope=\"row\">{{lot.id}}</th>\n <td>{{lot.lot_status}}</td>\n <td>{{lot.quantity}}</td>\n <td>{{ toDate(lot.date_request, 'DD/MM/YYYY') | translate }}</td>\n @if(lot.date_deliver) {\n <td>{{\n toDate(lot.date_deliver, 'DD/MM/YYYY') | translate }}</td>\n } @else {\n <td>Pendiente</td>\n }\n <td>{{lot.shipping_address_name}}</td>\n <td>{{lot.notes}}</td>\n <td>{{lot.total_lot | ecCurrencySymbol}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n <div class=\"d-md-none order-lots-mobile-list\">\n @for( lot of item.orderItemLot; track $index) {\n <article class=\"order-lots-mobile-card\">\n <div class=\"order-lots-mobile-card-head\">\n <span class=\"order-lots-mobile-pill\">{{ lot.lot_status | titlecase }}</span>\n <strong class=\"order-lots-mobile-total\">{{ lot.total_lot | ecCurrencySymbol }}</strong>\n </div>\n <dl class=\"order-lots-mobile-grid\">\n <div>\n <dt>#</dt>\n <dd>{{ lot.id }}</dd>\n </div>\n <div>\n <dt>Estado</dt>\n <dd>{{ lot.lot_status | titlecase }}</dd>\n </div>\n <div>\n <dt>Cantidad</dt>\n <dd>{{ lot.quantity }}</dd>\n </div>\n <div>\n <dt>Fecha solicitada</dt>\n <dd>{{ toDate(lot.date_request, 'DD/MM/YYYY') | translate }}</dd>\n </div>\n <div>\n <dt>Fecha estimada</dt>\n <dd>\n @if(lot.date_deliver) {\n {{ toDate(lot.date_deliver, 'DD/MM/YYYY') | translate }}\n } @else {\n Pendiente\n }\n </dd>\n </div>\n <div class=\"order-lots-mobile-full\">\n <dt>Sede</dt>\n <dd>{{ lot.shipping_address_name }}</dd>\n </div>\n <div class=\"order-lots-mobile-full\">\n <dt>Nota</dt>\n <dd>{{ lot.notes || '\u2014' }}</dd>\n </div>\n </dl>\n </article>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <div class=\"container order-totals-wrap\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\"></div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-12 col-md-6\">\n <div class=\"row py-4 order-totals-card\">\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'total-products' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.items) | ecCurrencySymbol }}\n </div>\n\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'shipment' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.shipping || '0') | ecCurrencySymbol }}\n </div>\n\n @if(!hideDiscounts && order.totals.promotion && order.totals.promotion != 0) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'discount' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end text-end\">\n {{ (order.totals.promotion) | ecCurrencySymbol }}</div>\n }\n\n @if(order.totals.taxes && order.totals.taxes != 0 ) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'taxes' | translate }}\n </div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.taxes) | ecCurrencySymbol }}</div>\n }\n\n @if(!hideTaxes && order.totals.refunds) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{\n (order.totals.refunds.refundReason) | titlecase }}\n </div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (- order.totals.refunds.refundTotal) | ecCurrencySymbol }}</div>\n }\n\n @if (order.totals.refunds) {\n <div class=\"col-6 font-brandon font-md\">{{ 'total' | translate | uppercase }}</div>\n <div class=\"col-6 font-brandon font-md text-end\">\n {{ (order.totals.refunds.totalAfterRefund) | ecCurrencySymbol }}\n </div>\n } @else{\n <div class=\"col-6 font-brandon font-md\">{{ 'total' | translate | uppercase }}</div>\n <div class=\"col-6 font-brandon font-md text-end\">\n {{ (order.totals.total) | ecCurrencySymbol }}\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n @if(showDocumentsModal) {\n <div class=\"modal-backdrop fade show\" (click)=\"closeDocumentsModal()\"></div>\n <div class=\"modal fade show d-block\" tabindex=\"-1\">\n <div class=\"modal-dialog modal-dialog-centered\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title font-brandon\">Documentos</h5>\n <button type=\"button\" class=\"btn-close\" (click)=\"closeDocumentsModal()\"></button>\n </div>\n <div class=\"modal-body\">\n @for(document of order.documents; track $index) {\n <div class=\"mb-2\">\n <a target=\"_blank\" [href]=\"getUrlBase().slice(0, -1) + document.path\"\n class=\"btn btn-link p-0\">\n <i class=\"fas fa-file-download me-2\"></i>\n {{ document.typeLabel }}\n &mdash; {{ 'download' | translate }}\n </a>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if(orderDocumentsVisibility.showOrderDocuments() && orderObj?.tokenValue) {\n <div class=\"container mt-4\">\n <div class=\"row\">\n <div class=\"col-12\">\n <h5 class=\"font-brandon fw-semibold mb-3\">{{ 'order.documents.title' | translate }}</h5>\n\n @if(orderDocsLoading) {\n <div class=\"text-center py-3\">\n <div class=\"spinner-border spinner-border-sm text-secondary\" role=\"status\"></div>\n </div>\n } @else {\n\n @if(orderDocuments.length > 0) {\n <div class=\"mb-3\">\n @for(doc of orderDocuments; track doc.id) {\n <div class=\"d-flex align-items-center gap-2 py-2 border-bottom\">\n <i class=\"bi bi-file-earmark text-muted\"></i>\n <span class=\"flex-grow-1 small\">\n {{ doc.fileName }}\n @if(doc.typeLabel) {\n <span class=\"badge bg-secondary ms-1 small\">{{ doc.typeLabel }}</span>\n }\n </span>\n <a [href]=\"orderDocDownloadUrl(doc.fileName)\" target=\"_blank\" rel=\"noopener\"\n class=\"btn btn-link btn-sm p-0\">\n <i class=\"bi bi-download\"></i>\n </a>\n </div>\n }\n </div>\n } @else {\n <p class=\"text-muted small mb-3\">{{ 'order.documents.empty' | translate }}</p>\n }\n\n <div class=\"row g-2\">\n\n <div class=\"col-12 col-sm-5\">\n <label class=\"form-label form-label-sm\">{{ 'order.documents.file' | translate }}</label>\n <input #orderFileInput type=\"file\" class=\"form-control form-control-sm\"\n accept=\".pdf,.jpg,.jpeg,.png\" (change)=\"onOrderFileSelected($event)\">\n <div class=\"form-text mt-1\" style=\"font-size: 0.75rem; line-height: 1;\">\n {{ 'user-portal.documents.allowed-formats' | translate }}: .pdf, .jpg, .jpeg, .png\n </div>\n </div>\n\n <div class=\"col-12 col-sm-4\">\n <label class=\"form-label form-label-sm\">{{ 'order.documents.type' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"orderDocSelectedType\">\n <option value=\"proof_of_payment_type\">{{ 'order.documents.type-payment-receipt' |\n translate }}</option>\n <option value=\"other\">{{ 'order.documents.type-other' | translate }}</option>\n </select>\n </div>\n\n <div class=\"col-12 col-sm-3 d-flex flex-column\">\n <label class=\"form-label form-label-sm d-none d-sm-block invisible\">Spacer</label>\n <button type=\"button\" class=\"btn btn-outline-dark btn-sm w-100 mt-auto\"\n style=\"margin-bottom: 1.1rem;\"\n [disabled]=\"!orderDocSelectedFile || orderDocsUploading\"\n (click)=\"uploadOrderDocument()\">\n @if(orderDocsUploading) {\n <span class=\"spinner-border spinner-border-sm me-1\"></span>\n } @else {\n <i class=\"bi bi-upload me-1\"></i>\n }\n {{ 'order.documents.upload' | translate }}\n </button>\n </div>\n\n @if(orderDocUploadError) {\n <div class=\"col-12\">\n <div class=\"alert alert-danger py-2 small mb-0\">{{ orderDocUploadError }}</div>\n </div>\n }\n </div>\n\n }\n </div>\n </div>\n </div>\n }\n\n } @else {\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n }\n </div>\n\n } @else {\n <div class=\"w-100 h-50 py-5\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n }\n </div>\n</main>\n", styles: ["#orderEcComponent{background:var(--ec-order-bg, #ffffff)}#orderEcComponent .order-header{margin-bottom:.5rem}#orderEcComponent .order-title{color:var(--ec-order-text);letter-spacing:.02em}#orderEcComponent .order-meta-section{background:var(--ec-order-surface, #ffffff);border:1px solid var(--ec-order-border, #e5e7eb);border-radius:var(--ec-order-radius, 12px);padding:.75rem}#orderEcComponent .order-meta-item{margin-bottom:.5rem}#orderEcComponent .order-meta-item .st{color:var(--ec-order-muted, #6b7280);margin-bottom:.35rem}#orderEcComponent .order-meta-value{color:var(--ec-order-text, #111827);font-weight:600;margin-bottom:0}#orderEcComponent .order-meta-total h5{color:var(--ec-order-accent, #374151)}#orderEcComponent .order-repeat-wrap{margin-top:.75rem!important}#orderEcComponent .order-action-primary,#orderEcComponent .btnRepeatOrder{background:var(--ec-order-btn-primary-bg, #374151)!important;border-color:var(--ec-order-btn-primary-bg, #374151)!important;color:var(--ec-order-btn-primary-color, #ffffff)!important;border-radius:var(--ec-order-btn-radius, 8px)!important}#orderEcComponent .order-items-wrap{border-color:var(--ec-order-border, #e5e7eb)!important}#orderEcComponent .order-item-row{border-bottom:1px solid var(--ec-order-border, #e5e7eb);padding:.5rem 0}#orderEcComponent .order-item-row:last-child{border-bottom:0}#orderEcComponent .orderItemThumbWrap{display:flex;align-items:center}#orderEcComponent .orderItemThumb{width:96px!important;max-width:96px!important;height:96px!important;min-height:96px;object-fit:contain;display:block;border:1px solid var(--ec-order-border, #e5e7eb);border-radius:8px;background-color:#fff;padding:4px}#orderEcComponent .order-totals-card{border:1px solid var(--ec-order-border, #e5e7eb);border-radius:var(--ec-order-radius, 12px);background:var(--ec-order-surface, #ffffff);margin-top:.5rem}#orderEcComponent .order-totals-card .border-bottom{border-bottom-color:var(--ec-order-border, #e5e7eb)!important}.comment-truncated{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;white-space:normal;max-height:3em}#orderEcComponent .btvolver{color:var(--ec-order-btn-outline-color, #374151)!important;border-color:var(--ec-order-btn-outline-color, #374151)!important;background-color:#fff!important;font-weight:600;border-radius:var(--ec-order-btn-radius, 8px)!important}#orderEcComponent .btvolver:hover,#orderEcComponent .btvolver:focus{color:var(--ec-order-btn-primary-color, #ffffff)!important;background-color:var(--ec-order-btn-outline-color, #374151)!important;border-color:var(--ec-order-btn-outline-color, #374151)!important}#orderEcComponent .order-tracking-btn{margin-top:.35rem;border-radius:var(--ec-order-btn-radius)!important}#orderEcComponent .order-lots-btn{border-radius:var(--ec-order-btn-radius, 8px)!important;min-width:4.25rem}#orderEcComponent .order-lots-mobile-wrap{display:flex;justify-content:flex-start}#orderEcComponent .order-lots-mobile-btn{line-height:1.1;padding-left:.85rem;padding-right:.85rem}#orderEcComponent .order-lots-mobile-list{display:grid;gap:.75rem}#orderEcComponent .order-lots-mobile-card{border:1px solid var(--ec-order-border, #e5e7eb);border-radius:12px;background:#fff;padding:.85rem .9rem;box-shadow:0 1px #11182705}#orderEcComponent .order-lots-mobile-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;margin-bottom:.85rem}#orderEcComponent .order-lots-mobile-pill{display:inline-flex;align-items:center;justify-content:center;padding:.35rem .7rem;border-radius:999px;background:#0d6efd14;color:#0d6efd;font-weight:700;text-transform:capitalize;font-size:.8rem}#orderEcComponent .order-lots-mobile-total{color:var(--ec-order-text, #111827);font-size:.95rem;white-space:nowrap}#orderEcComponent .order-lots-mobile-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.65rem .9rem;margin:0}#orderEcComponent .order-lots-mobile-grid>div,#orderEcComponent .order-lots-mobile-full{min-width:0}#orderEcComponent .order-lots-mobile-grid dt{color:var(--ec-order-muted, #6b7280);font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;margin-bottom:.15rem}#orderEcComponent .order-lots-mobile-grid dd{margin-bottom:0;color:var(--ec-order-text, #111827);font-weight:600;word-break:break-word}#orderEcComponent .order-lots-mobile-full{grid-column:1/-1}@media (max-width: 991.98px){#orderEcComponent{padding-top:1rem!important;padding-left:.5rem;padding-right:.5rem}#orderEcComponent .container{padding-left:.25rem;padding-right:.25rem}#orderEcComponent .order-header{margin-left:0;margin-right:0}#orderEcComponent .order-header>[class*=col-]{padding-left:.25rem;padding-right:.25rem}#orderEcComponent .order-header{row-gap:.75rem}#orderEcComponent .order-meta-section{padding:.65rem}#orderEcComponent .order-meta-item{padding:.45rem 0;border-bottom:1px dashed var(--ec-order-border, #e5e7eb)}#orderEcComponent .order-meta-grid{margin-left:0;margin-right:0}#orderEcComponent .order-meta-grid>[class*=col-]{padding-left:0;padding-right:0}#orderEcComponent .order-meta-item:last-child{border-bottom:0}#orderEcComponent .orderItemThumb{width:72px!important;max-width:72px!important;height:72px!important;min-height:72px}#orderEcComponent .order-mobile-prices{margin-top:.35rem}#orderEcComponent .order-lots-mobile-wrap{margin-top:.5rem}#orderEcComponent .order-lots-mobile-grid{grid-template-columns:1fr}#orderEcComponent .order-totals-card{margin-top:1rem;padding-top:.5rem;padding-bottom:.5rem}}.modal-backdrop.fade.show{z-index:1050}.modal.fade.show.d-block{z-index:1055}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: EcCurrencySymbolPipe, name: "ecCurrencySymbol" }, { kind: "component", type: LoadingFullEcComponent, selector: "app-loading-full-ec" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: UpperCasePipe, name: "uppercase" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
148
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: OrderEcComponent, isStandalone: true, selector: "app-order-ec", viewQueries: [{ propertyName: "orderFileInput", first: true, predicate: ["orderFileInput"], descendants: true }], ngImport: i0, template: "<main class=\"py-5\" id=\"orderEcComponent\">\n <div class=\"container\">\n @if(order$ | async; as order) {\n <div class=\"wrap\">\n @if(order) {\n\n <div class=\"row justify-content-between order-header\">\n <div class=\"col-sm-auto col-12 font-brandon\">\n <h4 class=\"tit1 fw-bold order-title\">{{ ('order' | translate) + ': ' + order.number }}</h4>\n </div>\n @if(order?.invoice) {\n <div class=\"col-sm col-12 font-brandon\">\n <a target=\"_blank\" [href]=\"getUrlBase().slice(0, -1) + order.invoice\"\n class=\"btn btn-link btn-invoice\">\n <i class=\"fas fa-file-download me-1\"></i>\n {{ 'download' | translate }} {{ 'invoices' | translate | titlecase }}\n </a>\n </div>\n }\n <div class=\"col-auto text-end\">\n <button type=\"button\" (click)=\"back()\" class=\"btn btn-outline-dark btvolver border\">{{\n 'back-to-orders' | translate }}</button>\n </div>\n </div>\n\n <section id=\"orders\" class=\"order-meta-section\">\n <div class=\"row pt-2 order-meta-grid\">\n <div class=\"col-md-2 col-12 order-meta-item\">\n <p class=\"st\">{{ 'payment-state' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.payments[0].state | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'shipment-state' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.shipments[0].state | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'payment-method' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.payments[0]?.method?.name | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'shipment-method' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.shipments[0].method.name }}\n </p>\n @if(order.tracking) {\n <a [href]=\"order.tracking\"\n class=\"btn btn-outline-dark btnLogout px-3 py-1 font-size-10 w-auto btn-sm order-tracking-btn\">\n Ver seguimiento</a>\n }\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'date' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }}<br>\n {{ toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </p>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-md-2 col-12 font-brandon order-meta-item order-meta-total\">\n <p class=\"st\">{{ 'total' | translate }}:</p>\n <h5 class=\"fw-bold\">\n {{ (order.totals.total) | ecCurrencySymbol}}\n </h5>\n </div>\n }\n </div>\n </section>\n\n @if(!priceVisibility.hidePrices() && allowRepeatOrders) {\n <div class=\"text-end mt-3 order-repeat-wrap\">\n <button class=\"btn btn-primary mb-2 btnRepeatOrder order-action-primary\" (click)=\"repeatOrder()\">\n {{ 'repeat-order' | translate }}\n </button>\n </div>\n }\n\n <div class=\"container py-3 border-top border-bottom order-items-wrap\">\n @if(order.items.length) {\n <div class=\"row\">\n <div class=\"col-2 font-sm font-brandon d-none d-md-block\">\n {{ 'product' | translate | uppercase }}\n </div>\n <div class=\"col-4 font-sm font-brandon d-none d-md-block\">\n {{ 'description' | translate | uppercase }}\n </div>\n @if(channelConfig.applyOrderLot) {\n <div id=\"colLots\" class=\"col-1 font-sm font-brandon d-none d-md-block\">\n {{ 'lots' | translate | uppercase }}\n </div>\n }\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 text-center font-sm font-brandon d-none d-md-block\">\n {{ 'unit-price' | translate | uppercase }}\n </div>\n }\n <div class=\"col-1 text-center font-sm font-brandon d-none d-md-block\">\n {{ 'quantity' | translate | uppercase }}\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 text-end font-sm font-brandon d-none d-md-block\">\n {{ 'total' | translate | uppercase }}\n </div>\n }\n </div>\n }\n\n @for(item of order.items; track $index; let i = $index) {\n <div class=\"row cart-items order-item-row\">\n <div class=\"col-5 col-md-2 py-2 orderItemThumbWrap\">\n @if(item.product.variants[0]?.images?.length) {\n <img class=\"smc maxwidth img-fluid rounded-custom orderItemThumb\"\n [src]=\"mediaUrl() + item.product.variants[0].images[0]\" alt=\"\">\n } @else {\n @if(item.product.picturesdefault) {\n <img class=\"smc maxwidth img-fluid rounded-custom orderItemThumb\"\n [src]=\"mediaUrl() + item.product.picturesdefault[0]\" alt=\"\">\n }\n }\n </div>\n <div class=\"col-md-4 col-7 flex-column flex-md-row justify-content-start d-flex align-items-center\">\n <div class=\"w-100\">\n <p class=\"font-brandon d-flex w-100 mb-0\">\n {{ item.product.name }} (Cod:{{ item.product.variants[0].code }})\n </p>\n @if(enableFieldNotesInArticleFile && item?.comments) {\n <p class=\"comment-truncated fst-italic small text-muted mt-1 mb-0\">\"{{ item.comments }}\"</p>\n }\n @if(channelConfig.applyOrderLot) {\n <div class=\"d-md-none mt-2 order-lots-mobile-wrap\">\n <button type=\"button\" class=\"btn btn-primary btnSeguir m-0 text-center order-lots-btn order-lots-mobile-btn\"\n [attr.data-bs-toggle]=\"'collapse'\" [attr.data-bs-target]=\"'#collapseExample'+i\"\n aria-expanded=\"false\" [attr.aria-controls]=\"'collapseExample'+i\">\n {{ 'lots' | translate | uppercase }}\n </button>\n </div>\n }\n </div>\n </div>\n @if(channelConfig.applyOrderLot) {\n <div class=\"col-md-1 col-1 flex-column flex-md-row justify-content-start d-none d-md-flex align-items-center\">\n <input type=\"button\" class=\"btn btn-primary btnSeguir m-0 text-center order-lots-btn\"\n [attr.data-bs-toggle]=\"'collapse'\" [attr.data-bs-target]=\"'#collapseExample'+i\"\n aria-expanded=\"false\" [attr.aria-controls]=\"'collapseExample'+i\"\n value=\"{{ 'see' | translate | uppercase }}\">\n </div>\n }\n <div class=\"container d-md-none order-mobile-prices\">\n <div class=\"row\">\n <div class=\"col-4\">\n <p class=\"text-center w-100 m-0\"> {{ item.quantity }}</p>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-4 font-xl\">\n <p class=\"text-center w-100 m-0\"> {{ (item.product.variants[0].saleprice ?\n item.product.variants[0].saleprice : item.product.variants[0].price) |\n ecCurrencySymbol}}</p>\n </div>\n <div class=\"col-4 font-xl\">\n <p class=\"text-center w-100 m-0\"> {{ ((item.product.variants[0].saleprice ?\n item.product.variants[0].saleprice : item.product.variants[0].price) *\n item.quantity) | ecCurrencySymbol}}</p>\n </div>\n }\n </div>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 d-none d-md-flex align-items-center\">\n <p class=\"text-center w-100 m-0\">\n {{ (item.product.variants[0].saleprice ? item.product.variants[0].saleprice :\n item.product.variants[0].price) | ecCurrencySymbol}}\n </p>\n </div>\n }\n <div class=\"col-1 d-none d-md-flex align-items-center\">\n <p class=\"text-center w-100 m-0\"> {{ item.quantity }}</p>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 d-none d-md-flex align-items-center\">\n <p class=\"text-end w-100 m-0\">\n {{ ((item.product.variants[0].saleprice ? item.product.variants[0].saleprice :\n item.product.variants[0].price) * item.quantity) | ecCurrencySymbol}}</p>\n </div>\n }\n <div class=\"collapse\" [attr.id]=\"'collapseExample'+i\">\n <div class=\"card card-body\">\n <div class=\"d-none d-md-block\">\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">Estado</th>\n <th scope=\"col\">Cantidad</th>\n <th scope=\"col\">Fecha Solicitada</th>\n <th scope=\"col\">Fecha Estimada</th>\n <th scope=\"col\">Sede</th>\n <th scope=\"col\">Nota</th>\n <th scope=\"col\">Total Lote</th>\n </tr>\n </thead>\n <tbody>\n @for( lot of item.orderItemLot; track $index) {\n <tr>\n <th scope=\"row\">{{lot.id}}</th>\n <td>{{lot.lot_status}}</td>\n <td>{{lot.quantity}}</td>\n <td>{{ toDate(lot.date_request, 'DD/MM/YYYY') | translate }}</td>\n @if(lot.date_deliver) {\n <td>{{\n toDate(lot.date_deliver, 'DD/MM/YYYY') | translate }}</td>\n } @else {\n <td>Pendiente</td>\n }\n <td>{{lot.shipping_address_name}}</td>\n <td>{{lot.notes}}</td>\n <td>{{lot.total_lot | ecCurrencySymbol}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n <div class=\"d-md-none order-lots-mobile-list\">\n @for( lot of item.orderItemLot; track $index) {\n <article class=\"order-lots-mobile-card\">\n <div class=\"order-lots-mobile-card-head\">\n <span class=\"order-lots-mobile-pill\">{{ lot.lot_status | titlecase }}</span>\n <strong class=\"order-lots-mobile-total\">{{ lot.total_lot | ecCurrencySymbol }}</strong>\n </div>\n <dl class=\"order-lots-mobile-grid\">\n <div>\n <dt>#</dt>\n <dd>{{ lot.id }}</dd>\n </div>\n <div>\n <dt>Estado</dt>\n <dd>{{ lot.lot_status | titlecase }}</dd>\n </div>\n <div>\n <dt>Cantidad</dt>\n <dd>{{ lot.quantity }}</dd>\n </div>\n <div>\n <dt>Fecha solicitada</dt>\n <dd>{{ toDate(lot.date_request, 'DD/MM/YYYY') | translate }}</dd>\n </div>\n <div>\n <dt>Fecha estimada</dt>\n <dd>\n @if(lot.date_deliver) {\n {{ toDate(lot.date_deliver, 'DD/MM/YYYY') | translate }}\n } @else {\n Pendiente\n }\n </dd>\n </div>\n <div class=\"order-lots-mobile-full\">\n <dt>Sede</dt>\n <dd>{{ lot.shipping_address_name }}</dd>\n </div>\n <div class=\"order-lots-mobile-full\">\n <dt>Nota</dt>\n <dd>{{ lot.notes || '\u2014' }}</dd>\n </div>\n </dl>\n </article>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <div class=\"container order-totals-wrap\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\"></div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-12 col-md-6\">\n <div class=\"row py-4 order-totals-card\">\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'total-products' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.items) | ecCurrencySymbol }}\n </div>\n\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'shipment' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.shipping || '0') | ecCurrencySymbol }}\n </div>\n\n @if(!hideDiscounts && order.totals.promotion && order.totals.promotion != 0) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'discount' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end text-end\">\n {{ (order.totals.promotion) | ecCurrencySymbol }}</div>\n }\n\n @if(order.totals.paymentMethodAdjustment !== null && order.totals.paymentMethodAdjustment !== undefined && order.totals.paymentMethodAdjustment != 0) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ (order.totals.paymentMethodAdjustment < 0 ? 'payment-method-discount' : 'payment-method-surcharge') | translate }}@if(order.totals.paymentMethodAdjustmentLabel){ \u00B7 {{ order.totals.paymentMethodAdjustmentLabel }}}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">{{ order.totals.paymentMethodAdjustment | ecCurrencySymbol }}</div>\n }\n\n @if(order.totals.taxes && order.totals.taxes != 0 ) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'taxes' | translate }}\n </div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.taxes) | ecCurrencySymbol }}</div>\n }\n\n @if(!hideTaxes && order.totals.refunds) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{\n (order.totals.refunds.refundReason) | titlecase }}\n </div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (- order.totals.refunds.refundTotal) | ecCurrencySymbol }}</div>\n }\n\n @if (order.totals.refunds) {\n <div class=\"col-6 font-brandon font-md\">{{ 'total' | translate | uppercase }}</div>\n <div class=\"col-6 font-brandon font-md text-end\">\n {{ (order.totals.refunds.totalAfterRefund) | ecCurrencySymbol }}\n </div>\n } @else{\n <div class=\"col-6 font-brandon font-md\">{{ 'total' | translate | uppercase }}</div>\n <div class=\"col-6 font-brandon font-md text-end\">\n {{ (order.totals.total) | ecCurrencySymbol }}\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n @if(showDocumentsModal) {\n <div class=\"modal-backdrop fade show\" (click)=\"closeDocumentsModal()\"></div>\n <div class=\"modal fade show d-block\" tabindex=\"-1\">\n <div class=\"modal-dialog modal-dialog-centered\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title font-brandon\">Documentos</h5>\n <button type=\"button\" class=\"btn-close\" (click)=\"closeDocumentsModal()\"></button>\n </div>\n <div class=\"modal-body\">\n @for(document of order.documents; track $index) {\n <div class=\"mb-2\">\n <a target=\"_blank\" [href]=\"getUrlBase().slice(0, -1) + document.path\"\n class=\"btn btn-link p-0\">\n <i class=\"fas fa-file-download me-2\"></i>\n {{ document.typeLabel }}\n &mdash; {{ 'download' | translate }}\n </a>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if(orderDocumentsVisibility.showOrderDocuments() && orderObj?.tokenValue) {\n <div class=\"container mt-4\">\n <div class=\"row\">\n <div class=\"col-12\">\n <h5 class=\"font-brandon fw-semibold mb-3\">{{ 'order.documents.title' | translate }}</h5>\n\n @if(orderDocsLoading) {\n <div class=\"text-center py-3\">\n <div class=\"spinner-border spinner-border-sm text-secondary\" role=\"status\"></div>\n </div>\n } @else {\n\n @if(orderDocuments.length > 0) {\n <div class=\"mb-3\">\n @for(doc of orderDocuments; track doc.id) {\n <div class=\"d-flex align-items-center gap-2 py-2 border-bottom\">\n <i class=\"bi bi-file-earmark text-muted\"></i>\n <span class=\"flex-grow-1 small\">\n {{ doc.fileName }}\n @if(doc.typeLabel) {\n <span class=\"badge bg-secondary ms-1 small\">{{ doc.typeLabel }}</span>\n }\n </span>\n <a [href]=\"orderDocDownloadUrl(doc.fileName)\" target=\"_blank\" rel=\"noopener\"\n class=\"btn btn-link btn-sm p-0\">\n <i class=\"bi bi-download\"></i>\n </a>\n </div>\n }\n </div>\n } @else {\n <p class=\"text-muted small mb-3\">{{ 'order.documents.empty' | translate }}</p>\n }\n\n <div class=\"row g-2\">\n\n <div class=\"col-12 col-sm-5\">\n <label class=\"form-label form-label-sm\">{{ 'order.documents.file' | translate }}</label>\n <input #orderFileInput type=\"file\" class=\"form-control form-control-sm\"\n accept=\".pdf,.jpg,.jpeg,.png\" (change)=\"onOrderFileSelected($event)\">\n <div class=\"form-text mt-1\" style=\"font-size: 0.75rem; line-height: 1;\">\n {{ 'user-portal.documents.allowed-formats' | translate }}: .pdf, .jpg, .jpeg, .png\n </div>\n </div>\n\n <div class=\"col-12 col-sm-4\">\n <label class=\"form-label form-label-sm\">{{ 'order.documents.type' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"orderDocSelectedType\">\n <option value=\"proof_of_payment_type\">{{ 'order.documents.type-payment-receipt' |\n translate }}</option>\n <option value=\"other\">{{ 'order.documents.type-other' | translate }}</option>\n </select>\n </div>\n\n <div class=\"col-12 col-sm-3 d-flex flex-column\">\n <label class=\"form-label form-label-sm d-none d-sm-block invisible\">Spacer</label>\n <button type=\"button\" class=\"btn btn-outline-dark btn-sm w-100 mt-auto\"\n style=\"margin-bottom: 1.1rem;\"\n [disabled]=\"!orderDocSelectedFile || orderDocsUploading\"\n (click)=\"uploadOrderDocument()\">\n @if(orderDocsUploading) {\n <span class=\"spinner-border spinner-border-sm me-1\"></span>\n } @else {\n <i class=\"bi bi-upload me-1\"></i>\n }\n {{ 'order.documents.upload' | translate }}\n </button>\n </div>\n\n @if(orderDocUploadError) {\n <div class=\"col-12\">\n <div class=\"alert alert-danger py-2 small mb-0\">{{ orderDocUploadError }}</div>\n </div>\n }\n </div>\n\n }\n </div>\n </div>\n </div>\n }\n\n } @else {\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n }\n </div>\n\n } @else {\n <div class=\"w-100 h-50 py-5\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n }\n </div>\n</main>\n", styles: ["#orderEcComponent{background:var(--ec-order-bg, #ffffff)}#orderEcComponent .order-header{margin-bottom:.5rem}#orderEcComponent .order-title{color:var(--ec-order-text);letter-spacing:.02em}#orderEcComponent .order-meta-section{background:var(--ec-order-surface, #ffffff);border:1px solid var(--ec-order-border, #e5e7eb);border-radius:var(--ec-order-radius, 12px);padding:.75rem}#orderEcComponent .order-meta-item{margin-bottom:.5rem}#orderEcComponent .order-meta-item .st{color:var(--ec-order-muted, #6b7280);margin-bottom:.35rem}#orderEcComponent .order-meta-value{color:var(--ec-order-text, #111827);font-weight:600;margin-bottom:0}#orderEcComponent .order-meta-total h5{color:var(--ec-order-accent, #374151)}#orderEcComponent .order-repeat-wrap{margin-top:.75rem!important}#orderEcComponent .order-action-primary,#orderEcComponent .btnRepeatOrder{background:var(--ec-order-btn-primary-bg, #374151)!important;border-color:var(--ec-order-btn-primary-bg, #374151)!important;color:var(--ec-order-btn-primary-color, #ffffff)!important;border-radius:var(--ec-order-btn-radius, 8px)!important}#orderEcComponent .order-items-wrap{border-color:var(--ec-order-border, #e5e7eb)!important}#orderEcComponent .order-item-row{border-bottom:1px solid var(--ec-order-border, #e5e7eb);padding:.5rem 0}#orderEcComponent .order-item-row:last-child{border-bottom:0}#orderEcComponent .orderItemThumbWrap{display:flex;align-items:center}#orderEcComponent .orderItemThumb{width:96px!important;max-width:96px!important;height:96px!important;min-height:96px;object-fit:contain;display:block;border:1px solid var(--ec-order-border, #e5e7eb);border-radius:8px;background-color:#fff;padding:4px}#orderEcComponent .order-totals-card{border:1px solid var(--ec-order-border, #e5e7eb);border-radius:var(--ec-order-radius, 12px);background:var(--ec-order-surface, #ffffff);margin-top:.5rem}#orderEcComponent .order-totals-card .border-bottom{border-bottom-color:var(--ec-order-border, #e5e7eb)!important}.comment-truncated{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;white-space:normal;max-height:3em}#orderEcComponent .btvolver{color:var(--ec-order-btn-outline-color, #374151)!important;border-color:var(--ec-order-btn-outline-color, #374151)!important;background-color:#fff!important;font-weight:600;border-radius:var(--ec-order-btn-radius, 8px)!important}#orderEcComponent .btvolver:hover,#orderEcComponent .btvolver:focus{color:var(--ec-order-btn-primary-color, #ffffff)!important;background-color:var(--ec-order-btn-outline-color, #374151)!important;border-color:var(--ec-order-btn-outline-color, #374151)!important}#orderEcComponent .order-tracking-btn{margin-top:.35rem;border-radius:var(--ec-order-btn-radius)!important}#orderEcComponent .order-lots-btn{border-radius:var(--ec-order-btn-radius, 8px)!important;min-width:4.25rem}#orderEcComponent .order-lots-mobile-wrap{display:flex;justify-content:flex-start}#orderEcComponent .order-lots-mobile-btn{line-height:1.1;padding-left:.85rem;padding-right:.85rem}#orderEcComponent .order-lots-mobile-list{display:grid;gap:.75rem}#orderEcComponent .order-lots-mobile-card{border:1px solid var(--ec-order-border, #e5e7eb);border-radius:12px;background:#fff;padding:.85rem .9rem;box-shadow:0 1px #11182705}#orderEcComponent .order-lots-mobile-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;margin-bottom:.85rem}#orderEcComponent .order-lots-mobile-pill{display:inline-flex;align-items:center;justify-content:center;padding:.35rem .7rem;border-radius:999px;background:#0d6efd14;color:#0d6efd;font-weight:700;text-transform:capitalize;font-size:.8rem}#orderEcComponent .order-lots-mobile-total{color:var(--ec-order-text, #111827);font-size:.95rem;white-space:nowrap}#orderEcComponent .order-lots-mobile-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.65rem .9rem;margin:0}#orderEcComponent .order-lots-mobile-grid>div,#orderEcComponent .order-lots-mobile-full{min-width:0}#orderEcComponent .order-lots-mobile-grid dt{color:var(--ec-order-muted, #6b7280);font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;margin-bottom:.15rem}#orderEcComponent .order-lots-mobile-grid dd{margin-bottom:0;color:var(--ec-order-text, #111827);font-weight:600;word-break:break-word}#orderEcComponent .order-lots-mobile-full{grid-column:1/-1}@media (max-width: 991.98px){#orderEcComponent{padding-top:1rem!important;padding-left:.5rem;padding-right:.5rem}#orderEcComponent .container{padding-left:.25rem;padding-right:.25rem}#orderEcComponent .order-header{margin-left:0;margin-right:0}#orderEcComponent .order-header>[class*=col-]{padding-left:.25rem;padding-right:.25rem}#orderEcComponent .order-header{row-gap:.75rem}#orderEcComponent .order-meta-section{padding:.65rem}#orderEcComponent .order-meta-item{padding:.45rem 0;border-bottom:1px dashed var(--ec-order-border, #e5e7eb)}#orderEcComponent .order-meta-grid{margin-left:0;margin-right:0}#orderEcComponent .order-meta-grid>[class*=col-]{padding-left:0;padding-right:0}#orderEcComponent .order-meta-item:last-child{border-bottom:0}#orderEcComponent .orderItemThumb{width:72px!important;max-width:72px!important;height:72px!important;min-height:72px}#orderEcComponent .order-mobile-prices{margin-top:.35rem}#orderEcComponent .order-lots-mobile-wrap{margin-top:.5rem}#orderEcComponent .order-lots-mobile-grid{grid-template-columns:1fr}#orderEcComponent .order-totals-card{margin-top:1rem;padding-top:.5rem;padding-bottom:.5rem}}.modal-backdrop.fade.show{z-index:1050}.modal.fade.show.d-block{z-index:1055}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: EcCurrencySymbolPipe, name: "ecCurrencySymbol" }, { kind: "component", type: LoadingFullEcComponent, selector: "app-loading-full-ec" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: UpperCasePipe, name: "uppercase" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
149
149
  }
150
150
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OrderEcComponent, decorators: [{
151
151
  type: Component,
@@ -156,9 +156,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
156
156
  TitleCasePipe,
157
157
  UpperCasePipe,
158
158
  FormsModule,
159
- ], template: "<main class=\"py-5\" id=\"orderEcComponent\">\n <div class=\"container\">\n @if(order$ | async; as order) {\n <div class=\"wrap\">\n @if(order) {\n\n <div class=\"row justify-content-between order-header\">\n <div class=\"col-sm-auto col-12 font-brandon\">\n <h4 class=\"tit1 fw-bold order-title\">{{ ('order' | translate) + ': ' + order.number }}</h4>\n </div>\n @if(order?.invoice) {\n <div class=\"col-sm col-12 font-brandon\">\n <a target=\"_blank\" [href]=\"getUrlBase().slice(0, -1) + order.invoice\"\n class=\"btn btn-link btn-invoice\">\n <i class=\"fas fa-file-download me-1\"></i>\n {{ 'download' | translate }} {{ 'invoices' | translate | titlecase }}\n </a>\n </div>\n }\n <div class=\"col-auto text-end\">\n <button type=\"button\" (click)=\"back()\" class=\"btn btn-outline-dark btvolver border\">{{\n 'back-to-orders' | translate }}</button>\n </div>\n </div>\n\n <section id=\"orders\" class=\"order-meta-section\">\n <div class=\"row pt-2 order-meta-grid\">\n <div class=\"col-md-2 col-12 order-meta-item\">\n <p class=\"st\">{{ 'payment-state' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.payments[0].state | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'shipment-state' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.shipments[0].state | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'payment-method' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.payments[0]?.method?.name | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'shipment-method' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.shipments[0].method.name }}\n </p>\n @if(order.tracking) {\n <a [href]=\"order.tracking\"\n class=\"btn btn-outline-dark btnLogout px-3 py-1 font-size-10 w-auto btn-sm order-tracking-btn\">\n Ver seguimiento</a>\n }\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'date' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }}<br>\n {{ toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </p>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-md-2 col-12 font-brandon order-meta-item order-meta-total\">\n <p class=\"st\">{{ 'total' | translate }}:</p>\n <h5 class=\"fw-bold\">\n {{ (order.totals.total) | ecCurrencySymbol}}\n </h5>\n </div>\n }\n </div>\n </section>\n\n @if(!priceVisibility.hidePrices() && allowRepeatOrders) {\n <div class=\"text-end mt-3 order-repeat-wrap\">\n <button class=\"btn btn-primary mb-2 btnRepeatOrder order-action-primary\" (click)=\"repeatOrder()\">\n {{ 'repeat-order' | translate }}\n </button>\n </div>\n }\n\n <div class=\"container py-3 border-top border-bottom order-items-wrap\">\n @if(order.items.length) {\n <div class=\"row\">\n <div class=\"col-2 font-sm font-brandon d-none d-md-block\">\n {{ 'product' | translate | uppercase }}\n </div>\n <div class=\"col-4 font-sm font-brandon d-none d-md-block\">\n {{ 'description' | translate | uppercase }}\n </div>\n @if(channelConfig.applyOrderLot) {\n <div id=\"colLots\" class=\"col-1 font-sm font-brandon d-none d-md-block\">\n {{ 'lots' | translate | uppercase }}\n </div>\n }\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 text-center font-sm font-brandon d-none d-md-block\">\n {{ 'unit-price' | translate | uppercase }}\n </div>\n }\n <div class=\"col-1 text-center font-sm font-brandon d-none d-md-block\">\n {{ 'quantity' | translate | uppercase }}\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 text-end font-sm font-brandon d-none d-md-block\">\n {{ 'total' | translate | uppercase }}\n </div>\n }\n </div>\n }\n\n @for(item of order.items; track $index; let i = $index) {\n <div class=\"row cart-items order-item-row\">\n <div class=\"col-5 col-md-2 py-2 orderItemThumbWrap\">\n @if(item.product.variants[0]?.images?.length) {\n <img class=\"smc maxwidth img-fluid rounded-custom orderItemThumb\"\n [src]=\"mediaUrl() + item.product.variants[0].images[0]\" alt=\"\">\n } @else {\n @if(item.product.picturesdefault) {\n <img class=\"smc maxwidth img-fluid rounded-custom orderItemThumb\"\n [src]=\"mediaUrl() + item.product.picturesdefault[0]\" alt=\"\">\n }\n }\n </div>\n <div class=\"col-md-4 col-7 flex-column flex-md-row justify-content-start d-flex align-items-center\">\n <div class=\"w-100\">\n <p class=\"font-brandon d-flex w-100 mb-0\">\n {{ item.product.name }} (Cod:{{ item.product.variants[0].code }})\n </p>\n @if(enableFieldNotesInArticleFile && item?.comments) {\n <p class=\"comment-truncated fst-italic small text-muted mt-1 mb-0\">\"{{ item.comments }}\"</p>\n }\n @if(channelConfig.applyOrderLot) {\n <div class=\"d-md-none mt-2 order-lots-mobile-wrap\">\n <button type=\"button\" class=\"btn btn-primary btnSeguir m-0 text-center order-lots-btn order-lots-mobile-btn\"\n [attr.data-bs-toggle]=\"'collapse'\" [attr.data-bs-target]=\"'#collapseExample'+i\"\n aria-expanded=\"false\" [attr.aria-controls]=\"'collapseExample'+i\">\n {{ 'lots' | translate | uppercase }}\n </button>\n </div>\n }\n </div>\n </div>\n @if(channelConfig.applyOrderLot) {\n <div class=\"col-md-1 col-1 flex-column flex-md-row justify-content-start d-none d-md-flex align-items-center\">\n <input type=\"button\" class=\"btn btn-primary btnSeguir m-0 text-center order-lots-btn\"\n [attr.data-bs-toggle]=\"'collapse'\" [attr.data-bs-target]=\"'#collapseExample'+i\"\n aria-expanded=\"false\" [attr.aria-controls]=\"'collapseExample'+i\"\n value=\"{{ 'see' | translate | uppercase }}\">\n </div>\n }\n <div class=\"container d-md-none order-mobile-prices\">\n <div class=\"row\">\n <div class=\"col-4\">\n <p class=\"text-center w-100 m-0\"> {{ item.quantity }}</p>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-4 font-xl\">\n <p class=\"text-center w-100 m-0\"> {{ (item.product.variants[0].saleprice ?\n item.product.variants[0].saleprice : item.product.variants[0].price) |\n ecCurrencySymbol}}</p>\n </div>\n <div class=\"col-4 font-xl\">\n <p class=\"text-center w-100 m-0\"> {{ ((item.product.variants[0].saleprice ?\n item.product.variants[0].saleprice : item.product.variants[0].price) *\n item.quantity) | ecCurrencySymbol}}</p>\n </div>\n }\n </div>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 d-none d-md-flex align-items-center\">\n <p class=\"text-center w-100 m-0\">\n {{ (item.product.variants[0].saleprice ? item.product.variants[0].saleprice :\n item.product.variants[0].price) | ecCurrencySymbol}}\n </p>\n </div>\n }\n <div class=\"col-1 d-none d-md-flex align-items-center\">\n <p class=\"text-center w-100 m-0\"> {{ item.quantity }}</p>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 d-none d-md-flex align-items-center\">\n <p class=\"text-end w-100 m-0\">\n {{ ((item.product.variants[0].saleprice ? item.product.variants[0].saleprice :\n item.product.variants[0].price) * item.quantity) | ecCurrencySymbol}}</p>\n </div>\n }\n <div class=\"collapse\" [attr.id]=\"'collapseExample'+i\">\n <div class=\"card card-body\">\n <div class=\"d-none d-md-block\">\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">Estado</th>\n <th scope=\"col\">Cantidad</th>\n <th scope=\"col\">Fecha Solicitada</th>\n <th scope=\"col\">Fecha Estimada</th>\n <th scope=\"col\">Sede</th>\n <th scope=\"col\">Nota</th>\n <th scope=\"col\">Total Lote</th>\n </tr>\n </thead>\n <tbody>\n @for( lot of item.orderItemLot; track $index) {\n <tr>\n <th scope=\"row\">{{lot.id}}</th>\n <td>{{lot.lot_status}}</td>\n <td>{{lot.quantity}}</td>\n <td>{{ toDate(lot.date_request, 'DD/MM/YYYY') | translate }}</td>\n @if(lot.date_deliver) {\n <td>{{\n toDate(lot.date_deliver, 'DD/MM/YYYY') | translate }}</td>\n } @else {\n <td>Pendiente</td>\n }\n <td>{{lot.shipping_address_name}}</td>\n <td>{{lot.notes}}</td>\n <td>{{lot.total_lot | ecCurrencySymbol}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n <div class=\"d-md-none order-lots-mobile-list\">\n @for( lot of item.orderItemLot; track $index) {\n <article class=\"order-lots-mobile-card\">\n <div class=\"order-lots-mobile-card-head\">\n <span class=\"order-lots-mobile-pill\">{{ lot.lot_status | titlecase }}</span>\n <strong class=\"order-lots-mobile-total\">{{ lot.total_lot | ecCurrencySymbol }}</strong>\n </div>\n <dl class=\"order-lots-mobile-grid\">\n <div>\n <dt>#</dt>\n <dd>{{ lot.id }}</dd>\n </div>\n <div>\n <dt>Estado</dt>\n <dd>{{ lot.lot_status | titlecase }}</dd>\n </div>\n <div>\n <dt>Cantidad</dt>\n <dd>{{ lot.quantity }}</dd>\n </div>\n <div>\n <dt>Fecha solicitada</dt>\n <dd>{{ toDate(lot.date_request, 'DD/MM/YYYY') | translate }}</dd>\n </div>\n <div>\n <dt>Fecha estimada</dt>\n <dd>\n @if(lot.date_deliver) {\n {{ toDate(lot.date_deliver, 'DD/MM/YYYY') | translate }}\n } @else {\n Pendiente\n }\n </dd>\n </div>\n <div class=\"order-lots-mobile-full\">\n <dt>Sede</dt>\n <dd>{{ lot.shipping_address_name }}</dd>\n </div>\n <div class=\"order-lots-mobile-full\">\n <dt>Nota</dt>\n <dd>{{ lot.notes || '\u2014' }}</dd>\n </div>\n </dl>\n </article>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <div class=\"container order-totals-wrap\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\"></div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-12 col-md-6\">\n <div class=\"row py-4 order-totals-card\">\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'total-products' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.items) | ecCurrencySymbol }}\n </div>\n\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'shipment' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.shipping || '0') | ecCurrencySymbol }}\n </div>\n\n @if(!hideDiscounts && order.totals.promotion && order.totals.promotion != 0) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'discount' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end text-end\">\n {{ (order.totals.promotion) | ecCurrencySymbol }}</div>\n }\n\n @if(order.totals.taxes && order.totals.taxes != 0 ) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'taxes' | translate }}\n </div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.taxes) | ecCurrencySymbol }}</div>\n }\n\n @if(!hideTaxes && order.totals.refunds) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{\n (order.totals.refunds.refundReason) | titlecase }}\n </div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (- order.totals.refunds.refundTotal) | ecCurrencySymbol }}</div>\n }\n\n @if (order.totals.refunds) {\n <div class=\"col-6 font-brandon font-md\">{{ 'total' | translate | uppercase }}</div>\n <div class=\"col-6 font-brandon font-md text-end\">\n {{ (order.totals.refunds.totalAfterRefund) | ecCurrencySymbol }}\n </div>\n } @else{\n <div class=\"col-6 font-brandon font-md\">{{ 'total' | translate | uppercase }}</div>\n <div class=\"col-6 font-brandon font-md text-end\">\n {{ (order.totals.total) | ecCurrencySymbol }}\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n @if(showDocumentsModal) {\n <div class=\"modal-backdrop fade show\" (click)=\"closeDocumentsModal()\"></div>\n <div class=\"modal fade show d-block\" tabindex=\"-1\">\n <div class=\"modal-dialog modal-dialog-centered\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title font-brandon\">Documentos</h5>\n <button type=\"button\" class=\"btn-close\" (click)=\"closeDocumentsModal()\"></button>\n </div>\n <div class=\"modal-body\">\n @for(document of order.documents; track $index) {\n <div class=\"mb-2\">\n <a target=\"_blank\" [href]=\"getUrlBase().slice(0, -1) + document.path\"\n class=\"btn btn-link p-0\">\n <i class=\"fas fa-file-download me-2\"></i>\n {{ document.typeLabel }}\n &mdash; {{ 'download' | translate }}\n </a>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if(orderDocumentsVisibility.showOrderDocuments() && orderObj?.tokenValue) {\n <div class=\"container mt-4\">\n <div class=\"row\">\n <div class=\"col-12\">\n <h5 class=\"font-brandon fw-semibold mb-3\">{{ 'order.documents.title' | translate }}</h5>\n\n @if(orderDocsLoading) {\n <div class=\"text-center py-3\">\n <div class=\"spinner-border spinner-border-sm text-secondary\" role=\"status\"></div>\n </div>\n } @else {\n\n @if(orderDocuments.length > 0) {\n <div class=\"mb-3\">\n @for(doc of orderDocuments; track doc.id) {\n <div class=\"d-flex align-items-center gap-2 py-2 border-bottom\">\n <i class=\"bi bi-file-earmark text-muted\"></i>\n <span class=\"flex-grow-1 small\">\n {{ doc.fileName }}\n @if(doc.typeLabel) {\n <span class=\"badge bg-secondary ms-1 small\">{{ doc.typeLabel }}</span>\n }\n </span>\n <a [href]=\"orderDocDownloadUrl(doc.fileName)\" target=\"_blank\" rel=\"noopener\"\n class=\"btn btn-link btn-sm p-0\">\n <i class=\"bi bi-download\"></i>\n </a>\n </div>\n }\n </div>\n } @else {\n <p class=\"text-muted small mb-3\">{{ 'order.documents.empty' | translate }}</p>\n }\n\n <div class=\"row g-2\">\n\n <div class=\"col-12 col-sm-5\">\n <label class=\"form-label form-label-sm\">{{ 'order.documents.file' | translate }}</label>\n <input #orderFileInput type=\"file\" class=\"form-control form-control-sm\"\n accept=\".pdf,.jpg,.jpeg,.png\" (change)=\"onOrderFileSelected($event)\">\n <div class=\"form-text mt-1\" style=\"font-size: 0.75rem; line-height: 1;\">\n {{ 'user-portal.documents.allowed-formats' | translate }}: .pdf, .jpg, .jpeg, .png\n </div>\n </div>\n\n <div class=\"col-12 col-sm-4\">\n <label class=\"form-label form-label-sm\">{{ 'order.documents.type' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"orderDocSelectedType\">\n <option value=\"proof_of_payment_type\">{{ 'order.documents.type-payment-receipt' |\n translate }}</option>\n <option value=\"other\">{{ 'order.documents.type-other' | translate }}</option>\n </select>\n </div>\n\n <div class=\"col-12 col-sm-3 d-flex flex-column\">\n <label class=\"form-label form-label-sm d-none d-sm-block invisible\">Spacer</label>\n <button type=\"button\" class=\"btn btn-outline-dark btn-sm w-100 mt-auto\"\n style=\"margin-bottom: 1.1rem;\"\n [disabled]=\"!orderDocSelectedFile || orderDocsUploading\"\n (click)=\"uploadOrderDocument()\">\n @if(orderDocsUploading) {\n <span class=\"spinner-border spinner-border-sm me-1\"></span>\n } @else {\n <i class=\"bi bi-upload me-1\"></i>\n }\n {{ 'order.documents.upload' | translate }}\n </button>\n </div>\n\n @if(orderDocUploadError) {\n <div class=\"col-12\">\n <div class=\"alert alert-danger py-2 small mb-0\">{{ orderDocUploadError }}</div>\n </div>\n }\n </div>\n\n }\n </div>\n </div>\n </div>\n }\n\n } @else {\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n }\n </div>\n\n } @else {\n <div class=\"w-100 h-50 py-5\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n }\n </div>\n</main>\n", styles: ["#orderEcComponent{background:var(--ec-order-bg, #ffffff)}#orderEcComponent .order-header{margin-bottom:.5rem}#orderEcComponent .order-title{color:var(--ec-order-text);letter-spacing:.02em}#orderEcComponent .order-meta-section{background:var(--ec-order-surface, #ffffff);border:1px solid var(--ec-order-border, #e5e7eb);border-radius:var(--ec-order-radius, 12px);padding:.75rem}#orderEcComponent .order-meta-item{margin-bottom:.5rem}#orderEcComponent .order-meta-item .st{color:var(--ec-order-muted, #6b7280);margin-bottom:.35rem}#orderEcComponent .order-meta-value{color:var(--ec-order-text, #111827);font-weight:600;margin-bottom:0}#orderEcComponent .order-meta-total h5{color:var(--ec-order-accent, #374151)}#orderEcComponent .order-repeat-wrap{margin-top:.75rem!important}#orderEcComponent .order-action-primary,#orderEcComponent .btnRepeatOrder{background:var(--ec-order-btn-primary-bg, #374151)!important;border-color:var(--ec-order-btn-primary-bg, #374151)!important;color:var(--ec-order-btn-primary-color, #ffffff)!important;border-radius:var(--ec-order-btn-radius, 8px)!important}#orderEcComponent .order-items-wrap{border-color:var(--ec-order-border, #e5e7eb)!important}#orderEcComponent .order-item-row{border-bottom:1px solid var(--ec-order-border, #e5e7eb);padding:.5rem 0}#orderEcComponent .order-item-row:last-child{border-bottom:0}#orderEcComponent .orderItemThumbWrap{display:flex;align-items:center}#orderEcComponent .orderItemThumb{width:96px!important;max-width:96px!important;height:96px!important;min-height:96px;object-fit:contain;display:block;border:1px solid var(--ec-order-border, #e5e7eb);border-radius:8px;background-color:#fff;padding:4px}#orderEcComponent .order-totals-card{border:1px solid var(--ec-order-border, #e5e7eb);border-radius:var(--ec-order-radius, 12px);background:var(--ec-order-surface, #ffffff);margin-top:.5rem}#orderEcComponent .order-totals-card .border-bottom{border-bottom-color:var(--ec-order-border, #e5e7eb)!important}.comment-truncated{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;white-space:normal;max-height:3em}#orderEcComponent .btvolver{color:var(--ec-order-btn-outline-color, #374151)!important;border-color:var(--ec-order-btn-outline-color, #374151)!important;background-color:#fff!important;font-weight:600;border-radius:var(--ec-order-btn-radius, 8px)!important}#orderEcComponent .btvolver:hover,#orderEcComponent .btvolver:focus{color:var(--ec-order-btn-primary-color, #ffffff)!important;background-color:var(--ec-order-btn-outline-color, #374151)!important;border-color:var(--ec-order-btn-outline-color, #374151)!important}#orderEcComponent .order-tracking-btn{margin-top:.35rem;border-radius:var(--ec-order-btn-radius)!important}#orderEcComponent .order-lots-btn{border-radius:var(--ec-order-btn-radius, 8px)!important;min-width:4.25rem}#orderEcComponent .order-lots-mobile-wrap{display:flex;justify-content:flex-start}#orderEcComponent .order-lots-mobile-btn{line-height:1.1;padding-left:.85rem;padding-right:.85rem}#orderEcComponent .order-lots-mobile-list{display:grid;gap:.75rem}#orderEcComponent .order-lots-mobile-card{border:1px solid var(--ec-order-border, #e5e7eb);border-radius:12px;background:#fff;padding:.85rem .9rem;box-shadow:0 1px #11182705}#orderEcComponent .order-lots-mobile-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;margin-bottom:.85rem}#orderEcComponent .order-lots-mobile-pill{display:inline-flex;align-items:center;justify-content:center;padding:.35rem .7rem;border-radius:999px;background:#0d6efd14;color:#0d6efd;font-weight:700;text-transform:capitalize;font-size:.8rem}#orderEcComponent .order-lots-mobile-total{color:var(--ec-order-text, #111827);font-size:.95rem;white-space:nowrap}#orderEcComponent .order-lots-mobile-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.65rem .9rem;margin:0}#orderEcComponent .order-lots-mobile-grid>div,#orderEcComponent .order-lots-mobile-full{min-width:0}#orderEcComponent .order-lots-mobile-grid dt{color:var(--ec-order-muted, #6b7280);font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;margin-bottom:.15rem}#orderEcComponent .order-lots-mobile-grid dd{margin-bottom:0;color:var(--ec-order-text, #111827);font-weight:600;word-break:break-word}#orderEcComponent .order-lots-mobile-full{grid-column:1/-1}@media (max-width: 991.98px){#orderEcComponent{padding-top:1rem!important;padding-left:.5rem;padding-right:.5rem}#orderEcComponent .container{padding-left:.25rem;padding-right:.25rem}#orderEcComponent .order-header{margin-left:0;margin-right:0}#orderEcComponent .order-header>[class*=col-]{padding-left:.25rem;padding-right:.25rem}#orderEcComponent .order-header{row-gap:.75rem}#orderEcComponent .order-meta-section{padding:.65rem}#orderEcComponent .order-meta-item{padding:.45rem 0;border-bottom:1px dashed var(--ec-order-border, #e5e7eb)}#orderEcComponent .order-meta-grid{margin-left:0;margin-right:0}#orderEcComponent .order-meta-grid>[class*=col-]{padding-left:0;padding-right:0}#orderEcComponent .order-meta-item:last-child{border-bottom:0}#orderEcComponent .orderItemThumb{width:72px!important;max-width:72px!important;height:72px!important;min-height:72px}#orderEcComponent .order-mobile-prices{margin-top:.35rem}#orderEcComponent .order-lots-mobile-wrap{margin-top:.5rem}#orderEcComponent .order-lots-mobile-grid{grid-template-columns:1fr}#orderEcComponent .order-totals-card{margin-top:1rem;padding-top:.5rem;padding-bottom:.5rem}}.modal-backdrop.fade.show{z-index:1050}.modal.fade.show.d-block{z-index:1055}\n"] }]
159
+ ], template: "<main class=\"py-5\" id=\"orderEcComponent\">\n <div class=\"container\">\n @if(order$ | async; as order) {\n <div class=\"wrap\">\n @if(order) {\n\n <div class=\"row justify-content-between order-header\">\n <div class=\"col-sm-auto col-12 font-brandon\">\n <h4 class=\"tit1 fw-bold order-title\">{{ ('order' | translate) + ': ' + order.number }}</h4>\n </div>\n @if(order?.invoice) {\n <div class=\"col-sm col-12 font-brandon\">\n <a target=\"_blank\" [href]=\"getUrlBase().slice(0, -1) + order.invoice\"\n class=\"btn btn-link btn-invoice\">\n <i class=\"fas fa-file-download me-1\"></i>\n {{ 'download' | translate }} {{ 'invoices' | translate | titlecase }}\n </a>\n </div>\n }\n <div class=\"col-auto text-end\">\n <button type=\"button\" (click)=\"back()\" class=\"btn btn-outline-dark btvolver border\">{{\n 'back-to-orders' | translate }}</button>\n </div>\n </div>\n\n <section id=\"orders\" class=\"order-meta-section\">\n <div class=\"row pt-2 order-meta-grid\">\n <div class=\"col-md-2 col-12 order-meta-item\">\n <p class=\"st\">{{ 'payment-state' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.payments[0].state | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'shipment-state' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.shipments[0].state | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'payment-method' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.payments[0]?.method?.name | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'shipment-method' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ order.shipments[0].method.name }}\n </p>\n @if(order.tracking) {\n <a [href]=\"order.tracking\"\n class=\"btn btn-outline-dark btnLogout px-3 py-1 font-size-10 w-auto btn-sm order-tracking-btn\">\n Ver seguimiento</a>\n }\n </div>\n <div class=\"col-md-2 col-12 font-brandon order-meta-item\">\n <p class=\"st\">{{ 'date' | translate }}:</p>\n <p class=\"order-meta-value\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }}<br>\n {{ toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </p>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-md-2 col-12 font-brandon order-meta-item order-meta-total\">\n <p class=\"st\">{{ 'total' | translate }}:</p>\n <h5 class=\"fw-bold\">\n {{ (order.totals.total) | ecCurrencySymbol}}\n </h5>\n </div>\n }\n </div>\n </section>\n\n @if(!priceVisibility.hidePrices() && allowRepeatOrders) {\n <div class=\"text-end mt-3 order-repeat-wrap\">\n <button class=\"btn btn-primary mb-2 btnRepeatOrder order-action-primary\" (click)=\"repeatOrder()\">\n {{ 'repeat-order' | translate }}\n </button>\n </div>\n }\n\n <div class=\"container py-3 border-top border-bottom order-items-wrap\">\n @if(order.items.length) {\n <div class=\"row\">\n <div class=\"col-2 font-sm font-brandon d-none d-md-block\">\n {{ 'product' | translate | uppercase }}\n </div>\n <div class=\"col-4 font-sm font-brandon d-none d-md-block\">\n {{ 'description' | translate | uppercase }}\n </div>\n @if(channelConfig.applyOrderLot) {\n <div id=\"colLots\" class=\"col-1 font-sm font-brandon d-none d-md-block\">\n {{ 'lots' | translate | uppercase }}\n </div>\n }\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 text-center font-sm font-brandon d-none d-md-block\">\n {{ 'unit-price' | translate | uppercase }}\n </div>\n }\n <div class=\"col-1 text-center font-sm font-brandon d-none d-md-block\">\n {{ 'quantity' | translate | uppercase }}\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 text-end font-sm font-brandon d-none d-md-block\">\n {{ 'total' | translate | uppercase }}\n </div>\n }\n </div>\n }\n\n @for(item of order.items; track $index; let i = $index) {\n <div class=\"row cart-items order-item-row\">\n <div class=\"col-5 col-md-2 py-2 orderItemThumbWrap\">\n @if(item.product.variants[0]?.images?.length) {\n <img class=\"smc maxwidth img-fluid rounded-custom orderItemThumb\"\n [src]=\"mediaUrl() + item.product.variants[0].images[0]\" alt=\"\">\n } @else {\n @if(item.product.picturesdefault) {\n <img class=\"smc maxwidth img-fluid rounded-custom orderItemThumb\"\n [src]=\"mediaUrl() + item.product.picturesdefault[0]\" alt=\"\">\n }\n }\n </div>\n <div class=\"col-md-4 col-7 flex-column flex-md-row justify-content-start d-flex align-items-center\">\n <div class=\"w-100\">\n <p class=\"font-brandon d-flex w-100 mb-0\">\n {{ item.product.name }} (Cod:{{ item.product.variants[0].code }})\n </p>\n @if(enableFieldNotesInArticleFile && item?.comments) {\n <p class=\"comment-truncated fst-italic small text-muted mt-1 mb-0\">\"{{ item.comments }}\"</p>\n }\n @if(channelConfig.applyOrderLot) {\n <div class=\"d-md-none mt-2 order-lots-mobile-wrap\">\n <button type=\"button\" class=\"btn btn-primary btnSeguir m-0 text-center order-lots-btn order-lots-mobile-btn\"\n [attr.data-bs-toggle]=\"'collapse'\" [attr.data-bs-target]=\"'#collapseExample'+i\"\n aria-expanded=\"false\" [attr.aria-controls]=\"'collapseExample'+i\">\n {{ 'lots' | translate | uppercase }}\n </button>\n </div>\n }\n </div>\n </div>\n @if(channelConfig.applyOrderLot) {\n <div class=\"col-md-1 col-1 flex-column flex-md-row justify-content-start d-none d-md-flex align-items-center\">\n <input type=\"button\" class=\"btn btn-primary btnSeguir m-0 text-center order-lots-btn\"\n [attr.data-bs-toggle]=\"'collapse'\" [attr.data-bs-target]=\"'#collapseExample'+i\"\n aria-expanded=\"false\" [attr.aria-controls]=\"'collapseExample'+i\"\n value=\"{{ 'see' | translate | uppercase }}\">\n </div>\n }\n <div class=\"container d-md-none order-mobile-prices\">\n <div class=\"row\">\n <div class=\"col-4\">\n <p class=\"text-center w-100 m-0\"> {{ item.quantity }}</p>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-4 font-xl\">\n <p class=\"text-center w-100 m-0\"> {{ (item.product.variants[0].saleprice ?\n item.product.variants[0].saleprice : item.product.variants[0].price) |\n ecCurrencySymbol}}</p>\n </div>\n <div class=\"col-4 font-xl\">\n <p class=\"text-center w-100 m-0\"> {{ ((item.product.variants[0].saleprice ?\n item.product.variants[0].saleprice : item.product.variants[0].price) *\n item.quantity) | ecCurrencySymbol}}</p>\n </div>\n }\n </div>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 d-none d-md-flex align-items-center\">\n <p class=\"text-center w-100 m-0\">\n {{ (item.product.variants[0].saleprice ? item.product.variants[0].saleprice :\n item.product.variants[0].price) | ecCurrencySymbol}}\n </p>\n </div>\n }\n <div class=\"col-1 d-none d-md-flex align-items-center\">\n <p class=\"text-center w-100 m-0\"> {{ item.quantity }}</p>\n </div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-2 d-none d-md-flex align-items-center\">\n <p class=\"text-end w-100 m-0\">\n {{ ((item.product.variants[0].saleprice ? item.product.variants[0].saleprice :\n item.product.variants[0].price) * item.quantity) | ecCurrencySymbol}}</p>\n </div>\n }\n <div class=\"collapse\" [attr.id]=\"'collapseExample'+i\">\n <div class=\"card card-body\">\n <div class=\"d-none d-md-block\">\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">Estado</th>\n <th scope=\"col\">Cantidad</th>\n <th scope=\"col\">Fecha Solicitada</th>\n <th scope=\"col\">Fecha Estimada</th>\n <th scope=\"col\">Sede</th>\n <th scope=\"col\">Nota</th>\n <th scope=\"col\">Total Lote</th>\n </tr>\n </thead>\n <tbody>\n @for( lot of item.orderItemLot; track $index) {\n <tr>\n <th scope=\"row\">{{lot.id}}</th>\n <td>{{lot.lot_status}}</td>\n <td>{{lot.quantity}}</td>\n <td>{{ toDate(lot.date_request, 'DD/MM/YYYY') | translate }}</td>\n @if(lot.date_deliver) {\n <td>{{\n toDate(lot.date_deliver, 'DD/MM/YYYY') | translate }}</td>\n } @else {\n <td>Pendiente</td>\n }\n <td>{{lot.shipping_address_name}}</td>\n <td>{{lot.notes}}</td>\n <td>{{lot.total_lot | ecCurrencySymbol}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n <div class=\"d-md-none order-lots-mobile-list\">\n @for( lot of item.orderItemLot; track $index) {\n <article class=\"order-lots-mobile-card\">\n <div class=\"order-lots-mobile-card-head\">\n <span class=\"order-lots-mobile-pill\">{{ lot.lot_status | titlecase }}</span>\n <strong class=\"order-lots-mobile-total\">{{ lot.total_lot | ecCurrencySymbol }}</strong>\n </div>\n <dl class=\"order-lots-mobile-grid\">\n <div>\n <dt>#</dt>\n <dd>{{ lot.id }}</dd>\n </div>\n <div>\n <dt>Estado</dt>\n <dd>{{ lot.lot_status | titlecase }}</dd>\n </div>\n <div>\n <dt>Cantidad</dt>\n <dd>{{ lot.quantity }}</dd>\n </div>\n <div>\n <dt>Fecha solicitada</dt>\n <dd>{{ toDate(lot.date_request, 'DD/MM/YYYY') | translate }}</dd>\n </div>\n <div>\n <dt>Fecha estimada</dt>\n <dd>\n @if(lot.date_deliver) {\n {{ toDate(lot.date_deliver, 'DD/MM/YYYY') | translate }}\n } @else {\n Pendiente\n }\n </dd>\n </div>\n <div class=\"order-lots-mobile-full\">\n <dt>Sede</dt>\n <dd>{{ lot.shipping_address_name }}</dd>\n </div>\n <div class=\"order-lots-mobile-full\">\n <dt>Nota</dt>\n <dd>{{ lot.notes || '\u2014' }}</dd>\n </div>\n </dl>\n </article>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <div class=\"container order-totals-wrap\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\"></div>\n @if(priceVisibility.canShowPrices()) {\n <div class=\"col-12 col-md-6\">\n <div class=\"row py-4 order-totals-card\">\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'total-products' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.items) | ecCurrencySymbol }}\n </div>\n\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'shipment' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.shipping || '0') | ecCurrencySymbol }}\n </div>\n\n @if(!hideDiscounts && order.totals.promotion && order.totals.promotion != 0) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'discount' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end text-end\">\n {{ (order.totals.promotion) | ecCurrencySymbol }}</div>\n }\n\n @if(order.totals.paymentMethodAdjustment !== null && order.totals.paymentMethodAdjustment !== undefined && order.totals.paymentMethodAdjustment != 0) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ (order.totals.paymentMethodAdjustment < 0 ? 'payment-method-discount' : 'payment-method-surcharge') | translate }}@if(order.totals.paymentMethodAdjustmentLabel){ \u00B7 {{ order.totals.paymentMethodAdjustmentLabel }}}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">{{ order.totals.paymentMethodAdjustment | ecCurrencySymbol }}</div>\n }\n\n @if(order.totals.taxes && order.totals.taxes != 0 ) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'taxes' | translate }}\n </div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.taxes) | ecCurrencySymbol }}</div>\n }\n\n @if(!hideTaxes && order.totals.refunds) {\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{\n (order.totals.refunds.refundReason) | titlecase }}\n </div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (- order.totals.refunds.refundTotal) | ecCurrencySymbol }}</div>\n }\n\n @if (order.totals.refunds) {\n <div class=\"col-6 font-brandon font-md\">{{ 'total' | translate | uppercase }}</div>\n <div class=\"col-6 font-brandon font-md text-end\">\n {{ (order.totals.refunds.totalAfterRefund) | ecCurrencySymbol }}\n </div>\n } @else{\n <div class=\"col-6 font-brandon font-md\">{{ 'total' | translate | uppercase }}</div>\n <div class=\"col-6 font-brandon font-md text-end\">\n {{ (order.totals.total) | ecCurrencySymbol }}\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n @if(showDocumentsModal) {\n <div class=\"modal-backdrop fade show\" (click)=\"closeDocumentsModal()\"></div>\n <div class=\"modal fade show d-block\" tabindex=\"-1\">\n <div class=\"modal-dialog modal-dialog-centered\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title font-brandon\">Documentos</h5>\n <button type=\"button\" class=\"btn-close\" (click)=\"closeDocumentsModal()\"></button>\n </div>\n <div class=\"modal-body\">\n @for(document of order.documents; track $index) {\n <div class=\"mb-2\">\n <a target=\"_blank\" [href]=\"getUrlBase().slice(0, -1) + document.path\"\n class=\"btn btn-link p-0\">\n <i class=\"fas fa-file-download me-2\"></i>\n {{ document.typeLabel }}\n &mdash; {{ 'download' | translate }}\n </a>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if(orderDocumentsVisibility.showOrderDocuments() && orderObj?.tokenValue) {\n <div class=\"container mt-4\">\n <div class=\"row\">\n <div class=\"col-12\">\n <h5 class=\"font-brandon fw-semibold mb-3\">{{ 'order.documents.title' | translate }}</h5>\n\n @if(orderDocsLoading) {\n <div class=\"text-center py-3\">\n <div class=\"spinner-border spinner-border-sm text-secondary\" role=\"status\"></div>\n </div>\n } @else {\n\n @if(orderDocuments.length > 0) {\n <div class=\"mb-3\">\n @for(doc of orderDocuments; track doc.id) {\n <div class=\"d-flex align-items-center gap-2 py-2 border-bottom\">\n <i class=\"bi bi-file-earmark text-muted\"></i>\n <span class=\"flex-grow-1 small\">\n {{ doc.fileName }}\n @if(doc.typeLabel) {\n <span class=\"badge bg-secondary ms-1 small\">{{ doc.typeLabel }}</span>\n }\n </span>\n <a [href]=\"orderDocDownloadUrl(doc.fileName)\" target=\"_blank\" rel=\"noopener\"\n class=\"btn btn-link btn-sm p-0\">\n <i class=\"bi bi-download\"></i>\n </a>\n </div>\n }\n </div>\n } @else {\n <p class=\"text-muted small mb-3\">{{ 'order.documents.empty' | translate }}</p>\n }\n\n <div class=\"row g-2\">\n\n <div class=\"col-12 col-sm-5\">\n <label class=\"form-label form-label-sm\">{{ 'order.documents.file' | translate }}</label>\n <input #orderFileInput type=\"file\" class=\"form-control form-control-sm\"\n accept=\".pdf,.jpg,.jpeg,.png\" (change)=\"onOrderFileSelected($event)\">\n <div class=\"form-text mt-1\" style=\"font-size: 0.75rem; line-height: 1;\">\n {{ 'user-portal.documents.allowed-formats' | translate }}: .pdf, .jpg, .jpeg, .png\n </div>\n </div>\n\n <div class=\"col-12 col-sm-4\">\n <label class=\"form-label form-label-sm\">{{ 'order.documents.type' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"orderDocSelectedType\">\n <option value=\"proof_of_payment_type\">{{ 'order.documents.type-payment-receipt' |\n translate }}</option>\n <option value=\"other\">{{ 'order.documents.type-other' | translate }}</option>\n </select>\n </div>\n\n <div class=\"col-12 col-sm-3 d-flex flex-column\">\n <label class=\"form-label form-label-sm d-none d-sm-block invisible\">Spacer</label>\n <button type=\"button\" class=\"btn btn-outline-dark btn-sm w-100 mt-auto\"\n style=\"margin-bottom: 1.1rem;\"\n [disabled]=\"!orderDocSelectedFile || orderDocsUploading\"\n (click)=\"uploadOrderDocument()\">\n @if(orderDocsUploading) {\n <span class=\"spinner-border spinner-border-sm me-1\"></span>\n } @else {\n <i class=\"bi bi-upload me-1\"></i>\n }\n {{ 'order.documents.upload' | translate }}\n </button>\n </div>\n\n @if(orderDocUploadError) {\n <div class=\"col-12\">\n <div class=\"alert alert-danger py-2 small mb-0\">{{ orderDocUploadError }}</div>\n </div>\n }\n </div>\n\n }\n </div>\n </div>\n </div>\n }\n\n } @else {\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n }\n </div>\n\n } @else {\n <div class=\"w-100 h-50 py-5\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n }\n </div>\n</main>\n", styles: ["#orderEcComponent{background:var(--ec-order-bg, #ffffff)}#orderEcComponent .order-header{margin-bottom:.5rem}#orderEcComponent .order-title{color:var(--ec-order-text);letter-spacing:.02em}#orderEcComponent .order-meta-section{background:var(--ec-order-surface, #ffffff);border:1px solid var(--ec-order-border, #e5e7eb);border-radius:var(--ec-order-radius, 12px);padding:.75rem}#orderEcComponent .order-meta-item{margin-bottom:.5rem}#orderEcComponent .order-meta-item .st{color:var(--ec-order-muted, #6b7280);margin-bottom:.35rem}#orderEcComponent .order-meta-value{color:var(--ec-order-text, #111827);font-weight:600;margin-bottom:0}#orderEcComponent .order-meta-total h5{color:var(--ec-order-accent, #374151)}#orderEcComponent .order-repeat-wrap{margin-top:.75rem!important}#orderEcComponent .order-action-primary,#orderEcComponent .btnRepeatOrder{background:var(--ec-order-btn-primary-bg, #374151)!important;border-color:var(--ec-order-btn-primary-bg, #374151)!important;color:var(--ec-order-btn-primary-color, #ffffff)!important;border-radius:var(--ec-order-btn-radius, 8px)!important}#orderEcComponent .order-items-wrap{border-color:var(--ec-order-border, #e5e7eb)!important}#orderEcComponent .order-item-row{border-bottom:1px solid var(--ec-order-border, #e5e7eb);padding:.5rem 0}#orderEcComponent .order-item-row:last-child{border-bottom:0}#orderEcComponent .orderItemThumbWrap{display:flex;align-items:center}#orderEcComponent .orderItemThumb{width:96px!important;max-width:96px!important;height:96px!important;min-height:96px;object-fit:contain;display:block;border:1px solid var(--ec-order-border, #e5e7eb);border-radius:8px;background-color:#fff;padding:4px}#orderEcComponent .order-totals-card{border:1px solid var(--ec-order-border, #e5e7eb);border-radius:var(--ec-order-radius, 12px);background:var(--ec-order-surface, #ffffff);margin-top:.5rem}#orderEcComponent .order-totals-card .border-bottom{border-bottom-color:var(--ec-order-border, #e5e7eb)!important}.comment-truncated{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;white-space:normal;max-height:3em}#orderEcComponent .btvolver{color:var(--ec-order-btn-outline-color, #374151)!important;border-color:var(--ec-order-btn-outline-color, #374151)!important;background-color:#fff!important;font-weight:600;border-radius:var(--ec-order-btn-radius, 8px)!important}#orderEcComponent .btvolver:hover,#orderEcComponent .btvolver:focus{color:var(--ec-order-btn-primary-color, #ffffff)!important;background-color:var(--ec-order-btn-outline-color, #374151)!important;border-color:var(--ec-order-btn-outline-color, #374151)!important}#orderEcComponent .order-tracking-btn{margin-top:.35rem;border-radius:var(--ec-order-btn-radius)!important}#orderEcComponent .order-lots-btn{border-radius:var(--ec-order-btn-radius, 8px)!important;min-width:4.25rem}#orderEcComponent .order-lots-mobile-wrap{display:flex;justify-content:flex-start}#orderEcComponent .order-lots-mobile-btn{line-height:1.1;padding-left:.85rem;padding-right:.85rem}#orderEcComponent .order-lots-mobile-list{display:grid;gap:.75rem}#orderEcComponent .order-lots-mobile-card{border:1px solid var(--ec-order-border, #e5e7eb);border-radius:12px;background:#fff;padding:.85rem .9rem;box-shadow:0 1px #11182705}#orderEcComponent .order-lots-mobile-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;margin-bottom:.85rem}#orderEcComponent .order-lots-mobile-pill{display:inline-flex;align-items:center;justify-content:center;padding:.35rem .7rem;border-radius:999px;background:#0d6efd14;color:#0d6efd;font-weight:700;text-transform:capitalize;font-size:.8rem}#orderEcComponent .order-lots-mobile-total{color:var(--ec-order-text, #111827);font-size:.95rem;white-space:nowrap}#orderEcComponent .order-lots-mobile-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.65rem .9rem;margin:0}#orderEcComponent .order-lots-mobile-grid>div,#orderEcComponent .order-lots-mobile-full{min-width:0}#orderEcComponent .order-lots-mobile-grid dt{color:var(--ec-order-muted, #6b7280);font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;margin-bottom:.15rem}#orderEcComponent .order-lots-mobile-grid dd{margin-bottom:0;color:var(--ec-order-text, #111827);font-weight:600;word-break:break-word}#orderEcComponent .order-lots-mobile-full{grid-column:1/-1}@media (max-width: 991.98px){#orderEcComponent{padding-top:1rem!important;padding-left:.5rem;padding-right:.5rem}#orderEcComponent .container{padding-left:.25rem;padding-right:.25rem}#orderEcComponent .order-header{margin-left:0;margin-right:0}#orderEcComponent .order-header>[class*=col-]{padding-left:.25rem;padding-right:.25rem}#orderEcComponent .order-header{row-gap:.75rem}#orderEcComponent .order-meta-section{padding:.65rem}#orderEcComponent .order-meta-item{padding:.45rem 0;border-bottom:1px dashed var(--ec-order-border, #e5e7eb)}#orderEcComponent .order-meta-grid{margin-left:0;margin-right:0}#orderEcComponent .order-meta-grid>[class*=col-]{padding-left:0;padding-right:0}#orderEcComponent .order-meta-item:last-child{border-bottom:0}#orderEcComponent .orderItemThumb{width:72px!important;max-width:72px!important;height:72px!important;min-height:72px}#orderEcComponent .order-mobile-prices{margin-top:.35rem}#orderEcComponent .order-lots-mobile-wrap{margin-top:.5rem}#orderEcComponent .order-lots-mobile-grid{grid-template-columns:1fr}#orderEcComponent .order-totals-card{margin-top:1rem;padding-top:.5rem;padding-bottom:.5rem}}.modal-backdrop.fade.show{z-index:1050}.modal.fade.show.d-block{z-index:1055}\n"] }]
160
160
  }], propDecorators: { orderFileInput: [{
161
161
  type: ViewChild,
162
162
  args: ['orderFileInput']
163
163
  }] } });
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvYWNjb3VudC1lYy9vcmRlci1lYy9vcmRlci1lYy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy9hY2NvdW50LWVjL29yZGVyLWVjL29yZGVyLWVjLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxFQUFVLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8s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QUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDcEQsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELG1CQUFtQixDQUFDLFFBQWdCO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sR0FBRyxJQUFJLDBCQUEwQixRQUFRLEVBQUUsQ0FBQztJQUN2RCxDQUFDO3dHQW5KUSxnQkFBZ0I7NEZBQWhCLGdCQUFnQiwwTENoQzdCLHkyMEJBNmNBLGtpTER4YmMsZUFBZSx1RkFDckIsb0JBQW9CLHlEQUNwQixzQkFBc0IsMkRBQ3RCLFNBQVMseUNBQ1QsYUFBYSw2Q0FDYixhQUFhLGlEQUNiLFdBQVc7OzRGQUtOLGdCQUFnQjtrQkFkNUIsU0FBUzsrQkFDSSxjQUFjLGNBQ1osSUFBSSxXQUNQLENBQUMsZUFBZTt3QkFDckIsb0JBQW9CO3dCQUNwQixzQkFBc0I7d0JBQ3RCLFNBQVM7d0JBQ1QsYUFBYTt3QkFDYixhQUFhO3dCQUNiLFdBQVc7cUJBQ2Q7OEJBbUI0QixjQUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgaW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCwgRGVzdHJveVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UsIENoYW5uZWxTZXJ2aWNlLCBPcmRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZWMtc2VydmljZXMnO1xuaW1wb3J0IHsgUHJpY2VWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzL3ByaWNlLXZpc2liaWxpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgRWNDdXJyZW5jeVN5bWJvbFBpcGUgfSBmcm9tICcuLi8uLi8uLi9lYy1waXBlJztcbmltcG9ydCB7IExvYWRpbmdGdWxsRWNDb21wb25lbnQgfSBmcm9tICcuLi8uLi93aWRnZXRzLWVjJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgVGl0bGVDYXNlUGlwZSwgVXBwZXJDYXNlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBcGlDb25zdGFudHNTZXJ2aWNlLCBDb3JlQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT3JkZXJEb2N1bWVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZWMtc2VydmljZXMvb3JkZXItZG9jdW1lbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsZVNlY3VyaXR5VmFsaWRhdG9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzL2ZpbGUtc2VjdXJpdHktdmFsaWRhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgT3JkZXJEb2N1bWVudHNWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzL29yZGVyLWRvY3VtZW50cy12aXNpYmlsaXR5LnNlcnZpY2UnO1xuaW1wb3J0IHsgT3JkZXJEb2N1bWVudCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvb3JkZXItZG9jdW1lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1vcmRlci1lYycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLFxuICAgICAgICBFY0N1cnJlbmN5U3ltYm9sUGlwZSxcbiAgICAgICAgTG9hZGluZ0Z1bGxFY0NvbXBvbmVudCxcbiAgICAgICAgQXN5bmNQaXBlLFxuICAgICAgICBUaXRsZUNhc2VQaXBlLFxuICAgICAgICBVcHBlckNhc2VQaXBlLFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9vcmRlci1lYy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL29yZGVyLWVjLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBPcmRlckVjQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIHByaXZhdGUgX29yZGVyc1NlcnZpY2U6IE9yZGVyc1NlcnZpY2UgPSBpbmplY3QoT3JkZXJzU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfb3JkZXJEb2N1bWVudHNTZXJ2aWNlID0gaW5qZWN0KE9yZGVyRG9jdW1lbnRzU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfZmlsZVZhbGlkYXRvciA9IGluamVjdChGaWxlU2VjdXJpdHlWYWxpZGF0b3JTZXJ2aWNlKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3JkZXJEb2N1bWVudHNWaXNpYmlsaXR5ID0gaW5qZWN0KE9yZGVyRG9jdW1lbnRzVmlzaWJpbGl0eVNlcnZpY2UpO1xuICAgIHByaXZhdGUgX2NvbnN0czogQXBpQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChBcGlDb25zdGFudHNTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF9jb25zdGFudHM6IENvcmVDb25zdGFudHNTZXJ2aWNlID0gaW5qZWN0KENvcmVDb25zdGFudHNTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICAgIHByaXZhdGUgX2NhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSA9IGluamVjdChDYXJ0U2VydmljZSk7XG4gICAgcHJpdmF0ZSBfY2hhbm5lbENvbmZpZ1NlcnZpY2U6IENoYW5uZWxTZXJ2aWNlID0gaW5qZWN0KENoYW5uZWxTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF9hY3RpdmVkUm91dGU6IEFjdGl2YXRlZFJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJpY2VWaXNpYmlsaXR5ID0gaW5qZWN0KFByaWNlVmlzaWJpbGl0eVNlcnZpY2UpO1xuICAgIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7IC8vIDwtLSBJbnllY3RhbW9zIGVsIERlc3Ryb3lSZWZcblxuICAgIEBWaWV3Q2hpbGQoJ29yZGVyRmlsZUlucHV0Jykgb3JkZXJGaWxlSW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gICAgcHVibGljIG9yZGVyJDogT2JzZXJ2YWJsZTxhbnk+ID0gdGhpcy5fb3JkZXJzU2VydmljZS5zZWxlY3RlZE9yZGVyJDtcbiAgICBwdWJsaWMgYWxsb3dSZXBlYXRPcmRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBoaWRlRGlzY291bnRzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGhpZGVUYXhlczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBlbmFibGVGaWVsZE5vdGVzSW5BcnRpY2xlRmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjaGFubmVsQ29uZmlnOiBhbnkgPSB0aGlzLl9vcmRlcnNTZXJ2aWNlLmNoYW5uZWxDb25maWc7XG4gICAgcHVibGljIG51bWJlck9yZGVyOiBhbnk7XG4gICAgcHVibGljIG9yZGVyT2JqOiBhbnkgPSBudWxsO1xuICAgIHB1YmxpYyBzaG93RG9jdW1lbnRzTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIE9yZGVyIGRvY3VtZW50cyAobmV3IGVuZHBvaW50KVxuICAgIG9yZGVyRG9jdW1lbnRzOiBPcmRlckRvY3VtZW50W10gPSBbXTtcbiAgICBvcmRlckRvY3NMb2FkaW5nID0gZmFsc2U7XG4gICAgb3JkZXJEb2NzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgb3JkZXJEb2NTZWxlY3RlZEZpbGU6IEZpbGUgfCBudWxsID0gbnVsbDtcbiAgICBvcmRlckRvY1NlbGVjdGVkVHlwZSA9ICdwcm9vZl9vZl9wYXltZW50X3R5cGUnO1xuICAgIG9yZGVyRG9jVXBsb2FkRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXN0cnVjY2nDs24gYXV0b23DoXRpY2EgZGUgbGEgc3VzY3JpcGNpw7NuIGFsIHNhbGlyIGRlbCBjb21wb25lbnRlXG4gICAgICAgIHRoaXMuX29yZGVyc1NlcnZpY2Uuc2VsZWN0ZWRPcmRlciRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1iZXIgPSB0aGlzLl9hY3RpdmVkUm91dGUuc25hcHNob3QucGFyYW1zW1wibnVtYmVyXCJdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmRlcnNTZXJ2aWNlLmdldE9yZGVyQnlOdW1iZXIobnVtYmVyKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3JkZXJPYmogPSByZXM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMudG9rZW5WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZE9yZGVyRG9jdW1lbnRzKHJlcy50b2tlblZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgIC8vIERlc3RydWNjacOzbiBhdXRvbcOhdGljYSBkZSBsYSBzdXNjcmlwY2nDs24gYWwgY2FuYWxcbiAgICAgICAgdGhpcy5fY2hhbm5lbENvbmZpZ1NlcnZpY2UuY2hhbm5lbCRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKGNvbmZpZzogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmFsbG93UmVwZWF0T3JkZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsb3dSZXBlYXRPcmRlcnMgPSBjb25maWcuYWxsb3dSZXBlYXRPcmRlcnM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVwZWF0T3JkZXJzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlRGlzY291bnRzID0gY29uZmlnPy5oaWRlRGlzY291bnRzID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVUYXhlcyA9IGNvbmZpZz8uaGlkZVRheGVzID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpZWxkTm90ZXNJbkFydGljbGVGaWxlID0gISFjb25maWc/LmVuYWJsZUZpZWxkTm90ZXNJbkFydGljbGVGaWxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIGdldFVybEJhc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25zdHMuZ2V0VXJsQmFzZSgpO1xuICAgIH1cbiAgICBcbiAgICBiYWNrKCkge1xuICAgICAgICAvLyBFbiBsdWdhciBkZTogdGhpcy5fcm91dGVyLm5hdmlnYXRlQnlVcmwoJ2FjY291bnQnKTtcbiAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFsnL2FjY291bnQnXSwgeyBxdWVyeVBhcmFtczogeyBzZWN0aW9uOiAnb3JkZXJzJyB9IH0pO1xuICAgIH1cbiAgICBcbiAgICB0b0RhdGUoZGF0ZTogYW55LCBmb3JtYXQ6IGFueSkge1xuICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdCghZm9ybWF0ICYmICdERC9NTS9ZWVlZLCBoOm1tOnNzIGEnIHx8IGZvcm1hdClcbiAgICB9XG5cbiAgICByZXBlYXRPcmRlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dSZXBlYXRPcmRlcnMgJiYgdGhpcy5vcmRlck9iaikge1xuICAgICAgICAgICAgdGhpcy5fY2FydFNlcnZpY2UuYWRkUmVwZWF0T3JkZXJUb0NhcnQodGhpcy5vcmRlck9iai5pdGVtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtZWRpYVVybCA9ICgpID0+IHRoaXMuX2NvbnN0YW50cy5tZWRpYVVybCgpO1xuXG4gICAgb3BlbkRvY3VtZW50c01vZGFsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dEb2N1bWVudHNNb2RhbCA9IHRydWU7XG4gICAgfVxuXG4gICAgY2xvc2VEb2N1bWVudHNNb2RhbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zaG93RG9jdW1lbnRzTW9kYWwgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9sb2FkT3JkZXJEb2N1bWVudHModG9rZW5WYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3JkZXJEb2NzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX29yZGVyRG9jdW1lbnRzU2VydmljZS5nZXREb2N1bWVudHModG9rZW5WYWx1ZSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChkb2NzKSA9PiB7IHRoaXMub3JkZXJEb2N1bWVudHMgPSBkb2NzOyB0aGlzLm9yZGVyRG9jc0xvYWRpbmcgPSBmYWxzZTsgfSxcbiAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMub3JkZXJEb2NzTG9hZGluZyA9IGZhbHNlOyB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uT3JkZXJGaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIHRoaXMub3JkZXJEb2NTZWxlY3RlZEZpbGUgPSBpbnB1dC5maWxlcz8uWzBdID8/IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBsb2FkT3JkZXJEb2N1bWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9yZGVyRG9jU2VsZWN0ZWRGaWxlIHx8ICF0aGlzLm9yZGVyT2JqPy50b2tlblZhbHVlKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLl9maWxlVmFsaWRhdG9yLnZhbGlkYXRlKHRoaXMub3JkZXJEb2NTZWxlY3RlZEZpbGUpO1xuICAgICAgICBpZiAoIXZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICAgICAgLy8gU3VyZmFjZSB0aGUgZXJyb3IgdmlhIHRoZSBleGlzdGluZyBkb2N1bWVudHMgc2VjdGlvbiBlcnJvciBzdGF0ZS5cbiAgICAgICAgICAgIHRoaXMub3JkZXJEb2N1bWVudHM7IC8vIG5vLW9wIOKAlCBlcnJvciBzaG93biB2aWEgY29uc29sZSBmb3Igbm93XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tvcmRlci1lY10gRmlsZSByZWplY3RlZCBieSBzZWN1cml0eSB2YWxpZGF0b3I6JywgdmFsaWRhdGlvbi5lcnJvclR5cGUsIHZhbGlkYXRpb24ubWVzc2FnZSk7XG4gICAgICAgICAgICAvLyBSZS1zdXJmYWNlIGFzIGEgdGVtcG9yYXJ5IGlubGluZSBmbGFnIHNvIHRoZSB0ZW1wbGF0ZSBjYW4gc2hvdyBpdC5cbiAgICAgICAgICAgIHRoaXMub3JkZXJEb2NVcGxvYWRFcnJvciA9IHZhbGlkYXRpb24ubWVzc2FnZSA/PyAnSW52YWxpZCBmaWxlLic7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9yZGVyRG9jVXBsb2FkRXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLm9yZGVyRG9jc1VwbG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX29yZGVyRG9jdW1lbnRzU2VydmljZS51cGxvYWREb2N1bWVudChcbiAgICAgICAgICAgIHRoaXMub3JkZXJPYmoudG9rZW5WYWx1ZSxcbiAgICAgICAgICAgIHRoaXMub3JkZXJEb2NTZWxlY3RlZEZpbGUsXG4gICAgICAgICAgICB0aGlzLm9yZGVyRG9jU2VsZWN0ZWRUeXBlIHx8IHVuZGVmaW5lZFxuICAgICAgICApLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoZG9jKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcmRlckRvY3VtZW50cyA9IFsuLi50aGlzLm9yZGVyRG9jdW1lbnRzLCBkb2NdO1xuICAgICAgICAgICAgICAgIHRoaXMub3JkZXJEb2NTZWxlY3RlZEZpbGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMub3JkZXJEb2NTZWxlY3RlZFR5cGUgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcmRlckZpbGVJbnB1dCkgeyB0aGlzLm9yZGVyRmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJzsgfVxuICAgICAgICAgICAgICAgIHRoaXMub3JkZXJEb2NzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5vcmRlckRvY3NVcGxvYWRpbmcgPSBmYWxzZTsgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvcmRlckRvY0Rvd25sb2FkVXJsKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBiYXNlID0gKHRoaXMuX2NvbnN0cy5nZXRVcmxCYXNlKCkgfHwgJycpLnJlcGxhY2UoL1xcLyskLywgJycpO1xuICAgICAgICByZXR1cm4gYCR7YmFzZX0vbWVkaWEvb3JkZXJfZG9jdW1lbnRzLyR7ZmlsZU5hbWV9YDtcbiAgICB9XG59IiwiPG1haW4gY2xhc3M9XCJweS01XCIgaWQ9XCJvcmRlckVjQ29tcG9uZW50XCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICBAaWYob3JkZXIkIHwgYXN5bmM7IGFzIG9yZGVyKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwXCI+XG4gICAgICAgICAgICBAaWYob3JkZXIpIHtcblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBvcmRlci1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLWF1dG8gY29sLTEyIGZvbnQtYnJhbmRvblwiPlxuICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJ0aXQxIGZ3LWJvbGQgb3JkZXItdGl0bGVcIj57eyAoJ29yZGVyJyB8IHRyYW5zbGF0ZSkgKyAnOiAnICsgb3JkZXIubnVtYmVyIH19PC9oND5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBAaWYob3JkZXI/Lmludm9pY2UpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtIGNvbC0xMiBmb250LWJyYW5kb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgW2hyZWZdPVwiZ2V0VXJsQmFzZSgpLnNsaWNlKDAsIC0xKSArIG9yZGVyLmludm9pY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWludm9pY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZpbGUtZG93bmxvYWQgbWUtMVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdkb3dubG9hZCcgfCB0cmFuc2xhdGUgfX0ge3sgJ2ludm9pY2VzJyB8IHRyYW5zbGF0ZSB8IHRpdGxlY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byB0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYmFjaygpXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFyayBidHZvbHZlciBib3JkZXJcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2stdG8tb3JkZXJzJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxzZWN0aW9uIGlkPVwib3JkZXJzXCIgY2xhc3M9XCJvcmRlci1tZXRhLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHB0LTIgb3JkZXItbWV0YS1ncmlkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMiBjb2wtMTIgb3JkZXItbWV0YS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInN0XCI+e3sgJ3BheW1lbnQtc3RhdGUnIHwgdHJhbnNsYXRlIH19OjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwib3JkZXItbWV0YS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZGVyLnBheW1lbnRzWzBdLnN0YXRlIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgY29sLTEyIGZvbnQtYnJhbmRvbiBvcmRlci1tZXRhLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RcIj57eyAnc2hpcG1lbnQtc3RhdGUnIHwgdHJhbnNsYXRlIH19OjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwib3JkZXItbWV0YS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZGVyLnNoaXBtZW50c1swXS5zdGF0ZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIGNvbC0xMiBmb250LWJyYW5kb24gb3JkZXItbWV0YS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInN0XCI+e3sgJ3BheW1lbnQtbWV0aG9kJyB8IHRyYW5zbGF0ZSB9fTo8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm9yZGVyLW1ldGEtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcmRlci5wYXltZW50c1swXT8ubWV0aG9kPy5uYW1lIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgY29sLTEyIGZvbnQtYnJhbmRvbiBvcmRlci1tZXRhLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RcIj57eyAnc2hpcG1lbnQtbWV0aG9kJyB8IHRyYW5zbGF0ZSB9fTo8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm9yZGVyLW1ldGEtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcmRlci5zaGlwbWVudHNbMF0ubWV0aG9kLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihvcmRlci50cmFja2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwib3JkZXIudHJhY2tpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLWRhcmsgYnRuTG9nb3V0IHB4LTMgcHktMSBmb250LXNpemUtMTAgdy1hdXRvIGJ0bi1zbSBvcmRlci10cmFja2luZy1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXIgc2VndWltaWVudG88L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgY29sLTEyIGZvbnQtYnJhbmRvbiBvcmRlci1tZXRhLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RcIj57eyAnZGF0ZScgfCB0cmFuc2xhdGUgfX06PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJvcmRlci1tZXRhLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9EYXRlKG9yZGVyLmNoZWNrb3V0Q29tcGxldGVkQXQsICdERC9NTS9ZWVlZJykgfCB0cmFuc2xhdGUgfX08YnI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9EYXRlKG9yZGVyLmNoZWNrb3V0Q29tcGxldGVkQXQsICdoOm1tOnNzIGEnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmKHByaWNlVmlzaWJpbGl0eS5jYW5TaG93UHJpY2VzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIGNvbC0xMiBmb250LWJyYW5kb24gb3JkZXItbWV0YS1pdGVtIG9yZGVyLW1ldGEtdG90YWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RcIj57eyAndG90YWwnIHwgdHJhbnNsYXRlIH19OjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImZ3LWJvbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAob3JkZXIudG90YWxzLnRvdGFsKSB8IGVjQ3VycmVuY3lTeW1ib2x9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgICAgQGlmKCFwcmljZVZpc2liaWxpdHkuaGlkZVByaWNlcygpICYmIGFsbG93UmVwZWF0T3JkZXJzKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmQgbXQtMyBvcmRlci1yZXBlYXQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbWItMiBidG5SZXBlYXRPcmRlciBvcmRlci1hY3Rpb24tcHJpbWFyeVwiIChjbGljayk9XCJyZXBlYXRPcmRlcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdyZXBlYXQtb3JkZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lciBweS0zIGJvcmRlci10b3AgYm9yZGVyLWJvdHRvbSBvcmRlci1pdGVtcy13cmFwXCI+XG4gICAgICAgICAgICAgICAgQGlmKG9yZGVyLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIGZvbnQtc20gZm9udC1icmFuZG9uIGQtbm9uZSBkLW1kLWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAncHJvZHVjdCcgfCB0cmFuc2xhdGUgfCB1cHBlcmNhc2UgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCBmb250LXNtIGZvbnQtYnJhbmRvbiBkLW5vbmUgZC1tZC1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmKGNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiY29sTG90c1wiIGNsYXNzPVwiY29sLTEgZm9udC1zbSBmb250LWJyYW5kb24gZC1ub25lIGQtbWQtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdsb3RzJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYocHJpY2VWaXNpYmlsaXR5LmNhblNob3dQcmljZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgdGV4dC1jZW50ZXIgZm9udC1zbSBmb250LWJyYW5kb24gZC1ub25lIGQtbWQtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICd1bml0LXByaWNlJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEgdGV4dC1jZW50ZXIgZm9udC1zbSBmb250LWJyYW5kb24gZC1ub25lIGQtbWQtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdxdWFudGl0eScgfCB0cmFuc2xhdGUgfCB1cHBlcmNhc2UgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZihwcmljZVZpc2liaWxpdHkuY2FuU2hvd1ByaWNlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiB0ZXh0LWVuZCBmb250LXNtIGZvbnQtYnJhbmRvbiBkLW5vbmUgZC1tZC1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3RvdGFsJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEBmb3IoaXRlbSBvZiBvcmRlci5pdGVtczsgdHJhY2sgJGluZGV4OyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY2FydC1pdGVtcyBvcmRlci1pdGVtLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTUgY29sLW1kLTIgcHktMiBvcmRlckl0ZW1UaHVtYldyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0/LmltYWdlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwic21jIG1heHdpZHRoIGltZy1mbHVpZCByb3VuZGVkLWN1c3RvbSBvcmRlckl0ZW1UaHVtYlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJtZWRpYVVybCgpICsgIGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5pbWFnZXNbMF1cIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0ucHJvZHVjdC5waWN0dXJlc2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJzbWMgbWF4d2lkdGggaW1nLWZsdWlkIHJvdW5kZWQtY3VzdG9tIG9yZGVySXRlbVRodW1iXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cIm1lZGlhVXJsKCkgKyBpdGVtLnByb2R1Y3QucGljdHVyZXNkZWZhdWx0WzBdXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgY29sLTcgZmxleC1jb2x1bW4gZmxleC1tZC1yb3cganVzdGlmeS1jb250ZW50LXN0YXJ0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1icmFuZG9uIGQtZmxleCB3LTEwMCBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ucHJvZHVjdC5uYW1lIH19IChDb2Q6e3sgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLmNvZGUgfX0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihlbmFibGVGaWVsZE5vdGVzSW5BcnRpY2xlRmlsZSAmJiBpdGVtPy5jb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY29tbWVudC10cnVuY2F0ZWQgZnN0LWl0YWxpYyBzbWFsbCB0ZXh0LW11dGVkIG10LTEgbWItMFwiPlwie3sgaXRlbS5jb21tZW50cyB9fVwiPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmKGNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLW1kLW5vbmUgbXQtMiBvcmRlci1sb3RzLW1vYmlsZS13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0blNlZ3VpciBtLTAgdGV4dC1jZW50ZXIgb3JkZXItbG90cy1idG4gb3JkZXItbG90cy1tb2JpbGUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYnMtdG9nZ2xlXT1cIidjb2xsYXBzZSdcIiBbYXR0ci5kYXRhLWJzLXRhcmdldF09XCInI2NvbGxhcHNlRXhhbXBsZScraVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidjb2xsYXBzZUV4YW1wbGUnK2lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdsb3RzJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZihjaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGNvbC0xIGZsZXgtY29sdW1uIGZsZXgtbWQtcm93IGp1c3RpZnktY29udGVudC1zdGFydCBkLW5vbmUgZC1tZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG5TZWd1aXIgbS0wIHRleHQtY2VudGVyIG9yZGVyLWxvdHMtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWJzLXRvZ2dsZV09XCInY29sbGFwc2UnXCIgW2F0dHIuZGF0YS1icy10YXJnZXRdPVwiJyNjb2xsYXBzZUV4YW1wbGUnK2lcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ2NvbGxhcHNlRXhhbXBsZScraVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7eyAnc2VlJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyIGQtbWQtbm9uZSBvcmRlci1tb2JpbGUtcHJpY2VzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1jZW50ZXIgdy0xMDAgbS0wXCI+IHt7IGl0ZW0ucXVhbnRpdHkgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHByaWNlVmlzaWJpbGl0eS5jYW5TaG93UHJpY2VzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTQgZm9udC14bFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtY2VudGVyIHctMTAwIG0tMFwiPiB7eyAoaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNhbGVwcmljZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlIDogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnByaWNlKSB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY0N1cnJlbmN5U3ltYm9sfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IGZvbnQteGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWNlbnRlciB3LTEwMCBtLTBcIj4ge3sgKChpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zYWxlcHJpY2UgOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ucHJpY2UpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucXVhbnRpdHkpIHwgZWNDdXJyZW5jeVN5bWJvbH19PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmKHByaWNlVmlzaWJpbGl0eS5jYW5TaG93UHJpY2VzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIGQtbm9uZSBkLW1kLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtY2VudGVyIHctMTAwIG0tMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IChpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlID8gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNhbGVwcmljZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnByaWNlKSB8IGVjQ3VycmVuY3lTeW1ib2x9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEgZC1ub25lIGQtbWQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1jZW50ZXIgdy0xMDAgbS0wXCI+IHt7IGl0ZW0ucXVhbnRpdHkgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBAaWYocHJpY2VWaXNpYmlsaXR5LmNhblNob3dQcmljZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgZC1ub25lIGQtbWQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1lbmQgdy0xMDAgbS0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgKChpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlID8gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNhbGVwcmljZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnByaWNlKSAqIGl0ZW0ucXVhbnRpdHkpIHwgZWNDdXJyZW5jeVN5bWJvbH19PC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2VcIiBbYXR0ci5pZF09XCInY29sbGFwc2VFeGFtcGxlJytpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1ub25lIGQtbWQtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+IzwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPkVzdGFkbzwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPkNhbnRpZGFkPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+RmVjaGEgU29saWNpdGFkYTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPkZlY2hhIEVzdGltYWRhPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+U2VkZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPk5vdGE8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5Ub3RhbCBMb3RlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yKCBsb3Qgb2YgaXRlbS5vcmRlckl0ZW1Mb3Q7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwicm93XCI+e3tsb3QuaWR9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2xvdC5sb3Rfc3RhdHVzfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tsb3QucXVhbnRpdHl9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyB0b0RhdGUobG90LmRhdGVfcmVxdWVzdCwgJ0REL01NL1lZWVknKSB8IHRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihsb3QuZGF0ZV9kZWxpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9EYXRlKGxvdC5kYXRlX2RlbGl2ZXIsICdERC9NTS9ZWVlZJykgfCB0cmFuc2xhdGUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlBlbmRpZW50ZTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bG90LnNoaXBwaW5nX2FkZHJlc3NfbmFtZX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bG90Lm5vdGVzfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tsb3QudG90YWxfbG90IHwgZWNDdXJyZW5jeVN5bWJvbH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtbWQtbm9uZSBvcmRlci1sb3RzLW1vYmlsZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IoIGxvdCBvZiBpdGVtLm9yZGVySXRlbUxvdDsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpY2xlIGNsYXNzPVwib3JkZXItbG90cy1tb2JpbGUtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLWxvdHMtbW9iaWxlLWNhcmQtaGVhZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JkZXItbG90cy1tb2JpbGUtcGlsbFwiPnt7IGxvdC5sb3Rfc3RhdHVzIHwgdGl0bGVjYXNlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9XCJvcmRlci1sb3RzLW1vYmlsZS10b3RhbFwiPnt7IGxvdC50b3RhbF9sb3QgfCBlY0N1cnJlbmN5U3ltYm9sIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkbCBjbGFzcz1cIm9yZGVyLWxvdHMtbW9iaWxlLWdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHQ+IzwvZHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD57eyBsb3QuaWQgfX08L2RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD5Fc3RhZG88L2R0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGQ+e3sgbG90LmxvdF9zdGF0dXMgfCB0aXRsZWNhc2UgfX08L2RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD5DYW50aWRhZDwvZHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD57eyBsb3QucXVhbnRpdHkgfX08L2RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD5GZWNoYSBzb2xpY2l0YWRhPC9kdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkPnt7IHRvRGF0ZShsb3QuZGF0ZV9yZXF1ZXN0LCAnREQvTU0vWVlZWScpIHwgdHJhbnNsYXRlIH19PC9kZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHQ+RmVjaGEgZXN0aW1hZGE8L2R0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYobG90LmRhdGVfZGVsaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9EYXRlKGxvdC5kYXRlX2RlbGl2ZXIsICdERC9NTS9ZWVlZJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGllbnRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLWxvdHMtbW9iaWxlLWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0PlNlZGU8L2R0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGQ+e3sgbG90LnNoaXBwaW5nX2FkZHJlc3NfbmFtZSB9fTwvZGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLWxvdHMtbW9iaWxlLWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0Pk5vdGE8L2R0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGQ+e3sgbG90Lm5vdGVzIHx8ICfigJQnIH19PC9kZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWNsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyIG9yZGVyLXRvdGFscy13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZihwcmljZVZpc2liaWxpdHkuY2FuU2hvd1ByaWNlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHktNCBvcmRlci10b3RhbHMtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBmb250LWJyYW5kb24gZm9udC1tZCB0ZXh0LWdyYXkgYm9yZGVyLWJvdHRvbSBcIj57eyAndG90YWwtcHJvZHVjdHMnIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kIHRleHQtZ3JheSBib3JkZXItYm90dG9tICB0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAob3JkZXIudG90YWxzLml0ZW1zKSB8IGVjQ3VycmVuY3lTeW1ib2wgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBmb250LWJyYW5kb24gZm9udC1tZCB0ZXh0LWdyYXkgYm9yZGVyLWJvdHRvbSBcIj57eyAnc2hpcG1lbnQnIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kIHRleHQtZ3JheSBib3JkZXItYm90dG9tICB0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAob3JkZXIudG90YWxzLnNoaXBwaW5nIHx8ICcwJykgfCBlY0N1cnJlbmN5U3ltYm9sIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoIWhpZGVEaXNjb3VudHMgJiYgb3JkZXIudG90YWxzLnByb21vdGlvbiAmJiBvcmRlci50b3RhbHMucHJvbW90aW9uICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgZm9udC1icmFuZG9uIGZvbnQtbWQgdGV4dC1ncmF5IGJvcmRlci1ib3R0b20gXCI+e3sgJ2Rpc2NvdW50JyB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBmb250LWJyYW5kb24gZm9udC1tZCB0ZXh0LWdyYXkgYm9yZGVyLWJvdHRvbSAgdGV4dC1lbmQgdGV4dC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgKG9yZGVyLnRvdGFscy5wcm9tb3Rpb24pIHwgZWNDdXJyZW5jeVN5bWJvbCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihvcmRlci50b3RhbHMudGF4ZXMgJiYgb3JkZXIudG90YWxzLnRheGVzICE9IDAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kIHRleHQtZ3JheSBib3JkZXItYm90dG9tIFwiPnt7ICd0YXhlcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgZm9udC1icmFuZG9uIGZvbnQtbWQgdGV4dC1ncmF5IGJvcmRlci1ib3R0b20gIHRleHQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IChvcmRlci50b3RhbHMudGF4ZXMpIHwgZWNDdXJyZW5jeVN5bWJvbCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZighaGlkZVRheGVzICYmIG9yZGVyLnRvdGFscy5yZWZ1bmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kIHRleHQtZ3JheSBib3JkZXItYm90dG9tIFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmRlci50b3RhbHMucmVmdW5kcy5yZWZ1bmRSZWFzb24pIHwgdGl0bGVjYXNlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kIHRleHQtZ3JheSBib3JkZXItYm90dG9tICB0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAoLSBvcmRlci50b3RhbHMucmVmdW5kcy5yZWZ1bmRUb3RhbCkgfCBlY0N1cnJlbmN5U3ltYm9sIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChvcmRlci50b3RhbHMucmVmdW5kcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBmb250LWJyYW5kb24gZm9udC1tZFwiPnt7ICd0b3RhbCcgfCB0cmFuc2xhdGUgfCB1cHBlcmNhc2UgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgZm9udC1icmFuZG9uIGZvbnQtbWQgdGV4dC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgKG9yZGVyLnRvdGFscy5yZWZ1bmRzLnRvdGFsQWZ0ZXJSZWZ1bmQpIHwgZWNDdXJyZW5jeVN5bWJvbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kXCI+e3sgJ3RvdGFsJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBmb250LWJyYW5kb24gZm9udC1tZCB0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAob3JkZXIudG90YWxzLnRvdGFsKSB8IGVjQ3VycmVuY3lTeW1ib2wgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICBAaWYoc2hvd0RvY3VtZW50c01vZGFsKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYmFja2Ryb3AgZmFkZSBzaG93XCIgKGNsaWNrKT1cImNsb3NlRG9jdW1lbnRzTW9kYWwoKVwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGUgc2hvdyBkLWJsb2NrXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGUgZm9udC1icmFuZG9uXCI+RG9jdW1lbnRvczwvaDU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VEb2N1bWVudHNNb2RhbCgpXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvcihkb2N1bWVudCBvZiBvcmRlci5kb2N1bWVudHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRhcmdldD1cIl9ibGFua1wiIFtocmVmXT1cImdldFVybEJhc2UoKS5zbGljZSgwLCAtMSkgKyBkb2N1bWVudC5wYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rIHAtMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZmlsZS1kb3dubG9hZCBtZS0yXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZG9jdW1lbnQudHlwZUxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWRhc2g7IHt7ICdkb3dubG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYob3JkZXJEb2N1bWVudHNWaXNpYmlsaXR5LnNob3dPcmRlckRvY3VtZW50cygpICYmIG9yZGVyT2JqPy50b2tlblZhbHVlKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyIG10LTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImZvbnQtYnJhbmRvbiBmdy1zZW1pYm9sZCBtYi0zXCI+e3sgJ29yZGVyLmRvY3VtZW50cy50aXRsZScgfCB0cmFuc2xhdGUgfX08L2g1PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYob3JkZXJEb2NzTG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gdGV4dC1zZWNvbmRhcnlcIiByb2xlPVwic3RhdHVzXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYob3JkZXJEb2N1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yKGRvYyBvZiBvcmRlckRvY3VtZW50czsgdHJhY2sgZG9jLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgcHktMiBib3JkZXItYm90dG9tXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZmlsZS1lYXJtYXJrIHRleHQtbXV0ZWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1ncm93LTEgc21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRvYy5maWxlTmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGRvYy50eXBlTGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc2Vjb25kYXJ5IG1zLTEgc21hbGxcIj57eyBkb2MudHlwZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cIm9yZGVyRG9jRG93bmxvYWRVcmwoZG9jLmZpbGVOYW1lKVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1zbSBwLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZG93bmxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG1iLTNcIj57eyAnb3JkZXIuZG9jdW1lbnRzLmVtcHR5JyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTJcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBmb3JtLWxhYmVsLXNtXCI+e3sgJ29yZGVyLmRvY3VtZW50cy5maWxlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjb3JkZXJGaWxlSW5wdXQgdHlwZT1cImZpbGVcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0PVwiLnBkZiwuanBnLC5qcGVnLC5wbmdcIiAoY2hhbmdlKT1cIm9uT3JkZXJGaWxlU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0IG10LTFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgbGluZS1oZWlnaHQ6IDE7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAndXNlci1wb3J0YWwuZG9jdW1lbnRzLmFsbG93ZWQtZm9ybWF0cycgfCB0cmFuc2xhdGUgfX06IC5wZGYsIC5qcGcsIC5qcGVnLCAucG5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGZvcm0tbGFiZWwtc21cIj57eyAnb3JkZXIuZG9jdW1lbnRzLnR5cGUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgWyhuZ01vZGVsKV09XCJvcmRlckRvY1NlbGVjdGVkVHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInByb29mX29mX3BheW1lbnRfdHlwZVwiPnt7ICdvcmRlci5kb2N1bWVudHMudHlwZS1wYXltZW50LXJlY2VpcHQnIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJvdGhlclwiPnt7ICdvcmRlci5kb2N1bWVudHMudHlwZS1vdGhlcicgfCB0cmFuc2xhdGUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zIGQtZmxleCBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGZvcm0tbGFiZWwtc20gZC1ub25lIGQtc20tYmxvY2sgaW52aXNpYmxlXCI+U3BhY2VyPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFyayBidG4tc20gdy0xMDAgbXQtYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEuMXJlbTtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFvcmRlckRvY1NlbGVjdGVkRmlsZSB8fCBvcmRlckRvY3NVcGxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwbG9hZE9yZGVyRG9jdW1lbnQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKG9yZGVyRG9jc1VwbG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0xXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXVwbG9hZCBtZS0xXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ29yZGVyLmRvY3VtZW50cy51cGxvYWQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKG9yZGVyRG9jVXBsb2FkRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgcHktMiBzbWFsbCBtYi0wXCI+e3sgb3JkZXJEb2NVcGxvYWRFcnJvciB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGgtNTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNT57eyAnbm8tb3JkZXJzJyB8IHRyYW5zbGF0ZSB9fTwvaDU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBoLTUwIHB5LTVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWxvYWRpbmctZnVsbC1lYz48L2FwcC1sb2FkaW5nLWZ1bGwtZWM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbWFpbj5cbiJdfQ==
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvYWNjb3VudC1lYy9vcmRlci1lYy9vcmRlci1lYy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy9hY2NvdW50LWVjL29yZGVyLWVjL29yZGVyLWVjLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxFQUFVLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8s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QUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDcEQsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELG1CQUFtQixDQUFDLFFBQWdCO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sR0FBRyxJQUFJLDBCQUEwQixRQUFRLEVBQUUsQ0FBQztJQUN2RCxDQUFDO3dHQW5KUSxnQkFBZ0I7NEZBQWhCLGdCQUFnQiwwTENoQzdCLDhpMkJBa2RBLGtpTEQ3YmMsZUFBZSx1RkFDckIsb0JBQW9CLHlEQUNwQixzQkFBc0IsMkRBQ3RCLFNBQVMseUNBQ1QsYUFBYSw2Q0FDYixhQUFhLGlEQUNiLFdBQVc7OzRGQUtOLGdCQUFnQjtrQkFkNUIsU0FBUzsrQkFDSSxjQUFjLGNBQ1osSUFBSSxXQUNQLENBQUMsZUFBZTt3QkFDckIsb0JBQW9CO3dCQUNwQixzQkFBc0I7d0JBQ3RCLFNBQVM7d0JBQ1QsYUFBYTt3QkFDYixhQUFhO3dCQUNiLFdBQVc7cUJBQ2Q7OEJBbUI0QixjQUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgaW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCwgRGVzdHJveVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UsIENoYW5uZWxTZXJ2aWNlLCBPcmRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZWMtc2VydmljZXMnO1xuaW1wb3J0IHsgUHJpY2VWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzL3ByaWNlLXZpc2liaWxpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgRWNDdXJyZW5jeVN5bWJvbFBpcGUgfSBmcm9tICcuLi8uLi8uLi9lYy1waXBlJztcbmltcG9ydCB7IExvYWRpbmdGdWxsRWNDb21wb25lbnQgfSBmcm9tICcuLi8uLi93aWRnZXRzLWVjJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgVGl0bGVDYXNlUGlwZSwgVXBwZXJDYXNlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBcGlDb25zdGFudHNTZXJ2aWNlLCBDb3JlQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT3JkZXJEb2N1bWVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZWMtc2VydmljZXMvb3JkZXItZG9jdW1lbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsZVNlY3VyaXR5VmFsaWRhdG9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzL2ZpbGUtc2VjdXJpdHktdmFsaWRhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgT3JkZXJEb2N1bWVudHNWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzL29yZGVyLWRvY3VtZW50cy12aXNpYmlsaXR5LnNlcnZpY2UnO1xuaW1wb3J0IHsgT3JkZXJEb2N1bWVudCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvb3JkZXItZG9jdW1lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1vcmRlci1lYycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLFxuICAgICAgICBFY0N1cnJlbmN5U3ltYm9sUGlwZSxcbiAgICAgICAgTG9hZGluZ0Z1bGxFY0NvbXBvbmVudCxcbiAgICAgICAgQXN5bmNQaXBlLFxuICAgICAgICBUaXRsZUNhc2VQaXBlLFxuICAgICAgICBVcHBlckNhc2VQaXBlLFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9vcmRlci1lYy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL29yZGVyLWVjLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBPcmRlckVjQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIHByaXZhdGUgX29yZGVyc1NlcnZpY2U6IE9yZGVyc1NlcnZpY2UgPSBpbmplY3QoT3JkZXJzU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfb3JkZXJEb2N1bWVudHNTZXJ2aWNlID0gaW5qZWN0KE9yZGVyRG9jdW1lbnRzU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfZmlsZVZhbGlkYXRvciA9IGluamVjdChGaWxlU2VjdXJpdHlWYWxpZGF0b3JTZXJ2aWNlKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3JkZXJEb2N1bWVudHNWaXNpYmlsaXR5ID0gaW5qZWN0KE9yZGVyRG9jdW1lbnRzVmlzaWJpbGl0eVNlcnZpY2UpO1xuICAgIHByaXZhdGUgX2NvbnN0czogQXBpQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChBcGlDb25zdGFudHNTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF9jb25zdGFudHM6IENvcmVDb25zdGFudHNTZXJ2aWNlID0gaW5qZWN0KENvcmVDb25zdGFudHNTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICAgIHByaXZhdGUgX2NhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSA9IGluamVjdChDYXJ0U2VydmljZSk7XG4gICAgcHJpdmF0ZSBfY2hhbm5lbENvbmZpZ1NlcnZpY2U6IENoYW5uZWxTZXJ2aWNlID0gaW5qZWN0KENoYW5uZWxTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF9hY3RpdmVkUm91dGU6IEFjdGl2YXRlZFJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJpY2VWaXNpYmlsaXR5ID0gaW5qZWN0KFByaWNlVmlzaWJpbGl0eVNlcnZpY2UpO1xuICAgIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7IC8vIDwtLSBJbnllY3RhbW9zIGVsIERlc3Ryb3lSZWZcblxuICAgIEBWaWV3Q2hpbGQoJ29yZGVyRmlsZUlucHV0Jykgb3JkZXJGaWxlSW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gICAgcHVibGljIG9yZGVyJDogT2JzZXJ2YWJsZTxhbnk+ID0gdGhpcy5fb3JkZXJzU2VydmljZS5zZWxlY3RlZE9yZGVyJDtcbiAgICBwdWJsaWMgYWxsb3dSZXBlYXRPcmRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBoaWRlRGlzY291bnRzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGhpZGVUYXhlczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBlbmFibGVGaWVsZE5vdGVzSW5BcnRpY2xlRmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjaGFubmVsQ29uZmlnOiBhbnkgPSB0aGlzLl9vcmRlcnNTZXJ2aWNlLmNoYW5uZWxDb25maWc7XG4gICAgcHVibGljIG51bWJlck9yZGVyOiBhbnk7XG4gICAgcHVibGljIG9yZGVyT2JqOiBhbnkgPSBudWxsO1xuICAgIHB1YmxpYyBzaG93RG9jdW1lbnRzTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIE9yZGVyIGRvY3VtZW50cyAobmV3IGVuZHBvaW50KVxuICAgIG9yZGVyRG9jdW1lbnRzOiBPcmRlckRvY3VtZW50W10gPSBbXTtcbiAgICBvcmRlckRvY3NMb2FkaW5nID0gZmFsc2U7XG4gICAgb3JkZXJEb2NzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgb3JkZXJEb2NTZWxlY3RlZEZpbGU6IEZpbGUgfCBudWxsID0gbnVsbDtcbiAgICBvcmRlckRvY1NlbGVjdGVkVHlwZSA9ICdwcm9vZl9vZl9wYXltZW50X3R5cGUnO1xuICAgIG9yZGVyRG9jVXBsb2FkRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXN0cnVjY2nDs24gYXV0b23DoXRpY2EgZGUgbGEgc3VzY3JpcGNpw7NuIGFsIHNhbGlyIGRlbCBjb21wb25lbnRlXG4gICAgICAgIHRoaXMuX29yZGVyc1NlcnZpY2Uuc2VsZWN0ZWRPcmRlciRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1iZXIgPSB0aGlzLl9hY3RpdmVkUm91dGUuc25hcHNob3QucGFyYW1zW1wibnVtYmVyXCJdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmRlcnNTZXJ2aWNlLmdldE9yZGVyQnlOdW1iZXIobnVtYmVyKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3JkZXJPYmogPSByZXM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMudG9rZW5WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZE9yZGVyRG9jdW1lbnRzKHJlcy50b2tlblZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgIC8vIERlc3RydWNjacOzbiBhdXRvbcOhdGljYSBkZSBsYSBzdXNjcmlwY2nDs24gYWwgY2FuYWxcbiAgICAgICAgdGhpcy5fY2hhbm5lbENvbmZpZ1NlcnZpY2UuY2hhbm5lbCRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKGNvbmZpZzogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmFsbG93UmVwZWF0T3JkZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsb3dSZXBlYXRPcmRlcnMgPSBjb25maWcuYWxsb3dSZXBlYXRPcmRlcnM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVwZWF0T3JkZXJzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlRGlzY291bnRzID0gY29uZmlnPy5oaWRlRGlzY291bnRzID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVUYXhlcyA9IGNvbmZpZz8uaGlkZVRheGVzID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpZWxkTm90ZXNJbkFydGljbGVGaWxlID0gISFjb25maWc/LmVuYWJsZUZpZWxkTm90ZXNJbkFydGljbGVGaWxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIGdldFVybEJhc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25zdHMuZ2V0VXJsQmFzZSgpO1xuICAgIH1cbiAgICBcbiAgICBiYWNrKCkge1xuICAgICAgICAvLyBFbiBsdWdhciBkZTogdGhpcy5fcm91dGVyLm5hdmlnYXRlQnlVcmwoJ2FjY291bnQnKTtcbiAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFsnL2FjY291bnQnXSwgeyBxdWVyeVBhcmFtczogeyBzZWN0aW9uOiAnb3JkZXJzJyB9IH0pO1xuICAgIH1cbiAgICBcbiAgICB0b0RhdGUoZGF0ZTogYW55LCBmb3JtYXQ6IGFueSkge1xuICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdCghZm9ybWF0ICYmICdERC9NTS9ZWVlZLCBoOm1tOnNzIGEnIHx8IGZvcm1hdClcbiAgICB9XG5cbiAgICByZXBlYXRPcmRlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dSZXBlYXRPcmRlcnMgJiYgdGhpcy5vcmRlck9iaikge1xuICAgICAgICAgICAgdGhpcy5fY2FydFNlcnZpY2UuYWRkUmVwZWF0T3JkZXJUb0NhcnQodGhpcy5vcmRlck9iai5pdGVtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtZWRpYVVybCA9ICgpID0+IHRoaXMuX2NvbnN0YW50cy5tZWRpYVVybCgpO1xuXG4gICAgb3BlbkRvY3VtZW50c01vZGFsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dEb2N1bWVudHNNb2RhbCA9IHRydWU7XG4gICAgfVxuXG4gICAgY2xvc2VEb2N1bWVudHNNb2RhbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zaG93RG9jdW1lbnRzTW9kYWwgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9sb2FkT3JkZXJEb2N1bWVudHModG9rZW5WYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3JkZXJEb2NzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX29yZGVyRG9jdW1lbnRzU2VydmljZS5nZXREb2N1bWVudHModG9rZW5WYWx1ZSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChkb2NzKSA9PiB7IHRoaXMub3JkZXJEb2N1bWVudHMgPSBkb2NzOyB0aGlzLm9yZGVyRG9jc0xvYWRpbmcgPSBmYWxzZTsgfSxcbiAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMub3JkZXJEb2NzTG9hZGluZyA9IGZhbHNlOyB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uT3JkZXJGaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIHRoaXMub3JkZXJEb2NTZWxlY3RlZEZpbGUgPSBpbnB1dC5maWxlcz8uWzBdID8/IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBsb2FkT3JkZXJEb2N1bWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9yZGVyRG9jU2VsZWN0ZWRGaWxlIHx8ICF0aGlzLm9yZGVyT2JqPy50b2tlblZhbHVlKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLl9maWxlVmFsaWRhdG9yLnZhbGlkYXRlKHRoaXMub3JkZXJEb2NTZWxlY3RlZEZpbGUpO1xuICAgICAgICBpZiAoIXZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICAgICAgLy8gU3VyZmFjZSB0aGUgZXJyb3IgdmlhIHRoZSBleGlzdGluZyBkb2N1bWVudHMgc2VjdGlvbiBlcnJvciBzdGF0ZS5cbiAgICAgICAgICAgIHRoaXMub3JkZXJEb2N1bWVudHM7IC8vIG5vLW9wIOKAlCBlcnJvciBzaG93biB2aWEgY29uc29sZSBmb3Igbm93XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tvcmRlci1lY10gRmlsZSByZWplY3RlZCBieSBzZWN1cml0eSB2YWxpZGF0b3I6JywgdmFsaWRhdGlvbi5lcnJvclR5cGUsIHZhbGlkYXRpb24ubWVzc2FnZSk7XG4gICAgICAgICAgICAvLyBSZS1zdXJmYWNlIGFzIGEgdGVtcG9yYXJ5IGlubGluZSBmbGFnIHNvIHRoZSB0ZW1wbGF0ZSBjYW4gc2hvdyBpdC5cbiAgICAgICAgICAgIHRoaXMub3JkZXJEb2NVcGxvYWRFcnJvciA9IHZhbGlkYXRpb24ubWVzc2FnZSA/PyAnSW52YWxpZCBmaWxlLic7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9yZGVyRG9jVXBsb2FkRXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLm9yZGVyRG9jc1VwbG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX29yZGVyRG9jdW1lbnRzU2VydmljZS51cGxvYWREb2N1bWVudChcbiAgICAgICAgICAgIHRoaXMub3JkZXJPYmoudG9rZW5WYWx1ZSxcbiAgICAgICAgICAgIHRoaXMub3JkZXJEb2NTZWxlY3RlZEZpbGUsXG4gICAgICAgICAgICB0aGlzLm9yZGVyRG9jU2VsZWN0ZWRUeXBlIHx8IHVuZGVmaW5lZFxuICAgICAgICApLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoZG9jKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcmRlckRvY3VtZW50cyA9IFsuLi50aGlzLm9yZGVyRG9jdW1lbnRzLCBkb2NdO1xuICAgICAgICAgICAgICAgIHRoaXMub3JkZXJEb2NTZWxlY3RlZEZpbGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMub3JkZXJEb2NTZWxlY3RlZFR5cGUgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcmRlckZpbGVJbnB1dCkgeyB0aGlzLm9yZGVyRmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJzsgfVxuICAgICAgICAgICAgICAgIHRoaXMub3JkZXJEb2NzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5vcmRlckRvY3NVcGxvYWRpbmcgPSBmYWxzZTsgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvcmRlckRvY0Rvd25sb2FkVXJsKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBiYXNlID0gKHRoaXMuX2NvbnN0cy5nZXRVcmxCYXNlKCkgfHwgJycpLnJlcGxhY2UoL1xcLyskLywgJycpO1xuICAgICAgICByZXR1cm4gYCR7YmFzZX0vbWVkaWEvb3JkZXJfZG9jdW1lbnRzLyR7ZmlsZU5hbWV9YDtcbiAgICB9XG59IiwiPG1haW4gY2xhc3M9XCJweS01XCIgaWQ9XCJvcmRlckVjQ29tcG9uZW50XCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICBAaWYob3JkZXIkIHwgYXN5bmM7IGFzIG9yZGVyKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwXCI+XG4gICAgICAgICAgICBAaWYob3JkZXIpIHtcblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBvcmRlci1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLWF1dG8gY29sLTEyIGZvbnQtYnJhbmRvblwiPlxuICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJ0aXQxIGZ3LWJvbGQgb3JkZXItdGl0bGVcIj57eyAoJ29yZGVyJyB8IHRyYW5zbGF0ZSkgKyAnOiAnICsgb3JkZXIubnVtYmVyIH19PC9oND5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBAaWYob3JkZXI/Lmludm9pY2UpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtIGNvbC0xMiBmb250LWJyYW5kb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgW2hyZWZdPVwiZ2V0VXJsQmFzZSgpLnNsaWNlKDAsIC0xKSArIG9yZGVyLmludm9pY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWludm9pY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZpbGUtZG93bmxvYWQgbWUtMVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdkb3dubG9hZCcgfCB0cmFuc2xhdGUgfX0ge3sgJ2ludm9pY2VzJyB8IHRyYW5zbGF0ZSB8IHRpdGxlY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byB0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYmFjaygpXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFyayBidHZvbHZlciBib3JkZXJcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2stdG8tb3JkZXJzJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxzZWN0aW9uIGlkPVwib3JkZXJzXCIgY2xhc3M9XCJvcmRlci1tZXRhLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHB0LTIgb3JkZXItbWV0YS1ncmlkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMiBjb2wtMTIgb3JkZXItbWV0YS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInN0XCI+e3sgJ3BheW1lbnQtc3RhdGUnIHwgdHJhbnNsYXRlIH19OjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwib3JkZXItbWV0YS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZGVyLnBheW1lbnRzWzBdLnN0YXRlIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgY29sLTEyIGZvbnQtYnJhbmRvbiBvcmRlci1tZXRhLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RcIj57eyAnc2hpcG1lbnQtc3RhdGUnIHwgdHJhbnNsYXRlIH19OjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwib3JkZXItbWV0YS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZGVyLnNoaXBtZW50c1swXS5zdGF0ZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIGNvbC0xMiBmb250LWJyYW5kb24gb3JkZXItbWV0YS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInN0XCI+e3sgJ3BheW1lbnQtbWV0aG9kJyB8IHRyYW5zbGF0ZSB9fTo8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm9yZGVyLW1ldGEtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcmRlci5wYXltZW50c1swXT8ubWV0aG9kPy5uYW1lIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgY29sLTEyIGZvbnQtYnJhbmRvbiBvcmRlci1tZXRhLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RcIj57eyAnc2hpcG1lbnQtbWV0aG9kJyB8IHRyYW5zbGF0ZSB9fTo8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm9yZGVyLW1ldGEtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcmRlci5zaGlwbWVudHNbMF0ubWV0aG9kLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihvcmRlci50cmFja2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwib3JkZXIudHJhY2tpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLWRhcmsgYnRuTG9nb3V0IHB4LTMgcHktMSBmb250LXNpemUtMTAgdy1hdXRvIGJ0bi1zbSBvcmRlci10cmFja2luZy1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXIgc2VndWltaWVudG88L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgY29sLTEyIGZvbnQtYnJhbmRvbiBvcmRlci1tZXRhLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RcIj57eyAnZGF0ZScgfCB0cmFuc2xhdGUgfX06PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJvcmRlci1tZXRhLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9EYXRlKG9yZGVyLmNoZWNrb3V0Q29tcGxldGVkQXQsICdERC9NTS9ZWVlZJykgfCB0cmFuc2xhdGUgfX08YnI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9EYXRlKG9yZGVyLmNoZWNrb3V0Q29tcGxldGVkQXQsICdoOm1tOnNzIGEnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmKHByaWNlVmlzaWJpbGl0eS5jYW5TaG93UHJpY2VzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIGNvbC0xMiBmb250LWJyYW5kb24gb3JkZXItbWV0YS1pdGVtIG9yZGVyLW1ldGEtdG90YWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RcIj57eyAndG90YWwnIHwgdHJhbnNsYXRlIH19OjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImZ3LWJvbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAob3JkZXIudG90YWxzLnRvdGFsKSB8IGVjQ3VycmVuY3lTeW1ib2x9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgICAgQGlmKCFwcmljZVZpc2liaWxpdHkuaGlkZVByaWNlcygpICYmIGFsbG93UmVwZWF0T3JkZXJzKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmQgbXQtMyBvcmRlci1yZXBlYXQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbWItMiBidG5SZXBlYXRPcmRlciBvcmRlci1hY3Rpb24tcHJpbWFyeVwiIChjbGljayk9XCJyZXBlYXRPcmRlcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdyZXBlYXQtb3JkZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lciBweS0zIGJvcmRlci10b3AgYm9yZGVyLWJvdHRvbSBvcmRlci1pdGVtcy13cmFwXCI+XG4gICAgICAgICAgICAgICAgQGlmKG9yZGVyLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIGZvbnQtc20gZm9udC1icmFuZG9uIGQtbm9uZSBkLW1kLWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAncHJvZHVjdCcgfCB0cmFuc2xhdGUgfCB1cHBlcmNhc2UgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCBmb250LXNtIGZvbnQtYnJhbmRvbiBkLW5vbmUgZC1tZC1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmKGNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiY29sTG90c1wiIGNsYXNzPVwiY29sLTEgZm9udC1zbSBmb250LWJyYW5kb24gZC1ub25lIGQtbWQtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdsb3RzJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYocHJpY2VWaXNpYmlsaXR5LmNhblNob3dQcmljZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgdGV4dC1jZW50ZXIgZm9udC1zbSBmb250LWJyYW5kb24gZC1ub25lIGQtbWQtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICd1bml0LXByaWNlJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEgdGV4dC1jZW50ZXIgZm9udC1zbSBmb250LWJyYW5kb24gZC1ub25lIGQtbWQtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdxdWFudGl0eScgfCB0cmFuc2xhdGUgfCB1cHBlcmNhc2UgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZihwcmljZVZpc2liaWxpdHkuY2FuU2hvd1ByaWNlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiB0ZXh0LWVuZCBmb250LXNtIGZvbnQtYnJhbmRvbiBkLW5vbmUgZC1tZC1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3RvdGFsJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEBmb3IoaXRlbSBvZiBvcmRlci5pdGVtczsgdHJhY2sgJGluZGV4OyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY2FydC1pdGVtcyBvcmRlci1pdGVtLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTUgY29sLW1kLTIgcHktMiBvcmRlckl0ZW1UaHVtYldyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0/LmltYWdlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwic21jIG1heHdpZHRoIGltZy1mbHVpZCByb3VuZGVkLWN1c3RvbSBvcmRlckl0ZW1UaHVtYlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJtZWRpYVVybCgpICsgIGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5pbWFnZXNbMF1cIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0ucHJvZHVjdC5waWN0dXJlc2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJzbWMgbWF4d2lkdGggaW1nLWZsdWlkIHJvdW5kZWQtY3VzdG9tIG9yZGVySXRlbVRodW1iXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cIm1lZGlhVXJsKCkgKyBpdGVtLnByb2R1Y3QucGljdHVyZXNkZWZhdWx0WzBdXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgY29sLTcgZmxleC1jb2x1bW4gZmxleC1tZC1yb3cganVzdGlmeS1jb250ZW50LXN0YXJ0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1icmFuZG9uIGQtZmxleCB3LTEwMCBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ucHJvZHVjdC5uYW1lIH19IChDb2Q6e3sgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLmNvZGUgfX0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihlbmFibGVGaWVsZE5vdGVzSW5BcnRpY2xlRmlsZSAmJiBpdGVtPy5jb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY29tbWVudC10cnVuY2F0ZWQgZnN0LWl0YWxpYyBzbWFsbCB0ZXh0LW11dGVkIG10LTEgbWItMFwiPlwie3sgaXRlbS5jb21tZW50cyB9fVwiPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmKGNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLW1kLW5vbmUgbXQtMiBvcmRlci1sb3RzLW1vYmlsZS13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0blNlZ3VpciBtLTAgdGV4dC1jZW50ZXIgb3JkZXItbG90cy1idG4gb3JkZXItbG90cy1tb2JpbGUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYnMtdG9nZ2xlXT1cIidjb2xsYXBzZSdcIiBbYXR0ci5kYXRhLWJzLXRhcmdldF09XCInI2NvbGxhcHNlRXhhbXBsZScraVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidjb2xsYXBzZUV4YW1wbGUnK2lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdsb3RzJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZihjaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGNvbC0xIGZsZXgtY29sdW1uIGZsZXgtbWQtcm93IGp1c3RpZnktY29udGVudC1zdGFydCBkLW5vbmUgZC1tZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG5TZWd1aXIgbS0wIHRleHQtY2VudGVyIG9yZGVyLWxvdHMtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWJzLXRvZ2dsZV09XCInY29sbGFwc2UnXCIgW2F0dHIuZGF0YS1icy10YXJnZXRdPVwiJyNjb2xsYXBzZUV4YW1wbGUnK2lcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ2NvbGxhcHNlRXhhbXBsZScraVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7eyAnc2VlJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyIGQtbWQtbm9uZSBvcmRlci1tb2JpbGUtcHJpY2VzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1jZW50ZXIgdy0xMDAgbS0wXCI+IHt7IGl0ZW0ucXVhbnRpdHkgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHByaWNlVmlzaWJpbGl0eS5jYW5TaG93UHJpY2VzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTQgZm9udC14bFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtY2VudGVyIHctMTAwIG0tMFwiPiB7eyAoaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNhbGVwcmljZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlIDogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnByaWNlKSB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY0N1cnJlbmN5U3ltYm9sfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IGZvbnQteGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWNlbnRlciB3LTEwMCBtLTBcIj4ge3sgKChpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zYWxlcHJpY2UgOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ucHJpY2UpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucXVhbnRpdHkpIHwgZWNDdXJyZW5jeVN5bWJvbH19PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmKHByaWNlVmlzaWJpbGl0eS5jYW5TaG93UHJpY2VzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIGQtbm9uZSBkLW1kLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtY2VudGVyIHctMTAwIG0tMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IChpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlID8gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNhbGVwcmljZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnByaWNlKSB8IGVjQ3VycmVuY3lTeW1ib2x9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEgZC1ub25lIGQtbWQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1jZW50ZXIgdy0xMDAgbS0wXCI+IHt7IGl0ZW0ucXVhbnRpdHkgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBAaWYocHJpY2VWaXNpYmlsaXR5LmNhblNob3dQcmljZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgZC1ub25lIGQtbWQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1lbmQgdy0xMDAgbS0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgKChpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlID8gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNhbGVwcmljZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnByaWNlKSAqIGl0ZW0ucXVhbnRpdHkpIHwgZWNDdXJyZW5jeVN5bWJvbH19PC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2VcIiBbYXR0ci5pZF09XCInY29sbGFwc2VFeGFtcGxlJytpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1ub25lIGQtbWQtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+IzwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPkVzdGFkbzwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPkNhbnRpZGFkPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+RmVjaGEgU29saWNpdGFkYTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPkZlY2hhIEVzdGltYWRhPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+U2VkZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPk5vdGE8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5Ub3RhbCBMb3RlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yKCBsb3Qgb2YgaXRlbS5vcmRlckl0ZW1Mb3Q7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwicm93XCI+e3tsb3QuaWR9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2xvdC5sb3Rfc3RhdHVzfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tsb3QucXVhbnRpdHl9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyB0b0RhdGUobG90LmRhdGVfcmVxdWVzdCwgJ0REL01NL1lZWVknKSB8IHRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihsb3QuZGF0ZV9kZWxpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9EYXRlKGxvdC5kYXRlX2RlbGl2ZXIsICdERC9NTS9ZWVlZJykgfCB0cmFuc2xhdGUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlBlbmRpZW50ZTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bG90LnNoaXBwaW5nX2FkZHJlc3NfbmFtZX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bG90Lm5vdGVzfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tsb3QudG90YWxfbG90IHwgZWNDdXJyZW5jeVN5bWJvbH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtbWQtbm9uZSBvcmRlci1sb3RzLW1vYmlsZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IoIGxvdCBvZiBpdGVtLm9yZGVySXRlbUxvdDsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpY2xlIGNsYXNzPVwib3JkZXItbG90cy1tb2JpbGUtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLWxvdHMtbW9iaWxlLWNhcmQtaGVhZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JkZXItbG90cy1tb2JpbGUtcGlsbFwiPnt7IGxvdC5sb3Rfc3RhdHVzIHwgdGl0bGVjYXNlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9XCJvcmRlci1sb3RzLW1vYmlsZS10b3RhbFwiPnt7IGxvdC50b3RhbF9sb3QgfCBlY0N1cnJlbmN5U3ltYm9sIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkbCBjbGFzcz1cIm9yZGVyLWxvdHMtbW9iaWxlLWdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHQ+IzwvZHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD57eyBsb3QuaWQgfX08L2RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD5Fc3RhZG88L2R0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGQ+e3sgbG90LmxvdF9zdGF0dXMgfCB0aXRsZWNhc2UgfX08L2RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD5DYW50aWRhZDwvZHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD57eyBsb3QucXVhbnRpdHkgfX08L2RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD5GZWNoYSBzb2xpY2l0YWRhPC9kdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkPnt7IHRvRGF0ZShsb3QuZGF0ZV9yZXF1ZXN0LCAnREQvTU0vWVlZWScpIHwgdHJhbnNsYXRlIH19PC9kZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHQ+RmVjaGEgZXN0aW1hZGE8L2R0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYobG90LmRhdGVfZGVsaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9EYXRlKGxvdC5kYXRlX2RlbGl2ZXIsICdERC9NTS9ZWVlZJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGllbnRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLWxvdHMtbW9iaWxlLWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0PlNlZGU8L2R0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGQ+e3sgbG90LnNoaXBwaW5nX2FkZHJlc3NfbmFtZSB9fTwvZGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLWxvdHMtbW9iaWxlLWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0Pk5vdGE8L2R0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGQ+e3sgbG90Lm5vdGVzIHx8ICfigJQnIH19PC9kZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWNsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyIG9yZGVyLXRvdGFscy13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZihwcmljZVZpc2liaWxpdHkuY2FuU2hvd1ByaWNlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHktNCBvcmRlci10b3RhbHMtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBmb250LWJyYW5kb24gZm9udC1tZCB0ZXh0LWdyYXkgYm9yZGVyLWJvdHRvbSBcIj57eyAndG90YWwtcHJvZHVjdHMnIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kIHRleHQtZ3JheSBib3JkZXItYm90dG9tICB0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAob3JkZXIudG90YWxzLml0ZW1zKSB8IGVjQ3VycmVuY3lTeW1ib2wgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBmb250LWJyYW5kb24gZm9udC1tZCB0ZXh0LWdyYXkgYm9yZGVyLWJvdHRvbSBcIj57eyAnc2hpcG1lbnQnIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kIHRleHQtZ3JheSBib3JkZXItYm90dG9tICB0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAob3JkZXIudG90YWxzLnNoaXBwaW5nIHx8ICcwJykgfCBlY0N1cnJlbmN5U3ltYm9sIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoIWhpZGVEaXNjb3VudHMgJiYgb3JkZXIudG90YWxzLnByb21vdGlvbiAmJiBvcmRlci50b3RhbHMucHJvbW90aW9uICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgZm9udC1icmFuZG9uIGZvbnQtbWQgdGV4dC1ncmF5IGJvcmRlci1ib3R0b20gXCI+e3sgJ2Rpc2NvdW50JyB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBmb250LWJyYW5kb24gZm9udC1tZCB0ZXh0LWdyYXkgYm9yZGVyLWJvdHRvbSAgdGV4dC1lbmQgdGV4dC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgKG9yZGVyLnRvdGFscy5wcm9tb3Rpb24pIHwgZWNDdXJyZW5jeVN5bWJvbCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihvcmRlci50b3RhbHMucGF5bWVudE1ldGhvZEFkanVzdG1lbnQgIT09IG51bGwgJiYgb3JkZXIudG90YWxzLnBheW1lbnRNZXRob2RBZGp1c3RtZW50ICE9PSB1bmRlZmluZWQgJiYgb3JkZXIudG90YWxzLnBheW1lbnRNZXRob2RBZGp1c3RtZW50ICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgZm9udC1icmFuZG9uIGZvbnQtbWQgdGV4dC1ncmF5IGJvcmRlci1ib3R0b20gXCI+e3sgKG9yZGVyLnRvdGFscy5wYXltZW50TWV0aG9kQWRqdXN0bWVudCA8IDAgPyAncGF5bWVudC1tZXRob2QtZGlzY291bnQnIDogJ3BheW1lbnQtbWV0aG9kLXN1cmNoYXJnZScpIHwgdHJhbnNsYXRlIH19QGlmKG9yZGVyLnRvdGFscy5wYXltZW50TWV0aG9kQWRqdXN0bWVudExhYmVsKXsgwrcge3sgb3JkZXIudG90YWxzLnBheW1lbnRNZXRob2RBZGp1c3RtZW50TGFiZWwgfX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kIHRleHQtZ3JheSBib3JkZXItYm90dG9tIHRleHQtZW5kXCI+e3sgb3JkZXIudG90YWxzLnBheW1lbnRNZXRob2RBZGp1c3RtZW50IHwgZWNDdXJyZW5jeVN5bWJvbCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihvcmRlci50b3RhbHMudGF4ZXMgJiYgb3JkZXIudG90YWxzLnRheGVzICE9IDAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kIHRleHQtZ3JheSBib3JkZXItYm90dG9tIFwiPnt7ICd0YXhlcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgZm9udC1icmFuZG9uIGZvbnQtbWQgdGV4dC1ncmF5IGJvcmRlci1ib3R0b20gIHRleHQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IChvcmRlci50b3RhbHMudGF4ZXMpIHwgZWNDdXJyZW5jeVN5bWJvbCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZighaGlkZVRheGVzICYmIG9yZGVyLnRvdGFscy5yZWZ1bmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kIHRleHQtZ3JheSBib3JkZXItYm90dG9tIFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmRlci50b3RhbHMucmVmdW5kcy5yZWZ1bmRSZWFzb24pIHwgdGl0bGVjYXNlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kIHRleHQtZ3JheSBib3JkZXItYm90dG9tICB0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAoLSBvcmRlci50b3RhbHMucmVmdW5kcy5yZWZ1bmRUb3RhbCkgfCBlY0N1cnJlbmN5U3ltYm9sIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChvcmRlci50b3RhbHMucmVmdW5kcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBmb250LWJyYW5kb24gZm9udC1tZFwiPnt7ICd0b3RhbCcgfCB0cmFuc2xhdGUgfCB1cHBlcmNhc2UgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgZm9udC1icmFuZG9uIGZvbnQtbWQgdGV4dC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgKG9yZGVyLnRvdGFscy5yZWZ1bmRzLnRvdGFsQWZ0ZXJSZWZ1bmQpIHwgZWNDdXJyZW5jeVN5bWJvbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZvbnQtYnJhbmRvbiBmb250LW1kXCI+e3sgJ3RvdGFsJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBmb250LWJyYW5kb24gZm9udC1tZCB0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAob3JkZXIudG90YWxzLnRvdGFsKSB8IGVjQ3VycmVuY3lTeW1ib2wgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICBAaWYoc2hvd0RvY3VtZW50c01vZGFsKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYmFja2Ryb3AgZmFkZSBzaG93XCIgKGNsaWNrKT1cImNsb3NlRG9jdW1lbnRzTW9kYWwoKVwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGUgc2hvdyBkLWJsb2NrXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGUgZm9udC1icmFuZG9uXCI+RG9jdW1lbnRvczwvaDU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VEb2N1bWVudHNNb2RhbCgpXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvcihkb2N1bWVudCBvZiBvcmRlci5kb2N1bWVudHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRhcmdldD1cIl9ibGFua1wiIFtocmVmXT1cImdldFVybEJhc2UoKS5zbGljZSgwLCAtMSkgKyBkb2N1bWVudC5wYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rIHAtMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZmlsZS1kb3dubG9hZCBtZS0yXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZG9jdW1lbnQudHlwZUxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWRhc2g7IHt7ICdkb3dubG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYob3JkZXJEb2N1bWVudHNWaXNpYmlsaXR5LnNob3dPcmRlckRvY3VtZW50cygpICYmIG9yZGVyT2JqPy50b2tlblZhbHVlKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyIG10LTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImZvbnQtYnJhbmRvbiBmdy1zZW1pYm9sZCBtYi0zXCI+e3sgJ29yZGVyLmRvY3VtZW50cy50aXRsZScgfCB0cmFuc2xhdGUgfX08L2g1PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYob3JkZXJEb2NzTG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gdGV4dC1zZWNvbmRhcnlcIiByb2xlPVwic3RhdHVzXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYob3JkZXJEb2N1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yKGRvYyBvZiBvcmRlckRvY3VtZW50czsgdHJhY2sgZG9jLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgcHktMiBib3JkZXItYm90dG9tXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZmlsZS1lYXJtYXJrIHRleHQtbXV0ZWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1ncm93LTEgc21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRvYy5maWxlTmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGRvYy50eXBlTGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc2Vjb25kYXJ5IG1zLTEgc21hbGxcIj57eyBkb2MudHlwZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cIm9yZGVyRG9jRG93bmxvYWRVcmwoZG9jLmZpbGVOYW1lKVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1zbSBwLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZG93bmxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG1iLTNcIj57eyAnb3JkZXIuZG9jdW1lbnRzLmVtcHR5JyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTJcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBmb3JtLWxhYmVsLXNtXCI+e3sgJ29yZGVyLmRvY3VtZW50cy5maWxlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjb3JkZXJGaWxlSW5wdXQgdHlwZT1cImZpbGVcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0PVwiLnBkZiwuanBnLC5qcGVnLC5wbmdcIiAoY2hhbmdlKT1cIm9uT3JkZXJGaWxlU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0IG10LTFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgbGluZS1oZWlnaHQ6IDE7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAndXNlci1wb3J0YWwuZG9jdW1lbnRzLmFsbG93ZWQtZm9ybWF0cycgfCB0cmFuc2xhdGUgfX06IC5wZGYsIC5qcGcsIC5qcGVnLCAucG5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGZvcm0tbGFiZWwtc21cIj57eyAnb3JkZXIuZG9jdW1lbnRzLnR5cGUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgWyhuZ01vZGVsKV09XCJvcmRlckRvY1NlbGVjdGVkVHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInByb29mX29mX3BheW1lbnRfdHlwZVwiPnt7ICdvcmRlci5kb2N1bWVudHMudHlwZS1wYXltZW50LXJlY2VpcHQnIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJvdGhlclwiPnt7ICdvcmRlci5kb2N1bWVudHMudHlwZS1vdGhlcicgfCB0cmFuc2xhdGUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zIGQtZmxleCBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGZvcm0tbGFiZWwtc20gZC1ub25lIGQtc20tYmxvY2sgaW52aXNpYmxlXCI+U3BhY2VyPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFyayBidG4tc20gdy0xMDAgbXQtYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEuMXJlbTtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFvcmRlckRvY1NlbGVjdGVkRmlsZSB8fCBvcmRlckRvY3NVcGxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwbG9hZE9yZGVyRG9jdW1lbnQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKG9yZGVyRG9jc1VwbG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0xXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXVwbG9hZCBtZS0xXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ29yZGVyLmRvY3VtZW50cy51cGxvYWQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKG9yZGVyRG9jVXBsb2FkRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgcHktMiBzbWFsbCBtYi0wXCI+e3sgb3JkZXJEb2NVcGxvYWRFcnJvciB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGgtNTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNT57eyAnbm8tb3JkZXJzJyB8IHRyYW5zbGF0ZSB9fTwvaDU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBoLTUwIHB5LTVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWxvYWRpbmctZnVsbC1lYz48L2FwcC1sb2FkaW5nLWZ1bGwtZWM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbWFpbj5cbiJdfQ==