ng-easycommerce-v18 0.6.24 → 0.6.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,10 @@
1
+ # Version 0.6.25
2
+ - Checkout legacy (envío): se robusteció el render de contratos para tolerar `contracts` vacíos/undefined y evitar errores al iterar o seleccionar opciones.
3
+ - `shipment-ec`: la selección de contrato ahora es segura (guards nulos) y se mantiene el estado `selected` sólo cuando el contrato existe.
4
+ - `shipment-ec`: `validName(...)` contempla `pickup_store` para mostrar correctamente etiquetas de sucursal/método aun cuando el backend envíe nombres técnicos.
5
+ - `ShipmentService`: en `pickup_store` se publican costos incluso si aún no cargaron sucursales y se completa `detail` con fallback; si existe una única sucursal se usa automáticamente para detalle y `shipping_method_branch_code`.
6
+ - `ShipmentService` y `shipment-ec`: se prioriza `shipping_method_branch_code` provisto por contrato (cuando existe) al construir payloads de selección de envío, evitando enviar códigos incorrectos.
7
+ - Logging: `setContract` ahora reporta también el payload del contrato al capturar errores para facilitar diagnóstico.
1
8
  # Version 0.6.24
2
9
  - Colección sin filtros: `CollectionEcComponent` usa `products` como fallback del title cuando no hay breadcrumb ni búsqueda, para que `/collection` muestre `Productos` en la pestaña en lugar de `Colección`.
3
10
  # Version 0.6.23
@@ -168,14 +168,19 @@ export class ShipmentEcComponent {
168
168
  this.buttonsDisabled = false;
169
169
  this.loadingInternal = false;
170
170
  }
171
- validName(name) {
171
+ validName(name, costName) {
172
+ if (costName?.includes('pickup_store')) {
173
+ return true;
174
+ }
172
175
  return isNaN(name);
173
176
  }
174
177
  emitResult = async (method_name, contract_data) => {
175
178
  contract_data = {
176
179
  ...contract_data,
177
180
  shipping_method_contract: method_name + '_' + contract_data.name,
178
- shipping_method_branch_code: method_name == 'branch_delivery' ? contract_data.sucursal_id : contract_data.name,
181
+ shipping_method_branch_code: method_name == 'branch_delivery'
182
+ ? contract_data.sucursal_id
183
+ : (contract_data.shipping_method_branch_code || contract_data.name),
179
184
  };
180
185
  this.loadingInternal = true;
181
186
  try {
@@ -192,8 +197,12 @@ export class ShipmentEcComponent {
192
197
  };
193
198
  verifyValidate(costs, contract, data) {
194
199
  try {
195
- costs.forEach((cost) => cost.contracts.forEach((co) => co.selected = false));
196
- costs.find((cost) => cost.name == contract).contracts.find((contra) => contra.name == data.name).selected = true;
200
+ costs.forEach((cost) => (cost?.contracts || []).forEach((co) => co.selected = false));
201
+ const selectedCost = costs.find((cost) => cost?.name == contract);
202
+ const selectedContract = (selectedCost?.contracts || []).find((contra) => contra?.name == data?.name);
203
+ if (selectedContract) {
204
+ selectedContract.selected = true;
205
+ }
197
206
  }
198
207
  catch (error) {
199
208
  console.log('error al buscar contrato', error);
@@ -401,11 +410,11 @@ export class ShipmentEcComponent {
401
410
  this._checkoutService.next();
402
411
  }
403
412
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ShipmentEcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
404
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ShipmentEcComponent, isStandalone: true, selector: "app-shipment-ec", inputs: { compactShipmentView: "compactShipmentView" }, outputs: { summaryChange: "summaryChange", advanceStep: "advanceStep" }, ngImport: i0, template: "@if(compactShipmentView){\n<app-shipment-ec-single [loadingInternal]=\"loadingInternal\" [loadingPreload]=\"loadingPreload\"\n [singleOptions]=\"singleOptions\" [groupedOptions]=\"groupedOptions\" [selectedOptionId]=\"selectedOptionId\"\n [unavailableMethods]=\"unavailableMethods\" [methods]=\"methods$ | async\" [shipmentErrorKey]=\"shipmentErrorKey\"\n [isFreeShipping]=\"costos?.amount == 0\" (selectOption)=\"selectSingleOption($event)\">\n</app-shipment-ec-single>\n} @else {\n<div class=\"container-fluid\">\n <div class=\"col-12\">\n <div class=\"card text-center\">\n <div class=\"card-header text-dark\">\n <h4>{{ 'select-method' | translate }}</h4>\n @if(methodsLoading$ | async){\n <div class=\"d-flex flex-column align-items-center justify-content-center mt-3 mb-2\">\n <app-loading-inline-ec></app-loading-inline-ec>\n <span class=\"text-secondary mt-2\">{{ 'loading' | translate }}...</span>\n </div>\n } @else {\n @if(methods$ | async; as methods){\n @if(filterMethods(methods).length){\n <div class=\"btn-toolbar justify-content-center\" role=\"toolbar\" aria-label=\"Envios toolbar\">\n <div class=\"\" role=\"group\" aria-label=\"Grupo botones envio\">\n <div class=\"d-flex align-content-start justify-content-center flex-wrap\">\n @for(method of filterMethods(methods); track $index){\n <button [disabled]=\"buttonsDisabled\" type=\"button\"\n [class]=\"'btn btn-outline-secondary mx-1 mb-1' + (isMethodActive(method.code) ? ' active' : '')\"\n (click)=\"setMethod(method)\">\n {{ method.name | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"d-flex flex-row w-100 justify-content-center mt-2\">\n <h5 class=\"text-secondary\">{{'no-shipment-methods'|translate}}</h5>\n </div>\n }\n }\n }\n </div>\n <div class=\"card-body\">\n @if(moreInfoInMethod && methodSelect && methodSelect.description){\n <div class=\"row justify-content-center mb-2\">\n <div class=\"col-12 col-md-6 col-lg-4 d-flex flex-column mb-2\" [id]=\"methodSelect.code\">\n @for(line of methodSelect.description.split('\\r\\n'); track $index; let i=$index){\n <span [id]=\"methodSelect.code+'-'+i\" [class]=\"'line-'+i\">{{line}}</span>\n }\n </div>\n </div>\n }\n @if(costs$ | async; as costs){\n @if(loadingInternal && methodSelect && !costs.length){\n <div class=\"d-flex flex-column align-items-center justify-content-center py-4\">\n <app-loading-inline-ec></app-loading-inline-ec>\n <span class=\"text-secondary mt-2\">{{ 'loading' | translate }}...</span>\n </div>\n } @else {\n <div class=\"row justify-content-center\">\n @for(cost of costs; track $index; let y = $index){\n <div class=\"col-auto text-dark\">\n @if(cost.contracts.length > 0){\n @if(costs.length > 1){\n <span><b>{{ cost.name | translate }}</b></span>\n <hr />\n } @else {\n <span><b>{{ methodSelect.name | translate }}</b></span>\n <hr />\n }\n @for(contract of cost.contracts; track $index; let i = $index){\n <div class=\"option\">\n <div class=\"form-check current-contract\">\n <input class=\"form-check-input\" [checked]=\"contract.selected\" type=\"radio\" name=\"card\"\n [id]=\"cost.name + i\" [disabled]=\"loadingInternal || (loadingStep$ | async)\"\n value=\"dark\" (click)=\"verifyValidate(costs,cost.name, contract)\">\n <label class=\"form-check-label\" [for]=\"cost.name + i\" aria-label=\"Dark grey\">\n @if(validName(contract.name)){\n <span\n [class]=\"(cost.name == 'home_delivery') ? 'shipment-contractname home_delivery' : 'shipment-contractname' \">\n {{ contract.name | translate }}\n </span>\n }\n @if(contract.computed){\n <span><br class=\"shipment-contractname\">{{ contract.computed | translate }}\n <br class=\"shipment-contractname\">\n </span>\n }\n @if(contract.detail){\n <div class=\"contract-detail\">\n @for(line of contract.detail.split(' - '); track $index; let i = $index){\n <div [class]=\"'contrat-item-'+i\">\n @if(i == 0){<span><b>{{ line }}</b></span>}\n @if(i > 0){<span class=\"inside-detail\">{{ line }}</span>}\n </div>\n }\n </div>\n }\n @if(contract.price > 0){\n <span [class]=\"'inside-detail ' + ( costos?.amount == 0 ? ' free ' : '') \">\n @if(!contract.computed){<br class=\"shipment-contractname\">}\n {{ ('price'|translate) + ': ' + (contract.price | ecCurrencySymbol) }}</span>\n }\n <br>\n </label>\n </div>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n <div class=\"row d-flex flex-row\">\n <div class=\"col-12 d-flex justify-content-between\">\n <button class=\"btn btn-primary text-white\" [disabled]=\"loadingInternal || (loadingStep$ | async)\"\n (click)=\"goBack()\">{{'back'|translate}}</button>\n <div class=\"disabled-click-target\" (click)=\"onNextButtonContainerClick()\">\n <button type=\"button\" (click)=\"next()\"\n [disabled]=\"isNextDisabled()\"\n class=\"btn btn-primary text-white allow-disabled-click\">\n @if(loadingInternal){\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>\n {{ 'loading' | translate }}...\n } @else {\n {{(isLastOne ? 'finish-checkout' :'ready-form') | translate}}\n }\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n", styles: [":host-context(.checkout-single) .btn.btn-primary{background-color:var(--ec-primary, #000);border-color:var(--ec-primary, #000);color:var(--ec-primary-contrast, #fff);padding:.75rem 1.5rem;font-size:1rem;min-height:46px;font-weight:600}:host-context(.checkout-single) .btn.btn-primary:disabled,:host-context(.checkout-single) .btn.btn-primary[disabled]{background-color:var(--ec-primary-muted, #6c757d);border-color:var(--ec-primary-muted, #6c757d);color:var(--ec-primary-contrast, #fff);opacity:.85}.disabled-click-target{display:inline-flex}.allow-disabled-click:disabled,.allow-disabled-click[disabled]{pointer-events:none}\n"], dependencies: [{ kind: "component", type: LoadingInlineEcComponent, selector: "app-loading-inline-ec", inputs: ["type"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: EcCurrencySymbolPipe, name: "ecCurrencySymbol" }, { kind: "component", type: ShipmentEcSingleComponent, selector: "app-shipment-ec-single", inputs: ["loadingInternal", "loadingPreload", "singleOptions", "groupedOptions", "selectedOptionId", "unavailableMethods", "methods", "shipmentErrorKey", "isFreeShipping"], outputs: ["selectOption"] }] });
413
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ShipmentEcComponent, isStandalone: true, selector: "app-shipment-ec", inputs: { compactShipmentView: "compactShipmentView" }, outputs: { summaryChange: "summaryChange", advanceStep: "advanceStep" }, ngImport: i0, template: "@if(compactShipmentView){\n<app-shipment-ec-single [loadingInternal]=\"loadingInternal\" [loadingPreload]=\"loadingPreload\"\n [singleOptions]=\"singleOptions\" [groupedOptions]=\"groupedOptions\" [selectedOptionId]=\"selectedOptionId\"\n [unavailableMethods]=\"unavailableMethods\" [methods]=\"methods$ | async\" [shipmentErrorKey]=\"shipmentErrorKey\"\n [isFreeShipping]=\"costos?.amount == 0\" (selectOption)=\"selectSingleOption($event)\">\n</app-shipment-ec-single>\n} @else {\n<div class=\"container-fluid\">\n <div class=\"col-12\">\n <div class=\"card text-center\">\n <div class=\"card-header text-dark\">\n <h4>{{ 'select-method' | translate }}</h4>\n @if(methodsLoading$ | async){\n <div class=\"d-flex flex-column align-items-center justify-content-center mt-3 mb-2\">\n <app-loading-inline-ec></app-loading-inline-ec>\n <span class=\"text-secondary mt-2\">{{ 'loading' | translate }}...</span>\n </div>\n } @else {\n @if(methods$ | async; as methods){\n @if(filterMethods(methods).length){\n <div class=\"btn-toolbar justify-content-center\" role=\"toolbar\" aria-label=\"Envios toolbar\">\n <div class=\"\" role=\"group\" aria-label=\"Grupo botones envio\">\n <div class=\"d-flex align-content-start justify-content-center flex-wrap\">\n @for(method of filterMethods(methods); track $index){\n <button [disabled]=\"buttonsDisabled\" type=\"button\"\n [class]=\"'btn btn-outline-secondary mx-1 mb-1' + (isMethodActive(method.code) ? ' active' : '')\"\n (click)=\"setMethod(method)\">\n {{ method.name | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"d-flex flex-row w-100 justify-content-center mt-2\">\n <h5 class=\"text-secondary\">{{'no-shipment-methods'|translate}}</h5>\n </div>\n }\n }\n }\n </div>\n <div class=\"card-body\">\n @if(moreInfoInMethod && methodSelect && methodSelect.description){\n <div class=\"row justify-content-center mb-2\">\n <div class=\"col-12 col-md-6 col-lg-4 d-flex flex-column mb-2\" [id]=\"methodSelect.code\">\n @for(line of methodSelect.description.split('\\r\\n'); track $index; let i=$index){\n <span [id]=\"methodSelect.code+'-'+i\" [class]=\"'line-'+i\">{{line}}</span>\n }\n </div>\n </div>\n }\n @if(costs$ | async; as costs){\n @if(loadingInternal && methodSelect && !costs.length){\n <div class=\"d-flex flex-column align-items-center justify-content-center py-4\">\n <app-loading-inline-ec></app-loading-inline-ec>\n <span class=\"text-secondary mt-2\">{{ 'loading' | translate }}...</span>\n </div>\n } @else {\n <div class=\"row justify-content-center\">\n @for(cost of costs; track $index; let y = $index){\n <div class=\"col-auto text-dark\">\n @if((cost.contracts || []).length > 0){\n @if(costs.length > 1){\n <span><b>{{ cost.name | translate }}</b></span>\n <hr />\n } @else {\n <span><b>{{ methodSelect.name | translate }}</b></span>\n <hr />\n }\n @for(contract of (cost.contracts || []); track $index; let i = $index){\n <div class=\"option\">\n <div class=\"form-check current-contract\">\n <input class=\"form-check-input\" [checked]=\"contract.selected\" type=\"radio\" name=\"card\"\n [id]=\"cost.name + i\" [disabled]=\"loadingInternal || (loadingStep$ | async)\"\n value=\"dark\" (click)=\"verifyValidate(costs,cost.name, contract)\">\n <label class=\"form-check-label\" [for]=\"cost.name + i\" aria-label=\"Dark grey\">\n @if(validName(contract.name, cost.name)){\n <span\n [class]=\"(cost.name == 'home_delivery') ? 'shipment-contractname home_delivery' : 'shipment-contractname' \">\n {{ (cost.name == 'pickup_store' && !validName(contract.name)) ? (methodSelect?.name || cost.name) : (contract.name | translate) }}\n </span>\n }\n @if(contract.computed){\n <span><br class=\"shipment-contractname\">{{ contract.computed | translate }}\n <br class=\"shipment-contractname\">\n </span>\n }\n @if(contract.detail){\n <div class=\"contract-detail\">\n @for(line of contract.detail.split(' - '); track $index; let i = $index){\n <div [class]=\"'contrat-item-'+i\">\n @if(i == 0){<span><b>{{ line }}</b></span>}\n @if(i > 0){<span class=\"inside-detail\">{{ line }}</span>}\n </div>\n }\n </div>\n }\n @if(!contract.computed && !contract.detail && !validName(contract.name)){\n <span class=\"shipment-contractname\">\n {{ methodSelect?.name || cost.name | translate }}\n </span>\n }\n @if(contract.price > 0){\n <span [class]=\"'inside-detail ' + ( costos?.amount == 0 ? ' free ' : '') \">\n @if(!contract.computed){<br class=\"shipment-contractname\">}\n {{ ('price'|translate) + ': ' + (contract.price | ecCurrencySymbol) }}</span>\n }\n <br>\n </label>\n </div>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n <div class=\"row d-flex flex-row\">\n <div class=\"col-12 d-flex justify-content-between\">\n <button class=\"btn btn-primary text-white\" [disabled]=\"loadingInternal || (loadingStep$ | async)\"\n (click)=\"goBack()\">{{'back'|translate}}</button>\n <div class=\"disabled-click-target\" (click)=\"onNextButtonContainerClick()\">\n <button type=\"button\" (click)=\"next()\"\n [disabled]=\"isNextDisabled()\"\n class=\"btn btn-primary text-white allow-disabled-click\">\n @if(loadingInternal){\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>\n {{ 'loading' | translate }}...\n } @else {\n {{(isLastOne ? 'finish-checkout' :'ready-form') | translate}}\n }\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n", styles: [":host-context(.checkout-single) .btn.btn-primary{background-color:var(--ec-primary, #000);border-color:var(--ec-primary, #000);color:var(--ec-primary-contrast, #fff);padding:.75rem 1.5rem;font-size:1rem;min-height:46px;font-weight:600}:host-context(.checkout-single) .btn.btn-primary:disabled,:host-context(.checkout-single) .btn.btn-primary[disabled]{background-color:var(--ec-primary-muted, #6c757d);border-color:var(--ec-primary-muted, #6c757d);color:var(--ec-primary-contrast, #fff);opacity:.85}.disabled-click-target{display:inline-flex}.allow-disabled-click:disabled,.allow-disabled-click[disabled]{pointer-events:none}\n"], dependencies: [{ kind: "component", type: LoadingInlineEcComponent, selector: "app-loading-inline-ec", inputs: ["type"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: EcCurrencySymbolPipe, name: "ecCurrencySymbol" }, { kind: "component", type: ShipmentEcSingleComponent, selector: "app-shipment-ec-single", inputs: ["loadingInternal", "loadingPreload", "singleOptions", "groupedOptions", "selectedOptionId", "unavailableMethods", "methods", "shipmentErrorKey", "isFreeShipping"], outputs: ["selectOption"] }] });
405
414
  }
406
415
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ShipmentEcComponent, decorators: [{
407
416
  type: Component,
408
- args: [{ selector: 'app-shipment-ec', standalone: true, imports: [LoadingFullEcComponent, LoadingInlineEcComponent, TranslateModule, AsyncPipe, EcCurrencySymbolPipe, JsonPipe, ShipmentEcSingleComponent], template: "@if(compactShipmentView){\n<app-shipment-ec-single [loadingInternal]=\"loadingInternal\" [loadingPreload]=\"loadingPreload\"\n [singleOptions]=\"singleOptions\" [groupedOptions]=\"groupedOptions\" [selectedOptionId]=\"selectedOptionId\"\n [unavailableMethods]=\"unavailableMethods\" [methods]=\"methods$ | async\" [shipmentErrorKey]=\"shipmentErrorKey\"\n [isFreeShipping]=\"costos?.amount == 0\" (selectOption)=\"selectSingleOption($event)\">\n</app-shipment-ec-single>\n} @else {\n<div class=\"container-fluid\">\n <div class=\"col-12\">\n <div class=\"card text-center\">\n <div class=\"card-header text-dark\">\n <h4>{{ 'select-method' | translate }}</h4>\n @if(methodsLoading$ | async){\n <div class=\"d-flex flex-column align-items-center justify-content-center mt-3 mb-2\">\n <app-loading-inline-ec></app-loading-inline-ec>\n <span class=\"text-secondary mt-2\">{{ 'loading' | translate }}...</span>\n </div>\n } @else {\n @if(methods$ | async; as methods){\n @if(filterMethods(methods).length){\n <div class=\"btn-toolbar justify-content-center\" role=\"toolbar\" aria-label=\"Envios toolbar\">\n <div class=\"\" role=\"group\" aria-label=\"Grupo botones envio\">\n <div class=\"d-flex align-content-start justify-content-center flex-wrap\">\n @for(method of filterMethods(methods); track $index){\n <button [disabled]=\"buttonsDisabled\" type=\"button\"\n [class]=\"'btn btn-outline-secondary mx-1 mb-1' + (isMethodActive(method.code) ? ' active' : '')\"\n (click)=\"setMethod(method)\">\n {{ method.name | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"d-flex flex-row w-100 justify-content-center mt-2\">\n <h5 class=\"text-secondary\">{{'no-shipment-methods'|translate}}</h5>\n </div>\n }\n }\n }\n </div>\n <div class=\"card-body\">\n @if(moreInfoInMethod && methodSelect && methodSelect.description){\n <div class=\"row justify-content-center mb-2\">\n <div class=\"col-12 col-md-6 col-lg-4 d-flex flex-column mb-2\" [id]=\"methodSelect.code\">\n @for(line of methodSelect.description.split('\\r\\n'); track $index; let i=$index){\n <span [id]=\"methodSelect.code+'-'+i\" [class]=\"'line-'+i\">{{line}}</span>\n }\n </div>\n </div>\n }\n @if(costs$ | async; as costs){\n @if(loadingInternal && methodSelect && !costs.length){\n <div class=\"d-flex flex-column align-items-center justify-content-center py-4\">\n <app-loading-inline-ec></app-loading-inline-ec>\n <span class=\"text-secondary mt-2\">{{ 'loading' | translate }}...</span>\n </div>\n } @else {\n <div class=\"row justify-content-center\">\n @for(cost of costs; track $index; let y = $index){\n <div class=\"col-auto text-dark\">\n @if(cost.contracts.length > 0){\n @if(costs.length > 1){\n <span><b>{{ cost.name | translate }}</b></span>\n <hr />\n } @else {\n <span><b>{{ methodSelect.name | translate }}</b></span>\n <hr />\n }\n @for(contract of cost.contracts; track $index; let i = $index){\n <div class=\"option\">\n <div class=\"form-check current-contract\">\n <input class=\"form-check-input\" [checked]=\"contract.selected\" type=\"radio\" name=\"card\"\n [id]=\"cost.name + i\" [disabled]=\"loadingInternal || (loadingStep$ | async)\"\n value=\"dark\" (click)=\"verifyValidate(costs,cost.name, contract)\">\n <label class=\"form-check-label\" [for]=\"cost.name + i\" aria-label=\"Dark grey\">\n @if(validName(contract.name)){\n <span\n [class]=\"(cost.name == 'home_delivery') ? 'shipment-contractname home_delivery' : 'shipment-contractname' \">\n {{ contract.name | translate }}\n </span>\n }\n @if(contract.computed){\n <span><br class=\"shipment-contractname\">{{ contract.computed | translate }}\n <br class=\"shipment-contractname\">\n </span>\n }\n @if(contract.detail){\n <div class=\"contract-detail\">\n @for(line of contract.detail.split(' - '); track $index; let i = $index){\n <div [class]=\"'contrat-item-'+i\">\n @if(i == 0){<span><b>{{ line }}</b></span>}\n @if(i > 0){<span class=\"inside-detail\">{{ line }}</span>}\n </div>\n }\n </div>\n }\n @if(contract.price > 0){\n <span [class]=\"'inside-detail ' + ( costos?.amount == 0 ? ' free ' : '') \">\n @if(!contract.computed){<br class=\"shipment-contractname\">}\n {{ ('price'|translate) + ': ' + (contract.price | ecCurrencySymbol) }}</span>\n }\n <br>\n </label>\n </div>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n <div class=\"row d-flex flex-row\">\n <div class=\"col-12 d-flex justify-content-between\">\n <button class=\"btn btn-primary text-white\" [disabled]=\"loadingInternal || (loadingStep$ | async)\"\n (click)=\"goBack()\">{{'back'|translate}}</button>\n <div class=\"disabled-click-target\" (click)=\"onNextButtonContainerClick()\">\n <button type=\"button\" (click)=\"next()\"\n [disabled]=\"isNextDisabled()\"\n class=\"btn btn-primary text-white allow-disabled-click\">\n @if(loadingInternal){\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>\n {{ 'loading' | translate }}...\n } @else {\n {{(isLastOne ? 'finish-checkout' :'ready-form') | translate}}\n }\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n", styles: [":host-context(.checkout-single) .btn.btn-primary{background-color:var(--ec-primary, #000);border-color:var(--ec-primary, #000);color:var(--ec-primary-contrast, #fff);padding:.75rem 1.5rem;font-size:1rem;min-height:46px;font-weight:600}:host-context(.checkout-single) .btn.btn-primary:disabled,:host-context(.checkout-single) .btn.btn-primary[disabled]{background-color:var(--ec-primary-muted, #6c757d);border-color:var(--ec-primary-muted, #6c757d);color:var(--ec-primary-contrast, #fff);opacity:.85}.disabled-click-target{display:inline-flex}.allow-disabled-click:disabled,.allow-disabled-click[disabled]{pointer-events:none}\n"] }]
417
+ args: [{ selector: 'app-shipment-ec', standalone: true, imports: [LoadingFullEcComponent, LoadingInlineEcComponent, TranslateModule, AsyncPipe, EcCurrencySymbolPipe, JsonPipe, ShipmentEcSingleComponent], template: "@if(compactShipmentView){\n<app-shipment-ec-single [loadingInternal]=\"loadingInternal\" [loadingPreload]=\"loadingPreload\"\n [singleOptions]=\"singleOptions\" [groupedOptions]=\"groupedOptions\" [selectedOptionId]=\"selectedOptionId\"\n [unavailableMethods]=\"unavailableMethods\" [methods]=\"methods$ | async\" [shipmentErrorKey]=\"shipmentErrorKey\"\n [isFreeShipping]=\"costos?.amount == 0\" (selectOption)=\"selectSingleOption($event)\">\n</app-shipment-ec-single>\n} @else {\n<div class=\"container-fluid\">\n <div class=\"col-12\">\n <div class=\"card text-center\">\n <div class=\"card-header text-dark\">\n <h4>{{ 'select-method' | translate }}</h4>\n @if(methodsLoading$ | async){\n <div class=\"d-flex flex-column align-items-center justify-content-center mt-3 mb-2\">\n <app-loading-inline-ec></app-loading-inline-ec>\n <span class=\"text-secondary mt-2\">{{ 'loading' | translate }}...</span>\n </div>\n } @else {\n @if(methods$ | async; as methods){\n @if(filterMethods(methods).length){\n <div class=\"btn-toolbar justify-content-center\" role=\"toolbar\" aria-label=\"Envios toolbar\">\n <div class=\"\" role=\"group\" aria-label=\"Grupo botones envio\">\n <div class=\"d-flex align-content-start justify-content-center flex-wrap\">\n @for(method of filterMethods(methods); track $index){\n <button [disabled]=\"buttonsDisabled\" type=\"button\"\n [class]=\"'btn btn-outline-secondary mx-1 mb-1' + (isMethodActive(method.code) ? ' active' : '')\"\n (click)=\"setMethod(method)\">\n {{ method.name | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"d-flex flex-row w-100 justify-content-center mt-2\">\n <h5 class=\"text-secondary\">{{'no-shipment-methods'|translate}}</h5>\n </div>\n }\n }\n }\n </div>\n <div class=\"card-body\">\n @if(moreInfoInMethod && methodSelect && methodSelect.description){\n <div class=\"row justify-content-center mb-2\">\n <div class=\"col-12 col-md-6 col-lg-4 d-flex flex-column mb-2\" [id]=\"methodSelect.code\">\n @for(line of methodSelect.description.split('\\r\\n'); track $index; let i=$index){\n <span [id]=\"methodSelect.code+'-'+i\" [class]=\"'line-'+i\">{{line}}</span>\n }\n </div>\n </div>\n }\n @if(costs$ | async; as costs){\n @if(loadingInternal && methodSelect && !costs.length){\n <div class=\"d-flex flex-column align-items-center justify-content-center py-4\">\n <app-loading-inline-ec></app-loading-inline-ec>\n <span class=\"text-secondary mt-2\">{{ 'loading' | translate }}...</span>\n </div>\n } @else {\n <div class=\"row justify-content-center\">\n @for(cost of costs; track $index; let y = $index){\n <div class=\"col-auto text-dark\">\n @if((cost.contracts || []).length > 0){\n @if(costs.length > 1){\n <span><b>{{ cost.name | translate }}</b></span>\n <hr />\n } @else {\n <span><b>{{ methodSelect.name | translate }}</b></span>\n <hr />\n }\n @for(contract of (cost.contracts || []); track $index; let i = $index){\n <div class=\"option\">\n <div class=\"form-check current-contract\">\n <input class=\"form-check-input\" [checked]=\"contract.selected\" type=\"radio\" name=\"card\"\n [id]=\"cost.name + i\" [disabled]=\"loadingInternal || (loadingStep$ | async)\"\n value=\"dark\" (click)=\"verifyValidate(costs,cost.name, contract)\">\n <label class=\"form-check-label\" [for]=\"cost.name + i\" aria-label=\"Dark grey\">\n @if(validName(contract.name, cost.name)){\n <span\n [class]=\"(cost.name == 'home_delivery') ? 'shipment-contractname home_delivery' : 'shipment-contractname' \">\n {{ (cost.name == 'pickup_store' && !validName(contract.name)) ? (methodSelect?.name || cost.name) : (contract.name | translate) }}\n </span>\n }\n @if(contract.computed){\n <span><br class=\"shipment-contractname\">{{ contract.computed | translate }}\n <br class=\"shipment-contractname\">\n </span>\n }\n @if(contract.detail){\n <div class=\"contract-detail\">\n @for(line of contract.detail.split(' - '); track $index; let i = $index){\n <div [class]=\"'contrat-item-'+i\">\n @if(i == 0){<span><b>{{ line }}</b></span>}\n @if(i > 0){<span class=\"inside-detail\">{{ line }}</span>}\n </div>\n }\n </div>\n }\n @if(!contract.computed && !contract.detail && !validName(contract.name)){\n <span class=\"shipment-contractname\">\n {{ methodSelect?.name || cost.name | translate }}\n </span>\n }\n @if(contract.price > 0){\n <span [class]=\"'inside-detail ' + ( costos?.amount == 0 ? ' free ' : '') \">\n @if(!contract.computed){<br class=\"shipment-contractname\">}\n {{ ('price'|translate) + ': ' + (contract.price | ecCurrencySymbol) }}</span>\n }\n <br>\n </label>\n </div>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n <div class=\"row d-flex flex-row\">\n <div class=\"col-12 d-flex justify-content-between\">\n <button class=\"btn btn-primary text-white\" [disabled]=\"loadingInternal || (loadingStep$ | async)\"\n (click)=\"goBack()\">{{'back'|translate}}</button>\n <div class=\"disabled-click-target\" (click)=\"onNextButtonContainerClick()\">\n <button type=\"button\" (click)=\"next()\"\n [disabled]=\"isNextDisabled()\"\n class=\"btn btn-primary text-white allow-disabled-click\">\n @if(loadingInternal){\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>\n {{ 'loading' | translate }}...\n } @else {\n {{(isLastOne ? 'finish-checkout' :'ready-form') | translate}}\n }\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n", styles: [":host-context(.checkout-single) .btn.btn-primary{background-color:var(--ec-primary, #000);border-color:var(--ec-primary, #000);color:var(--ec-primary-contrast, #fff);padding:.75rem 1.5rem;font-size:1rem;min-height:46px;font-weight:600}:host-context(.checkout-single) .btn.btn-primary:disabled,:host-context(.checkout-single) .btn.btn-primary[disabled]{background-color:var(--ec-primary-muted, #6c757d);border-color:var(--ec-primary-muted, #6c757d);color:var(--ec-primary-contrast, #fff);opacity:.85}.disabled-click-target{display:inline-flex}.allow-disabled-click:disabled,.allow-disabled-click[disabled]{pointer-events:none}\n"] }]
409
418
  }], ctorParameters: () => [], propDecorators: { compactShipmentView: [{
410
419
  type: Input
411
420
  }], summaryChange: [{
@@ -413,4 +422,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
413
422
  }], advanceStep: [{
414
423
  type: Output
415
424
  }] } });
416
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpcG1lbnQtZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvY2hlY2tvdXQtZWMvc2hpcG1lbnQtZWMvc2hpcG1lbnQtZWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvY2hlY2tvdXQtZWMvc2hpcG1lbnQtZWMvc2hpcG1lbnQtZWMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQzs7O0FBUzlGLE1BQU0sT0FBTyxtQkFBbUI7SUFDcEIsZ0JBQWdCLEdBQW9CLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJ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QUUsZUFBZSx1RkFBRSxTQUFTLHlDQUFFLG9CQUFvQix5REFBWSx5QkFBeUI7OzRGQUV4SSxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBQ0ksaUJBQWlCLGNBQ2YsSUFBSSxXQUdQLENBQUMsc0JBQXNCLEVBQUUsd0JBQXdCLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUUseUJBQXlCLENBQUM7d0RBU3pJLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDSSxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBKc29uUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBEZXN0cm95UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENoZWNrb3V0U2VydmljZSwgU2hpcG1lbnRTZXJ2aWNlLCBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9lYy1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBFY0N1cnJlbmN5U3ltYm9sUGlwZSB9IGZyb20gJy4uLy4uLy4uL2VjLXBpcGUnO1xuaW1wb3J0IHsgTG9hZGluZ0Z1bGxFY0NvbXBvbmVudCwgTG9hZGluZ0lubGluZUVjQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vd2lkZ2V0cy1lYyc7XG5pbXBvcnQgeyBTaGlwbWVudEVjU2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnLi9zaGlwbWVudC1lYy1zaW5nbGUvc2hpcG1lbnQtZWMtc2luZ2xlLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLXNoaXBtZW50LWVjJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zaGlwbWVudC1lYy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2hpcG1lbnQtZWMuY29tcG9uZW50LnNjc3MnXSxcbiAgICBpbXBvcnRzOiBbTG9hZGluZ0Z1bGxFY0NvbXBvbmVudCwgTG9hZGluZ0lubGluZUVjQ29tcG9uZW50LCBUcmFuc2xhdGVNb2R1bGUsIEFzeW5jUGlwZSwgRWNDdXJyZW5jeVN5bWJvbFBpcGUsIEpzb25QaXBlLCBTaGlwbWVudEVjU2luZ2xlQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBTaGlwbWVudEVjQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwcml2YXRlIF9zaGlwbWVudFNlcnZpY2U6IFNoaXBtZW50U2VydmljZSA9IGluamVjdChTaGlwbWVudFNlcnZpY2UpO1xuICAgIHByaXZhdGUgX2NoZWNrb3V0U2VydmljZTogQ2hlY2tvdXRTZXJ2aWNlID0gaW5qZWN0KENoZWNrb3V0U2VydmljZSk7XG4gICAgcHJpdmF0ZSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF90b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICAgIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICBASW5wdXQoKSBjb21wYWN0U2hpcG1lbnRWaWV3OiBib29sZWFuID0gZmFsc2U7XG4gICAgQE91dHB1dCgpIHN1bW1hcnlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbGFiZWw/OiBzdHJpbmc7IGRldGFpbD86IHN0cmluZyB9PigpO1xuICAgIEBPdXRwdXQoKSBhZHZhbmNlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIHB1YmxpYyBtZXRob2RzJCA9IHRoaXMuX3NoaXBtZW50U2VydmljZS5tZXRob2RzJDtcbiAgICBwdWJsaWMgbWV0aG9kc0xvYWRpbmckID0gdGhpcy5fc2hpcG1lbnRTZXJ2aWNlLm1ldGhvZHNMb2FkaW5nJDtcbiAgICBwdWJsaWMgaXNMYXN0U3RlcCQgPSB0aGlzLl9jaGVja291dFNlcnZpY2UuaXNMYXN0U3RlcCQ7XG4gICAgcHVibGljIHN0YXRlJCA9IHRoaXMuX3NoaXBtZW50U2VydmljZS5zdGF0ZSQ7XG4gICAgcHVibGljIGVycm9yJCA9IHRoaXMuX3NoaXBtZW50U2VydmljZS5lcnJvciQ7XG4gICAgcHVibGljIGxvYWRpbmdTdGVwJCA9IHRoaXMuX2NoZWNrb3V0U2VydmljZS5sb2FkaW5nU3RlcCQ7XG5cbiAgICBwcml2YXRlIF9oaWRkZW5NZXRob2RzOiBzdHJpbmdbXSA9IFsnVVBTJ107XG4gICAgcHVibGljIGJ1dHRvbnNEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBtZXRob2RTZWxlY3Q6IGFueTtcbiAgICBwdWJsaWMgc2VsZWN0ZWRNZXRob2RDb2RlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgbG9hZGluZ0ludGVybmFsOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGxvYWRpbmdQcmVsb2FkOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSByZXN0b3JlZE9uSW5pdDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBtb3JlSW5mb0luTWV0aG9kOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNvc3RvczogYW55ID0gbnVsbDtcbiAgICBwdWJsaWMgY29zdHMkOiBPYnNlcnZhYmxlPGFueVtdPiA9IHRoaXMuX3NoaXBtZW50U2VydmljZS5jb3N0cyQ7XG4gICAgcHVibGljIGlzTGFzdE9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBlbmFibGVkQ29uZmlybUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBzaGlwbWVudEVycm9yS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgc2luZ2xlT3B0aW9uczogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgc2VsZWN0ZWRPcHRpb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHVuYXZhaWxhYmxlTWV0aG9kczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcbiAgICBwdWJsaWMgZ3JvdXBlZE9wdGlvbnM6IHsga2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IG9wdGlvbnM6IGFueVtdIH1bXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBsYXN0QWRkcmVzc0tleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBsb2FkaW5nU3RlcCA9IGZhbHNlO1xuICAgIHByaXZhdGUgcHJlbG9hZFJlcXVlc3RJZCA9IDA7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pc0xhc3RTdGVwJC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSkuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmlzTGFzdE9uZSA9IHJlcyk7XG4gICAgICAgIHRoaXMubG9hZGluZ1N0ZXAkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKS5zdWJzY3JpYmUocmVzID0+IHRoaXMubG9hZGluZ1N0ZXAgPSAhIXJlcyk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21wYWN0U2hpcG1lbnRWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLl9zaGlwbWVudFNlcnZpY2UuZ2V0U2hpcG1lbnRNZXRob2RzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jaGVja291dFNlcnZpY2UuYXNzb2NpYXRlZERhdGEkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29zdG9zID0gZGF0YSAmJiBkYXRhLmZpbmQoKHZhbHVlOiBhbnkpID0+IHZhbHVlLnR5cGUgPT0gJ3NoaXBtZW50JykgfHwgbnVsbDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZXJyb3IkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGVycm9yS2V5ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoaXBtZW50RXJyb3JLZXkgPSBlcnJvcktleTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5jb21wYWN0U2hpcG1lbnRWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlJFxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YSAmJiByZXMuZGF0YS5tZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZXRob2RDb2RlID0gcmVzLmRhdGEubWV0aG9kO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW5jTGVnYWN5U2VsZWN0aW9uU3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLm1ldGhvZHMkXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUobWV0aG9kcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWV0aG9kcz8ubGVuZ3RoIHx8ICF0aGlzLnNlbGVjdGVkTWV0aG9kQ29kZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZE1ldGhvZCA9IG1ldGhvZHMuZmluZCgobWV0aG9kOiBhbnkpID0+IG1ldGhvZC5jb2RlID09PSB0aGlzLnNlbGVjdGVkTWV0aG9kQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZE1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXRob2RTZWxlY3QgPSBmb3VuZE1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNMZWdhY3lTZWxlY3Rpb25TdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSB1c2VyIG5hdmlnYXRlcyBiYWNrIHRvIGFkZHJlc3MgYW5kIHJlc3VibWl0cywgdGhlIHNlcnZlciBjbGVhcnNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNoaXBtZW50IHN0YXRlLiBUaGUgY2xpZW50IHN0aWxsIHNob3dzIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIG1ldGhvZFxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgc2V0Q29udHJhY3QoKSB3b3VsZCBmYWlsIHNpbGVudGx5IGJlY2F1c2UgdGhlIHNlcnZlciBubyBsb25nZXIgaGFzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXRob2Qgc2V0LiBSZS1jYWxsIHNldE1ldGhvZCgpIHRvIHJlc3RvcmUgc2VydmVyLXNpZGUgc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLnJlc3RvcmVkT25Jbml0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLmlzU3RlcFJlYWR5KCdzaGlwbWVudCcpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE1ldGhvZFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZWRPbkluaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRNZXRob2QoZm91bmRNZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb21wYWN0U2hpcG1lbnRWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja291dFNlcnZpY2Uuc3RhdGUkXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRyZXNzRGF0YSA9IHRoaXMuX2NoZWNrb3V0U2VydmljZS5nZXRTdGVwRGF0YSgnYWRkcmVzcycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3NEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RBZGRyZXNzS2V5ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoaXBtZW50U2VydmljZS5yZXN0YXJ0U3RlcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbklkID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlT3B0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cGVkT3B0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmF2YWlsYWJsZU1ldGhvZHMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpcG1lbnRFcnJvcktleSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlDaGFuZ2UuZW1pdCh7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoYWRkcmVzc0RhdGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXN0QWRkcmVzc0tleSA9PT0ga2V5KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEFkZHJlc3NLZXkgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoaXBtZW50U2VydmljZS5yZXN0YXJ0U3RlcCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uSWQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlDaGFuZ2UuZW1pdCh7fSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJlbG9hZFNpbmdsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cGVkT3B0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb3JlSW5mb0luTWV0aG9kID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmaWx0ZXJNZXRob2RzKG1ldGhvZHM6IGFueSkge1xuICAgICAgICByZXR1cm4gbWV0aG9kcy5maWx0ZXIoKG1ldGhvZDogYW55KSA9PiAhdGhpcy5faGlkZGVuTWV0aG9kcy5pbmNsdWRlcyhtZXRob2QubmFtZSkpO1xuICAgIH1cblxuICAgIGFzeW5jIHNlbGVjdE1ldGhvZChtZXRob2Q6IGFueSwgZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLnNldEFjdGl2ZUJ1dHRvbihldmVudCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0TWV0aG9kKG1ldGhvZCk7XG4gICAgfVxuXG4gICAgc2V0QWN0aXZlQnV0dG9uKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZXZlbnQudGFyZ2V0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW47XG4gICAgICAgIGZvciAoY29uc3QgYnV0dG9uIG9mIHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGJ1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSB7XG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICB9XG5cbiAgICBzZXRBY3RpdmUoJGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVCdXR0b24oJGV2ZW50KTtcbiAgICB9XG5cbiAgICBpc01ldGhvZEFjdGl2ZShtZXRob2RDb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRNZXRob2RDb2RlID09PSBtZXRob2RDb2RlO1xuICAgIH1cblxuICAgIHNldE1ldGhvZChtZXRob2Q6IGFueSkge1xuICAgICAgICB0aGlzLm1ldGhvZFNlbGVjdCA9IG1ldGhvZDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1ldGhvZENvZGUgPSBtZXRob2QuY29kZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nSW50ZXJuYWwgPSB0cnVlO1xuICAgICAgICB0aGlzLmJ1dHRvbnNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZW5hYmxlZENvbmZpcm1CdXR0b24gPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9zaGlwbWVudFNlcnZpY2Uuc2V0TWV0aG9kKG1ldGhvZC5jb2RlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ0ludGVybmFsID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZWRDb25maXJtQnV0dG9uID0gdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLmlzU3RlcFJlYWR5KCdzaGlwbWVudCcpO1xuICAgICAgICAgICAgdGhpcy5idXR0b25zRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja291dFNlcnZpY2Uubm90aWZ5Q2hlY2tvdXRFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdJbnRlcm5hbCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5lbmFibGVkQ29uZmlybUJ1dHRvbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5idXR0b25zRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW5jTGVnYWN5U2VsZWN0aW9uU3RhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBhY3RTaGlwbWVudFZpZXcgfHwgIXRoaXMuX2NoZWNrb3V0U2VydmljZS5pc1N0ZXBSZWFkeSgnc2hpcG1lbnQnKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmVuYWJsZWRDb25maXJtQnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5idXR0b25zRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nSW50ZXJuYWwgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YWxpZE5hbWUobmFtZTogYW55KSB7XG4gICAgICAgIHJldHVybiBpc05hTihuYW1lKTtcbiAgICB9XG5cbiAgICBlbWl0UmVzdWx0ID0gYXN5bmMgKG1ldGhvZF9uYW1lOiBzdHJpbmcsIGNvbnRyYWN0X2RhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb250cmFjdF9kYXRhID0ge1xuICAgICAgICAgICAgLi4uY29udHJhY3RfZGF0YSxcbiAgICAgICAgICAgIHNoaXBwaW5nX21ldGhvZF9jb250cmFjdDogbWV0aG9kX25hbWUgKyAnXycgKyBjb250cmFjdF9kYXRhLm5hbWUsXG4gICAgICAgICAgICBzaGlwcGluZ19tZXRob2RfYnJhbmNoX2NvZGU6IG1ldGhvZF9uYW1lID09ICdicmFuY2hfZGVsaXZlcnknID8gY29udHJhY3RfZGF0YS5zdWN1cnNhbF9pZCA6IGNvbnRyYWN0X2RhdGEubmFtZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nSW50ZXJuYWwgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2hpcG1lbnRTZXJ2aWNlLnNldENvbnRyYWN0KGNvbnRyYWN0X2RhdGEpO1xuICAgICAgICAgICAgdGhpcy5lbmFibGVkQ29uZmlybUJ1dHRvbiA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja291dFNlcnZpY2Uubm90aWZ5Q2hlY2tvdXRFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZWRDb25maXJtQnV0dG9uID0gZmFsc2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdJbnRlcm5hbCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmVyaWZ5VmFsaWRhdGUoY29zdHM6IGFueVtdLCBjb250cmFjdDogYW55LCBkYXRhOiBhbnkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvc3RzLmZvckVhY2goKGNvc3Q6IGFueSkgPT4gY29zdC5jb250cmFjdHMuZm9yRWFjaCgoY286IGFueSkgPT4gY28uc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgICAgICAgY29zdHMuZmluZCgoY29zdDogYW55KSA9PiBjb3N0Lm5hbWUgPT0gY29udHJhY3QpLmNvbnRyYWN0cy5maW5kKChjb250cmE6IGFueSkgPT4gY29udHJhLm5hbWUgPT0gZGF0YS5uYW1lKS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgYWwgYnVzY2FyIGNvbnRyYXRvJywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdFJlc3VsdChjb250cmFjdCwgZGF0YSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcHJlbG9hZFNpbmdsZU9wdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9ICsrdGhpcy5wcmVsb2FkUmVxdWVzdElkO1xuICAgICAgICB0aGlzLmxvYWRpbmdQcmVsb2FkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaW5nbGVPcHRpb25zID0gW107XG4gICAgICAgIHRoaXMuZ3JvdXBlZE9wdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbklkID0gbnVsbDtcbiAgICAgICAgdGhpcy51bmF2YWlsYWJsZU1ldGhvZHMgPSB7fTtcbiAgICAgICAgdGhpcy5zaGlwbWVudEVycm9yS2V5ID0gbnVsbDtcbiAgICAgICAgY29uc3QgbWV0aG9kT3B0aW9ucyA9IGF3YWl0IHRoaXMuX3NoaXBtZW50U2VydmljZS5nZXRTaGlwcGluZ09wdGlvbnMoKTtcbiAgICAgICAgaWYgKHJlcXVlc3RJZCAhPT0gdGhpcy5wcmVsb2FkUmVxdWVzdElkKSB7XG4gICAgICAgICAgICAvLyBBIG5ld2VyIGNhbGwgc3VwZXJzZWRlZCB0aGlzIG9uZSDigJQgZGlzY2FyZCBzdGFsZSByZXN1bHRzIHRvIHByZXZlbnQgZHVwbGljYXRlc1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWV0aG9kT3B0aW9ucyB8fCAhbWV0aG9kT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1ByZWxvYWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3B0aW9uSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG1ldGhvZE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IGVudHJ5Py5tZXRob2Q7XG4gICAgICAgICAgICBpZiAoIW1ldGhvZCB8fCBtZXRob2QubmFtZSA9PT0gJ1VQUycpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGVudHJ5Py5vcHRpb25zIHx8IFtdO1xuICAgICAgICAgICAgbGV0IGhhc0NvbnRyYWN0cyA9IGZhbHNlO1xuICAgICAgICAgICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyYWN0cyA9IG9wdGlvbj8uY29udHJhY3RzIHx8IFtdO1xuICAgICAgICAgICAgICAgIGlmICghY29udHJhY3RzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGhhc0NvbnRyYWN0cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29udHJhY3RzLmZvckVhY2goKGNvbnRyYWN0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZENvbnRyYWN0ID0geyAuLi5jb250cmFjdCB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vcm1hbGl6ZWRDb250cmFjdC5jb250cmFjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZENvbnRyYWN0LmNvbnRyYWN0ID0gb3B0aW9uLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uSW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaW5nbGVPcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGAke21ldGhvZC5jb2RlfS0ke29wdGlvbi5uYW1lfS0ke2NvbnRyYWN0Lm5hbWV9LSR7b3B0aW9uSW5kZXh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvc3ROYW1lOiBvcHRpb24ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0OiBub3JtYWxpemVkQ29udHJhY3RcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghaGFzQ29udHJhY3RzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bmF2YWlsYWJsZU1ldGhvZHNbbWV0aG9kLmNvZGVdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyb3VwZWRPcHRpb25zID0gdGhpcy5idWlsZEdyb3VwZWRPcHRpb25zKHRoaXMuc2luZ2xlT3B0aW9ucyk7XG4gICAgICAgIGlmICghdGhpcy5zaW5nbGVPcHRpb25zLmxlbmd0aCAmJiBPYmplY3Qua2V5cyh0aGlzLnVuYXZhaWxhYmxlTWV0aG9kcykubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNoaXBtZW50RXJyb3JLZXkgPSAnb3BlcmF0aW9uLWVycm9yJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRpbmdQcmVsb2FkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VsZWN0U2luZ2xlT3B0aW9uKG9wdGlvbjogYW55KSB7XG4gICAgICAgIGlmICghb3B0aW9uKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkT3B0aW9uSWQgPT09IG9wdGlvbi5pZCAmJiAhdGhpcy5sb2FkaW5nSW50ZXJuYWwpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbklkID0gb3B0aW9uLmlkO1xuICAgICAgICB0aGlzLmxvYWRpbmdJbnRlcm5hbCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hpcG1lbnRFcnJvcktleSA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgY29udHJhY3REYXRhID0geyAuLi4ob3B0aW9uLmNvbnRyYWN0IHx8IHt9KSB9O1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbENvbnRyYWN0TmFtZSA9IGNvbnRyYWN0RGF0YS5uYW1lIHx8IG9wdGlvbi5jb250cmFjdD8ubmFtZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZEVucmljaEZyb21MZWdhY3kob3B0aW9uKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZ2FjeUNvbnRyYWN0RGF0YSA9IGF3YWl0IHRoaXMuZ2V0TGVnYWN5Q29udHJhY3REYXRhKFxuICAgICAgICAgICAgICAgICAgICBvcHRpb24ubWV0aG9kPy5jb2RlLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb24uY29zdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxDb250cmFjdE5hbWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChsZWdhY3lDb250cmFjdERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJhY3REYXRhID0geyAuLi5jb250cmFjdERhdGEsIC4uLmxlZ2FjeUNvbnRyYWN0RGF0YSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvbnRyYWN0VHlwZSA9IGNvbnRyYWN0RGF0YS5jb250cmFjdCB8fCBvcHRpb24uY29zdE5hbWU7XG4gICAgICAgICAgICBjb25zdCBjb250cmFjdE5hbWUgPSBjb250cmFjdERhdGEubmFtZSB8fCBvcHRpb24uY29udHJhY3Q/Lm5hbWU7XG4gICAgICAgICAgICBjb25zdCBzaGlwcGluZ01ldGhvZENvbnRyYWN0ID0gYCR7b3B0aW9uLmNvc3ROYW1lfV8ke2NvbnRyYWN0TmFtZX1gO1xuICAgICAgICAgICAgY29uc3Qgc2hpcHBpbmdNZXRob2RCcmFuY2hDb2RlID0gb3B0aW9uLmNvc3ROYW1lID09PSAnYnJhbmNoX2RlbGl2ZXJ5J1xuICAgICAgICAgICAgICAgID8gKGNvbnRyYWN0RGF0YS5zdWN1cnNhbF9pZCB8fCBjb250cmFjdERhdGEubnVtYmVyIHx8IGNvbnRyYWN0RGF0YS5icmFuY2hfcHJvcGVydHk/Lm51bWJlciB8fCBjb250cmFjdE5hbWUpXG4gICAgICAgICAgICAgICAgOiBjb250cmFjdE5hbWU7XG4gICAgICAgICAgICBjb25zdCBzYW5pdGl6ZWRDb250cmFjdERhdGEgPSB7IC4uLmNvbnRyYWN0RGF0YSB9O1xuICAgICAgICAgICAgZGVsZXRlIHNhbml0aXplZENvbnRyYWN0RGF0YS5icmFuY2hfcHJvcGVydHk7XG4gICAgICAgICAgICBkZWxldGUgc2FuaXRpemVkQ29udHJhY3REYXRhLm9wdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgIC4uLnNhbml0aXplZENvbnRyYWN0RGF0YSxcbiAgICAgICAgICAgICAgICBzaGlwcGluZ0lkOiBvcHRpb24ubWV0aG9kLmNvZGUsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBvcHRpb24ubWV0aG9kLmNvZGUsXG4gICAgICAgICAgICAgICAgb3B0aW9uOiBvcHRpb24uY29zdE5hbWUsXG4gICAgICAgICAgICAgICAgY29udHJhY3Q6IGNvbnRyYWN0VHlwZSxcbiAgICAgICAgICAgICAgICBuYW1lOiBjb250cmFjdE5hbWUsXG4gICAgICAgICAgICAgICAgcHJpY2U6IGNvbnRyYWN0RGF0YS5wcmljZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzaGlwcGluZ19tZXRob2RfY29udHJhY3Q6IHNoaXBwaW5nTWV0aG9kQ29udHJhY3QsXG4gICAgICAgICAgICAgICAgc2hpcHBpbmdfbWV0aG9kX2JyYW5jaF9jb2RlOiBzaGlwcGluZ01ldGhvZEJyYW5jaENvZGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzdGVwRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAuLi5yZXF1ZXN0UGF5bG9hZCxcbiAgICAgICAgICAgICAgICBtZXRob2RfbmFtZTogb3B0aW9uLm1ldGhvZD8ubmFtZSxcbiAgICAgICAgICAgICAgICBjb250cmFjdF9uYW1lOiBjb250cmFjdE5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zaGlwbWVudFNlcnZpY2Uuc2V0U2hpcHBpbmdPcHRpb24ocmVxdWVzdFBheWxvYWQsIHN0ZXBEYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZExhYmVsID0gb3B0aW9uLm1ldGhvZD8ubmFtZSA/IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChvcHRpb24ubWV0aG9kLm5hbWUpIDogJyc7XG4gICAgICAgICAgICBjb25zdCBjb250cmFjdExhYmVsID0gY29udHJhY3ROYW1lID8gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGNvbnRyYWN0TmFtZSkgOiAnJztcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwTGFiZWwgPSBvcHRpb24uY29zdE5hbWUgPyB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5yZXNvbHZlR3JvdXBMYWJlbChvcHRpb24uY29zdE5hbWUpKSA6ICcnO1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBbZ3JvdXBMYWJlbCwgbWV0aG9kTGFiZWwsIGNvbnRyYWN0TGFiZWxdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJyk7XG4gICAgICAgICAgICBjb25zdCBkZXRhaWwgPSBjb250cmFjdERhdGE/LmNvbXB1dGVkIHx8IGNvbnRyYWN0RGF0YT8uZGV0YWlsIHx8IG9wdGlvbi5jb250cmFjdD8uY29tcHV0ZWQgfHwgb3B0aW9uLmNvbnRyYWN0Py5kZXRhaWwgfHwgJyc7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlDaGFuZ2UuZW1pdCh7IGxhYmVsOiBsYWJlbCB8fCB1bmRlZmluZWQsIGRldGFpbDogZGV0YWlsIHx8IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RTaGlwbWVudFZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2VTdGVwLmVtaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuc2hpcG1lbnRFcnJvcktleSA9IHRoaXMuX2NoZWNrb3V0U2VydmljZS5nZXRDaGVja291dEVycm9yTWVzc2FnZShlcnJvcik7XG4gICAgICAgICAgICB0aGlzLl9jaGVja291dFNlcnZpY2Uubm90aWZ5Q2hlY2tvdXRFcnJvcihlcnJvcik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdJbnRlcm5hbCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG91bGRFbnJpY2hGcm9tTGVnYWN5KG9wdGlvbjogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghb3B0aW9uIHx8IG9wdGlvbi5jb3N0TmFtZSAhPT0gJ2JyYW5jaF9kZWxpdmVyeScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRMZWdhY3lDb250cmFjdERhdGEgPSBhc3luYyAoXG4gICAgICAgIG1ldGhvZENvZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgY29zdE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgY29udHJhY3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICApID0+IHtcbiAgICAgICAgaWYgKCFtZXRob2RDb2RlIHx8ICFjb3N0TmFtZSB8fCAhY29udHJhY3ROYW1lKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvc3RzID0gYXdhaXQgdGhpcy5fc2hpcG1lbnRTZXJ2aWNlLmdldENvc3RzRm9yTWV0aG9kKG1ldGhvZENvZGUpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb3N0ID0gKGNvc3RzIHx8IFtdKS5maW5kKChjb3N0OiBhbnkpID0+IFN0cmluZyhjb3N0Py5uYW1lIHx8ICcnKSA9PT0gU3RyaW5nKGNvc3ROYW1lKSk7XG4gICAgICAgICAgICBpZiAoIXNlbGVjdGVkQ29zdD8uY29udHJhY3RzPy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb250cmFjdCA9IHNlbGVjdGVkQ29zdC5jb250cmFjdHMuZmluZCgoY29udHJhY3Q6IGFueSkgPT5cbiAgICAgICAgICAgICAgICBTdHJpbmcoY29udHJhY3Q/Lm5hbWUgfHwgJycpID09PSBTdHJpbmcoY29udHJhY3ROYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZENvbnRyYWN0IHx8IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRHcm91cGVkT3B0aW9ucyhvcHRpb25zOiBhbnlbXSkge1xuICAgICAgICBpZiAoIW9wdGlvbnM/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgICAgICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gb3B0aW9uPy5jb3N0TmFtZSB8fCAnZGVmYXVsdCc7XG4gICAgICAgICAgICBpZiAoIWdyb3Vwcy5oYXMoa2V5KSkgZ3JvdXBzLnNldChrZXksIFtdKTtcbiAgICAgICAgICAgIGdyb3Vwcy5nZXQoa2V5KT8ucHVzaChvcHRpb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBzLmVudHJpZXMoKSkubWFwKChba2V5LCBncm91cE9wdGlvbnNdKSA9PiAoe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMucmVzb2x2ZUdyb3VwTGFiZWwoa2V5LCBncm91cE9wdGlvbnM/LlswXT8ubWV0aG9kPy5uYW1lKSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGdyb3VwT3B0aW9uc1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNvbHZlR3JvdXBMYWJlbChjb3N0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCwgbWV0aG9kTmFtZT86IHN0cmluZykge1xuICAgICAgICBpZiAoY29zdE5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBjb3N0TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWQgPT09ICdicmFuY2hfZGVsaXZlcnknKSByZXR1cm4gJ1JldGlybyBlbiBzdWN1cnNhbCc7XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZCA9PT0gJ2hvbWVfZGVsaXZlcnknKSByZXR1cm4gJ0VudsOtbyBhIGRvbWljaWxpbyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWUgfHwgKGNvc3ROYW1lIHx8ICcnKTtcbiAgICB9XG5cbiAgICBnb0JhY2soKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrb3V0U2VydmljZS5iYWNrKCk7XG4gICAgfVxuXG4gICAgaXNOZXh0RGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdJbnRlcm5hbCB8fFxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RlcCB8fFxuICAgICAgICAgICAgdGhpcy5idXR0b25zRGlzYWJsZWQgfHxcbiAgICAgICAgICAgICF0aGlzLmVuYWJsZWRDb25maXJtQnV0dG9uIHx8XG4gICAgICAgICAgICAhdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLmlzU3RlcFJlYWR5KCdzaGlwbWVudCcpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb25OZXh0QnV0dG9uQ29udGFpbmVyQ2xpY2soKSB7XG4gICAgICAgIGlmICghdGhpcy5pc05leHREaXNhYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmV4dEJsb2NrZWRNZXNzYWdlKCkge1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nSW50ZXJuYWwgfHwgdGhpcy5sb2FkaW5nU3RlcCB8fCB0aGlzLmJ1dHRvbnNEaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrb3V0U2VydmljZS5pc1N0ZXBSZWFkeSgnc2hpcG1lbnQnKSkge1xuICAgICAgICAgICAgcmV0dXJuICdzaGlwbWVudC1zZWxlY3Rpb24tcmVxdWlyZWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgYmxvY2tlZE1lc3NhZ2UgPSB0aGlzLmdldE5leHRCbG9ja2VkTWVzc2FnZSgpO1xuICAgICAgICBpZiAoYmxvY2tlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3RvYXN0U2VydmljZS5zaG93KGJsb2NrZWRNZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ0ludGVybmFsIHx8XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGVwIHx8XG4gICAgICAgICAgICB0aGlzLmJ1dHRvbnNEaXNhYmxlZCB8fFxuICAgICAgICAgICAgIXRoaXMuZW5hYmxlZENvbmZpcm1CdXR0b24gfHxcbiAgICAgICAgICAgICF0aGlzLl9jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoJ3NoaXBtZW50JylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLm5leHQoKTtcbiAgICB9XG59XG4iLCJAaWYoY29tcGFjdFNoaXBtZW50Vmlldyl7XG48YXBwLXNoaXBtZW50LWVjLXNpbmdsZSBbbG9hZGluZ0ludGVybmFsXT1cImxvYWRpbmdJbnRlcm5hbFwiIFtsb2FkaW5nUHJlbG9hZF09XCJsb2FkaW5nUHJlbG9hZFwiXG4gICAgW3NpbmdsZU9wdGlvbnNdPVwic2luZ2xlT3B0aW9uc1wiIFtncm91cGVkT3B0aW9uc109XCJncm91cGVkT3B0aW9uc1wiIFtzZWxlY3RlZE9wdGlvbklkXT1cInNlbGVjdGVkT3B0aW9uSWRcIlxuICAgIFt1bmF2YWlsYWJsZU1ldGhvZHNdPVwidW5hdmFpbGFibGVNZXRob2RzXCIgW21ldGhvZHNdPVwibWV0aG9kcyQgfCBhc3luY1wiIFtzaGlwbWVudEVycm9yS2V5XT1cInNoaXBtZW50RXJyb3JLZXlcIlxuICAgIFtpc0ZyZWVTaGlwcGluZ109XCJjb3N0b3M/LmFtb3VudCA9PSAwXCIgKHNlbGVjdE9wdGlvbik9XCJzZWxlY3RTaW5nbGVPcHRpb24oJGV2ZW50KVwiPlxuPC9hcHAtc2hpcG1lbnQtZWMtc2luZ2xlPlxufSBAZWxzZSB7XG48ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHRleHQtZGFya1wiPlxuICAgICAgICAgICAgICAgIDxoND57eyAnc2VsZWN0LW1ldGhvZCcgfCB0cmFuc2xhdGUgfX08L2g0PlxuICAgICAgICAgICAgICAgIEBpZihtZXRob2RzTG9hZGluZyQgfCBhc3luYyl7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBtdC0zIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1sb2FkaW5nLWlubGluZS1lYz48L2FwcC1sb2FkaW5nLWlubGluZS1lYz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeSBtdC0yXCI+e3sgJ2xvYWRpbmcnIHwgdHJhbnNsYXRlIH19Li4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIEBpZihtZXRob2RzJCB8IGFzeW5jOyBhcyBtZXRob2RzKXtcbiAgICAgICAgICAgICAgICBAaWYoZmlsdGVyTWV0aG9kcyhtZXRob2RzKS5sZW5ndGgpe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tdG9vbGJhciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgcm9sZT1cInRvb2xiYXJcIiBhcmlhLWxhYmVsPVwiRW52aW9zIHRvb2xiYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJHcnVwbyBib3RvbmVzIGVudmlvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWNvbnRlbnQtc3RhcnQganVzdGlmeS1jb250ZW50LWNlbnRlciBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yKG1ldGhvZCBvZiBmaWx0ZXJNZXRob2RzKG1ldGhvZHMpOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImJ1dHRvbnNEaXNhYmxlZFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ2J0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgbXgtMSBtYi0xJyArIChpc01ldGhvZEFjdGl2ZShtZXRob2QuY29kZSkgPyAnIGFjdGl2ZScgOiAnJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0TWV0aG9kKG1ldGhvZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbWV0aG9kLm5hbWUgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvdyB3LTEwMCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIj57eyduby1zaGlwbWVudC1tZXRob2RzJ3x0cmFuc2xhdGV9fTwvaDU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cbiAgICAgICAgICAgICAgICBAaWYobW9yZUluZm9Jbk1ldGhvZCAmJiBtZXRob2RTZWxlY3QgJiYgbWV0aG9kU2VsZWN0LmRlc2NyaXB0aW9uKXtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGp1c3RpZnktY29udGVudC1jZW50ZXIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02IGNvbC1sZy00IGQtZmxleCBmbGV4LWNvbHVtbiBtYi0yXCIgW2lkXT1cIm1ldGhvZFNlbGVjdC5jb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yKGxpbmUgb2YgbWV0aG9kU2VsZWN0LmRlc2NyaXB0aW9uLnNwbGl0KCdcXHJcXG4nKTsgdHJhY2sgJGluZGV4OyBsZXQgaT0kaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lkXT1cIm1ldGhvZFNlbGVjdC5jb2RlKyctJytpXCIgW2NsYXNzXT1cIidsaW5lLScraVwiPnt7bGluZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmKGNvc3RzJCB8IGFzeW5jOyBhcyBjb3N0cyl7XG4gICAgICAgICAgICAgICAgQGlmKGxvYWRpbmdJbnRlcm5hbCAmJiBtZXRob2RTZWxlY3QgJiYgIWNvc3RzLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBweS00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtbG9hZGluZy1pbmxpbmUtZWM+PC9hcHAtbG9hZGluZy1pbmxpbmUtZWM+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zZWNvbmRhcnkgbXQtMlwiPnt7ICdsb2FkaW5nJyB8IHRyYW5zbGF0ZSB9fS4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvcihjb3N0IG9mIGNvc3RzOyB0cmFjayAkaW5kZXg7IGxldCB5ID0gJGluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIHRleHQtZGFya1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNvc3QuY29udHJhY3RzLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNvc3RzLmxlbmd0aCA+IDEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGI+e3sgY29zdC5uYW1lIHwgdHJhbnNsYXRlIH19PC9iPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxociAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48Yj57eyBtZXRob2RTZWxlY3QubmFtZSB8IHRyYW5zbGF0ZSB9fTwvYj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aHIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IoY29udHJhY3Qgb2YgY29zdC5jb250cmFjdHM7IHRyYWNrICRpbmRleDsgbGV0IGkgPSAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGN1cnJlbnQtY29udHJhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIFtjaGVja2VkXT1cImNvbnRyYWN0LnNlbGVjdGVkXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImNvc3QubmFtZSArIGlcIiBbZGlzYWJsZWRdPVwibG9hZGluZ0ludGVybmFsIHx8IChsb2FkaW5nU3RlcCQgfCBhc3luYylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJkYXJrXCIgKGNsaWNrKT1cInZlcmlmeVZhbGlkYXRlKGNvc3RzLGNvc3QubmFtZSwgY29udHJhY3QpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cImNvc3QubmFtZSArIGlcIiBhcmlhLWxhYmVsPVwiRGFyayBncmV5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYodmFsaWROYW1lKGNvbnRyYWN0Lm5hbWUpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIihjb3N0Lm5hbWUgPT0gJ2hvbWVfZGVsaXZlcnknKSA/ICdzaGlwbWVudC1jb250cmFjdG5hbWUgaG9tZV9kZWxpdmVyeScgOiAnc2hpcG1lbnQtY29udHJhY3RuYW1lJyBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb250cmFjdC5uYW1lIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY29udHJhY3QuY29tcHV0ZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGJyIGNsYXNzPVwic2hpcG1lbnQtY29udHJhY3RuYW1lXCI+e3sgY29udHJhY3QuY29tcHV0ZWQgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgY2xhc3M9XCJzaGlwbWVudC1jb250cmFjdG5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjb250cmFjdC5kZXRhaWwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyYWN0LWRldGFpbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IobGluZSBvZiBjb250cmFjdC5kZXRhaWwuc3BsaXQoJyAtICcpOyB0cmFjayAkaW5kZXg7IGxldCBpID0gJGluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCInY29udHJhdC1pdGVtLScraVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoaSA9PSAwKXs8c3Bhbj48Yj57eyBsaW5lIH19PC9iPjwvc3Bhbj59XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihpID4gMCl7PHNwYW4gY2xhc3M9XCJpbnNpZGUtZGV0YWlsXCI+e3sgbGluZSB9fTwvc3Bhbj59XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY29udHJhY3QucHJpY2UgPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCInaW5zaWRlLWRldGFpbCAnICsgKCBjb3N0b3M/LmFtb3VudCA9PSAwID8gJyBmcmVlICcgOiAnJykgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKCFjb250cmFjdC5jb21wdXRlZCl7PGJyIGNsYXNzPVwic2hpcG1lbnQtY29udHJhY3RuYW1lXCI+fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICgncHJpY2UnfHRyYW5zbGF0ZSkgKyAnOiAnICsgKGNvbnRyYWN0LnByaWNlIHwgZWNDdXJyZW5jeVN5bWJvbCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGQtZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtd2hpdGVcIiBbZGlzYWJsZWRdPVwibG9hZGluZ0ludGVybmFsIHx8IChsb2FkaW5nU3RlcCQgfCBhc3luYylcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29CYWNrKClcIj57eydiYWNrJ3x0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNhYmxlZC1jbGljay10YXJnZXRcIiAoY2xpY2spPVwib25OZXh0QnV0dG9uQ29udGFpbmVyQ2xpY2soKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc05leHREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtd2hpdGUgYWxsb3ctZGlzYWJsZWQtY2xpY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihsb2FkaW5nSW50ZXJuYWwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0yXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdsb2FkaW5nJyB8IHRyYW5zbGF0ZSB9fS4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyhpc0xhc3RPbmUgPyAnZmluaXNoLWNoZWNrb3V0JyA6J3JlYWR5LWZvcm0nKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG59XG4iXX0=
425
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpcG1lbnQtZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvY2hlY2tvdXQtZWMvc2hpcG1lbnQtZWMvc2hpcG1lbnQtZWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvY2hlY2tvdXQtZWMvc2hpcG1lbnQtZWMvc2hpcG1lbnQtZWMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQzs7O0FBUzlGLE1BQU0sT0FBTyxtQkFBbUI7SUFDcEIsZ0JBQWdCLEdBQW9CLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJ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ZUFBZTtZQUNwQixJQUFJLENBQUMsV0FBVztZQUNoQixJQUFJLENBQUMsZUFBZTtZQUNwQixDQUFDLElBQUksQ0FBQyxvQkFBb0I7WUFDMUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUNoRCxDQUFDO1lBQ0MsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQzt3R0EvYVEsbUJBQW1COzRGQUFuQixtQkFBbUIsNE1DbkJoQyxreVFBNklBLDZxQkQ1SHNDLHdCQUF3QixtRkFBRSxlQUFlLHVGQUFFLFNBQVMseUNBQUUsb0JBQW9CLHlEQUFZLHlCQUF5Qjs7NEZBRXhJLG1CQUFtQjtrQkFQL0IsU0FBUzsrQkFDSSxpQkFBaUIsY0FDZixJQUFJLFdBR1AsQ0FBQyxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSx5QkFBeUIsQ0FBQzt3REFTekksbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIEpzb25QaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IERlc3Ryb3lSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2hlY2tvdXRTZXJ2aWNlLCBTaGlwbWVudFNlcnZpY2UsIFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzJztcbmltcG9ydCB7IEVjQ3VycmVuY3lTeW1ib2xQaXBlIH0gZnJvbSAnLi4vLi4vLi4vZWMtcGlwZSc7XG5pbXBvcnQgeyBMb2FkaW5nRnVsbEVjQ29tcG9uZW50LCBMb2FkaW5nSW5saW5lRWNDb21wb25lbnQgfSBmcm9tICcuLi8uLi93aWRnZXRzLWVjJztcbmltcG9ydCB7IFNoaXBtZW50RWNTaW5nbGVDb21wb25lbnQgfSBmcm9tICcuL3NoaXBtZW50LWVjLXNpbmdsZS9zaGlwbWVudC1lYy1zaW5nbGUuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtc2hpcG1lbnQtZWMnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NoaXBtZW50LWVjLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zaGlwbWVudC1lYy5jb21wb25lbnQuc2NzcyddLFxuICAgIGltcG9ydHM6IFtMb2FkaW5nRnVsbEVjQ29tcG9uZW50LCBMb2FkaW5nSW5saW5lRWNDb21wb25lbnQsIFRyYW5zbGF0ZU1vZHVsZSwgQXN5bmNQaXBlLCBFY0N1cnJlbmN5U3ltYm9sUGlwZSwgSnNvblBpcGUsIFNoaXBtZW50RWNTaW5nbGVDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIFNoaXBtZW50RWNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHByaXZhdGUgX3NoaXBtZW50U2VydmljZTogU2hpcG1lbnRTZXJ2aWNlID0gaW5qZWN0KFNoaXBtZW50U2VydmljZSk7XG4gICAgcHJpdmF0ZSBfY2hlY2tvdXRTZXJ2aWNlOiBDaGVja291dFNlcnZpY2UgPSBpbmplY3QoQ2hlY2tvdXRTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgX3RvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlID0gaW5qZWN0KFRvYXN0U2VydmljZSk7XG4gICAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIEBJbnB1dCgpIGNvbXBhY3RTaGlwbWVudFZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBAT3V0cHV0KCkgc3VtbWFyeUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBsYWJlbD86IHN0cmluZzsgZGV0YWlsPzogc3RyaW5nIH0+KCk7XG4gICAgQE91dHB1dCgpIGFkdmFuY2VTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgcHVibGljIG1ldGhvZHMkID0gdGhpcy5fc2hpcG1lbnRTZXJ2aWNlLm1ldGhvZHMkO1xuICAgIHB1YmxpYyBtZXRob2RzTG9hZGluZyQgPSB0aGlzLl9zaGlwbWVudFNlcnZpY2UubWV0aG9kc0xvYWRpbmckO1xuICAgIHB1YmxpYyBpc0xhc3RTdGVwJCA9IHRoaXMuX2NoZWNrb3V0U2VydmljZS5pc0xhc3RTdGVwJDtcbiAgICBwdWJsaWMgc3RhdGUkID0gdGhpcy5fc2hpcG1lbnRTZXJ2aWNlLnN0YXRlJDtcbiAgICBwdWJsaWMgZXJyb3IkID0gdGhpcy5fc2hpcG1lbnRTZXJ2aWNlLmVycm9yJDtcbiAgICBwdWJsaWMgbG9hZGluZ1N0ZXAkID0gdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLmxvYWRpbmdTdGVwJDtcblxuICAgIHByaXZhdGUgX2hpZGRlbk1ldGhvZHM6IHN0cmluZ1tdID0gWydVUFMnXTtcbiAgICBwdWJsaWMgYnV0dG9uc0Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIG1ldGhvZFNlbGVjdDogYW55O1xuICAgIHB1YmxpYyBzZWxlY3RlZE1ldGhvZENvZGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBsb2FkaW5nSW50ZXJuYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgbG9hZGluZ1ByZWxvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIHJlc3RvcmVkT25Jbml0OiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIG1vcmVJbmZvSW5NZXRob2Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29zdG9zOiBhbnkgPSBudWxsO1xuICAgIHB1YmxpYyBjb3N0cyQ6IE9ic2VydmFibGU8YW55W10+ID0gdGhpcy5fc2hpcG1lbnRTZXJ2aWNlLmNvc3RzJDtcbiAgICBwdWJsaWMgaXNMYXN0T25lOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGVuYWJsZWRDb25maXJtQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIHNoaXBtZW50RXJyb3JLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBzaW5nbGVPcHRpb25zOiBhbnlbXSA9IFtdO1xuICAgIHB1YmxpYyBzZWxlY3RlZE9wdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgdW5hdmFpbGFibGVNZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAgIHB1YmxpYyBncm91cGVkT3B0aW9uczogeyBrZXk6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgb3B0aW9uczogYW55W10gfVtdID0gW107XG5cbiAgICBwcml2YXRlIGxhc3RBZGRyZXNzS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGxvYWRpbmdTdGVwID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBwcmVsb2FkUmVxdWVzdElkID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmlzTGFzdFN0ZXAkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKS5zdWJzY3JpYmUocmVzID0+IHRoaXMuaXNMYXN0T25lID0gcmVzKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RlcCQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpLnN1YnNjcmliZShyZXMgPT4gdGhpcy5sb2FkaW5nU3RlcCA9ICEhcmVzKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBhY3RTaGlwbWVudFZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuX3NoaXBtZW50U2VydmljZS5nZXRTaGlwbWVudE1ldGhvZHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoZWNrb3V0U2VydmljZS5hc3NvY2lhdGVkRGF0YSRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3N0b3MgPSBkYXRhICYmIGRhdGEuZmluZCgodmFsdWU6IGFueSkgPT4gdmFsdWUudHlwZSA9PSAnc2hpcG1lbnQnKSB8fCBudWxsO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lcnJvciRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoZXJyb3JLZXkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hpcG1lbnRFcnJvcktleSA9IGVycm9yS2V5O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbXBhY3RTaGlwbWVudFZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUkXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhICYmIHJlcy5kYXRhLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1ldGhvZENvZGUgPSByZXMuZGF0YS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNMZWdhY3lTZWxlY3Rpb25TdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubWV0aG9kcyRcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShtZXRob2RzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRob2RzPy5sZW5ndGggfHwgIXRoaXMuc2VsZWN0ZWRNZXRob2RDb2RlKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kTWV0aG9kID0gbWV0aG9kcy5maW5kKChtZXRob2Q6IGFueSkgPT4gbWV0aG9kLmNvZGUgPT09IHRoaXMuc2VsZWN0ZWRNZXRob2RDb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kTWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1ldGhvZFNlbGVjdCA9IGZvdW5kTWV0aG9kO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3luY0xlZ2FjeVNlbGVjdGlvblN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHVzZXIgbmF2aWdhdGVzIGJhY2sgdG8gYWRkcmVzcyBhbmQgcmVzdWJtaXRzLCB0aGUgc2VydmVyIGNsZWFyc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2hpcG1lbnQgc3RhdGUuIFRoZSBjbGllbnQgc3RpbGwgc2hvd3MgdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgbWV0aG9kXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBzZXRDb250cmFjdCgpIHdvdWxkIGZhaWwgc2lsZW50bHkgYmVjYXVzZSB0aGUgc2VydmVyIG5vIGxvbmdlciBoYXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1ldGhvZCBzZXQuIFJlLWNhbGwgc2V0TWV0aG9kKCkgdG8gcmVzdG9yZSBzZXJ2ZXItc2lkZSBzdGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMucmVzdG9yZWRPbkluaXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLl9jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoJ3NoaXBtZW50JykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kTWV0aG9kXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlZE9uSW5pdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE1ldGhvZChmb3VuZE1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbXBhY3RTaGlwbWVudFZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrb3V0U2VydmljZS5zdGF0ZSRcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NEYXRhID0gdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLmdldFN0ZXBEYXRhKCdhZGRyZXNzJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWRkcmVzc0RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEFkZHJlc3NLZXkgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hpcG1lbnRTZXJ2aWNlLnJlc3RhcnRTdGVwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uSWQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaW5nbGVPcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwZWRPcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuYXZhaWxhYmxlTWV0aG9kcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGlwbWVudEVycm9yS2V5ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUNoYW5nZS5lbWl0KHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShhZGRyZXNzRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxhc3RBZGRyZXNzS2V5ID09PSBrZXkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0QWRkcmVzc0tleSA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hpcG1lbnRTZXJ2aWNlLnJlc3RhcnRTdGVwKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25JZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUNoYW5nZS5lbWl0KHt9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVsb2FkU2luZ2xlT3B0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwZWRPcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vcmVJbmZvSW5NZXRob2QgPSB0cnVlO1xuICAgIH1cblxuICAgIGZpbHRlck1ldGhvZHMobWV0aG9kczogYW55KSB7XG4gICAgICAgIHJldHVybiBtZXRob2RzLmZpbHRlcigobWV0aG9kOiBhbnkpID0+ICF0aGlzLl9oaWRkZW5NZXRob2RzLmluY2x1ZGVzKG1ldGhvZC5uYW1lKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VsZWN0TWV0aG9kKG1ldGhvZDogYW55LCBldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlQnV0dG9uKGV2ZW50KTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRNZXRob2QobWV0aG9kKTtcbiAgICB9XG5cbiAgICBzZXRBY3RpdmVCdXR0b24oZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgZm9yIChjb25zdCBidXR0b24gb2YgcGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHtcbiAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIH1cblxuICAgIHNldEFjdGl2ZSgkZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLnNldEFjdGl2ZUJ1dHRvbigkZXZlbnQpO1xuICAgIH1cblxuICAgIGlzTWV0aG9kQWN0aXZlKG1ldGhvZENvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE1ldGhvZENvZGUgPT09IG1ldGhvZENvZGU7XG4gICAgfVxuXG4gICAgc2V0TWV0aG9kKG1ldGhvZDogYW55KSB7XG4gICAgICAgIHRoaXMubWV0aG9kU2VsZWN0ID0gbWV0aG9kO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWV0aG9kQ29kZSA9IG1ldGhvZC5jb2RlO1xuICAgICAgICB0aGlzLmxvYWRpbmdJbnRlcm5hbCA9IHRydWU7XG4gICAgICAgIHRoaXMuYnV0dG9uc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbmFibGVkQ29uZmlybUJ1dHRvbiA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX3NoaXBtZW50U2VydmljZS5zZXRNZXRob2QobWV0aG9kLmNvZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nSW50ZXJuYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZENvbmZpcm1CdXR0b24gPSB0aGlzLl9jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoJ3NoaXBtZW50Jyk7XG4gICAgICAgICAgICB0aGlzLmJ1dHRvbnNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrb3V0U2VydmljZS5ub3RpZnlDaGVja291dEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ0ludGVybmFsID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZWRDb25maXJtQnV0dG9uID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmJ1dHRvbnNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN5bmNMZWdhY3lTZWxlY3Rpb25TdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGFjdFNoaXBtZW50VmlldyB8fCAhdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLmlzU3RlcFJlYWR5KCdzaGlwbWVudCcpKSByZXR1cm47XG4gICAgICAgIHRoaXMuZW5hYmxlZENvbmZpcm1CdXR0b24gPSB0cnVlO1xuICAgICAgICB0aGlzLmJ1dHRvbnNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvYWRpbmdJbnRlcm5hbCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHZhbGlkTmFtZShuYW1lOiBhbnksIGNvc3ROYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChjb3N0TmFtZT8uaW5jbHVkZXMoJ3BpY2t1cF9zdG9yZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNOYU4obmFtZSk7XG4gICAgfVxuXG4gICAgZW1pdFJlc3VsdCA9IGFzeW5jIChtZXRob2RfbmFtZTogc3RyaW5nLCBjb250cmFjdF9kYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29udHJhY3RfZGF0YSA9IHtcbiAgICAgICAgICAgIC4uLmNvbnRyYWN0X2RhdGEsXG4gICAgICAgICAgICBzaGlwcGluZ19tZXRob2RfY29udHJhY3Q6IG1ldGhvZF9uYW1lICsgJ18nICsgY29udHJhY3RfZGF0YS5uYW1lLFxuICAgICAgICAgICAgc2hpcHBpbmdfbWV0aG9kX2JyYW5jaF9jb2RlOiBtZXRob2RfbmFtZSA9PSAnYnJhbmNoX2RlbGl2ZXJ5J1xuICAgICAgICAgICAgICAgID8gY29udHJhY3RfZGF0YS5zdWN1cnNhbF9pZFxuICAgICAgICAgICAgICAgIDogKGNvbnRyYWN0X2RhdGEuc2hpcHBpbmdfbWV0aG9kX2JyYW5jaF9jb2RlIHx8IGNvbnRyYWN0X2RhdGEubmFtZSksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubG9hZGluZ0ludGVybmFsID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NoaXBtZW50U2VydmljZS5zZXRDb250cmFjdChjb250cmFjdF9kYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZENvbmZpcm1CdXR0b24gPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLm5vdGlmeUNoZWNrb3V0RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5lbmFibGVkQ29uZmlybUJ1dHRvbiA9IGZhbHNlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nSW50ZXJuYWwgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZlcmlmeVZhbGlkYXRlKGNvc3RzOiBhbnlbXSwgY29udHJhY3Q6IGFueSwgZGF0YTogYW55KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb3N0cy5mb3JFYWNoKChjb3N0OiBhbnkpID0+IChjb3N0Py5jb250cmFjdHMgfHwgW10pLmZvckVhY2goKGNvOiBhbnkpID0+IGNvLnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ29zdCA9IGNvc3RzLmZpbmQoKGNvc3Q6IGFueSkgPT4gY29zdD8ubmFtZSA9PSBjb250cmFjdCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbnRyYWN0ID0gKHNlbGVjdGVkQ29zdD8uY29udHJhY3RzIHx8IFtdKS5maW5kKChjb250cmE6IGFueSkgPT4gY29udHJhPy5uYW1lID09IGRhdGE/Lm5hbWUpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ29udHJhY3QpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENvbnRyYWN0LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciBhbCBidXNjYXIgY29udHJhdG8nLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0UmVzdWx0KGNvbnRyYWN0LCBkYXRhKTtcbiAgICB9XG5cbiAgICBhc3luYyBwcmVsb2FkU2luZ2xlT3B0aW9ucygpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gKyt0aGlzLnByZWxvYWRSZXF1ZXN0SWQ7XG4gICAgICAgIHRoaXMubG9hZGluZ1ByZWxvYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNpbmdsZU9wdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5ncm91cGVkT3B0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uSWQgPSBudWxsO1xuICAgICAgICB0aGlzLnVuYXZhaWxhYmxlTWV0aG9kcyA9IHt9O1xuICAgICAgICB0aGlzLnNoaXBtZW50RXJyb3JLZXkgPSBudWxsO1xuICAgICAgICBjb25zdCBtZXRob2RPcHRpb25zID0gYXdhaXQgdGhpcy5fc2hpcG1lbnRTZXJ2aWNlLmdldFNoaXBwaW5nT3B0aW9ucygpO1xuICAgICAgICBpZiAocmVxdWVzdElkICE9PSB0aGlzLnByZWxvYWRSZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgIC8vIEEgbmV3ZXIgY2FsbCBzdXBlcnNlZGVkIHRoaXMgb25lIOKAlCBkaXNjYXJkIHN0YWxlIHJlc3VsdHMgdG8gcHJldmVudCBkdXBsaWNhdGVzXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXRob2RPcHRpb25zIHx8ICFtZXRob2RPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nUHJlbG9hZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcHRpb25JbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgbWV0aG9kT3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgbWV0aG9kID0gZW50cnk/Lm1ldGhvZDtcbiAgICAgICAgICAgIGlmICghbWV0aG9kIHx8IG1ldGhvZC5uYW1lID09PSAnVVBTJykgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gZW50cnk/Lm9wdGlvbnMgfHwgW107XG4gICAgICAgICAgICBsZXQgaGFzQ29udHJhY3RzID0gZmFsc2U7XG4gICAgICAgICAgICBvcHRpb25zLmZvckVhY2goKG9wdGlvbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJhY3RzID0gb3B0aW9uPy5jb250cmFjdHMgfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKCFjb250cmFjdHMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICAgICAgaGFzQ29udHJhY3RzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250cmFjdHMuZm9yRWFjaCgoY29udHJhY3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkQ29udHJhY3QgPSB7IC4uLmNvbnRyYWN0IH07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9ybWFsaXplZENvbnRyYWN0LmNvbnRyYWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkQ29udHJhY3QuY29udHJhY3QgPSBvcHRpb24ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvcHRpb25JbmRleCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNpbmdsZU9wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogYCR7bWV0aG9kLmNvZGV9LSR7b3B0aW9uLm5hbWV9LSR7Y29udHJhY3QubmFtZX0tJHtvcHRpb25JbmRleH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29zdE5hbWU6IG9wdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhY3Q6IG5vcm1hbGl6ZWRDb250cmFjdFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFoYXNDb250cmFjdHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuYXZhaWxhYmxlTWV0aG9kc1ttZXRob2QuY29kZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ3JvdXBlZE9wdGlvbnMgPSB0aGlzLmJ1aWxkR3JvdXBlZE9wdGlvbnModGhpcy5zaW5nbGVPcHRpb25zKTtcbiAgICAgICAgaWYgKCF0aGlzLnNpbmdsZU9wdGlvbnMubGVuZ3RoICYmIE9iamVjdC5rZXlzKHRoaXMudW5hdmFpbGFibGVNZXRob2RzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2hpcG1lbnRFcnJvcktleSA9ICdvcGVyYXRpb24tZXJyb3InO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGluZ1ByZWxvYWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBzZWxlY3RTaW5nbGVPcHRpb24ob3B0aW9uOiBhbnkpIHtcbiAgICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRPcHRpb25JZCA9PT0gb3B0aW9uLmlkICYmICF0aGlzLmxvYWRpbmdJbnRlcm5hbCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uSWQgPSBvcHRpb24uaWQ7XG4gICAgICAgIHRoaXMubG9hZGluZ0ludGVybmFsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaGlwbWVudEVycm9yS2V5ID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjb250cmFjdERhdGEgPSB7IC4uLihvcHRpb24uY29udHJhY3QgfHwge30pIH07XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsQ29udHJhY3ROYW1lID0gY29udHJhY3REYXRhLm5hbWUgfHwgb3B0aW9uLmNvbnRyYWN0Py5uYW1lO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkRW5yaWNoRnJvbUxlZ2FjeShvcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVnYWN5Q29udHJhY3REYXRhID0gYXdhaXQgdGhpcy5nZXRMZWdhY3lDb250cmFjdERhdGEoXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbi5tZXRob2Q/LmNvZGUsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbi5jb3N0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRyYWN0TmFtZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGxlZ2FjeUNvbnRyYWN0RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb250cmFjdERhdGEgPSB7IC4uLmNvbnRyYWN0RGF0YSwgLi4ubGVnYWN5Q29udHJhY3REYXRhIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29udHJhY3RUeXBlID0gY29udHJhY3REYXRhLmNvbnRyYWN0IHx8IG9wdGlvbi5jb3N0TmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyYWN0TmFtZSA9IGNvbnRyYWN0RGF0YS5uYW1lIHx8IG9wdGlvbi5jb250cmFjdD8ubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHNoaXBwaW5nTWV0aG9kQ29udHJhY3QgPSBgJHtvcHRpb24uY29zdE5hbWV9XyR7Y29udHJhY3ROYW1lfWA7XG4gICAgICAgICAgICBjb25zdCBzaGlwcGluZ01ldGhvZEJyYW5jaENvZGUgPSBvcHRpb24uY29zdE5hbWUgPT09ICdicmFuY2hfZGVsaXZlcnknXG4gICAgICAgICAgICAgICAgPyAoY29udHJhY3REYXRhLnN1Y3Vyc2FsX2lkIHx8IGNvbnRyYWN0RGF0YS5udW1iZXIgfHwgY29udHJhY3REYXRhLmJyYW5jaF9wcm9wZXJ0eT8ubnVtYmVyIHx8IGNvbnRyYWN0TmFtZSlcbiAgICAgICAgICAgICAgICA6IGNvbnRyYWN0TmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHNhbml0aXplZENvbnRyYWN0RGF0YSA9IHsgLi4uY29udHJhY3REYXRhIH07XG4gICAgICAgICAgICBkZWxldGUgc2FuaXRpemVkQ29udHJhY3REYXRhLmJyYW5jaF9wcm9wZXJ0eTtcbiAgICAgICAgICAgIGRlbGV0ZSBzYW5pdGl6ZWRDb250cmFjdERhdGEub3B0aW9uO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgLi4uc2FuaXRpemVkQ29udHJhY3REYXRhLFxuICAgICAgICAgICAgICAgIHNoaXBwaW5nSWQ6IG9wdGlvbi5tZXRob2QuY29kZSxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IG9wdGlvbi5tZXRob2QuY29kZSxcbiAgICAgICAgICAgICAgICBvcHRpb246IG9wdGlvbi5jb3N0TmFtZSxcbiAgICAgICAgICAgICAgICBjb250cmFjdDogY29udHJhY3RUeXBlLFxuICAgICAgICAgICAgICAgIG5hbWU6IGNvbnRyYWN0TmFtZSxcbiAgICAgICAgICAgICAgICBwcmljZTogY29udHJhY3REYXRhLnByaWNlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNoaXBwaW5nX21ldGhvZF9jb250cmFjdDogc2hpcHBpbmdNZXRob2RDb250cmFjdCxcbiAgICAgICAgICAgICAgICBzaGlwcGluZ19tZXRob2RfYnJhbmNoX2NvZGU6IHNoaXBwaW5nTWV0aG9kQnJhbmNoQ29kZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBEYXRhID0ge1xuICAgICAgICAgICAgICAgIC4uLnJlcXVlc3RQYXlsb2FkLFxuICAgICAgICAgICAgICAgIG1ldGhvZF9uYW1lOiBvcHRpb24ubWV0aG9kPy5uYW1lLFxuICAgICAgICAgICAgICAgIGNvbnRyYWN0X25hbWU6IGNvbnRyYWN0TmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NoaXBtZW50U2VydmljZS5zZXRTaGlwcGluZ09wdGlvbihyZXF1ZXN0UGF5bG9hZCwgc3RlcERhdGEpO1xuICAgICAgICAgICAgY29uc3QgbWV0aG9kTGFiZWwgPSBvcHRpb24ubWV0aG9kPy5uYW1lID8gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KG9wdGlvbi5tZXRob2QubmFtZSkgOiAnJztcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyYWN0TGFiZWwgPSBjb250cmFjdE5hbWUgPyB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoY29udHJhY3ROYW1lKSA6ICcnO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBMYWJlbCA9IG9wdGlvbi5jb3N0TmFtZSA/IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLnJlc29sdmVHcm91cExhYmVsKG9wdGlvbi5jb3N0TmFtZSkpIDogJyc7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IFtncm91cExhYmVsLCBtZXRob2RMYWJlbCwgY29udHJhY3RMYWJlbF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyDCtyAnKTtcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbCA9IGNvbnRyYWN0RGF0YT8uY29tcHV0ZWQgfHwgY29udHJhY3REYXRhPy5kZXRhaWwgfHwgb3B0aW9uLmNvbnRyYWN0Py5jb21wdXRlZCB8fCBvcHRpb24uY29udHJhY3Q/LmRldGFpbCB8fCAnJztcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeUNoYW5nZS5lbWl0KHsgbGFiZWw6IGxhYmVsIHx8IHVuZGVmaW5lZCwgZGV0YWlsOiBkZXRhaWwgfHwgdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFjdFNoaXBtZW50Vmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZVN0ZXAuZW1pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5zaGlwbWVudEVycm9yS2V5ID0gdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0RXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrb3V0U2VydmljZS5ub3RpZnlDaGVja291dEVycm9yKGVycm9yKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ0ludGVybmFsID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3VsZEVucmljaEZyb21MZWdhY3kob3B0aW9uOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFvcHRpb24gfHwgb3B0aW9uLmNvc3ROYW1lICE9PSAnYnJhbmNoX2RlbGl2ZXJ5JykgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExlZ2FjeUNvbnRyYWN0RGF0YSA9IGFzeW5jIChcbiAgICAgICAgbWV0aG9kQ29kZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICBjb3N0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICBjb250cmFjdE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICkgPT4ge1xuICAgICAgICBpZiAoIW1ldGhvZENvZGUgfHwgIWNvc3ROYW1lIHx8ICFjb250cmFjdE5hbWUpIHJldHVybiBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29zdHMgPSBhd2FpdCB0aGlzLl9zaGlwbWVudFNlcnZpY2UuZ2V0Q29zdHNGb3JNZXRob2QobWV0aG9kQ29kZSk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvc3QgPSAoY29zdHMgfHwgW10pLmZpbmQoKGNvc3Q6IGFueSkgPT4gU3RyaW5nKGNvc3Q/Lm5hbWUgfHwgJycpID09PSBTdHJpbmcoY29zdE5hbWUpKTtcbiAgICAgICAgICAgIGlmICghc2VsZWN0ZWRDb3N0Py5jb250cmFjdHM/Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbnRyYWN0ID0gc2VsZWN0ZWRDb3N0LmNvbnRyYWN0cy5maW5kKChjb250cmFjdDogYW55KSA9PlxuICAgICAgICAgICAgICAgIFN0cmluZyhjb250cmFjdD8ubmFtZSB8fCAnJykgPT09IFN0cmluZyhjb250cmFjdE5hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkQ29udHJhY3QgfHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZEdyb3VwZWRPcHRpb25zKG9wdGlvbnM6IGFueVtdKSB7XG4gICAgICAgIGlmICghb3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gW107XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBhbnlbXT4oKTtcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBvcHRpb24/LmNvc3ROYW1lIHx8ICdkZWZhdWx0JztcbiAgICAgICAgICAgIGlmICghZ3JvdXBzLmhhcyhrZXkpKSBncm91cHMuc2V0KGtleSwgW10pO1xuICAgICAgICAgICAgZ3JvdXBzLmdldChrZXkpPy5wdXNoKG9wdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShncm91cHMuZW50cmllcygpKS5tYXAoKFtrZXksIGdyb3VwT3B0aW9uc10pID0+ICh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBsYWJlbDogdGhpcy5yZXNvbHZlR3JvdXBMYWJlbChrZXksIGdyb3VwT3B0aW9ucz8uWzBdPy5tZXRob2Q/Lm5hbWUpLFxuICAgICAgICAgICAgb3B0aW9uczogZ3JvdXBPcHRpb25zXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVHcm91cExhYmVsKGNvc3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLCBtZXRob2ROYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChjb3N0TmFtZSkge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGNvc3ROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZCA9PT0gJ2JyYW5jaF9kZWxpdmVyeScpIHJldHVybiAnUmV0aXJvIGVuIHN1Y3Vyc2FsJztcbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkID09PSAnaG9tZV9kZWxpdmVyeScpIHJldHVybiAnRW52w61vIGEgZG9taWNpbGlvJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0aG9kTmFtZSB8fCAoY29zdE5hbWUgfHwgJycpO1xuICAgIH1cblxuICAgIGdvQmFjaygpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLmJhY2soKTtcbiAgICB9XG5cbiAgICBpc05leHREaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ0ludGVybmFsIHx8XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGVwIHx8XG4gICAgICAgICAgICB0aGlzLmJ1dHRvbnNEaXNhYmxlZCB8fFxuICAgICAgICAgICAgIXRoaXMuZW5hYmxlZENvbmZpcm1CdXR0b24gfHxcbiAgICAgICAgICAgICF0aGlzLl9jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoJ3NoaXBtZW50JylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvbk5leHRCdXR0b25Db250YWluZXJDbGljaygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzTmV4dERpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROZXh0QmxvY2tlZE1lc3NhZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdJbnRlcm5hbCB8fCB0aGlzLmxvYWRpbmdTdGVwIHx8IHRoaXMuYnV0dG9uc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLmlzU3RlcFJlYWR5KCdzaGlwbWVudCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3NoaXBtZW50LXNlbGVjdGlvbi1yZXF1aXJlZCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBuZXh0KCkge1xuICAgICAgICBjb25zdCBibG9ja2VkTWVzc2FnZSA9IHRoaXMuZ2V0TmV4dEJsb2NrZWRNZXNzYWdlKCk7XG4gICAgICAgIGlmIChibG9ja2VkTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coYmxvY2tlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nSW50ZXJuYWwgfHxcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0ZXAgfHxcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uc0Rpc2FibGVkIHx8XG4gICAgICAgICAgICAhdGhpcy5lbmFibGVkQ29uZmlybUJ1dHRvbiB8fFxuICAgICAgICAgICAgIXRoaXMuX2NoZWNrb3V0U2VydmljZS5pc1N0ZXBSZWFkeSgnc2hpcG1lbnQnKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGVja291dFNlcnZpY2UubmV4dCgpO1xuICAgIH1cbn1cbiIsIkBpZihjb21wYWN0U2hpcG1lbnRWaWV3KXtcbjxhcHAtc2hpcG1lbnQtZWMtc2luZ2xlIFtsb2FkaW5nSW50ZXJuYWxdPVwibG9hZGluZ0ludGVybmFsXCIgW2xvYWRpbmdQcmVsb2FkXT1cImxvYWRpbmdQcmVsb2FkXCJcbiAgICBbc2luZ2xlT3B0aW9uc109XCJzaW5nbGVPcHRpb25zXCIgW2dyb3VwZWRPcHRpb25zXT1cImdyb3VwZWRPcHRpb25zXCIgW3NlbGVjdGVkT3B0aW9uSWRdPVwic2VsZWN0ZWRPcHRpb25JZFwiXG4gICAgW3VuYXZhaWxhYmxlTWV0aG9kc109XCJ1bmF2YWlsYWJsZU1ldGhvZHNcIiBbbWV0aG9kc109XCJtZXRob2RzJCB8IGFzeW5jXCIgW3NoaXBtZW50RXJyb3JLZXldPVwic2hpcG1lbnRFcnJvcktleVwiXG4gICAgW2lzRnJlZVNoaXBwaW5nXT1cImNvc3Rvcz8uYW1vdW50ID09IDBcIiAoc2VsZWN0T3B0aW9uKT1cInNlbGVjdFNpbmdsZU9wdGlvbigkZXZlbnQpXCI+XG48L2FwcC1zaGlwbWVudC1lYy1zaW5nbGU+XG59IEBlbHNlIHtcbjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgdGV4dC1kYXJrXCI+XG4gICAgICAgICAgICAgICAgPGg0Pnt7ICdzZWxlY3QtbWV0aG9kJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XG4gICAgICAgICAgICAgICAgQGlmKG1ldGhvZHNMb2FkaW5nJCB8IGFzeW5jKXtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIG10LTMgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YXBwLWxvYWRpbmctaW5saW5lLWVjPjwvYXBwLWxvYWRpbmctaW5saW5lLWVjPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc2Vjb25kYXJ5IG10LTJcIj57eyAnbG9hZGluZycgfCB0cmFuc2xhdGUgfX0uLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgQGlmKG1ldGhvZHMkIHwgYXN5bmM7IGFzIG1ldGhvZHMpe1xuICAgICAgICAgICAgICAgIEBpZihmaWx0ZXJNZXRob2RzKG1ldGhvZHMpLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi10b29sYmFyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiByb2xlPVwidG9vbGJhclwiIGFyaWEtbGFiZWw9XCJFbnZpb3MgdG9vbGJhclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkdydXBvIGJvdG9uZXMgZW52aW9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24tY29udGVudC1zdGFydCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IobWV0aG9kIG9mIGZpbHRlck1ldGhvZHMobWV0aG9kcyk7IHRyYWNrICRpbmRleCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiYnV0dG9uc0Rpc2FibGVkXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCInYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBteC0xIG1iLTEnICsgKGlzTWV0aG9kQWN0aXZlKG1ldGhvZC5jb2RlKSA/ICcgYWN0aXZlJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRNZXRob2QobWV0aG9kKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtZXRob2QubmFtZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IHctMTAwIGp1c3RpZnktY29udGVudC1jZW50ZXIgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPnt7J25vLXNoaXBtZW50LW1ldGhvZHMnfHRyYW5zbGF0ZX19PC9oNT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgICAgICAgICAgICAgIEBpZihtb3JlSW5mb0luTWV0aG9kICYmIG1ldGhvZFNlbGVjdCAmJiBtZXRob2RTZWxlY3QuZGVzY3JpcHRpb24pe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgY29sLWxnLTQgZC1mbGV4IGZsZXgtY29sdW1uIG1iLTJcIiBbaWRdPVwibWV0aG9kU2VsZWN0LmNvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IobGluZSBvZiBtZXRob2RTZWxlY3QuZGVzY3JpcHRpb24uc3BsaXQoJ1xcclxcbicpOyB0cmFjayAkaW5kZXg7IGxldCBpPSRpbmRleCl7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaWRdPVwibWV0aG9kU2VsZWN0LmNvZGUrJy0nK2lcIiBbY2xhc3NdPVwiJ2xpbmUtJytpXCI+e3tsaW5lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYoY29zdHMkIHwgYXN5bmM7IGFzIGNvc3RzKXtcbiAgICAgICAgICAgICAgICBAaWYobG9hZGluZ0ludGVybmFsICYmIG1ldGhvZFNlbGVjdCAmJiAhY29zdHMubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHB5LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1sb2FkaW5nLWlubGluZS1lYz48L2FwcC1sb2FkaW5nLWlubGluZS1lYz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeSBtdC0yXCI+e3sgJ2xvYWRpbmcnIHwgdHJhbnNsYXRlIH19Li4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yKGNvc3Qgb2YgY29zdHM7IHRyYWNrICRpbmRleDsgbGV0IHkgPSAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gdGV4dC1kYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYoKGNvc3QuY29udHJhY3RzIHx8IFtdKS5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjb3N0cy5sZW5ndGggPiAxKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxiPnt7IGNvc3QubmFtZSB8IHRyYW5zbGF0ZSB9fTwvYj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aHIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGI+e3sgbWV0aG9kU2VsZWN0Lm5hbWUgfCB0cmFuc2xhdGUgfX08L2I+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGhyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yKGNvbnRyYWN0IG9mIChjb3N0LmNvbnRyYWN0cyB8fCBbXSk7IHRyYWNrICRpbmRleDsgbGV0IGkgPSAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGN1cnJlbnQtY29udHJhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIFtjaGVja2VkXT1cImNvbnRyYWN0LnNlbGVjdGVkXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImNvc3QubmFtZSArIGlcIiBbZGlzYWJsZWRdPVwibG9hZGluZ0ludGVybmFsIHx8IChsb2FkaW5nU3RlcCQgfCBhc3luYylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJkYXJrXCIgKGNsaWNrKT1cInZlcmlmeVZhbGlkYXRlKGNvc3RzLGNvc3QubmFtZSwgY29udHJhY3QpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cImNvc3QubmFtZSArIGlcIiBhcmlhLWxhYmVsPVwiRGFyayBncmV5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYodmFsaWROYW1lKGNvbnRyYWN0Lm5hbWUsIGNvc3QubmFtZSkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiKGNvc3QubmFtZSA9PSAnaG9tZV9kZWxpdmVyeScpID8gJ3NoaXBtZW50LWNvbnRyYWN0bmFtZSBob21lX2RlbGl2ZXJ5JyA6ICdzaGlwbWVudC1jb250cmFjdG5hbWUnIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IChjb3N0Lm5hbWUgPT0gJ3BpY2t1cF9zdG9yZScgJiYgIXZhbGlkTmFtZShjb250cmFjdC5uYW1lKSkgPyAobWV0aG9kU2VsZWN0Py5uYW1lIHx8IGNvc3QubmFtZSkgOiAoY29udHJhY3QubmFtZSB8IHRyYW5zbGF0ZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjb250cmFjdC5jb21wdXRlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48YnIgY2xhc3M9XCJzaGlwbWVudC1jb250cmFjdG5hbWVcIj57eyBjb250cmFjdC5jb21wdXRlZCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciBjbGFzcz1cInNoaXBtZW50LWNvbnRyYWN0bmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNvbnRyYWN0LmRldGFpbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJhY3QtZGV0YWlsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvcihsaW5lIG9mIGNvbnRyYWN0LmRldGFpbC5zcGxpdCgnIC0gJyk7IHRyYWNrICRpbmRleDsgbGV0IGkgPSAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cIidjb250cmF0LWl0ZW0tJytpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihpID09IDApezxzcGFuPjxiPnt7IGxpbmUgfX08L2I+PC9zcGFuPn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGkgPiAwKXs8c3BhbiBjbGFzcz1cImluc2lkZS1kZXRhaWxcIj57eyBsaW5lIH19PC9zcGFuPn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZighY29udHJhY3QuY29tcHV0ZWQgJiYgIWNvbnRyYWN0LmRldGFpbCAmJiAhdmFsaWROYW1lKGNvbnRyYWN0Lm5hbWUpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2hpcG1lbnQtY29udHJhY3RuYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbWV0aG9kU2VsZWN0Py5uYW1lIHx8IGNvc3QubmFtZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNvbnRyYWN0LnByaWNlID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiJ2luc2lkZS1kZXRhaWwgJyArICggY29zdG9zPy5hbW91bnQgPT0gMCA/ICcgZnJlZSAnIDogJycpIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZighY29udHJhY3QuY29tcHV0ZWQpezxiciBjbGFzcz1cInNoaXBtZW50LWNvbnRyYWN0bmFtZVwiPn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAoJ3ByaWNlJ3x0cmFuc2xhdGUpICsgJzogJyArIChjb250cmFjdC5wcmljZSB8IGVjQ3VycmVuY3lTeW1ib2wpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBkLWZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LXdoaXRlXCIgW2Rpc2FibGVkXT1cImxvYWRpbmdJbnRlcm5hbCB8fCAobG9hZGluZ1N0ZXAkIHwgYXN5bmMpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvQmFjaygpXCI+e3snYmFjayd8dHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzYWJsZWQtY2xpY2stdGFyZ2V0XCIgKGNsaWNrKT1cIm9uTmV4dEJ1dHRvbkNvbnRhaW5lckNsaWNrKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm5leHQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNOZXh0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LXdoaXRlIGFsbG93LWRpc2FibGVkLWNsaWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYobG9hZGluZ0ludGVybmFsKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gbWUtMlwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnbG9hZGluZycgfCB0cmFuc2xhdGUgfX0uLi5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAge3soaXNMYXN0T25lID8gJ2ZpbmlzaC1jaGVja291dCcgOidyZWFkeS1mb3JtJykgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxufVxuIl19