general-library-union 3.3.62 → 3.3.63

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.
@@ -105,6 +105,7 @@ export class DetalleTipoReporteComponent {
105
105
  listaSoportes = [];
106
106
  soporteIngresar = new ReporteSoporteModel;
107
107
  clickGuardarMarcadorCampo = false;
108
+ clickGuardarMarcador = false;
108
109
  clickGuardarMarcadorExcel = false;
109
110
  verReporteMarcadorDetalle = false;
110
111
  verSoporteArchivoDetalle = false;
@@ -280,6 +281,22 @@ export class DetalleTipoReporteComponent {
280
281
  // this.formMarcador.get('tieneSql').setValue('N')
281
282
  }
282
283
  this.formMarcador.updateValueAndValidity();
284
+ const textoRegistroControl = this.formMarcadorExcel.get('textoRegistro');
285
+ const origenControl = this.formMarcadorExcel.get('origen');
286
+ if (!value) {
287
+ this.esImagenFija = true;
288
+ this.esMarcador = true;
289
+ origenControl.clearValidators();
290
+ textoRegistroControl.clearValidators();
291
+ }
292
+ else if (['IF'].includes(value)) {
293
+ this.esImagenFija = true;
294
+ this.esMarcador = false;
295
+ origenControl.setValidators(Validators.required);
296
+ textoRegistroControl.setValidators(Validators.required);
297
+ }
298
+ textoRegistroControl.updateValueAndValidity();
299
+ origenControl.updateValueAndValidity();
283
300
  }));
284
301
  this._subsciprtions.push(this.formMarcador.get('origen').valueChanges.subscribe((value) => {
285
302
  this.formMarcador.clearValidators();
@@ -651,7 +668,9 @@ export class DetalleTipoReporteComponent {
651
668
  //this.formMarcador.get('tipo').setValue(null)
652
669
  }
653
670
  guardarMarcador() {
671
+ this.clickGuardarMarcador = true;
654
672
  if (this.formMarcador.valid) {
673
+ this.clickGuardarMarcador = false;
655
674
  let llaveRegistro = this.formMarcador.get('llave').value;
656
675
  this.formMarcador.get('reporteFuente').setValue(this.reporteFuente.llave);
657
676
  //this.formMarcador.get('tipoReporte').setValue('N')
@@ -1573,11 +1592,11 @@ export class DetalleTipoReporteComponent {
1573
1592
  return this.reporteFuente.origenFuente == tipo;
1574
1593
  }
1575
1594
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DetalleTipoReporteComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ToastService }, { token: i3.GeneralService }, { token: i4.GeneralPipe }, { token: i5.AuthService }, { token: i6.ReporteFuentePipe }, { token: i7.ConfirmationService }, { token: i8.CargarArchivosService }, { token: i9.EncriptadoBasicoService }, { token: i10.UtilsService }, { token: i11.TranslateService }, { token: i12.FuentePipe }, { token: i13.ReporteColumnarioPipe }, { token: i14.EjecucionReporteService }, { token: i15.DashboardService }, { token: i16.DashboardPipe }], target: i0.ɵɵFactoryTarget.Component });
1576
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: DetalleTipoReporteComponent, isStandalone: true, selector: "detalle-tipo-reporte", inputs: { llaveReporte: "llaveReporte", aplicacion: "aplicacion", listaFuentes: "listaFuentes" }, providers: [MessageService], viewQueries: [{ propertyName: "divGrafica", first: true, predicate: ["divGrafica"], descendants: true }], ngImport: i0, template: "<p-tabView (onChange)=\"cambiarTab($event)\">\n <p-tabPanel header=\"{{'excel' | translate }}\" [selected]=\"true\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <p class=\"font-semibold\">{{'debe' | translate}} {{'indicar' | translate}} {{'plantilla' | translate}} {{'y' | translate}}\n {{'hoja' | translate}} {{'para' | translate}} {{'que' | translate}} {{'esta' | translate}}\n {{'opcion' | translate}} {{'se' | translate}} {{'active' | translate}}\n </p>\n <div class=\"p-fluid p-formgrid grid\">\n <div class=\"field col-12 md:col-4\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n [label]=\"reporteFuente.archivoTodo ? reporteFuente.archivoTodo: ''\"\n [extensiones]=\"'xls;xlsx'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\n (onSelected)=\"obtenerArchivo($event)\"></app-input-helper-seleccion-plantilla>\n\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\n translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoExcel\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\n icon=\"glyphicons glyphicons-refresh\" label=\"{{'link_actualizar' | translate}}\"\n (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n\n <p-pickList [source]=\"listaExcel\" [target]=\"listaNoExcel\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\n filterBy=\"sintaxis\" (onSourceReorder)=\"moverAAsociado($event)\"\n (onMoveAllToTarget)=\"moverADesasociado($event)\" (onMoveAllToSource)=\"moverAAsociado($event)\"\n (onMoveToTarget)=\"moverADesasociado($event)\" (onMoveToSource)=\"moverAAsociado($event)\">\n <ng-template let-excel pTemplate=\"item\">\n <div>\n <label>{{excel.nombre}}</label>\n </div>\n </ng-template>\n </p-pickList>\n\n <div class=\"mt-4\">\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorExcel()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorExcel\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorExcel\">\n <button pButton pRipple (click)=\"verNuevoMarcadorExcel = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadorExcel\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcadorExcel\" [rows]=\"10\"\n [totalRecords]=\"listaMarcadorExcel.length\" [paginator]=\"listaMarcadorExcel.length > 10\"\n (onRowSelect)=\"verDetalleMarcadorExcel($event)\" (onRowUnselect)=\"verDetalleMarcadorExcel($event)\" *ngIf=\"!verNuevoMarcadorExcel\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'descripcion' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marcador>\n <tr [pSelectableRow]=\"marcador\">\n <td>{{marcador.descripcion}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorExcel\">\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-book\"></i>{{'detalle' | translate}}</h5>\n <div class=\"Detallereporte mt-4 \">\n <form [formGroup]=\"formMarcadorExcel\" >\n <div class=\"col-md-12 p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\" maxlength=\"4000\">\n <label>{{'descripcion' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\" maxlength=\"4000\">\n <label>{{'marcador' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown\n [options]=\"[{label: 'Imagen Fija', value: 'IF'}, {label: 'Marcador', value: 'MA'}]\"\n [autoDisplayFirst]=\"false\" formControlName=\"tipo\" optionLabel=\"label\"\n optionValue=\"value\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\" [hidden]=\"esImagenFija\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\n <label>{{'valor' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\n <p-floatLabel>\n <p-dropdown\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\n [autoDisplayFirst]=\"false\" formControlName=\"origen\" optionLabel=\"label\"\n optionValue=\"value\"></p-dropdown>\n <label>{{'origen' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n formControlName=\"textoRegistro\"\n [label]=\"reporteMarcadorExcel.textoRegistro ? reporteMarcadorExcel.textoRegistro: ''\"\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcadorExcel($event)\"\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"('recursos' | translate)\" [labelarch]=\"'recurso' | translate\" [mostrarX]=\"true\"\n [mostraroblicargo]=\"true\"\n [booleano]=\"!utilsService.validarCampoObligatorio(reporteMarcadorExcel.textoRegistro) && clickGuardarMarcadorExcel\"\n [anexoPropiedad]=\"reporteMarcadorExcel.origen =='C' ? llaveEmpresa: ''\"\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\n </div>\n </div>\n </form>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"verNuevoMarcadorExcel\">\n <button pButton pRipple class=\"ml-2 p-button-raised\" icon=\"glyphicons {{reporteMarcadorExcel.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{reporteMarcadorExcel.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorExcel()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"reporteMarcadorExcel.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadorExcel($event)\">\n </button>\n </div>\n </div>\n </div>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'plantilla' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.unicoArchivo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'soporte' | translate }} {{'unico' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.descargarFuente\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'descargardoc' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.generarPin\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'generarpin' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [(ngModel)]=\"reporteFuente.campoAgrupacionPlanilla\" \n [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'agruparpor' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreAgrupacionPlanilla\" size=\"25\"\n maxlength=\"100\">\n <label>{{'nombrearchivoagrupacion' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoPlanilla\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteFuente.unicoArchivo == 'N'\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n [label]=\"reporteFuente.archivoIndividual ? reporteFuente.archivoIndividual: ''\"\n [labelrar]=\"'archivo' | translate\" [labelarch]=\"'archivo' | translate\" [mostraroblicargo]=\"true\"\n (onSelected)=\"obtenerArchivoPlanilla($event)\"></app-input-helper-seleccion-plantilla>\n </div>\n\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n\n <p-tabView >\n <p-tabPanel header=\"{{'marcadores' | translate }}\" [selected]=\"true\">\n \n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton pRipple class=\"p-button-secondary font-semibold mb-2\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcador()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcador\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcador\">\n <button pButton pRipple (click)=\"verNuevoMarcador = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadores\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcador\"\n [rows]=\"10\" [totalRecords]=\"listaMarcadores.length\"\n [paginator]=\"listaMarcadores.length > 10\" *ngIf=\"!verNuevoMarcador\"\n (onRowSelect)=\"verDetalleMarcador($event)\" (onRowUnselect)=\"verDetalleMarcador($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'descripcion' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'marcador' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marcador>\n <tr [pSelectableRow]=\"marcador\">\n <td>{{marcador.descripcion}}</td>\n <td>{{marcador.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\n <td>{{marcador.tipo == 'IF' ? marcador.textoRegistro : marcador.nombreColumna}}</td>\n <td>{{marcador.marcador}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <div class=\"card col-md-12\" *ngIf=\"verNuevoMarcador\">\n <div class=\"Detallereporte mt-2\">\n <form [formGroup]=\"formMarcador\">\n <p class=\"font-semibold\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\"\n maxlength=\"4000\">\n <label>{{'descripcion' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoMarcador\" [autoDisplayFirst]=\"false\" \n formControlName=\"tipo\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!(['MA','IM','MR','IF','QR','BC','G1'].includes(reporteMarcador.tipo))\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\">\n <label>{{'marcador' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"tabla\" size=\"25\">\n <label>{{'tabla' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'IF'\">\n <p-floatLabel>\n <p-dropdown\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" formControlName=\"origen\" optionLabel=\"label\"\n optionValue=\"value\"></p-dropdown>\n <label>{{'origen' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"reporteMarcador.tipo != 'IF' || !reporteMarcador.origen\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n formControlName=\"textoRegistro\"\n [label]=\"reporteMarcador.textoRegistro ? reporteMarcador.textoRegistro: ''\"\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcador($event)\"\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"'recursos' | translate\"\n [anexoPropiedad]=\"reporteMarcador.origen =='C' ? llaveEmpresa: ''\"\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['MA','IM','QR','BC','G1'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" formControlName=\"reporteColumna\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\n optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'columna' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MA'\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"formato\" size=\"25\">\n <label>{{'formato' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-inputNumber formControlName=\"ancho\" [maxlength]=\"5\"> </p-inputNumber>\n <label>{{'ancho' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-inputNumber formControlName=\"alto\" [maxlength]=\"5\"> </p-inputNumber>\n <label>{{'alto' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo1\"></textarea>\n <label>{{'grupo1' | translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo2\"></textarea>\n <label>{{'grupo2' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo3\"></textarea>\n <label>{{'grupo3' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"finalGrupo\"></textarea>\n <label>{{'finalgrupo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\n <label>{{'texto' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['MR','TB'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" formControlName=\"tieneSql\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'sql' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoGrafico_JFC\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n <label>{{'grafica' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\"\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['S'].includes(reporteMarcador.tieneSql)))\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"query\"></textarea>\n <label>{{'consulta' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"fuente\" optionLabel=\"descripcion\"\n optionValue=\"llave\"></p-dropdown>\n <label>{{'fuente' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"marcadorGrafico\" size=\"25\">\n <label>{{'marcadorgrafica' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"titulox\" size=\"25\">\n <label>{{'titulo' | translate }} X</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"tituloy\" size=\"25\">\n <label>{{'titulo' | translate }} Y</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"banda\" size=\"25\">\n <label>{{'colordinamico' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" size=\"25\">\n <label>{{'numerocategorias' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\"\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\n <label>{{'filtro' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n </form>\n\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\n icon=\"glyphicons {{reporteMarcador.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save' }}\" label=\"{{reporteMarcador.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\"\n (click)=\"guardarMarcador()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"reporteMarcador.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcador($event)\">\n </button>\n </div>\n </div>\n </div>\n <div *ngIf=\"verNuevoMarcador && reporteMarcador.llave != null && (reporteMarcador.tipo == 'MR' || reporteMarcador.tipo == 'TB')\">\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTabla()\" icon=\"pi pi-plus\" [disabled]=\"bloquearCampoMarcador\"\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"listaCamposMarcador\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcador.length\" [scrollable]=\"true\"\n [paginator]=\"listaCamposMarcador.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llave\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 10%;\">{{'columna' | translate }}</th>\n <th style=\"width: 10%;\">{{'campo' | translate }}</th>\n <th style=\"width: 10%;\">{{'formato' | translate }}</th>\n <th style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">{{'tipo' | translate }}</th>\n <th style=\"width: 10%;\"*ngIf=\"reporteMarcador.tipo == 'TB'\">{{'medidas' | translate }}</th>\n <th style=\"width: 10%;\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalle\">\n <td style=\"width: 10%;\">\n <input pInputText [(ngModel)]=\"campoMarcadorInsertar.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '');\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\" />\n </td>\n <td style=\"width: 10%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.campoFuente\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\">\n </td>\n <td style=\"width: 10%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.formato\">\n </td>\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [(ngModel)]=\"campoMarcadorInsertar.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\n </td>\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <div *ngIf=\"campoMarcadorInsertar.tipo =='I'\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.ancho\">\n <label>{{'ancho' | translate}}</label>\n </p-floatLabel>\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.alto\">\n <label>{{'alto' | translate}}</label>\n </p-floatLabel>\n </div>\n </td>\n <td style=\"width: 10%;\" >\n <div class=\"flex justify-content-end\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campoMarcadorInsertar)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalle = false; bloquearCampoMarcador = false\" icon=\"pi pi-times\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"campo\">\n <td style=\"width: 10%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" \n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" />\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.columna}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.campoFuente}}\n </ng-template>\n </p-cellEditor>\n </td>\n\n <td style=\"width: 10%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.formato}}\n </ng-template>\n </p-cellEditor>\n </td>\n \n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [(ngModel)]=\"campo.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.tipo | reporteFuentePipe :'listaRecursoGrafica'}}\n </ng-template>\n </p-cellEditor>\n </td>\n \n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div *ngIf=\"campo.tipo =='I'\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campo.ancho\">\n <label>{{'ancho' | translate}}</label>\n </p-floatLabel>\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campo.alto\">\n <label>{{'alto' | translate}}</label>\n </p-floatLabel>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <div *ngIf=\"campo.tipo =='I'\">\n {{'ancho' | translate}}: {{campo.ancho}} <br/>\n {{'alto' | translate}}: {{campo.alto}}\n </div> \n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%;\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorAsync()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow [disabled]=\"bloquearCampoMarcador\"\n icon=\"glyphicons glyphicons-pencil\" (click)=\"editarCampoMarcador()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow [disabled]=\"bloquearCampoMarcador\"\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcador($event,campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'soporte' | translate }} {{'archivo' | translate }}s\"\n *ngIf=\"reporteFuente.unicoArchivo == 'N'\">\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoSoporte()\" icon=\"pi pi-plus\"\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"listaSoportes\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"listaSoportes.length\"\n [paginator]=\"listaSoportes.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llaveTabla\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 45%\">{{'descripcion' | translate}}</th>\n <th style=\"width: 45%\">{{'archivo' | translate}}</th>\n <th style=\"width: 10%\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verSoporteArchivoDetalle\">\n <td style=\"width: 45%\">\n <input pInputText type=\"text\" [(ngModel)]=\"soporteIngresar.descripcion\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\">\n </td>\n <td style=\"width: 45%\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\" [mostrarX]=\"true\"\n [label]=\"soporteIngresar.archivoIndividual ? soporteIngresar.archivoIndividual: ''\" [labelarch]=\"'archivo' | translate\"\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"true\" [booleano]=\"!utilsService.validarCampoObligatorio(soporteIngresar.archivoIndividual) && clickGuardarSoporteArchivo\"\n (onSelected)=\"obtenerArchivoSoporte($event, soporteIngresar)\"></app-input-helper-seleccion-plantilla>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarSoporte(soporteIngresar)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verSoporteArchivoDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarSoporte()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-soporte let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"soporte\" style=\"width: 100%\">\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"soporte.descripcion\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{soporte.descripcion}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n {{soporte.archivoIndividual}}\n <!--<app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\" [mostrarX]=\"true\"\n [label]=\"soporte.archivoIndividual ? soporte.archivoIndividual: ''\"\n [mostrarLabelInput]=\"false\" [booleano]=\"!utilsService.validarCampoObligatorio(soporte.archivoIndividual) && clickGuardarSoporteArchivo\"\n (onSelected)=\"obtenerArchivoSoporte($event, soporte)\"></app-input-helper-seleccion-plantilla>-->\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{soporte.archivoIndividual}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarSoporte(soporte)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cancelarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\n icon=\"pi pi-trash\" (click)=\"eliminarSoporte($event, soporte)\" [disabled]=\"habilitaCampo\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n </p-tabPanel>\n </p-tabView>\n </p-tabPanel>\n <p-tabPanel header=\"{{'reporte' | translate }} {{'dinamico' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.dobleLinea\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'doblelinea' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloParametro\" size=\"25\"\n maxlength=\"100\">\n <label>{{'descripcion' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoJasper\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n \n \n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"glyphicons glyphicons-restart\" \n label=\"{{'link_generar' | translate}}\" (click)=\"generarJasper()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"pi pi-download\" *ngIf=\"existeJasper\"\n label=\"{{'link_descargar' | translate}}\" (click)=\"descargarJasper()\">\n </button>\n \n </div>\n </div>\n </div>\n \n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"bandaSeleccionada.key\">\n <button pButton pRipple (click)=\"regresarBandaSeleccionada()\" label= \"{{'listado' | translate}} {{'bandas' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaTipoBanda\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" [rows]=\"10\"\n [totalRecords]=\"listaTipoBanda.length\" [paginator]=\"listaTipoBanda.length > 10\"\n (onRowSelect)=\"verBanda($event)\" (onRowUnselect)=\"verBanda($event)\" *ngIf=\"!bandaSeleccionada.key\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'banda' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-banda>\n <tr [pSelectableRow]=\"banda\">\n <td>{{banda.value}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <p-tabView *ngIf=\"bandaSeleccionada.key && verTabBanda\">\n <p-tabPanel header=\"{{'caracteristicas' | translate}}\"\n *ngIf=\"!['detalle','summary'].includes(bandaSeleccionada.key)\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"codigo\" \n [(ngModel)]=\"reporteBanda.totales\" ></p-dropdown>\n <label>{{'total' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteBanda.titulo\" maxlength=\"200\">\n <label>{{'titulo' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCaracteristicaBanda()\">\n </button>\n </div>\n </div>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{bandaSeleccionada.value}}\" *ngIf=\"!nuevaBanda\">\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\n <div class=\"flex justify-content-end mb-1\" >\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoMarcadorDinamico()\" icon=\"pi pi-plus\"\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\" *ngIf=\"!nuevoReporteMarcadorDinamico\"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadorDinamico\" [scrollable]=\"true\"\n responsiveLayout=\"scroll\" dataKey=\"llaveTabla\" selectionMode=\"single\"\n [rows]=\"10\" [totalRecords]=\"listaMarcadorDinamico.length\"\n [paginator]=\"listaMarcadorDinamico.length > 10\" *ngIf=\"!nuevoReporteMarcadorDinamico\"\n (onRowSelect)=\"verMarcadorDinamico($event)\" (onRowUnselect)=\"verMarcadorDinamico($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'banda' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'etiqueta' | translate }}</th>\n <th>{{'formato' | translate }}</th>\n <th>{{'ancho' | translate }}</th>\n <th>{{'operacion' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-dinamico>\n <tr [pSelectableRow]=\"dinamico\">\n <td>{{dinamico.banda}}</td>\n <td>{{dinamico.banda ? dinamico.alto : ''}}</td>\n <td>{{dinamico.marcador}}</td>\n <td>{{dinamico.banda ? dinamico.descripcion : ''}}</td>\n <td>{{dinamico.banda ? dinamico.formato : ''}}</td>\n <td>{{['detalle'].includes(dinamico.banda) ? dinamico.ancho : ''}}</td>\n <td>{{dinamico.banda ? dinamico.operacion : ''}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <div *ngIf=\"nuevoReporteMarcadorDinamico\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"flex justify-content-between align-items-center mb-2\"> \n <p class=\"font-semibold mt-3\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\n <button pButton pRipple (click)=\"nuevoReporteMarcadorDinamico = false\" label= \"{{'listado' | translate}} {{bandaSeleccionada.value}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \" *ngIf=\"nuevoReporteMarcadorDinamico\"></button>\n </div>\n <form [formGroup]=\"formReporteDinamico\" class=\"p-fluid grid\">\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCampoJasperDinamico\"\n [autoDisplayFirst]=\"false\" formControlName=\"tipoCampo\"\n optionLabel=\"value\" optionValue=\"key\"></p-dropdown>\n <label>{{'tipocampo' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoDatoSintaxis\" [autoDisplayFirst]=\"false\" \n formControlName=\"tipoDato\" optionLabel=\"value\"\n optionValue=\"key\"></p-dropdown>\n <label>{{'tipodato' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText formControlName=\"alto\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\n <label>{{'orden' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" \n formControlName=\"marcador\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\n *ngIf=\"!reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\"></p-dropdown>\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\"\n *ngIf=\"reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\">\n <label>{{'columna' | translate }} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-12\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\n <label>{{'sintaxis' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\">\n <p-fieldset class=\"fieldsintitulo\" class=\"fieldsintitulo\">\n <div class=\"p-fluid grid\">\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\">\n <label class=\"font-semibold text-gray-900 text-base ml-1\">{{'resultado' | translate}}</label>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\"></div>\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <label class=\"font-semibold text-gray-900 text-base ml-1\" >{{'label' | translate}}</label>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"formato\" />\n <label>{{'formato' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"descripcion\" />\n <label>{{'titulo' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"ancho\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\n <label>{{'ancho' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' == reporteMarcadorDinamico.banda \"></div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'ancho' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"resultadoX\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'x' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"titulox\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'x' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"resultadoY\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'y' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"tituloy\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'y' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" \n formControlName=\"tipoReporte\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'alineacion' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'alineacion' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoDato == 'N' && reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaOperaciones\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"operacion\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'operacion' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n </p-fieldset>\n </div>\n </form>\n \n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{reporteMarcadorDinamico.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{reporteMarcadorDinamico.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaDinamico()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"reporteMarcadorDinamico.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarColumnaDinamico($event)\">\n </button>\n </div>\n </div>\n </div>\n </div>\n </p-tabPanel>\n \n </p-tabView>\n </p-tabPanel>\n <p-tabPanel header=\"{{'reporte' | translate }} {{'texto' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.archivoTexto\" size=\"50\"\n maxlength=\"200\">\n <label>{{'nombrearchivo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSeparadores\" [(ngModel)]=\"reporteFuente.separador\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\n [autoDisplayFirst]=\"false\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'separador' | translate }}*</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoTexto\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizarSeparador()\">\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-content-between lign-items-center mb-3\">\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorTexto()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorTexto\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorTexto\">\n <button pButton pRipple (click)=\"verNuevoMarcadorTexto = false; clickGuardarMarcadorTexto = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadoresTexto\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"listaMarcadoresTexto.length\"\n [paginator]=\"listaMarcadoresTexto.length > 10\" *ngIf=\"!verNuevoMarcadorTexto\"\n (onRowSelect)=\"verMarcadorTexto($event)\" (onRowUnselect)=\"verMarcadorTexto($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'tipo' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'formato' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marctexto>\n <tr [pSelectableRow]=\"marctexto\">\n <td>{{marctexto.tipoGrafico | reporteFuentePipe : 'listaTipoMarcadoresTexto'}}</td>\n <td>{{marctexto.nombreColumna}}</td>\n <td>{{marctexto.formato}}</td>\n <td>{{marctexto.alto}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorTexto\"> \n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoMarcadorTexto\" [autoDisplayFirst]=\"false\"\n [(ngModel)]=\"marcadorTexto.tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\"\n [(ngModel)]=\"marcadorTexto.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"></p-dropdown>\n <label>{{'columna' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.formato\" maxlength=\"50\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\">\n <label>{{marcadorTexto.tipoGrafico == 'D' ? ('formato' | translate)+'*' : ('valor' | translate)+'*' }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.ancho\" maxlength=\"22\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\">\n <label>{{'ancho' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.alto\" maxlength=\"22\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\">\n <label>{{'orden' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorTexto.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{marcadorTexto.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorTexto()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"marcadorTexto.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadoTexto($event)\">\n </button>\n </div>\n </div>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'tabla' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreTabla\" maxlength=\"4000\">\n <label>{{'nombretabla' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-8\">\n <!--BOTONES-->\n <div class=\"flex justify-content-end mt-1 mb-1\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <p-pickList [source]=\"listaTabla\" [target]=\"listaNoTabla\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\n filterBy=\"nombre\" *ngIf=\"isFuente()\" (onSourceReorder)=\"reorderTabla($event)\"\n (onMoveAllToTarget)=\"moverADesasociadoTabla($event)\" (onMoveAllToSource)=\"moverAAsociadoTabla($event)\"\n (onMoveToTarget)=\"moverADesasociadoTabla($event)\" (onMoveToSource)=\"moverAAsociadoTabla($event)\">\n <ng-template let-tabla pTemplate=\"item\">\n <div>\n <label>{{tabla.nombre}}</label>\n </div>\n </ng-template>\n </p-pickList>\n </p-tabPanel>\n <p-tabPanel header=\"{{'archivoxml' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagEncabezado\"></textarea>\n <label>{{'tagencabezado' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagCierreEncabezado\"></textarea>\n <label>{{'tagcierreencabezado' | translate }}</label>\n </p-floatLabel> \n </div>\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.estructuraRegistro\"></textarea>\n <label>{{'tagregistro' | translate }}</label>\n </p-floatLabel> \n </div>\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoXml\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n <div class=\"flex justify-content-between align-items-center mb-3\">\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorXML()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorXML\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorXML\">\n <button pButton pRipple (click)=\"verNuevoMarcadorXML = false; clickGuardarMarcadorXML = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaXML\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"listaXML.length\"\n [paginator]=\"listaXML.length > 10\" *ngIf=\"!verNuevoMarcadorXML\"\n (onRowSelect)=\"verMarcadorXML($event)\" (onRowUnselect)=\"verMarcadorXML($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'descripcion' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'marcador' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marctexto>\n <tr [pSelectableRow]=\"marctexto\">\n <td>{{marctexto.descripcion}}</td>\n <td>{{marctexto.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\n <td>{{marctexto.nombreColumna}}</td>\n <td>{{marctexto.marcador}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorXML\"> \n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.descripcion\" maxlength=\"100\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\">\n <label>{{'descripcion' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaTipoMarcadorXML\" [autoDisplayFirst]=\"false\" \n [(ngModel)]=\"marcadorXML.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MA','MR'].includes(marcadorXML.tipo)\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" >\n <label>{{'marcador' | translate}}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\n <label>{{'tabla' | translate}}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"marcadorXML.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\" ></p-dropdown>\n <label>{{'columna' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.formato\" >\n <label>{{'formato' | translate}}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.textoRegistro\" ></textarea>\n <label>{{'texto' | translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"marcadorXML.fuente\" optionLabel=\"descripcion\" optionValue=\"llave\"></p-dropdown>\n <label>{{'fuente' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.filtro\"></textarea>\n <label>{{'filtro' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.estructuraTablaXML\"></textarea>\n <label>{{'estructuratabla' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorXML.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{marcadorXML.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorXML()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"marcadorXML.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadorXML($event)\">\n </button>\n </div>\n </div>\n </div>\n <div *ngIf=\"verNuevoMarcadorXML && marcadorXML.llave != null && (marcadorXML.tipo == 'MR' || marcadorXML.tipo == 'TB')\">\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTablaXML()\" icon=\"pi pi-plus\" [disabled]=\"habilitaCampo\"\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"listaCamposMarcadorXML\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcadorXML.length\"\n [paginator]=\"listaCamposMarcadorXML.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llave\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 30%;\">{{'campo' | translate }}</th>\n <th style=\"width: 30%;\">{{'marcador' | translate }}</th>\n <th style=\"width: 30%;\">{{'formato' | translate }}</th>\n <th style=\"width: 10%\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalleXML\">\n <td style=\"width: 30%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.campoFuente\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\">\n </td>\n <td style=\"width: 30%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.marcador\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\">\n </td>\n <td style=\"width: 30%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.formato\" style=\"width: -webkit-fill-available\">\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\" >\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campoMarcadorInsertarXML)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalleXML = false; habilitaCampo = false;\" icon=\"pi pi-times\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"campo\">\n <td style=\"width: 30%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.campoFuente}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 30%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.marcador\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.marcador}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 30%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\" style=\"width: -webkit-fill-available\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.formato}}\n </ng-template>\n </p-cellEditor>\n </td>\n \n \n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorXMLAsync()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\n icon=\"pi pi-trash\" [disabled]=\"habilitaCampo\" (click)=\"eliminarCampoMarcadorXML($event,campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'columnario' | translate }}\">\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\" >\n <p-accordionTab [selected]=\"true\" >\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\n {{'columnasbasicas'|translate}}\n </ng-template>\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoColumnaBasica()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoReporteColumnario\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoReporteColumnario\">\n <button pButton pRipple (click)=\"verNuevoReporteColumnario = false; clickGuardarReporteColumnario = false;\" label= \"{{'listado' | translate}} {{'columnasbasicas' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaReporteColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"listaReporteColumnario.length\"\n [paginator]=\"listaReporteColumnario.length > 10\" *ngIf=\"!verNuevoReporteColumnario\"\n (onRowSelect)=\"verReporteColumnario($event)\" (onRowUnselect)=\"verReporteColumnario($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'nombre' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n <th>{{'operacion' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-bean>\n <tr [pSelectableRow]=\"bean\">\n <td>{{bean.nombre}}</td>\n <td>{{bean.nombreColumna}}</td>\n <td>{{bean.tipo | reporteColumnarioPipe: 'listaTipoColumna'}}</td>\n <td>{{bean.orden}}</td>\n <td>{{bean.operacion | reporteColumnarioPipe: 'listaOperacion'}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div *ngIf=\"verNuevoReporteColumnario\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.nombre\" maxlength=\"100\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\">\n <label>{{'nombre' | translate}} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaTipoColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'tipocolumna' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'columna' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"columnaBasica.tipo == 'D'\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOperacionesColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.operacion\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'operacion' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.operacionHorizontal\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'operacionhorizontal' | translate }} *</label>\n </p-floatLabel>\n </div>\n <!-- fila Operacion Vertical -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.columnaOperacionVertical\" maxlength=\"5\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\">\n <label>{{'columnaoperacion' | translate}} *</label>\n </p-floatLabel>\n </div>\n <!-- Operacion Verticial -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.operacionVertical\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'operacionvertical' | translate }} *</label>\n </p-floatLabel>\n </div>\n <!-- Orden -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrden()\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.orden\" maxlength=\"5\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\">\n <label>{{'orden' | translate}} *</label>\n </p-floatLabel>\n </div>\n <!-- Ordenamiento Filas -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoLabel() || isTipoFila()\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" [showClear]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\" \n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orderBy) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orderBy) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'ordenamiento' | translate }} *</label>\n </p-floatLabel>\n </div>\n <!-- Ordenamiento Datos de la consulta -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrdenConsulta()\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.ordenConsulta\" maxlength=\"5\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\n <label>{{'ordenconsulta' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaBasica.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{columnaBasica.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaBasica()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"columnaBasica.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarColumnaBasica($event)\">\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\">\n <p-accordionTab >\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\n {{'datosadicionales'|translate}}\n </ng-template>\n <p-fieldset class=\"fieldsintitulo\" >\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n \n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n [label]=\"reporteFuente.archivoExcelColumnario ? reporteFuente.archivoExcelColumnario: ''\"\n [extensiones]=\"'xls;xlsx;xlsm'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\n (onSelected)=\"obtenerArchivoColumnario($event)\"></app-input-helper-seleccion-plantilla>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\n translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"reporteFuente.filaInicioColumnario\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\n <label>{{'filainiciocolumnario' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" appendTo=\"body\"\n [(ngModel)]=\"reporteFuente.cifradoColumnario\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.sintaxisColumnario\"></textarea>\n <label>{{'sintaxiscolumnario' | translate }}</label>\n </p-floatLabel>\n </div>\n \n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </p-fieldset>\n <div class=\"flex justify-content-between align-items-center mb-3 mt-3\">\n <h1 class=\"text-xl\">{{'columnaadicional' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevaColumnaAdicional()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoColumnaAdicional\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoColumnaAdicional\">\n <button pButton pRipple (click)=\"verNuevoColumnaAdicional = false; clickGuardarColumnaAdicional = false;\" label= \"{{'listado' | translate}} {{'columnaadicional' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"columnasAdicionales\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"columnasAdicionales.length\"\n [paginator]=\"columnasAdicionales.length > 10\" *ngIf=\"!verNuevoColumnaAdicional\"\n (onRowSelect)=\"verDetalleAdicional($event)\" (onRowUnselect)=\"verDetalleAdicional($event)\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th>{{'nombre' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-columnaadicional>\n <tr [pSelectableRow]=\"columnaadicional\">\n <td>{{columnaadicional.nombre}}</td>\n <td>{{columnaadicional.orden}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoColumnaAdicional\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-3\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaAdicional.nombre\" maxlength=\"100\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\">\n <label>{{'alias' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"columnaAdicional.orden\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\" />\n <label>{{'orden' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaAdicional.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"></p-dropdown>\n <label>{{'ordenamiento' | translate }} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-3\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"columnaAdicional.ordenConsulta\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\" />\n <label>{{'ordenconsulta' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\" >\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"columnaAdicional.sintaxis\" maxlength=\"4000\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"></textarea>\n <label>{{'sintaxis' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaAdicional.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{columnaAdicional.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaAdicional()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"columnaAdicional.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarColumnaAdicional($event)\">\n </button>\n </div>\n </div>\n </p-fieldset>\n </p-accordionTab>\n <p-accordionTab >\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\n {{'marcadores'|translate}}\n </ng-template>\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorColumnario()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorColumnario\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorColumnario\">\n <button pButton pRipple (click)=\"verNuevoMarcadorColumnario = false; clickGuardarMarcadorColumnario = false;\" label= \"{{'listado' | translate}} {{'marcador' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"marcadoresColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"marcadoresColumnario.length\"\n [paginator]=\"marcadoresColumnario.length > 10\" *ngIf=\"!verNuevoMarcadorColumnario\"\n (onRowSelect)=\"verDetalleMarcadorColumnario($event)\" (onRowUnselect)=\"verDetalleMarcadorColumnario($event)\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th>{{'nombre' | translate }}</th>\n <th>{{'tipomarcador' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marcador>\n <tr [pSelectableRow]=\"marcador\">\n <td>{{marcador.marcador}}</td>\n <td>{{marcador.tipo | reporteColumnarioPipe: 'listaTipoMarcador'}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div *ngIf=\"verNuevoMarcadorColumnario\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"marcadorColumnario.descripcion\" maxlength=\"4000\" \n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\" />\n <label>{{'descripcion' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"marcadorColumnario.marcador\" maxlength=\"50\" \n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\" />\n <label>{{'marcador' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaTipoMarcadorColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"marcadorColumnario.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-12\" >\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"marcadorColumnario.textoRegistro\" maxlength=\"4000\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"></textarea>\n <label>{{'valor' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorColumnario.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{marcadorColumnario.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorColumnario()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"marcadorColumnario.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadorColumnario($event)\">\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </p-tabPanel>\n <p-tabPanel header=\"{{'grafica' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.codigo\" size=\"25\"\n maxlength=\"100\">\n <label>{{'codigo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloGrafico\" size=\"25\"\n maxlength=\"100\">\n <label>{{'titulo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoGrafico\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.tipoGrafico\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n <label>{{'tipo' | translate }}</label> \n </p-floatLabel>\n </div>\n </div>\n\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"isSql()\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\" \n label=\"{{'link_actualizar' | translate}}\" (click)=\"guardarGrafico()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"pi pi-eye\"\n label=\"{{'link_ver' | translate}}\" (click)=\"verGrafico()\">\n </button>\n </div>\n </div>\n </div>\n\n <p-table [value]=\"paginadorColumnas\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\n [rows]=\"20\" [totalRecords]=\"paginadorColumnas.length\" [paginator]=\"paginadorColumnas.length > 20\" >\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'columna' | translate }}</th>\n <th>{{'sintaxis' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'accion' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-bean>\n <tr [pSelectableRow]=\"bean\">\n <td>{{bean.nombre}}</td>\n <td>{{bean.sintaxis}}</td>\n <td>{{bean.tipoDato | reporteFuentePipe : 'listaTipoDato'}}</td>\n <td>\n <p-dropdown [options]=\"listaGraficoSencillo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"bean.graficoFuente\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table> \n\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\n <h1 class=\"text-xl\">Colores</h1>\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoColorCategoria()\" icon=\"pi pi-plus\"\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"paginadorColoresGrafica\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"paginadorColoresGrafica.length\"\n [paginator]=\"paginadorColoresGrafica.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llaveTabla\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 45%\">{{'categoria' | translate}}</th>\n <th style=\"width: 45%\">{{'color' | translate}}</th>\n <th style=\"width: 10%\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verColorCategoriaDetalle\">\n <td style=\"width: 45%\">\n <input pInputText type=\"text\" [(ngModel)]=\"colorCategoria.titulo\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(colorCategoria.titulo) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(colorCategoria.titulo) && clickGuardarColorCategoria\">\n </td>\n <td style=\"width: 45%\">\n <div style=\"width: 100%\">\n <p-colorPicker [(ngModel)]=\"colorCategoria.banda\" appendTo=\"body\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(colorCategoria.banda) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(colorCategoria.banda) && clickGuardarColorCategoria\" />\n </div>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarColorCategoria(colorCategoria)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verColorCategoriaDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarColorCategoria()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-color let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"color\" style=\"width: 100%\">\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"color.titulo\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(color.titulo) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(color.titulo) && clickGuardarColorCategoria\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{color.titulo}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div style=\"width: 100%\">\n <p-colorPicker [(ngModel)]=\"color.banda\" appendTo=\"body\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(color.banda) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(color.banda) && clickGuardarColorCategoria\"/>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <p-colorPicker [(ngModel)]=\"color.banda\" [disabled]=\"true\" />\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarColorCategoria(color)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cancelarEdicionColor()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\n icon=\"pi pi-trash\" (click)=\"eliminarColorCategoria($event, color)\" [disabled]=\"habilitaCampo\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div #divGrafica class=\"flex justify-content-between card mt-3\" *ngIf=\"grafica\">\n <h1 class=\"text-xl\">{{'grafica' | translate}}</h1>\n <div style=\"width: 35%\"></div>\n <div style=\"width: 30%\">\n <p-chart [type]=\"tipoGrafica\" [data]=\"grafica.datosGrafica.data\" [options]=\"grafica.datosGrafica.options\"></p-chart>\n </div>\n <div style=\"width: 35%\"></div>\n </div>\n </p-tabPanel>\n</p-tabView>", styles: [":host ::ng-deep .p-picklist-buttons.p-picklist-source-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist-buttons.p-picklist-target-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist.p-component{margin:0}:host ::ng-deep .p-picklist-item span{float:left!important}:host ::ng-deep .fieldsintitulo .p-fieldset-legend{display:none!important}:host ::ng-deep .p-picklist-list-wrapper.p-picklist-source-wrapper ul{box-shadow:inset 1px 8px 10px -10px var(--color-200)}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-200) no-repeat}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-50) no-repeat}:host ::ng-deep .p-picklist .p-picklist-header{display:none}:host ::ng-deep .p-picklist .p-picklist-filter-container span{color:var(--color-100)}:host ::ng-deep .p-picklist .p-picklist-filter-container{border-radius:10px 10px 0 0;padding:3%;border:1px solid var(--color-100);border-bottom:none;box-shadow:0 4px 7px var(--color-100);position:relative}:host ::ng-deep .p-picklist .p-picklist-list{border:1px solid var(--color-100);height:400px}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item{padding:2%;color:#000000de;background:solid 2px var(--color-50) no-repeat;margin:16px 16px -7px;border-radius:5px;border:solid 1px var(--color-100);transition:.2s;background:#fff}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h6,:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h7{color:var(--color-500);margin-bottom:2px;font-size:1rem;margin-top:0}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item span{float:left;margin-right:4px;min-height:30px;color:var(--color-400)}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover{background:var(--color-400);color:#fff;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h6,:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h7{color:#fff!important;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover span{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight{background:var(--color-500);color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h6,:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h7{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight span{color:#fff!important}:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.5%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:20px}.p-picklist-buttons{padding:2rem}.p-picklist-buttons .p-button:disabled{background-color:var(--color3)!important;color:#fff!important}.p-picklist-buttons .p-button{margin-bottom:.5rem;border-radius:100%}.p-picklist-buttons .p-button.p-button-icon-only{padding:.4rem .5rem;width:40px;height:40px;max-width:initial;max-height:initial}.p-picklist-buttons .p-button.p-button-icon-only span{font-size:18px}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only{border-radius:100%;width:3rem!important;background:var(--color-500)}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only span{font-size:1.2rem;background:var(--color--300);color:#fff}:host ::ng-deep .p-picklist-buttons .p-button:disabled{background:var(--color-300)!important}@media (max-width: 1440px){:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.2%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:15px}}:host ::ng-deep .p-button{width:auto}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i17.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i17.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "component", type: i17.CellEditor, selector: "p-cellEditor" }, { kind: "directive", type: i17.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i17.InitEditableRow, selector: "[pInitEditableRow]" }, { kind: "directive", type: i17.SaveEditableRow, selector: "[pSaveEditableRow]" }, { kind: "directive", type: i17.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: TemplateTablaVaciaComponent, selector: "app-template-tabla-vacia" }, { kind: "ngmodule", type: TabViewModule }, { kind: "component", type: i18.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i18.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: InputHelperSeleccionPlantillaComponent, selector: "app-input-helper-seleccion-plantilla", inputs: ["value", "label", "labelrar", "labelarch", "extensiones", "readonly", "propiedad", "anexoPropiedad", "showDialog", "propiedadDeSistema", "mostraroblicargo", "mostrarX", "booleano", "mostrarLabelInput"], outputs: ["onSelected"] }, { kind: "pipe", type: ReporteColumnarioPipe, name: "reporteColumnarioPipe" }, { kind: "pipe", type: ReporteFuentePipe, name: "reporteFuentePipe" }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i19.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i20.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i21.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: PickListModule }, { kind: "component", type: i22.PickList, selector: "p-pickList", inputs: ["source", "target", "sourceHeader", "tabindex", "rightButtonAriaLabel", "leftButtonAriaLabel", "allRightButtonAriaLabel", "allLeftButtonAriaLabel", "upButtonAriaLabel", "downButtonAriaLabel", "topButtonAriaLabel", "bottomButtonAriaLabel", "targetHeader", "responsive", "filterBy", "filterLocale", "trackBy", "sourceTrackBy", "targetTrackBy", "showSourceFilter", "showTargetFilter", "metaKeySelection", "dragdrop", "style", "styleClass", "sourceStyle", "targetStyle", "showSourceControls", "showTargetControls", "sourceFilterPlaceholder", "targetFilterPlaceholder", "disabled", "ariaSourceFilterLabel", "ariaTargetFilterLabel", "filterMatchMode", "stripedRows", "keepSelection", "breakpoint"], outputs: ["onMoveToSource", "onMoveAllToSource", "onMoveAllToTarget", "onMoveToTarget", "onSourceReorder", "onTargetReorder", "onSourceSelect", "onTargetSelect", "onSourceFilter", "onTargetFilter", "onFocus", "onBlur"] }, { kind: "ngmodule", type: FieldsetModule }, { kind: "component", type: i23.Fieldset, selector: "p-fieldset", inputs: ["legend", "toggleable", "collapsed", "style", "styleClass", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "ngmodule", type: AccordionModule }, { kind: "component", type: i24.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i24.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i25.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: InputTextareaModule }, { kind: "directive", type: i26.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "ngmodule", type: FloatLabelModule }, { kind: "component", type: i27.FloatLabel, selector: "p-floatLabel" }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i28.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "ngmodule", type: ChartModule }, { kind: "component", type: i29.UIChart, selector: "p-chart", inputs: ["type", "plugins", "width", "height", "responsive", "ariaLabel", "ariaLabelledBy", "data", "options"], outputs: ["onDataSelect"] }, { kind: "ngmodule", type: ColorPickerModule }, { kind: "component", type: i30.ColorPicker, selector: "p-colorPicker", inputs: ["style", "styleClass", "inline", "format", "appendTo", "disabled", "tabindex", "inputId", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "autofocus"], outputs: ["onChange", "onShow", "onHide"] }] });
1595
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: DetalleTipoReporteComponent, isStandalone: true, selector: "detalle-tipo-reporte", inputs: { llaveReporte: "llaveReporte", aplicacion: "aplicacion", listaFuentes: "listaFuentes" }, providers: [MessageService], viewQueries: [{ propertyName: "divGrafica", first: true, predicate: ["divGrafica"], descendants: true }], ngImport: i0, template: "<p-tabView (onChange)=\"cambiarTab($event)\">\n <p-tabPanel header=\"{{'excel' | translate }}\" [selected]=\"true\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <p class=\"font-semibold\">{{'debe' | translate}} {{'indicar' | translate}} {{'plantilla' | translate}} {{'y' | translate}}\n {{'hoja' | translate}} {{'para' | translate}} {{'que' | translate}} {{'esta' | translate}}\n {{'opcion' | translate}} {{'se' | translate}} {{'active' | translate}}\n </p>\n <div class=\"p-fluid p-formgrid grid\">\n <div class=\"field col-12 md:col-4\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n [label]=\"reporteFuente.archivoTodo ? reporteFuente.archivoTodo: ''\"\n [extensiones]=\"'xls;xlsx'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\n (onSelected)=\"obtenerArchivo($event)\"></app-input-helper-seleccion-plantilla>\n\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\n translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoExcel\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\n icon=\"glyphicons glyphicons-refresh\" label=\"{{'link_actualizar' | translate}}\"\n (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n\n <p-pickList [source]=\"listaExcel\" [target]=\"listaNoExcel\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\n filterBy=\"sintaxis\" (onSourceReorder)=\"moverAAsociado($event)\"\n (onMoveAllToTarget)=\"moverADesasociado($event)\" (onMoveAllToSource)=\"moverAAsociado($event)\"\n (onMoveToTarget)=\"moverADesasociado($event)\" (onMoveToSource)=\"moverAAsociado($event)\">\n <ng-template let-excel pTemplate=\"item\">\n <div>\n <label>{{excel.nombre}}</label>\n </div>\n </ng-template>\n </p-pickList>\n\n <div class=\"mt-4\">\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorExcel()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorExcel\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorExcel\">\n <button pButton pRipple (click)=\"verNuevoMarcadorExcel = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadorExcel\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcadorExcel\" [rows]=\"10\"\n [totalRecords]=\"listaMarcadorExcel.length\" [paginator]=\"listaMarcadorExcel.length > 10\"\n (onRowSelect)=\"verDetalleMarcadorExcel($event)\" (onRowUnselect)=\"verDetalleMarcadorExcel($event)\" *ngIf=\"!verNuevoMarcadorExcel\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'descripcion' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marcador>\n <tr [pSelectableRow]=\"marcador\">\n <td>{{marcador.descripcion}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorExcel\">\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-book\"></i>{{'detalle' | translate}}</h5>\n <div class=\"Detallereporte mt-4 \">\n <form [formGroup]=\"formMarcadorExcel\" >\n <div class=\"col-md-12 p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\" maxlength=\"4000\">\n <label>{{'descripcion' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\" maxlength=\"4000\">\n <label>{{'marcador' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown\n [options]=\"[{label: 'Imagen Fija', value: 'IF'}, {label: 'Marcador', value: 'MA'}]\"\n [autoDisplayFirst]=\"false\" formControlName=\"tipo\" optionLabel=\"label\"\n optionValue=\"value\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\" [hidden]=\"esImagenFija\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\n <label>{{'valor' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\n <p-floatLabel>\n <p-dropdown\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\n [autoDisplayFirst]=\"false\" formControlName=\"origen\" optionLabel=\"label\"\n optionValue=\"value\"></p-dropdown>\n <label>{{'origen' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n formControlName=\"textoRegistro\"\n [label]=\"reporteMarcadorExcel.textoRegistro ? reporteMarcadorExcel.textoRegistro: ''\"\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcadorExcel($event)\"\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"('recursos' | translate)\" [labelarch]=\"'recurso' | translate\" [mostrarX]=\"true\"\n [mostraroblicargo]=\"true\"\n [booleano]=\"!utilsService.validarCampoObligatorio(reporteMarcadorExcel.textoRegistro) && clickGuardarMarcadorExcel\"\n [anexoPropiedad]=\"reporteMarcadorExcel.origen =='C' ? llaveEmpresa: ''\"\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\n </div>\n </div>\n </form>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"verNuevoMarcadorExcel\">\n <button pButton pRipple class=\"ml-2 p-button-raised\" icon=\"glyphicons {{reporteMarcadorExcel.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{reporteMarcadorExcel.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorExcel()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"reporteMarcadorExcel.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadorExcel($event)\">\n </button>\n </div>\n </div>\n </div>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'plantilla' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.unicoArchivo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'soporte' | translate }} {{'unico' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.descargarFuente\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'descargardoc' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.generarPin\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'generarpin' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [(ngModel)]=\"reporteFuente.campoAgrupacionPlanilla\" \n [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'agruparpor' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreAgrupacionPlanilla\" size=\"25\"\n maxlength=\"100\">\n <label>{{'nombrearchivoagrupacion' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoPlanilla\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteFuente.unicoArchivo == 'N'\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n [label]=\"reporteFuente.archivoIndividual ? reporteFuente.archivoIndividual: ''\"\n [labelrar]=\"'archivo' | translate\" [labelarch]=\"'archivo' | translate\" [mostraroblicargo]=\"true\"\n (onSelected)=\"obtenerArchivoPlanilla($event)\"></app-input-helper-seleccion-plantilla>\n </div>\n\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n\n <p-tabView >\n <p-tabPanel header=\"{{'marcadores' | translate }}\" [selected]=\"true\">\n \n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton pRipple class=\"p-button-secondary font-semibold mb-2\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcador()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcador\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcador\">\n <button pButton pRipple (click)=\"verNuevoMarcador = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadores\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcador\"\n [rows]=\"10\" [totalRecords]=\"listaMarcadores.length\"\n [paginator]=\"listaMarcadores.length > 10\" *ngIf=\"!verNuevoMarcador\"\n (onRowSelect)=\"verDetalleMarcador($event)\" (onRowUnselect)=\"verDetalleMarcador($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'descripcion' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'marcador' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marcador>\n <tr [pSelectableRow]=\"marcador\">\n <td>{{marcador.descripcion}}</td>\n <td>{{marcador.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\n <td>{{marcador.tipo == 'IF' ? marcador.textoRegistro : marcador.nombreColumna}}</td>\n <td>{{marcador.marcador}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <div class=\"card col-md-12\" *ngIf=\"verNuevoMarcador\">\n <div class=\"Detallereporte mt-2\">\n <form [formGroup]=\"formMarcador\">\n <p class=\"font-semibold\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\"\n maxlength=\"4000\">\n <label>{{'descripcion' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoMarcador\" [autoDisplayFirst]=\"false\" \n formControlName=\"tipo\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!(['MA','IM','MR','IF','QR','BC','G1'].includes(reporteMarcador.tipo))\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\">\n <label>{{'marcador' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"tabla\" size=\"25\">\n <label>{{'tabla' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'IF'\">\n <p-floatLabel>\n <p-dropdown\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" formControlName=\"origen\" optionLabel=\"label\"\n optionValue=\"value\"></p-dropdown>\n <label>{{'origen' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"reporteMarcador.tipo != 'IF' || !reporteMarcador.origen\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n formControlName=\"textoRegistro\"\n [label]=\"reporteMarcador.textoRegistro ? reporteMarcador.textoRegistro: ''\"\n [mostraroblicargo]=\"true\" [mostrarX]=\"true\"\n [booleano]=\"!utilsService.validarCampoObligatorio(reporteMarcador.textoRegistro) && clickGuardarMarcador\"\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcador($event)\"\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"'recursos' | translate\"\n [anexoPropiedad]=\"reporteMarcador.origen =='C' ? llaveEmpresa: ''\"\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['MA','IM','QR','BC','G1'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" formControlName=\"reporteColumna\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\n optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'columna' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MA'\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"formato\" size=\"25\">\n <label>{{'formato' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-inputNumber formControlName=\"ancho\" [maxlength]=\"5\"> </p-inputNumber>\n <label>{{'ancho' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-inputNumber formControlName=\"alto\" [maxlength]=\"5\"> </p-inputNumber>\n <label>{{'alto' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo1\"></textarea>\n <label>{{'grupo1' | translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo2\"></textarea>\n <label>{{'grupo2' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo3\"></textarea>\n <label>{{'grupo3' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"finalGrupo\"></textarea>\n <label>{{'finalgrupo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\n <label>{{'texto' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['MR','TB'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" formControlName=\"tieneSql\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'sql' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoGrafico_JFC\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n <label>{{'grafica' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\"\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['S'].includes(reporteMarcador.tieneSql)))\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"query\"></textarea>\n <label>{{'consulta' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"fuente\" optionLabel=\"descripcion\"\n optionValue=\"llave\"></p-dropdown>\n <label>{{'fuente' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"marcadorGrafico\" size=\"25\">\n <label>{{'marcadorgrafica' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"titulox\" size=\"25\">\n <label>{{'titulo' | translate }} X</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"tituloy\" size=\"25\">\n <label>{{'titulo' | translate }} Y</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"banda\" size=\"25\">\n <label>{{'colordinamico' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" size=\"25\">\n <label>{{'numerocategorias' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\"\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\n <label>{{'filtro' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n </form>\n\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\n icon=\"glyphicons {{reporteMarcador.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save' }}\" label=\"{{reporteMarcador.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\"\n (click)=\"guardarMarcador()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"reporteMarcador.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcador($event)\">\n </button>\n </div>\n </div>\n </div>\n <div *ngIf=\"verNuevoMarcador && reporteMarcador.llave != null && (reporteMarcador.tipo == 'MR' || reporteMarcador.tipo == 'TB')\">\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTabla()\" icon=\"pi pi-plus\" [disabled]=\"bloquearCampoMarcador\"\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"listaCamposMarcador\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcador.length\" [scrollable]=\"true\"\n [paginator]=\"listaCamposMarcador.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llave\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 10%;\">{{'columna' | translate }}</th>\n <th style=\"width: 10%;\">{{'campo' | translate }}</th>\n <th style=\"width: 10%;\">{{'formato' | translate }}</th>\n <th style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">{{'tipo' | translate }}</th>\n <th style=\"width: 10%;\"*ngIf=\"reporteMarcador.tipo == 'TB'\">{{'medidas' | translate }}</th>\n <th style=\"width: 10%;\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalle\">\n <td style=\"width: 10%;\">\n <input pInputText [(ngModel)]=\"campoMarcadorInsertar.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '');\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\" />\n </td>\n <td style=\"width: 10%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.campoFuente\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\">\n </td>\n <td style=\"width: 10%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.formato\">\n </td>\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [(ngModel)]=\"campoMarcadorInsertar.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\n </td>\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <div *ngIf=\"campoMarcadorInsertar.tipo =='I'\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.ancho\">\n <label>{{'ancho' | translate}}</label>\n </p-floatLabel>\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.alto\">\n <label>{{'alto' | translate}}</label>\n </p-floatLabel>\n </div>\n </td>\n <td style=\"width: 10%;\" >\n <div class=\"flex justify-content-end\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campoMarcadorInsertar)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalle = false; bloquearCampoMarcador = false\" icon=\"pi pi-times\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"campo\">\n <td style=\"width: 10%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" \n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" />\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.columna}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.campoFuente}}\n </ng-template>\n </p-cellEditor>\n </td>\n\n <td style=\"width: 10%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.formato}}\n </ng-template>\n </p-cellEditor>\n </td>\n \n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [(ngModel)]=\"campo.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.tipo | reporteFuentePipe :'listaRecursoGrafica'}}\n </ng-template>\n </p-cellEditor>\n </td>\n \n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div *ngIf=\"campo.tipo =='I'\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campo.ancho\">\n <label>{{'ancho' | translate}}</label>\n </p-floatLabel>\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campo.alto\">\n <label>{{'alto' | translate}}</label>\n </p-floatLabel>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <div *ngIf=\"campo.tipo =='I'\">\n {{'ancho' | translate}}: {{campo.ancho}} <br/>\n {{'alto' | translate}}: {{campo.alto}}\n </div> \n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%;\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorAsync()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow [disabled]=\"bloquearCampoMarcador\"\n icon=\"glyphicons glyphicons-pencil\" (click)=\"editarCampoMarcador()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow [disabled]=\"bloquearCampoMarcador\"\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcador($event,campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'soporte' | translate }} {{'archivo' | translate }}s\"\n *ngIf=\"reporteFuente.unicoArchivo == 'N'\">\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoSoporte()\" icon=\"pi pi-plus\"\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"listaSoportes\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"listaSoportes.length\"\n [paginator]=\"listaSoportes.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llaveTabla\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 45%\">{{'descripcion' | translate}}</th>\n <th style=\"width: 45%\">{{'archivo' | translate}}</th>\n <th style=\"width: 10%\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verSoporteArchivoDetalle\">\n <td style=\"width: 45%\">\n <input pInputText type=\"text\" [(ngModel)]=\"soporteIngresar.descripcion\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\">\n </td>\n <td style=\"width: 45%\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\" [mostrarX]=\"true\"\n [label]=\"soporteIngresar.archivoIndividual ? soporteIngresar.archivoIndividual: ''\" [labelarch]=\"'archivo' | translate\"\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"true\" [booleano]=\"!utilsService.validarCampoObligatorio(soporteIngresar.archivoIndividual) && clickGuardarSoporteArchivo\"\n (onSelected)=\"obtenerArchivoSoporte($event, soporteIngresar)\"></app-input-helper-seleccion-plantilla>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarSoporte(soporteIngresar)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verSoporteArchivoDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarSoporte()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-soporte let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"soporte\" style=\"width: 100%\">\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"soporte.descripcion\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{soporte.descripcion}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n {{soporte.archivoIndividual}}\n <!--<app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\" [mostrarX]=\"true\"\n [label]=\"soporte.archivoIndividual ? soporte.archivoIndividual: ''\"\n [mostrarLabelInput]=\"false\" [booleano]=\"!utilsService.validarCampoObligatorio(soporte.archivoIndividual) && clickGuardarSoporteArchivo\"\n (onSelected)=\"obtenerArchivoSoporte($event, soporte)\"></app-input-helper-seleccion-plantilla>-->\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{soporte.archivoIndividual}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarSoporte(soporte)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cancelarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\n icon=\"pi pi-trash\" (click)=\"eliminarSoporte($event, soporte)\" [disabled]=\"habilitaCampo\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n </p-tabPanel>\n </p-tabView>\n </p-tabPanel>\n <p-tabPanel header=\"{{'reporte' | translate }} {{'dinamico' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.dobleLinea\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'doblelinea' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloParametro\" size=\"25\"\n maxlength=\"100\">\n <label>{{'descripcion' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoJasper\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n \n \n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"glyphicons glyphicons-restart\" \n label=\"{{'link_generar' | translate}}\" (click)=\"generarJasper()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"pi pi-download\" *ngIf=\"existeJasper\"\n label=\"{{'link_descargar' | translate}}\" (click)=\"descargarJasper()\">\n </button>\n \n </div>\n </div>\n </div>\n \n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"bandaSeleccionada.key\">\n <button pButton pRipple (click)=\"regresarBandaSeleccionada()\" label= \"{{'listado' | translate}} {{'bandas' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaTipoBanda\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" [rows]=\"10\"\n [totalRecords]=\"listaTipoBanda.length\" [paginator]=\"listaTipoBanda.length > 10\"\n (onRowSelect)=\"verBanda($event)\" (onRowUnselect)=\"verBanda($event)\" *ngIf=\"!bandaSeleccionada.key\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'banda' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-banda>\n <tr [pSelectableRow]=\"banda\">\n <td>{{banda.value}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <p-tabView *ngIf=\"bandaSeleccionada.key && verTabBanda\">\n <p-tabPanel header=\"{{'caracteristicas' | translate}}\"\n *ngIf=\"!['detalle','summary'].includes(bandaSeleccionada.key)\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"codigo\" \n [(ngModel)]=\"reporteBanda.totales\" ></p-dropdown>\n <label>{{'total' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteBanda.titulo\" maxlength=\"200\">\n <label>{{'titulo' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCaracteristicaBanda()\">\n </button>\n </div>\n </div>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{bandaSeleccionada.value}}\" *ngIf=\"!nuevaBanda\">\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\n <div class=\"flex justify-content-end mb-1\" >\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoMarcadorDinamico()\" icon=\"pi pi-plus\"\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\" *ngIf=\"!nuevoReporteMarcadorDinamico\"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadorDinamico\" [scrollable]=\"true\"\n responsiveLayout=\"scroll\" dataKey=\"llaveTabla\" selectionMode=\"single\"\n [rows]=\"10\" [totalRecords]=\"listaMarcadorDinamico.length\"\n [paginator]=\"listaMarcadorDinamico.length > 10\" *ngIf=\"!nuevoReporteMarcadorDinamico\"\n (onRowSelect)=\"verMarcadorDinamico($event)\" (onRowUnselect)=\"verMarcadorDinamico($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'banda' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'etiqueta' | translate }}</th>\n <th>{{'formato' | translate }}</th>\n <th>{{'ancho' | translate }}</th>\n <th>{{'operacion' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-dinamico>\n <tr [pSelectableRow]=\"dinamico\">\n <td>{{dinamico.banda}}</td>\n <td>{{dinamico.banda ? dinamico.alto : ''}}</td>\n <td>{{dinamico.marcador}}</td>\n <td>{{dinamico.banda ? dinamico.descripcion : ''}}</td>\n <td>{{dinamico.banda ? dinamico.formato : ''}}</td>\n <td>{{['detalle'].includes(dinamico.banda) ? dinamico.ancho : ''}}</td>\n <td>{{dinamico.banda ? dinamico.operacion : ''}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <div *ngIf=\"nuevoReporteMarcadorDinamico\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"flex justify-content-between align-items-center mb-2\"> \n <p class=\"font-semibold mt-3\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\n <button pButton pRipple (click)=\"nuevoReporteMarcadorDinamico = false\" label= \"{{'listado' | translate}} {{bandaSeleccionada.value}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \" *ngIf=\"nuevoReporteMarcadorDinamico\"></button>\n </div>\n <form [formGroup]=\"formReporteDinamico\" class=\"p-fluid grid\">\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCampoJasperDinamico\"\n [autoDisplayFirst]=\"false\" formControlName=\"tipoCampo\"\n optionLabel=\"value\" optionValue=\"key\"></p-dropdown>\n <label>{{'tipocampo' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoDatoSintaxis\" [autoDisplayFirst]=\"false\" \n formControlName=\"tipoDato\" optionLabel=\"value\"\n optionValue=\"key\"></p-dropdown>\n <label>{{'tipodato' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText formControlName=\"alto\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\n <label>{{'orden' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" \n formControlName=\"marcador\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\n *ngIf=\"!reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\"></p-dropdown>\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\"\n *ngIf=\"reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\">\n <label>{{'columna' | translate }} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-12\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\n <label>{{'sintaxis' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\">\n <p-fieldset class=\"fieldsintitulo\" class=\"fieldsintitulo\">\n <div class=\"p-fluid grid\">\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\">\n <label class=\"font-semibold text-gray-900 text-base ml-1\">{{'resultado' | translate}}</label>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\"></div>\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <label class=\"font-semibold text-gray-900 text-base ml-1\" >{{'label' | translate}}</label>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"formato\" />\n <label>{{'formato' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"descripcion\" />\n <label>{{'titulo' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"ancho\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\n <label>{{'ancho' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' == reporteMarcadorDinamico.banda \"></div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'ancho' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"resultadoX\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'x' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"titulox\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'x' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"resultadoY\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'y' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"tituloy\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'y' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" \n formControlName=\"tipoReporte\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'alineacion' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'alineacion' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoDato == 'N' && reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaOperaciones\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"operacion\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'operacion' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n </p-fieldset>\n </div>\n </form>\n \n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{reporteMarcadorDinamico.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{reporteMarcadorDinamico.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaDinamico()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"reporteMarcadorDinamico.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarColumnaDinamico($event)\">\n </button>\n </div>\n </div>\n </div>\n </div>\n </p-tabPanel>\n \n </p-tabView>\n </p-tabPanel>\n <p-tabPanel header=\"{{'reporte' | translate }} {{'texto' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.archivoTexto\" size=\"50\"\n maxlength=\"200\">\n <label>{{'nombrearchivo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSeparadores\" [(ngModel)]=\"reporteFuente.separador\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\n [autoDisplayFirst]=\"false\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'separador' | translate }}*</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoTexto\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizarSeparador()\">\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-content-between lign-items-center mb-3\">\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorTexto()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorTexto\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorTexto\">\n <button pButton pRipple (click)=\"verNuevoMarcadorTexto = false; clickGuardarMarcadorTexto = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadoresTexto\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"listaMarcadoresTexto.length\"\n [paginator]=\"listaMarcadoresTexto.length > 10\" *ngIf=\"!verNuevoMarcadorTexto\"\n (onRowSelect)=\"verMarcadorTexto($event)\" (onRowUnselect)=\"verMarcadorTexto($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'tipo' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'formato' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marctexto>\n <tr [pSelectableRow]=\"marctexto\">\n <td>{{marctexto.tipoGrafico | reporteFuentePipe : 'listaTipoMarcadoresTexto'}}</td>\n <td>{{marctexto.nombreColumna}}</td>\n <td>{{marctexto.formato}}</td>\n <td>{{marctexto.alto}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorTexto\"> \n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoMarcadorTexto\" [autoDisplayFirst]=\"false\"\n [(ngModel)]=\"marcadorTexto.tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\"\n [(ngModel)]=\"marcadorTexto.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"></p-dropdown>\n <label>{{'columna' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.formato\" maxlength=\"50\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\">\n <label>{{marcadorTexto.tipoGrafico == 'D' ? ('formato' | translate)+'*' : ('valor' | translate)+'*' }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.ancho\" maxlength=\"22\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\">\n <label>{{'ancho' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.alto\" maxlength=\"22\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\">\n <label>{{'orden' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorTexto.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{marcadorTexto.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorTexto()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"marcadorTexto.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadoTexto($event)\">\n </button>\n </div>\n </div>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'tabla' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreTabla\" maxlength=\"4000\">\n <label>{{'nombretabla' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-8\">\n <!--BOTONES-->\n <div class=\"flex justify-content-end mt-1 mb-1\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <p-pickList [source]=\"listaTabla\" [target]=\"listaNoTabla\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\n filterBy=\"nombre\" *ngIf=\"isFuente()\" (onSourceReorder)=\"reorderTabla($event)\"\n (onMoveAllToTarget)=\"moverADesasociadoTabla($event)\" (onMoveAllToSource)=\"moverAAsociadoTabla($event)\"\n (onMoveToTarget)=\"moverADesasociadoTabla($event)\" (onMoveToSource)=\"moverAAsociadoTabla($event)\">\n <ng-template let-tabla pTemplate=\"item\">\n <div>\n <label>{{tabla.nombre}}</label>\n </div>\n </ng-template>\n </p-pickList>\n </p-tabPanel>\n <p-tabPanel header=\"{{'archivoxml' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagEncabezado\"></textarea>\n <label>{{'tagencabezado' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagCierreEncabezado\"></textarea>\n <label>{{'tagcierreencabezado' | translate }}</label>\n </p-floatLabel> \n </div>\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.estructuraRegistro\"></textarea>\n <label>{{'tagregistro' | translate }}</label>\n </p-floatLabel> \n </div>\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoXml\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n <div class=\"flex justify-content-between align-items-center mb-3\">\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorXML()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorXML\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorXML\">\n <button pButton pRipple (click)=\"verNuevoMarcadorXML = false; clickGuardarMarcadorXML = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaXML\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"listaXML.length\"\n [paginator]=\"listaXML.length > 10\" *ngIf=\"!verNuevoMarcadorXML\"\n (onRowSelect)=\"verMarcadorXML($event)\" (onRowUnselect)=\"verMarcadorXML($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'descripcion' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'marcador' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marctexto>\n <tr [pSelectableRow]=\"marctexto\">\n <td>{{marctexto.descripcion}}</td>\n <td>{{marctexto.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\n <td>{{marctexto.nombreColumna}}</td>\n <td>{{marctexto.marcador}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorXML\"> \n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.descripcion\" maxlength=\"100\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\">\n <label>{{'descripcion' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaTipoMarcadorXML\" [autoDisplayFirst]=\"false\" \n [(ngModel)]=\"marcadorXML.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MA','MR'].includes(marcadorXML.tipo)\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" >\n <label>{{'marcador' | translate}}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\n <label>{{'tabla' | translate}}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"marcadorXML.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\" ></p-dropdown>\n <label>{{'columna' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.formato\" >\n <label>{{'formato' | translate}}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.textoRegistro\" ></textarea>\n <label>{{'texto' | translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"marcadorXML.fuente\" optionLabel=\"descripcion\" optionValue=\"llave\"></p-dropdown>\n <label>{{'fuente' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.filtro\"></textarea>\n <label>{{'filtro' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.estructuraTablaXML\"></textarea>\n <label>{{'estructuratabla' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorXML.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{marcadorXML.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorXML()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"marcadorXML.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadorXML($event)\">\n </button>\n </div>\n </div>\n </div>\n <div *ngIf=\"verNuevoMarcadorXML && marcadorXML.llave != null && (marcadorXML.tipo == 'MR' || marcadorXML.tipo == 'TB')\">\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTablaXML()\" icon=\"pi pi-plus\" [disabled]=\"habilitaCampo\"\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"listaCamposMarcadorXML\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcadorXML.length\"\n [paginator]=\"listaCamposMarcadorXML.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llave\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 30%;\">{{'campo' | translate }}</th>\n <th style=\"width: 30%;\">{{'marcador' | translate }}</th>\n <th style=\"width: 30%;\">{{'formato' | translate }}</th>\n <th style=\"width: 10%\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalleXML\">\n <td style=\"width: 30%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.campoFuente\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\">\n </td>\n <td style=\"width: 30%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.marcador\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\">\n </td>\n <td style=\"width: 30%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.formato\" style=\"width: -webkit-fill-available\">\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\" >\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campoMarcadorInsertarXML)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalleXML = false; habilitaCampo = false;\" icon=\"pi pi-times\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"campo\">\n <td style=\"width: 30%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.campoFuente}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 30%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.marcador\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.marcador}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 30%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\" style=\"width: -webkit-fill-available\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.formato}}\n </ng-template>\n </p-cellEditor>\n </td>\n \n \n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorXMLAsync()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\n icon=\"pi pi-trash\" [disabled]=\"habilitaCampo\" (click)=\"eliminarCampoMarcadorXML($event,campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'columnario' | translate }}\">\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\" >\n <p-accordionTab [selected]=\"true\" >\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\n {{'columnasbasicas'|translate}}\n </ng-template>\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoColumnaBasica()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoReporteColumnario\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoReporteColumnario\">\n <button pButton pRipple (click)=\"verNuevoReporteColumnario = false; clickGuardarReporteColumnario = false;\" label= \"{{'listado' | translate}} {{'columnasbasicas' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaReporteColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"listaReporteColumnario.length\"\n [paginator]=\"listaReporteColumnario.length > 10\" *ngIf=\"!verNuevoReporteColumnario\"\n (onRowSelect)=\"verReporteColumnario($event)\" (onRowUnselect)=\"verReporteColumnario($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'nombre' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n <th>{{'operacion' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-bean>\n <tr [pSelectableRow]=\"bean\">\n <td>{{bean.nombre}}</td>\n <td>{{bean.nombreColumna}}</td>\n <td>{{bean.tipo | reporteColumnarioPipe: 'listaTipoColumna'}}</td>\n <td>{{bean.orden}}</td>\n <td>{{bean.operacion | reporteColumnarioPipe: 'listaOperacion'}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div *ngIf=\"verNuevoReporteColumnario\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.nombre\" maxlength=\"100\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\">\n <label>{{'nombre' | translate}} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaTipoColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'tipocolumna' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'columna' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"columnaBasica.tipo == 'D'\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOperacionesColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.operacion\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'operacion' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.operacionHorizontal\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'operacionhorizontal' | translate }} *</label>\n </p-floatLabel>\n </div>\n <!-- fila Operacion Vertical -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.columnaOperacionVertical\" maxlength=\"5\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\">\n <label>{{'columnaoperacion' | translate}} *</label>\n </p-floatLabel>\n </div>\n <!-- Operacion Verticial -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.operacionVertical\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'operacionvertical' | translate }} *</label>\n </p-floatLabel>\n </div>\n <!-- Orden -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrden()\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.orden\" maxlength=\"5\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\">\n <label>{{'orden' | translate}} *</label>\n </p-floatLabel>\n </div>\n <!-- Ordenamiento Filas -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoLabel() || isTipoFila()\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" [showClear]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\" \n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orderBy) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orderBy) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'ordenamiento' | translate }} *</label>\n </p-floatLabel>\n </div>\n <!-- Ordenamiento Datos de la consulta -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrdenConsulta()\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.ordenConsulta\" maxlength=\"5\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\n <label>{{'ordenconsulta' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaBasica.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{columnaBasica.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaBasica()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"columnaBasica.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarColumnaBasica($event)\">\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\">\n <p-accordionTab >\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\n {{'datosadicionales'|translate}}\n </ng-template>\n <p-fieldset class=\"fieldsintitulo\" >\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n \n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n [label]=\"reporteFuente.archivoExcelColumnario ? reporteFuente.archivoExcelColumnario: ''\"\n [extensiones]=\"'xls;xlsx;xlsm'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\n (onSelected)=\"obtenerArchivoColumnario($event)\"></app-input-helper-seleccion-plantilla>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\n translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"reporteFuente.filaInicioColumnario\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\n <label>{{'filainiciocolumnario' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" appendTo=\"body\"\n [(ngModel)]=\"reporteFuente.cifradoColumnario\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.sintaxisColumnario\"></textarea>\n <label>{{'sintaxiscolumnario' | translate }}</label>\n </p-floatLabel>\n </div>\n \n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </p-fieldset>\n <div class=\"flex justify-content-between align-items-center mb-3 mt-3\">\n <h1 class=\"text-xl\">{{'columnaadicional' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevaColumnaAdicional()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoColumnaAdicional\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoColumnaAdicional\">\n <button pButton pRipple (click)=\"verNuevoColumnaAdicional = false; clickGuardarColumnaAdicional = false;\" label= \"{{'listado' | translate}} {{'columnaadicional' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"columnasAdicionales\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"columnasAdicionales.length\"\n [paginator]=\"columnasAdicionales.length > 10\" *ngIf=\"!verNuevoColumnaAdicional\"\n (onRowSelect)=\"verDetalleAdicional($event)\" (onRowUnselect)=\"verDetalleAdicional($event)\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th>{{'nombre' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-columnaadicional>\n <tr [pSelectableRow]=\"columnaadicional\">\n <td>{{columnaadicional.nombre}}</td>\n <td>{{columnaadicional.orden}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoColumnaAdicional\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-3\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaAdicional.nombre\" maxlength=\"100\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\">\n <label>{{'alias' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"columnaAdicional.orden\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\" />\n <label>{{'orden' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaAdicional.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"></p-dropdown>\n <label>{{'ordenamiento' | translate }} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-3\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"columnaAdicional.ordenConsulta\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\" />\n <label>{{'ordenconsulta' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\" >\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"columnaAdicional.sintaxis\" maxlength=\"4000\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"></textarea>\n <label>{{'sintaxis' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaAdicional.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{columnaAdicional.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaAdicional()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"columnaAdicional.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarColumnaAdicional($event)\">\n </button>\n </div>\n </div>\n </p-fieldset>\n </p-accordionTab>\n <p-accordionTab >\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\n {{'marcadores'|translate}}\n </ng-template>\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorColumnario()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorColumnario\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorColumnario\">\n <button pButton pRipple (click)=\"verNuevoMarcadorColumnario = false; clickGuardarMarcadorColumnario = false;\" label= \"{{'listado' | translate}} {{'marcador' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"marcadoresColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"marcadoresColumnario.length\"\n [paginator]=\"marcadoresColumnario.length > 10\" *ngIf=\"!verNuevoMarcadorColumnario\"\n (onRowSelect)=\"verDetalleMarcadorColumnario($event)\" (onRowUnselect)=\"verDetalleMarcadorColumnario($event)\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th>{{'nombre' | translate }}</th>\n <th>{{'tipomarcador' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marcador>\n <tr [pSelectableRow]=\"marcador\">\n <td>{{marcador.marcador}}</td>\n <td>{{marcador.tipo | reporteColumnarioPipe: 'listaTipoMarcador'}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div *ngIf=\"verNuevoMarcadorColumnario\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"marcadorColumnario.descripcion\" maxlength=\"4000\" \n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\" />\n <label>{{'descripcion' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"marcadorColumnario.marcador\" maxlength=\"50\" \n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\" />\n <label>{{'marcador' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaTipoMarcadorColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"marcadorColumnario.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-12\" >\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"marcadorColumnario.textoRegistro\" maxlength=\"4000\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"></textarea>\n <label>{{'valor' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorColumnario.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{marcadorColumnario.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorColumnario()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"marcadorColumnario.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadorColumnario($event)\">\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </p-tabPanel>\n <p-tabPanel header=\"{{'grafica' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.codigo\" size=\"25\"\n maxlength=\"100\">\n <label>{{'codigo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloGrafico\" size=\"25\"\n maxlength=\"100\">\n <label>{{'titulo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoGrafico\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.tipoGrafico\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n <label>{{'tipo' | translate }}</label> \n </p-floatLabel>\n </div>\n </div>\n\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"isSql()\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\" \n label=\"{{'link_actualizar' | translate}}\" (click)=\"guardarGrafico()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"pi pi-eye\"\n label=\"{{'link_ver' | translate}}\" (click)=\"verGrafico()\">\n </button>\n </div>\n </div>\n </div>\n\n <p-table [value]=\"paginadorColumnas\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\n [rows]=\"20\" [totalRecords]=\"paginadorColumnas.length\" [paginator]=\"paginadorColumnas.length > 20\" >\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'columna' | translate }}</th>\n <th>{{'sintaxis' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'accion' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-bean>\n <tr [pSelectableRow]=\"bean\">\n <td>{{bean.nombre}}</td>\n <td>{{bean.sintaxis}}</td>\n <td>{{bean.tipoDato | reporteFuentePipe : 'listaTipoDato'}}</td>\n <td>\n <p-dropdown [options]=\"listaGraficoSencillo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"bean.graficoFuente\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table> \n\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\n <h1 class=\"text-xl\">Colores</h1>\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoColorCategoria()\" icon=\"pi pi-plus\"\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"paginadorColoresGrafica\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"paginadorColoresGrafica.length\"\n [paginator]=\"paginadorColoresGrafica.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llaveTabla\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 45%\">{{'categoria' | translate}}</th>\n <th style=\"width: 45%\">{{'color' | translate}}</th>\n <th style=\"width: 10%\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verColorCategoriaDetalle\">\n <td style=\"width: 45%\">\n <input pInputText type=\"text\" [(ngModel)]=\"colorCategoria.titulo\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(colorCategoria.titulo) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(colorCategoria.titulo) && clickGuardarColorCategoria\">\n </td>\n <td style=\"width: 45%\">\n <div style=\"width: 100%\">\n <p-colorPicker [(ngModel)]=\"colorCategoria.banda\" appendTo=\"body\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(colorCategoria.banda) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(colorCategoria.banda) && clickGuardarColorCategoria\" />\n </div>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarColorCategoria(colorCategoria)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verColorCategoriaDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarColorCategoria()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-color let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"color\" style=\"width: 100%\">\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"color.titulo\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(color.titulo) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(color.titulo) && clickGuardarColorCategoria\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{color.titulo}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div style=\"width: 100%\">\n <p-colorPicker [(ngModel)]=\"color.banda\" appendTo=\"body\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(color.banda) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(color.banda) && clickGuardarColorCategoria\"/>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <p-colorPicker [(ngModel)]=\"color.banda\" [disabled]=\"true\" />\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarColorCategoria(color)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cancelarEdicionColor()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\n icon=\"pi pi-trash\" (click)=\"eliminarColorCategoria($event, color)\" [disabled]=\"habilitaCampo\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div #divGrafica class=\"flex justify-content-between card mt-3\" *ngIf=\"grafica\">\n <h1 class=\"text-xl\">{{'grafica' | translate}}</h1>\n <div style=\"width: 35%\"></div>\n <div style=\"width: 30%\">\n <p-chart [type]=\"tipoGrafica\" [data]=\"grafica.datosGrafica.data\" [options]=\"grafica.datosGrafica.options\"></p-chart>\n </div>\n <div style=\"width: 35%\"></div>\n </div>\n </p-tabPanel>\n</p-tabView>", styles: [":host ::ng-deep .p-picklist-buttons.p-picklist-source-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist-buttons.p-picklist-target-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist.p-component{margin:0}:host ::ng-deep .p-picklist-item span{float:left!important}:host ::ng-deep .fieldsintitulo .p-fieldset-legend{display:none!important}:host ::ng-deep .p-picklist-list-wrapper.p-picklist-source-wrapper ul{box-shadow:inset 1px 8px 10px -10px var(--color-200)}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-200) no-repeat}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-50) no-repeat}:host ::ng-deep .p-picklist .p-picklist-header{display:none}:host ::ng-deep .p-picklist .p-picklist-filter-container span{color:var(--color-100)}:host ::ng-deep .p-picklist .p-picklist-filter-container{border-radius:10px 10px 0 0;padding:3%;border:1px solid var(--color-100);border-bottom:none;box-shadow:0 4px 7px var(--color-100);position:relative}:host ::ng-deep .p-picklist .p-picklist-list{border:1px solid var(--color-100);height:400px}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item{padding:2%;color:#000000de;background:solid 2px var(--color-50) no-repeat;margin:16px 16px -7px;border-radius:5px;border:solid 1px var(--color-100);transition:.2s;background:#fff}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h6,:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h7{color:var(--color-500);margin-bottom:2px;font-size:1rem;margin-top:0}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item span{float:left;margin-right:4px;min-height:30px;color:var(--color-400)}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover{background:var(--color-400);color:#fff;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h6,:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h7{color:#fff!important;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover span{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight{background:var(--color-500);color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h6,:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h7{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight span{color:#fff!important}:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.5%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:20px}.p-picklist-buttons{padding:2rem}.p-picklist-buttons .p-button:disabled{background-color:var(--color3)!important;color:#fff!important}.p-picklist-buttons .p-button{margin-bottom:.5rem;border-radius:100%}.p-picklist-buttons .p-button.p-button-icon-only{padding:.4rem .5rem;width:40px;height:40px;max-width:initial;max-height:initial}.p-picklist-buttons .p-button.p-button-icon-only span{font-size:18px}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only{border-radius:100%;width:3rem!important;background:var(--color-500)}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only span{font-size:1.2rem;background:var(--color--300);color:#fff}:host ::ng-deep .p-picklist-buttons .p-button:disabled{background:var(--color-300)!important}@media (max-width: 1440px){:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.2%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:15px}}:host ::ng-deep .p-button{width:auto}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i17.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i17.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "component", type: i17.CellEditor, selector: "p-cellEditor" }, { kind: "directive", type: i17.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i17.InitEditableRow, selector: "[pInitEditableRow]" }, { kind: "directive", type: i17.SaveEditableRow, selector: "[pSaveEditableRow]" }, { kind: "directive", type: i17.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: TemplateTablaVaciaComponent, selector: "app-template-tabla-vacia" }, { kind: "ngmodule", type: TabViewModule }, { kind: "component", type: i18.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i18.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: InputHelperSeleccionPlantillaComponent, selector: "app-input-helper-seleccion-plantilla", inputs: ["value", "label", "labelrar", "labelarch", "extensiones", "readonly", "propiedad", "anexoPropiedad", "showDialog", "propiedadDeSistema", "mostraroblicargo", "mostrarX", "booleano", "mostrarLabelInput"], outputs: ["onSelected"] }, { kind: "pipe", type: ReporteColumnarioPipe, name: "reporteColumnarioPipe" }, { kind: "pipe", type: ReporteFuentePipe, name: "reporteFuentePipe" }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i19.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i20.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i21.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: PickListModule }, { kind: "component", type: i22.PickList, selector: "p-pickList", inputs: ["source", "target", "sourceHeader", "tabindex", "rightButtonAriaLabel", "leftButtonAriaLabel", "allRightButtonAriaLabel", "allLeftButtonAriaLabel", "upButtonAriaLabel", "downButtonAriaLabel", "topButtonAriaLabel", "bottomButtonAriaLabel", "targetHeader", "responsive", "filterBy", "filterLocale", "trackBy", "sourceTrackBy", "targetTrackBy", "showSourceFilter", "showTargetFilter", "metaKeySelection", "dragdrop", "style", "styleClass", "sourceStyle", "targetStyle", "showSourceControls", "showTargetControls", "sourceFilterPlaceholder", "targetFilterPlaceholder", "disabled", "ariaSourceFilterLabel", "ariaTargetFilterLabel", "filterMatchMode", "stripedRows", "keepSelection", "breakpoint"], outputs: ["onMoveToSource", "onMoveAllToSource", "onMoveAllToTarget", "onMoveToTarget", "onSourceReorder", "onTargetReorder", "onSourceSelect", "onTargetSelect", "onSourceFilter", "onTargetFilter", "onFocus", "onBlur"] }, { kind: "ngmodule", type: FieldsetModule }, { kind: "component", type: i23.Fieldset, selector: "p-fieldset", inputs: ["legend", "toggleable", "collapsed", "style", "styleClass", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "ngmodule", type: AccordionModule }, { kind: "component", type: i24.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i24.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i25.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: InputTextareaModule }, { kind: "directive", type: i26.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "ngmodule", type: FloatLabelModule }, { kind: "component", type: i27.FloatLabel, selector: "p-floatLabel" }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i28.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "ngmodule", type: ChartModule }, { kind: "component", type: i29.UIChart, selector: "p-chart", inputs: ["type", "plugins", "width", "height", "responsive", "ariaLabel", "ariaLabelledBy", "data", "options"], outputs: ["onDataSelect"] }, { kind: "ngmodule", type: ColorPickerModule }, { kind: "component", type: i30.ColorPicker, selector: "p-colorPicker", inputs: ["style", "styleClass", "inline", "format", "appendTo", "disabled", "tabindex", "inputId", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "autofocus"], outputs: ["onChange", "onShow", "onHide"] }] });
1577
1596
  }
1578
1597
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DetalleTipoReporteComponent, decorators: [{
1579
1598
  type: Component,
1580
- args: [{ selector: 'detalle-tipo-reporte', imports: [TranslateModule, TableModule, TemplateTablaVaciaComponent, TabViewModule, InputHelperSeleccionPlantillaComponent, ReporteColumnarioPipe, ReporteFuentePipe, DropdownModule, FormsModule, ReactiveFormsModule, CommonModule, ButtonModule, PickListModule, FieldsetModule, AccordionModule, InputTextModule, InputTextareaModule, FloatLabelModule, InputNumberModule, FieldsetModule, ChartModule, ColorPickerModule], standalone: true, providers: [MessageService], template: "<p-tabView (onChange)=\"cambiarTab($event)\">\n <p-tabPanel header=\"{{'excel' | translate }}\" [selected]=\"true\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <p class=\"font-semibold\">{{'debe' | translate}} {{'indicar' | translate}} {{'plantilla' | translate}} {{'y' | translate}}\n {{'hoja' | translate}} {{'para' | translate}} {{'que' | translate}} {{'esta' | translate}}\n {{'opcion' | translate}} {{'se' | translate}} {{'active' | translate}}\n </p>\n <div class=\"p-fluid p-formgrid grid\">\n <div class=\"field col-12 md:col-4\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n [label]=\"reporteFuente.archivoTodo ? reporteFuente.archivoTodo: ''\"\n [extensiones]=\"'xls;xlsx'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\n (onSelected)=\"obtenerArchivo($event)\"></app-input-helper-seleccion-plantilla>\n\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\n translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoExcel\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\n icon=\"glyphicons glyphicons-refresh\" label=\"{{'link_actualizar' | translate}}\"\n (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n\n <p-pickList [source]=\"listaExcel\" [target]=\"listaNoExcel\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\n filterBy=\"sintaxis\" (onSourceReorder)=\"moverAAsociado($event)\"\n (onMoveAllToTarget)=\"moverADesasociado($event)\" (onMoveAllToSource)=\"moverAAsociado($event)\"\n (onMoveToTarget)=\"moverADesasociado($event)\" (onMoveToSource)=\"moverAAsociado($event)\">\n <ng-template let-excel pTemplate=\"item\">\n <div>\n <label>{{excel.nombre}}</label>\n </div>\n </ng-template>\n </p-pickList>\n\n <div class=\"mt-4\">\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorExcel()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorExcel\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorExcel\">\n <button pButton pRipple (click)=\"verNuevoMarcadorExcel = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadorExcel\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcadorExcel\" [rows]=\"10\"\n [totalRecords]=\"listaMarcadorExcel.length\" [paginator]=\"listaMarcadorExcel.length > 10\"\n (onRowSelect)=\"verDetalleMarcadorExcel($event)\" (onRowUnselect)=\"verDetalleMarcadorExcel($event)\" *ngIf=\"!verNuevoMarcadorExcel\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'descripcion' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marcador>\n <tr [pSelectableRow]=\"marcador\">\n <td>{{marcador.descripcion}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorExcel\">\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-book\"></i>{{'detalle' | translate}}</h5>\n <div class=\"Detallereporte mt-4 \">\n <form [formGroup]=\"formMarcadorExcel\" >\n <div class=\"col-md-12 p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\" maxlength=\"4000\">\n <label>{{'descripcion' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\" maxlength=\"4000\">\n <label>{{'marcador' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown\n [options]=\"[{label: 'Imagen Fija', value: 'IF'}, {label: 'Marcador', value: 'MA'}]\"\n [autoDisplayFirst]=\"false\" formControlName=\"tipo\" optionLabel=\"label\"\n optionValue=\"value\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\" [hidden]=\"esImagenFija\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\n <label>{{'valor' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\n <p-floatLabel>\n <p-dropdown\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\n [autoDisplayFirst]=\"false\" formControlName=\"origen\" optionLabel=\"label\"\n optionValue=\"value\"></p-dropdown>\n <label>{{'origen' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n formControlName=\"textoRegistro\"\n [label]=\"reporteMarcadorExcel.textoRegistro ? reporteMarcadorExcel.textoRegistro: ''\"\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcadorExcel($event)\"\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"('recursos' | translate)\" [labelarch]=\"'recurso' | translate\" [mostrarX]=\"true\"\n [mostraroblicargo]=\"true\"\n [booleano]=\"!utilsService.validarCampoObligatorio(reporteMarcadorExcel.textoRegistro) && clickGuardarMarcadorExcel\"\n [anexoPropiedad]=\"reporteMarcadorExcel.origen =='C' ? llaveEmpresa: ''\"\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\n </div>\n </div>\n </form>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"verNuevoMarcadorExcel\">\n <button pButton pRipple class=\"ml-2 p-button-raised\" icon=\"glyphicons {{reporteMarcadorExcel.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{reporteMarcadorExcel.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorExcel()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"reporteMarcadorExcel.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadorExcel($event)\">\n </button>\n </div>\n </div>\n </div>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'plantilla' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.unicoArchivo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'soporte' | translate }} {{'unico' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.descargarFuente\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'descargardoc' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.generarPin\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'generarpin' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [(ngModel)]=\"reporteFuente.campoAgrupacionPlanilla\" \n [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'agruparpor' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreAgrupacionPlanilla\" size=\"25\"\n maxlength=\"100\">\n <label>{{'nombrearchivoagrupacion' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoPlanilla\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteFuente.unicoArchivo == 'N'\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n [label]=\"reporteFuente.archivoIndividual ? reporteFuente.archivoIndividual: ''\"\n [labelrar]=\"'archivo' | translate\" [labelarch]=\"'archivo' | translate\" [mostraroblicargo]=\"true\"\n (onSelected)=\"obtenerArchivoPlanilla($event)\"></app-input-helper-seleccion-plantilla>\n </div>\n\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n\n <p-tabView >\n <p-tabPanel header=\"{{'marcadores' | translate }}\" [selected]=\"true\">\n \n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton pRipple class=\"p-button-secondary font-semibold mb-2\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcador()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcador\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcador\">\n <button pButton pRipple (click)=\"verNuevoMarcador = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadores\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcador\"\n [rows]=\"10\" [totalRecords]=\"listaMarcadores.length\"\n [paginator]=\"listaMarcadores.length > 10\" *ngIf=\"!verNuevoMarcador\"\n (onRowSelect)=\"verDetalleMarcador($event)\" (onRowUnselect)=\"verDetalleMarcador($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'descripcion' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'marcador' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marcador>\n <tr [pSelectableRow]=\"marcador\">\n <td>{{marcador.descripcion}}</td>\n <td>{{marcador.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\n <td>{{marcador.tipo == 'IF' ? marcador.textoRegistro : marcador.nombreColumna}}</td>\n <td>{{marcador.marcador}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <div class=\"card col-md-12\" *ngIf=\"verNuevoMarcador\">\n <div class=\"Detallereporte mt-2\">\n <form [formGroup]=\"formMarcador\">\n <p class=\"font-semibold\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\"\n maxlength=\"4000\">\n <label>{{'descripcion' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoMarcador\" [autoDisplayFirst]=\"false\" \n formControlName=\"tipo\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!(['MA','IM','MR','IF','QR','BC','G1'].includes(reporteMarcador.tipo))\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\">\n <label>{{'marcador' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"tabla\" size=\"25\">\n <label>{{'tabla' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'IF'\">\n <p-floatLabel>\n <p-dropdown\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" formControlName=\"origen\" optionLabel=\"label\"\n optionValue=\"value\"></p-dropdown>\n <label>{{'origen' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"reporteMarcador.tipo != 'IF' || !reporteMarcador.origen\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n formControlName=\"textoRegistro\"\n [label]=\"reporteMarcador.textoRegistro ? reporteMarcador.textoRegistro: ''\"\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcador($event)\"\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"'recursos' | translate\"\n [anexoPropiedad]=\"reporteMarcador.origen =='C' ? llaveEmpresa: ''\"\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['MA','IM','QR','BC','G1'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" formControlName=\"reporteColumna\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\n optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'columna' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MA'\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"formato\" size=\"25\">\n <label>{{'formato' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-inputNumber formControlName=\"ancho\" [maxlength]=\"5\"> </p-inputNumber>\n <label>{{'ancho' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-inputNumber formControlName=\"alto\" [maxlength]=\"5\"> </p-inputNumber>\n <label>{{'alto' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo1\"></textarea>\n <label>{{'grupo1' | translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo2\"></textarea>\n <label>{{'grupo2' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo3\"></textarea>\n <label>{{'grupo3' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"finalGrupo\"></textarea>\n <label>{{'finalgrupo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\n <label>{{'texto' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['MR','TB'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" formControlName=\"tieneSql\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'sql' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoGrafico_JFC\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n <label>{{'grafica' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\"\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['S'].includes(reporteMarcador.tieneSql)))\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"query\"></textarea>\n <label>{{'consulta' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"fuente\" optionLabel=\"descripcion\"\n optionValue=\"llave\"></p-dropdown>\n <label>{{'fuente' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"marcadorGrafico\" size=\"25\">\n <label>{{'marcadorgrafica' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"titulox\" size=\"25\">\n <label>{{'titulo' | translate }} X</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"tituloy\" size=\"25\">\n <label>{{'titulo' | translate }} Y</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"banda\" size=\"25\">\n <label>{{'colordinamico' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" size=\"25\">\n <label>{{'numerocategorias' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\"\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\n <label>{{'filtro' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n </form>\n\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\n icon=\"glyphicons {{reporteMarcador.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save' }}\" label=\"{{reporteMarcador.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\"\n (click)=\"guardarMarcador()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"reporteMarcador.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcador($event)\">\n </button>\n </div>\n </div>\n </div>\n <div *ngIf=\"verNuevoMarcador && reporteMarcador.llave != null && (reporteMarcador.tipo == 'MR' || reporteMarcador.tipo == 'TB')\">\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTabla()\" icon=\"pi pi-plus\" [disabled]=\"bloquearCampoMarcador\"\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"listaCamposMarcador\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcador.length\" [scrollable]=\"true\"\n [paginator]=\"listaCamposMarcador.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llave\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 10%;\">{{'columna' | translate }}</th>\n <th style=\"width: 10%;\">{{'campo' | translate }}</th>\n <th style=\"width: 10%;\">{{'formato' | translate }}</th>\n <th style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">{{'tipo' | translate }}</th>\n <th style=\"width: 10%;\"*ngIf=\"reporteMarcador.tipo == 'TB'\">{{'medidas' | translate }}</th>\n <th style=\"width: 10%;\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalle\">\n <td style=\"width: 10%;\">\n <input pInputText [(ngModel)]=\"campoMarcadorInsertar.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '');\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\" />\n </td>\n <td style=\"width: 10%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.campoFuente\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\">\n </td>\n <td style=\"width: 10%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.formato\">\n </td>\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [(ngModel)]=\"campoMarcadorInsertar.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\n </td>\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <div *ngIf=\"campoMarcadorInsertar.tipo =='I'\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.ancho\">\n <label>{{'ancho' | translate}}</label>\n </p-floatLabel>\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.alto\">\n <label>{{'alto' | translate}}</label>\n </p-floatLabel>\n </div>\n </td>\n <td style=\"width: 10%;\" >\n <div class=\"flex justify-content-end\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campoMarcadorInsertar)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalle = false; bloquearCampoMarcador = false\" icon=\"pi pi-times\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"campo\">\n <td style=\"width: 10%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" \n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" />\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.columna}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.campoFuente}}\n </ng-template>\n </p-cellEditor>\n </td>\n\n <td style=\"width: 10%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.formato}}\n </ng-template>\n </p-cellEditor>\n </td>\n \n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [(ngModel)]=\"campo.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.tipo | reporteFuentePipe :'listaRecursoGrafica'}}\n </ng-template>\n </p-cellEditor>\n </td>\n \n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div *ngIf=\"campo.tipo =='I'\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campo.ancho\">\n <label>{{'ancho' | translate}}</label>\n </p-floatLabel>\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campo.alto\">\n <label>{{'alto' | translate}}</label>\n </p-floatLabel>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <div *ngIf=\"campo.tipo =='I'\">\n {{'ancho' | translate}}: {{campo.ancho}} <br/>\n {{'alto' | translate}}: {{campo.alto}}\n </div> \n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%;\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorAsync()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow [disabled]=\"bloquearCampoMarcador\"\n icon=\"glyphicons glyphicons-pencil\" (click)=\"editarCampoMarcador()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow [disabled]=\"bloquearCampoMarcador\"\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcador($event,campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'soporte' | translate }} {{'archivo' | translate }}s\"\n *ngIf=\"reporteFuente.unicoArchivo == 'N'\">\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoSoporte()\" icon=\"pi pi-plus\"\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"listaSoportes\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"listaSoportes.length\"\n [paginator]=\"listaSoportes.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llaveTabla\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 45%\">{{'descripcion' | translate}}</th>\n <th style=\"width: 45%\">{{'archivo' | translate}}</th>\n <th style=\"width: 10%\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verSoporteArchivoDetalle\">\n <td style=\"width: 45%\">\n <input pInputText type=\"text\" [(ngModel)]=\"soporteIngresar.descripcion\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\">\n </td>\n <td style=\"width: 45%\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\" [mostrarX]=\"true\"\n [label]=\"soporteIngresar.archivoIndividual ? soporteIngresar.archivoIndividual: ''\" [labelarch]=\"'archivo' | translate\"\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"true\" [booleano]=\"!utilsService.validarCampoObligatorio(soporteIngresar.archivoIndividual) && clickGuardarSoporteArchivo\"\n (onSelected)=\"obtenerArchivoSoporte($event, soporteIngresar)\"></app-input-helper-seleccion-plantilla>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarSoporte(soporteIngresar)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verSoporteArchivoDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarSoporte()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-soporte let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"soporte\" style=\"width: 100%\">\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"soporte.descripcion\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{soporte.descripcion}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n {{soporte.archivoIndividual}}\n <!--<app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\" [mostrarX]=\"true\"\n [label]=\"soporte.archivoIndividual ? soporte.archivoIndividual: ''\"\n [mostrarLabelInput]=\"false\" [booleano]=\"!utilsService.validarCampoObligatorio(soporte.archivoIndividual) && clickGuardarSoporteArchivo\"\n (onSelected)=\"obtenerArchivoSoporte($event, soporte)\"></app-input-helper-seleccion-plantilla>-->\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{soporte.archivoIndividual}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarSoporte(soporte)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cancelarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\n icon=\"pi pi-trash\" (click)=\"eliminarSoporte($event, soporte)\" [disabled]=\"habilitaCampo\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n </p-tabPanel>\n </p-tabView>\n </p-tabPanel>\n <p-tabPanel header=\"{{'reporte' | translate }} {{'dinamico' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.dobleLinea\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'doblelinea' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloParametro\" size=\"25\"\n maxlength=\"100\">\n <label>{{'descripcion' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoJasper\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n \n \n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"glyphicons glyphicons-restart\" \n label=\"{{'link_generar' | translate}}\" (click)=\"generarJasper()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"pi pi-download\" *ngIf=\"existeJasper\"\n label=\"{{'link_descargar' | translate}}\" (click)=\"descargarJasper()\">\n </button>\n \n </div>\n </div>\n </div>\n \n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"bandaSeleccionada.key\">\n <button pButton pRipple (click)=\"regresarBandaSeleccionada()\" label= \"{{'listado' | translate}} {{'bandas' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaTipoBanda\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" [rows]=\"10\"\n [totalRecords]=\"listaTipoBanda.length\" [paginator]=\"listaTipoBanda.length > 10\"\n (onRowSelect)=\"verBanda($event)\" (onRowUnselect)=\"verBanda($event)\" *ngIf=\"!bandaSeleccionada.key\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'banda' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-banda>\n <tr [pSelectableRow]=\"banda\">\n <td>{{banda.value}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <p-tabView *ngIf=\"bandaSeleccionada.key && verTabBanda\">\n <p-tabPanel header=\"{{'caracteristicas' | translate}}\"\n *ngIf=\"!['detalle','summary'].includes(bandaSeleccionada.key)\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"codigo\" \n [(ngModel)]=\"reporteBanda.totales\" ></p-dropdown>\n <label>{{'total' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteBanda.titulo\" maxlength=\"200\">\n <label>{{'titulo' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCaracteristicaBanda()\">\n </button>\n </div>\n </div>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{bandaSeleccionada.value}}\" *ngIf=\"!nuevaBanda\">\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\n <div class=\"flex justify-content-end mb-1\" >\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoMarcadorDinamico()\" icon=\"pi pi-plus\"\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\" *ngIf=\"!nuevoReporteMarcadorDinamico\"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadorDinamico\" [scrollable]=\"true\"\n responsiveLayout=\"scroll\" dataKey=\"llaveTabla\" selectionMode=\"single\"\n [rows]=\"10\" [totalRecords]=\"listaMarcadorDinamico.length\"\n [paginator]=\"listaMarcadorDinamico.length > 10\" *ngIf=\"!nuevoReporteMarcadorDinamico\"\n (onRowSelect)=\"verMarcadorDinamico($event)\" (onRowUnselect)=\"verMarcadorDinamico($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'banda' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'etiqueta' | translate }}</th>\n <th>{{'formato' | translate }}</th>\n <th>{{'ancho' | translate }}</th>\n <th>{{'operacion' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-dinamico>\n <tr [pSelectableRow]=\"dinamico\">\n <td>{{dinamico.banda}}</td>\n <td>{{dinamico.banda ? dinamico.alto : ''}}</td>\n <td>{{dinamico.marcador}}</td>\n <td>{{dinamico.banda ? dinamico.descripcion : ''}}</td>\n <td>{{dinamico.banda ? dinamico.formato : ''}}</td>\n <td>{{['detalle'].includes(dinamico.banda) ? dinamico.ancho : ''}}</td>\n <td>{{dinamico.banda ? dinamico.operacion : ''}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <div *ngIf=\"nuevoReporteMarcadorDinamico\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"flex justify-content-between align-items-center mb-2\"> \n <p class=\"font-semibold mt-3\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\n <button pButton pRipple (click)=\"nuevoReporteMarcadorDinamico = false\" label= \"{{'listado' | translate}} {{bandaSeleccionada.value}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \" *ngIf=\"nuevoReporteMarcadorDinamico\"></button>\n </div>\n <form [formGroup]=\"formReporteDinamico\" class=\"p-fluid grid\">\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCampoJasperDinamico\"\n [autoDisplayFirst]=\"false\" formControlName=\"tipoCampo\"\n optionLabel=\"value\" optionValue=\"key\"></p-dropdown>\n <label>{{'tipocampo' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoDatoSintaxis\" [autoDisplayFirst]=\"false\" \n formControlName=\"tipoDato\" optionLabel=\"value\"\n optionValue=\"key\"></p-dropdown>\n <label>{{'tipodato' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText formControlName=\"alto\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\n <label>{{'orden' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" \n formControlName=\"marcador\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\n *ngIf=\"!reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\"></p-dropdown>\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\"\n *ngIf=\"reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\">\n <label>{{'columna' | translate }} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-12\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\n <label>{{'sintaxis' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\">\n <p-fieldset class=\"fieldsintitulo\" class=\"fieldsintitulo\">\n <div class=\"p-fluid grid\">\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\">\n <label class=\"font-semibold text-gray-900 text-base ml-1\">{{'resultado' | translate}}</label>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\"></div>\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <label class=\"font-semibold text-gray-900 text-base ml-1\" >{{'label' | translate}}</label>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"formato\" />\n <label>{{'formato' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"descripcion\" />\n <label>{{'titulo' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"ancho\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\n <label>{{'ancho' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' == reporteMarcadorDinamico.banda \"></div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'ancho' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"resultadoX\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'x' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"titulox\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'x' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"resultadoY\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'y' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"tituloy\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'y' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" \n formControlName=\"tipoReporte\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'alineacion' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'alineacion' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoDato == 'N' && reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaOperaciones\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"operacion\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'operacion' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n </p-fieldset>\n </div>\n </form>\n \n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{reporteMarcadorDinamico.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{reporteMarcadorDinamico.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaDinamico()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"reporteMarcadorDinamico.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarColumnaDinamico($event)\">\n </button>\n </div>\n </div>\n </div>\n </div>\n </p-tabPanel>\n \n </p-tabView>\n </p-tabPanel>\n <p-tabPanel header=\"{{'reporte' | translate }} {{'texto' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.archivoTexto\" size=\"50\"\n maxlength=\"200\">\n <label>{{'nombrearchivo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSeparadores\" [(ngModel)]=\"reporteFuente.separador\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\n [autoDisplayFirst]=\"false\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'separador' | translate }}*</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoTexto\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizarSeparador()\">\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-content-between lign-items-center mb-3\">\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorTexto()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorTexto\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorTexto\">\n <button pButton pRipple (click)=\"verNuevoMarcadorTexto = false; clickGuardarMarcadorTexto = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadoresTexto\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"listaMarcadoresTexto.length\"\n [paginator]=\"listaMarcadoresTexto.length > 10\" *ngIf=\"!verNuevoMarcadorTexto\"\n (onRowSelect)=\"verMarcadorTexto($event)\" (onRowUnselect)=\"verMarcadorTexto($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'tipo' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'formato' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marctexto>\n <tr [pSelectableRow]=\"marctexto\">\n <td>{{marctexto.tipoGrafico | reporteFuentePipe : 'listaTipoMarcadoresTexto'}}</td>\n <td>{{marctexto.nombreColumna}}</td>\n <td>{{marctexto.formato}}</td>\n <td>{{marctexto.alto}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorTexto\"> \n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoMarcadorTexto\" [autoDisplayFirst]=\"false\"\n [(ngModel)]=\"marcadorTexto.tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\"\n [(ngModel)]=\"marcadorTexto.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"></p-dropdown>\n <label>{{'columna' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.formato\" maxlength=\"50\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\">\n <label>{{marcadorTexto.tipoGrafico == 'D' ? ('formato' | translate)+'*' : ('valor' | translate)+'*' }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.ancho\" maxlength=\"22\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\">\n <label>{{'ancho' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.alto\" maxlength=\"22\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\">\n <label>{{'orden' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorTexto.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{marcadorTexto.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorTexto()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"marcadorTexto.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadoTexto($event)\">\n </button>\n </div>\n </div>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'tabla' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreTabla\" maxlength=\"4000\">\n <label>{{'nombretabla' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-8\">\n <!--BOTONES-->\n <div class=\"flex justify-content-end mt-1 mb-1\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <p-pickList [source]=\"listaTabla\" [target]=\"listaNoTabla\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\n filterBy=\"nombre\" *ngIf=\"isFuente()\" (onSourceReorder)=\"reorderTabla($event)\"\n (onMoveAllToTarget)=\"moverADesasociadoTabla($event)\" (onMoveAllToSource)=\"moverAAsociadoTabla($event)\"\n (onMoveToTarget)=\"moverADesasociadoTabla($event)\" (onMoveToSource)=\"moverAAsociadoTabla($event)\">\n <ng-template let-tabla pTemplate=\"item\">\n <div>\n <label>{{tabla.nombre}}</label>\n </div>\n </ng-template>\n </p-pickList>\n </p-tabPanel>\n <p-tabPanel header=\"{{'archivoxml' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagEncabezado\"></textarea>\n <label>{{'tagencabezado' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagCierreEncabezado\"></textarea>\n <label>{{'tagcierreencabezado' | translate }}</label>\n </p-floatLabel> \n </div>\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.estructuraRegistro\"></textarea>\n <label>{{'tagregistro' | translate }}</label>\n </p-floatLabel> \n </div>\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoXml\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n <div class=\"flex justify-content-between align-items-center mb-3\">\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorXML()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorXML\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorXML\">\n <button pButton pRipple (click)=\"verNuevoMarcadorXML = false; clickGuardarMarcadorXML = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaXML\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"listaXML.length\"\n [paginator]=\"listaXML.length > 10\" *ngIf=\"!verNuevoMarcadorXML\"\n (onRowSelect)=\"verMarcadorXML($event)\" (onRowUnselect)=\"verMarcadorXML($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'descripcion' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'marcador' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marctexto>\n <tr [pSelectableRow]=\"marctexto\">\n <td>{{marctexto.descripcion}}</td>\n <td>{{marctexto.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\n <td>{{marctexto.nombreColumna}}</td>\n <td>{{marctexto.marcador}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorXML\"> \n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.descripcion\" maxlength=\"100\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\">\n <label>{{'descripcion' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaTipoMarcadorXML\" [autoDisplayFirst]=\"false\" \n [(ngModel)]=\"marcadorXML.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MA','MR'].includes(marcadorXML.tipo)\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" >\n <label>{{'marcador' | translate}}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\n <label>{{'tabla' | translate}}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"marcadorXML.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\" ></p-dropdown>\n <label>{{'columna' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.formato\" >\n <label>{{'formato' | translate}}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.textoRegistro\" ></textarea>\n <label>{{'texto' | translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"marcadorXML.fuente\" optionLabel=\"descripcion\" optionValue=\"llave\"></p-dropdown>\n <label>{{'fuente' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.filtro\"></textarea>\n <label>{{'filtro' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.estructuraTablaXML\"></textarea>\n <label>{{'estructuratabla' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorXML.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{marcadorXML.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorXML()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"marcadorXML.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadorXML($event)\">\n </button>\n </div>\n </div>\n </div>\n <div *ngIf=\"verNuevoMarcadorXML && marcadorXML.llave != null && (marcadorXML.tipo == 'MR' || marcadorXML.tipo == 'TB')\">\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTablaXML()\" icon=\"pi pi-plus\" [disabled]=\"habilitaCampo\"\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"listaCamposMarcadorXML\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcadorXML.length\"\n [paginator]=\"listaCamposMarcadorXML.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llave\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 30%;\">{{'campo' | translate }}</th>\n <th style=\"width: 30%;\">{{'marcador' | translate }}</th>\n <th style=\"width: 30%;\">{{'formato' | translate }}</th>\n <th style=\"width: 10%\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalleXML\">\n <td style=\"width: 30%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.campoFuente\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\">\n </td>\n <td style=\"width: 30%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.marcador\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\">\n </td>\n <td style=\"width: 30%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.formato\" style=\"width: -webkit-fill-available\">\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\" >\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campoMarcadorInsertarXML)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalleXML = false; habilitaCampo = false;\" icon=\"pi pi-times\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"campo\">\n <td style=\"width: 30%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.campoFuente}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 30%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.marcador\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.marcador}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 30%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\" style=\"width: -webkit-fill-available\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.formato}}\n </ng-template>\n </p-cellEditor>\n </td>\n \n \n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorXMLAsync()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\n icon=\"pi pi-trash\" [disabled]=\"habilitaCampo\" (click)=\"eliminarCampoMarcadorXML($event,campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'columnario' | translate }}\">\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\" >\n <p-accordionTab [selected]=\"true\" >\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\n {{'columnasbasicas'|translate}}\n </ng-template>\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoColumnaBasica()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoReporteColumnario\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoReporteColumnario\">\n <button pButton pRipple (click)=\"verNuevoReporteColumnario = false; clickGuardarReporteColumnario = false;\" label= \"{{'listado' | translate}} {{'columnasbasicas' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaReporteColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"listaReporteColumnario.length\"\n [paginator]=\"listaReporteColumnario.length > 10\" *ngIf=\"!verNuevoReporteColumnario\"\n (onRowSelect)=\"verReporteColumnario($event)\" (onRowUnselect)=\"verReporteColumnario($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'nombre' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n <th>{{'operacion' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-bean>\n <tr [pSelectableRow]=\"bean\">\n <td>{{bean.nombre}}</td>\n <td>{{bean.nombreColumna}}</td>\n <td>{{bean.tipo | reporteColumnarioPipe: 'listaTipoColumna'}}</td>\n <td>{{bean.orden}}</td>\n <td>{{bean.operacion | reporteColumnarioPipe: 'listaOperacion'}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div *ngIf=\"verNuevoReporteColumnario\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.nombre\" maxlength=\"100\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\">\n <label>{{'nombre' | translate}} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaTipoColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'tipocolumna' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'columna' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"columnaBasica.tipo == 'D'\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOperacionesColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.operacion\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'operacion' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.operacionHorizontal\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'operacionhorizontal' | translate }} *</label>\n </p-floatLabel>\n </div>\n <!-- fila Operacion Vertical -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.columnaOperacionVertical\" maxlength=\"5\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\">\n <label>{{'columnaoperacion' | translate}} *</label>\n </p-floatLabel>\n </div>\n <!-- Operacion Verticial -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.operacionVertical\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'operacionvertical' | translate }} *</label>\n </p-floatLabel>\n </div>\n <!-- Orden -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrden()\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.orden\" maxlength=\"5\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\">\n <label>{{'orden' | translate}} *</label>\n </p-floatLabel>\n </div>\n <!-- Ordenamiento Filas -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoLabel() || isTipoFila()\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" [showClear]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\" \n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orderBy) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orderBy) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'ordenamiento' | translate }} *</label>\n </p-floatLabel>\n </div>\n <!-- Ordenamiento Datos de la consulta -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrdenConsulta()\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.ordenConsulta\" maxlength=\"5\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\n <label>{{'ordenconsulta' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaBasica.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{columnaBasica.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaBasica()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"columnaBasica.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarColumnaBasica($event)\">\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\">\n <p-accordionTab >\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\n {{'datosadicionales'|translate}}\n </ng-template>\n <p-fieldset class=\"fieldsintitulo\" >\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n \n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n [label]=\"reporteFuente.archivoExcelColumnario ? reporteFuente.archivoExcelColumnario: ''\"\n [extensiones]=\"'xls;xlsx;xlsm'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\n (onSelected)=\"obtenerArchivoColumnario($event)\"></app-input-helper-seleccion-plantilla>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\n translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"reporteFuente.filaInicioColumnario\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\n <label>{{'filainiciocolumnario' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" appendTo=\"body\"\n [(ngModel)]=\"reporteFuente.cifradoColumnario\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.sintaxisColumnario\"></textarea>\n <label>{{'sintaxiscolumnario' | translate }}</label>\n </p-floatLabel>\n </div>\n \n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </p-fieldset>\n <div class=\"flex justify-content-between align-items-center mb-3 mt-3\">\n <h1 class=\"text-xl\">{{'columnaadicional' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevaColumnaAdicional()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoColumnaAdicional\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoColumnaAdicional\">\n <button pButton pRipple (click)=\"verNuevoColumnaAdicional = false; clickGuardarColumnaAdicional = false;\" label= \"{{'listado' | translate}} {{'columnaadicional' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"columnasAdicionales\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"columnasAdicionales.length\"\n [paginator]=\"columnasAdicionales.length > 10\" *ngIf=\"!verNuevoColumnaAdicional\"\n (onRowSelect)=\"verDetalleAdicional($event)\" (onRowUnselect)=\"verDetalleAdicional($event)\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th>{{'nombre' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-columnaadicional>\n <tr [pSelectableRow]=\"columnaadicional\">\n <td>{{columnaadicional.nombre}}</td>\n <td>{{columnaadicional.orden}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoColumnaAdicional\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-3\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaAdicional.nombre\" maxlength=\"100\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\">\n <label>{{'alias' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"columnaAdicional.orden\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\" />\n <label>{{'orden' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaAdicional.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"></p-dropdown>\n <label>{{'ordenamiento' | translate }} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-3\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"columnaAdicional.ordenConsulta\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\" />\n <label>{{'ordenconsulta' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\" >\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"columnaAdicional.sintaxis\" maxlength=\"4000\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"></textarea>\n <label>{{'sintaxis' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaAdicional.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{columnaAdicional.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaAdicional()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"columnaAdicional.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarColumnaAdicional($event)\">\n </button>\n </div>\n </div>\n </p-fieldset>\n </p-accordionTab>\n <p-accordionTab >\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\n {{'marcadores'|translate}}\n </ng-template>\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorColumnario()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorColumnario\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorColumnario\">\n <button pButton pRipple (click)=\"verNuevoMarcadorColumnario = false; clickGuardarMarcadorColumnario = false;\" label= \"{{'listado' | translate}} {{'marcador' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"marcadoresColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"marcadoresColumnario.length\"\n [paginator]=\"marcadoresColumnario.length > 10\" *ngIf=\"!verNuevoMarcadorColumnario\"\n (onRowSelect)=\"verDetalleMarcadorColumnario($event)\" (onRowUnselect)=\"verDetalleMarcadorColumnario($event)\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th>{{'nombre' | translate }}</th>\n <th>{{'tipomarcador' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marcador>\n <tr [pSelectableRow]=\"marcador\">\n <td>{{marcador.marcador}}</td>\n <td>{{marcador.tipo | reporteColumnarioPipe: 'listaTipoMarcador'}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div *ngIf=\"verNuevoMarcadorColumnario\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"marcadorColumnario.descripcion\" maxlength=\"4000\" \n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\" />\n <label>{{'descripcion' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"marcadorColumnario.marcador\" maxlength=\"50\" \n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\" />\n <label>{{'marcador' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaTipoMarcadorColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"marcadorColumnario.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-12\" >\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"marcadorColumnario.textoRegistro\" maxlength=\"4000\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"></textarea>\n <label>{{'valor' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorColumnario.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{marcadorColumnario.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorColumnario()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"marcadorColumnario.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadorColumnario($event)\">\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </p-tabPanel>\n <p-tabPanel header=\"{{'grafica' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.codigo\" size=\"25\"\n maxlength=\"100\">\n <label>{{'codigo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloGrafico\" size=\"25\"\n maxlength=\"100\">\n <label>{{'titulo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoGrafico\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.tipoGrafico\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n <label>{{'tipo' | translate }}</label> \n </p-floatLabel>\n </div>\n </div>\n\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"isSql()\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\" \n label=\"{{'link_actualizar' | translate}}\" (click)=\"guardarGrafico()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"pi pi-eye\"\n label=\"{{'link_ver' | translate}}\" (click)=\"verGrafico()\">\n </button>\n </div>\n </div>\n </div>\n\n <p-table [value]=\"paginadorColumnas\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\n [rows]=\"20\" [totalRecords]=\"paginadorColumnas.length\" [paginator]=\"paginadorColumnas.length > 20\" >\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'columna' | translate }}</th>\n <th>{{'sintaxis' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'accion' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-bean>\n <tr [pSelectableRow]=\"bean\">\n <td>{{bean.nombre}}</td>\n <td>{{bean.sintaxis}}</td>\n <td>{{bean.tipoDato | reporteFuentePipe : 'listaTipoDato'}}</td>\n <td>\n <p-dropdown [options]=\"listaGraficoSencillo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"bean.graficoFuente\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table> \n\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\n <h1 class=\"text-xl\">Colores</h1>\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoColorCategoria()\" icon=\"pi pi-plus\"\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"paginadorColoresGrafica\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"paginadorColoresGrafica.length\"\n [paginator]=\"paginadorColoresGrafica.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llaveTabla\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 45%\">{{'categoria' | translate}}</th>\n <th style=\"width: 45%\">{{'color' | translate}}</th>\n <th style=\"width: 10%\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verColorCategoriaDetalle\">\n <td style=\"width: 45%\">\n <input pInputText type=\"text\" [(ngModel)]=\"colorCategoria.titulo\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(colorCategoria.titulo) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(colorCategoria.titulo) && clickGuardarColorCategoria\">\n </td>\n <td style=\"width: 45%\">\n <div style=\"width: 100%\">\n <p-colorPicker [(ngModel)]=\"colorCategoria.banda\" appendTo=\"body\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(colorCategoria.banda) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(colorCategoria.banda) && clickGuardarColorCategoria\" />\n </div>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarColorCategoria(colorCategoria)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verColorCategoriaDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarColorCategoria()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-color let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"color\" style=\"width: 100%\">\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"color.titulo\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(color.titulo) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(color.titulo) && clickGuardarColorCategoria\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{color.titulo}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div style=\"width: 100%\">\n <p-colorPicker [(ngModel)]=\"color.banda\" appendTo=\"body\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(color.banda) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(color.banda) && clickGuardarColorCategoria\"/>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <p-colorPicker [(ngModel)]=\"color.banda\" [disabled]=\"true\" />\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarColorCategoria(color)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cancelarEdicionColor()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\n icon=\"pi pi-trash\" (click)=\"eliminarColorCategoria($event, color)\" [disabled]=\"habilitaCampo\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div #divGrafica class=\"flex justify-content-between card mt-3\" *ngIf=\"grafica\">\n <h1 class=\"text-xl\">{{'grafica' | translate}}</h1>\n <div style=\"width: 35%\"></div>\n <div style=\"width: 30%\">\n <p-chart [type]=\"tipoGrafica\" [data]=\"grafica.datosGrafica.data\" [options]=\"grafica.datosGrafica.options\"></p-chart>\n </div>\n <div style=\"width: 35%\"></div>\n </div>\n </p-tabPanel>\n</p-tabView>", styles: [":host ::ng-deep .p-picklist-buttons.p-picklist-source-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist-buttons.p-picklist-target-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist.p-component{margin:0}:host ::ng-deep .p-picklist-item span{float:left!important}:host ::ng-deep .fieldsintitulo .p-fieldset-legend{display:none!important}:host ::ng-deep .p-picklist-list-wrapper.p-picklist-source-wrapper ul{box-shadow:inset 1px 8px 10px -10px var(--color-200)}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-200) no-repeat}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-50) no-repeat}:host ::ng-deep .p-picklist .p-picklist-header{display:none}:host ::ng-deep .p-picklist .p-picklist-filter-container span{color:var(--color-100)}:host ::ng-deep .p-picklist .p-picklist-filter-container{border-radius:10px 10px 0 0;padding:3%;border:1px solid var(--color-100);border-bottom:none;box-shadow:0 4px 7px var(--color-100);position:relative}:host ::ng-deep .p-picklist .p-picklist-list{border:1px solid var(--color-100);height:400px}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item{padding:2%;color:#000000de;background:solid 2px var(--color-50) no-repeat;margin:16px 16px -7px;border-radius:5px;border:solid 1px var(--color-100);transition:.2s;background:#fff}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h6,:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h7{color:var(--color-500);margin-bottom:2px;font-size:1rem;margin-top:0}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item span{float:left;margin-right:4px;min-height:30px;color:var(--color-400)}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover{background:var(--color-400);color:#fff;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h6,:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h7{color:#fff!important;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover span{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight{background:var(--color-500);color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h6,:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h7{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight span{color:#fff!important}:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.5%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:20px}.p-picklist-buttons{padding:2rem}.p-picklist-buttons .p-button:disabled{background-color:var(--color3)!important;color:#fff!important}.p-picklist-buttons .p-button{margin-bottom:.5rem;border-radius:100%}.p-picklist-buttons .p-button.p-button-icon-only{padding:.4rem .5rem;width:40px;height:40px;max-width:initial;max-height:initial}.p-picklist-buttons .p-button.p-button-icon-only span{font-size:18px}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only{border-radius:100%;width:3rem!important;background:var(--color-500)}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only span{font-size:1.2rem;background:var(--color--300);color:#fff}:host ::ng-deep .p-picklist-buttons .p-button:disabled{background:var(--color-300)!important}@media (max-width: 1440px){:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.2%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:15px}}:host ::ng-deep .p-button{width:auto}\n"] }]
1599
+ args: [{ selector: 'detalle-tipo-reporte', imports: [TranslateModule, TableModule, TemplateTablaVaciaComponent, TabViewModule, InputHelperSeleccionPlantillaComponent, ReporteColumnarioPipe, ReporteFuentePipe, DropdownModule, FormsModule, ReactiveFormsModule, CommonModule, ButtonModule, PickListModule, FieldsetModule, AccordionModule, InputTextModule, InputTextareaModule, FloatLabelModule, InputNumberModule, FieldsetModule, ChartModule, ColorPickerModule], standalone: true, providers: [MessageService], template: "<p-tabView (onChange)=\"cambiarTab($event)\">\n <p-tabPanel header=\"{{'excel' | translate }}\" [selected]=\"true\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <p class=\"font-semibold\">{{'debe' | translate}} {{'indicar' | translate}} {{'plantilla' | translate}} {{'y' | translate}}\n {{'hoja' | translate}} {{'para' | translate}} {{'que' | translate}} {{'esta' | translate}}\n {{'opcion' | translate}} {{'se' | translate}} {{'active' | translate}}\n </p>\n <div class=\"p-fluid p-formgrid grid\">\n <div class=\"field col-12 md:col-4\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n [label]=\"reporteFuente.archivoTodo ? reporteFuente.archivoTodo: ''\"\n [extensiones]=\"'xls;xlsx'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\n (onSelected)=\"obtenerArchivo($event)\"></app-input-helper-seleccion-plantilla>\n\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\n translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoExcel\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\n icon=\"glyphicons glyphicons-refresh\" label=\"{{'link_actualizar' | translate}}\"\n (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n\n <p-pickList [source]=\"listaExcel\" [target]=\"listaNoExcel\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\n filterBy=\"sintaxis\" (onSourceReorder)=\"moverAAsociado($event)\"\n (onMoveAllToTarget)=\"moverADesasociado($event)\" (onMoveAllToSource)=\"moverAAsociado($event)\"\n (onMoveToTarget)=\"moverADesasociado($event)\" (onMoveToSource)=\"moverAAsociado($event)\">\n <ng-template let-excel pTemplate=\"item\">\n <div>\n <label>{{excel.nombre}}</label>\n </div>\n </ng-template>\n </p-pickList>\n\n <div class=\"mt-4\">\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorExcel()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorExcel\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorExcel\">\n <button pButton pRipple (click)=\"verNuevoMarcadorExcel = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadorExcel\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcadorExcel\" [rows]=\"10\"\n [totalRecords]=\"listaMarcadorExcel.length\" [paginator]=\"listaMarcadorExcel.length > 10\"\n (onRowSelect)=\"verDetalleMarcadorExcel($event)\" (onRowUnselect)=\"verDetalleMarcadorExcel($event)\" *ngIf=\"!verNuevoMarcadorExcel\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'descripcion' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marcador>\n <tr [pSelectableRow]=\"marcador\">\n <td>{{marcador.descripcion}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorExcel\">\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-book\"></i>{{'detalle' | translate}}</h5>\n <div class=\"Detallereporte mt-4 \">\n <form [formGroup]=\"formMarcadorExcel\" >\n <div class=\"col-md-12 p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\" maxlength=\"4000\">\n <label>{{'descripcion' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\" maxlength=\"4000\">\n <label>{{'marcador' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown\n [options]=\"[{label: 'Imagen Fija', value: 'IF'}, {label: 'Marcador', value: 'MA'}]\"\n [autoDisplayFirst]=\"false\" formControlName=\"tipo\" optionLabel=\"label\"\n optionValue=\"value\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\" [hidden]=\"esImagenFija\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\n <label>{{'valor' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\n <p-floatLabel>\n <p-dropdown\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\n [autoDisplayFirst]=\"false\" formControlName=\"origen\" optionLabel=\"label\"\n optionValue=\"value\"></p-dropdown>\n <label>{{'origen' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n formControlName=\"textoRegistro\"\n [label]=\"reporteMarcadorExcel.textoRegistro ? reporteMarcadorExcel.textoRegistro: ''\"\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcadorExcel($event)\"\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"('recursos' | translate)\" [labelarch]=\"'recurso' | translate\" [mostrarX]=\"true\"\n [mostraroblicargo]=\"true\"\n [booleano]=\"!utilsService.validarCampoObligatorio(reporteMarcadorExcel.textoRegistro) && clickGuardarMarcadorExcel\"\n [anexoPropiedad]=\"reporteMarcadorExcel.origen =='C' ? llaveEmpresa: ''\"\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\n </div>\n </div>\n </form>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"verNuevoMarcadorExcel\">\n <button pButton pRipple class=\"ml-2 p-button-raised\" icon=\"glyphicons {{reporteMarcadorExcel.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{reporteMarcadorExcel.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorExcel()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"reporteMarcadorExcel.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadorExcel($event)\">\n </button>\n </div>\n </div>\n </div>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'plantilla' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.unicoArchivo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'soporte' | translate }} {{'unico' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.descargarFuente\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'descargardoc' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.generarPin\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'generarpin' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [(ngModel)]=\"reporteFuente.campoAgrupacionPlanilla\" \n [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'agruparpor' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreAgrupacionPlanilla\" size=\"25\"\n maxlength=\"100\">\n <label>{{'nombrearchivoagrupacion' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoPlanilla\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteFuente.unicoArchivo == 'N'\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n [label]=\"reporteFuente.archivoIndividual ? reporteFuente.archivoIndividual: ''\"\n [labelrar]=\"'archivo' | translate\" [labelarch]=\"'archivo' | translate\" [mostraroblicargo]=\"true\"\n (onSelected)=\"obtenerArchivoPlanilla($event)\"></app-input-helper-seleccion-plantilla>\n </div>\n\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n\n <p-tabView >\n <p-tabPanel header=\"{{'marcadores' | translate }}\" [selected]=\"true\">\n \n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton pRipple class=\"p-button-secondary font-semibold mb-2\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcador()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcador\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcador\">\n <button pButton pRipple (click)=\"verNuevoMarcador = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadores\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcador\"\n [rows]=\"10\" [totalRecords]=\"listaMarcadores.length\"\n [paginator]=\"listaMarcadores.length > 10\" *ngIf=\"!verNuevoMarcador\"\n (onRowSelect)=\"verDetalleMarcador($event)\" (onRowUnselect)=\"verDetalleMarcador($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'descripcion' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'marcador' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marcador>\n <tr [pSelectableRow]=\"marcador\">\n <td>{{marcador.descripcion}}</td>\n <td>{{marcador.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\n <td>{{marcador.tipo == 'IF' ? marcador.textoRegistro : marcador.nombreColumna}}</td>\n <td>{{marcador.marcador}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <div class=\"card col-md-12\" *ngIf=\"verNuevoMarcador\">\n <div class=\"Detallereporte mt-2\">\n <form [formGroup]=\"formMarcador\">\n <p class=\"font-semibold\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\"\n maxlength=\"4000\">\n <label>{{'descripcion' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoMarcador\" [autoDisplayFirst]=\"false\" \n formControlName=\"tipo\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!(['MA','IM','MR','IF','QR','BC','G1'].includes(reporteMarcador.tipo))\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\">\n <label>{{'marcador' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"tabla\" size=\"25\">\n <label>{{'tabla' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'IF'\">\n <p-floatLabel>\n <p-dropdown\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" formControlName=\"origen\" optionLabel=\"label\"\n optionValue=\"value\"></p-dropdown>\n <label>{{'origen' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"reporteMarcador.tipo != 'IF' || !reporteMarcador.origen\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n formControlName=\"textoRegistro\"\n [label]=\"reporteMarcador.textoRegistro ? reporteMarcador.textoRegistro: ''\"\n [mostraroblicargo]=\"true\" [mostrarX]=\"true\"\n [booleano]=\"!utilsService.validarCampoObligatorio(reporteMarcador.textoRegistro) && clickGuardarMarcador\"\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcador($event)\"\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"'recursos' | translate\"\n [anexoPropiedad]=\"reporteMarcador.origen =='C' ? llaveEmpresa: ''\"\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['MA','IM','QR','BC','G1'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" formControlName=\"reporteColumna\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\n optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'columna' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MA'\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"formato\" size=\"25\">\n <label>{{'formato' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-inputNumber formControlName=\"ancho\" [maxlength]=\"5\"> </p-inputNumber>\n <label>{{'ancho' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-inputNumber formControlName=\"alto\" [maxlength]=\"5\"> </p-inputNumber>\n <label>{{'alto' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo1\"></textarea>\n <label>{{'grupo1' | translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo2\"></textarea>\n <label>{{'grupo2' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo3\"></textarea>\n <label>{{'grupo3' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"finalGrupo\"></textarea>\n <label>{{'finalgrupo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\n <label>{{'texto' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['MR','TB'].includes(reporteMarcador.tipo)\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" formControlName=\"tieneSql\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'sql' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoGrafico_JFC\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n <label>{{'grafica' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\"\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['S'].includes(reporteMarcador.tieneSql)))\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"query\"></textarea>\n <label>{{'consulta' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"fuente\" optionLabel=\"descripcion\"\n optionValue=\"llave\"></p-dropdown>\n <label>{{'fuente' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"marcadorGrafico\" size=\"25\">\n <label>{{'marcadorgrafica' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"titulox\" size=\"25\">\n <label>{{'titulo' | translate }} X</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\"\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"tituloy\" size=\"25\">\n <label>{{'titulo' | translate }} Y</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"banda\" size=\"25\">\n <label>{{'colordinamico' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" size=\"25\">\n <label>{{'numerocategorias' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\"\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\n <label>{{'filtro' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n </form>\n\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\n icon=\"glyphicons {{reporteMarcador.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save' }}\" label=\"{{reporteMarcador.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\"\n (click)=\"guardarMarcador()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"reporteMarcador.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcador($event)\">\n </button>\n </div>\n </div>\n </div>\n <div *ngIf=\"verNuevoMarcador && reporteMarcador.llave != null && (reporteMarcador.tipo == 'MR' || reporteMarcador.tipo == 'TB')\">\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTabla()\" icon=\"pi pi-plus\" [disabled]=\"bloquearCampoMarcador\"\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"listaCamposMarcador\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcador.length\" [scrollable]=\"true\"\n [paginator]=\"listaCamposMarcador.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llave\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 10%;\">{{'columna' | translate }}</th>\n <th style=\"width: 10%;\">{{'campo' | translate }}</th>\n <th style=\"width: 10%;\">{{'formato' | translate }}</th>\n <th style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">{{'tipo' | translate }}</th>\n <th style=\"width: 10%;\"*ngIf=\"reporteMarcador.tipo == 'TB'\">{{'medidas' | translate }}</th>\n <th style=\"width: 10%;\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalle\">\n <td style=\"width: 10%;\">\n <input pInputText [(ngModel)]=\"campoMarcadorInsertar.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '');\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\" />\n </td>\n <td style=\"width: 10%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.campoFuente\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\">\n </td>\n <td style=\"width: 10%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.formato\">\n </td>\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [(ngModel)]=\"campoMarcadorInsertar.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\n </td>\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <div *ngIf=\"campoMarcadorInsertar.tipo =='I'\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.ancho\">\n <label>{{'ancho' | translate}}</label>\n </p-floatLabel>\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.alto\">\n <label>{{'alto' | translate}}</label>\n </p-floatLabel>\n </div>\n </td>\n <td style=\"width: 10%;\" >\n <div class=\"flex justify-content-end\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campoMarcadorInsertar)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalle = false; bloquearCampoMarcador = false\" icon=\"pi pi-times\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"campo\">\n <td style=\"width: 10%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" \n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" />\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.columna}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.campoFuente}}\n </ng-template>\n </p-cellEditor>\n </td>\n\n <td style=\"width: 10%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.formato}}\n </ng-template>\n </p-cellEditor>\n </td>\n \n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [(ngModel)]=\"campo.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.tipo | reporteFuentePipe :'listaRecursoGrafica'}}\n </ng-template>\n </p-cellEditor>\n </td>\n \n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div *ngIf=\"campo.tipo =='I'\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campo.ancho\">\n <label>{{'ancho' | translate}}</label>\n </p-floatLabel>\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"campo.alto\">\n <label>{{'alto' | translate}}</label>\n </p-floatLabel>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <div *ngIf=\"campo.tipo =='I'\">\n {{'ancho' | translate}}: {{campo.ancho}} <br/>\n {{'alto' | translate}}: {{campo.alto}}\n </div> \n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%;\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorAsync()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow [disabled]=\"bloquearCampoMarcador\"\n icon=\"glyphicons glyphicons-pencil\" (click)=\"editarCampoMarcador()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow [disabled]=\"bloquearCampoMarcador\"\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcador($event,campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'soporte' | translate }} {{'archivo' | translate }}s\"\n *ngIf=\"reporteFuente.unicoArchivo == 'N'\">\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoSoporte()\" icon=\"pi pi-plus\"\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"listaSoportes\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"listaSoportes.length\"\n [paginator]=\"listaSoportes.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llaveTabla\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 45%\">{{'descripcion' | translate}}</th>\n <th style=\"width: 45%\">{{'archivo' | translate}}</th>\n <th style=\"width: 10%\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verSoporteArchivoDetalle\">\n <td style=\"width: 45%\">\n <input pInputText type=\"text\" [(ngModel)]=\"soporteIngresar.descripcion\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\">\n </td>\n <td style=\"width: 45%\">\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\" [mostrarX]=\"true\"\n [label]=\"soporteIngresar.archivoIndividual ? soporteIngresar.archivoIndividual: ''\" [labelarch]=\"'archivo' | translate\"\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"true\" [booleano]=\"!utilsService.validarCampoObligatorio(soporteIngresar.archivoIndividual) && clickGuardarSoporteArchivo\"\n (onSelected)=\"obtenerArchivoSoporte($event, soporteIngresar)\"></app-input-helper-seleccion-plantilla>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarSoporte(soporteIngresar)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verSoporteArchivoDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarSoporte()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-soporte let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"soporte\" style=\"width: 100%\">\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"soporte.descripcion\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{soporte.descripcion}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n {{soporte.archivoIndividual}}\n <!--<app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\" [mostrarX]=\"true\"\n [label]=\"soporte.archivoIndividual ? soporte.archivoIndividual: ''\"\n [mostrarLabelInput]=\"false\" [booleano]=\"!utilsService.validarCampoObligatorio(soporte.archivoIndividual) && clickGuardarSoporteArchivo\"\n (onSelected)=\"obtenerArchivoSoporte($event, soporte)\"></app-input-helper-seleccion-plantilla>-->\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{soporte.archivoIndividual}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarSoporte(soporte)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cancelarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\n icon=\"pi pi-trash\" (click)=\"eliminarSoporte($event, soporte)\" [disabled]=\"habilitaCampo\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n </p-tabPanel>\n </p-tabView>\n </p-tabPanel>\n <p-tabPanel header=\"{{'reporte' | translate }} {{'dinamico' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.dobleLinea\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\n <label>{{'doblelinea' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloParametro\" size=\"25\"\n maxlength=\"100\">\n <label>{{'descripcion' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoJasper\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n \n \n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"glyphicons glyphicons-restart\" \n label=\"{{'link_generar' | translate}}\" (click)=\"generarJasper()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"pi pi-download\" *ngIf=\"existeJasper\"\n label=\"{{'link_descargar' | translate}}\" (click)=\"descargarJasper()\">\n </button>\n \n </div>\n </div>\n </div>\n \n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"bandaSeleccionada.key\">\n <button pButton pRipple (click)=\"regresarBandaSeleccionada()\" label= \"{{'listado' | translate}} {{'bandas' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaTipoBanda\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" [rows]=\"10\"\n [totalRecords]=\"listaTipoBanda.length\" [paginator]=\"listaTipoBanda.length > 10\"\n (onRowSelect)=\"verBanda($event)\" (onRowUnselect)=\"verBanda($event)\" *ngIf=\"!bandaSeleccionada.key\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'banda' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-banda>\n <tr [pSelectableRow]=\"banda\">\n <td>{{banda.value}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <p-tabView *ngIf=\"bandaSeleccionada.key && verTabBanda\">\n <p-tabPanel header=\"{{'caracteristicas' | translate}}\"\n *ngIf=\"!['detalle','summary'].includes(bandaSeleccionada.key)\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSiNo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"codigo\" \n [(ngModel)]=\"reporteBanda.totales\" ></p-dropdown>\n <label>{{'total' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteBanda.titulo\" maxlength=\"200\">\n <label>{{'titulo' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCaracteristicaBanda()\">\n </button>\n </div>\n </div>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{bandaSeleccionada.value}}\" *ngIf=\"!nuevaBanda\">\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\n <div class=\"flex justify-content-end mb-1\" >\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoMarcadorDinamico()\" icon=\"pi pi-plus\"\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\" *ngIf=\"!nuevoReporteMarcadorDinamico\"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadorDinamico\" [scrollable]=\"true\"\n responsiveLayout=\"scroll\" dataKey=\"llaveTabla\" selectionMode=\"single\"\n [rows]=\"10\" [totalRecords]=\"listaMarcadorDinamico.length\"\n [paginator]=\"listaMarcadorDinamico.length > 10\" *ngIf=\"!nuevoReporteMarcadorDinamico\"\n (onRowSelect)=\"verMarcadorDinamico($event)\" (onRowUnselect)=\"verMarcadorDinamico($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'banda' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'etiqueta' | translate }}</th>\n <th>{{'formato' | translate }}</th>\n <th>{{'ancho' | translate }}</th>\n <th>{{'operacion' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-dinamico>\n <tr [pSelectableRow]=\"dinamico\">\n <td>{{dinamico.banda}}</td>\n <td>{{dinamico.banda ? dinamico.alto : ''}}</td>\n <td>{{dinamico.marcador}}</td>\n <td>{{dinamico.banda ? dinamico.descripcion : ''}}</td>\n <td>{{dinamico.banda ? dinamico.formato : ''}}</td>\n <td>{{['detalle'].includes(dinamico.banda) ? dinamico.ancho : ''}}</td>\n <td>{{dinamico.banda ? dinamico.operacion : ''}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n\n <div *ngIf=\"nuevoReporteMarcadorDinamico\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"flex justify-content-between align-items-center mb-2\"> \n <p class=\"font-semibold mt-3\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\n <button pButton pRipple (click)=\"nuevoReporteMarcadorDinamico = false\" label= \"{{'listado' | translate}} {{bandaSeleccionada.value}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \" *ngIf=\"nuevoReporteMarcadorDinamico\"></button>\n </div>\n <form [formGroup]=\"formReporteDinamico\" class=\"p-fluid grid\">\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCampoJasperDinamico\"\n [autoDisplayFirst]=\"false\" formControlName=\"tipoCampo\"\n optionLabel=\"value\" optionValue=\"key\"></p-dropdown>\n <label>{{'tipocampo' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoDatoSintaxis\" [autoDisplayFirst]=\"false\" \n formControlName=\"tipoDato\" optionLabel=\"value\"\n optionValue=\"key\"></p-dropdown>\n <label>{{'tipodato' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText formControlName=\"alto\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\n <label>{{'orden' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" \n formControlName=\"marcador\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\n *ngIf=\"!reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\"></p-dropdown>\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\"\n *ngIf=\"reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\">\n <label>{{'columna' | translate }} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-12\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\n <label>{{'sintaxis' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\">\n <p-fieldset class=\"fieldsintitulo\" class=\"fieldsintitulo\">\n <div class=\"p-fluid grid\">\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\">\n <label class=\"font-semibold text-gray-900 text-base ml-1\">{{'resultado' | translate}}</label>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\"></div>\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <label class=\"font-semibold text-gray-900 text-base ml-1\" >{{'label' | translate}}</label>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"formato\" />\n <label>{{'formato' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"descripcion\" />\n <label>{{'titulo' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"ancho\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\n <label>{{'ancho' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' == reporteMarcadorDinamico.banda \"></div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'ancho' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"resultadoX\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'x' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"titulox\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'x' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"resultadoY\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'y' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\n <p-floatLabel>\n <input pInputText type=\"text\" formControlName=\"tituloy\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\n <label>{{'y' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" \n formControlName=\"tipoReporte\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'alineacion' | translate }} *</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'alineacion' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoDato == 'N' && reporteMarcadorDinamico.tipoCampo !='C'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaOperaciones\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n formControlName=\"operacion\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'operacion' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n </p-fieldset>\n </div>\n </form>\n \n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{reporteMarcadorDinamico.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{reporteMarcadorDinamico.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaDinamico()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"reporteMarcadorDinamico.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarColumnaDinamico($event)\">\n </button>\n </div>\n </div>\n </div>\n </div>\n </p-tabPanel>\n \n </p-tabView>\n </p-tabPanel>\n <p-tabPanel header=\"{{'reporte' | translate }} {{'texto' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.archivoTexto\" size=\"50\"\n maxlength=\"200\">\n <label>{{'nombrearchivo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaSeparadores\" [(ngModel)]=\"reporteFuente.separador\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\n [autoDisplayFirst]=\"false\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\n <label>{{'separador' | translate }}*</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoTexto\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizarSeparador()\">\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-content-between lign-items-center mb-3\">\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorTexto()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorTexto\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorTexto\">\n <button pButton pRipple (click)=\"verNuevoMarcadorTexto = false; clickGuardarMarcadorTexto = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaMarcadoresTexto\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"listaMarcadoresTexto.length\"\n [paginator]=\"listaMarcadoresTexto.length > 10\" *ngIf=\"!verNuevoMarcadorTexto\"\n (onRowSelect)=\"verMarcadorTexto($event)\" (onRowUnselect)=\"verMarcadorTexto($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'tipo' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'formato' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marctexto>\n <tr [pSelectableRow]=\"marctexto\">\n <td>{{marctexto.tipoGrafico | reporteFuentePipe : 'listaTipoMarcadoresTexto'}}</td>\n <td>{{marctexto.nombreColumna}}</td>\n <td>{{marctexto.formato}}</td>\n <td>{{marctexto.alto}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorTexto\"> \n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoMarcadorTexto\" [autoDisplayFirst]=\"false\"\n [(ngModel)]=\"marcadorTexto.tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\"\n [(ngModel)]=\"marcadorTexto.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"></p-dropdown>\n <label>{{'columna' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.formato\" maxlength=\"50\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\">\n <label>{{marcadorTexto.tipoGrafico == 'D' ? ('formato' | translate)+'*' : ('valor' | translate)+'*' }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.ancho\" maxlength=\"22\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\">\n <label>{{'ancho' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.alto\" maxlength=\"22\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\">\n <label>{{'orden' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorTexto.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{marcadorTexto.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorTexto()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"marcadorTexto.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadoTexto($event)\">\n </button>\n </div>\n </div>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'tabla' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreTabla\" maxlength=\"4000\">\n <label>{{'nombretabla' | translate }}</label>\n </p-floatLabel>\n </div>\n <div class=\"field col-12 md:col-8\">\n <!--BOTONES-->\n <div class=\"flex justify-content-end mt-1 mb-1\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <p-pickList [source]=\"listaTabla\" [target]=\"listaNoTabla\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\n filterBy=\"nombre\" *ngIf=\"isFuente()\" (onSourceReorder)=\"reorderTabla($event)\"\n (onMoveAllToTarget)=\"moverADesasociadoTabla($event)\" (onMoveAllToSource)=\"moverAAsociadoTabla($event)\"\n (onMoveToTarget)=\"moverADesasociadoTabla($event)\" (onMoveToSource)=\"moverAAsociadoTabla($event)\">\n <ng-template let-tabla pTemplate=\"item\">\n <div>\n <label>{{tabla.nombre}}</label>\n </div>\n </ng-template>\n </p-pickList>\n </p-tabPanel>\n <p-tabPanel header=\"{{'archivoxml' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagEncabezado\"></textarea>\n <label>{{'tagencabezado' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagCierreEncabezado\"></textarea>\n <label>{{'tagcierreencabezado' | translate }}</label>\n </p-floatLabel> \n </div>\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.estructuraRegistro\"></textarea>\n <label>{{'tagregistro' | translate }}</label>\n </p-floatLabel> \n </div>\n\n <div class=\"field col-12 md:col-6\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.cifradoXml\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </div>\n <div class=\"flex justify-content-between align-items-center mb-3\">\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorXML()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorXML\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorXML\">\n <button pButton pRipple (click)=\"verNuevoMarcadorXML = false; clickGuardarMarcadorXML = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaXML\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"listaXML.length\"\n [paginator]=\"listaXML.length > 10\" *ngIf=\"!verNuevoMarcadorXML\"\n (onRowSelect)=\"verMarcadorXML($event)\" (onRowUnselect)=\"verMarcadorXML($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'descripcion' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'marcador' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marctexto>\n <tr [pSelectableRow]=\"marctexto\">\n <td>{{marctexto.descripcion}}</td>\n <td>{{marctexto.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\n <td>{{marctexto.nombreColumna}}</td>\n <td>{{marctexto.marcador}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorXML\"> \n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.descripcion\" maxlength=\"100\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\">\n <label>{{'descripcion' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaTipoMarcadorXML\" [autoDisplayFirst]=\"false\" \n [(ngModel)]=\"marcadorXML.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MA','MR'].includes(marcadorXML.tipo)\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" >\n <label>{{'marcador' | translate}}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\n <label>{{'tabla' | translate}}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\n <p-floatLabel>\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"marcadorXML.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\" ></p-dropdown>\n <label>{{'columna' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.formato\" >\n <label>{{'formato' | translate}}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MR'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.textoRegistro\" ></textarea>\n <label>{{'texto' | translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"marcadorXML.fuente\" optionLabel=\"descripcion\" optionValue=\"llave\"></p-dropdown>\n <label>{{'fuente' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.filtro\"></textarea>\n <label>{{'filtro' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.estructuraTablaXML\"></textarea>\n <label>{{'estructuratabla' | translate }}</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorXML.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{marcadorXML.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorXML()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"marcadorXML.llave != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadorXML($event)\">\n </button>\n </div>\n </div>\n </div>\n <div *ngIf=\"verNuevoMarcadorXML && marcadorXML.llave != null && (marcadorXML.tipo == 'MR' || marcadorXML.tipo == 'TB')\">\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTablaXML()\" icon=\"pi pi-plus\" [disabled]=\"habilitaCampo\"\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"listaCamposMarcadorXML\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcadorXML.length\"\n [paginator]=\"listaCamposMarcadorXML.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llave\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 30%;\">{{'campo' | translate }}</th>\n <th style=\"width: 30%;\">{{'marcador' | translate }}</th>\n <th style=\"width: 30%;\">{{'formato' | translate }}</th>\n <th style=\"width: 10%\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalleXML\">\n <td style=\"width: 30%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.campoFuente\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\">\n </td>\n <td style=\"width: 30%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.marcador\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\">\n </td>\n <td style=\"width: 30%;\">\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.formato\" style=\"width: -webkit-fill-available\">\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\" >\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campoMarcadorInsertarXML)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalleXML = false; habilitaCampo = false;\" icon=\"pi pi-times\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"campo\">\n <td style=\"width: 30%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.campoFuente}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 30%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.marcador\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.marcador}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 30%;\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\" style=\"width: -webkit-fill-available\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{campo.formato}}\n </ng-template>\n </p-cellEditor>\n </td>\n \n \n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorXMLAsync()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\n icon=\"pi pi-trash\" [disabled]=\"habilitaCampo\" (click)=\"eliminarCampoMarcadorXML($event,campo)\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n </div>\n </p-tabPanel>\n <p-tabPanel header=\"{{'columnario' | translate }}\">\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\" >\n <p-accordionTab [selected]=\"true\" >\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\n {{'columnasbasicas'|translate}}\n </ng-template>\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoColumnaBasica()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoReporteColumnario\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoReporteColumnario\">\n <button pButton pRipple (click)=\"verNuevoReporteColumnario = false; clickGuardarReporteColumnario = false;\" label= \"{{'listado' | translate}} {{'columnasbasicas' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"listaReporteColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"listaReporteColumnario.length\"\n [paginator]=\"listaReporteColumnario.length > 10\" *ngIf=\"!verNuevoReporteColumnario\"\n (onRowSelect)=\"verReporteColumnario($event)\" (onRowUnselect)=\"verReporteColumnario($event)\">\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'nombre' | translate }}</th>\n <th>{{'columna' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n <th>{{'operacion' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-bean>\n <tr [pSelectableRow]=\"bean\">\n <td>{{bean.nombre}}</td>\n <td>{{bean.nombreColumna}}</td>\n <td>{{bean.tipo | reporteColumnarioPipe: 'listaTipoColumna'}}</td>\n <td>{{bean.orden}}</td>\n <td>{{bean.operacion | reporteColumnarioPipe: 'listaOperacion'}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div *ngIf=\"verNuevoReporteColumnario\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.nombre\" maxlength=\"100\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\">\n <label>{{'nombre' | translate}} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaTipoColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'tipocolumna' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'columna' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"columnaBasica.tipo == 'D'\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOperacionesColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.operacion\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'operacion' | translate }} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.operacionHorizontal\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'operacionhorizontal' | translate }} *</label>\n </p-floatLabel>\n </div>\n <!-- fila Operacion Vertical -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.columnaOperacionVertical\" maxlength=\"5\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\">\n <label>{{'columnaoperacion' | translate}} *</label>\n </p-floatLabel>\n </div>\n <!-- Operacion Verticial -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.operacionVertical\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'operacionvertical' | translate }} *</label>\n </p-floatLabel>\n </div>\n <!-- Orden -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrden()\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.orden\" maxlength=\"5\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\">\n <label>{{'orden' | translate}} *</label>\n </p-floatLabel>\n </div>\n <!-- Ordenamiento Filas -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoLabel() || isTipoFila()\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" [showClear]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaBasica.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\" \n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orderBy) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orderBy) && clickGuardarReporteColumnario\"></p-dropdown>\n <label>{{'ordenamiento' | translate }} *</label>\n </p-floatLabel>\n </div>\n <!-- Ordenamiento Datos de la consulta -->\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrdenConsulta()\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.ordenConsulta\" maxlength=\"5\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\n <label>{{'ordenconsulta' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaBasica.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{columnaBasica.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaBasica()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"columnaBasica.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarColumnaBasica($event)\">\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\">\n <p-accordionTab >\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\n {{'datosadicionales'|translate}}\n </ng-template>\n <p-fieldset class=\"fieldsintitulo\" >\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n \n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\n [label]=\"reporteFuente.archivoExcelColumnario ? reporteFuente.archivoExcelColumnario: ''\"\n [extensiones]=\"'xls;xlsx;xlsm'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\n (onSelected)=\"obtenerArchivoColumnario($event)\"></app-input-helper-seleccion-plantilla>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\n translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"reporteFuente.filaInicioColumnario\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\n <label>{{'filainiciocolumnario' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" appendTo=\"body\"\n [(ngModel)]=\"reporteFuente.cifradoColumnario\" optionLabel=\"nombre\"\n optionValue=\"llaveTabla\"></p-dropdown>\n <label>{{'tipocifrado' | translate }}</label> \n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\">\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.sintaxisColumnario\"></textarea>\n <label>{{'sintaxiscolumnario' | translate }}</label>\n </p-floatLabel>\n </div>\n \n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\n </button>\n </div>\n </div>\n </p-fieldset>\n <div class=\"flex justify-content-between align-items-center mb-3 mt-3\">\n <h1 class=\"text-xl\">{{'columnaadicional' | translate}}</h1>\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevaColumnaAdicional()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoColumnaAdicional\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoColumnaAdicional\">\n <button pButton pRipple (click)=\"verNuevoColumnaAdicional = false; clickGuardarColumnaAdicional = false;\" label= \"{{'listado' | translate}} {{'columnaadicional' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"columnasAdicionales\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"columnasAdicionales.length\"\n [paginator]=\"columnasAdicionales.length > 10\" *ngIf=\"!verNuevoColumnaAdicional\"\n (onRowSelect)=\"verDetalleAdicional($event)\" (onRowUnselect)=\"verDetalleAdicional($event)\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th>{{'nombre' | translate }}</th>\n <th>{{'orden' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-columnaadicional>\n <tr [pSelectableRow]=\"columnaadicional\">\n <td>{{columnaadicional.nombre}}</td>\n <td>{{columnaadicional.orden}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoColumnaAdicional\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-3\" >\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"columnaAdicional.nombre\" maxlength=\"100\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\">\n <label>{{'alias' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"columnaAdicional.orden\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\" />\n <label>{{'orden' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-3\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"columnaAdicional.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"></p-dropdown>\n <label>{{'ordenamiento' | translate }} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-3\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"columnaAdicional.ordenConsulta\" maxlength=\"5\" \n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\" />\n <label>{{'ordenconsulta' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-12\" >\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"columnaAdicional.sintaxis\" maxlength=\"4000\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"></textarea>\n <label>{{'sintaxis' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaAdicional.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{columnaAdicional.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaAdicional()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"columnaAdicional.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarColumnaAdicional($event)\">\n </button>\n </div>\n </div>\n </p-fieldset>\n </p-accordionTab>\n <p-accordionTab >\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\n {{'marcadores'|translate}}\n </ng-template>\n <div class=\"flex justify-content-end align-items-center mb-3\">\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\n (click)=\"nuevoMarcadorColumnario()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorColumnario\">\n </button>\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorColumnario\">\n <button pButton pRipple (click)=\"verNuevoMarcadorColumnario = false; clickGuardarMarcadorColumnario = false;\" label= \"{{'listado' | translate}} {{'marcador' | translate}}\" \n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\n </div>\n </div>\n <p-table [value]=\"marcadoresColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\n dataKey=\"llaveTabla\" selectionMode=\"single\" \n [rows]=\"10\" [totalRecords]=\"marcadoresColumnario.length\"\n [paginator]=\"marcadoresColumnario.length > 10\" *ngIf=\"!verNuevoMarcadorColumnario\"\n (onRowSelect)=\"verDetalleMarcadorColumnario($event)\" (onRowUnselect)=\"verDetalleMarcadorColumnario($event)\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th>{{'nombre' | translate }}</th>\n <th>{{'tipomarcador' | translate }}</th>\n </tr>\n <th>\n </ng-template>\n <ng-template pTemplate=\"body\" let-marcador>\n <tr [pSelectableRow]=\"marcador\">\n <td>{{marcador.marcador}}</td>\n <td>{{marcador.tipo | reporteColumnarioPipe: 'listaTipoMarcador'}}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div *ngIf=\"verNuevoMarcadorColumnario\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\" >\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"marcadorColumnario.descripcion\" maxlength=\"4000\" \n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\" />\n <label>{{'descripcion' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\" >\n <p-floatLabel>\n <input pInputText [(ngModel)]=\"marcadorColumnario.marcador\" maxlength=\"50\" \n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\" />\n <label>{{'marcador' | translate}} *</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel> \n <p-dropdown [options]=\"listaTipoMarcadorColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\n [(ngModel)]=\"marcadorColumnario.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"></p-dropdown>\n <label>{{'tipo' | translate }} *</label>\n </p-floatLabel>\n </div>\n \n <div class=\"field col-12 md:col-12\" >\n <p-floatLabel>\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"marcadorColumnario.textoRegistro\" maxlength=\"4000\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"></textarea>\n <label>{{'valor' | translate}} *</label>\n </p-floatLabel>\n </div>\n </div>\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" >\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorColumnario.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\n label=\"{{marcadorColumnario.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorColumnario()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\n *ngIf=\"marcadorColumnario.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\n (click)=\"eliminarMarcadorColumnario($event)\">\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </p-tabPanel>\n <p-tabPanel header=\"{{'grafica' | translate }}\">\n <div class=\"card col-md-12\">\n <div class=\"Detallereporte mt-2\">\n <div class=\"p-fluid p-formgrid grid\">\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.codigo\" size=\"25\"\n maxlength=\"100\">\n <label>{{'codigo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloGrafico\" size=\"25\"\n maxlength=\"100\">\n <label>{{'titulo' | translate }}</label>\n </p-floatLabel>\n </div>\n\n <div class=\"field col-12 md:col-4\">\n <p-floatLabel>\n <p-dropdown [options]=\"listaTipoGrafico\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"reporteFuente.tipoGrafico\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n <label>{{'tipo' | translate }}</label> \n </p-floatLabel>\n </div>\n </div>\n\n <!--BOTONES-->\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"isSql()\">\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\" \n label=\"{{'link_actualizar' | translate}}\" (click)=\"guardarGrafico()\">\n </button>\n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"pi pi-eye\"\n label=\"{{'link_ver' | translate}}\" (click)=\"verGrafico()\">\n </button>\n </div>\n </div>\n </div>\n\n <p-table [value]=\"paginadorColumnas\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\n [rows]=\"20\" [totalRecords]=\"paginadorColumnas.length\" [paginator]=\"paginadorColumnas.length > 20\" >\n <ng-template pTemplate=\"header\">\n\n <tr class=\"fondoTablaPincipal\">\n <th>{{'columna' | translate }}</th>\n <th>{{'sintaxis' | translate }}</th>\n <th>{{'tipo' | translate }}</th>\n <th>{{'accion' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-bean>\n <tr [pSelectableRow]=\"bean\">\n <td>{{bean.nombre}}</td>\n <td>{{bean.sintaxis}}</td>\n <td>{{bean.tipoDato | reporteFuentePipe : 'listaTipoDato'}}</td>\n <td>\n <p-dropdown [options]=\"listaGraficoSencillo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\n [(ngModel)]=\"bean.graficoFuente\" optionLabel=\"nombre\"\n optionValue=\"codigo\"></p-dropdown>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table> \n\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\n <h1 class=\"text-xl\">Colores</h1>\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoColorCategoria()\" icon=\"pi pi-plus\"\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\n </div>\n <p-table [value]=\"paginadorColoresGrafica\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\n [rows]=\"10\" [totalRecords]=\"paginadorColoresGrafica.length\"\n [paginator]=\"paginadorColoresGrafica.length > 10\" \n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \n editMode=\"row\" dataKey=\"llaveTabla\">\n <ng-template pTemplate=\"header\">\n <tr class=\"fondoTablaPincipal\">\n <th style=\"width: 45%\">{{'categoria' | translate}}</th>\n <th style=\"width: 45%\">{{'color' | translate}}</th>\n <th style=\"width: 10%\"> </th>\n </tr>\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verColorCategoriaDetalle\">\n <td style=\"width: 45%\">\n <input pInputText type=\"text\" [(ngModel)]=\"colorCategoria.titulo\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(colorCategoria.titulo) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(colorCategoria.titulo) && clickGuardarColorCategoria\">\n </td>\n <td style=\"width: 45%\">\n <div style=\"width: 100%\">\n <p-colorPicker [(ngModel)]=\"colorCategoria.banda\" appendTo=\"body\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(colorCategoria.banda) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(colorCategoria.banda) && clickGuardarColorCategoria\" />\n </div>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarColorCategoria(colorCategoria)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <button pButton pRipple type=\"button\" (click)=\"verColorCategoriaDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarColorCategoria()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-color let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr [pEditableRow]=\"color\" style=\"width: 100%\">\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input pInputText type=\"text\" [(ngModel)]=\"color.titulo\" style=\"width: -webkit-fill-available\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(color.titulo) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(color.titulo) && clickGuardarColorCategoria\">\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{color.titulo}}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 45%\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div style=\"width: 100%\">\n <p-colorPicker [(ngModel)]=\"color.banda\" appendTo=\"body\"\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(color.banda) && clickGuardarColorCategoria\"\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(color.banda) && clickGuardarColorCategoria\"/>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <p-colorPicker [(ngModel)]=\"color.banda\" [disabled]=\"true\" />\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 10%\">\n <div class=\"flex justify-content-end\">\n <!-- CHECK GUARDAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\n icon=\"pi pi-check\" (click)=\"agregarColorCategoria(color)\"\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- CANCELAR -->\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\n icon=\"pi pi-times\" (click)=\"cancelarEdicionColor()\"\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- EDITAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n <!-- ELIMINAR -->\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\n icon=\"pi pi-trash\" (click)=\"eliminarColorCategoria($event, color)\" [disabled]=\"habilitaCampo\"\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"100\"> \n <app-template-tabla-vacia></app-template-tabla-vacia>\n </td>\n </tr>\n </ng-template> </p-table>\n <div #divGrafica class=\"flex justify-content-between card mt-3\" *ngIf=\"grafica\">\n <h1 class=\"text-xl\">{{'grafica' | translate}}</h1>\n <div style=\"width: 35%\"></div>\n <div style=\"width: 30%\">\n <p-chart [type]=\"tipoGrafica\" [data]=\"grafica.datosGrafica.data\" [options]=\"grafica.datosGrafica.options\"></p-chart>\n </div>\n <div style=\"width: 35%\"></div>\n </div>\n </p-tabPanel>\n</p-tabView>", styles: [":host ::ng-deep .p-picklist-buttons.p-picklist-source-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist-buttons.p-picklist-target-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist.p-component{margin:0}:host ::ng-deep .p-picklist-item span{float:left!important}:host ::ng-deep .fieldsintitulo .p-fieldset-legend{display:none!important}:host ::ng-deep .p-picklist-list-wrapper.p-picklist-source-wrapper ul{box-shadow:inset 1px 8px 10px -10px var(--color-200)}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-200) no-repeat}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-50) no-repeat}:host ::ng-deep .p-picklist .p-picklist-header{display:none}:host ::ng-deep .p-picklist .p-picklist-filter-container span{color:var(--color-100)}:host ::ng-deep .p-picklist .p-picklist-filter-container{border-radius:10px 10px 0 0;padding:3%;border:1px solid var(--color-100);border-bottom:none;box-shadow:0 4px 7px var(--color-100);position:relative}:host ::ng-deep .p-picklist .p-picklist-list{border:1px solid var(--color-100);height:400px}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item{padding:2%;color:#000000de;background:solid 2px var(--color-50) no-repeat;margin:16px 16px -7px;border-radius:5px;border:solid 1px var(--color-100);transition:.2s;background:#fff}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h6,:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h7{color:var(--color-500);margin-bottom:2px;font-size:1rem;margin-top:0}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item span{float:left;margin-right:4px;min-height:30px;color:var(--color-400)}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover{background:var(--color-400);color:#fff;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h6,:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h7{color:#fff!important;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover span{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight{background:var(--color-500);color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h6,:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h7{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight span{color:#fff!important}:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.5%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:20px}.p-picklist-buttons{padding:2rem}.p-picklist-buttons .p-button:disabled{background-color:var(--color3)!important;color:#fff!important}.p-picklist-buttons .p-button{margin-bottom:.5rem;border-radius:100%}.p-picklist-buttons .p-button.p-button-icon-only{padding:.4rem .5rem;width:40px;height:40px;max-width:initial;max-height:initial}.p-picklist-buttons .p-button.p-button-icon-only span{font-size:18px}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only{border-radius:100%;width:3rem!important;background:var(--color-500)}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only span{font-size:1.2rem;background:var(--color--300);color:#fff}:host ::ng-deep .p-picklist-buttons .p-button:disabled{background:var(--color-300)!important}@media (max-width: 1440px){:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.2%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:15px}}:host ::ng-deep .p-button{width:auto}\n"] }]
1581
1600
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.ToastService }, { type: i3.GeneralService }, { type: i4.GeneralPipe }, { type: i5.AuthService }, { type: i6.ReporteFuentePipe }, { type: i7.ConfirmationService }, { type: i8.CargarArchivosService }, { type: i9.EncriptadoBasicoService }, { type: i10.UtilsService }, { type: i11.TranslateService }, { type: i12.FuentePipe }, { type: i13.ReporteColumnarioPipe }, { type: i14.EjecucionReporteService }, { type: i15.DashboardService }, { type: i16.DashboardPipe }], propDecorators: { divGrafica: [{
1582
1601
  type: ViewChild,
1583
1602
  args: ['divGrafica']
@@ -1588,4 +1607,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
1588
1607
  }], listaFuentes: [{
1589
1608
  type: Input
1590
1609
  }] } });
1591
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZWplY3VjaW9uLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZWplY3VjaW9uLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQXlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQWUsV0FBVyxFQUFhLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUduSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFHMUUsT0FBTyxFQUF1QixjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFdkUsT0FBTyxFQUFFLGVBQWUsRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUN6RixPQUFP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QUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEgsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRixLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7WUFDbEQsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBQ3BELGFBQWEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztZQUNsRSxjQUFjLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUM7WUFDcEUsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1lBQ3RELEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUNsRCxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFDaEQsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBQ3BELE1BQU0sRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUNwRCxNQUFNLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDcEQsVUFBVSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FB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cG9uZW50LCBPbkluaXQsIElucHV0LCBPbkRlc3Ryb3ksIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgR2VuZXJhbFBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9nZW5lcmFsLnBpcGUnO1xuaW1wb3J0IHsgR2VuZXJhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvc2VydmljaW9zL2dlbmVyYWwuc2VydmljZSc7XG5pbXBvcnQgeyBHZW5lcmFsTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9zZWd1cmlkYWQvbW9kZWxvcy9HZW5lcmFsTW9kZWwnO1xuaW1wb3J0IHsgQ2FyZ2FyQXJjaGl2b3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2lvcy9jYXJnYXItYXJjaGl2b3Muc2VydmljZSc7XG5pbXBvcnQgeyBFbmNyaXB0YWRvQmFzaWNvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNpb3MvZW5jcmlwdGFkby1iYXNpY28uc2VydmljZSc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25TZXJ2aWNlLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZXBvcnRlRnVlbnRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL3JlcG9ydGUtZnVlbnRlLnBpcGUnO1xuaW1wb3J0IHsgRWplY3VjaW9uUmVwb3J0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lamVjdWNpb25yZXBvcnRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBGdWVudGVQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvZnVlbnRlLnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFyaW9QaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvcmVwb3J0ZS1jb2x1bW5hcmlvLnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVDb2x1bW5hJztcbmltcG9ydCB7IFJlcG9ydGVNYXJjYWRvck1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZU1hcmNhZG9yJztcbmltcG9ydCB7IFJlcG9ydGVUYWJsYU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZVRhYmxhJztcbmltcG9ydCB7IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9zZWd1cmlkYWQvbW9kZWxvcy9SZXBvcnRlQ29sdW1uYXJpbyc7XG5pbXBvcnQgeyBSZXBvcnRlRnVlbnRlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9zZWd1cmlkYWQvbW9kZWxvcy9SZXBvcnRlRnVlbnRlTW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvcic7XG5pbXBvcnQgeyBSZXBvcnRlQmFuZGFNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVCYW5kYSc7XG5pbXBvcnQgeyBSZXBvcnRlU29wb3J0ZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZVNvcG9ydGUnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNpb3MvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBVdGlsc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2lvcy91dGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNpb3MvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVRhYmxhVmFjaWFDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL2NvbXBvbmVudGVzL3RlbXBsYXRlLXRhYmxhLXZhY2lhL3RlbXBsYXRlLXRhYmxhLXZhY2lhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJWaWV3TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90YWJ2aWV3JztcbmltcG9ydCB7IElucHV0SGVscGVyU2VsZWNjaW9uUGxhbnRpbGxhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL2NvbXBvbmVudGVzL2lucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhL2lucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IFBpY2tMaXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9waWNrbGlzdCc7XG5pbXBvcnQgeyBGaWVsZHNldE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZmllbGRzZXQnO1xuaW1wb3J0IHsgQWNjb3JkaW9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9hY2NvcmRpb24nO1xuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xuaW1wb3J0IHsgSW5wdXRUZXh0YXJlYU1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0YXJlYSc7XG5pbXBvcnQgeyBGbG9hdExhYmVsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9mbG9hdGxhYmVsJztcbmltcG9ydCB7IElucHV0TnVtYmVyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dG51bWJlcic7XG5pbXBvcnQgeyBEYXNoYm9hcmRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZGFzaGJvYXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhcnRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NoYXJ0JztcbmltcG9ydCB7IERhc2hib2FyZFBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9kYXNoYm9hcmQucGlwZSc7XG5pbXBvcnQgeyBDb2xvclBpY2tlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY29sb3JwaWNrZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZXRhbGxlLXRpcG8tcmVwb3J0ZScsXG4gICAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgVGFibGVNb2R1bGUsIFRlbXBsYXRlVGFibGFWYWNpYUNvbXBvbmVudCwgVGFiVmlld01vZHVsZSwgSW5wdXRIZWxwZXJTZWxlY2Npb25QbGFudGlsbGFDb21wb25lbnQsIFJlcG9ydGVDb2x1bW5hcmlvUGlwZSwgUmVwb3J0ZUZ1ZW50ZVBpcGUsIERyb3Bkb3duTW9kdWxlLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgQ29tbW9uTW9kdWxlLCBCdXR0b25Nb2R1bGUsIFBpY2tMaXN0TW9kdWxlLCBGaWVsZHNldE1vZHVsZSwgQWNjb3JkaW9uTW9kdWxlLCBJbnB1dFRleHRNb2R1bGUsIElucHV0VGV4dGFyZWFNb2R1bGUsIEZsb2F0TGFiZWxNb2R1bGUsIElucHV0TnVtYmVyTW9kdWxlLCBGaWVsZHNldE1vZHVsZSwgQ2hhcnRNb2R1bGUsIENvbG9yUGlja2VyTW9kdWxlXSwgXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBwcm92aWRlcnM6IFtNZXNzYWdlU2VydmljZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RldGFsbGUtdGlwby1yZXBvcnRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZXRhbGxlVGlwb1JlcG9ydGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgcHVibGljIGxpc3RhVGlwb0NpZnJhZG86IGFueVtdID0gW107XG4gIC8vdGFiIGV4Y2VsXG4gIHB1YmxpYyBsaXN0YUV4Y2VsOiBSZXBvcnRlQ29sdW1uYU1vZGVsW10gPSBbXTtcbiAgcHVibGljIGxpc3RhTm9FeGNlbDogUmVwb3J0ZUNvbHVtbmFNb2RlbFtdID0gW107XG4gIHB1YmxpYyBsaXN0YU1hcmNhZG9yRXhjZWw6IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXTtcbiAgcHVibGljIHJlcG9ydGVNYXJjYWRvckV4Y2VsOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbDtcbiAgcHVibGljIGZvcm1NYXJjYWRvckV4Y2VsOiBGb3JtR3JvdXA7XG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yRXhjZWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGVzTWFyY2Fkb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGVzSW1hZ2VuRmlqYTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vdGFiIHBsYW50aWxsYXNcbiAgcHVibGljIGxpc3RhQ29sdW1uYXM6IGFueVtdID0gW107XG4gIHB1YmxpYyBsaXN0YU1hcmNhZG9yZXM6IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXTtcbiAgcHVibGljIGxpc3RhVGlwb01hcmNhZG9yO1xuICBwdWJsaWMgbGlzdGFUaXBvR3JhZmljb19KRkM7XG4gIHB1YmxpYyBsaXN0YUdyYWZpY287XG4gIHB1YmxpYyBsaXN0YUdyYWZpY29TZW5jaWxsbztcbiAgcHVibGljIGxpc3RhQWxpbmVhY2lvbjtcbiAgcHVibGljIGxpc3RhT3BlcmFjaW9uZXM7XG4gIHB1YmxpYyByZXBvcnRlTWFyY2Fkb3I6IFJlcG9ydGVNYXJjYWRvck1vZGVsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsO1xuICBwdWJsaWMgZm9ybU1hcmNhZG9yOiBGb3JtR3JvdXA7XG4gIHB1YmxpYyBvcmlnZW5NYXJjYWRvcjogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIHZlck51ZXZvTWFyY2Fkb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGxpc3RhQ2FtcG9zTWFyY2Fkb3I6IFJlcG9ydGVUYWJsYU1vZGVsW10gPSBbXTtcbiAgcHVibGljIGNhbXBvTWFyY2Fkb3JJbnNlcnRhcjogUmVwb3J0ZVRhYmxhTW9kZWwgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWw7XG4gIHB1YmxpYyBsaXN0YVNvcG9ydGVzOiBSZXBvcnRlU29wb3J0ZU1vZGVsW10gPSBbXTtcbiAgcHVibGljIHNvcG9ydGVJbmdyZXNhcjogUmVwb3J0ZVNvcG9ydGVNb2RlbCA9IG5ldyBSZXBvcnRlU29wb3J0ZU1vZGVsO1xuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wbzogYm9vbGVhbiA9IGZhbHNlXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJNYXJjYWRvckV4Y2VsOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyB2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyB2ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBoYWJpbGl0YUNhbXBvOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIGJsb3F1ZWFyQ2FtcG9NYXJjYWRvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgYmxvcXVlYXJTb3BvcnRlOiBib29sZWFuID0gZmFsc2U7XG5cblxuICAvL3JlcG9ydGUgZGluYW1pY29cbiAgcHVibGljIGxpc3RhVGlwb0JhbmRhID0gW1xuICAgIHtrZXk6ICdiYW5kYTEnLCB2YWx1ZTogJ0JhbmRhIDEnfSxcbiAgICB7a2V5OiAnYmFuZGEyJywgdmFsdWU6ICdCYW5kYSAyJ30sXG4gICAge2tleTogJ2JhbmRhMycsIHZhbHVlOiAnQmFuZGEgMyd9LFxuICAgIHtrZXk6ICdiYW5kYTQnLCB2YWx1ZTogJ0JhbmRhIDQnfSxcbiAgICB7a2V5OiAnYmFuZGE1JywgdmFsdWU6ICdCYW5kYSA1J30sXG4gICAge2tleTogJ2RldGFsbGUnLCB2YWx1ZTogJ0RldGFsbGUnfSxcbiAgICB7a2V5OiAnc3VtbWFyeScsIHZhbHVlOiAnUmVzdW1lbid9LFxuICBdXG4gIHB1YmxpYyBleGlzdGVKYXNwZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGJhbmRhU2VsZWNjaW9uYWRhID0ge2tleTogbnVsbCwgdmFsdWU6IG51bGx9O1xuICBwdWJsaWMgbnVldmFCYW5kYTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgdmVyVGFiQmFuZGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIG51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY286IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbDtcbiAgcHVibGljIHJlcG9ydGVCYW5kYTogUmVwb3J0ZUJhbmRhTW9kZWwgPSBuZXcgUmVwb3J0ZUJhbmRhTW9kZWw7XG4gIHB1YmxpYyBmb3JtUmVwb3J0ZURpbmFtaWNvOiBGb3JtR3JvdXA7XG4gIHB1YmxpYyBsaXN0YU1hcmNhZG9yRGluYW1pY286IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXVxuICBwdWJsaWMgbGlzdGFUaXBvQ2FtcG9KYXNwZXJEaW5hbWljbyA9IFtcbiAgICB7a2V5OiAnQycsIHZhbHVlOiAnQ2FsY3Vsbyd9LFxuICAgIHtrZXk6ICdUJywgdmFsdWU6ICdDb2x1bW5hJ30sXG4gIF1cbiAgcHVibGljIGxpc3RhVGlwb0RhdG9TaW50YXhpcyA9IFtcbiAgICB7a2V5OiAnRicsIHZhbHVlOiAnRmVjaGEnfSxcbiAgICB7a2V5OiAnTicsIHZhbHVlOiAnTnVtZXJvJ30sXG4gICAge2tleTogJ1QnLCB2YWx1ZTogJ1RleHRvJ30sXG4gIF1cblxuICAvL3JlcG9ydGUgdGFibGFcbiAgcHVibGljIGxpc3RhVGFibGE6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xuICBwdWJsaWMgbGlzdGFOb1RhYmxhOiBSZXBvcnRlQ29sdW1uYU1vZGVsW10gPSBbXTtcbiAgXG5cbiAgLy9yZXBvcnRlIHRleHRvXG4gIHB1YmxpYyBsaXN0YVNlcGFyYWRvcmVzO1xuICBwdWJsaWMgY2xpY2tHdWFyZGFyUmVwb3J0ZVRleHRvOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBsaXN0YU1hcmNhZG9yZXNUZXh0bzogUmVwb3J0ZU1hcmNhZG9yTW9kZWxbXSA9IFtdO1xuICBwdWJsaWMgbWFyY2Fkb3JUZXh0bzogUmVwb3J0ZU1hcmNhZG9yTW9kZWwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKVxuICBwdWJsaWMgdmVyTnVldm9NYXJjYWRvclRleHRvOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBsaXN0YVRpcG9NYXJjYWRvclRleHRvO1xuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0bzogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLy9yZXBvcnRlIFhNTFxuICBwdWJsaWMgbGlzdGFUaXBvTWFyY2Fkb3JYTUw7XG4gIHB1YmxpYyBsaXN0YVhNTDogUmVwb3J0ZU1hcmNhZG9yTW9kZWxbXSA9IFtdXG4gIHB1YmxpYyBtYXJjYWRvclhNTDogUmVwb3J0ZU1hcmNhZG9yTW9kZWwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWxcbiAgcHVibGljIGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yWE1MOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBsaXN0YUNhbXBvc01hcmNhZG9yWE1MOiBSZXBvcnRlVGFibGFNb2RlbFtdID0gW107XG4gIHB1YmxpYyBjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUw6IFJlcG9ydGVUYWJsYU1vZGVsID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsO1xuICBwdWJsaWMgdmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZVhNTDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vcmVwb3J0ZSBjb2x1bW5hcmlvXG4gIHB1YmxpYyBsaXN0YVJlcG9ydGVDb2x1bW5hcmlvOiBSZXBvcnRlQ29sdW1uYXJpb01vZGVsW10gPSBbXTtcbiAgcHVibGljIHZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW86IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGNvbHVtbmFCYXNpY2E6IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWw7XG4gIHB1YmxpYyBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpbzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgbGlzdGFUaXBvQ29sdW1uYXM7XG4gIHB1YmxpYyBsaXN0YU9wZXJhY2lvbmVzQ29sdW1uYXJpbztcbiAgcHVibGljIGxpc3RhT3BlcmFjaW9uZXNFeGNlbENvbHVtbmFyaW87XG4gIHB1YmxpYyBsaXN0YU9yZGVuYW1pZW50bztcblxuICBwdWJsaWMgdmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBjb2x1bW5hc0FkaWNpb25hbGVzOiBSZXBvcnRlQ29sdW1uYXJpb01vZGVsW10gPSBbXTtcbiAgcHVibGljIGNvbHVtbmFBZGljaW9uYWw6IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWw7XG5cbiAgcHVibGljIGxpc3RhVGlwb01hcmNhZG9yQ29sdW1uYXJpbztcbiAgcHVibGljIHZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW86IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIG1hcmNhZG9yZXNDb2x1bW5hcmlvOiBSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yTW9kZWxbXSA9IFtdO1xuICBwdWJsaWMgbWFyY2Fkb3JDb2x1bW5hcmlvOiBSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yTW9kZWw7XG5cbiAgLy9ncmFmaWNhXG4gIHB1YmxpYyBsaXN0YVRpcG9HcmFmaWNvO1xuICBwdWJsaWMgcGFnaW5hZG9yQ29sdW1uYXM6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xuICBwdWJsaWMgcGFnaW5hZG9yQ29sb3Jlc0dyYWZpY2E6IFJlcG9ydGVCYW5kYU1vZGVsW10gPSBbXTtcbiAgcHVibGljIGNvbG9yQ2F0ZWdvcmlhOiBSZXBvcnRlQmFuZGFNb2RlbCA9IG5ldyBSZXBvcnRlQmFuZGFNb2RlbCgpO1xuICBwdWJsaWMgdmVyQ29sb3JDYXRlZ29yaWFEZXRhbGxlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZ3JhZmljYTtcbiAgcHVibGljIHRpcG9HcmFmaWNhOiBcImJhclwiIHwgXCJsaW5lXCIgfCBcInNjYXR0ZXJcIiB8IFwiYnViYmxlXCIgfCBcInBpZVwiIHwgXCJkb3VnaG51dFwiIHwgXCJwb2xhckFyZWFcIiB8IFwicmFkYXJcIjtcbiAgQFZpZXdDaGlsZCgnZGl2R3JhZmljYScpIGRpdkdyYWZpY2EhOiBFbGVtZW50UmVmO1xuXG4gIHB1YmxpYyByZXBvcnRlRnVlbnRlIDogUmVwb3J0ZUZ1ZW50ZU1vZGVsID0gbmV3ICBSZXBvcnRlRnVlbnRlTW9kZWwoKTtcbiAgcHVibGljIGxsYXZlRW1wcmVzYTogc3RyaW5nO1xuICBwdWJsaWMgbGlzdGFTaU5vO1xuICBASW5wdXQoKSBwdWJsaWMgbGxhdmVSZXBvcnRlIDogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgYXBsaWNhY2lvbiA6IHN0cmluZztcbiAgQElucHV0KCkgIHB1YmxpYyBsaXN0YUZ1ZW50ZXM6IGFueVtdID0gW107XG5cbiAgX3N1YnNjaXBydGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBub3RpZmljYWNpb25lc0J1c1NlcnZpY2U6IFRvYXN0U2VydmljZSxcbiAgICBwcml2YXRlIGdlbmVyYWxTZXJ2aWNlOiBHZW5lcmFsU2VydmljZSxcbiAgICBwcml2YXRlIGdlbmVyYWxQaXBlOiBHZW5lcmFsUGlwZSxcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICBwcml2YXRlIHJlcG9ydGVGdWVudGVQaXBlOiBSZXBvcnRlRnVlbnRlUGlwZSxcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjYXJnYXJBcmNoaXZvOiBDYXJnYXJBcmNoaXZvc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbmNyaXB0YWRvckFyY2hpdm86IEVuY3JpcHRhZG9CYXNpY29TZXJ2aWNlLFxuICAgIHB1YmxpYyB1dGlsc1NlcnZpY2U6IFV0aWxzU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmdWVudGVQaXBlOiBGdWVudGVQaXBlLFxuICAgIHByaXZhdGUgcmVwb3J0ZUNvbHVtbmFyaW9QaXBlOiBSZXBvcnRlQ29sdW1uYXJpb1BpcGUsXG4gICAgcHJpdmF0ZSByZXBvcnRlU2VydmljZTogRWplY3VjaW9uUmVwb3J0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXNoYm9hcmRTZXJ2aWNlOiBEYXNoYm9hcmRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGFzaGJvYXJkUGlwZTogRGFzaGJvYXJkUGlwZSwpIHtcbiAgICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hcGxpY2FjaW9uID0gdGhpcy5hdXRoU2VydmljZS5nZXRUb2tlbktleSgnYXBsaWNhY2lvbicpXG4gICAgdGhpcy5sbGF2ZUVtcHJlc2EgPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFRva2VuS2V5KCdsbGF2ZUVtcHJlc2EnKTtcbiAgICB0aGlzLmxpc3RhU2lObyA9IHRoaXMuZ2VuZXJhbFBpcGUuTElTVEFfU0lOTztcbiAgICB0aGlzLmxpc3RhVGlwb01hcmNhZG9yQ29sdW1uYXJpbyA9IHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLk1BUEFfVElQT19NQVJDQURPUjtcbiAgICB0aGlzLmxpc3RhVGlwb0NvbHVtbmFzID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuTUFQQV9USVBPX0NPTFVNTkFTO1xuICAgIHRoaXMubGlzdGFPcGVyYWNpb25lc0NvbHVtbmFyaW8gPSB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5NQVBBX09QRVJBQ0lPTkVTX0NPTFVNTkFSSU87XG4gICAgdGhpcy5saXN0YU9wZXJhY2lvbmVzRXhjZWxDb2x1bW5hcmlvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuTUFQQV9PUEVSQUNJT05FU19DT0xVTU5BUklPX0VYQ0VMO1xuICAgIHRoaXMubGlzdGFPcmRlbmFtaWVudG8gPSB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5NQVBBX09SREVOQU1JRU5UTztcbiAgICB0aGlzLmxpc3RhU2VwYXJhZG9yZXMgPSAgdGhpcy5mdWVudGVQaXBlLkxJU1RBX1NFUEFSQURPUkVTO1xuICAgIHRoaXMubGlzdGFUaXBvTWFyY2Fkb3IgPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX01BUkNBRE9SRVM7XG4gICAgdGhpcy5saXN0YVRpcG9HcmFmaWNvX0pGQyA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTElTVEFfVElQT19HUkFGSUNPX0pGQztcbiAgICB0aGlzLmxpc3RhR3JhZmljbyA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTElTVEFfUkVDVVJTT19HUkFGSUNBO1xuICAgIHRoaXMubGlzdGFHcmFmaWNvU2VuY2lsbG8gPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLlJFQ1VSU09fR1JBRklDQTtcbiAgICB0aGlzLmxpc3RhQWxpbmVhY2lvbiA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTElTVEFfQUxJTkVBQ0lPTjtcbiAgICB0aGlzLmxpc3RhT3BlcmFjaW9uZXMgPSB0aGlzLmdlbmVyYWxQaXBlLk1BUEFPUEVSQUNJT05FUztcbiAgICB0aGlzLmxpc3RhVGlwb01hcmNhZG9yVGV4dG8gPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLlRJUE9NQVJDQURPUkVTVEVYVE87XG4gICAgdGhpcy5saXN0YVRpcG9NYXJjYWRvclhNTCA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTElTVEFfTUFSQ0FET1JFU19YTUw7XG4gICAgdGhpcy5saXN0YVRpcG9HcmFmaWNvID0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5MSVNUQV9USVBPX0dSQUZJQ087XG4gICAgdGhpcy5jYXJnYXIoKTtcbiAgICB0aGlzLmNhcmdhckZvcm1NYXJjYWRvckV4Y2VsKCk7XG4gICAgdGhpcy5jYXJnYXJGb3JtTWFyY2Fkb3IoKTtcbiAgICB0aGlzLmNhcmdhckZvcm1EaW5hbWljbygpO1xuICAgIHRoaXMuYWdyZWdhclN1YnNjcmlwY2lvbmVzKCk7XG4gICAgLy90aGlzLmNhcmdhckxpc3RhcygpO1xuXG4gIH1cblxuICBuZ09uRGVzdHJveSgpe1xuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMuZm9yRWFjaCgoc3ViKSA9PiB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFncmVnYXJTdWJzY3JpcGNpb25lcygpIHtcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgndGlwbycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRleHRvUmVnaXN0cm9Db250cm9sID0gdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ3RleHRvUmVnaXN0cm8nKTtcbiAgICAgICAgY29uc3Qgb3JpZ2VuQ29udHJvbCA9IHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCdvcmlnZW4nKTtcbiAgICAgICAgaWYgKCF2YWx1ZSl7XG4gICAgICAgICAgdGhpcy5lc0ltYWdlbkZpamEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZXNNYXJjYWRvciA9IHRydWU7XG4gICAgICAgICAgb3JpZ2VuQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICB0ZXh0b1JlZ2lzdHJvQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChbJ01BJ10uaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5lc0ltYWdlbkZpamEgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmVzTWFyY2Fkb3IgPSB0cnVlO1xuICAgICAgICAgIHRleHRvUmVnaXN0cm9Db250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgb3JpZ2VuQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChbJ0lGJ10uaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5lc0ltYWdlbkZpamEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZXNNYXJjYWRvciA9IGZhbHNlO1xuICAgICAgICAgIG9yaWdlbkNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICB0ZXh0b1JlZ2lzdHJvQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB9XG4gICAgICAgIHRleHRvUmVnaXN0cm9Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgb3JpZ2VuQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG8nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnZW50cmEgYSB0aXBvOiAnKVxuICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSlcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpcG8gPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5NQVJDQURPUlRBQkxBKXtcbiAgICAgICAgIC8vIHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsID0gJ04nXG4gICAgICAgICAvLyB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpZW5lU3FsJykuc2V0VmFsdWUoJ04nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMucHVzaChcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgnb3JpZ2VuJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yLm9yaWdlbiA9IHZhbHVlO1xuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpZW5lU3FsJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2VudHJhIGEgdGllbmVTcWw6ICcpXG4gICAgICAgIGNvbnNvbGUubG9nKHZhbHVlKVxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGllbmVTcWwgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvR3JhZmljbycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvR3JhZmljbyA9IHZhbHVlO1xuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgnb3JpZ2VuJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKFsnVSddLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwub3JpZ2VuID0gJ1UnXG4gICAgICAgIH0gZWxzZSBpZiAoWydDJ10uaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbC5vcmlnZW4gPSAnQycgICAgICAgIFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXG4gICAgICB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCd0aXBvQ2FtcG8nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyA9IHZhbHVlO1xuICAgICAgICBjb25zdCByZXN1bHRhZG9YQ29udHJvbCA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ3Jlc3VsdGFkb1gnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0YWRvWUNvbnRyb2wgPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCdyZXN1bHRhZG9ZJyk7ICBcbiAgICAgICAgaWYgKHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5ICE9ICdkZXRhbGxlJykge1xuICAgICAgICAgIHJlc3VsdGFkb1hDb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgcmVzdWx0YWRvWUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRhZG9YQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICByZXN1bHRhZG9ZQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgfSBcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG1hcmNhZG9yQ29udHJvbCA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ21hcmNhZG9yJyk7XG4gICAgICAgIGNvbnN0IGZpbHRyb0NvbnRyb2wgPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCdmaWx0cm8nKTtcbiAgICAgICAgY29uc3QgdGlwb0RhdG9Db250cm9sID0gdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldCgndGlwb0RhdG8nKTtcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09ICdUJykge1xuICAgICAgICAgIG1hcmNhZG9yQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgIGZpbHRyb0NvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgdGlwb0RhdG9Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hcmNhZG9yQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBmaWx0cm9Db250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgdGlwb0RhdG9Db250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cbiAgICAgICAgbWFyY2Fkb3JDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgZmlsdHJvQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRpcG9EYXRvQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICByZXN1bHRhZG9YQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICByZXN1bHRhZG9ZQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB9KSxcbiAgICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ3RpcG9EYXRvJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvRGF0byA9IHZhbHVlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjYW1iaWFyVGFiKGV2ZW50KXtcbiAgICBzd2l0Y2ggKGV2ZW50LmluZGV4KSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHRoaXMuY2FyZ2FyKCk7XG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFzRXhjZWwoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCk7XG4gICAgICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvID09ICdOJyl7XG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRoaXMudmFsaWRhckV4aXN0ZUphc3BlcigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXNUZXh0bygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YXNUYWJsYSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVhNTCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgdGhpcy5jYXJnYXJSZXBvcnRlQ29sdW1uYXJpbygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgdGhpcy5jYXJnYXJHcmFmaWNhc0NvbHVtbmFzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY2FyZ2FyTGlzdGFzVGFibGEoKXtcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCB7YnVzY2FyT3JkZW5UYWJsYTogJ1MnLCBvcmRlbmFyVGFibGE6ICdTJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMubGlzdGFUYWJsYSA9IGRhdGE7XG4gICAgfSlcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCB7YnVzY2FyT3JkZW5UYWJsYTogJ04nLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5saXN0YU5vVGFibGEgPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBjYXJnYXJMaXN0YU1hcmNhZG9yZXMoKXtcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge3RpcG9SZXBvcnRlOiAnUCcsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmxpc3RhTWFyY2Fkb3JlcyA9IGRhdGE7XG4gICAgfSkgICAgXG4gIH1cblxuICBjYXJnYXJMaXN0YXNFeGNlbCgpe1xuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgbnVsbCwgZmFsc2UsIHtvcmRlbkV4Y2VsOiAnUycsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmxpc3RhRXhjZWwgPSBkYXRhO1xuICAgIH0pXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge29yZGVuRXhjZWw6ICdOJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMubGlzdGFOb0V4Y2VsID0gZGF0YTtcbiAgICB9KVxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7dGlwb1JlcG9ydGU6ICdFJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMubGlzdGFNYXJjYWRvckV4Y2VsID0gZGF0YTtcbiAgICB9KVxuICB9XG5cbiAgY2FyZ2FyTGlzdGFDb2x1bW5hcygpe1xuICAgIHRoaXMubGlzdGFDb2x1bW5hcyA9IFtdO1xuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5saXN0YUNvbHVtbmFzID0gZGF0YTtcbiAgICB9KVxuICB9XG5cbiAgY2FyZ2FyTGlzdGFzKCl7XG4gICAgdGhpcy5saXN0YVRpcG9DaWZyYWRvID0gW107XG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnRW5jcmlwY2lvbkFyY2hpdm9EVE8nLCBudWxsLCBmYWxzZSwge30pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmxpc3RhVGlwb0NpZnJhZG8gPSBkYXRhO1xuICAgIH0pXG4gICAgdGhpcy5jYXJnYXJMaXN0YUNvbHVtbmFzKCk7XG4gIH1cblxuICBjYXJnYXJGb3JtTWFyY2Fkb3JFeGNlbCgpe1xuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGRlc2NyaXBjaW9uOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbC5kZXNjcmlwY2lvbiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMCldKSxcbiAgICAgIG1hcmNhZG9yOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbC5tYXJjYWRvciwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKV0pLFxuICAgICAgdGlwbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwudGlwbywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIHRleHRvUmVnaXN0cm86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLnRleHRvUmVnaXN0cm8pLFxuICAgICAgb3JpZ2VuOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbC5vcmlnZW4pLFxuICAgICAgLy9jYW1wb3MgYmRcbiAgICAgIGxsYXZlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbC5sbGF2ZSksXG4gICAgICByZXBvcnRlRnVlbnRlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlKSxcbiAgICAgIHRpcG9SZXBvcnRlOiBuZXcgRm9ybUNvbnRyb2woJ0UnKSBcbiAgICB9KVxuICB9XG5cbiAgY2FyZ2FyRm9ybU1hcmNhZG9yKCl7XG4gICAgdGhpcy5mb3JtTWFyY2Fkb3IgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGRlc2NyaXBjaW9uOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZGVzY3JpcGNpb24sIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDApXSksXG4gICAgICB0aXBvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGlwbywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIG1hcmNhZG9yOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IubWFyY2Fkb3IsIFtWYWxpZGF0b3JzLm1heExlbmd0aCg1MCldKSxcbiAgICAgIHRhYmxhOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGFibGEpLFxuICAgICAgb3JpZ2VuOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3Iub3JpZ2VuKSxcbiAgICAgIHRleHRvUmVnaXN0cm86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci50ZXh0b1JlZ2lzdHJvKSxcbiAgICAgIHJlcG9ydGVDb2x1bW5hOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IucmVwb3J0ZUNvbHVtbmEpLFxuICAgICAgZm9ybWF0bzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmZvcm1hdG8pLFxuICAgICAgYW5jaG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5hbmNobyksXG4gICAgICBhbHRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYWx0byksXG4gICAgICBncnVwbzE6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5ncnVwbzEpLFxuICAgICAgZ3J1cG8yOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZ3J1cG8yKSxcbiAgICAgIGdydXBvMzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmdydXBvMyksXG4gICAgICBmaW5hbEdydXBvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZmluYWxHcnVwbyksXG4gICAgICB0aWVuZVNxbDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsKSxcbiAgICAgIHF1ZXJ5OiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IucXVlcnkpLFxuICAgICAgZnVlbnRlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZnVlbnRlKSxcbiAgICAgIHRpcG9HcmFmaWNvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY28pLFxuICAgICAgbWFyY2Fkb3JHcmFmaWNvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IubWFyY2Fkb3JHcmFmaWNvKSxcbiAgICAgIHRpdHVsb3g6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci50aXR1bG94KSxcbiAgICAgIHRpdHVsb3k6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci50aXR1bG95KSxcbiAgICAgIGJhbmRhOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYmFuZGEpLFxuICAgICAgYW5jaG9KYXNwZXJMYWJlbDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmFuY2hvSmFzcGVyTGFiZWwpLFxuICAgICAgZmlsdHJvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZmlsdHJvKSxcbiAgICAgIC8vY2FtcG9zIGJkXG4gICAgICBsbGF2ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlKSxcbiAgICAgIHJlcG9ydGVGdWVudGU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUpLFxuICAgICAgdGlwb1JlcG9ydGU6IG5ldyBGb3JtQ29udHJvbCgnTicpIFxuICAgIH0pXG4gIH1cblxuICBjYXJnYXJGb3JtRGluYW1pY28oKXtcbiAgICB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHRpcG9DYW1wbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgdGlwb0RhdG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9EYXRvKSxcbiAgICAgIGZpbHRybzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZmlsdHJvKSxcbiAgICAgIG1hcmNhZG9yOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvciksXG4gICAgICBhbHRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5hbHRvLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgZm9ybWF0bzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZm9ybWF0byksXG4gICAgICBkZXNjcmlwY2lvbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZGVzY3JpcGNpb24pLFxuICAgICAgYW5jaG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmFuY2hvLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgYW5jaG9KYXNwZXJMYWJlbDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYW5jaG9KYXNwZXJMYWJlbCksXG4gICAgICByZXN1bHRhZG9YOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXN1bHRhZG9YICksXG4gICAgICByZXN1bHRhZG9ZOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXN1bHRhZG9ZICksXG4gICAgICB0aXR1bG94OiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXR1bG94KSxcbiAgICAgIHRpdHVsb3k6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpdHVsb3kpLFxuICAgICAgdGlwb1JlcG9ydGU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9SZXBvcnRlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgdGlwb0dyYWZpY286IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9HcmFmaWNvKSwgICAgICBcbiAgICAgIG9wZXJhY2lvbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ub3BlcmFjaW9uKSwgICAgICBcbiAgICAgIC8vY2FtcG9zIHRhYmxhXG4gICAgICBvcmlnZW46IG5ldyBGb3JtQ29udHJvbCgnRCcpLFxuICAgICAgYmFuZGE6IG5ldyBGb3JtQ29udHJvbCh0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleSksXG4gICAgICByZXBvcnRlRnVlbnRlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlKSxcbiAgICAgIGxsYXZlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSksXG5cbiAgICB9KVxuICB9XG5cbiAgY2FyZ2FyKCl7XG4gICAgdGhpcy5leGlzdGVKYXNwZXIgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmxsYXZlUmVwb3J0ZSl7XG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JPYmplY3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUZ1ZW50ZURUTycsIG51bGwsIGZhbHNlLCB7bGxhdmU6IHRoaXMubGxhdmVSZXBvcnRlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICB0aGlzLnJlcG9ydGVGdWVudGUgPSBkYXRhO1xuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFzRXhjZWwoKTtcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhcygpO1xuICAgICAgICB9KVxuICAgICAgfVxuICB9XG5cbiAgcHVibGljIGFjdHVhbGl6YXIoKXtcbiAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlKXtcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVGdWVudGVEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlRnVlbnRlKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XG4gICAgICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvID09ICdOJyl7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmd1YXJkYXJSZXBvcnRlKHRoaXMucmVwb3J0ZUZ1ZW50ZSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLnJlcG9ydGVGdWVudGUgPSBkYXRhO1xuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvYnRlbmVyQXJjaGl2byhldmVudCl7XG4gICAgdGhpcy5yZXBvcnRlRnVlbnRlLmFyY2hpdm9Ub2RvID0gZXZlbnQuZGF0YVxuICB9XG5cbiAgb2J0ZW5lckFyY2hpdm9NYXJjYWRvckV4Y2VsKGV2ZW50KXtcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvci50ZXh0b1JlZ2lzdHJvID0gZXZlbnQuZGF0YVxuICB9XG5cbiAgb2J0ZW5lckFyY2hpdm9NYXJjYWRvcihldmVudCl7XG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyA9IGV2ZW50LmRhdGFcbiAgfVxuXG4gIG9idGVuZXJBcmNoaXZvUGxhbmlsbGEoZXZlbnQpe1xuICAgIHRoaXMucmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvSW5kaXZpZHVhbCA9IGV2ZW50LmRhdGFcbiAgfVxuXG4gIG9idGVuZXJBcmNoaXZvU29wb3J0ZShldmVudCwgc29wb3J0ZSl7XG4gICAgc29wb3J0ZS5hcmNoaXZvSW5kaXZpZHVhbCA9IGV2ZW50LmRhdGFcbiAgfVxuXG4gIG9idGVuZXJBcmNoaXZvQ29sdW1uYXJpbyhldmVudCl7XG4gICAgdGhpcy5yZXBvcnRlRnVlbnRlLmFyY2hpdm9FeGNlbENvbHVtbmFyaW8gPSBldmVudC5kYXRhXG4gIH1cblxuXG4gIG1vdmVyQUFzb2NpYWRvKGV2ZW50KXtcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcbiAgICAgIGxpc3RhQXNvY2lhZG86IHRoaXMubGlzdGFFeGNlbCxcbiAgICAgIGV4Y2VsOiB0cnVlXG4gICAgfSkuc3Vic2NyaWJlKGRhdGEgPT4ge3RoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSX1ZBUklPUyl9KVxuICB9XG5cbiAgbW92ZXJBRGVzYXNvY2lhZG8oZXZlbnQpe1xuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuYWN0dWFsaXphclJlcG9ydGVDb2x1bW5hT3JkZW4oe1xuICAgICAgbGlzdGFEZXNhc29jaWFkbzogdGhpcy5saXN0YU5vRXhjZWwsXG4gICAgICBleGNlbDogdHJ1ZVxuICAgICB9KS5zdWJzY3JpYmUoZGF0YSA9PiB7dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVJfVkFSSU9TKX0pXG4gIH1cblxuICBtb3ZlckFBc29jaWFkb1RhYmxhKGV2ZW50KXtcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcbiAgICAgIGxpc3RhQXNvY2lhZG86IHRoaXMubGlzdGFUYWJsYSxcbiAgICAgIGV4Y2VsOiBmYWxzZVxuICAgIH0pLnN1YnNjcmliZShkYXRhID0+IHt0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUl9WQVJJT1MpfSlcbiAgfVxuXG4gIG1vdmVyQURlc2Fzb2NpYWRvVGFibGEoZXZlbnQpe1xuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuYWN0dWFsaXphclJlcG9ydGVDb2x1bW5hT3JkZW4oe1xuICAgICAgbGlzdGFEZXNhc29jaWFkbzogdGhpcy5saXN0YU5vVGFibGEsXG4gICAgICBleGNlbDogZmFsc2VcbiAgICAgfSkuc3Vic2NyaWJlKGRhdGEgPT4ge3RoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSX1ZBUklPUyl9KVxuICB9XG5cbiAgcmVvcmRlclRhYmxhKGV2ZW50KXtcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcbiAgICAgIGxpc3RhQXNvY2lhZG86IHRoaXMubGlzdGFUYWJsYSxcbiAgICAgIGV4Y2VsOiBmYWxzZVxuICAgICB9KS5zdWJzY3JpYmUoZGF0YSA9PiB7dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVJfVkFSSU9TKX0pXG4gIH1cblxuICB2ZXJEZXRhbGxlTWFyY2Fkb3JFeGNlbChldmVudCl7XG4gICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5yZXNldCgpO1xuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckV4Y2VsID0gdHJ1ZTtcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsID0gZXZlbnQuZGF0YTtcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbClcbiAgfVxuXG4gIG51ZXZvTWFyY2Fkb3JFeGNlbCgpe1xuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwucmVzZXQoKTtcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JFeGNlbCA9IHRydWU7XG4gICAgdGhpcy5lc01hcmNhZG9yID0gZmFsc2U7XG4gICAgdGhpcy5lc0ltYWdlbkZpamEgPSBmYWxzZTtcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XG4gICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5wYXRjaFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwpXG4gICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ3RpcG8nKS5zZXRWYWx1ZShudWxsKVxuICB9XG5cbiAgZ3VhcmRhck1hcmNhZG9yRXhjZWwoKXtcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yRXhjZWwgPSB0cnVlO1xuICAgIGlmICh0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnZhbGlkKXtcbiAgICAgIGxldCBsbGF2ZVJlZ2lzdHJvID0gIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCdsbGF2ZScpLnZhbHVlXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgncmVwb3J0ZUZ1ZW50ZScpLnNldFZhbHVlKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSlcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCd0aXBvUmVwb3J0ZScpLnNldFZhbHVlKCdFJylcbiAgICAgIGlmIChsbGF2ZVJlZ2lzdHJvKXtcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwudmFsdWUpKS5zdWJzY3JpYmUoIGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcbiAgICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge3RpcG9SZXBvcnRlOiAnRScsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RhTWFyY2Fkb3JFeGNlbCA9IGRhdGE7XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCdsbGF2ZScpLnNldFZhbHVlKHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpKVxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwudmFsdWUpKS5zdWJzY3JpYmUoIGRhdGEgPT4geyAgXG4gICAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSBmYWxzZSAgICAgIFxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcbiAgICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge3RpcG9SZXBvcnRlOiAnRScsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RhTWFyY2Fkb3JFeGNlbCA9IGRhdGE7XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JFeGNlbCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoa2V5KS5lcnJvcnMpIHtcbiAgICAgICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldChrZXkpLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gXG4gIH1cblxuICBlbGltaW5hck1hcmNhZG9yRXhjZWwoZXZlbnQpe1xuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwpKS5zdWJzY3JpYmUoZGF0YSA9PntcbiAgICAgICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnJlc2V0KCk7XG4gICAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKVxuICAgICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7dGlwb1JlcG9ydGU6ICdFJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMubGlzdGFNYXJjYWRvckV4Y2VsID0gZGF0YTtcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgXG4gIH1cblxuICAvL3BsYW50aWxsYVxuXG4gIGNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvcigpIHtcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgeyByZXBvcnRlTWFyY2Fkb3I6IHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMubGlzdGFDYW1wb3NNYXJjYWRvciA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvckFzeW5jKCkge1xuICAgIHRoaXMuYmxvcXVlYXJDYW1wb01hcmNhZG9yID0gZmFsc2U7XG4gICAgdGhpcy5saXN0YUNhbXBvc01hcmNhZG9yID0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIHsgcmVwb3J0ZU1hcmNhZG9yOiB0aGlzLnJlcG9ydGVNYXJjYWRvci5sbGF2ZX0pKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHZlckRldGFsbGVNYXJjYWRvcihldmVudCl7XG4gICAgLy90aGlzLmZvcm1NYXJjYWRvci5yZXNldCgpO1xuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvciA9IHRydWU7XG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IgPSBldmVudC5kYXRhO1xuICAgIHRoaXMuZm9ybU1hcmNhZG9yLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3IpXG4gICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvJykuc2V0VmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGlwbylcbiAgICBcbiAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvcigpO1xuICB9XG5cbiAgbnVldm9NYXJjYWRvcigpe1xuICAgIC8vdGhpcy5mb3JtTWFyY2Fkb3IucmVzZXQoKTtcbiAgICB0aGlzLmZvcm1NYXJjYWRvci5yZXNldCh7fSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yID0gdHJ1ZTtcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvciA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xuICAgIHRoaXMuZm9ybU1hcmNhZG9yLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3IpXG4gICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvUmVwb3J0ZScpLnNldFZhbHVlKCdQJylcbiAgICAvL3RoaXMuZm9ybU1hcmNhZG9yLmdldCgndGlwbycpLnNldFZhbHVlKG51bGwpXG4gIH1cblxuICBndWFyZGFyTWFyY2Fkb3IoKXtcbiAgICBpZiAodGhpcy5mb3JtTWFyY2Fkb3IudmFsaWQpe1xuICAgICAgbGV0IGxsYXZlUmVnaXN0cm8gPSAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCdsbGF2ZScpLnZhbHVlXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3JlcG9ydGVGdWVudGUnKS5zZXRWYWx1ZSh0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUpXG4gICAgICAvL3RoaXMuZm9ybU1hcmNhZG9yLmdldCgndGlwb1JlcG9ydGUnKS5zZXRWYWx1ZSgnTicpXG4gICAgICBpZiAobGxhdmVSZWdpc3Rybyl7XG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLmZvcm1NYXJjYWRvci52YWx1ZSkpLnN1YnNjcmliZSggZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCk7XG4gICAgICAgICAgaWYgKHRoaXMucmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm8gPT0gJ04nKXtcbiAgICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgnbGxhdmUnKS5zZXRWYWx1ZSh0aGlzLnV0aWxzU2VydmljZS5nZW5lcmFyTGxhdmUoKSlcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLmZvcm1NYXJjYWRvci52YWx1ZSkpLnN1YnNjcmliZSggZGF0YSA9PiB7ICAgICAgICAgIFxuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvciA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3JlcygpO1xuICAgICAgICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvID09ICdOJyl7XG4gICAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKVxuICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtTWFyY2Fkb3IuY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KGtleSkuZXJyb3JzKSB7XG4gICAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KGtleSkubWFya0FzRGlydHkoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBcbiAgfVxuXG4gIGVsaW1pbmFyTWFyY2Fkb3IoZXZlbnQpe1xuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXG4gICAgICBhY2NlcHQ6ICgpID0+IHsgXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVNYXJjYWRvcikpLnN1YnNjcmliZShkYXRhID0+e1xuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUilcbiAgICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci5yZXNldCgpO1xuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvciA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXMoKTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZWxpbWluYXJDYW1wb01hcmNhZG9yKGV2ZW50LCBvYmpldG8peyBcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxuICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBvYmpldG8pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvcigpO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBudWV2b0NhbXBvVGFibGEoKXtcbiAgICB0aGlzLnZlclJlcG9ydGVNYXJjYWRvckRldGFsbGUgPSB0cnVlO1xuICAgIHRoaXMuYmxvcXVlYXJDYW1wb01hcmNhZG9yID0gdHJ1ZTtcbiAgICB0aGlzLmNhbXBvTWFyY2Fkb3JJbnNlcnRhciA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpO1xuICAgIHRoaXMuY2FtcG9NYXJjYWRvckluc2VydGFyLnJlcG9ydGVNYXJjYWRvciA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlXG4gIH1cblxuICB2YWxpZGFyQ2FtcG9NYXJjYWRvcihjYW1wb01hcmNhZG9yKXtcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvci5jb2x1bW5hKVxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9yLmNhbXBvRnVlbnRlKVxuICAgIHJldHVybiB2YWxpZGFkb3I7XG4gIH1cblxuICBlZGl0YXJDYW1wb01hcmNhZG9yKCkge1xuICAgIHRoaXMuYmxvcXVlYXJDYW1wb01hcmNhZG9yID0gdHJ1ZTtcbiAgfVxuXG4gIGFncmVnYXJDYW1wb01hcmNhZG9yKGNhbXBvTWFyY2Fkb3Ipe1xuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wbyA9IHRydWU7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXJDYW1wb01hcmNhZG9yKGNhbXBvTWFyY2Fkb3IpKXtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FtcG9NYXJjYWRvci5yZXBvcnRlTWFyY2Fkb3IgPSB0aGlzLnJlcG9ydGVNYXJjYWRvci5sbGF2ZTtcbiAgICBpZiAoJ0knID09IGNhbXBvTWFyY2Fkb3IudGlwbyl7XG4gICAgICBpZiAoIWNhbXBvTWFyY2Fkb3IuYW5jaG8gfHwgY2FtcG9NYXJjYWRvci5hbmNobyA9PSAwKXtcbiAgICAgICAgY2FtcG9NYXJjYWRvci5hbmNobyA9IDEwO1xuICAgICAgfVxuICAgICAgaWYgKCFjYW1wb01hcmNhZG9yLmFsdG8gfHwgY2FtcG9NYXJjYWRvci5hbHRvID09IDApe1xuICAgICAgICBjYW1wb01hcmNhZG9yLmFsdG8gPSAxMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFsnRyddLmluY2x1ZGVzKGNhbXBvTWFyY2Fkb3IudGlwbykpe1xuICAgICAgY2FtcG9NYXJjYWRvci5jb2x1bW5hID0gMDtcbiAgICB9XG4gICAgaWYgKGNhbXBvTWFyY2Fkb3IubGxhdmUpe1xuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIGNhbXBvTWFyY2Fkb3IpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcbiAgICAgICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvID0gZmFsc2U7XG4gICAgICAgIGNhbXBvTWFyY2Fkb3IgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWw7XG4gICAgICAgIHRoaXMuYmxvcXVlYXJDYW1wb01hcmNhZG9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yKCk7XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBjYW1wb01hcmNhZG9yLmxsYXZlID0gdGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCk7XG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIGNhbXBvTWFyY2Fkb3IpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcbiAgICAgICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvID0gZmFsc2U7XG4gICAgICAgIGNhbXBvTWFyY2Fkb3IgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWw7XG4gICAgICAgIHRoaXMudmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhbXBvTWFyY2Fkb3JJbnNlcnRhciA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpO1xuICAgICAgICB0aGlzLmJsb3F1ZWFyQ2FtcG9NYXJjYWRvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvcigpO1xuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjYXJnYXJMaXN0YVNvcG9ydGVzKCl7XG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVNvcG9ydGVEVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgdGlwbzogJ1MnfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMubGlzdGFTb3BvcnRlcyA9IGRhdGE7XG4gICB9KVxuICB9XG5cbiAgYXN5bmMgY2FyZ2FyTGlzdGFTb3BvcnRlc0FzeW5jKCl7XG4gICAgdGhpcy5saXN0YVNvcG9ydGVzID0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVNvcG9ydGVEVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgdGlwbzogJ1MnfSkpLnRvUHJvbWlzZSgpXG4gIH1cblxuICBudWV2b1NvcG9ydGUoKXtcbiAgICB0aGlzLnNvcG9ydGVJbmdyZXNhciA9IG5ldyBSZXBvcnRlU29wb3J0ZU1vZGVsKCk7XG4gICAgdGhpcy52ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSB0cnVlO1xuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IHRydWU7XG4gIH1cblxuICBjYW5jZWxhclNvcG9ydGUoKSB7XG4gICAgdGhpcy5zb3BvcnRlSW5ncmVzYXIgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbCgpO1xuICAgIHRoaXMudmVyU29wb3J0ZUFyY2hpdm9EZXRhbGxlID0gZmFsc2U7XG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XG4gIH1cblxuICB2YWxpZGFyU29wb3J0ZShzb3BvcnRlKXtcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZS5kZXNjcmlwY2lvbilcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZS5hcmNoaXZvSW5kaXZpZHVhbClcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xuICB9XG5cbiAgYWdyZWdhclNvcG9ydGUoc29wb3J0ZSl7XG4gICAgdGhpcy5jbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2byA9IHRydWU7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXJTb3BvcnRlKHNvcG9ydGUpKXtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXNvcG9ydGUubGxhdmVUYWJsYSl7XG4gICAgICBzb3BvcnRlLnRpcG8gPSAnUydcbiAgICAgIHNvcG9ydGUucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZVxuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHNvcG9ydGUpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcbiAgICAgICAgc29wb3J0ZSA9IG5ldyBSZXBvcnRlU29wb3J0ZU1vZGVsO1xuICAgICAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXMoKTtcbiAgICAgICAgdGhpcy52ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2byA9IGZhbHNlO1xuICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHNvcG9ydGUpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlcygpO1xuICAgICAgICAgIHRoaXMudmVyU29wb3J0ZUFyY2hpdm9EZXRhbGxlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2byA9IGZhbHNlO1xuICAgICAgICAgIHNvcG9ydGUgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbDtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xuICB9XG5cbiAgZWxpbWluYXJTb3BvcnRlKGV2ZW50LCBzb3BvcnRlKXtcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSB0cnVlO1xuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXG4gICAgICBhY2NlcHQ6ICgpID0+IHsgXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHNvcG9ydGUpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXMoKTtcbiAgICAgICAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgaW5pY2lhckVkaWNpb24oKSB7XG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGNhbmNlbGFyRWRpY2lvbigpIHsgXG4gICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzQXN5bmMoKTsgICBcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcbiAgICBcbiAgfVxuICBcbiAgLy9SZXBvcnRlIERpbmFtaWNvXG5cbiAgZ2VuZXJhckphc3Blcigpe1xuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuZ2VuZXJhckphc3Blcih0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsICdjb21wZW5zYWNpb24vUmVwb3J0ZXNCYXNlJykgLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YSkgPT4ge1xuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2VzcygnU2UgaGEgZ2VuZXJhZG8gZWwgamFzcGVyIGV4aXRvc2FtZW50ZScpXG4gICAgICAgIHRoaXMudmFsaWRhckV4aXN0ZUphc3BlcigpO1xuICAgICAgfVxuICAgIH0pOyAgICBcbiAgfVxuXG5cbiAgZGVzY2FyZ2FySmFzcGVyKCkge1xuXG4gICAgbGV0IHByb3BpZWRhZCA9ICdydXRhX3BsYW50aWxsYXMnO1xuICAgIC8vUnV0YSBhcmNoaXZvXG4gICAgdGhpcy5hcGxpY2FjaW9uID0gdGhpcy5hdXRoU2VydmljZS5nZXRUb2tlbktleSgnYXBsaWNhY2lvbicpXG4gICAgdGhpcy5jYXJnYXJBcmNoaXZvLmRlc2NhcmdhckFyY2hpdm8odGhpcy5lbmNyaXB0YWRvckFyY2hpdm8uZW5jcmlwdGFyKCdyZXBvcnRlcy8nICsgdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlICsgJy5qcnhtbCcpLCBwcm9waWVkYWQsIHRoaXMuYXBsaWNhY2lvbikuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGJsb2IgPT4ge1xuICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgY29uc3Qgb2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgYS5ocmVmID0gb2JqZWN0VXJsXG4gICAgICBhLmRvd25sb2FkID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlICsgJy5qcnhtbCcgLy9kb2N1bWVudG8uYXJjaGl2b29yaWdlbjtcbiAgICAgIGEuY2xpY2soKTtcbiAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwob2JqZWN0VXJsKTtcbiAgICB9XG4gIH0pO1xuICB9XG5cbiAgbnVldm9NYXJjYWRvckRpbmFtaWNvKCl7XG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbFxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ub3JpZ2VuID0gJ0QnXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYSA9IHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5XG4gICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLnJlc2V0KCk7XG4gICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbylcbiAgICB0aGlzLm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSB0cnVlXG4gIH1cblxuICB2ZXJNYXJjYWRvckRpbmFtaWNvKGV2ZW50KXtcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gZXZlbnQuZGF0YTtcbiAgICB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28ucGF0Y2hWYWx1ZSh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvKVxuICAgIHRoaXMubnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IHRydWU7XG4gIH1cblxuICBhc3luYyB2ZXJCYW5kYShldmVudCl7XG4gICAgdGhpcy52ZXJUYWJCYW5kYSA9IGZhbHNlO1xuICAgIHRoaXMuYmFuZGFTZWxlY2Npb25hZGEgPSBldmVudC5kYXRhO1xuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWw7XG4gICAgdGhpcy5udWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gZmFsc2U7XG4gICAgdGhpcy5udWV2YUJhbmRhID0gZmFsc2U7XG4gICAgaWYgKFsnZGV0YWxsZScsJ3N1bW1hcnknXS5pbmNsdWRlcyh0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleSkpe1xuICAgICAgYXdhaXQgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yRGluYW1pY28oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXBvcnRlQmFuZGEgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yT2JqZWN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVCYW5kYURUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBiYW5kYTogdGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXl9KSkudG9Qcm9taXNlKCk7XG4gICAgICBpZiAoIXRoaXMucmVwb3J0ZUJhbmRhKSB7XG4gICAgICAgIHRoaXMubnVldmFCYW5kYSA9IHRydWU7XG4gICAgICAgIGlmIChbJ2RldGFsbGUnLCdzdW1tYXJ5J10uaW5jbHVkZXModGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXkpKXtcbiAgICAgICAgICB0aGlzLm51ZXZhQmFuZGEgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlcG9ydGVCYW5kYSA9IG5ldyBSZXBvcnRlQmFuZGFNb2RlbDtcbiAgICAgICAgdGhpcy5yZXBvcnRlQmFuZGEudG90YWxlcyA9ICdTJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yRGluYW1pY28oKVxuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLnNsZWVwKDI1KVxuICAgIHRoaXMudmVyVGFiQmFuZGEgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgY2FyZ2FyTGlzdGFNYXJjYWRvckRpbmFtaWNvKCl7XG4gICAgdGhpcy5saXN0YU1hcmNhZG9yRGluYW1pY28gPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge1xuICAgICAgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBcbiAgICAgIGJhbmRhOiB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleSxcbiAgICAgIG9yZGVuRGluYW1pY286ICdTJyxcbiAgICAgIG9yaWdlbjogJ0QnXG4gICAgfSkpLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgZ3VhcmRhckNhcmFjdGVyaXN0aWNhQmFuZGEoKXtcbiAgICBpZih0aGlzLm51ZXZhQmFuZGEpIHtcbiAgICAgIHRoaXMucmVwb3J0ZUJhbmRhLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmU7XG4gICAgICB0aGlzLnJlcG9ydGVCYW5kYS5iYW5kYSA9IHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5O1xuICAgICAgdGhpcy5yZXBvcnRlQmFuZGEgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUJhbmRhRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZUJhbmRhKSkudG9Qcm9taXNlKCk7XG4gICAgfWVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUJhbmRhRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZUJhbmRhKSkudG9Qcm9taXNlKCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2xlZXAoMjUpXG4gICAgdGhpcy5udWV2YUJhbmRhPWZhbHNlO1xuICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKFwiU2UgYWN0dWFsaXphcm9uIGxhcyBjYXJhY3RlcmlzdGljYXMgZGUgXCIrdGhpcy5iYW5kYVNlbGVjY2lvbmFkYS52YWx1ZSk7XG4gIH1cblxuICBhc3luYyBndWFyZGFyQ29sdW1uYURpbmFtaWNvKCl7XG4gICAgaWYgKCF0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28udmFsaWQpIHtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmNvbnRyb2xzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldChrZXkpLmVycm9ycykge1xuICAgICAgICAgICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldChrZXkpLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby52YWx1ZTtcbiAgICBpZih0aGlzLnV0aWxzU2VydmljZS5pc0JsYW5rKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUpKXtcbiAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUgPSB0aGlzLnV0aWxzU2VydmljZS5nZW5lcmFyTGxhdmUoKTtcbiAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ub3JpZ2VuID0gJ0QnO1xuICAgICAgaWYodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPT0gJ0MnKXtcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvciA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZmlsdHJvO1xuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnJlcG9ydGVDb2x1bW5hID0gbnVsbDtcbiAgICAgIH1lbHNle1xuICAgICAgICB2YXIgY29sdW1uYSA9IG5ldyBSZXBvcnRlQ29sdW1uYU1vZGVsKCk7XG4gICAgICAgIGNvbHVtbmEubGxhdmVUYWJsYSA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubWFyY2Fkb3I7XG4gICAgICAgIGNvbHVtbmEgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yT2JqZWN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgbnVsbCwgZmFsc2UsIGNvbHVtbmEpKS50b1Byb21pc2UoKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubWFyY2Fkb3IgPSBjb2x1bW5hLm5vbWJyZTtcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXBvcnRlQ29sdW1uYSA9IGNvbHVtbmEubGxhdmVUYWJsYTtcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5maWx0cm8gPSBjb2x1bW5hLnNpbnRheGlzO1xuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9EYXRvID0gY29sdW1uYS50aXBvRGF0bztcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbykpLnRvUHJvbWlzZSgpO1xuICAgIH1lbHNle1xuICAgICAgaWYodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPT0gJ0MnKXtcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvciA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZmlsdHJvO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28pKS50b1Byb21pc2UoKTtcbiAgICB9XG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IG51bGw7XG4gICAgdGhpcy5udWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gZmFsc2U7XG4gICAgYXdhaXQgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yRGluYW1pY28oKVxuICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKCdTZSBoYSBndWFyZGFkbyBlbCBjYW1iaW8nKTtcbiAgfVxuXG4gIHJlZ3Jlc2FyQmFuZGFTZWxlY2Npb25hZGEoKXtcbiAgICB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhID0ge2tleTogbnVsbCwgdmFsdWU6IG51bGx9XG4gIH1cblxuICBhc3luYyBlbGltaW5hckNvbHVtbmFEaW5hbWljbyhldmVudCkge1xuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXG4gICAgICBhY2NlcHQ6IGFzeW5jICgpID0+ICB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvICkpLnRvUHJvbWlzZSgpO1xuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKVxuICAgICAgICB0aGlzLm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yRGluYW1pY28oKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICB2YWxpZGFyU2VwYXJhZG9yKCl7XG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMucmVwb3J0ZUZ1ZW50ZS5zZXBhcmFkb3IpO1xuICAgIHJldHVybiB2YWxpZGFkb3I7XG4gIH1cblxuICBhY3R1YWxpemFyU2VwYXJhZG9yKCl7XG4gICAgdGhpcy5jbGlja0d1YXJkYXJSZXBvcnRlVGV4dG8gPSB0cnVlO1xuICAgIGlmICghdGhpcy52YWxpZGFyU2VwYXJhZG9yKCkpe1xuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWN0dWFsaXphcigpO1xuICB9XG5cbiAgY2FyZ2FyTGlzdGFNYXJjYWRvcmVzVGV4dG8oKXtcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge1xuICAgICAgdGlwb1JlcG9ydGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuUkVQT1JURUFSQ0hJVk9QTEFOTyxcbiAgICAgIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSxcbiAgICAgIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0lcbiAgICB9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5saXN0YU1hcmNhZG9yZXNUZXh0byA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIHZlck1hcmNhZG9yVGV4dG8oZXZlbnQpe1xuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclRleHRvID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmNhZG9yVGV4dG8gPSBldmVudC5kYXRhO1xuICB9XG5cbiAgbnVldm9NYXJjYWRvclRleHRvKCl7XG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yVGV4dG8gPSB0cnVlO1xuICAgIHRoaXMubWFyY2Fkb3JUZXh0byA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xuXHRcdHRoaXMubWFyY2Fkb3JUZXh0by50aXBvUmVwb3J0ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuUkVQT1JURUFSQ0hJVk9QTEFOTztcbiAgfVxuXG4gIHZhbGlkYXJNYXJjYWRvclRleHRvKCkgOiBib29sZWFue1xuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28pO1xuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yVGV4dG8uYWx0byk7XG4gICAgaWYgKHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTUFSQ0FET1JURVhUT0ZJSk8gPT0gdGhpcy5tYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvKXtcbiAgICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yVGV4dG8uZm9ybWF0byk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGVQaXBlLk1BUkNBRE9SVEVYVE9ESU5BTUlDTyA9PSB0aGlzLm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28pe1xuICAgICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JUZXh0by5hbmNobyk7XG4gICAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclRleHRvLnJlcG9ydGVDb2x1bW5hKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcbiAgfVxuXG4gIGFzeW5jIGd1YXJkYXJNYXJjYWRvclRleHRvKCl7XG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvclRleHRvID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMudmFsaWRhck1hcmNhZG9yVGV4dG8oKSkge1xuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG8gPSBmYWxzZTtcbiAgICB0aGlzLm1hcmNhZG9yVGV4dG8ucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcbiAgICBpZiAodGhpcy5tYXJjYWRvclRleHRvLmxsYXZlKXtcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yVGV4dG8pKS50b1Byb21pc2UoKTtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXJjYWRvclRleHRvLmxsYXZlID0gdGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCk7XG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JUZXh0bykpLnRvUHJvbWlzZSgpO1xuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xuICAgIH1cbiAgICB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3Jlc1RleHRvKCk7XG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yVGV4dG8gPSBmYWxzZTtcbiAgfVxuXG4gIGVsaW1pbmFyTWFyY2Fkb1RleHRvKGV2ZW50KXtcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxuICAgICAgYWNjZXB0OiBhc3luYyAoKSA9PiAge1xuICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvclRleHRvKSkudG9Qcm9taXNlKCk7XG4gICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclRleHRvID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWFyY2Fkb3JUZXh0byA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xuICAgICAgICB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3Jlc1RleHRvKCk7XG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY2FyZ2FyTGlzdGFYTUwoKXtcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge1xuICAgICAgdGlwb1JlcG9ydGU6ICdYJyxcbiAgICAgIG9yaWdlbjogJ1gnLFxuICAgICAgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLFxuICAgICAgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSVxuICAgIH0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmxpc3RhWE1MID0gZGF0YTtcbiAgICB9KVxuICB9XG5cbiAgbnVldm9NYXJjYWRvclhNTCgpe1xuICAgIHRoaXMubWFyY2Fkb3JYTUwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcbiAgICB0aGlzLm1hcmNhZG9yWE1MLnRpcG9SZXBvcnRlID0gJ1gnO1xuICAgIHRoaXMubWFyY2Fkb3JYTUwub3JpZ2VuID0gJ1gnO1xuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclhNTCA9IHRydWU7XG4gIH1cblxuICB2ZXJNYXJjYWRvclhNTChldmVudCl7XG4gICAgdGhpcy5tYXJjYWRvclhNTCA9IGV2ZW50LmRhdGE7XG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yWE1MID0gdHJ1ZTtcbiAgICBpZiAgKHRoaXMubWFyY2Fkb3JYTUwudGlwbyA9PSAnTVInIHx8IHRoaXMubWFyY2Fkb3JYTUwudGlwbyA9PSAnVEInKXtcbiAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MKCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhck1hcmNhZG9yWE1MKCl7XG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JYTUwuZGVzY3JpcGNpb24pO1xuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yWE1MLnRpcG8pO1xuICAgIHJldHVybiB2YWxpZGFkb3JcbiAgfVxuXG4gIGd1YXJkYXJNYXJjYWRvclhNTCgpe1xuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUwgPSB0cnVlO1xuICAgIGlmICghdGhpcy52YWxpZGFyTWFyY2Fkb3JYTUwoKSl7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWFyY2Fkb3JYTUwucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcbiAgICBpZiAodGhpcy5tYXJjYWRvclhNTC5sbGF2ZSl7XG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvclhNTCkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xuICAgICAgICB0aGlzLm1hcmNhZG9yWE1MID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XG4gICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclhNTCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhcmdhckxpc3RhWE1MKCk7XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcmNhZG9yWE1MLmxsYXZlID0gdGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCk7XG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JYTUwpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcbiAgICAgICAgdGhpcy5tYXJjYWRvclhNTCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xuICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JYTUwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVhNTCgpO1xuICAgICAgfSlcbiAgICB9XG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvclhNTCA9IGZhbHNlO1xuICB9XG5cbiAgZWxpbWluYXJNYXJjYWRvclhNTChldmVudCl7XG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcbiAgICAgIGFjY2VwdDogYXN5bmMgKCkgPT4gIHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JYTUwpKS50b1Byb21pc2UoKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcbiAgICAgICAgdGhpcy5tYXJjYWRvclhNTCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xuICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JYTUwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVhNTCgpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBudWV2b0NhbXBvVGFibGFYTUwoKXtcbiAgICB0aGlzLnZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVYTUwgPSB0cnVlO1xuICAgIHRoaXMuY2FtcG9NYXJjYWRvckluc2VydGFyWE1MID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsKCk7XG4gICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwucmVwb3J0ZU1hcmNhZG9yID0gdGhpcy5tYXJjYWRvclhNTC5sbGF2ZVxuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IHRydWU7XG4gIH1cblxuICBjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JYTUwoKSB7XG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIHsgcmVwb3J0ZU1hcmNhZG9yOiB0aGlzLm1hcmNhZG9yWE1MLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMubGlzdGFDYW1wb3NNYXJjYWRvclhNTCA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTEFzeW5jKCkge1xuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xuICAgIHRoaXMubGlzdGFDYW1wb3NNYXJjYWRvclhNTCA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCB7IHJlcG9ydGVNYXJjYWRvcjogdGhpcy5tYXJjYWRvclhNTC5sbGF2ZX0pKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHZhbGlkYXJDYW1wb01hcmNhZG9yWE1MKGNhbXBvTWFyY2Fkb3Ipe1xuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9yLmNhbXBvRnVlbnRlKTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvci5tYXJjYWRvcik7XG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcbiAgfVxuXG4gIGFncmVnYXJDYW1wb01hcmNhZG9yWE1MKGNhbXBvOiBSZXBvcnRlVGFibGFNb2RlbCl7XG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMudmFsaWRhckNhbXBvTWFyY2Fkb3JYTUwoY2FtcG8pKXtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY2FtcG8ubGxhdmUpe1xuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIGNhbXBvKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XG4gICAgICAgIHRoaXMuY2FtcG9NYXJjYWRvckluc2VydGFyWE1MID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsKCk7XG4gICAgICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTCgpO1xuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY2FtcG8uY29sdW1uYSA9IDA7XG4gICAgICBjYW1wby5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBjYW1wbykpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xuICAgICAgICBjYW1wbyA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpO1xuICAgICAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JYTUwoKTtcbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTCA9IGZhbHNlO1xuICAgIHRoaXMudmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZVhNTCA9IGZhbHNlO1xuICB9XG5cbiAgZWxpbWluYXJDYW1wb01hcmNhZG9yWE1MKGV2ZW50LCBvYmpldG8peyBcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxuICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBvYmpldG8pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTCgpO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjYW1iaWFyVGFiQ29sdW1uYXJpbyhldmVudCl7XG4gICAgc3dpdGNoIChldmVudC5pbmRleCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB0aGlzLmNhcmdhclJlcG9ydGVDb2x1bW5hcmlvKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICB0aGlzLmNhcmdhckRhdG9zQWRpY2lvbmFsZXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRoaXMuY2FyZ2FyTWFyY2Fkb3Jlc0NvbHVtbmFyaW8oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY2FyZ2FyTWFyY2Fkb3Jlc0NvbHVtbmFyaW8oKSB7XG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMubWFyY2Fkb3Jlc0NvbHVtbmFyaW8gPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuXG4gIGNhcmdhckRhdG9zQWRpY2lvbmFsZXMoKSB7XG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgZmlsdHJvQ29sdW1uYUJhc2ljYTogJ04nfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMuY29sdW1uYXNBZGljaW9uYWxlcyA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIGNhcmdhclJlcG9ydGVDb2x1bW5hcmlvKCl7XG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgZmlsdHJvQ29sdW1uYUJhc2ljYTogJ1MnfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMubGlzdGFSZXBvcnRlQ29sdW1uYXJpbyA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIGNhcmdhckdyYWZpY2FzQ29sdW1uYXMoKSB7XG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLnBhZ2luYWRvckNvbHVtbmFzID0gZGF0YTtcbiAgICB9KVxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVCYW5kYURUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCB0b3RhbGVzOiAnQyd9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5wYWdpbmFkb3JDb2xvcmVzR3JhZmljYSA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIHZhbGlkYXJFeGlzdGVKYXNwZXIoKXtcbiAgICB0aGlzLmNhcmdhckFyY2hpdm8uZGVzY2FyZ2FyQXJjaGl2byh0aGlzLmVuY3JpcHRhZG9yQXJjaGl2by5lbmNyaXB0YXIoJ3JlcG9ydGVzLycgKyB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUgKyAnLmpyeG1sJyksICdydXRhX3BsYW50aWxsYXMnLCB0aGlzLmFwbGljYWNpb24pLnN1YnNjcmliZShcbiAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLmV4aXN0ZUphc3BlciA9IHRydWU7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuZXhpc3RlSmFzcGVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgKSBcbiAgfVxuXG4gIHZlclJlcG9ydGVDb2x1bW5hcmlvKGV2ZW50KXtcbiAgICB0aGlzLmNvbHVtbmFCYXNpY2EgPSBldmVudC5kYXRhO1xuICAgIHRoaXMudmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpbyA9IHRydWU7XG4gIH1cblxuICBudWV2b0NvbHVtbmFCYXNpY2EoKXtcbiAgICB0aGlzLmNvbHVtbmFCYXNpY2EgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xuICAgIHRoaXMuY29sdW1uYUJhc2ljYS5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlO1xuICAgIHRoaXMudmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpbyA9IHRydWU7XG4gIH1cblxuICB2YWxpZGFyQ29sdW1uYUJhc2ljYSgpe1xuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm5vbWJyZSk7XG4gICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2EudGlwbyk7XG4gICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2EucmVwb3J0ZUNvbHVtbmEpO1xuICAgIGlmICh2YWxpZGFkb3Ipe1xuICAgICAgaWYgKHRoaXMuaXNNb3N0cmFyT3JkZW4oKSl7XG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm9yZGVuKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzTW9zdHJhck9yZGVuQ29uc3VsdGEoKSl7XG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm9yZGVuQ29uc3VsdGEpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ0VMREEgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG8pIHtcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DT0xVTU5BPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG8pIHtcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uSG9yaXpvbnRhbCk7XG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm9wZXJhY2lvblZlcnRpY2FsKTtcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2EuY29sdW1uYU9wZXJhY2lvblZlcnRpY2FsKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19MQUJFTCA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbykge1xuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcmRlckJ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcbiAgfVxuXG4gIGFzeW5jIHZlcmlmaWNhckNvbHVtbmFzVmFsaWRhcyhyZXBvcnRlQ29sdW1uYXJpb0RUTyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHZhciB0aXBvPXJlcG9ydGVDb2x1bW5hcmlvRFRPLnRpcG87XG5cdFx0aWYodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19GSUxBID09IHJlcG9ydGVDb2x1bW5hcmlvRFRPLnRpcG8pe1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHZhciBmaWx0cm89bmV3ICBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XG5cdFx0ZmlsdHJvLnJlcG9ydGVGdWVudGUgPSByZXBvcnRlQ29sdW1uYXJpb0RUTy5yZXBvcnRlRnVlbnRlO1xuXHRcdGZpbHRyby5kaWZlcmVudGVDb2x1bW5hcmlvID0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8ubGxhdmVUYWJsYTtcblx0XHRmaWx0cm8udGlwbyA9IHRpcG87XG5cdFx0dmFyIGNhbnRpZGFkPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNhbnRpZGFkUmVnaXN0cm9zKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIGZpbHRybykpLnRvUHJvbWlzZSgpO1xuXHRcdGlmKGNhbnRpZGFkPT0wKXtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZih0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NPTFVNTkEgPT0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8udGlwbyl7XG5cdFx0XHRcdHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dXYXJuaW5nKFwiRWwgcmVwb3J0ZSBzb2xvIHB1ZWRlIGNvbnRlbmVyIDEgcmVnaXN0cm8gY29uIHRpcG8gXCIrdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DT0xVTU5BX0RFU0MpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG5cdFx0fWVsc2UgaWYodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DRUxEQSA9PSByZXBvcnRlQ29sdW1uYXJpb0RUTy50aXBvKXtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dXYXJuaW5nKFwiRWwgcmVwb3J0ZSBzb2xvIHB1ZWRlIGNvbnRlbmVyIDEgcmVnaXN0cm8gY29uIHRpcG8gXCIrdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DRUxEQV9ERVNDKTtcbiAgICAgIHJldHVybiBmYWxzZTtcblx0XHR9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBndWFyZGFyQ29sdW1uYUJhc2ljYSgpe1xuICAgIHRoaXMuY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW8gPSB0cnVlO1xuICAgIGlmICghdGhpcy52YWxpZGFyQ29sdW1uYUJhc2ljYSgpKXtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgaWYgKGF3YWl0IHRoaXMudmVyaWZpY2FyQ29sdW1uYXNWYWxpZGFzKHRoaXMuY29sdW1uYUJhc2ljYSkpe1xuICAgICAgaWYgKHRoaXMuY29sdW1uYUJhc2ljYS5sbGF2ZVRhYmxhKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUJhc2ljYSkpLnRvUHJvbWlzZSgpO1xuICAgICAgICB0aGlzLmNvbHVtbmFCYXNpY2EgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xuICAgICAgICB0aGlzLnZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUJhc2ljYSkpLnRvUHJvbWlzZSgpO1xuICAgICAgICB0aGlzLmNvbHVtbmFCYXNpY2EgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xuICAgICAgICB0aGlzLnZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xuICAgICAgfVxuICAgICAgdGhpcy5jbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpbyA9IGZhbHNlO1xuICAgICAgdGhpcy5jYXJnYXJSZXBvcnRlQ29sdW1uYXJpbygpO1xuICAgIH1cbiAgfVxuXG4gIGVsaW1pbmFyQ29sdW1uYUJhc2ljYShldmVudCl7IFxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5jb2x1bW5hQmFzaWNhKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XG4gICAgICAgICAgdGhpcy52ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jb2x1bW5hQmFzaWNhID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcbiAgICAgICAgICB0aGlzLmNhcmdhclJlcG9ydGVDb2x1bW5hcmlvKCk7XG4gICAgICAgIH0pXG4gICAgICAgIFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBudWV2YUNvbHVtbmFBZGljaW9uYWwoKSB7XG4gICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcbiAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcbiAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwudGlwbyA9IHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQURJQ0lPTkFMO1xuICAgIHRoaXMudmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gdHJ1ZTtcbiAgfVxuXG4gIHZlckRldGFsbGVBZGljaW9uYWwoZXZlbnQpIHtcbiAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwgPSBldmVudC5kYXRhO1xuICAgIHRoaXMudmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gdHJ1ZTtcbiAgfVxuXG4gIHZhbGlkYXJDb2x1bW5hQWRpY2lvbmFsKCkge1xuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFBZGljaW9uYWwubm9tYnJlKTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQWRpY2lvbmFsLnNpbnRheGlzKTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQWRpY2lvbmFsLm9yZGVuKTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQWRpY2lvbmFsLm9yZGVyQnkpO1xuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFBZGljaW9uYWwub3JkZW5Db25zdWx0YSk7XG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcbiAgfVxuXG4gIGFzeW5jIGd1YXJkYXJDb2x1bW5hQWRpY2lvbmFsKCkge1xuICAgIHRoaXMuY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbCA9IHRydWU7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXJDb2x1bW5hQWRpY2lvbmFsKCkpe1xuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb2x1bW5hQWRpY2lvbmFsLmxsYXZlVGFibGEpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUFkaWNpb25hbCkpLnRvUHJvbWlzZSgpO1xuICAgICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcbiAgICAgIHRoaXMudmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gZmFsc2U7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB0aGlzLmNvbHVtbmFBZGljaW9uYWwpKS50b1Byb21pc2UoKTtcbiAgICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbCA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XG4gICAgICB0aGlzLnZlck51ZXZvQ29sdW1uYUFkaWNpb25hbCA9IGZhbHNlO1xuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xuICAgIH1cbiAgICB0aGlzLmNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTtcbiAgICB0aGlzLmNhcmdhckRhdG9zQWRpY2lvbmFsZXMoKTtcbiAgfVxuXG4gIGVsaW1pbmFyQ29sdW1uYUFkaWNpb25hbChldmVudCkge1xuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5jb2x1bW5hQWRpY2lvbmFsKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XG4gICAgICAgICAgdGhpcy52ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xuICAgICAgICAgIHRoaXMuY2FyZ2FyRGF0b3NBZGljaW9uYWxlcygpO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBudWV2b01hcmNhZG9yQ29sdW1uYXJpbygpIHtcbiAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbyA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yTW9kZWwoKTtcbiAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpby5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlO1xuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW8gPSB0cnVlO1xuICB9XG5cbiAgdmVyRGV0YWxsZU1hcmNhZG9yQ29sdW1uYXJpbyhldmVudCkge1xuICAgIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvID0gZXZlbnQuZGF0YTtcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gdHJ1ZTtcbiAgfVxuXG4gIHZhbGlkYXJNYXJjYWRvckNvbHVtbmFyaW8oKSB7XG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvLm1hcmNhZG9yKTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvckNvbHVtbmFyaW8udGlwbyk7XG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvLnRleHRvUmVnaXN0cm8pO1xuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yQ29sdW1uYXJpby5kZXNjcmlwY2lvbik7XG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcbiAgfVxuXG4gIGFzeW5jIGd1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW8oKSB7XG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW8gPSB0cnVlO1xuICAgIGlmICghdGhpcy52YWxpZGFyTWFyY2Fkb3JDb2x1bW5hcmlvKCkpe1xuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXJjYWRvckNvbHVtbmFyaW8ubGxhdmVUYWJsYSkge1xuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbykpLnRvUHJvbWlzZSgpO1xuICAgICAgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8gPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsKCk7XG4gICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvKSkudG9Qcm9taXNlKCk7XG4gICAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbyA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yTW9kZWwoKTtcbiAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW8gPSBmYWxzZTtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcbiAgICB9XG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW8gPSBmYWxzZTtcbiAgICB0aGlzLmNhcmdhck1hcmNhZG9yZXNDb2x1bW5hcmlvKCk7XG4gIH1cblxuICBlbGltaW5hck1hcmNhZG9yQ29sdW1uYXJpbyhldmVudCkge1xuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbykpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW8gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbyA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yTW9kZWwoKTtcbiAgICAgICAgICB0aGlzLmNhcmdhck1hcmNhZG9yZXNDb2x1bW5hcmlvKCk7XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBndWFyZGFyR3JhZmljbygpIHtcbiAgICB0aGlzLmFjdHVhbGl6YXIoKTtcbiAgICB0aGlzLnBhZ2luYWRvckNvbHVtbmFzLmZvckVhY2goZGF0YSA9PiB7XG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCBkYXRhKSkuc3Vic2NyaWJlKGRhdGEgPT4ge30pXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdmVyR3JhZmljbygpIHtcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLnZlckdyYWZpY28oe2xsYXZlUmVwb3J0ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgbGV0IGNvbHVtbmEgPSB0aGlzLmRhc2hib2FyZFNlcnZpY2UuY2FyZ2FyR3JhZmljYSh7YWNjaW9uOiBkYXRhLnRpcG9HcmFmaWNvLCBkYXRvc0dyYWZpY2E6IGRhdGF9KTtcbiAgICAgIHRoaXMuZ3JhZmljYSA9IGNvbHVtbmE7XG4gICAgICB0aGlzLnV0aWxzU2VydmljZS5zbGVlcCg1MDApLnRoZW4oZGF0YTIgPT4ge1xuICAgICAgICB0aGlzLmRpdkdyYWZpY2EubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7XG4gICAgICB9KVxuICAgICAgbGV0IHJlc3B1ZXN0YSA9IHRoaXMuZGFzaGJvYXJkUGlwZS5USVBPX0dSQUZJQ09fQ0hBUlQuZmlsdGVyKGRhdGEgPT4gZGF0YS5jb2RpZ28gPT0gY29sdW1uYS5kYXRvc0dyYWZpY2EudGlwb0dyYWZpY28pO1xuICAgICAgaWYgKHJlc3B1ZXN0YS5sZW5ndGggPCAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbHVtbmEudGlwb0dyYWZpY28gPSByZXNwdWVzdGFbMF0uY29kaWdvQ2hhcnQ7XG4gICAgICB0aGlzLnRpcG9HcmFmaWNhID0gIGNvbHVtbmEudGlwb0dyYWZpY287XG4gICAgICBjb25zb2xlLmxvZyh0aGlzLnRpcG9HcmFmaWNhKVxuICAgIH0pXG4gIH1cblxuICBudWV2b0NvbG9yQ2F0ZWdvcmlhKCl7XG4gICAgdGhpcy5jb2xvckNhdGVnb3JpYSA9IG5ldyBSZXBvcnRlQmFuZGFNb2RlbCgpO1xuICAgIHRoaXMuY29sb3JDYXRlZ29yaWEuYmFuZGEgPSAnI0ZGRkZGRic7XG4gICAgdGhpcy52ZXJDb2xvckNhdGVnb3JpYURldGFsbGUgPSB0cnVlO1xuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IHRydWU7XG4gIH1cblxuICBjYW5jZWxhckNvbG9yQ2F0ZWdvcmlhKCkge1xuICAgIHRoaXMuY29sb3JDYXRlZ29yaWEgPSBuZXcgUmVwb3J0ZUJhbmRhTW9kZWwoKTtcbiAgICB0aGlzLnZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZSA9IGZhbHNlO1xuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xuICB9XG5cbiAgdmFsaWRhckNvbG9yQ2F0ZWdvcmlhKGNvbG9yKXtcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3IudGl0dWxvKVxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvci5iYW5kYSlcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xuICB9XG5cbiAgYWdyZWdhckNvbG9yQ2F0ZWdvcmlhKGNvbG9yKXtcbiAgICB0aGlzLmNsaWNrR3VhcmRhckNvbG9yQ2F0ZWdvcmlhID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMudmFsaWRhckNvbG9yQ2F0ZWdvcmlhKGNvbG9yKSl7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFjb2xvci5sbGF2ZVRhYmxhKXtcbiAgICAgIGNvbG9yLnRvdGFsZXMgPSAnQydcbiAgICAgIGNvbG9yLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmVcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQmFuZGFEVE8nLCBudWxsLCBmYWxzZSwgY29sb3IpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcbiAgICAgICAgY29sb3IgPSBuZXcgUmVwb3J0ZUJhbmRhTW9kZWwoKTtcbiAgICAgICAgdGhpcy5jYXJnYXJHcmFmaWNhc0NvbHVtbmFzKCk7XG4gICAgICAgIHRoaXMudmVyQ29sb3JDYXRlZ29yaWFEZXRhbGxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWEgPSBmYWxzZTtcbiAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQmFuZGFEVE8nLCBudWxsLCBmYWxzZSwgY29sb3IpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xuICAgICAgICAgIHRoaXMuY2FyZ2FyR3JhZmljYXNDb2x1bW5hcygpO1xuICAgICAgICAgIHRoaXMudmVyQ29sb3JDYXRlZ29yaWFEZXRhbGxlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYSA9IGZhbHNlO1xuICAgICAgICAgIGNvbG9yID0gbmV3IFJlcG9ydGVCYW5kYU1vZGVsKCk7XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcbiAgfVxuXG4gIGVsaW1pbmFyQ29sb3JDYXRlZ29yaWEoZXZlbnQsIGNvbG9yKXtcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSB0cnVlO1xuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXG4gICAgICBhY2NlcHQ6ICgpID0+IHsgXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVCYW5kYURUTycsIG51bGwsIGZhbHNlLCBjb2xvcikpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xuICAgICAgICAgIHRoaXMuY2FyZ2FyR3JhZmljYXNDb2x1bW5hcygpO1xuICAgICAgICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBjYW5jZWxhckVkaWNpb25Db2xvcigpIHsgXG4gICAgdGhpcy5jYXJnYXJHcmFmaWNhc0NvbHVtbmFzKCk7ICAgXG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgaXNGaWpvKCk6Ym9vbGVhbntcbiAgICByZXR1cm4gdGhpcy5maWx0cm9PcmlnZW5GdWVudGUodGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5GSUpPKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1NxbCgpOmJvb2xlYW57XG4gICAgcmV0dXJuIHRoaXMuZmlsdHJvT3JpZ2VuRnVlbnRlKHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuU1FMKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBQZXJtaXRlIGNvbm9jZXIgc2kgc2UgZGViZSBwcmVzZW50YXIgZW4gbGEgaW50ZXJmYXogbG9zIGNhbXBvcyByZWZlcmVudGVzIGEgb3JkZW4gY29uc3VsdGFcblx0ICogQHJldHVybiBTaSBzZSBkZWJlIG1vc3RyYXIgc2UgcmV0b3JuYXJhIHRydWUsIGRlIGxvIGNvbnRyYXJpbyBmYWxzZVxuXHQgKi9cblx0aXNNb3N0cmFyT3JkZW5Db25zdWx0YSgpe1xuXHRcdHJldHVybiB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0ZJTEEgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG87XG5cdH1cblx0XG5cblx0aXNNb3N0cmFyT3JkZW4oKXtcblx0XHRyZXR1cm4gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19GSUxBID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvfHxcblx0XHRcdFx0dGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DT0xVTU5BID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvfHx0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0xBQkVMID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvO1xuXHR9XG5cblx0aXNUaXBvQ29sdW1uYSgpe1xuXHRcdHJldHVybiB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NPTFVNTkEgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG87XG5cdH1cblx0XG5cblx0aXNUaXBvRmlsYSgpe1xuXHRcdHJldHVybiB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0ZJTEEgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG87XHRcblx0fVxuXG5cdGlzVGlwb0xhYmVsKCl7XG5cdFx0cmV0dXJuIHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fTEFCRUwgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG87XHRcblx0fVxuXG4gIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0Z1ZW50ZSgpOmJvb2xlYW57XG4gICAgcmV0dXJuIHRoaXMuZmlsdHJvT3JpZ2VuRnVlbnRlKHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuRlVFTlRFKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWx0cm9PcmlnZW5GdWVudGUodGlwbzpzdHJpbmcpOmJvb2xlYW57XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0ZUZ1ZW50ZS5vcmlnZW5GdWVudGUgPT0gdGlwbztcbiAgfVxufSIsIjxwLXRhYlZpZXcgKG9uQ2hhbmdlKT1cImNhbWJpYXJUYWIoJGV2ZW50KVwiPlxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J2V4Y2VsJyB8IHRyYW5zbGF0ZSB9fVwiIFtzZWxlY3RlZF09XCJ0cnVlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57eydkZWJlJyB8IHRyYW5zbGF0ZX19IHt7J2luZGljYXInIHwgdHJhbnNsYXRlfX0ge3sncGxhbnRpbGxhJyB8IHRyYW5zbGF0ZX19IHt7J3knIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAge3snaG9qYScgfCB0cmFuc2xhdGV9fSB7eydwYXJhJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydlc3RhJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIHt7J29wY2lvbicgfCB0cmFuc2xhdGV9fSB7eydzZScgfCB0cmFuc2xhdGV9fSB7eydhY3RpdmUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZXBvcnRlRnVlbnRlLmFyY2hpdm9Ub2RvID8gcmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvVG9kbzogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtleHRlbnNpb25lc109XCIneGxzO3hsc3gnXCIgW21vc3RyYXJvYmxpY2FyZ29dPVwidHJ1ZVwiIFtsYWJlbHJhcl09XCIncGxhbnRpbGxhJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0ZWQpPVwib2J0ZW5lckFyY2hpdm8oJGV2ZW50KVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuaG9qYUV4Y2VsXCIgc2l6ZT1cIjI1XCIgbWF4bGVuZ3RoPVwiMjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fSB7eydkZScgfCB0cmFuc2xhdGUgfX0ge3snbGEnIHwgdHJhbnNsYXRlIH19IHt7J2hvamEnIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY2lmcmFkb0V4Y2VsXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHAtcGlja0xpc3QgW3NvdXJjZV09XCJsaXN0YUV4Y2VsXCIgW3RhcmdldF09XCJsaXN0YU5vRXhjZWxcIiBzb3VyY2VIZWFkZXI9XCJBc29jaWFkb1wiIHNvdXJjZUZpbHRlclBsYWNlaG9sZGVyPVwiQXNvY2lhZG9cIlxuICAgICAgICAgICAgdGFyZ2V0SGVhZGVyPVwiRGVzYXNvY2lhZG9cIiBbZHJhZ2Ryb3BdPVwidHJ1ZVwiIFtyZXNwb25zaXZlXT1cInRydWVcIiB0YXJnZXRGaWx0ZXJQbGFjZWhvbGRlcj1cIkRlc2Fzb2NpYWRvXCJcbiAgICAgICAgICAgIGZpbHRlckJ5PVwic2ludGF4aXNcIiAob25Tb3VyY2VSZW9yZGVyKT1cIm1vdmVyQUFzb2NpYWRvKCRldmVudClcIlxuICAgICAgICAgICAgKG9uTW92ZUFsbFRvVGFyZ2V0KT1cIm1vdmVyQURlc2Fzb2NpYWRvKCRldmVudClcIiAob25Nb3ZlQWxsVG9Tb3VyY2UpPVwibW92ZXJBQXNvY2lhZG8oJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Nb3ZlVG9UYXJnZXQpPVwibW92ZXJBRGVzYXNvY2lhZG8oJGV2ZW50KVwiIChvbk1vdmVUb1NvdXJjZSk9XCJtb3ZlckFBc29jaWFkbygkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWV4Y2VsIHBUZW1wbGF0ZT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3tleGNlbC5ub21icmV9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtcGlja0xpc3Q+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+e3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fTwvaDE+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvTWFyY2Fkb3JFeGNlbCgpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSBmYWxzZVwiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YU1hcmNhZG9yRXhjZWxcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgW3NlbGVjdGlvbl09XCJyZXBvcnRlTWFyY2Fkb3JFeGNlbFwiIFtyb3dzXT1cIjEwXCJcbiAgICAgICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cImxpc3RhTWFyY2Fkb3JFeGNlbC5sZW5ndGhcIiBbcGFnaW5hdG9yXT1cImxpc3RhTWFyY2Fkb3JFeGNlbC5sZW5ndGggPiAxMFwiXG4gICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlckRldGFsbGVNYXJjYWRvckV4Y2VsKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1tYXJjYWRvcj5cbiAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJtYXJjYWRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY2Fkb3IuZGVzY3JpcGNpb259fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCI+IFxuICAgICAgICAgICAgICAgIDxhcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+PC9hcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+ICAgICAgICAgICAgPC9wLXRhYmxlPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBtdC0zXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yRXhjZWxcIj5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtdC0zXCI+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYm9va1wiPjwvaT57eydkZXRhbGxlJyB8IHRyYW5zbGF0ZX19PC9oNT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtNCBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtTWFyY2Fkb3JFeGNlbFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgcC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcGNpb25cIiBzaXplPVwiMjVcIiBtYXhsZW5ndGg9XCI0MDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JcIiBzaXplPVwiMjVcIiBtYXhsZW5ndGg9XCI0MDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiW3tsYWJlbDogJ0ltYWdlbiBGaWphJywgdmFsdWU6ICdJRid9LCB7bGFiZWw6ICdNYXJjYWRvcicsIHZhbHVlOiAnTUEnfV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwidGlwb1wiIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwbycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIiBbaGlkZGVuXT1cImVzSW1hZ2VuRmlqYVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiAgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwidGV4dG9SZWdpc3Ryb1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndmFsb3InIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cImVzTWFyY2Fkb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiW3tsYWJlbDogJ1VuaWNhJywgdmFsdWU6ICdVJ30sIHtsYWJlbDogJ0NhZGEgRW1wcmVzYScsIHZhbHVlOiAnQyd9XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJvcmlnZW5cIiBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yaWdlbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwiZXNNYXJjYWRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRleHRvUmVnaXN0cm9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInJlcG9ydGVNYXJjYWRvckV4Y2VsLnRleHRvUmVnaXN0cm8gPyByZXBvcnRlTWFyY2Fkb3JFeGNlbC50ZXh0b1JlZ2lzdHJvOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXh0ZW5zaW9uZXNdPVwiJ2pwZztwbmcnXCIgKG9uU2VsZWN0ZWQpPVwib2J0ZW5lckFyY2hpdm9NYXJjYWRvckV4Y2VsKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BpZWRhZF09XCIncnV0YV9yZWN1cnNvcydcIiAgW2xhYmVscmFyXT1cIigncmVjdXJzb3MnIHwgdHJhbnNsYXRlKVwiIFtsYWJlbGFyY2hdPVwiJ3JlY3Vyc28nIHwgdHJhbnNsYXRlXCIgW21vc3RyYXJYXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vc3RyYXJvYmxpY2FyZ29dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYm9vbGVhbm9dPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhyZXBvcnRlTWFyY2Fkb3JFeGNlbC50ZXh0b1JlZ2lzdHJvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckV4Y2VsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbmV4b1Byb3BpZWRhZF09XCJyZXBvcnRlTWFyY2Fkb3JFeGNlbC5vcmlnZW4gPT0nQycgPyBsbGF2ZUVtcHJlc2E6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9waWVkYWREZVNpc3RlbWFdPVwidHJ1ZVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yRXhjZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiAgcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3tyZXBvcnRlTWFyY2Fkb3JFeGNlbC5sbGF2ZSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3tyZXBvcnRlTWFyY2Fkb3JFeGNlbC5sbGF2ZSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhck1hcmNhZG9yRXhjZWwoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JFeGNlbC5sbGF2ZSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJNYXJjYWRvckV4Y2VsKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3AtdGFiUGFuZWw+XG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sncGxhbnRpbGxhJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVNpTm9cIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzb3BvcnRlJyB8IHRyYW5zbGF0ZSB9fSB7eyd1bmljbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTaU5vXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmRlc2NhcmdhckZ1ZW50ZVwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZGVzY2FyZ2FyZG9jJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVNpTm9cIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuZ2VuZXJhclBpblwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZ2VuZXJhcnBpbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jYW1wb0FncnVwYWNpb25QbGFuaWxsYVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhZ3J1cGFycG9yJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5ub21icmVBZ3J1cGFjaW9uUGxhbmlsbGFcIiBzaXplPVwiMjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbm9tYnJlYXJjaGl2b2FncnVwYWNpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NpZnJhZG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvUGxhbmlsbGFcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2NpZnJhZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZXBvcnRlRnVlbnRlLmFyY2hpdm9JbmRpdmlkdWFsID8gcmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvSW5kaXZpZHVhbDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbHJhcl09XCInYXJjaGl2bycgfCB0cmFuc2xhdGVcIiBbbGFiZWxhcmNoXT1cIidhcmNoaXZvJyB8IHRyYW5zbGF0ZVwiIFttb3N0cmFyb2JsaWNhcmdvXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvUGxhbmlsbGEoJGV2ZW50KVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlZnJlc2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxwLXRhYlZpZXcgPlxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGUgfX1cIiBbc2VsZWN0ZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZCBtYi0yXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvTWFyY2Fkb3IoKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b01hcmNhZG9yID0gZmFsc2VcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhTWFyY2Fkb3Jlc1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgW3NlbGVjdGlvbl09XCJyZXBvcnRlTWFyY2Fkb3JcIlxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFNYXJjYWRvcmVzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFNYXJjYWRvcmVzLmxlbmd0aCA+IDEwXCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclwiXG4gICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3IoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckRldGFsbGVNYXJjYWRvcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydtYXJjYWRvcicgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtbWFyY2Fkb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cIm1hcmNhZG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY2Fkb3IuZGVzY3JpcGNpb259fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY2Fkb3IudGlwbyB8IHJlcG9ydGVGdWVudGVQaXBlIDogJ2xpc3RhVGlwb0RhdG9NYXJjYWRvcmVzJ319PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci50aXBvID09ICdJRicgPyBtYXJjYWRvci50ZXh0b1JlZ2lzdHJvIDogbWFyY2Fkb3Iubm9tYnJlQ29sdW1uYX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci5tYXJjYWRvcn19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIj4gXG4gICAgICAgICAgICAgICAgPGFwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT48L2FwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1NYXJjYWRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1zZW1pYm9sZFwiPnt7J2luZGlxdWUnIHwgdHJhbnNsYXRlfX0ge3snZW4nIHwgdHJhbnNsYXRlfX0ge3sncXVlJyB8IHRyYW5zbGF0ZX19IHt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlfX0ge3snZGVzZWEnIHwgdHJhbnNsYXRlfX0ge3sncXVlJyB8IHRyYW5zbGF0ZX19IHt7J2FwYXJlemNhJyB8IHRyYW5zbGF0ZX19IHt7J2xhJyB8IHRyYW5zbGF0ZX19IHt7J2luZm9ybWFjaW9uJyB8IHRyYW5zbGF0ZX19LiB7eydsYScgfCB0cmFuc2xhdGV9fSB7eydwcmltZXJhJyB8IHRyYW5zbGF0ZX19IHt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlfX0ge3snZXMnIHwgdHJhbnNsYXRlfX0ge3snbGEnIHwgdHJhbnNsYXRlfX0gMS48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcGNpb25cIiBzaXplPVwiMjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCI0MDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb01hcmNhZG9yXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGlwb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhKFsnTUEnLCdJTScsJ01SJywnSUYnLCdRUicsJ0JDJywnRzEnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbykpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JcIiBzaXplPVwiMjVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnVEInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGFibGFcIiBzaXplPVwiMjVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGFibGEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnSUYnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIlt7bGFiZWw6ICdVbmljYScsIHZhbHVlOiAnVSd9LCB7bGFiZWw6ICdDYWRhIEVtcHJlc2EnLCB2YWx1ZTogJ0MnfV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIGZvcm1Db250cm9sTmFtZT1cIm9yaWdlblwiIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmlnZW4nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ0lGJyB8fCAhcmVwb3J0ZU1hcmNhZG9yLm9yaWdlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0ZXh0b1JlZ2lzdHJvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInJlcG9ydGVNYXJjYWRvci50ZXh0b1JlZ2lzdHJvID8gcmVwb3J0ZU1hcmNhZG9yLnRleHRvUmVnaXN0cm86ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvbmVzXT1cIidqcGc7cG5nJ1wiIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvTWFyY2Fkb3IoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9waWVkYWRdPVwiJ3J1dGFfcmVjdXJzb3MnXCIgW2xhYmVscmFyXT1cIidyZWN1cnNvcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYW5leG9Qcm9waWVkYWRdPVwicmVwb3J0ZU1hcmNhZG9yLm9yaWdlbiA9PSdDJyA/IGxsYXZlRW1wcmVzYTogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGllZGFkRGVTaXN0ZW1hXT1cInRydWVcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ01BJywnSU0nLCdRUicsJ0JDJywnRzEnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIGZvcm1Db250cm9sTmFtZT1cInJlcG9ydGVDb2x1bW5hXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdNQSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJmb3JtYXRvXCIgc2l6ZT1cIjI1XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIVsnSU0nLCdJRicsJ1FSJywnQkMnLCdHMSddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBmb3JtQ29udHJvbE5hbWU9XCJhbmNob1wiIFttYXhsZW5ndGhdPVwiNVwiPiA8L3AtaW5wdXROdW1iZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ0lNJywnSUYnLCdRUicsJ0JDJywnRzEnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgZm9ybUNvbnRyb2xOYW1lPVwiYWx0b1wiIFttYXhsZW5ndGhdPVwiNVwiPiA8L3AtaW5wdXROdW1iZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsdG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnTVInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwiZ3J1cG8xXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZ3J1cG8xJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdNUidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJncnVwbzJcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydncnVwbzInIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnTVInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwiZ3J1cG8zXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZ3J1cG8zJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ01SJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImZpbmFsR3J1cG9cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmaW5hbGdydXBvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ01SJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cInRleHRvUmVnaXN0cm9cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0ZXh0bycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhWydNUicsJ1RCJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIGZvcm1Db250cm9sTmFtZT1cInRpZW5lU3FsXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzcWwnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnVEInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0dyYWZpY29fSkZDXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2dyYWZpY2EnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEoWydNUicsJ1RCJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pICYmIChbJ1MnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGllbmVTcWwpKSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJxdWVyeVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbnN1bHRhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEoWydNUicsJ1RCJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pICYmIChbJ04nXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGllbmVTcWwpKSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFGdWVudGVzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmdWVudGVcIiBvcHRpb25MYWJlbD1cImRlc2NyaXBjaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZnVlbnRlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwiIXJlcG9ydGVNYXJjYWRvci50aXBvR3JhZmljb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIm1hcmNhZG9yR3JhZmljb1wiIHNpemU9XCIyNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydtYXJjYWRvcmdyYWZpY2EnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIVsnQSddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvR3JhZmljbylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXR1bG94XCIgc2l6ZT1cIjI1XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpdHVsbycgfCB0cmFuc2xhdGUgfX0gWDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ0EnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY28pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0dWxveVwiIHNpemU9XCIyNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXR1bG8nIHwgdHJhbnNsYXRlIH19IFk8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cIiFyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY29cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJiYW5kYVwiIHNpemU9XCIyNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2xvcmRpbmFtaWNvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwiIXJlcG9ydGVNYXJjYWRvci50aXBvR3JhZmljb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImFuY2hvSmFzcGVyTGFiZWxcIiBzaXplPVwiMjVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbnVtZXJvY2F0ZWdvcmlhcycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIShbJ01SJywnVEInXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbykgJiYgKFsnTiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aWVuZVNxbCkpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImZpbHRyb1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2ZpbHRybycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZ2x5cGhpY29ucyB7e3JlcG9ydGVNYXJjYWRvci5sbGF2ZSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnIH19XCIgbGFiZWw9XCJ7e3JlcG9ydGVNYXJjYWRvci5sbGF2ZSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ3VhcmRhck1hcmNhZG9yKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLmxsYXZlICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJNYXJjYWRvcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3IgJiYgcmVwb3J0ZU1hcmNhZG9yLmxsYXZlICE9IG51bGwgJiYgKHJlcG9ydGVNYXJjYWRvci50aXBvID09ICdNUicgfHwgcmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJudWV2b0NhbXBvVGFibGEoKVwiIGljb249XCJwaSBwaS1wbHVzXCIgW2Rpc2FibGVkXT1cImJsb3F1ZWFyQ2FtcG9NYXJjYWRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLXJpcHBsZSBwLWVsZW1lbnQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24tc2Vjb25kYXJ5IG1iLTJcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YUNhbXBvc01hcmNhZG9yXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YUNhbXBvc01hcmNhZG9yLmxlbmd0aFwiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YUNhbXBvc01hcmNhZG9yLmxlbmd0aCA+IDEwXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0TW9kZT1cInJvd1wiIGRhdGFLZXk9XCJsbGF2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlO1wiPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJTtcIj57eydjYW1wbycgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlO1wiPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJTtcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCIqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj57eydtZWRpZGFzJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+IDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJUYWJsYU51ZXZvUmVnaXN0cm9cIiAqbmdJZj1cInZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLmNvbHVtbmFcIiBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKTtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY2FtcG9GdWVudGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIuZm9ybWF0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFHcmFmaWNvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIudGlwb1wiIGFwcGVuZFRvPVwiYm9keVwiIFthdXRvWkluZGV4XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIudGlwbyA9PSdJJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIuYW5jaG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLmFsdG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsdG8nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCIgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJDYW1wb01hcmNhZG9yKGNhbXBvTWFyY2Fkb3JJbnNlcnRhcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwidmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZSA9IGZhbHNlOyBibG9xdWVhckNhbXBvTWFyY2Fkb3IgPSBmYWxzZVwiIGljb249XCJwaSBwaS10aW1lc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtY2FtcG8gbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LXJpPVwicm93SW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJjYW1wb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgIHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5jb2x1bW5hXCIgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLmNvbHVtbmEpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8uY29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uY29sdW1uYX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmNhbXBvRnVlbnRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8uY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYW1wby5jYW1wb0Z1ZW50ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5mb3JtYXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uZm9ybWF0b319XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjYW1wby50aXBvXCIgYXBwZW5kVG89XCJib2R5XCIgW2F1dG9aSW5kZXhdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8udGlwbyB8IHJlcG9ydGVGdWVudGVQaXBlIDonbGlzdGFSZWN1cnNvR3JhZmljYSd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2FtcG8udGlwbyA9PSdJJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uYW5jaG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYW5jaG8nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5hbHRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsdG8nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2FtcG8udGlwbyA9PSdJJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snYW5jaG8nIHwgdHJhbnNsYXRlfX06IHt7Y2FtcG8uYW5jaG99fSA8YnIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snYWx0bycgfCB0cmFuc2xhdGV9fToge3tjYW1wby5hbHRvfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDSEVDSyBHVUFSREFSIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwU2F2ZUVkaXRhYmxlUm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ2FtcG9NYXJjYWRvcihjYW1wbylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0FOQ0VMQVIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBDYW5jZWxFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIiAoY2xpY2spPVwiY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yQXN5bmMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVESVRBUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBJbml0RWRpdGFibGVSb3cgW2Rpc2FibGVkXT1cImJsb3F1ZWFyQ2FtcG9NYXJjYWRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcGVuY2lsXCIgKGNsaWNrKT1cImVkaXRhckNhbXBvTWFyY2Fkb3IoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc2Vjb25kYXJ5IG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVMSU1JTkFSIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcERlbGV0ZUVkaXRhYmxlUm93IFtkaXNhYmxlZF09XCJibG9xdWVhckNhbXBvTWFyY2Fkb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiAoY2xpY2spPVwiZWxpbWluYXJDYW1wb01hcmNhZG9yKCRldmVudCxjYW1wbylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLW91dGxpbmVkIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCI+IFxuICAgICAgICAgICAgICAgIDxhcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+PC9hcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+ICAgICAgICAgICAgICAgICAgICA8L3AtdGFibGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3AtdGFiUGFuZWw+XG4gICAgICAgICAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydzb3BvcnRlJyB8IHRyYW5zbGF0ZSB9fSB7eydhcmNoaXZvJyB8IHRyYW5zbGF0ZSB9fXNcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm8gPT0gJ04nXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cIm51ZXZvU29wb3J0ZSgpXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIiBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YVNvcG9ydGVzXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhU29wb3J0ZXMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YVNvcG9ydGVzLmxlbmd0aCA+IDEwXCIgXG4gICAgICAgICAgICAgICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBcbiAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGU9XCJyb3dcIiBkYXRhS2V5PVwibGxhdmVUYWJsYVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDUlXCI+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiA0NSVcIj57eydhcmNoaXZvJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlXCI+IDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiVGFibGFOdWV2b1JlZ2lzdHJvXCIgKm5nSWY9XCJ2ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJzb3BvcnRlSW5ncmVzYXIuZGVzY3JpcGNpb25cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHNvcG9ydGVJbmdyZXNhci5kZXNjcmlwY2lvbikgJiYgY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlSW5ncmVzYXIuZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIiBbbW9zdHJhclhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwic29wb3J0ZUluZ3Jlc2FyLmFyY2hpdm9JbmRpdmlkdWFsID8gc29wb3J0ZUluZ3Jlc2FyLmFyY2hpdm9JbmRpdmlkdWFsOiAnJ1wiIFtsYWJlbGFyY2hdPVwiJ2FyY2hpdm8nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb3N0cmFyTGFiZWxJbnB1dF09XCJmYWxzZVwiIFttb3N0cmFyb2JsaWNhcmdvXT1cInRydWVcIiBbYm9vbGVhbm9dPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlSW5ncmVzYXIuYXJjaGl2b0luZGl2aWR1YWwpICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvU29wb3J0ZSgkZXZlbnQsIHNvcG9ydGVJbmdyZXNhcilcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyU29wb3J0ZShzb3BvcnRlSW5ncmVzYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ2ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSBmYWxzZVwiIGljb249XCJwaSBwaS10aW1lc1wiIChjbGljayk9XCJjYW5jZWxhclNvcG9ydGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1kYW5nZXIgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtc29wb3J0ZSBsZXQtZWRpdGluZz1cImVkaXRpbmdcIiBsZXQtcmk9XCJyb3dJbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwRWRpdGFibGVSb3ddPVwic29wb3J0ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic29wb3J0ZS5kZXNjcmlwY2lvblwiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZS5kZXNjcmlwY2lvbikgJiYgY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzb3BvcnRlLmRlc2NyaXBjaW9ufX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiIFttb3N0cmFyWF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInNvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWwgPyBzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb3N0cmFyTGFiZWxJbnB1dF09XCJmYWxzZVwiICBbYm9vbGVhbm9dPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvU29wb3J0ZSgkZXZlbnQsIHNvcG9ydGUpXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c29wb3J0ZS5hcmNoaXZvSW5kaXZpZHVhbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDSEVDSyBHVUFSREFSIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBTYXZlRWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhclNvcG9ydGUoc29wb3J0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc3VjY2VzcyBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENBTkNFTEFSIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBDYW5jZWxFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIChjbGljayk9XCJjYW5jZWxhckVkaWNpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1kYW5nZXIgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFRElUQVIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBJbml0RWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXBlbmNpbFwiIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCIgKGNsaWNrKT1cImluaWNpYXJFZGljaW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc2Vjb25kYXJ5IG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRUxJTUlOQVIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBEZWxldGVFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiIChjbGljayk9XCJlbGltaW5hclNvcG9ydGUoJGV2ZW50LCBzb3BvcnRlKVwiIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLW91dGxpbmVkIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIj4gXG4gICAgICAgICAgICAgICAgPGFwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT48L2FwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICAgICAgPC9wLXRhYlBhbmVsPlxuICAgICAgICA8L3AtdGFiVmlldz5cbiAgICA8L3AtdGFiUGFuZWw+XG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sncmVwb3J0ZScgfCB0cmFuc2xhdGUgfX0ge3snZGluYW1pY28nIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5kb2JsZUxpbmVhXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkb2JsZWxpbmVhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUudGl0dWxvUGFyYW1ldHJvXCIgc2l6ZT1cIjI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY2lmcmFkb0phc3BlclwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2lmcmFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWQgYmFja2dyb3VuZC0xMDBcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlc3RhcnRcIiAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2dlbmVyYXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiZ2VuZXJhckphc3BlcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImFjdHVhbGl6YXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cInBpIHBpLWRvd25sb2FkXCIgKm5nSWY9XCJleGlzdGVKYXNwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2Rlc2NhcmdhcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJkZXNjYXJnYXJKYXNwZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIG1iLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cImJhbmRhU2VsZWNjaW9uYWRhLmtleVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJyZWdyZXNhckJhbmRhU2VsZWNjaW9uYWRhKClcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J2JhbmRhcycgfCB0cmFuc2xhdGV9fVwiIFxuICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhVGlwb0JhbmRhXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxuICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgW3Jvd3NdPVwiMTBcIlxuICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJsaXN0YVRpcG9CYW5kYS5sZW5ndGhcIiBbcGFnaW5hdG9yXT1cImxpc3RhVGlwb0JhbmRhLmxlbmd0aCA+IDEwXCJcbiAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJCYW5kYSgkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwidmVyQmFuZGEoJGV2ZW50KVwiICpuZ0lmPVwiIWJhbmRhU2VsZWNjaW9uYWRhLmtleVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydiYW5kYScgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWJhbmRhPlxuICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwiYmFuZGFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmFuZGEudmFsdWV9fTwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCI+IFxuICAgICAgICAgICAgICAgIDxhcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+PC9hcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+ICAgICAgICA8L3AtdGFibGU+XG5cbiAgICAgICAgPHAtdGFiVmlldyAqbmdJZj1cImJhbmRhU2VsZWNjaW9uYWRhLmtleSAmJiB2ZXJUYWJCYW5kYVwiPlxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snY2FyYWN0ZXJpc3RpY2FzJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFbJ2RldGFsbGUnLCdzdW1tYXJ5J10uaW5jbHVkZXMoYmFuZGFTZWxlY2Npb25hZGEua2V5KVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVCYW5kYS50b3RhbGVzXCIgPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0b3RhbCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUJhbmRhLnRpdHVsb1wiIG1heGxlbmd0aD1cIjIwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpdHVsbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWZsb3BweS1zYXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiZ3VhcmRhckNhcmFjdGVyaXN0aWNhQmFuZGEoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9wLXRhYlBhbmVsPlxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3tiYW5kYVNlbGVjY2lvbmFkYS52YWx1ZX19XCIgKm5nSWY9XCIhbnVldmFCYW5kYVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG10LTIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJudWV2b01hcmNhZG9yRGluYW1pY28oKVwiIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiICpuZ0lmPVwiIW51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY29cIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhTWFyY2Fkb3JEaW5hbWljb1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCIgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhTWFyY2Fkb3JEaW5hbWljby5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhTWFyY2Fkb3JEaW5hbWljby5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIW51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY29cIlxuICAgICAgICAgICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyTWFyY2Fkb3JEaW5hbWljbygkZXZlbnQpXCIgIChvblJvd1Vuc2VsZWN0KT1cInZlck1hcmNhZG9yRGluYW1pY28oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydiYW5kYScgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydvcmRlbicgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2V0aXF1ZXRhJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snYW5jaG8nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3BlcmFjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1kaW5hbWljbz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwiZGluYW1pY29cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tkaW5hbWljby5iYW5kYX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tkaW5hbWljby5iYW5kYSA/IGRpbmFtaWNvLmFsdG8gOiAnJ319PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tkaW5hbWljby5tYXJjYWRvcn19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tkaW5hbWljby5iYW5kYSA/IGRpbmFtaWNvLmRlc2NyaXBjaW9uIDogJyd9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGEgPyBkaW5hbWljby5mb3JtYXRvIDogJyd9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7WydkZXRhbGxlJ10uaW5jbHVkZXMoZGluYW1pY28uYmFuZGEpID8gZGluYW1pY28uYW5jaG8gOiAnJ319PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tkaW5hbWljby5iYW5kYSA/IGRpbmFtaWNvLm9wZXJhY2lvbiA6ICcnfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPiBcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPjwvYXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XG5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljb1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyICBtYi0yXCI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtc2VtaWJvbGQgbXQtM1wiPnt7J2luZGlxdWUnIHwgdHJhbnNsYXRlfX0ge3snZW4nIHwgdHJhbnNsYXRlfX0ge3sncXVlJyB8IHRyYW5zbGF0ZX19IHt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlfX0ge3snZGVzZWEnIHwgdHJhbnNsYXRlfX0ge3sncXVlJyB8IHRyYW5zbGF0ZX19IHt7J2FwYXJlemNhJyB8IHRyYW5zbGF0ZX19IHt7J2xhJyB8IHRyYW5zbGF0ZX19IHt7J2luZm9ybWFjaW9uJyB8IHRyYW5zbGF0ZX19LiB7eydsYScgfCB0cmFuc2xhdGV9fSB7eydwcmltZXJhJyB8IHRyYW5zbGF0ZX19IHt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlfX0ge3snZXMnIHwgdHJhbnNsYXRlfX0ge3snbGEnIHwgdHJhbnNsYXRlfX0gMS48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gZmFsc2VcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7YmFuZGFTZWxlY2Npb25hZGEudmFsdWV9fVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCIgKm5nSWY9XCJudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtUmVwb3J0ZURpbmFtaWNvXCIgY2xhc3M9XCJwLWZsdWlkIGdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DYW1wb0phc3BlckRpbmFtaWNvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvQ2FtcG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cInZhbHVlXCIgb3B0aW9uVmFsdWU9XCJrZXlcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jYW1wbycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyA9PSdDJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9EYXRvU2ludGF4aXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvRGF0b1wiIG9wdGlvbkxhYmVsPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImtleVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2RhdG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IGZvcm1Db250cm9sTmFtZT1cImFsdG9cIiBtYXhsZW5ndGg9XCI1XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQ29sdW1uYXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtYXJjYWRvclwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUgJiYgcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JcIiBzaXplPVwiMjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlICYmIHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPT0nQydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJmaWx0cm9cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzaW50YXhpcycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZpZWxkc2V0IGNsYXNzPVwiZmllbGRzaW50aXR1bG9cIiAgY2xhc3M9XCJmaWVsZHNpbnRpdHVsb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIGdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNiBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIHRleHQtYmFzZSBtbC0xXCI+e3sncmVzdWx0YWRvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTYgbWItMFwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09J0MnXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTYgbWItMFwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgdGV4dC1iYXNlIG1sLTFcIiA+e3snbGFiZWwnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImZvcm1hdG9cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXBjaW9uXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGl0dWxvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJhbmNob1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnICYmICdkZXRhbGxlJyA9PSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYSBcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnICYmICdkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYSBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJhbmNob0phc3BlckxhYmVsXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYW5jaG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwiJ2RldGFsbGUnICE9IHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmJhbmRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwicmVzdWx0YWRvWFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3gnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQycgJiYgJ2RldGFsbGUnICE9IHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmJhbmRhIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInRpdHVsb3hcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd4JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cIidkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInJlc3VsdGFkb1lcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd5JyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnICYmICdkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYSBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXR1bG95XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sneScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQWxpbmVhY2lvblwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpcG9SZXBvcnRlXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsaW5lYWNpb24nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFBbGluZWFjaW9uXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiA+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbGluZWFjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9EYXRvID09ICdOJyAmJiByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcGVyYWNpb25lc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwib3BlcmFjaW9uXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29wZXJhY2lvbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZpZWxkc2V0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e3JlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7cmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCIgKGNsaWNrKT1cImd1YXJkYXJDb2x1bW5hRGluYW1pY28oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbGltaW5hckNvbHVtbmFEaW5hbWljbygkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9wLXRhYlBhbmVsPlxuICAgICAgICAgICAgXG4gICAgICAgIDwvcC10YWJWaWV3PlxuICAgIDwvcC10YWJQYW5lbD5cbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydyZXBvcnRlJyB8IHRyYW5zbGF0ZSB9fSB7eyd0ZXh0bycgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuYXJjaGl2b1RleHRvXCIgc2l6ZT1cIjUwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMjAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZWFyY2hpdm8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2VwYXJhZG9yZXNcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuc2VwYXJhZG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8ocmVwb3J0ZUZ1ZW50ZS5zZXBhcmFkb3IpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVUZXh0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8ocmVwb3J0ZUZ1ZW50ZS5zZXBhcmFkb3IpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVUZXh0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3NlcGFyYWRvcicgfCB0cmFuc2xhdGUgfX0qPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2lmcmFkb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9UZXh0b1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2lmcmFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlZnJlc2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphclNlcGFyYWRvcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cbiAgICAgICAgICAgIDxoMSBjbGFzcz1cInRleHQteGxcIj57eydtYXJjYWRvcmVzJyB8IHRyYW5zbGF0ZX19PC9oMT5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGZvbnQtc2VtaWJvbGRcIiBpY29uPVwicGkgcGktcGx1c1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvTWFyY2Fkb3JUZXh0bygpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclRleHRvXCI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JUZXh0b1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b01hcmNhZG9yVGV4dG8gPSBmYWxzZTsgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0byA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fVwiIFxuICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhTWFyY2Fkb3Jlc1RleHRvXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxuICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgXG4gICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFNYXJjYWRvcmVzVGV4dG8ubGVuZ3RoXCJcbiAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFNYXJjYWRvcmVzVGV4dG8ubGVuZ3RoID4gMTBcIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yVGV4dG9cIlxuICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlck1hcmNhZG9yVGV4dG8oJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlck1hcmNhZG9yVGV4dG8oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydvcmRlbicgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmN0ZXh0bz5cbiAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cIm1hcmN0ZXh0b1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8udGlwb0dyYWZpY28gfCByZXBvcnRlRnVlbnRlUGlwZSA6ICdsaXN0YVRpcG9NYXJjYWRvcmVzVGV4dG8nfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8ubm9tYnJlQ29sdW1uYX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLmZvcm1hdG99fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5hbHRvfX08L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPiBcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPjwvYXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPiAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBtdC0zXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yVGV4dG9cIj4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm10LTNcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT57eydkZXRhbGxlJyB8IHRyYW5zbGF0ZX19PC9oNT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb01hcmNhZG9yVGV4dG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWFyY2Fkb3JUZXh0by50aXBvR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvID09ICdEJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUNvbHVtbmFzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yVGV4dG8ucmVwb3J0ZUNvbHVtbmFcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8ucmVwb3J0ZUNvbHVtbmEpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8ucmVwb3J0ZUNvbHVtbmEpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY29cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yVGV4dG8uZm9ybWF0b1wiIG1heGxlbmd0aD1cIjUwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5mb3JtYXRvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmZvcm1hdG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3ttYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvID09ICdEJyA/ICgnZm9ybWF0bycgfCB0cmFuc2xhdGUpKycqJyA6ICgndmFsb3InIHwgdHJhbnNsYXRlKSsnKicgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28gPT0gJ0QnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclRleHRvLmFuY2hvXCIgbWF4bGVuZ3RoPVwiMjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmFuY2hvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmFuY2hvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY29cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yVGV4dG8uYWx0b1wiIG1heGxlbmd0aD1cIjIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5hbHRvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmFsdG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW4nIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e21hcmNhZG9yVGV4dG8ubGxhdmUgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3ttYXJjYWRvclRleHRvLmxsYXZlID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyTWFyY2Fkb3JUZXh0bygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1hcmNhZG9yVGV4dG8ubGxhdmUgIT0gbnVsbFwiIGxhYmVsPVwie3snbGlua19lbGltaW5hcicgfCB0cmFuc2xhdGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJNYXJjYWRvVGV4dG8oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3AtdGFiUGFuZWw+XG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sndGFibGEnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIiA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUubm9tYnJlVGFibGFcIiBtYXhsZW5ndGg9XCI0MDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZXRhYmxhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLThcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG10LTEgbWItMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlZnJlc2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cC1waWNrTGlzdCBbc291cmNlXT1cImxpc3RhVGFibGFcIiBbdGFyZ2V0XT1cImxpc3RhTm9UYWJsYVwiIHNvdXJjZUhlYWRlcj1cIkFzb2NpYWRvXCIgc291cmNlRmlsdGVyUGxhY2Vob2xkZXI9XCJBc29jaWFkb1wiXG4gICAgICAgICAgICB0YXJnZXRIZWFkZXI9XCJEZXNhc29jaWFkb1wiIFtkcmFnZHJvcF09XCJ0cnVlXCIgW3Jlc3BvbnNpdmVdPVwidHJ1ZVwiIHRhcmdldEZpbHRlclBsYWNlaG9sZGVyPVwiRGVzYXNvY2lhZG9cIlxuICAgICAgICAgICAgZmlsdGVyQnk9XCJub21icmVcIiAqbmdJZj1cImlzRnVlbnRlKClcIiAob25Tb3VyY2VSZW9yZGVyKT1cInJlb3JkZXJUYWJsYSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbk1vdmVBbGxUb1RhcmdldCk9XCJtb3ZlckFEZXNhc29jaWFkb1RhYmxhKCRldmVudClcIiAob25Nb3ZlQWxsVG9Tb3VyY2UpPVwibW92ZXJBQXNvY2lhZG9UYWJsYSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbk1vdmVUb1RhcmdldCk9XCJtb3ZlckFEZXNhc29jaWFkb1RhYmxhKCRldmVudClcIiAob25Nb3ZlVG9Tb3VyY2UpPVwibW92ZXJBQXNvY2lhZG9UYWJsYSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXRhYmxhIHBUZW1wbGF0ZT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3t0YWJsYS5ub21icmV9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtcGlja0xpc3Q+XG4gICAgPC9wLXRhYlBhbmVsPlxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J2FyY2hpdm94bWwnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MCBtYXgtaC0xMDBcIiAgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnRhZ0VuY2FiZXphZG9cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0YWdlbmNhYmV6YWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS50YWdDaWVycmVFbmNhYmV6YWRvXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGFnY2llcnJlZW5jYWJlemFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+IFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MCBtYXgtaC0xMDBcIiAgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmVzdHJ1Y3R1cmFSZWdpc3Ryb1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RhZ3JlZ2lzdHJvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD4gXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NpZnJhZG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvWG1sXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+e3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fTwvaDE+XG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2b01hcmNhZG9yWE1MKClcIiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yWE1MXCI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JYTUxcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9NYXJjYWRvclhNTCA9IGZhbHNlOyBjbGlja0d1YXJkYXJNYXJjYWRvclhNTCA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fVwiIFxuICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhWE1MXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxuICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgIFxuICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhWE1MLmxlbmd0aFwiXG4gICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhWE1MLmxlbmd0aCA+IDEwXCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclhNTFwiXG4gICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyTWFyY2Fkb3JYTUwoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlck1hcmNhZG9yWE1MKCRldmVudClcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cblxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8dGg+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtbWFyY3RleHRvPlxuICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwibWFyY3RleHRvXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5kZXNjcmlwY2lvbn19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLnRpcG8gfCByZXBvcnRlRnVlbnRlUGlwZSA6ICdsaXN0YVRpcG9EYXRvTWFyY2Fkb3Jlcyd9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5ub21icmVDb2x1bW5hfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8ubWFyY2Fkb3J9fTwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCI+IFxuICAgICAgICAgICAgICAgIDxhcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+PC9hcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+ICAgICAgICA8L3AtdGFibGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIG10LTNcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JYTUxcIj4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm10LTNcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT57eydkZXRhbGxlJyB8IHRyYW5zbGF0ZX19PC9oNT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZGVzY3JpcGNpb25cIiBtYXhsZW5ndGg9XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclhNTC5kZXNjcmlwY2lvbikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yWE1MLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclhNTFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvclhNTFwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLnRpcG9cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JYTUwudGlwbykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yWE1MLnRpcG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJbJ01BJywnTVInXS5pbmNsdWRlcyhtYXJjYWRvclhNTC50aXBvKVwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLm1hcmNhZG9yXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydtYXJjYWRvcicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnVEInXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwubWFyY2Fkb3JcIiBtYXhsZW5ndGg9XCI1XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGFibGEnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAgKm5nSWY9XCJtYXJjYWRvclhNTC50aXBvID09ICdNQSdcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQ29sdW1uYXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwucmVwb3J0ZUNvbHVtbmFcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclhNTC50aXBvID09ICdNQSdcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5mb3JtYXRvXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclhNTC50aXBvID09ICdNUidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLnRleHRvUmVnaXN0cm9cIiA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGV4dG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiWydNUicsJ1RCJ10uaW5jbHVkZXMobWFyY2Fkb3JYTUwudGlwbylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFGdWVudGVzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLmZ1ZW50ZVwiIG9wdGlvbkxhYmVsPVwiZGVzY3JpcGNpb25cIiBvcHRpb25WYWx1ZT1cImxsYXZlXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmdWVudGUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJbJ01SJywnVEInXS5pbmNsdWRlcyhtYXJjYWRvclhNTC50aXBvKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZmlsdHJvXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZmlsdHJvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnVEInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5lc3RydWN0dXJhVGFibGFYTUxcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydlc3RydWN0dXJhdGFibGEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIHt7bWFyY2Fkb3JYTUwubGxhdmUgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3ttYXJjYWRvclhNTC5sbGF2ZSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhck1hcmNhZG9yWE1MKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibWFyY2Fkb3JYTUwubGxhdmUgIT0gbnVsbFwiIGxhYmVsPVwie3snbGlua19lbGltaW5hcicgfCB0cmFuc2xhdGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJNYXJjYWRvclhNTCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvclhNTCAmJiBtYXJjYWRvclhNTC5sbGF2ZSAhPSBudWxsICYmIChtYXJjYWRvclhNTC50aXBvID09ICdNUicgfHwgbWFyY2Fkb3JYTUwudGlwbyA9PSAnVEInKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwibnVldm9DYW1wb1RhYmxhWE1MKClcIiBpY29uPVwicGkgcGktcGx1c1wiIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLXJpcHBsZSBwLWVsZW1lbnQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24tc2Vjb25kYXJ5IG1iLTJcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUxcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCIgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXN0cmlwZWRcIlxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFDYW1wb3NNYXJjYWRvclhNTC5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUwubGVuZ3RoID4gMTBcIiBcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCIgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cIntmaXJzdH0gYWwge2xhc3R9IGRlIHt0b3RhbFJlY29yZHN9IHJlZ2lzdHJvc1wiIFxuICAgICAgICAgICAgICAgICAgICBlZGl0TW9kZT1cInJvd1wiIGRhdGFLZXk9XCJsbGF2ZVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzAlO1wiPnt7J2NhbXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzAlO1wiPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzAlO1wiPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCVcIj4gPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiVGFibGFOdWV2b1JlZ2lzdHJvXCIgKm5nSWY9XCJ2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlWE1MXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwuY2FtcG9GdWVudGVcIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwuY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwubWFyY2Fkb3JcIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwubWFyY2Fkb3IpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwuZm9ybWF0b1wiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ2FtcG9NYXJjYWRvclhNTChjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc3VjY2VzcyBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwidmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZVhNTCA9IGZhbHNlOyBoYWJpbGl0YUNhbXBvID0gZmFsc2U7XCIgaWNvbj1cInBpIHBpLXRpbWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1jYW1wbyBsZXQtZWRpdGluZz1cImVkaXRpbmdcIiBsZXQtcmk9XCJyb3dJbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJjYW1wb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5jYW1wb0Z1ZW50ZVwiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uY2FtcG9GdWVudGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8ubWFyY2Fkb3JcIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5tYXJjYWRvcikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5tYXJjYWRvcikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLm1hcmNhZG9yfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmZvcm1hdG9cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uZm9ybWF0b319XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDSEVDSyBHVUFSREFSIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJDYW1wb01hcmNhZG9yWE1MKGNhbXBvKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENBTkNFTEFSIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcENhbmNlbEVkaXRhYmxlUm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIiAoY2xpY2spPVwiY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MQXN5bmMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRURJVEFSIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBJbml0RWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcGVuY2lsXCIgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIiAoY2xpY2spPVwiaW5pY2lhckVkaWNpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXNlY29uZGFyeSBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRUxJTUlOQVIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcERlbGV0ZUVkaXRhYmxlUm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiIChjbGljayk9XCJlbGltaW5hckNhbXBvTWFyY2Fkb3JYTUwoJGV2ZW50LGNhbXBvKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLW91dGxpbmVkIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCI+IFxuICAgICAgICAgICAgICAgIDxhcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+PC9hcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+ICAgICAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3AtdGFiUGFuZWw+XG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snY29sdW1uYXJpbycgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgPHAtYWNjb3JkaW9uIChvbk9wZW4pPVwiY2FtYmlhclRhYkNvbHVtbmFyaW8oJGV2ZW50KVwiID5cbiAgICAgICAgICAgIDxwLWFjY29yZGlvblRhYiBbc2VsZWN0ZWRdPVwidHJ1ZVwiID5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtbm90ZXNcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIHt7J2NvbHVtbmFzYmFzaWNhcyd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG10LTIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvQ29sdW1uYUJhc2ljYSgpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpb1wiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTsgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J2NvbHVtbmFzYmFzaWNhcycgfCB0cmFuc2xhdGV9fVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFSZXBvcnRlQ29sdW1uYXJpb1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgIFxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFSZXBvcnRlQ29sdW1uYXJpby5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhUmVwb3J0ZUNvbHVtbmFyaW8ubGVuZ3RoID4gMTBcIiAqbmdJZj1cIiF2ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlclJlcG9ydGVDb2x1bW5hcmlvKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJSZXBvcnRlQ29sdW1uYXJpbygkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J25vbWJyZScgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3JkZW4nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3BlcmFjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1iZWFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJiZWFuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi5ub21icmV9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi5ub21icmVDb2x1bW5hfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4udGlwbyB8IHJlcG9ydGVDb2x1bW5hcmlvUGlwZTogJ2xpc3RhVGlwb0NvbHVtbmEnfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4ub3JkZW59fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi5vcGVyYWNpb24gfCByZXBvcnRlQ29sdW1uYXJpb1BpcGU6ICdsaXN0YU9wZXJhY2lvbid9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCI+IFxuICAgICAgICAgICAgICAgIDxhcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+PC9hcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+ICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgICAgICAgICA8ZGl2ICAqbmdJZj1cInZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW9cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eubm9tYnJlXCIgbWF4bGVuZ3RoPVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm5vbWJyZSkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5ub21icmUpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NvbHVtbmFzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS50aXBvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS50aXBvKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLnRpcG8pICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2EucmVwb3J0ZUNvbHVtbmFcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5yZXBvcnRlQ29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5yZXBvcnRlQ29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiY29sdW1uYUJhc2ljYS50aXBvID09ICdEJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3BlcmFjaW9uZXNDb2x1bW5hcmlvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5vcGVyYWNpb25cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvbikgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcGVyYWNpb24pICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29wZXJhY2lvbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiaXNUaXBvQ29sdW1uYSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcGVyYWNpb25lc0V4Y2VsQ29sdW1uYXJpb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uSG9yaXpvbnRhbFwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uSG9yaXpvbnRhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcGVyYWNpb25Ib3Jpem9udGFsKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcGVyYWNpb25ob3Jpem9udGFsJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgZmlsYSBPcGVyYWNpb24gVmVydGljYWwgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiaXNUaXBvQ29sdW1uYSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5jb2x1bW5hT3BlcmFjaW9uVmVydGljYWxcIiBtYXhsZW5ndGg9XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2EuY29sdW1uYU9wZXJhY2lvblZlcnRpY2FsKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLmNvbHVtbmFPcGVyYWNpb25WZXJ0aWNhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2x1bW5hb3BlcmFjaW9uJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9wZXJhY2lvbiBWZXJ0aWNpYWwgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiaXNUaXBvQ29sdW1uYSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcGVyYWNpb25lc0V4Y2VsQ29sdW1uYXJpb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uVmVydGljYWxcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvblZlcnRpY2FsKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvblZlcnRpY2FsKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcGVyYWNpb252ZXJ0aWNhbCcgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3JkZW4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiaXNNb3N0cmFyT3JkZW4oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3JkZW5cIiBtYXhsZW5ndGg9XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3JkZW4pICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3JkZW4pICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW4nIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3JkZW5hbWllbnRvIEZpbGFzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzVGlwb0xhYmVsKCkgfHwgaXNUaXBvRmlsYSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcmRlbmFtaWVudG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwiZmFsc2VcIiAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3JkZXJCeVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVyQnkpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3JkZXJCeSkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW5hbWllbnRvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPcmRlbmFtaWVudG8gRGF0b3MgZGUgbGEgY29uc3VsdGEgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiaXNNb3N0cmFyT3JkZW5Db25zdWx0YSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5vcmRlbkNvbnN1bHRhXCIgbWF4bGVuZ3RoPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcmRlbkNvbnN1bHRhKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVuQ29uc3VsdGEpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW5jb25zdWx0YScgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIHt7Y29sdW1uYUJhc2ljYS5sbGF2ZVRhYmxhID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3tjb2x1bW5hQmFzaWNhLmxsYXZlVGFibGEgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCIgKGNsaWNrKT1cImd1YXJkYXJDb2x1bW5hQmFzaWNhKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uYUJhc2ljYS5sbGF2ZVRhYmxhICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJDb2x1bW5hQmFzaWNhKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG4gICAgICAgIDwvcC1hY2NvcmRpb24+XG4gICAgICAgIDxwLWFjY29yZGlvbiAob25PcGVuKT1cImNhbWJpYXJUYWJDb2x1bW5hcmlvKCRldmVudClcIj5cbiAgICAgICAgICAgIDxwLWFjY29yZGlvblRhYiA+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPjxpIGNsYXNzPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLW5vdGVzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB7eydkYXRvc2FkaWNpb25hbGVzJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPHAtZmllbGRzZXQgY2xhc3M9XCJmaWVsZHNpbnRpdHVsb1wiID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvRXhjZWxDb2x1bW5hcmlvID8gcmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvRXhjZWxDb2x1bW5hcmlvOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvbmVzXT1cIid4bHM7eGxzeDt4bHNtJ1wiIFttb3N0cmFyb2JsaWNhcmdvXT1cInRydWVcIiBbbGFiZWxyYXJdPVwiJ3BsYW50aWxsYScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvQ29sdW1uYXJpbygkZXZlbnQpXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5ob2phRXhjZWxcIiBzaXplPVwiMjVcIiBtYXhsZW5ndGg9XCIyMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZScgfCB0cmFuc2xhdGUgfX0ge3snZGUnIHwgdHJhbnNsYXRlIH19IHt7J2xhJyB8IHRyYW5zbGF0ZSB9fSB7eydob2phJyB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuZmlsYUluaWNpb0NvbHVtbmFyaW9cIiBtYXhsZW5ndGg9XCI1XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZmlsYWluaWNpb2NvbHVtbmFyaW8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2lmcmFkb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY2lmcmFkb0NvbHVtbmFyaW9cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5zaW50YXhpc0NvbHVtbmFyaW9cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3NpbnRheGlzY29sdW1uYXJpbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphcigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9wLWZpZWxkc2V0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zIG10LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bFwiPnt7J2NvbHVtbmFhZGljaW9uYWwnIHwgdHJhbnNsYXRlfX08L2gxPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZhQ29sdW1uYUFkaWNpb25hbCgpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJ2ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTsgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbCA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snY29sdW1uYWFkaWNpb25hbCcgfCB0cmFuc2xhdGV9fVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwiY29sdW1uYXNBZGljaW9uYWxlc1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgIFxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwiY29sdW1uYXNBZGljaW9uYWxlcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImNvbHVtbmFzQWRpY2lvbmFsZXMubGVuZ3RoID4gMTBcIiAqbmdJZj1cIiF2ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWxcIlxuICAgICAgICAgICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyRGV0YWxsZUFkaWNpb25hbCgkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwidmVyRGV0YWxsZUFkaWNpb25hbCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydub21icmUnIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3JkZW4nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWNvbHVtbmFhZGljaW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cImNvbHVtbmFhZGljaW9uYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tjb2x1bW5hYWRpY2lvbmFsLm5vbWJyZX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tjb2x1bW5hYWRpY2lvbmFsLm9yZGVufX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPiBcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPjwvYXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XG4gICAgICAgICAgICAgICAgPHAtZmllbGRzZXQgY2xhc3M9XCJmaWVsZHNpbnRpdHVsb1wiICAqbmdJZj1cInZlck51ZXZvQ29sdW1uYUFkaWNpb25hbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUFkaWNpb25hbC5ub21icmVcIiBtYXhsZW5ndGg9XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwubm9tYnJlKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwubm9tYnJlKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWxpYXMnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwiY29sdW1uYUFkaWNpb25hbC5vcmRlblwiIG1heGxlbmd0aD1cIjVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwub3JkZW4pICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlbikgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW4nIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3JkZW5hbWllbnRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uYUFkaWNpb25hbC5vcmRlckJ5XCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlckJ5KSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwub3JkZXJCeSkgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbmFtaWVudG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwiY29sdW1uYUFkaWNpb25hbC5vcmRlbkNvbnN1bHRhXCIgbWF4bGVuZ3RoPVwiNVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlbkNvbnN1bHRhKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwub3JkZW5Db25zdWx0YSkgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW5jb25zdWx0YScgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MCBtYXgtaC0xMDBcIiBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwuc2ludGF4aXNcIiBtYXhsZW5ndGg9XCI0MDAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLnNpbnRheGlzKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwuc2ludGF4aXMpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3NpbnRheGlzJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3tjb2x1bW5hQWRpY2lvbmFsLmxsYXZlVGFibGEgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e2NvbHVtbmFBZGljaW9uYWwubGxhdmVUYWJsYSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhckNvbHVtbmFBZGljaW9uYWwoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW5hQWRpY2lvbmFsLmxsYXZlVGFibGEgIT0gbnVsbFwiIGxhYmVsPVwie3snbGlua19lbGltaW5hcicgfCB0cmFuc2xhdGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbGltaW5hckNvbHVtbmFBZGljaW9uYWwoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvcC1maWVsZHNldD5cbiAgICAgICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG4gICAgICAgICAgICA8cC1hY2NvcmRpb25UYWIgPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAge3snbWFyY2Fkb3Jlcyd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2b01hcmNhZG9yQ29sdW1uYXJpbygpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW9cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW8gPSBmYWxzZTsgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7eydtYXJjYWRvcicgfCB0cmFuc2xhdGV9fVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibWFyY2Fkb3Jlc0NvbHVtbmFyaW9cIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiICBcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cIm1hcmNhZG9yZXNDb2x1bW5hcmlvLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibWFyY2Fkb3Jlc0NvbHVtbmFyaW8ubGVuZ3RoID4gMTBcIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpb1wiXG4gICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3JDb2x1bW5hcmlvKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3JDb2x1bW5hcmlvKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J25vbWJyZScgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvbWFyY2Fkb3InIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmNhZG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJtYXJjYWRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLm1hcmNhZG9yfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLnRpcG8gfCByZXBvcnRlQ29sdW1uYXJpb1BpcGU6ICdsaXN0YVRpcG9NYXJjYWRvcid9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCI+IFxuICAgICAgICAgICAgICAgIDxhcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+PC9hcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+ICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW9cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJtYXJjYWRvckNvbHVtbmFyaW8uZGVzY3JpcGNpb25cIiBtYXhsZW5ndGg9XCI0MDAwXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJtYXJjYWRvckNvbHVtbmFyaW8ubWFyY2Fkb3JcIiBtYXhsZW5ndGg9XCI1MFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8ubWFyY2Fkb3IpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb01hcmNhZG9yQ29sdW1uYXJpb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yQ29sdW1uYXJpby50aXBvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLnRpcG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8udGlwbykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJtYXJjYWRvckNvbHVtbmFyaW8udGV4dG9SZWdpc3Ryb1wiIG1heGxlbmd0aD1cIjQwMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby50ZXh0b1JlZ2lzdHJvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLnRleHRvUmVnaXN0cm8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndmFsb3InIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e21hcmNhZG9yQ29sdW1uYXJpby5sbGF2ZVRhYmxhID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3ttYXJjYWRvckNvbHVtbmFyaW8ubGxhdmVUYWJsYSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpbygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1hcmNhZG9yQ29sdW1uYXJpby5sbGF2ZVRhYmxhICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJNYXJjYWRvckNvbHVtbmFyaW8oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cbiAgICAgICAgPC9wLWFjY29yZGlvbj5cbiAgICA8L3AtdGFiUGFuZWw+XG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snZ3JhZmljYScgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY29kaWdvXCIgc2l6ZT1cIjI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvZGlnbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUudGl0dWxvR3JhZmljb1wiIHNpemU9XCIyNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXR1bG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0dyYWZpY29cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS50aXBvR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiICpuZ0lmPVwiaXNTcWwoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCIgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImd1YXJkYXJHcmFmaWNvKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZCBiYWNrZ3JvdW5kLTEwMFwiIGljb249XCJwaSBwaS1leWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX3ZlcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJ2ZXJHcmFmaWNvKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cInBhZ2luYWRvckNvbHVtbmFzXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgW3Jvd3NdPVwiMjBcIiBbdG90YWxSZWNvcmRzXT1cInBhZ2luYWRvckNvbHVtbmFzLmxlbmd0aFwiIFtwYWdpbmF0b3JdPVwicGFnaW5hZG9yQ29sdW1uYXMubGVuZ3RoID4gMjBcIiA+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG5cbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J3NpbnRheGlzJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydhY2Npb24nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWJlYW4+XG4gICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJiZWFuXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4ubm9tYnJlfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3tiZWFuLnNpbnRheGlzfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3tiZWFuLnRpcG9EYXRvIHwgcmVwb3J0ZUZ1ZW50ZVBpcGUgOiAnbGlzdGFUaXBvRGF0byd9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhR3JhZmljb1NlbmNpbGxvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYmVhbi5ncmFmaWNvRnVlbnRlXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPiBcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPjwvYXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPiAgICAgICAgPC9wLXRhYmxlPiBcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBtYi0yXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+Q29sb3JlczwvaDE+XG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cIm51ZXZvQ29sb3JDYXRlZ29yaWEoKVwiIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiIGNsYXNzPVwicC1yaXBwbGUgcC1lbGVtZW50IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLXNlY29uZGFyeSBtYi0yXCI+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwicGFnaW5hZG9yQ29sb3Jlc0dyYWZpY2FcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCIgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXN0cmlwZWRcIlxuICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cInBhZ2luYWRvckNvbG9yZXNHcmFmaWNhLmxlbmd0aFwiXG4gICAgICAgICAgICBbcGFnaW5hdG9yXT1cInBhZ2luYWRvckNvbG9yZXNHcmFmaWNhLmxlbmd0aCA+IDEwXCIgXG4gICAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgXG4gICAgICAgICAgICBlZGl0TW9kZT1cInJvd1wiIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiA0NSVcIj57eydjYXRlZ29yaWEnIHwgdHJhbnNsYXRlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDUlXCI+e3snY29sb3InIHwgdHJhbnNsYXRlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlXCI+IDwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJUYWJsYU51ZXZvUmVnaXN0cm9cIiAqbmdJZj1cInZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sb3JDYXRlZ29yaWEudGl0dWxvXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3JDYXRlZ29yaWEudGl0dWxvKSAmJiBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvckNhdGVnb3JpYS50aXR1bG8pICYmIGNsaWNrR3VhcmRhckNvbG9yQ2F0ZWdvcmlhXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0NSVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNvbG9yUGlja2VyIFsobmdNb2RlbCldPVwiY29sb3JDYXRlZ29yaWEuYmFuZGFcIiBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvckNhdGVnb3JpYS5iYW5kYSkgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yQ2F0ZWdvcmlhLmJhbmRhKSAmJiBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJDb2xvckNhdGVnb3JpYShjb2xvckNhdGVnb3JpYSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwidmVyQ29sb3JDYXRlZ29yaWFEZXRhbGxlID0gZmFsc2VcIiBpY29uPVwicGkgcGktdGltZXNcIiAoY2xpY2spPVwiY2FuY2VsYXJDb2xvckNhdGVnb3JpYSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1kYW5nZXIgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1jb2xvciBsZXQtZWRpdGluZz1cImVkaXRpbmdcIiBsZXQtcmk9XCJyb3dJbmRleFwiPlxuICAgICAgICAgICAgICAgIDx0ciBbcEVkaXRhYmxlUm93XT1cImNvbG9yXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sb3IudGl0dWxvXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvci50aXR1bG8pICYmIGNsaWNrR3VhcmRhckNvbG9yQ2F0ZWdvcmlhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3IudGl0dWxvKSAmJiBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbG9yLnRpdHVsb319XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNvbG9yUGlja2VyIFsobmdNb2RlbCldPVwiY29sb3IuYmFuZGFcIiBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yLmJhbmRhKSAmJiBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvci5iYW5kYSkgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jb2xvclBpY2tlciBbKG5nTW9kZWwpXT1cImNvbG9yLmJhbmRhXCIgW2Rpc2FibGVkXT1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0hFQ0sgR1VBUkRBUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhckNvbG9yQ2F0ZWdvcmlhKGNvbG9yKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc3VjY2VzcyBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDQU5DRUxBUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcENhbmNlbEVkaXRhYmxlUm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIChjbGljayk9XCJjYW5jZWxhckVkaWNpb25Db2xvcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1kYW5nZXIgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRURJVEFSIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcEluaXRFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXBlbmNpbFwiIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCIgKGNsaWNrKT1cImluaWNpYXJFZGljaW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXNlY29uZGFyeSBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFTElNSU5BUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBEZWxldGVFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiAoY2xpY2spPVwiZWxpbWluYXJDb2xvckNhdGVnb3JpYSgkZXZlbnQsIGNvbG9yKVwiIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1vdXRsaW5lZCBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIj4gXG4gICAgICAgICAgICAgICAgPGFwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT48L2FwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPGRpdiAjZGl2R3JhZmljYSBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gY2FyZCBtdC0zXCIgKm5nSWY9XCJncmFmaWNhXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+e3snZ3JhZmljYScgfCB0cmFuc2xhdGV9fTwvaDE+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDM1JVwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiAzMCVcIj5cbiAgICAgICAgICAgICAgICA8cC1jaGFydCBbdHlwZV09XCJ0aXBvR3JhZmljYVwiIFtkYXRhXT1cImdyYWZpY2EuZGF0b3NHcmFmaWNhLmRhdGFcIiBbb3B0aW9uc109XCJncmFmaWNhLmRhdG9zR3JhZmljYS5vcHRpb25zXCI+PC9wLWNoYXJ0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDM1JVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3AtdGFiUGFuZWw+XG48L3AtdGFiVmlldz4iXX0=
1610
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZWplY3VjaW9uLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZWplY3VjaW9uLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQXlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQWUsV0FBVyxFQUFhLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUduSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFHMUUsT0FBTyxFQUF1QixjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFdkUsT0FBTyxFQUFFLGVBQWUsRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUN6RixPQUFP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RSxDQUFDLENBQUMsQ0FBQztZQUNwRixLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7WUFDbEQsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBQ3BELGFBQWEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztZQUNsRSxjQUFjLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUM7WUFDcEUsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1lBQ3RELEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUNsRCxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFDaEQsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBQ3BELE1BQU0sRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUNwRCxNQUFNLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDcEQsVUFBVSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO1lBQzVELFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztZQUN4RCxLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7WUFDbEQsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBQ3BELFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FB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YyxDQUFDLG9JQ2pEL0Isc3VySkEwbEVZLHNpSUQzaUVFLGVBQWUsNEZBQUUsV0FBVyxvb0ZBQUUsMkJBQTJCLG9FQUFFLGFBQWEsOGtCQUFFLHNDQUFzQyx5VEFBRSxxQkFBcUIseURBQUUsaUJBQWlCLHlEQUFFLGNBQWMsNHFDQUFFLFdBQVcsc2hDQUFFLG1CQUFtQiwrVUFBRSxZQUFZLG1JQUFFLFlBQVksNk9BQUUsY0FBYywyL0JBQUUsY0FBYyw2UEFBRSxlQUFlLGlsQkFBRSxlQUFlLHlIQUFFLG1CQUFtQixzS0FBRSxnQkFBZ0IscUdBQUUsaUJBQWlCLDB2QkFBa0IsV0FBVyx3T0FBRSxpQkFBaUI7OzJGQU1yWiwyQkFBMkI7a0JBUnZDLFNBQVM7K0JBQ0Usc0JBQXNCLFdBQ3JCLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSwyQkFBMkIsRUFBRSxhQUFhLEVBQUUsc0NBQXNDLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDLGNBQ25aLElBQUksYUFDTCxDQUFDLGNBQWMsQ0FBQzt1aUJBa0lKLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFLUCxZQUFZO3NCQUEzQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1csWUFBWTtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25EZXN0cm95LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEdlbmVyYWxQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvZ2VuZXJhbC5waXBlJztcbmltcG9ydCB7IEdlbmVyYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2lvcy9nZW5lcmFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2VuZXJhbE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvR2VuZXJhbE1vZGVsJztcbmltcG9ydCB7IENhcmdhckFyY2hpdm9zU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNpb3MvY2FyZ2FyLWFyY2hpdm9zLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW5jcmlwdGFkb0Jhc2ljb1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvc2VydmljaW9zL2VuY3JpcHRhZG8tYmFzaWNvLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVwb3J0ZUZ1ZW50ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9yZXBvcnRlLWZ1ZW50ZS5waXBlJztcbmltcG9ydCB7IEVqZWN1Y2lvblJlcG9ydGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZWplY3VjaW9ucmVwb3J0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgRnVlbnRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2Z1ZW50ZS5waXBlJztcbmltcG9ydCB7IFJlcG9ydGVDb2x1bW5hcmlvUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL3JlcG9ydGUtY29sdW1uYXJpby5waXBlJztcbmltcG9ydCB7IFJlcG9ydGVDb2x1bW5hTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9zZWd1cmlkYWQvbW9kZWxvcy9SZXBvcnRlQ29sdW1uYSc7XG5pbXBvcnQgeyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVNYXJjYWRvcic7XG5pbXBvcnQgeyBSZXBvcnRlVGFibGFNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVUYWJsYSc7XG5pbXBvcnQgeyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUNvbHVtbmFyaW8nO1xuaW1wb3J0IHsgUmVwb3J0ZUZ1ZW50ZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUZ1ZW50ZU1vZGVsJztcbmltcG9ydCB7IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3InO1xuaW1wb3J0IHsgUmVwb3J0ZUJhbmRhTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9zZWd1cmlkYWQvbW9kZWxvcy9SZXBvcnRlQmFuZGEnO1xuaW1wb3J0IHsgUmVwb3J0ZVNvcG9ydGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVTb3BvcnRlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljaW9zL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNpb3MvdXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljaW9zL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZU1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuaW1wb3J0IHsgVGVtcGxhdGVUYWJsYVZhY2lhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9jb21wb25lbnRlcy90ZW1wbGF0ZS10YWJsYS12YWNpYS90ZW1wbGF0ZS10YWJsYS12YWNpYS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFiVmlld01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdGFidmlldyc7XG5pbXBvcnQgeyBJbnB1dEhlbHBlclNlbGVjY2lvblBsYW50aWxsYUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9jb21wb25lbnRlcy9pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYS9pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBQaWNrTGlzdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcGlja2xpc3QnO1xuaW1wb3J0IHsgRmllbGRzZXRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2ZpZWxkc2V0JztcbmltcG9ydCB7IEFjY29yZGlvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYWNjb3JkaW9uJztcbmltcG9ydCB7IElucHV0VGV4dE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcbmltcG9ydCB7IElucHV0VGV4dGFyZWFNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0dGV4dGFyZWEnO1xuaW1wb3J0IHsgRmxvYXRMYWJlbE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZmxvYXRsYWJlbCc7XG5pbXBvcnQgeyBJbnB1dE51bWJlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXRudW1iZXInO1xuaW1wb3J0IHsgRGFzaGJvYXJkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Rhc2hib2FyZC5zZXJ2aWNlJztcbmltcG9ydCB7IENoYXJ0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jaGFydCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvZGFzaGJvYXJkLnBpcGUnO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NvbG9ycGlja2VyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGV0YWxsZS10aXBvLXJlcG9ydGUnLFxuICAgIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIFRhYmxlTW9kdWxlLCBUZW1wbGF0ZVRhYmxhVmFjaWFDb21wb25lbnQsIFRhYlZpZXdNb2R1bGUsIElucHV0SGVscGVyU2VsZWNjaW9uUGxhbnRpbGxhQ29tcG9uZW50LCBSZXBvcnRlQ29sdW1uYXJpb1BpcGUsIFJlcG9ydGVGdWVudGVQaXBlLCBEcm9wZG93bk1vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIENvbW1vbk1vZHVsZSwgQnV0dG9uTW9kdWxlLCBQaWNrTGlzdE1vZHVsZSwgRmllbGRzZXRNb2R1bGUsIEFjY29yZGlvbk1vZHVsZSwgSW5wdXRUZXh0TW9kdWxlLCBJbnB1dFRleHRhcmVhTW9kdWxlLCBGbG9hdExhYmVsTW9kdWxlLCBJbnB1dE51bWJlck1vZHVsZSwgRmllbGRzZXRNb2R1bGUsIENoYXJ0TW9kdWxlLCBDb2xvclBpY2tlck1vZHVsZV0sIFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kZXRhbGxlLXRpcG8tcmVwb3J0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RldGFsbGUtdGlwby1yZXBvcnRlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGV0YWxsZVRpcG9SZXBvcnRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBsaXN0YVRpcG9DaWZyYWRvOiBhbnlbXSA9IFtdO1xuICAvL3RhYiBleGNlbFxuICBwdWJsaWMgbGlzdGFFeGNlbDogUmVwb3J0ZUNvbHVtbmFNb2RlbFtdID0gW107XG4gIHB1YmxpYyBsaXN0YU5vRXhjZWw6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xuICBwdWJsaWMgbGlzdGFNYXJjYWRvckV4Y2VsOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbFtdID0gW107XG4gIHB1YmxpYyByZXBvcnRlTWFyY2Fkb3JFeGNlbDogUmVwb3J0ZU1hcmNhZG9yTW9kZWwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWw7XG4gIHB1YmxpYyBmb3JtTWFyY2Fkb3JFeGNlbDogRm9ybUdyb3VwO1xuICBwdWJsaWMgdmVyTnVldm9NYXJjYWRvckV4Y2VsOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBlc01hcmNhZG9yOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBlc0ltYWdlbkZpamE6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvL3RhYiBwbGFudGlsbGFzXG4gIHB1YmxpYyBsaXN0YUNvbHVtbmFzOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgbGlzdGFNYXJjYWRvcmVzOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbFtdID0gW107XG4gIHB1YmxpYyBsaXN0YVRpcG9NYXJjYWRvcjtcbiAgcHVibGljIGxpc3RhVGlwb0dyYWZpY29fSkZDO1xuICBwdWJsaWMgbGlzdGFHcmFmaWNvO1xuICBwdWJsaWMgbGlzdGFHcmFmaWNvU2VuY2lsbG87XG4gIHB1YmxpYyBsaXN0YUFsaW5lYWNpb247XG4gIHB1YmxpYyBsaXN0YU9wZXJhY2lvbmVzO1xuICBwdWJsaWMgcmVwb3J0ZU1hcmNhZG9yOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbDtcbiAgcHVibGljIGZvcm1NYXJjYWRvcjogRm9ybUdyb3VwO1xuICBwdWJsaWMgb3JpZ2VuTWFyY2Fkb3I6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBsaXN0YUNhbXBvc01hcmNhZG9yOiBSZXBvcnRlVGFibGFNb2RlbFtdID0gW107XG4gIHB1YmxpYyBjYW1wb01hcmNhZG9ySW5zZXJ0YXI6IFJlcG9ydGVUYWJsYU1vZGVsID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsO1xuICBwdWJsaWMgbGlzdGFTb3BvcnRlczogUmVwb3J0ZVNvcG9ydGVNb2RlbFtdID0gW107XG4gIHB1YmxpYyBzb3BvcnRlSW5ncmVzYXI6IFJlcG9ydGVTb3BvcnRlTW9kZWwgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbDtcbiAgcHVibGljIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG86IGJvb2xlYW4gPSBmYWxzZVxuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3I6IGJvb2xlYW4gPSBmYWxzZVxuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JFeGNlbDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgdmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgdmVyU29wb3J0ZUFyY2hpdm9EZXRhbGxlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2bzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaGFiaWxpdGFDYW1wbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBibG9xdWVhckNhbXBvTWFyY2Fkb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGJsb3F1ZWFyU29wb3J0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG5cbiAgLy9yZXBvcnRlIGRpbmFtaWNvXG4gIHB1YmxpYyBsaXN0YVRpcG9CYW5kYSA9IFtcbiAgICB7a2V5OiAnYmFuZGExJywgdmFsdWU6ICdCYW5kYSAxJ30sXG4gICAge2tleTogJ2JhbmRhMicsIHZhbHVlOiAnQmFuZGEgMid9LFxuICAgIHtrZXk6ICdiYW5kYTMnLCB2YWx1ZTogJ0JhbmRhIDMnfSxcbiAgICB7a2V5OiAnYmFuZGE0JywgdmFsdWU6ICdCYW5kYSA0J30sXG4gICAge2tleTogJ2JhbmRhNScsIHZhbHVlOiAnQmFuZGEgNSd9LFxuICAgIHtrZXk6ICdkZXRhbGxlJywgdmFsdWU6ICdEZXRhbGxlJ30sXG4gICAge2tleTogJ3N1bW1hcnknLCB2YWx1ZTogJ1Jlc3VtZW4nfSxcbiAgXVxuICBwdWJsaWMgZXhpc3RlSmFzcGVyOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBiYW5kYVNlbGVjY2lvbmFkYSA9IHtrZXk6IG51bGwsIHZhbHVlOiBudWxsfTtcbiAgcHVibGljIG51ZXZhQmFuZGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHZlclRhYkJhbmRhOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyByZXBvcnRlTWFyY2Fkb3JEaW5hbWljbzogUmVwb3J0ZU1hcmNhZG9yTW9kZWwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWw7XG4gIHB1YmxpYyByZXBvcnRlQmFuZGE6IFJlcG9ydGVCYW5kYU1vZGVsID0gbmV3IFJlcG9ydGVCYW5kYU1vZGVsO1xuICBwdWJsaWMgZm9ybVJlcG9ydGVEaW5hbWljbzogRm9ybUdyb3VwO1xuICBwdWJsaWMgbGlzdGFNYXJjYWRvckRpbmFtaWNvOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbFtdID0gW11cbiAgcHVibGljIGxpc3RhVGlwb0NhbXBvSmFzcGVyRGluYW1pY28gPSBbXG4gICAge2tleTogJ0MnLCB2YWx1ZTogJ0NhbGN1bG8nfSxcbiAgICB7a2V5OiAnVCcsIHZhbHVlOiAnQ29sdW1uYSd9LFxuICBdXG4gIHB1YmxpYyBsaXN0YVRpcG9EYXRvU2ludGF4aXMgPSBbXG4gICAge2tleTogJ0YnLCB2YWx1ZTogJ0ZlY2hhJ30sXG4gICAge2tleTogJ04nLCB2YWx1ZTogJ051bWVybyd9LFxuICAgIHtrZXk6ICdUJywgdmFsdWU6ICdUZXh0byd9LFxuICBdXG5cbiAgLy9yZXBvcnRlIHRhYmxhXG4gIHB1YmxpYyBsaXN0YVRhYmxhOiBSZXBvcnRlQ29sdW1uYU1vZGVsW10gPSBbXTtcbiAgcHVibGljIGxpc3RhTm9UYWJsYTogUmVwb3J0ZUNvbHVtbmFNb2RlbFtdID0gW107XG4gIFxuXG4gIC8vcmVwb3J0ZSB0ZXh0b1xuICBwdWJsaWMgbGlzdGFTZXBhcmFkb3JlcztcbiAgcHVibGljIGNsaWNrR3VhcmRhclJlcG9ydGVUZXh0bzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgbGlzdGFNYXJjYWRvcmVzVGV4dG86IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXTtcbiAgcHVibGljIG1hcmNhZG9yVGV4dG86IFJlcG9ydGVNYXJjYWRvck1vZGVsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKClcbiAgcHVibGljIHZlck51ZXZvTWFyY2Fkb3JUZXh0bzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgbGlzdGFUaXBvTWFyY2Fkb3JUZXh0bztcbiAgcHVibGljIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG86IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8vcmVwb3J0ZSBYTUxcbiAgcHVibGljIGxpc3RhVGlwb01hcmNhZG9yWE1MO1xuICBwdWJsaWMgbGlzdGFYTUw6IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXVxuICBwdWJsaWMgbWFyY2Fkb3JYTUw6IFJlcG9ydGVNYXJjYWRvck1vZGVsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJNYXJjYWRvclhNTDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgdmVyTnVldm9NYXJjYWRvclhNTDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgbGlzdGFDYW1wb3NNYXJjYWRvclhNTDogUmVwb3J0ZVRhYmxhTW9kZWxbXSA9IFtdO1xuICBwdWJsaWMgY2FtcG9NYXJjYWRvckluc2VydGFyWE1MOiBSZXBvcnRlVGFibGFNb2RlbCA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbDtcbiAgcHVibGljIHZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVYTUw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvL3JlcG9ydGUgY29sdW1uYXJpb1xuICBwdWJsaWMgbGlzdGFSZXBvcnRlQ29sdW1uYXJpbzogUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbFtdID0gW107XG4gIHB1YmxpYyB2ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBjb2x1bW5hQmFzaWNhOiBSZXBvcnRlQ29sdW1uYXJpb01vZGVsO1xuICBwdWJsaWMgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW86IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGxpc3RhVGlwb0NvbHVtbmFzO1xuICBwdWJsaWMgbGlzdGFPcGVyYWNpb25lc0NvbHVtbmFyaW87XG4gIHB1YmxpYyBsaXN0YU9wZXJhY2lvbmVzRXhjZWxDb2x1bW5hcmlvO1xuICBwdWJsaWMgbGlzdGFPcmRlbmFtaWVudG87XG5cbiAgcHVibGljIHZlck51ZXZvQ29sdW1uYUFkaWNpb25hbDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgY29sdW1uYXNBZGljaW9uYWxlczogUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbFtdID0gW107XG4gIHB1YmxpYyBjb2x1bW5hQWRpY2lvbmFsOiBSZXBvcnRlQ29sdW1uYXJpb01vZGVsO1xuXG4gIHB1YmxpYyBsaXN0YVRpcG9NYXJjYWRvckNvbHVtbmFyaW87XG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpbzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBtYXJjYWRvcmVzQ29sdW1uYXJpbzogUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsW10gPSBbXTtcbiAgcHVibGljIG1hcmNhZG9yQ29sdW1uYXJpbzogUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsO1xuXG4gIC8vZ3JhZmljYVxuICBwdWJsaWMgbGlzdGFUaXBvR3JhZmljbztcbiAgcHVibGljIHBhZ2luYWRvckNvbHVtbmFzOiBSZXBvcnRlQ29sdW1uYU1vZGVsW10gPSBbXTtcbiAgcHVibGljIHBhZ2luYWRvckNvbG9yZXNHcmFmaWNhOiBSZXBvcnRlQmFuZGFNb2RlbFtdID0gW107XG4gIHB1YmxpYyBjb2xvckNhdGVnb3JpYTogUmVwb3J0ZUJhbmRhTW9kZWwgPSBuZXcgUmVwb3J0ZUJhbmRhTW9kZWwoKTtcbiAgcHVibGljIHZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGdyYWZpY2E7XG4gIHB1YmxpYyB0aXBvR3JhZmljYTogXCJiYXJcIiB8IFwibGluZVwiIHwgXCJzY2F0dGVyXCIgfCBcImJ1YmJsZVwiIHwgXCJwaWVcIiB8IFwiZG91Z2hudXRcIiB8IFwicG9sYXJBcmVhXCIgfCBcInJhZGFyXCI7XG4gIEBWaWV3Q2hpbGQoJ2RpdkdyYWZpY2EnKSBkaXZHcmFmaWNhITogRWxlbWVudFJlZjtcblxuICBwdWJsaWMgcmVwb3J0ZUZ1ZW50ZSA6IFJlcG9ydGVGdWVudGVNb2RlbCA9IG5ldyAgUmVwb3J0ZUZ1ZW50ZU1vZGVsKCk7XG4gIHB1YmxpYyBsbGF2ZUVtcHJlc2E6IHN0cmluZztcbiAgcHVibGljIGxpc3RhU2lObztcbiAgQElucHV0KCkgcHVibGljIGxsYXZlUmVwb3J0ZSA6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIGFwbGljYWNpb24gOiBzdHJpbmc7XG4gIEBJbnB1dCgpICBwdWJsaWMgbGlzdGFGdWVudGVzOiBhbnlbXSA9IFtdO1xuXG4gIF9zdWJzY2lwcnRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgbm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnZW5lcmFsU2VydmljZTogR2VuZXJhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnZW5lcmFsUGlwZTogR2VuZXJhbFBpcGUsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZXBvcnRlRnVlbnRlUGlwZTogUmVwb3J0ZUZ1ZW50ZVBpcGUsXG4gICAgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgY2FyZ2FyQXJjaGl2bzogQ2FyZ2FyQXJjaGl2b3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgZW5jcmlwdGFkb3JBcmNoaXZvOiBFbmNyaXB0YWRvQmFzaWNvU2VydmljZSxcbiAgICBwdWJsaWMgdXRpbHNTZXJ2aWNlOiBVdGlsc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZnVlbnRlUGlwZTogRnVlbnRlUGlwZSxcbiAgICBwcml2YXRlIHJlcG9ydGVDb2x1bW5hcmlvUGlwZTogUmVwb3J0ZUNvbHVtbmFyaW9QaXBlLFxuICAgIHByaXZhdGUgcmVwb3J0ZVNlcnZpY2U6IEVqZWN1Y2lvblJlcG9ydGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGFzaGJvYXJkU2VydmljZTogRGFzaGJvYXJkU2VydmljZSxcbiAgICBwcml2YXRlIGRhc2hib2FyZFBpcGU6IERhc2hib2FyZFBpcGUsKSB7XG4gICAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYXBsaWNhY2lvbiA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0VG9rZW5LZXkoJ2FwbGljYWNpb24nKVxuICAgIHRoaXMubGxhdmVFbXByZXNhID0gdGhpcy5hdXRoU2VydmljZS5nZXRUb2tlbktleSgnbGxhdmVFbXByZXNhJyk7XG4gICAgdGhpcy5saXN0YVNpTm8gPSB0aGlzLmdlbmVyYWxQaXBlLkxJU1RBX1NJTk87XG4gICAgdGhpcy5saXN0YVRpcG9NYXJjYWRvckNvbHVtbmFyaW8gPSB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5NQVBBX1RJUE9fTUFSQ0FET1I7XG4gICAgdGhpcy5saXN0YVRpcG9Db2x1bW5hcyA9IHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLk1BUEFfVElQT19DT0xVTU5BUztcbiAgICB0aGlzLmxpc3RhT3BlcmFjaW9uZXNDb2x1bW5hcmlvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuTUFQQV9PUEVSQUNJT05FU19DT0xVTU5BUklPO1xuICAgIHRoaXMubGlzdGFPcGVyYWNpb25lc0V4Y2VsQ29sdW1uYXJpbyA9IHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLk1BUEFfT1BFUkFDSU9ORVNfQ09MVU1OQVJJT19FWENFTDtcbiAgICB0aGlzLmxpc3RhT3JkZW5hbWllbnRvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuTUFQQV9PUkRFTkFNSUVOVE87XG4gICAgdGhpcy5saXN0YVNlcGFyYWRvcmVzID0gIHRoaXMuZnVlbnRlUGlwZS5MSVNUQV9TRVBBUkFET1JFUztcbiAgICB0aGlzLmxpc3RhVGlwb01hcmNhZG9yID0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5MSVNUQV9NQVJDQURPUkVTO1xuICAgIHRoaXMubGlzdGFUaXBvR3JhZmljb19KRkMgPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX1RJUE9fR1JBRklDT19KRkM7XG4gICAgdGhpcy5saXN0YUdyYWZpY28gPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX1JFQ1VSU09fR1JBRklDQTtcbiAgICB0aGlzLmxpc3RhR3JhZmljb1NlbmNpbGxvID0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5SRUNVUlNPX0dSQUZJQ0E7XG4gICAgdGhpcy5saXN0YUFsaW5lYWNpb24gPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX0FMSU5FQUNJT047XG4gICAgdGhpcy5saXN0YU9wZXJhY2lvbmVzID0gdGhpcy5nZW5lcmFsUGlwZS5NQVBBT1BFUkFDSU9ORVM7XG4gICAgdGhpcy5saXN0YVRpcG9NYXJjYWRvclRleHRvID0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5USVBPTUFSQ0FET1JFU1RFWFRPO1xuICAgIHRoaXMubGlzdGFUaXBvTWFyY2Fkb3JYTUwgPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX01BUkNBRE9SRVNfWE1MO1xuICAgIHRoaXMubGlzdGFUaXBvR3JhZmljbyA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTElTVEFfVElQT19HUkFGSUNPO1xuICAgIHRoaXMuY2FyZ2FyKCk7XG4gICAgdGhpcy5jYXJnYXJGb3JtTWFyY2Fkb3JFeGNlbCgpO1xuICAgIHRoaXMuY2FyZ2FyRm9ybU1hcmNhZG9yKCk7XG4gICAgdGhpcy5jYXJnYXJGb3JtRGluYW1pY28oKTtcbiAgICB0aGlzLmFncmVnYXJTdWJzY3JpcGNpb25lcygpO1xuICAgIC8vdGhpcy5jYXJnYXJMaXN0YXMoKTtcblxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKXtcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLmZvckVhY2goKHN1YikgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gIH1cblxuICBhZ3JlZ2FyU3Vic2NyaXBjaW9uZXMoKSB7XG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ3RpcG8nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCB0ZXh0b1JlZ2lzdHJvQ29udHJvbCA9IHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCd0ZXh0b1JlZ2lzdHJvJyk7XG4gICAgICAgIGNvbnN0IG9yaWdlbkNvbnRyb2wgPSB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgnb3JpZ2VuJyk7XG4gICAgICAgIGlmICghdmFsdWUpe1xuICAgICAgICAgIHRoaXMuZXNJbWFnZW5GaWphID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmVzTWFyY2Fkb3IgPSB0cnVlO1xuICAgICAgICAgIG9yaWdlbkNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgdGV4dG9SZWdpc3Ryb0NvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoWydNQSddLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgIHRoaXMuZXNJbWFnZW5GaWphID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5lc01hcmNhZG9yID0gdHJ1ZTtcbiAgICAgICAgICB0ZXh0b1JlZ2lzdHJvQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgIG9yaWdlbkNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoWydJRiddLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgIHRoaXMuZXNJbWFnZW5GaWphID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmVzTWFyY2Fkb3IgPSBmYWxzZTtcbiAgICAgICAgICBvcmlnZW5Db250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgdGV4dG9SZWdpc3Ryb0NvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgfVxuICAgICAgICB0ZXh0b1JlZ2lzdHJvQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIG9yaWdlbkNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2VudHJhIGEgdGlwbzogJylcbiAgICAgICAgY29uc29sZS5sb2codmFsdWUpXG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvID09IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTUFSQ0FET1JUQUJMQSl7XG4gICAgICAgICAvLyB0aGlzLnJlcG9ydGVNYXJjYWRvci50aWVuZVNxbCA9ICdOJ1xuICAgICAgICAgLy8gdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aWVuZVNxbCcpLnNldFZhbHVlKCdOJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIGNvbnN0IHRleHRvUmVnaXN0cm9Db250cm9sID0gdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ3RleHRvUmVnaXN0cm8nKTtcbiAgICAgICAgY29uc3Qgb3JpZ2VuQ29udHJvbCA9IHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCdvcmlnZW4nKTtcbiAgICAgICAgaWYgKCF2YWx1ZSl7XG4gICAgICAgICAgdGhpcy5lc0ltYWdlbkZpamEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZXNNYXJjYWRvciA9IHRydWU7XG4gICAgICAgICAgb3JpZ2VuQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICB0ZXh0b1JlZ2lzdHJvQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChbJ0lGJ10uaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5lc0ltYWdlbkZpamEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZXNNYXJjYWRvciA9IGZhbHNlO1xuICAgICAgICAgIG9yaWdlbkNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICB0ZXh0b1JlZ2lzdHJvQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB9XG4gICAgICAgIHRleHRvUmVnaXN0cm9Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgb3JpZ2VuQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ29yaWdlbicpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvci5vcmlnZW4gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aWVuZVNxbCcpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdlbnRyYSBhIHRpZW5lU3FsOiAnKVxuICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSlcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMucHVzaChcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgndGlwb0dyYWZpY28nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY28gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ29yaWdlbicpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChbJ1UnXS5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLm9yaWdlbiA9ICdVJ1xuICAgICAgICB9IGVsc2UgaWYgKFsnQyddLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwub3JpZ2VuID0gJ0MnICAgICAgICBcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldCgndGlwb0NhbXBvJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPSB2YWx1ZTtcbiAgICAgICAgY29uc3QgcmVzdWx0YWRvWENvbnRyb2wgPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCdyZXN1bHRhZG9YJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdGFkb1lDb250cm9sID0gdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldCgncmVzdWx0YWRvWScpOyAgXG4gICAgICAgIGlmICh0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleSAhPSAnZGV0YWxsZScpIHtcbiAgICAgICAgICByZXN1bHRhZG9YQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgIHJlc3VsdGFkb1lDb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0YWRvWENvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgcmVzdWx0YWRvWUNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgIH0gXG4gICAgICAgIFxuICAgICAgICBjb25zdCBtYXJjYWRvckNvbnRyb2wgPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCdtYXJjYWRvcicpO1xuICAgICAgICBjb25zdCBmaWx0cm9Db250cm9sID0gdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldCgnZmlsdHJvJyk7XG4gICAgICAgIGNvbnN0IHRpcG9EYXRvQ29udHJvbCA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ3RpcG9EYXRvJyk7XG4gICAgICAgIGlmICh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyA9PSAnVCcpIHtcbiAgICAgICAgICBtYXJjYWRvckNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICBmaWx0cm9Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgIHRpcG9EYXRvQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXJjYWRvckNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgZmlsdHJvQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgIHRpcG9EYXRvQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB9XG4gICAgICAgIG1hcmNhZG9yQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIGZpbHRyb0NvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB0aXBvRGF0b0NvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgcmVzdWx0YWRvWENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgcmVzdWx0YWRvWUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSksXG4gICAgICB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCd0aXBvRGF0bycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0RhdG8gPSB2YWx1ZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgY2FtYmlhclRhYihldmVudCl7XG4gICAgc3dpdGNoIChldmVudC5pbmRleCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB0aGlzLmNhcmdhcigpO1xuICAgICAgICB0aGlzLmNhcmdhckxpc3Rhc0V4Y2VsKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3JlcygpO1xuICAgICAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTicpe1xuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlcygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB0aGlzLnZhbGlkYXJFeGlzdGVKYXNwZXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzVGV4dG8oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFzVGFibGEoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDU6XG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFYTUwoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY6XG4gICAgICAgIHRoaXMuY2FyZ2FyUmVwb3J0ZUNvbHVtbmFyaW8oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIHRoaXMuY2FyZ2FyR3JhZmljYXNDb2x1bW5hcygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGNhcmdhckxpc3Rhc1RhYmxhKCl7XG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge2J1c2Nhck9yZGVuVGFibGE6ICdTJywgb3JkZW5hclRhYmxhOiAnUycsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmxpc3RhVGFibGEgPSBkYXRhO1xuICAgIH0pXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge2J1c2Nhck9yZGVuVGFibGE6ICdOJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMubGlzdGFOb1RhYmxhID0gZGF0YTtcbiAgICB9KVxuICB9XG5cbiAgY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCl7XG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHt0aXBvUmVwb3J0ZTogJ1AnLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0l9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5saXN0YU1hcmNhZG9yZXMgPSBkYXRhO1xuICAgIH0pICAgIFxuICB9XG5cbiAgY2FyZ2FyTGlzdGFzRXhjZWwoKXtcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCB7b3JkZW5FeGNlbDogJ1MnLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5saXN0YUV4Y2VsID0gZGF0YTtcbiAgICB9KVxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgbnVsbCwgZmFsc2UsIHtvcmRlbkV4Y2VsOiAnTicsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmxpc3RhTm9FeGNlbCA9IGRhdGE7XG4gICAgfSlcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge3RpcG9SZXBvcnRlOiAnRScsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmxpc3RhTWFyY2Fkb3JFeGNlbCA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIGNhcmdhckxpc3RhQ29sdW1uYXMoKXtcbiAgICB0aGlzLmxpc3RhQ29sdW1uYXMgPSBbXTtcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMubGlzdGFDb2x1bW5hcyA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIGNhcmdhckxpc3Rhcygpe1xuICAgIHRoaXMubGlzdGFUaXBvQ2lmcmFkbyA9IFtdO1xuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ0VuY3JpcGNpb25BcmNoaXZvRFRPJywgbnVsbCwgZmFsc2UsIHt9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5saXN0YVRpcG9DaWZyYWRvID0gZGF0YTtcbiAgICB9KVxuICAgIHRoaXMuY2FyZ2FyTGlzdGFDb2x1bW5hcygpO1xuICB9XG5cbiAgY2FyZ2FyRm9ybU1hcmNhZG9yRXhjZWwoKXtcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBkZXNjcmlwY2lvbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwuZGVzY3JpcGNpb24sIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDApXSksXG4gICAgICBtYXJjYWRvcjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwubWFyY2Fkb3IsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCldKSxcbiAgICAgIHRpcG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLnRpcG8sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICB0ZXh0b1JlZ2lzdHJvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbC50ZXh0b1JlZ2lzdHJvKSxcbiAgICAgIG9yaWdlbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwub3JpZ2VuKSxcbiAgICAgIC8vY2FtcG9zIGJkXG4gICAgICBsbGF2ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwubGxhdmUpLFxuICAgICAgcmVwb3J0ZUZ1ZW50ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSksXG4gICAgICB0aXBvUmVwb3J0ZTogbmV3IEZvcm1Db250cm9sKCdFJykgXG4gICAgfSlcbiAgfVxuXG4gIGNhcmdhckZvcm1NYXJjYWRvcigpe1xuICAgIHRoaXMuZm9ybU1hcmNhZG9yID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBkZXNjcmlwY2lvbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmRlc2NyaXBjaW9uLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKV0pLFxuICAgICAgdGlwbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpcG8sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICBtYXJjYWRvcjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLm1hcmNhZG9yLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApXSksXG4gICAgICB0YWJsYTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRhYmxhKSxcbiAgICAgIG9yaWdlbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLm9yaWdlbiksXG4gICAgICB0ZXh0b1JlZ2lzdHJvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyksXG4gICAgICByZXBvcnRlQ29sdW1uYTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnJlcG9ydGVDb2x1bW5hKSxcbiAgICAgIGZvcm1hdG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5mb3JtYXRvKSxcbiAgICAgIGFuY2hvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYW5jaG8pLFxuICAgICAgYWx0bzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmFsdG8pLFxuICAgICAgZ3J1cG8xOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZ3J1cG8xKSxcbiAgICAgIGdydXBvMjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmdydXBvMiksXG4gICAgICBncnVwbzM6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5ncnVwbzMpLFxuICAgICAgZmluYWxHcnVwbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmZpbmFsR3J1cG8pLFxuICAgICAgdGllbmVTcWw6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci50aWVuZVNxbCksXG4gICAgICBxdWVyeTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnF1ZXJ5KSxcbiAgICAgIGZ1ZW50ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmZ1ZW50ZSksXG4gICAgICB0aXBvR3JhZmljbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvKSxcbiAgICAgIG1hcmNhZG9yR3JhZmljbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLm1hcmNhZG9yR3JhZmljbyksXG4gICAgICB0aXR1bG94OiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGl0dWxveCksXG4gICAgICB0aXR1bG95OiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGl0dWxveSksXG4gICAgICBiYW5kYTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmJhbmRhKSxcbiAgICAgIGFuY2hvSmFzcGVyTGFiZWw6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5hbmNob0phc3BlckxhYmVsKSxcbiAgICAgIGZpbHRybzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmZpbHRybyksXG4gICAgICAvL2NhbXBvcyBiZFxuICAgICAgbGxhdmU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5sbGF2ZSksXG4gICAgICByZXBvcnRlRnVlbnRlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlKSxcbiAgICAgIHRpcG9SZXBvcnRlOiBuZXcgRm9ybUNvbnRyb2woJ04nKSBcbiAgICB9KVxuICB9XG5cbiAgY2FyZ2FyRm9ybURpbmFtaWNvKCl7XG4gICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICB0aXBvQ2FtcG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIHRpcG9EYXRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvRGF0byksXG4gICAgICBmaWx0cm86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZpbHRybyksXG4gICAgICBtYXJjYWRvcjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubWFyY2Fkb3IpLFxuICAgICAgYWx0bzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYWx0bywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIGZvcm1hdG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZvcm1hdG8pLFxuICAgICAgZGVzY3JpcGNpb246IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmRlc2NyaXBjaW9uKSxcbiAgICAgIGFuY2hvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5hbmNobywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIGFuY2hvSmFzcGVyTGFiZWw6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmFuY2hvSmFzcGVyTGFiZWwpLFxuICAgICAgcmVzdWx0YWRvWDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ucmVzdWx0YWRvWCApLFxuICAgICAgcmVzdWx0YWRvWTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ucmVzdWx0YWRvWSApLFxuICAgICAgdGl0dWxveDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGl0dWxveCksXG4gICAgICB0aXR1bG95OiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXR1bG95KSxcbiAgICAgIHRpcG9SZXBvcnRlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvUmVwb3J0ZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIHRpcG9HcmFmaWNvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvR3JhZmljbyksICAgICAgXG4gICAgICBvcGVyYWNpb246IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm9wZXJhY2lvbiksICAgICAgXG4gICAgICAvL2NhbXBvcyB0YWJsYVxuICAgICAgb3JpZ2VuOiBuZXcgRm9ybUNvbnRyb2woJ0QnKSxcbiAgICAgIGJhbmRhOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXkpLFxuICAgICAgcmVwb3J0ZUZ1ZW50ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSksXG4gICAgICBsbGF2ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUpLFxuXG4gICAgfSlcbiAgfVxuXG4gIGNhcmdhcigpe1xuICAgIHRoaXMuZXhpc3RlSmFzcGVyID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5sbGF2ZVJlcG9ydGUpe1xuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yT2JqZWN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVGdWVudGVEVE8nLCBudWxsLCBmYWxzZSwge2xsYXZlOiB0aGlzLmxsYXZlUmVwb3J0ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnRlRnVlbnRlID0gZGF0YTtcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3Rhc0V4Y2VsKCk7XG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YXMoKTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhY3R1YWxpemFyKCl7XG4gICAgaWYgKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSl7XG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlRnVlbnRlRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZUZ1ZW50ZSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xuICAgICAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTicpe1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXBvcnRlU2VydmljZS5ndWFyZGFyUmVwb3J0ZSh0aGlzLnJlcG9ydGVGdWVudGUpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgdGhpcy5yZXBvcnRlRnVlbnRlID0gZGF0YTtcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb2J0ZW5lckFyY2hpdm8oZXZlbnQpe1xuICAgIHRoaXMucmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvVG9kbyA9IGV2ZW50LmRhdGFcbiAgfVxuXG4gIG9idGVuZXJBcmNoaXZvTWFyY2Fkb3JFeGNlbChldmVudCl7XG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyA9IGV2ZW50LmRhdGFcbiAgfVxuXG4gIG9idGVuZXJBcmNoaXZvTWFyY2Fkb3IoZXZlbnQpe1xuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRleHRvUmVnaXN0cm8gPSBldmVudC5kYXRhXG4gIH1cblxuICBvYnRlbmVyQXJjaGl2b1BsYW5pbGxhKGV2ZW50KXtcbiAgICB0aGlzLnJlcG9ydGVGdWVudGUuYXJjaGl2b0luZGl2aWR1YWwgPSBldmVudC5kYXRhXG4gIH1cblxuICBvYnRlbmVyQXJjaGl2b1NvcG9ydGUoZXZlbnQsIHNvcG9ydGUpe1xuICAgIHNvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWwgPSBldmVudC5kYXRhXG4gIH1cblxuICBvYnRlbmVyQXJjaGl2b0NvbHVtbmFyaW8oZXZlbnQpe1xuICAgIHRoaXMucmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvRXhjZWxDb2x1bW5hcmlvID0gZXZlbnQuZGF0YVxuICB9XG5cblxuICBtb3ZlckFBc29jaWFkbyhldmVudCl7XG4gICAgdGhpcy5yZXBvcnRlU2VydmljZS5hY3R1YWxpemFyUmVwb3J0ZUNvbHVtbmFPcmRlbih7XG4gICAgICBsaXN0YUFzb2NpYWRvOiB0aGlzLmxpc3RhRXhjZWwsXG4gICAgICBleGNlbDogdHJ1ZVxuICAgIH0pLnN1YnNjcmliZShkYXRhID0+IHt0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUl9WQVJJT1MpfSlcbiAgfVxuXG4gIG1vdmVyQURlc2Fzb2NpYWRvKGV2ZW50KXtcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcbiAgICAgIGxpc3RhRGVzYXNvY2lhZG86IHRoaXMubGlzdGFOb0V4Y2VsLFxuICAgICAgZXhjZWw6IHRydWVcbiAgICAgfSkuc3Vic2NyaWJlKGRhdGEgPT4ge3RoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSX1ZBUklPUyl9KVxuICB9XG5cbiAgbW92ZXJBQXNvY2lhZG9UYWJsYShldmVudCl7XG4gICAgdGhpcy5yZXBvcnRlU2VydmljZS5hY3R1YWxpemFyUmVwb3J0ZUNvbHVtbmFPcmRlbih7XG4gICAgICBsaXN0YUFzb2NpYWRvOiB0aGlzLmxpc3RhVGFibGEsXG4gICAgICBleGNlbDogZmFsc2VcbiAgICB9KS5zdWJzY3JpYmUoZGF0YSA9PiB7dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVJfVkFSSU9TKX0pXG4gIH1cblxuICBtb3ZlckFEZXNhc29jaWFkb1RhYmxhKGV2ZW50KXtcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcbiAgICAgIGxpc3RhRGVzYXNvY2lhZG86IHRoaXMubGlzdGFOb1RhYmxhLFxuICAgICAgZXhjZWw6IGZhbHNlXG4gICAgIH0pLnN1YnNjcmliZShkYXRhID0+IHt0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUl9WQVJJT1MpfSlcbiAgfVxuXG4gIHJlb3JkZXJUYWJsYShldmVudCl7XG4gICAgdGhpcy5yZXBvcnRlU2VydmljZS5hY3R1YWxpemFyUmVwb3J0ZUNvbHVtbmFPcmRlbih7XG4gICAgICBsaXN0YUFzb2NpYWRvOiB0aGlzLmxpc3RhVGFibGEsXG4gICAgICBleGNlbDogZmFsc2VcbiAgICAgfSkuc3Vic2NyaWJlKGRhdGEgPT4ge3RoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSX1ZBUklPUyl9KVxuICB9XG5cbiAgdmVyRGV0YWxsZU1hcmNhZG9yRXhjZWwoZXZlbnQpe1xuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwucmVzZXQoKTtcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JFeGNlbCA9IHRydWU7XG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbCA9IGV2ZW50LmRhdGE7XG4gICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5wYXRjaFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwpXG4gIH1cblxuICBudWV2b01hcmNhZG9yRXhjZWwoKXtcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnJlc2V0KCk7XG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSB0cnVlO1xuICAgIHRoaXMuZXNNYXJjYWRvciA9IGZhbHNlO1xuICAgIHRoaXMuZXNJbWFnZW5GaWphID0gZmFsc2U7XG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwucGF0Y2hWYWx1ZSh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsKVxuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCd0aXBvJykuc2V0VmFsdWUobnVsbClcbiAgfVxuXG4gIGd1YXJkYXJNYXJjYWRvckV4Y2VsKCl7XG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckV4Y2VsID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC52YWxpZCl7XG4gICAgICBsZXQgbGxhdmVSZWdpc3RybyA9ICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgnbGxhdmUnKS52YWx1ZVxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ3JlcG9ydGVGdWVudGUnKS5zZXRWYWx1ZSh0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUpXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgndGlwb1JlcG9ydGUnKS5zZXRWYWx1ZSgnRScpXG4gICAgICBpZiAobGxhdmVSZWdpc3Rybyl7XG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnZhbHVlKSkuc3Vic2NyaWJlKCBkYXRhID0+IHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XG4gICAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHt0aXBvUmVwb3J0ZTogJ0UnLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0l9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5saXN0YU1hcmNhZG9yRXhjZWwgPSBkYXRhO1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgnbGxhdmUnKS5zZXRWYWx1ZSh0aGlzLnV0aWxzU2VydmljZS5nZW5lcmFyTGxhdmUoKSlcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnZhbHVlKSkuc3Vic2NyaWJlKCBkYXRhID0+IHsgIFxuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckV4Y2VsID0gZmFsc2UgICAgICBcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XG4gICAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHt0aXBvUmVwb3J0ZTogJ0UnLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0l9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5saXN0YU1hcmNhZG9yRXhjZWwgPSBkYXRhO1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yRXhjZWwgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmNvbnRyb2xzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KGtleSkuZXJyb3JzKSB7XG4gICAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoa2V5KS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IFxuICB9XG5cbiAgZWxpbWluYXJNYXJjYWRvckV4Y2VsKGV2ZW50KXtcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxuICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsKSkuc3Vic2NyaWJlKGRhdGEgPT57XG4gICAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5yZXNldCgpO1xuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckV4Y2VsID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUilcbiAgICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge3RpcG9SZXBvcnRlOiAnRScsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RhTWFyY2Fkb3JFeGNlbCA9IGRhdGE7XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIFxuICB9XG5cbiAgLy9wbGFudGlsbGFcblxuICBjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKSB7XG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIHsgcmVwb3J0ZU1hcmNhZG9yOiB0aGlzLnJlcG9ydGVNYXJjYWRvci5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmxpc3RhQ2FtcG9zTWFyY2Fkb3IgPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBhc3luYyBjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JBc3luYygpIHtcbiAgICB0aGlzLmJsb3F1ZWFyQ2FtcG9NYXJjYWRvciA9IGZhbHNlO1xuICAgIHRoaXMubGlzdGFDYW1wb3NNYXJjYWRvciA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCB7IHJlcG9ydGVNYXJjYWRvcjogdGhpcy5yZXBvcnRlTWFyY2Fkb3IubGxhdmV9KSkudG9Qcm9taXNlKCk7XG4gIH1cblxuICB2ZXJEZXRhbGxlTWFyY2Fkb3IoZXZlbnQpe1xuICAgIC8vdGhpcy5mb3JtTWFyY2Fkb3IucmVzZXQoKTtcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3IgPSB0cnVlO1xuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yID0gZXZlbnQuZGF0YTtcbiAgICB0aGlzLmZvcm1NYXJjYWRvci5wYXRjaFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yKVxuICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgndGlwbycpLnNldFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpcG8pXG4gICAgXG4gICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKTtcbiAgfVxuXG4gIG51ZXZvTWFyY2Fkb3IoKXtcbiAgICAvL3RoaXMuZm9ybU1hcmNhZG9yLnJlc2V0KCk7XG4gICAgdGhpcy5mb3JtTWFyY2Fkb3IucmVzZXQoe30sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvciA9IHRydWU7XG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcbiAgICB0aGlzLmZvcm1NYXJjYWRvci5wYXRjaFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yKVxuICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgndGlwb1JlcG9ydGUnKS5zZXRWYWx1ZSgnUCcpXG4gICAgLy90aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG8nKS5zZXRWYWx1ZShudWxsKVxuICB9XG5cbiAgZ3VhcmRhck1hcmNhZG9yKCl7XG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvciA9IHRydWU7XG4gICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yLnZhbGlkKXtcbiAgICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3IgPSBmYWxzZTtcbiAgICAgIGxldCBsbGF2ZVJlZ2lzdHJvID0gIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgnbGxhdmUnKS52YWx1ZVxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCdyZXBvcnRlRnVlbnRlJykuc2V0VmFsdWUodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlKVxuICAgICAgLy90aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG9SZXBvcnRlJykuc2V0VmFsdWUoJ04nKVxuICAgICAgaWYgKGxsYXZlUmVnaXN0cm8pe1xuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5mb3JtTWFyY2Fkb3IudmFsdWUpKS5zdWJzY3JpYmUoIGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3JlcygpO1xuICAgICAgICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvID09ICdOJyl7XG4gICAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ2xsYXZlJykuc2V0VmFsdWUodGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCkpXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5mb3JtTWFyY2Fkb3IudmFsdWUpKS5zdWJzY3JpYmUoIGRhdGEgPT4geyAgICAgICAgICBcbiAgICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3IgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXMoKTtcbiAgICAgICAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTicpe1xuICAgICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybU1hcmNhZG9yLmNvbnRyb2xzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yLmdldChrZXkpLmVycm9ycykge1xuICAgICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldChrZXkpLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gXG4gIH1cblxuICBlbGltaW5hck1hcmNhZG9yKGV2ZW50KXtcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxuICAgICAgYWNjZXB0OiAoKSA9PiB7IFxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlTWFyY2Fkb3IpKS5zdWJzY3JpYmUoZGF0YSA9PntcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpXG4gICAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IucmVzZXQoKTtcbiAgICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3IgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvciA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCk7XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGVsaW1pbmFyQ2FtcG9NYXJjYWRvcihldmVudCwgb2JqZXRvKXsgXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgb2JqZXRvKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbnVldm9DYW1wb1RhYmxhKCl7XG4gICAgdGhpcy52ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlID0gdHJ1ZTtcbiAgICB0aGlzLmJsb3F1ZWFyQ2FtcG9NYXJjYWRvciA9IHRydWU7XG4gICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXIgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWwoKTtcbiAgICB0aGlzLmNhbXBvTWFyY2Fkb3JJbnNlcnRhci5yZXBvcnRlTWFyY2Fkb3IgPSB0aGlzLnJlcG9ydGVNYXJjYWRvci5sbGF2ZVxuICB9XG5cbiAgdmFsaWRhckNhbXBvTWFyY2Fkb3IoY2FtcG9NYXJjYWRvcil7XG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3IuY29sdW1uYSlcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvci5jYW1wb0Z1ZW50ZSlcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xuICB9XG5cbiAgZWRpdGFyQ2FtcG9NYXJjYWRvcigpIHtcbiAgICB0aGlzLmJsb3F1ZWFyQ2FtcG9NYXJjYWRvciA9IHRydWU7XG4gIH1cblxuICBhZ3JlZ2FyQ2FtcG9NYXJjYWRvcihjYW1wb01hcmNhZG9yKXtcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG8gPSB0cnVlO1xuICAgIGlmICghdGhpcy52YWxpZGFyQ2FtcG9NYXJjYWRvcihjYW1wb01hcmNhZG9yKSl7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbXBvTWFyY2Fkb3IucmVwb3J0ZU1hcmNhZG9yID0gdGhpcy5yZXBvcnRlTWFyY2Fkb3IubGxhdmU7XG4gICAgaWYgKCdJJyA9PSBjYW1wb01hcmNhZG9yLnRpcG8pe1xuICAgICAgaWYgKCFjYW1wb01hcmNhZG9yLmFuY2hvIHx8IGNhbXBvTWFyY2Fkb3IuYW5jaG8gPT0gMCl7XG4gICAgICAgIGNhbXBvTWFyY2Fkb3IuYW5jaG8gPSAxMDtcbiAgICAgIH1cbiAgICAgIGlmICghY2FtcG9NYXJjYWRvci5hbHRvIHx8IGNhbXBvTWFyY2Fkb3IuYWx0byA9PSAwKXtcbiAgICAgICAgY2FtcG9NYXJjYWRvci5hbHRvID0gMTA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChbJ0cnXS5pbmNsdWRlcyhjYW1wb01hcmNhZG9yLnRpcG8pKXtcbiAgICAgIGNhbXBvTWFyY2Fkb3IuY29sdW1uYSA9IDA7XG4gICAgfVxuICAgIGlmIChjYW1wb01hcmNhZG9yLmxsYXZlKXtcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBjYW1wb01hcmNhZG9yKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XG4gICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wbyA9IGZhbHNlO1xuICAgICAgICBjYW1wb01hcmNhZG9yID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsO1xuICAgICAgICB0aGlzLmJsb3F1ZWFyQ2FtcG9NYXJjYWRvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvcigpO1xuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY2FtcG9NYXJjYWRvci5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBjYW1wb01hcmNhZG9yKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XG4gICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wbyA9IGZhbHNlO1xuICAgICAgICBjYW1wb01hcmNhZG9yID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsO1xuICAgICAgICB0aGlzLnZlclJlcG9ydGVNYXJjYWRvckRldGFsbGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXIgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWwoKTtcbiAgICAgICAgdGhpcy5ibG9xdWVhckNhbXBvTWFyY2Fkb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKTtcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgY2FyZ2FyTGlzdGFTb3BvcnRlcygpe1xuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIHRpcG86ICdTJ30pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmxpc3RhU29wb3J0ZXMgPSBkYXRhO1xuICAgfSlcbiAgfVxuXG4gIGFzeW5jIGNhcmdhckxpc3RhU29wb3J0ZXNBc3luYygpe1xuICAgIHRoaXMubGlzdGFTb3BvcnRlcyA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIHRpcG86ICdTJ30pKS50b1Byb21pc2UoKVxuICB9XG5cbiAgbnVldm9Tb3BvcnRlKCl7XG4gICAgdGhpcy5zb3BvcnRlSW5ncmVzYXIgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbCgpO1xuICAgIHRoaXMudmVyU29wb3J0ZUFyY2hpdm9EZXRhbGxlID0gdHJ1ZTtcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSB0cnVlO1xuICB9XG5cbiAgY2FuY2VsYXJTb3BvcnRlKCkge1xuICAgIHRoaXMuc29wb3J0ZUluZ3Jlc2FyID0gbmV3IFJlcG9ydGVTb3BvcnRlTW9kZWwoKTtcbiAgICB0aGlzLnZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZSA9IGZhbHNlO1xuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xuICB9XG5cbiAgdmFsaWRhclNvcG9ydGUoc29wb3J0ZSl7XG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHNvcG9ydGUuZGVzY3JpcGNpb24pXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHNvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWwpXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcbiAgfVxuXG4gIGFncmVnYXJTb3BvcnRlKHNvcG9ydGUpe1xuICAgIHRoaXMuY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm8gPSB0cnVlO1xuICAgIGlmICghdGhpcy52YWxpZGFyU29wb3J0ZShzb3BvcnRlKSl7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFzb3BvcnRlLmxsYXZlVGFibGEpe1xuICAgICAgc29wb3J0ZS50aXBvID0gJ1MnXG4gICAgICBzb3BvcnRlLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmVcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCBzb3BvcnRlKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XG4gICAgICAgIHNvcG9ydGUgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbDtcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzKCk7XG4gICAgICAgIHRoaXMudmVyU29wb3J0ZUFyY2hpdm9EZXRhbGxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm8gPSBmYWxzZTtcbiAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCBzb3BvcnRlKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXMoKTtcbiAgICAgICAgICB0aGlzLnZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm8gPSBmYWxzZTtcbiAgICAgICAgICBzb3BvcnRlID0gbmV3IFJlcG9ydGVTb3BvcnRlTW9kZWw7XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcbiAgfVxuXG4gIGVsaW1pbmFyU29wb3J0ZShldmVudCwgc29wb3J0ZSl7XG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gdHJ1ZTtcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxuICAgICAgYWNjZXB0OiAoKSA9PiB7IFxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCBzb3BvcnRlKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzKCk7XG4gICAgICAgICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGluaWNpYXJFZGljaW9uKCkge1xuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IHRydWU7XG4gIH1cblxuICBhc3luYyBjYW5jZWxhckVkaWNpb24oKSB7IFxuICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlc0FzeW5jKCk7ICAgXG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XG4gICAgXG4gIH1cbiAgXG4gIC8vUmVwb3J0ZSBEaW5hbWljb1xuXG4gIGdlbmVyYXJKYXNwZXIoKXtcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmdlbmVyYXJKYXNwZXIodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCAnY29tcGVuc2FjaW9uL1JlcG9ydGVzQmFzZScpIC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1NlIGhhIGdlbmVyYWRvIGVsIGphc3BlciBleGl0b3NhbWVudGUnKVxuICAgICAgICB0aGlzLnZhbGlkYXJFeGlzdGVKYXNwZXIoKTtcbiAgICAgIH1cbiAgICB9KTsgICAgXG4gIH1cblxuXG4gIGRlc2Nhcmdhckphc3BlcigpIHtcblxuICAgIGxldCBwcm9waWVkYWQgPSAncnV0YV9wbGFudGlsbGFzJztcbiAgICAvL1J1dGEgYXJjaGl2b1xuICAgIHRoaXMuYXBsaWNhY2lvbiA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0VG9rZW5LZXkoJ2FwbGljYWNpb24nKVxuICAgIHRoaXMuY2FyZ2FyQXJjaGl2by5kZXNjYXJnYXJBcmNoaXZvKHRoaXMuZW5jcmlwdGFkb3JBcmNoaXZvLmVuY3JpcHRhcigncmVwb3J0ZXMvJyArIHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSArICcuanJ4bWwnKSwgcHJvcGllZGFkLCB0aGlzLmFwbGljYWNpb24pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBibG9iID0+IHtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIGEuaHJlZiA9IG9iamVjdFVybFxuICAgICAgYS5kb3dubG9hZCA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSArICcuanJ4bWwnIC8vZG9jdW1lbnRvLmFyY2hpdm9vcmlnZW47XG4gICAgICBhLmNsaWNrKCk7XG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCk7XG4gICAgfVxuICB9KTtcbiAgfVxuXG4gIG51ZXZvTWFyY2Fkb3JEaW5hbWljbygpe1xuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWxcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm9yaWdlbiA9ICdEJ1xuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZVxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGEgPSB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleVxuICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5yZXNldCgpO1xuICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5wYXRjaFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28pXG4gICAgdGhpcy5udWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gdHJ1ZVxuICB9XG5cbiAgdmVyTWFyY2Fkb3JEaW5hbWljbyhldmVudCl7XG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGV2ZW50LmRhdGE7XG4gICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbylcbiAgICB0aGlzLm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgdmVyQmFuZGEoZXZlbnQpe1xuICAgIHRoaXMudmVyVGFiQmFuZGEgPSBmYWxzZTtcbiAgICB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhID0gZXZlbnQuZGF0YTtcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsO1xuICAgIHRoaXMubnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGZhbHNlO1xuICAgIHRoaXMubnVldmFCYW5kYSA9IGZhbHNlO1xuICAgIGlmIChbJ2RldGFsbGUnLCdzdW1tYXJ5J10uaW5jbHVkZXModGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXkpKXtcbiAgICAgIGF3YWl0IHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvckRpbmFtaWNvKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVwb3J0ZUJhbmRhID0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvck9iamVjdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQmFuZGFEVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgYmFuZGE6IHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5fSkpLnRvUHJvbWlzZSgpO1xuICAgICAgaWYgKCF0aGlzLnJlcG9ydGVCYW5kYSkge1xuICAgICAgICB0aGlzLm51ZXZhQmFuZGEgPSB0cnVlO1xuICAgICAgICBpZiAoWydkZXRhbGxlJywnc3VtbWFyeSddLmluY2x1ZGVzKHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5KSl7XG4gICAgICAgICAgdGhpcy5udWV2YUJhbmRhID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXBvcnRlQmFuZGEgPSBuZXcgUmVwb3J0ZUJhbmRhTW9kZWw7XG4gICAgICAgIHRoaXMucmVwb3J0ZUJhbmRhLnRvdGFsZXMgPSAnUydcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvckRpbmFtaWNvKClcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zbGVlcCgyNSlcbiAgICB0aGlzLnZlclRhYkJhbmRhID0gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGNhcmdhckxpc3RhTWFyY2Fkb3JEaW5hbWljbygpe1xuICAgIHRoaXMubGlzdGFNYXJjYWRvckRpbmFtaWNvID0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHtcbiAgICAgIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgXG4gICAgICBiYW5kYTogdGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXksXG4gICAgICBvcmRlbkRpbmFtaWNvOiAnUycsXG4gICAgICBvcmlnZW46ICdEJ1xuICAgIH0pKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGd1YXJkYXJDYXJhY3RlcmlzdGljYUJhbmRhKCl7XG4gICAgaWYodGhpcy5udWV2YUJhbmRhKSB7XG4gICAgICB0aGlzLnJlcG9ydGVCYW5kYS5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlO1xuICAgICAgdGhpcy5yZXBvcnRlQmFuZGEuYmFuZGEgPSB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleTtcbiAgICAgIHRoaXMucmVwb3J0ZUJhbmRhID0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVCYW5kYURUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVCYW5kYSkpLnRvUHJvbWlzZSgpO1xuICAgIH1lbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVCYW5kYURUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVCYW5kYSkpLnRvUHJvbWlzZSgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnNsZWVwKDI1KVxuICAgIHRoaXMubnVldmFCYW5kYT1mYWxzZTtcbiAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyhcIlNlIGFjdHVhbGl6YXJvbiBsYXMgY2FyYWN0ZXJpc3RpY2FzIGRlIFwiK3RoaXMuYmFuZGFTZWxlY2Npb25hZGEudmFsdWUpO1xuICB9XG5cbiAgYXN5bmMgZ3VhcmRhckNvbHVtbmFEaW5hbWljbygpe1xuICAgIGlmICghdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLnZhbGlkKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJyk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoa2V5KS5lcnJvcnMpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoa2V5KS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28udmFsdWU7XG4gICAgaWYodGhpcy51dGlsc1NlcnZpY2UuaXNCbGFuayh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlKSl7XG4gICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlID0gdGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCk7XG4gICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm9yaWdlbiA9ICdEJztcbiAgICAgIGlmKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09ICdDJyl7XG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubWFyY2Fkb3IgPSB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZpbHRybztcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXBvcnRlQ29sdW1uYSA9IG51bGw7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgdmFyIGNvbHVtbmEgPSBuZXcgUmVwb3J0ZUNvbHVtbmFNb2RlbCgpO1xuICAgICAgICBjb2x1bW5hLmxsYXZlVGFibGEgPSB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm1hcmNhZG9yO1xuICAgICAgICBjb2x1bW5hID0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvck9iamVjdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCBjb2x1bW5hKSkudG9Qcm9taXNlKCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm1hcmNhZG9yID0gY29sdW1uYS5ub21icmU7XG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ucmVwb3J0ZUNvbHVtbmEgPSBjb2x1bW5hLmxsYXZlVGFibGE7XG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZmlsdHJvID0gY29sdW1uYS5zaW50YXhpcztcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvRGF0byA9IGNvbHVtbmEudGlwb0RhdG87XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28pKS50b1Byb21pc2UoKTtcbiAgICB9ZWxzZXtcbiAgICAgIGlmKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09ICdDJyl7XG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubWFyY2Fkb3IgPSB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZpbHRybztcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvKSkudG9Qcm9taXNlKCk7XG4gICAgfVxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBudWxsO1xuICAgIHRoaXMubnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGZhbHNlO1xuICAgIGF3YWl0IHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvckRpbmFtaWNvKClcbiAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbygnU2UgaGEgZ3VhcmRhZG8gZWwgY2FtYmlvJyk7XG4gIH1cblxuICByZWdyZXNhckJhbmRhU2VsZWNjaW9uYWRhKCl7XG4gICAgdGhpcy5iYW5kYVNlbGVjY2lvbmFkYSA9IHtrZXk6IG51bGwsIHZhbHVlOiBudWxsfVxuICB9XG5cbiAgYXN5bmMgZWxpbWluYXJDb2x1bW5hRGluYW1pY28oZXZlbnQpIHtcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxuICAgICAgYWNjZXB0OiBhc3luYyAoKSA9PiAge1xuICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyApKS50b1Byb21pc2UoKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKVxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKClcbiAgICAgICAgdGhpcy5udWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvckRpbmFtaWNvKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdmFsaWRhclNlcGFyYWRvcigpe1xuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLnJlcG9ydGVGdWVudGUuc2VwYXJhZG9yKTtcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xuICB9XG5cbiAgYWN0dWFsaXphclNlcGFyYWRvcigpe1xuICAgIHRoaXMuY2xpY2tHdWFyZGFyUmVwb3J0ZVRleHRvID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMudmFsaWRhclNlcGFyYWRvcigpKXtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFjdHVhbGl6YXIoKTtcbiAgfVxuXG4gIGNhcmdhckxpc3RhTWFyY2Fkb3Jlc1RleHRvKCl7XG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHtcbiAgICAgIHRpcG9SZXBvcnRlOiB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLlJFUE9SVEVBUkNISVZPUExBTk8sXG4gICAgICByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsXG4gICAgICBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJXG4gICAgfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMubGlzdGFNYXJjYWRvcmVzVGV4dG8gPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICB2ZXJNYXJjYWRvclRleHRvKGV2ZW50KXtcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JUZXh0byA9IHRydWU7XG4gICAgdGhpcy5tYXJjYWRvclRleHRvID0gZXZlbnQuZGF0YTtcbiAgfVxuXG4gIG51ZXZvTWFyY2Fkb3JUZXh0bygpe1xuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclRleHRvID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmNhZG9yVGV4dG8gPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcblx0XHR0aGlzLm1hcmNhZG9yVGV4dG8udGlwb1JlcG9ydGUgPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLlJFUE9SVEVBUkNISVZPUExBTk87XG4gIH1cblxuICB2YWxpZGFyTWFyY2Fkb3JUZXh0bygpIDogYm9vbGVhbntcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvKTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclRleHRvLmFsdG8pO1xuICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGVQaXBlLk1BUkNBRE9SVEVYVE9GSUpPID09IHRoaXMubWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbyl7XG4gICAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclRleHRvLmZvcm1hdG8pO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5NQVJDQURPUlRFWFRPRElOQU1JQ08gPT0gdGhpcy5tYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvKXtcbiAgICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yVGV4dG8uYW5jaG8pO1xuICAgICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JUZXh0by5yZXBvcnRlQ29sdW1uYSk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGFkb3I7XG4gIH1cblxuICBhc3luYyBndWFyZGFyTWFyY2Fkb3JUZXh0bygpe1xuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0byA9IHRydWU7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXJNYXJjYWRvclRleHRvKCkpIHtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvclRleHRvID0gZmFsc2U7XG4gICAgdGhpcy5tYXJjYWRvclRleHRvLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmU7XG4gICAgaWYgKHRoaXMubWFyY2Fkb3JUZXh0by5sbGF2ZSl7XG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvclRleHRvKSkudG9Qcm9taXNlKCk7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFyY2Fkb3JUZXh0by5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yVGV4dG8pKS50b1Byb21pc2UoKTtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcbiAgICB9XG4gICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXNUZXh0bygpO1xuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclRleHRvID0gZmFsc2U7XG4gIH1cblxuICBlbGltaW5hck1hcmNhZG9UZXh0byhldmVudCl7XG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcbiAgICAgIGFjY2VwdDogYXN5bmMgKCkgPT4gIHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JUZXh0bykpLnRvUHJvbWlzZSgpO1xuICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JUZXh0byA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1hcmNhZG9yVGV4dG8gPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXNUZXh0bygpO1xuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNhcmdhckxpc3RhWE1MKCl7XG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHtcbiAgICAgIHRpcG9SZXBvcnRlOiAnWCcsXG4gICAgICBvcmlnZW46ICdYJyxcbiAgICAgIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSxcbiAgICAgIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0lcbiAgICB9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5saXN0YVhNTCA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIG51ZXZvTWFyY2Fkb3JYTUwoKXtcbiAgICB0aGlzLm1hcmNhZG9yWE1MID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XG4gICAgdGhpcy5tYXJjYWRvclhNTC50aXBvUmVwb3J0ZSA9ICdYJztcbiAgICB0aGlzLm1hcmNhZG9yWE1MLm9yaWdlbiA9ICdYJztcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JYTUwgPSB0cnVlO1xuICB9XG5cbiAgdmVyTWFyY2Fkb3JYTUwoZXZlbnQpe1xuICAgIHRoaXMubWFyY2Fkb3JYTUwgPSBldmVudC5kYXRhO1xuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclhNTCA9IHRydWU7XG4gICAgaWYgICh0aGlzLm1hcmNhZG9yWE1MLnRpcG8gPT0gJ01SJyB8fCB0aGlzLm1hcmNhZG9yWE1MLnRpcG8gPT0gJ1RCJyl7XG4gICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTCgpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXJNYXJjYWRvclhNTCgpe1xuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yWE1MLmRlc2NyaXBjaW9uKTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclhNTC50aXBvKTtcbiAgICByZXR1cm4gdmFsaWRhZG9yXG4gIH1cblxuICBndWFyZGFyTWFyY2Fkb3JYTUwoKXtcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yWE1MID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMudmFsaWRhck1hcmNhZG9yWE1MKCkpe1xuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1hcmNhZG9yWE1MLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmU7XG4gICAgaWYgKHRoaXMubWFyY2Fkb3JYTUwubGxhdmUpe1xuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JYTUwpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcbiAgICAgICAgdGhpcy5tYXJjYWRvclhNTCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xuICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JYTUwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVhNTCgpO1xuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXJjYWRvclhNTC5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yWE1MKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XG4gICAgICAgIHRoaXMubWFyY2Fkb3JYTUwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcbiAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yWE1MID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFYTUwoKTtcbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUwgPSBmYWxzZTtcbiAgfVxuXG4gIGVsaW1pbmFyTWFyY2Fkb3JYTUwoZXZlbnQpe1xuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXG4gICAgICBhY2NlcHQ6IGFzeW5jICgpID0+ICB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yWE1MKSkudG9Qcm9taXNlKCk7XG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XG4gICAgICAgIHRoaXMubWFyY2Fkb3JYTUwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcbiAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yWE1MID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFYTUwoKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbnVldm9DYW1wb1RhYmxhWE1MKCl7XG4gICAgdGhpcy52ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlWE1MID0gdHJ1ZTtcbiAgICB0aGlzLmNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTCA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpO1xuICAgIHRoaXMuY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLnJlcG9ydGVNYXJjYWRvciA9IHRoaXMubWFyY2Fkb3JYTUwubGxhdmVcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSB0cnVlO1xuICB9XG5cbiAgY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MKCkge1xuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCB7IHJlcG9ydGVNYXJjYWRvcjogdGhpcy5tYXJjYWRvclhNTC5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUwgPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBhc3luYyBjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JYTUxBc3luYygpIHtcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcbiAgICB0aGlzLmxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUwgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgeyByZXBvcnRlTWFyY2Fkb3I6IHRoaXMubWFyY2Fkb3JYTUwubGxhdmV9KSkudG9Qcm9taXNlKCk7XG4gIH1cblxuICB2YWxpZGFyQ2FtcG9NYXJjYWRvclhNTChjYW1wb01hcmNhZG9yKXtcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvci5jYW1wb0Z1ZW50ZSk7XG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3IubWFyY2Fkb3IpO1xuICAgIHJldHVybiB2YWxpZGFkb3I7XG4gIH1cblxuICBhZ3JlZ2FyQ2FtcG9NYXJjYWRvclhNTChjYW1wbzogUmVwb3J0ZVRhYmxhTW9kZWwpe1xuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTCA9IHRydWU7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXJDYW1wb01hcmNhZG9yWE1MKGNhbXBvKSl7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNhbXBvLmxsYXZlKXtcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBjYW1wbykpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xuICAgICAgICB0aGlzLmNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTCA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpO1xuICAgICAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JYTUwoKTtcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbXBvLmNvbHVtbmEgPSAwO1xuICAgICAgY2FtcG8ubGxhdmUgPSB0aGlzLnV0aWxzU2VydmljZS5nZW5lcmFyTGxhdmUoKTtcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgY2FtcG8pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcbiAgICAgICAgY2FtcG8gPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWwoKTtcbiAgICAgICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MKCk7XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUwgPSBmYWxzZTtcbiAgICB0aGlzLnZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVYTUwgPSBmYWxzZTtcbiAgfVxuXG4gIGVsaW1pbmFyQ2FtcG9NYXJjYWRvclhNTChldmVudCwgb2JqZXRvKXsgXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgb2JqZXRvKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JYTUwoKTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY2FtYmlhclRhYkNvbHVtbmFyaW8oZXZlbnQpe1xuICAgIHN3aXRjaCAoZXZlbnQuaW5kZXgpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgdGhpcy5jYXJnYXJSZXBvcnRlQ29sdW1uYXJpbygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGhpcy5jYXJnYXJEYXRvc0FkaWNpb25hbGVzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB0aGlzLmNhcmdhck1hcmNhZG9yZXNDb2x1bW5hcmlvKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGNhcmdhck1hcmNhZG9yZXNDb2x1bW5hcmlvKCkge1xuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLm1hcmNhZG9yZXNDb2x1bW5hcmlvID0gZGF0YTtcbiAgICB9KVxuICB9XG5cblxuICBjYXJnYXJEYXRvc0FkaWNpb25hbGVzKCkge1xuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIGZpbHRyb0NvbHVtbmFCYXNpY2E6ICdOJ30pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmNvbHVtbmFzQWRpY2lvbmFsZXMgPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBjYXJnYXJSZXBvcnRlQ29sdW1uYXJpbygpe1xuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIGZpbHRyb0NvbHVtbmFCYXNpY2E6ICdTJ30pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmxpc3RhUmVwb3J0ZUNvbHVtbmFyaW8gPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBjYXJnYXJHcmFmaWNhc0NvbHVtbmFzKCkge1xuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5wYWdpbmFkb3JDb2x1bW5hcyA9IGRhdGE7XG4gICAgfSlcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQmFuZGFEVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgdG90YWxlczogJ0MnfSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMucGFnaW5hZG9yQ29sb3Jlc0dyYWZpY2EgPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICB2YWxpZGFyRXhpc3RlSmFzcGVyKCl7XG4gICAgdGhpcy5jYXJnYXJBcmNoaXZvLmRlc2NhcmdhckFyY2hpdm8odGhpcy5lbmNyaXB0YWRvckFyY2hpdm8uZW5jcmlwdGFyKCdyZXBvcnRlcy8nICsgdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlICsgJy5qcnhtbCcpLCAncnV0YV9wbGFudGlsbGFzJywgdGhpcy5hcGxpY2FjaW9uKS5zdWJzY3JpYmUoXG4gICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5leGlzdGVKYXNwZXIgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmV4aXN0ZUphc3BlciA9IGZhbHNlO1xuICAgICAgfVxuICAgICkgXG4gIH1cblxuICB2ZXJSZXBvcnRlQ29sdW1uYXJpbyhldmVudCl7XG4gICAgdGhpcy5jb2x1bW5hQmFzaWNhID0gZXZlbnQuZGF0YTtcbiAgICB0aGlzLnZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSB0cnVlO1xuICB9XG5cbiAgbnVldm9Db2x1bW5hQmFzaWNhKCl7XG4gICAgdGhpcy5jb2x1bW5hQmFzaWNhID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcbiAgICB0aGlzLmNvbHVtbmFCYXNpY2EucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcbiAgICB0aGlzLnZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSB0cnVlO1xuICB9XG5cbiAgdmFsaWRhckNvbHVtbmFCYXNpY2EoKXtcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcbiAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5ub21icmUpO1xuICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLnRpcG8pO1xuICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLnJlcG9ydGVDb2x1bW5hKTtcbiAgICBpZiAodmFsaWRhZG9yKXtcbiAgICAgIGlmICh0aGlzLmlzTW9zdHJhck9yZGVuKCkpe1xuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcmRlbik7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc01vc3RyYXJPcmRlbkNvbnN1bHRhKCkpe1xuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcmRlbkNvbnN1bHRhKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NFTERBID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvKSB7XG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm9wZXJhY2lvbik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ09MVU1OQT09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvKSB7XG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm9wZXJhY2lvbkhvcml6b250YWwpO1xuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcGVyYWNpb25WZXJ0aWNhbCk7XG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLmNvbHVtbmFPcGVyYWNpb25WZXJ0aWNhbCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fTEFCRUwgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG8pIHtcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2Eub3JkZXJCeSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGFkb3I7XG4gIH1cblxuICBhc3luYyB2ZXJpZmljYXJDb2x1bW5hc1ZhbGlkYXMocmVwb3J0ZUNvbHVtbmFyaW9EVE8pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB2YXIgdGlwbz1yZXBvcnRlQ29sdW1uYXJpb0RUTy50aXBvO1xuXHRcdGlmKHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fRklMQSA9PSByZXBvcnRlQ29sdW1uYXJpb0RUTy50aXBvKXtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHR2YXIgZmlsdHJvPW5ldyAgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xuXHRcdGZpbHRyby5yZXBvcnRlRnVlbnRlID0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8ucmVwb3J0ZUZ1ZW50ZTtcblx0XHRmaWx0cm8uZGlmZXJlbnRlQ29sdW1uYXJpbyA9IHJlcG9ydGVDb2x1bW5hcmlvRFRPLmxsYXZlVGFibGE7XG5cdFx0ZmlsdHJvLnRpcG8gPSB0aXBvO1xuXHRcdHZhciBjYW50aWRhZD0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jYW50aWRhZFJlZ2lzdHJvcyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCBmaWx0cm8pKS50b1Byb21pc2UoKTtcblx0XHRpZihjYW50aWRhZD09MCl7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DT0xVTU5BID09IHJlcG9ydGVDb2x1bW5hcmlvRFRPLnRpcG8pe1xuXHRcdFx0XHR0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93V2FybmluZyhcIkVsIHJlcG9ydGUgc29sbyBwdWVkZSBjb250ZW5lciAxIHJlZ2lzdHJvIGNvbiB0aXBvIFwiK3RoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ09MVU1OQV9ERVNDKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHRcdH1lbHNlIGlmKHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ0VMREEgPT0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8udGlwbyl7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93V2FybmluZyhcIkVsIHJlcG9ydGUgc29sbyBwdWVkZSBjb250ZW5lciAxIHJlZ2lzdHJvIGNvbiB0aXBvIFwiK3RoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ0VMREFfREVTQyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG5cdFx0fVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgZ3VhcmRhckNvbHVtbmFCYXNpY2EoKXtcbiAgICB0aGlzLmNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMudmFsaWRhckNvbHVtbmFCYXNpY2EoKSl7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIGlmIChhd2FpdCB0aGlzLnZlcmlmaWNhckNvbHVtbmFzVmFsaWRhcyh0aGlzLmNvbHVtbmFCYXNpY2EpKXtcbiAgICAgIGlmICh0aGlzLmNvbHVtbmFCYXNpY2EubGxhdmVUYWJsYSkge1xuICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB0aGlzLmNvbHVtbmFCYXNpY2EpKS50b1Byb21pc2UoKTtcbiAgICAgICAgdGhpcy5jb2x1bW5hQmFzaWNhID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcbiAgICAgICAgdGhpcy52ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvID0gZmFsc2U7XG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB0aGlzLmNvbHVtbmFCYXNpY2EpKS50b1Byb21pc2UoKTtcbiAgICAgICAgdGhpcy5jb2x1bW5hQmFzaWNhID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcbiAgICAgICAgdGhpcy52ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvID0gZmFsc2U7XG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcbiAgICAgIHRoaXMuY2FyZ2FyUmVwb3J0ZUNvbHVtbmFyaW8oKTtcbiAgICB9XG4gIH1cblxuICBlbGltaW5hckNvbHVtbmFCYXNpY2EoZXZlbnQpeyBcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxuICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUJhc2ljYSkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xuICAgICAgICAgIHRoaXMudmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpbyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY29sdW1uYUJhc2ljYSA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XG4gICAgICAgICAgdGhpcy5jYXJnYXJSZXBvcnRlQ29sdW1uYXJpbygpO1xuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbnVldmFDb2x1bW5hQWRpY2lvbmFsKCkge1xuICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbCA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XG4gICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmU7XG4gICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsLnRpcG8gPSB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0FESUNJT05BTDtcbiAgICB0aGlzLnZlck51ZXZvQ29sdW1uYUFkaWNpb25hbCA9IHRydWU7XG4gIH1cblxuICB2ZXJEZXRhbGxlQWRpY2lvbmFsKGV2ZW50KSB7XG4gICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsID0gZXZlbnQuZGF0YTtcbiAgICB0aGlzLnZlck51ZXZvQ29sdW1uYUFkaWNpb25hbCA9IHRydWU7XG4gIH1cblxuICB2YWxpZGFyQ29sdW1uYUFkaWNpb25hbCgpIHtcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQWRpY2lvbmFsLm5vbWJyZSk7XG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUFkaWNpb25hbC5zaW50YXhpcyk7XG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUFkaWNpb25hbC5vcmRlbik7XG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUFkaWNpb25hbC5vcmRlckJ5KTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQWRpY2lvbmFsLm9yZGVuQ29uc3VsdGEpO1xuICAgIHJldHVybiB2YWxpZGFkb3I7XG4gIH1cblxuICBhc3luYyBndWFyZGFyQ29sdW1uYUFkaWNpb25hbCgpIHtcbiAgICB0aGlzLmNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWwgPSB0cnVlO1xuICAgIGlmICghdGhpcy52YWxpZGFyQ29sdW1uYUFkaWNpb25hbCgpKXtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29sdW1uYUFkaWNpb25hbC5sbGF2ZVRhYmxhKSB7XG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB0aGlzLmNvbHVtbmFBZGljaW9uYWwpKS50b1Byb21pc2UoKTtcbiAgICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbCA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XG4gICAgICB0aGlzLnZlck51ZXZvQ29sdW1uYUFkaWNpb25hbCA9IGZhbHNlO1xuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5jb2x1bW5hQWRpY2lvbmFsKSkudG9Qcm9taXNlKCk7XG4gICAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xuICAgICAgdGhpcy52ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcbiAgICB9XG4gICAgdGhpcy5jbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsID0gZmFsc2U7XG4gICAgdGhpcy5jYXJnYXJEYXRvc0FkaWNpb25hbGVzKCk7XG4gIH1cblxuICBlbGltaW5hckNvbHVtbmFBZGljaW9uYWwoZXZlbnQpIHtcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxuICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUFkaWNpb25hbCkpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xuICAgICAgICAgIHRoaXMudmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcbiAgICAgICAgICB0aGlzLmNhcmdhckRhdG9zQWRpY2lvbmFsZXMoKTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbnVldm9NYXJjYWRvckNvbHVtbmFyaW8oKSB7XG4gICAgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8gPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsKCk7XG4gICAgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8ucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gdHJ1ZTtcbiAgfVxuXG4gIHZlckRldGFsbGVNYXJjYWRvckNvbHVtbmFyaW8oZXZlbnQpIHtcbiAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbyA9IGV2ZW50LmRhdGE7XG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpbyA9IHRydWU7XG4gIH1cblxuICB2YWxpZGFyTWFyY2Fkb3JDb2x1bW5hcmlvKCkge1xuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yQ29sdW1uYXJpby5tYXJjYWRvcik7XG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvLnRpcG8pO1xuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yQ29sdW1uYXJpby50ZXh0b1JlZ2lzdHJvKTtcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvckNvbHVtbmFyaW8uZGVzY3JpcGNpb24pO1xuICAgIHJldHVybiB2YWxpZGFkb3I7XG4gIH1cblxuICBhc3luYyBndWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvKCkge1xuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMudmFsaWRhck1hcmNhZG9yQ29sdW1uYXJpbygpKXtcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvLmxsYXZlVGFibGEpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8pKS50b1Byb21pc2UoKTtcbiAgICAgIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbCgpO1xuICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpbyA9IGZhbHNlO1xuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbykpLnRvUHJvbWlzZSgpO1xuICAgICAgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8gPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsKCk7XG4gICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XG4gICAgfVxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XG4gICAgdGhpcy5jYXJnYXJNYXJjYWRvcmVzQ29sdW1uYXJpbygpO1xuICB9XG5cbiAgZWxpbWluYXJNYXJjYWRvckNvbHVtbmFyaW8oZXZlbnQpIHtcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxuICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcbiAgICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8gPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsKCk7XG4gICAgICAgICAgdGhpcy5jYXJnYXJNYXJjYWRvcmVzQ29sdW1uYXJpbygpO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgZ3VhcmRhckdyYWZpY28oKSB7XG4gICAgdGhpcy5hY3R1YWxpemFyKCk7XG4gICAgdGhpcy5wYWdpbmFkb3JDb2x1bW5hcy5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwgZGF0YSkpLnN1YnNjcmliZShkYXRhID0+IHt9KVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHZlckdyYWZpY28oKSB7XG4gICAgdGhpcy5yZXBvcnRlU2VydmljZS52ZXJHcmFmaWNvKHtsbGF2ZVJlcG9ydGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIGxldCBjb2x1bW5hID0gdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmNhcmdhckdyYWZpY2Eoe2FjY2lvbjogZGF0YS50aXBvR3JhZmljbywgZGF0b3NHcmFmaWNhOiBkYXRhfSk7XG4gICAgICB0aGlzLmdyYWZpY2EgPSBjb2x1bW5hO1xuICAgICAgdGhpcy51dGlsc1NlcnZpY2Uuc2xlZXAoNTAwKS50aGVuKGRhdGEyID0+IHtcbiAgICAgICAgdGhpcy5kaXZHcmFmaWNhLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pO1xuICAgICAgfSlcbiAgICAgIGxldCByZXNwdWVzdGEgPSB0aGlzLmRhc2hib2FyZFBpcGUuVElQT19HUkFGSUNPX0NIQVJULmZpbHRlcihkYXRhID0+IGRhdGEuY29kaWdvID09IGNvbHVtbmEuZGF0b3NHcmFmaWNhLnRpcG9HcmFmaWNvKTtcbiAgICAgIGlmIChyZXNwdWVzdGEubGVuZ3RoIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb2x1bW5hLnRpcG9HcmFmaWNvID0gcmVzcHVlc3RhWzBdLmNvZGlnb0NoYXJ0O1xuICAgICAgdGhpcy50aXBvR3JhZmljYSA9ICBjb2x1bW5hLnRpcG9HcmFmaWNvO1xuICAgICAgY29uc29sZS5sb2codGhpcy50aXBvR3JhZmljYSlcbiAgICB9KVxuICB9XG5cbiAgbnVldm9Db2xvckNhdGVnb3JpYSgpe1xuICAgIHRoaXMuY29sb3JDYXRlZ29yaWEgPSBuZXcgUmVwb3J0ZUJhbmRhTW9kZWwoKTtcbiAgICB0aGlzLmNvbG9yQ2F0ZWdvcmlhLmJhbmRhID0gJyNGRkZGRkYnO1xuICAgIHRoaXMudmVyQ29sb3JDYXRlZ29yaWFEZXRhbGxlID0gdHJ1ZTtcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSB0cnVlO1xuICB9XG5cbiAgY2FuY2VsYXJDb2xvckNhdGVnb3JpYSgpIHtcbiAgICB0aGlzLmNvbG9yQ2F0ZWdvcmlhID0gbmV3IFJlcG9ydGVCYW5kYU1vZGVsKCk7XG4gICAgdGhpcy52ZXJDb2xvckNhdGVnb3JpYURldGFsbGUgPSBmYWxzZTtcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcbiAgfVxuXG4gIHZhbGlkYXJDb2xvckNhdGVnb3JpYShjb2xvcil7XG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yLnRpdHVsbylcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3IuYmFuZGEpXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcbiAgfVxuXG4gIGFncmVnYXJDb2xvckNhdGVnb3JpYShjb2xvcil7XG4gICAgdGhpcy5jbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYSA9IHRydWU7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXJDb2xvckNhdGVnb3JpYShjb2xvcikpe1xuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY29sb3IubGxhdmVUYWJsYSl7XG4gICAgICBjb2xvci50b3RhbGVzID0gJ0MnXG4gICAgICBjb2xvci5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUJhbmRhRFRPJywgbnVsbCwgZmFsc2UsIGNvbG9yKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XG4gICAgICAgIGNvbG9yID0gbmV3IFJlcG9ydGVCYW5kYU1vZGVsKCk7XG4gICAgICAgIHRoaXMuY2FyZ2FyR3JhZmljYXNDb2x1bW5hcygpO1xuICAgICAgICB0aGlzLnZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNsaWNrR3VhcmRhckNvbG9yQ2F0ZWdvcmlhID0gZmFsc2U7XG4gICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUJhbmRhRFRPJywgbnVsbCwgZmFsc2UsIGNvbG9yKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcbiAgICAgICAgICB0aGlzLmNhcmdhckdyYWZpY2FzQ29sdW1uYXMoKTtcbiAgICAgICAgICB0aGlzLnZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWEgPSBmYWxzZTtcbiAgICAgICAgICBjb2xvciA9IG5ldyBSZXBvcnRlQmFuZGFNb2RlbCgpO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XG4gIH1cblxuICBlbGltaW5hckNvbG9yQ2F0ZWdvcmlhKGV2ZW50LCBjb2xvcil7XG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gdHJ1ZTtcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxuICAgICAgYWNjZXB0OiAoKSA9PiB7IFxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQmFuZGFEVE8nLCBudWxsLCBmYWxzZSwgY29sb3IpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcbiAgICAgICAgICB0aGlzLmNhcmdhckdyYWZpY2FzQ29sdW1uYXMoKTtcbiAgICAgICAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgY2FuY2VsYXJFZGljaW9uQ29sb3IoKSB7IFxuICAgIHRoaXMuY2FyZ2FyR3JhZmljYXNDb2x1bW5hcygpOyAgIFxuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGlzRmlqbygpOmJvb2xlYW57XG4gICAgcmV0dXJuIHRoaXMuZmlsdHJvT3JpZ2VuRnVlbnRlKHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuRklKTyk7XG4gIH1cblxuICBwdWJsaWMgaXNTcWwoKTpib29sZWFue1xuICAgIHJldHVybiB0aGlzLmZpbHRyb09yaWdlbkZ1ZW50ZSh0aGlzLnJlcG9ydGVGdWVudGVQaXBlLlNRTCk7XG4gIH1cblxuICAvKipcblx0ICogUGVybWl0ZSBjb25vY2VyIHNpIHNlIGRlYmUgcHJlc2VudGFyIGVuIGxhIGludGVyZmF6IGxvcyBjYW1wb3MgcmVmZXJlbnRlcyBhIG9yZGVuIGNvbnN1bHRhXG5cdCAqIEByZXR1cm4gU2kgc2UgZGViZSBtb3N0cmFyIHNlIHJldG9ybmFyYSB0cnVlLCBkZSBsbyBjb250cmFyaW8gZmFsc2Vcblx0ICovXG5cdGlzTW9zdHJhck9yZGVuQ29uc3VsdGEoKXtcblx0XHRyZXR1cm4gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19GSUxBID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvO1xuXHR9XG5cdFxuXG5cdGlzTW9zdHJhck9yZGVuKCl7XG5cdFx0cmV0dXJuIHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fRklMQSA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwb3x8XG5cdFx0XHRcdHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ09MVU1OQSA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwb3x8dGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19MQUJFTCA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbztcblx0fVxuXG5cdGlzVGlwb0NvbHVtbmEoKXtcblx0XHRyZXR1cm4gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DT0xVTU5BID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvO1xuXHR9XG5cdFxuXG5cdGlzVGlwb0ZpbGEoKXtcblx0XHRyZXR1cm4gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19GSUxBID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvO1x0XG5cdH1cblxuXHRpc1RpcG9MYWJlbCgpe1xuXHRcdHJldHVybiB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0xBQkVMID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvO1x0XG5cdH1cblxuICBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gIH1cblxuICBwdWJsaWMgaXNGdWVudGUoKTpib29sZWFue1xuICAgIHJldHVybiB0aGlzLmZpbHRyb09yaWdlbkZ1ZW50ZSh0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkZVRU5URSk7XG4gIH1cblxuICBwdWJsaWMgZmlsdHJvT3JpZ2VuRnVlbnRlKHRpcG86c3RyaW5nKTpib29sZWFue1xuICAgIHJldHVybiB0aGlzLnJlcG9ydGVGdWVudGUub3JpZ2VuRnVlbnRlID09IHRpcG87XG4gIH1cbn0iLCI8cC10YWJWaWV3IChvbkNoYW5nZSk9XCJjYW1iaWFyVGFiKCRldmVudClcIj5cbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydleGNlbCcgfCB0cmFuc2xhdGUgfX1cIiBbc2VsZWN0ZWRdPVwidHJ1ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LXNlbWlib2xkXCI+e3snZGViZScgfCB0cmFuc2xhdGV9fSB7eydpbmRpY2FyJyB8IHRyYW5zbGF0ZX19IHt7J3BsYW50aWxsYScgfCB0cmFuc2xhdGV9fSB7eyd5JyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIHt7J2hvamEnIHwgdHJhbnNsYXRlfX0ge3sncGFyYScgfCB0cmFuc2xhdGV9fSB7eydxdWUnIHwgdHJhbnNsYXRlfX0ge3snZXN0YScgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICB7eydvcGNpb24nIHwgdHJhbnNsYXRlfX0ge3snc2UnIHwgdHJhbnNsYXRlfX0ge3snYWN0aXZlJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvVG9kbyA/IHJlcG9ydGVGdWVudGUuYXJjaGl2b1RvZG86ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXh0ZW5zaW9uZXNdPVwiJ3hsczt4bHN4J1wiIFttb3N0cmFyb2JsaWNhcmdvXT1cInRydWVcIiBbbGFiZWxyYXJdPVwiJ3BsYW50aWxsYScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvKCRldmVudClcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmhvamFFeGNlbFwiIHNpemU9XCIyNVwiIG1heGxlbmd0aD1cIjIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZScgfCB0cmFuc2xhdGUgfX0ge3snZGUnIHwgdHJhbnNsYXRlIH19IHt7J2xhJyB8IHRyYW5zbGF0ZSB9fSB7eydob2phJyB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2lmcmFkb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9FeGNlbFwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2lmcmFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlZnJlc2hcIiBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0dWFsaXphcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxwLXBpY2tMaXN0IFtzb3VyY2VdPVwibGlzdGFFeGNlbFwiIFt0YXJnZXRdPVwibGlzdGFOb0V4Y2VsXCIgc291cmNlSGVhZGVyPVwiQXNvY2lhZG9cIiBzb3VyY2VGaWx0ZXJQbGFjZWhvbGRlcj1cIkFzb2NpYWRvXCJcbiAgICAgICAgICAgIHRhcmdldEhlYWRlcj1cIkRlc2Fzb2NpYWRvXCIgW2RyYWdkcm9wXT1cInRydWVcIiBbcmVzcG9uc2l2ZV09XCJ0cnVlXCIgdGFyZ2V0RmlsdGVyUGxhY2Vob2xkZXI9XCJEZXNhc29jaWFkb1wiXG4gICAgICAgICAgICBmaWx0ZXJCeT1cInNpbnRheGlzXCIgKG9uU291cmNlUmVvcmRlcik9XCJtb3ZlckFBc29jaWFkbygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbk1vdmVBbGxUb1RhcmdldCk9XCJtb3ZlckFEZXNhc29jaWFkbygkZXZlbnQpXCIgKG9uTW92ZUFsbFRvU291cmNlKT1cIm1vdmVyQUFzb2NpYWRvKCRldmVudClcIlxuICAgICAgICAgICAgKG9uTW92ZVRvVGFyZ2V0KT1cIm1vdmVyQURlc2Fzb2NpYWRvKCRldmVudClcIiAob25Nb3ZlVG9Tb3VyY2UpPVwibW92ZXJBQXNvY2lhZG8oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1leGNlbCBwVGVtcGxhdGU9XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ZXhjZWwubm9tYnJlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLXBpY2tMaXN0PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bFwiPnt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX08L2gxPlxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGZvbnQtc2VtaWJvbGRcIiBpY29uPVwicGkgcGktcGx1c1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2b01hcmNhZG9yRXhjZWwoKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JFeGNlbFwiPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JFeGNlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9NYXJjYWRvckV4Y2VsID0gZmFsc2VcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFNYXJjYWRvckV4Y2VsXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiIFtzZWxlY3Rpb25dPVwicmVwb3J0ZU1hcmNhZG9yRXhjZWxcIiBbcm93c109XCIxMFwiXG4gICAgICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJsaXN0YU1hcmNhZG9yRXhjZWwubGVuZ3RoXCIgW3BhZ2luYXRvcl09XCJsaXN0YU1hcmNhZG9yRXhjZWwubGVuZ3RoID4gMTBcIlxuICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwidmVyRGV0YWxsZU1hcmNhZG9yRXhjZWwoJGV2ZW50KVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JFeGNlbFwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cblxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtbWFyY2Fkb3I+XG4gICAgICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwibWFyY2Fkb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLmRlc2NyaXBjaW9ufX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPiBcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPjwvYXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPiAgICAgICAgICAgIDwvcC10YWJsZT5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbXQtM1wiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibXQtM1wiPjxpIGNsYXNzPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJvb2tcIj48L2k+e3snZGV0YWxsZScgfCB0cmFuc2xhdGV9fTwvaDU+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTQgXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybU1hcmNhZG9yRXhjZWxcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIHAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXBjaW9uXCIgc2l6ZT1cIjI1XCIgbWF4bGVuZ3RoPVwiNDAwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIm1hcmNhZG9yXCIgc2l6ZT1cIjI1XCIgbWF4bGVuZ3RoPVwiNDAwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIlt7bGFiZWw6ICdJbWFnZW4gRmlqYScsIHZhbHVlOiAnSUYnfSwge2xhYmVsOiAnTWFyY2Fkb3InLCB2YWx1ZTogJ01BJ31dXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cInRpcG9cIiBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCIgW2hpZGRlbl09XCJlc0ltYWdlbkZpamFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cInRleHRvUmVnaXN0cm9cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3ZhbG9yJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJlc01hcmNhZG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIlt7bGFiZWw6ICdVbmljYScsIHZhbHVlOiAnVSd9LCB7bGFiZWw6ICdDYWRhIEVtcHJlc2EnLCB2YWx1ZTogJ0MnfV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwib3JpZ2VuXCIgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmlnZW4nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cImVzTWFyY2Fkb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0ZXh0b1JlZ2lzdHJvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZXBvcnRlTWFyY2Fkb3JFeGNlbC50ZXh0b1JlZ2lzdHJvID8gcmVwb3J0ZU1hcmNhZG9yRXhjZWwudGV4dG9SZWdpc3RybzogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvbmVzXT1cIidqcGc7cG5nJ1wiIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9waWVkYWRdPVwiJ3J1dGFfcmVjdXJzb3MnXCIgIFtsYWJlbHJhcl09XCIoJ3JlY3Vyc29zJyB8IHRyYW5zbGF0ZSlcIiBbbGFiZWxhcmNoXT1cIidyZWN1cnNvJyB8IHRyYW5zbGF0ZVwiIFttb3N0cmFyWF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb3N0cmFyb2JsaWNhcmdvXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Jvb2xlYW5vXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8ocmVwb3J0ZU1hcmNhZG9yRXhjZWwudGV4dG9SZWdpc3RybykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JFeGNlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYW5leG9Qcm9waWVkYWRdPVwicmVwb3J0ZU1hcmNhZG9yRXhjZWwub3JpZ2VuID09J0MnID8gbGxhdmVFbXByZXNhOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGllZGFkRGVTaXN0ZW1hXT1cInRydWVcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIHt7cmVwb3J0ZU1hcmNhZG9yRXhjZWwubGxhdmUgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7cmVwb3J0ZU1hcmNhZG9yRXhjZWwubGxhdmUgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCIgKGNsaWNrKT1cImd1YXJkYXJNYXJjYWRvckV4Y2VsKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRXhjZWwubGxhdmUgIT0gbnVsbFwiIGxhYmVsPVwie3snbGlua19lbGltaW5hcicgfCB0cmFuc2xhdGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9wLXRhYlBhbmVsPlxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J3BsYW50aWxsYScgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTaU5vXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2b1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snc29wb3J0ZScgfCB0cmFuc2xhdGUgfX0ge3sndW5pY28nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5kZXNjYXJnYXJGdWVudGVcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NhcmdhcmRvYycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTaU5vXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmdlbmVyYXJQaW5cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2dlbmVyYXJwaW4nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQ29sdW1uYXNcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY2FtcG9BZ3J1cGFjaW9uUGxhbmlsbGFcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWdydXBhcnBvcicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUubm9tYnJlQWdydXBhY2lvblBsYW5pbGxhXCIgc2l6ZT1cIjI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZWFyY2hpdm9hZ3J1cGFjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY2lmcmFkb1BsYW5pbGxhXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm8gPT0gJ04nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvSW5kaXZpZHVhbCA/IHJlcG9ydGVGdWVudGUuYXJjaGl2b0luZGl2aWR1YWw6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxyYXJdPVwiJ2FyY2hpdm8nIHwgdHJhbnNsYXRlXCIgW2xhYmVsYXJjaF09XCInYXJjaGl2bycgfCB0cmFuc2xhdGVcIiBbbW9zdHJhcm9ibGljYXJnb109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RlZCk9XCJvYnRlbmVyQXJjaGl2b1BsYW5pbGxhKCRldmVudClcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImFjdHVhbGl6YXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cC10YWJWaWV3ID5cbiAgICAgICAgICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlIH19XCIgW3NlbGVjdGVkXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGZvbnQtc2VtaWJvbGQgbWItMlwiIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2b01hcmNhZG9yKClcIiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9NYXJjYWRvciA9IGZhbHNlXCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7eydtYXJjYWRvcmVzJyB8IHRyYW5zbGF0ZX19XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YU1hcmNhZG9yZXNcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiIFtzZWxlY3Rpb25dPVwicmVwb3J0ZU1hcmNhZG9yXCJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhTWFyY2Fkb3Jlcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhTWFyY2Fkb3Jlcy5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JcIlxuICAgICAgICAgICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyRGV0YWxsZU1hcmNhZG9yKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3IoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmNhZG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJtYXJjYWRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLmRlc2NyaXBjaW9ufX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLnRpcG8gfCByZXBvcnRlRnVlbnRlUGlwZSA6ICdsaXN0YVRpcG9EYXRvTWFyY2Fkb3Jlcyd9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY2Fkb3IudGlwbyA9PSAnSUYnID8gbWFyY2Fkb3IudGV4dG9SZWdpc3RybyA6IG1hcmNhZG9yLm5vbWJyZUNvbHVtbmF9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY2Fkb3IubWFyY2Fkb3J9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCI+IFxuICAgICAgICAgICAgICAgIDxhcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+PC9hcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+ICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtTWFyY2Fkb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57eydpbmRpcXVlJyB8IHRyYW5zbGF0ZX19IHt7J2VuJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hJyB8IHRyYW5zbGF0ZX19IHt7J2Rlc2VhJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydhcGFyZXpjYScgfCB0cmFuc2xhdGV9fSB7eydsYScgfCB0cmFuc2xhdGV9fSB7eydpbmZvcm1hY2lvbicgfCB0cmFuc2xhdGV9fS4ge3snbGEnIHwgdHJhbnNsYXRlfX0ge3sncHJpbWVyYScgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hJyB8IHRyYW5zbGF0ZX19IHt7J2VzJyB8IHRyYW5zbGF0ZX19IHt7J2xhJyB8IHRyYW5zbGF0ZX19IDEuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXBjaW9uXCIgc2l6ZT1cIjI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNDAwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvclwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpcG9cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIShbJ01BJywnSU0nLCdNUicsJ0lGJywnUVInLCdCQycsJ0cxJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIm1hcmNhZG9yXCIgc2l6ZT1cIjI1XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ1RCJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInRhYmxhXCIgc2l6ZT1cIjI1XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RhYmxhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ0lGJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJbe2xhYmVsOiAnVW5pY2EnLCB2YWx1ZTogJ1UnfSwge2xhYmVsOiAnQ2FkYSBFbXByZXNhJywgdmFsdWU6ICdDJ31dXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBmb3JtQ29udHJvbE5hbWU9XCJvcmlnZW5cIiBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JpZ2VuJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdJRicgfHwgIXJlcG9ydGVNYXJjYWRvci5vcmlnZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGV4dG9SZWdpc3Ryb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyA/IHJlcG9ydGVNYXJjYWRvci50ZXh0b1JlZ2lzdHJvOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb3N0cmFyb2JsaWNhcmdvXT1cInRydWVcIiBbbW9zdHJhclhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtib29sZWFub109XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHJlcG9ydGVNYXJjYWRvci50ZXh0b1JlZ2lzdHJvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtleHRlbnNpb25lc109XCInanBnO3BuZydcIiAob25TZWxlY3RlZCk9XCJvYnRlbmVyQXJjaGl2b01hcmNhZG9yKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGllZGFkXT1cIidydXRhX3JlY3Vyc29zJ1wiIFtsYWJlbHJhcl09XCIncmVjdXJzb3MnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FuZXhvUHJvcGllZGFkXT1cInJlcG9ydGVNYXJjYWRvci5vcmlnZW4gPT0nQycgPyBsbGF2ZUVtcHJlc2E6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BpZWRhZERlU2lzdGVtYV09XCJ0cnVlXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhWydNQScsJ0lNJywnUVInLCdCQycsJ0cxJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQ29sdW1uYXNcIiBmb3JtQ29udHJvbE5hbWU9XCJyZXBvcnRlQ29sdW1uYVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnTUEnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZm9ybWF0b1wiIHNpemU9XCIyNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ0lNJywnSUYnLCdRUicsJ0JDJywnRzEnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgZm9ybUNvbnRyb2xOYW1lPVwiYW5jaG9cIiBbbWF4bGVuZ3RoXT1cIjVcIj4gPC9wLWlucHV0TnVtYmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhWydJTScsJ0lGJywnUVInLCdCQycsJ0cxJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIGZvcm1Db250cm9sTmFtZT1cImFsdG9cIiBbbWF4bGVuZ3RoXT1cIjVcIj4gPC9wLWlucHV0TnVtYmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbHRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ01SJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImdydXBvMVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2dydXBvMScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnTVInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwiZ3J1cG8yXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZ3J1cG8yJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ01SJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImdydXBvM1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2dydXBvMycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdNUidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJmaW5hbEdydXBvXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZmluYWxncnVwbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdNUidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJ0ZXh0b1JlZ2lzdHJvXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGV4dG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIVsnTVInLCdUQiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVNpTm9cIiBmb3JtQ29udHJvbE5hbWU9XCJ0aWVuZVNxbFwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snc3FsJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ1RCJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9HcmFmaWNvX0pGQ1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGlwb0dyYWZpY29cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydncmFmaWNhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhKFsnTVInLCdUQiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKSAmJiAoWydTJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsKSkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwicXVlcnlcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb25zdWx0YScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhKFsnTVInLCdUQiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKSAmJiAoWydOJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsKSkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhRnVlbnRlc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZnVlbnRlXCIgb3B0aW9uTGFiZWw9XCJkZXNjcmlwY2lvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Z1ZW50ZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cIiFyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY29cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJtYXJjYWRvckdyYWZpY29cIiBzaXplPVwiMjVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3JncmFmaWNhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ0EnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY28pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0dWxveFwiIHNpemU9XCIyNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXR1bG8nIHwgdHJhbnNsYXRlIH19IFg8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhWydBJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInRpdHVsb3lcIiBzaXplPVwiMjVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGl0dWxvJyB8IHRyYW5zbGF0ZSB9fSBZPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCIhcmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiYmFuZGFcIiBzaXplPVwiMjVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sb3JkaW5hbWljbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cIiFyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY29cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJhbmNob0phc3BlckxhYmVsXCIgc2l6ZT1cIjI1XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J251bWVyb2NhdGVnb3JpYXMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEoWydNUicsJ1RCJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pICYmIChbJ04nXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGllbmVTcWwpKSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJmaWx0cm9cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmaWx0cm8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdseXBoaWNvbnMge3tyZXBvcnRlTWFyY2Fkb3IubGxhdmUgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJyB9fVwiIGxhYmVsPVwie3tyZXBvcnRlTWFyY2Fkb3IubGxhdmUgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImd1YXJkYXJNYXJjYWRvcigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlcG9ydGVNYXJjYWRvci5sbGF2ZSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb3IoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yICYmIHJlcG9ydGVNYXJjYWRvci5sbGF2ZSAhPSBudWxsICYmIChyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnTVInIHx8IHJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQicpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwibnVldm9DYW1wb1RhYmxhKClcIiBpY29uPVwicGkgcGktcGx1c1wiIFtkaXNhYmxlZF09XCJibG9xdWVhckNhbXBvTWFyY2Fkb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1yaXBwbGUgcC1lbGVtZW50IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLXNlY29uZGFyeSBtYi0yXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFDYW1wb3NNYXJjYWRvclwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc3RyaXBlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFDYW1wb3NNYXJjYWRvci5sZW5ndGhcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFDYW1wb3NNYXJjYWRvci5sZW5ndGggPiAxMFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCIgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cIntmaXJzdH0gYWwge2xhc3R9IGRlIHt0b3RhbFJlY29yZHN9IHJlZ2lzdHJvc1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGU9XCJyb3dcIiBkYXRhS2V5PVwibGxhdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJTtcIj57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+e3snY2FtcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJTtcIj57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInXCI+e3sndGlwbycgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlO1wiKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInXCI+e3snbWVkaWRhcycgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlO1wiPiA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiVGFibGFOdWV2b1JlZ2lzdHJvXCIgKm5nSWY9XCJ2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jb2x1bW5hXCIgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJyk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLmNhbXBvRnVlbnRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLmZvcm1hdG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLnRpcG9cIiBhcHBlbmRUbz1cImJvZHlcIiBbYXV0b1pJbmRleF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLnRpcG8gPT0nSSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLmFuY2hvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhci5hbHRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbHRvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ2FtcG9NYXJjYWRvcihjYW1wb01hcmNhZG9ySW5zZXJ0YXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInZlclJlcG9ydGVNYXJjYWRvckRldGFsbGUgPSBmYWxzZTsgYmxvcXVlYXJDYW1wb01hcmNhZG9yID0gZmFsc2VcIiBpY29uPVwicGkgcGktdGltZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWNhbXBvIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwRWRpdGFibGVSb3ddPVwiY2FtcG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0ICB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uY29sdW1uYVwiIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5jb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLmNvbHVtbmEpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLmNvbHVtbmF9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5jYW1wb0Z1ZW50ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uY2FtcG9GdWVudGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uZm9ybWF0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLmZvcm1hdG99fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUdyYWZpY29cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2FtcG8udGlwb1wiIGFwcGVuZFRvPVwiYm9keVwiIFthdXRvWkluZGV4XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLnRpcG8gfCByZXBvcnRlRnVlbnRlUGlwZSA6J2xpc3RhUmVjdXJzb0dyYWZpY2EnfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNhbXBvLnRpcG8gPT0nSSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmFuY2hvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uYWx0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbHRvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNhbXBvLnRpcG8gPT0nSSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J2FuY2hvJyB8IHRyYW5zbGF0ZX19OiB7e2NhbXBvLmFuY2hvfX0gPGJyLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J2FsdG8nIHwgdHJhbnNsYXRlfX06IHt7Y2FtcG8uYWx0b319XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0hFQ0sgR1VBUkRBUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhckNhbXBvTWFyY2Fkb3IoY2FtcG8pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENBTkNFTEFSIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvckFzeW5jKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFRElUQVIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93IFtkaXNhYmxlZF09XCJibG9xdWVhckNhbXBvTWFyY2Fkb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXBlbmNpbFwiIChjbGljayk9XCJlZGl0YXJDYW1wb01hcmNhZG9yKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXNlY29uZGFyeSBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFTElNSU5BUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBEZWxldGVFZGl0YWJsZVJvdyBbZGlzYWJsZWRdPVwiYmxvcXVlYXJDYW1wb01hcmNhZG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCIgKGNsaWNrKT1cImVsaW1pbmFyQ2FtcG9NYXJjYWRvcigkZXZlbnQsY2FtcG8pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1vdXRsaW5lZCBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPiBcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPjwvYXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPiAgICAgICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9wLXRhYlBhbmVsPlxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snc29wb3J0ZScgfCB0cmFuc2xhdGUgfX0ge3snYXJjaGl2bycgfCB0cmFuc2xhdGUgfX1zXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvID09ICdOJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJudWV2b1NvcG9ydGUoKVwiIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCIgY2xhc3M9XCJwLXJpcHBsZSBwLWVsZW1lbnQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24tc2Vjb25kYXJ5IG1iLTJcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFTb3BvcnRlc1wiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc3RyaXBlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YVNvcG9ydGVzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFTb3BvcnRlcy5sZW5ndGggPiAxMFwiIFxuICAgICAgICAgICAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgXG4gICAgICAgICAgICAgICAgICAgIGVkaXRNb2RlPVwicm93XCIgZGF0YUtleT1cImxsYXZlVGFibGFcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDQ1JVwiPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDUlXCI+e3snYXJjaGl2bycgfCB0cmFuc2xhdGV9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJVwiPiA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIlRhYmxhTnVldm9SZWdpc3Ryb1wiICpuZ0lmPVwidmVyU29wb3J0ZUFyY2hpdm9EZXRhbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic29wb3J0ZUluZ3Jlc2FyLmRlc2NyaXBjaW9uXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlSW5ncmVzYXIuZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZUluZ3Jlc2FyLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCIgW21vc3RyYXJYXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInNvcG9ydGVJbmdyZXNhci5hcmNoaXZvSW5kaXZpZHVhbCA/IHNvcG9ydGVJbmdyZXNhci5hcmNoaXZvSW5kaXZpZHVhbDogJydcIiBbbGFiZWxhcmNoXT1cIidhcmNoaXZvJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9zdHJhckxhYmVsSW5wdXRdPVwiZmFsc2VcIiBbbW9zdHJhcm9ibGljYXJnb109XCJ0cnVlXCIgW2Jvb2xlYW5vXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZUluZ3Jlc2FyLmFyY2hpdm9JbmRpdmlkdWFsKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RlZCk9XCJvYnRlbmVyQXJjaGl2b1NvcG9ydGUoJGV2ZW50LCBzb3BvcnRlSW5ncmVzYXIpXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhclNvcG9ydGUoc29wb3J0ZUluZ3Jlc2FyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwidmVyU29wb3J0ZUFyY2hpdm9EZXRhbGxlID0gZmFsc2VcIiBpY29uPVwicGkgcGktdGltZXNcIiAoY2xpY2spPVwiY2FuY2VsYXJTb3BvcnRlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXNvcG9ydGUgbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LXJpPVwicm93SW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBbcEVkaXRhYmxlUm93XT1cInNvcG9ydGVcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNvcG9ydGUuZGVzY3JpcGNpb25cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZS5kZXNjcmlwY2lvbikgJiYgY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHNvcG9ydGUuZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c29wb3J0ZS5kZXNjcmlwY2lvbn19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0NSVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c29wb3J0ZS5hcmNoaXZvSW5kaXZpZHVhbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIiBbbW9zdHJhclhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsID8gc29wb3J0ZS5hcmNoaXZvSW5kaXZpZHVhbDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9zdHJhckxhYmVsSW5wdXRdPVwiZmFsc2VcIiAgW2Jvb2xlYW5vXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZS5hcmNoaXZvSW5kaXZpZHVhbCkgJiYgY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RlZCk9XCJvYnRlbmVyQXJjaGl2b1NvcG9ydGUoJGV2ZW50LCBzb3BvcnRlKVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0hFQ0sgR1VBUkRBUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwU2F2ZUVkaXRhYmxlUm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJTb3BvcnRlKHNvcG9ydGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDQU5DRUxBUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIiAoY2xpY2spPVwiY2FuY2VsYXJFZGljaW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRURJVEFSIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1wZW5jaWxcIiBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiIChjbGljayk9XCJpbmljaWFyRWRpY2lvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXNlY29uZGFyeSBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVMSU1JTkFSIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwRGVsZXRlRWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiAoY2xpY2spPVwiZWxpbWluYXJTb3BvcnRlKCRldmVudCwgc29wb3J0ZSlcIiBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1vdXRsaW5lZCBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCI+IFxuICAgICAgICAgICAgICAgIDxhcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+PC9hcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+ICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgICAgIDwvcC10YWJQYW5lbD5cbiAgICAgICAgPC9wLXRhYlZpZXc+XG4gICAgPC9wLXRhYlBhbmVsPlxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J3JlcG9ydGUnIHwgdHJhbnNsYXRlIH19IHt7J2RpbmFtaWNvJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVNpTm9cIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuZG9ibGVMaW5lYVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZG9ibGVsaW5lYScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnRpdHVsb1BhcmFtZXRyb1wiIHNpemU9XCIyNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2lmcmFkb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9KYXNwZXJcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2NpZnJhZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkIGJhY2tncm91bmQtMTAwXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZXN0YXJ0XCIgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19nZW5lcmFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImdlbmVyYXJKYXNwZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJwaSBwaS1kb3dubG9hZFwiICpuZ0lmPVwiZXhpc3RlSmFzcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19kZXNjYXJnYXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiZGVzY2FyZ2FySmFzcGVyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBtYi0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJiYW5kYVNlbGVjY2lvbmFkYS5rZXlcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwicmVncmVzYXJCYW5kYVNlbGVjY2lvbmFkYSgpXCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7eydiYW5kYXMnIHwgdHJhbnNsYXRlfX1cIiBcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YVRpcG9CYW5kYVwiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcbiAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiIFtyb3dzXT1cIjEwXCJcbiAgICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwibGlzdGFUaXBvQmFuZGEubGVuZ3RoXCIgW3BhZ2luYXRvcl09XCJsaXN0YVRpcG9CYW5kYS5sZW5ndGggPiAxMFwiXG4gICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyQmFuZGEoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckJhbmRhKCRldmVudClcIiAqbmdJZj1cIiFiYW5kYVNlbGVjY2lvbmFkYS5rZXlcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cblxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snYmFuZGEnIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1iYW5kYT5cbiAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cImJhbmRhXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e2JhbmRhLnZhbHVlfX08L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPiBcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPjwvYXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPiAgICAgICAgPC9wLXRhYmxlPlxuXG4gICAgICAgIDxwLXRhYlZpZXcgKm5nSWY9XCJiYW5kYVNlbGVjY2lvbmFkYS5rZXkgJiYgdmVyVGFiQmFuZGFcIj5cbiAgICAgICAgICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J2NhcmFjdGVyaXN0aWNhcycgfCB0cmFuc2xhdGV9fVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhWydkZXRhbGxlJywnc3VtbWFyeSddLmluY2x1ZGVzKGJhbmRhU2VsZWNjaW9uYWRhLmtleSlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVNpTm9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlQmFuZGEudG90YWxlc1wiID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndG90YWwnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVCYW5kYS50aXR1bG9cIiBtYXhsZW5ndGg9XCIyMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXR1bG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1mbG9wcHktc2F2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImd1YXJkYXJDYXJhY3RlcmlzdGljYUJhbmRhKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvcC10YWJQYW5lbD5cbiAgICAgICAgICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7YmFuZGFTZWxlY2Npb25hZGEudmFsdWV9fVwiICpuZ0lmPVwiIW51ZXZhQmFuZGFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwibnVldm9NYXJjYWRvckRpbmFtaWNvKClcIiBpY29uPVwicGkgcGktcGx1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLXJpcHBsZSBwLWVsZW1lbnQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24tc2Vjb25kYXJ5IG1iLTJcIiAqbmdJZj1cIiFudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YU1hcmNhZG9yRGluYW1pY29cIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YU1hcmNhZG9yRGluYW1pY28ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YU1hcmNhZG9yRGluYW1pY28ubGVuZ3RoID4gMTBcIiAqbmdJZj1cIiFudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlck1hcmNhZG9yRGluYW1pY28oJGV2ZW50KVwiICAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJNYXJjYWRvckRpbmFtaWNvKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snYmFuZGEnIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3JkZW4nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydldGlxdWV0YScgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J29wZXJhY2lvbicgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtZGluYW1pY28+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cImRpbmFtaWNvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGF9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGEgPyBkaW5hbWljby5hbHRvIDogJyd9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28ubWFyY2Fkb3J9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGEgPyBkaW5hbWljby5kZXNjcmlwY2lvbiA6ICcnfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RpbmFtaWNvLmJhbmRhID8gZGluYW1pY28uZm9ybWF0byA6ICcnfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e1snZGV0YWxsZSddLmluY2x1ZGVzKGRpbmFtaWNvLmJhbmRhKSA/IGRpbmFtaWNvLmFuY2hvIDogJyd9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGEgPyBkaW5hbWljby5vcGVyYWNpb24gOiAnJ319PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIj4gXG4gICAgICAgICAgICAgICAgPGFwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT48L2FwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxuXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY29cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciAgbWItMlwiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LXNlbWlib2xkIG10LTNcIj57eydpbmRpcXVlJyB8IHRyYW5zbGF0ZX19IHt7J2VuJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hJyB8IHRyYW5zbGF0ZX19IHt7J2Rlc2VhJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydhcGFyZXpjYScgfCB0cmFuc2xhdGV9fSB7eydsYScgfCB0cmFuc2xhdGV9fSB7eydpbmZvcm1hY2lvbicgfCB0cmFuc2xhdGV9fS4ge3snbGEnIHwgdHJhbnNsYXRlfX0ge3sncHJpbWVyYScgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hJyB8IHRyYW5zbGF0ZX19IHt7J2VzJyB8IHRyYW5zbGF0ZX19IHt7J2xhJyB8IHRyYW5zbGF0ZX19IDEuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwibnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGZhbHNlXCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7e2JhbmRhU2VsZWNjaW9uYWRhLnZhbHVlfX1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiICpuZ0lmPVwibnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljb1wiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVJlcG9ydGVEaW5hbWljb1wiIGNsYXNzPVwicC1mbHVpZCBncmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2FtcG9KYXNwZXJEaW5hbWljb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwidGlwb0NhbXBvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJ2YWx1ZVwiIG9wdGlvblZhbHVlPVwia2V5XCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2FtcG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPT0nQydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvRGF0b1NpbnRheGlzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGlwb0RhdG9cIiBvcHRpb25MYWJlbD1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJrZXlcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9kYXRvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBmb3JtQ29udHJvbE5hbWU9XCJhbHRvXCIgbWF4bGVuZ3RoPVwiNVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUNvbHVtbmFzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlICYmIHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIm1hcmNhZG9yXCIgc2l6ZT1cIjI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSAmJiByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09J0MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwiZmlsdHJvXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snc2ludGF4aXMnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1maWVsZHNldCBjbGFzcz1cImZpZWxkc2ludGl0dWxvXCIgIGNsYXNzPVwiZmllbGRzaW50aXR1bG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBncmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTYgbWItMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsICBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMCB0ZXh0LWJhc2UgbWwtMVwiPnt7J3Jlc3VsdGFkbycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02IG1iLTBcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyA9PSdDJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02IG1iLTBcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIHRleHQtYmFzZSBtbC0xXCIgPnt7J2xhYmVsJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJmb3JtYXRvXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZm9ybWF0bycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwY2lvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpdHVsbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiYW5jaG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJyAmJiAnZGV0YWxsZScgPT0gcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGEgXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJyAmJiAnZGV0YWxsZScgIT0gcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGEgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiYW5jaG9KYXNwZXJMYWJlbFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cIidkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInJlc3VsdGFkb1hcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd4JyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnICYmICdkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYSBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXR1bG94XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sneCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCInZGV0YWxsZScgIT0gcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJyZXN1bHRhZG9ZXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sneScgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJyAmJiAnZGV0YWxsZScgIT0gcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGEgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0dWxveVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3knIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUFsaW5lYWNpb25cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvUmVwb3J0ZVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiA+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbGluZWFjaW9uJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQWxpbmVhY2lvblwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGlwb0dyYWZpY29cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCIgPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWxpbmVhY2lvbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvRGF0byA9PSAnTicgJiYgcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3BlcmFjaW9uZXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm9wZXJhY2lvblwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiA+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcGVyYWNpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1maWVsZHNldD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3tyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e3JlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyQ29sdW1uYURpbmFtaWNvKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUgIT0gbnVsbFwiIGxhYmVsPVwie3snbGlua19lbGltaW5hcicgfCB0cmFuc2xhdGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJDb2x1bW5hRGluYW1pY28oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvcC10YWJQYW5lbD5cbiAgICAgICAgICAgIFxuICAgICAgICA8L3AtdGFiVmlldz5cbiAgICA8L3AtdGFiUGFuZWw+XG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sncmVwb3J0ZScgfCB0cmFuc2xhdGUgfX0ge3sndGV4dG8nIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmFyY2hpdm9UZXh0b1wiIHNpemU9XCI1MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjIwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydub21icmVhcmNoaXZvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVNlcGFyYWRvcmVzXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnNlcGFyYWRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHJlcG9ydGVGdWVudGUuc2VwYXJhZG9yKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlVGV4dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHJlcG9ydGVGdWVudGUuc2VwYXJhZG9yKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlVGV4dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiA+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzZXBhcmFkb3InIHwgdHJhbnNsYXRlIH19KjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NpZnJhZG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvVGV4dG9cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2NpZnJhZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImFjdHVhbGl6YXJTZXBhcmFkb3IoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+e3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fTwvaDE+XG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2b01hcmNhZG9yVGV4dG8oKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JUZXh0b1wiPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yVGV4dG9cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9NYXJjYWRvclRleHRvID0gZmFsc2U7IGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG8gPSBmYWxzZTtcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX1cIiBcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YU1hcmNhZG9yZXNUZXh0b1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcbiAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiIFxuICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhTWFyY2Fkb3Jlc1RleHRvLmxlbmd0aFwiXG4gICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhTWFyY2Fkb3Jlc1RleHRvLmxlbmd0aCA+IDEwXCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclRleHRvXCJcbiAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJNYXJjYWRvclRleHRvKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJNYXJjYWRvclRleHRvKCRldmVudClcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cblxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGg+e3sndGlwbycgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snZm9ybWF0bycgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3JkZW4nIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1tYXJjdGV4dG8+XG4gICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJtYXJjdGV4dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLnRpcG9HcmFmaWNvIHwgcmVwb3J0ZUZ1ZW50ZVBpcGUgOiAnbGlzdGFUaXBvTWFyY2Fkb3Jlc1RleHRvJ319PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLm5vbWJyZUNvbHVtbmF9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5mb3JtYXRvfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8uYWx0b319PC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIj4gXG4gICAgICAgICAgICAgICAgPGFwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT48L2FwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbXQtM1wiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvclRleHRvXCI+ICAgICAgICAgICAgXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtdC0zXCI+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtbm90ZXNcIj48L2k+e3snZGV0YWxsZScgfCB0cmFuc2xhdGV9fTwvaDU+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvclRleHRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY29cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwbycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbyA9PSAnRCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXJjYWRvclRleHRvLnJlcG9ydGVDb2x1bW5hXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLnJlcG9ydGVDb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLnJlcG9ydGVDb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclRleHRvLmZvcm1hdG9cIiBtYXhsZW5ndGg9XCI1MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8uZm9ybWF0bykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5mb3JtYXRvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7bWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbyA9PSAnRCcgPyAoJ2Zvcm1hdG8nIHwgdHJhbnNsYXRlKSsnKicgOiAoJ3ZhbG9yJyB8IHRyYW5zbGF0ZSkrJyonIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvID09ICdEJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JUZXh0by5hbmNob1wiIG1heGxlbmd0aD1cIjIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5hbmNobykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5hbmNobykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclRleHRvLmFsdG9cIiBtYXhsZW5ndGg9XCIyMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8uYWx0bykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5hbHRvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCIgPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3ttYXJjYWRvclRleHRvLmxsYXZlID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7bWFyY2Fkb3JUZXh0by5sbGF2ZSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhck1hcmNhZG9yVGV4dG8oKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtYXJjYWRvclRleHRvLmxsYXZlICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb1RleHRvKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9wLXRhYlBhbmVsPlxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J3RhYmxhJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLm5vbWJyZVRhYmxhXCIgbWF4bGVuZ3RoPVwiNDAwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydub21icmV0YWJsYScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC04XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtdC0xIG1iLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphcigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHAtcGlja0xpc3QgW3NvdXJjZV09XCJsaXN0YVRhYmxhXCIgW3RhcmdldF09XCJsaXN0YU5vVGFibGFcIiBzb3VyY2VIZWFkZXI9XCJBc29jaWFkb1wiIHNvdXJjZUZpbHRlclBsYWNlaG9sZGVyPVwiQXNvY2lhZG9cIlxuICAgICAgICAgICAgdGFyZ2V0SGVhZGVyPVwiRGVzYXNvY2lhZG9cIiBbZHJhZ2Ryb3BdPVwidHJ1ZVwiIFtyZXNwb25zaXZlXT1cInRydWVcIiB0YXJnZXRGaWx0ZXJQbGFjZWhvbGRlcj1cIkRlc2Fzb2NpYWRvXCJcbiAgICAgICAgICAgIGZpbHRlckJ5PVwibm9tYnJlXCIgKm5nSWY9XCJpc0Z1ZW50ZSgpXCIgKG9uU291cmNlUmVvcmRlcik9XCJyZW9yZGVyVGFibGEoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Nb3ZlQWxsVG9UYXJnZXQpPVwibW92ZXJBRGVzYXNvY2lhZG9UYWJsYSgkZXZlbnQpXCIgKG9uTW92ZUFsbFRvU291cmNlKT1cIm1vdmVyQUFzb2NpYWRvVGFibGEoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Nb3ZlVG9UYXJnZXQpPVwibW92ZXJBRGVzYXNvY2lhZG9UYWJsYSgkZXZlbnQpXCIgKG9uTW92ZVRvU291cmNlKT1cIm1vdmVyQUFzb2NpYWRvVGFibGEoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC10YWJsYSBwVGVtcGxhdGU9XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7dGFibGEubm9tYnJlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLXBpY2tMaXN0PlxuICAgIDwvcC10YWJQYW5lbD5cbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydhcmNoaXZveG1sJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS50YWdFbmNhYmV6YWRvXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGFnZW5jYWJlemFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTUwIG1heC1oLTEwMFwiICBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUudGFnQ2llcnJlRW5jYWJlemFkb1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RhZ2NpZXJyZWVuY2FiZXphZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPiBcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5lc3RydWN0dXJhUmVnaXN0cm9cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0YWdyZWdpc3RybycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+IFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY2lmcmFkb1htbFwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2lmcmFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlZnJlc2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxuICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bFwiPnt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX08L2gxPlxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibnVldm9NYXJjYWRvclhNTCgpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclhNTFwiPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yWE1MXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvTWFyY2Fkb3JYTUwgPSBmYWxzZTsgY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUwgPSBmYWxzZTtcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX1cIiBcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YVhNTFwiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcbiAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiICBcbiAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YVhNTC5sZW5ndGhcIlxuICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YVhNTC5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JYTUxcIlxuICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlck1hcmNhZG9yWE1MKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJNYXJjYWRvclhNTCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG5cbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydtYXJjYWRvcicgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmN0ZXh0bz5cbiAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cIm1hcmN0ZXh0b1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8uZGVzY3JpcGNpb259fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by50aXBvIHwgcmVwb3J0ZUZ1ZW50ZVBpcGUgOiAnbGlzdGFUaXBvRGF0b01hcmNhZG9yZXMnfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8ubm9tYnJlQ29sdW1uYX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLm1hcmNhZG9yfX08L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPiBcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPjwvYXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPiAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBtdC0zXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yWE1MXCI+ICAgICAgICAgICAgXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtdC0zXCI+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtbm90ZXNcIj48L2k+e3snZGV0YWxsZScgfCB0cmFuc2xhdGV9fTwvaDU+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLmRlc2NyaXBjaW9uXCIgbWF4bGVuZ3RoPVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JYTUwuZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclhNTC5kZXNjcmlwY2lvbikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvTWFyY2Fkb3JYTUxcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC50aXBvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yWE1MLnRpcG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclhNTC50aXBvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclhNTFwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwbycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiWydNQScsJ01SJ10uaW5jbHVkZXMobWFyY2Fkb3JYTUwudGlwbylcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5tYXJjYWRvclwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yWE1MLnRpcG8gPT0gJ1RCJ1wiID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLm1hcmNhZG9yXCIgbWF4bGVuZ3RoPVwiNVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RhYmxhJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnTUEnXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUNvbHVtbmFzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLnJlcG9ydGVDb2x1bW5hXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIiA+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnTUEnXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZm9ybWF0b1wiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZm9ybWF0bycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnTVInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC50ZXh0b1JlZ2lzdHJvXCIgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RleHRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIlsnTVInLCdUQiddLmluY2x1ZGVzKG1hcmNhZG9yWE1MLnRpcG8pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhRnVlbnRlc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5mdWVudGVcIiBvcHRpb25MYWJlbD1cImRlc2NyaXBjaW9uXCIgb3B0aW9uVmFsdWU9XCJsbGF2ZVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZnVlbnRlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiWydNUicsJ1RCJ10uaW5jbHVkZXMobWFyY2Fkb3JYTUwudGlwbylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLmZpbHRyb1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2ZpbHRybycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yWE1MLnRpcG8gPT0gJ1RCJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZXN0cnVjdHVyYVRhYmxhWE1MXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZXN0cnVjdHVyYXRhYmxhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e21hcmNhZG9yWE1MLmxsYXZlID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7bWFyY2Fkb3JYTUwubGxhdmUgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCIgKGNsaWNrKT1cImd1YXJkYXJNYXJjYWRvclhNTCgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1hcmNhZG9yWE1MLmxsYXZlICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb3JYTUwoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JYTUwgJiYgbWFyY2Fkb3JYTUwubGxhdmUgIT0gbnVsbCAmJiAobWFyY2Fkb3JYTUwudGlwbyA9PSAnTVInIHx8IG1hcmNhZG9yWE1MLnRpcG8gPT0gJ1RCJylcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cIm51ZXZvQ2FtcG9UYWJsYVhNTCgpXCIgaWNvbj1cInBpIHBpLXBsdXNcIiBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1yaXBwbGUgcC1lbGVtZW50IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLXNlY29uZGFyeSBtYi0yXCI+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YUNhbXBvc01hcmNhZG9yWE1MXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUwubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YUNhbXBvc01hcmNhZG9yWE1MLmxlbmd0aCA+IDEwXCIgXG4gICAgICAgICAgICAgICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBcbiAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGU9XCJyb3dcIiBkYXRhS2V5PVwibGxhdmVcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDMwJTtcIj57eydjYW1wbycgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDMwJTtcIj57eydtYXJjYWRvcicgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDMwJTtcIj57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlXCI+IDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIlRhYmxhTnVldm9SZWdpc3Ryb1wiICpuZ0lmPVwidmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZVhNTFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLmNhbXBvRnVlbnRlXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTC5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLm1hcmNhZG9yXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTC5tYXJjYWRvcikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLmZvcm1hdG9cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhckNhbXBvTWFyY2Fkb3JYTUwoY2FtcG9NYXJjYWRvckluc2VydGFyWE1MKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVYTUwgPSBmYWxzZTsgaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1wiIGljb249XCJwaSBwaS10aW1lc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtY2FtcG8gbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LXJpPVwicm93SW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRyIFtwRWRpdGFibGVSb3ddPVwiY2FtcG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uY2FtcG9GdWVudGVcIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLmNhbXBvRnVlbnRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLm1hcmNhZG9yXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8ubWFyY2Fkb3IpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8ubWFyY2Fkb3IpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYW1wby5tYXJjYWRvcn19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5mb3JtYXRvXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLmZvcm1hdG99fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0hFQ0sgR1VBUkRBUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBTYXZlRWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ2FtcG9NYXJjYWRvclhNTChjYW1wbylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDQU5DRUxBUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBDYW5jZWxFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTEFzeW5jKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1kYW5nZXIgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVESVRBUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXBlbmNpbFwiIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCIgKGNsaWNrKT1cImluaWNpYXJFZGljaW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zZWNvbmRhcnkgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVMSU1JTkFSIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBEZWxldGVFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCIgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIiAoY2xpY2spPVwiZWxpbWluYXJDYW1wb01hcmNhZG9yWE1MKCRldmVudCxjYW1wbylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1vdXRsaW5lZCBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPiBcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPjwvYXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPiAgICAgICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9wLXRhYlBhbmVsPlxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J2NvbHVtbmFyaW8nIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgIDxwLWFjY29yZGlvbiAob25PcGVuKT1cImNhbWJpYXJUYWJDb2x1bW5hcmlvKCRldmVudClcIiA+XG4gICAgICAgICAgICA8cC1hY2NvcmRpb25UYWIgW3NlbGVjdGVkXT1cInRydWVcIiA+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPjxpIGNsYXNzPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLW5vdGVzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB7eydjb2x1bW5hc2Jhc2ljYXMnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2b0NvbHVtbmFCYXNpY2EoKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW9cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvID0gZmFsc2U7IGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvID0gZmFsc2U7XCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hc2Jhc2ljYXMnIHwgdHJhbnNsYXRlfX1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhUmVwb3J0ZUNvbHVtbmFyaW9cIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiICBcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhUmVwb3J0ZUNvbHVtbmFyaW8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YVJlcG9ydGVDb2x1bW5hcmlvLmxlbmd0aCA+IDEwXCIgKm5nSWY9XCIhdmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpb1wiXG4gICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJSZXBvcnRlQ29sdW1uYXJpbygkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwidmVyUmVwb3J0ZUNvbHVtbmFyaW8oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydub21icmUnIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J29yZGVuJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J29wZXJhY2lvbicgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtYmVhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwiYmVhblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4ubm9tYnJlfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4ubm9tYnJlQ29sdW1uYX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tiZWFuLnRpcG8gfCByZXBvcnRlQ29sdW1uYXJpb1BpcGU6ICdsaXN0YVRpcG9Db2x1bW5hJ319PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tiZWFuLm9yZGVufX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4ub3BlcmFjaW9uIHwgcmVwb3J0ZUNvbHVtbmFyaW9QaXBlOiAnbGlzdGFPcGVyYWNpb24nfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPiBcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPjwvYXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XG4gICAgICAgICAgICAgICAgPGRpdiAgKm5nSWY9XCJ2ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm5vbWJyZVwiIG1heGxlbmd0aD1cIjEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5ub21icmUpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eubm9tYnJlKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZScgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9Db2x1bW5hc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2EudGlwb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2EudGlwbykgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS50aXBvKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY29sdW1uYScgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQ29sdW1uYXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLnJlcG9ydGVDb2x1bW5hXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2EucmVwb3J0ZUNvbHVtbmEpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2EucmVwb3J0ZUNvbHVtbmEpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImNvbHVtbmFCYXNpY2EudGlwbyA9PSAnRCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YU9wZXJhY2lvbmVzQ29sdW1uYXJpb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcGVyYWNpb24pICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcGVyYWNpb24nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzVGlwb0NvbHVtbmEoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3BlcmFjaW9uZXNFeGNlbENvbHVtbmFyaW9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm9wZXJhY2lvbkhvcml6b250YWxcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvbkhvcml6b250YWwpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uSG9yaXpvbnRhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3BlcmFjaW9uaG9yaXpvbnRhbCcgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gIGZpbGEgT3BlcmFjaW9uIFZlcnRpY2FsIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzVGlwb0NvbHVtbmEoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2EuY29sdW1uYU9wZXJhY2lvblZlcnRpY2FsXCIgbWF4bGVuZ3RoPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLmNvbHVtbmFPcGVyYWNpb25WZXJ0aWNhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5jb2x1bW5hT3BlcmFjaW9uVmVydGljYWwpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sdW1uYW9wZXJhY2lvbicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPcGVyYWNpb24gVmVydGljaWFsIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzVGlwb0NvbHVtbmEoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3BlcmFjaW9uZXNFeGNlbENvbHVtbmFyaW9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm9wZXJhY2lvblZlcnRpY2FsXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcGVyYWNpb25WZXJ0aWNhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcGVyYWNpb25WZXJ0aWNhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3BlcmFjaW9udmVydGljYWwnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9yZGVuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzTW9zdHJhck9yZGVuKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm9yZGVuXCIgbWF4bGVuZ3RoPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVuKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVuKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9yZGVuYW1pZW50byBGaWxhcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJpc1RpcG9MYWJlbCgpIHx8IGlzVGlwb0ZpbGEoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3JkZW5hbWllbnRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cImZhbHNlXCIgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm9yZGVyQnlcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcmRlckJ5KSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVyQnkpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuYW1pZW50bycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3JkZW5hbWllbnRvIERhdG9zIGRlIGxhIGNvbnN1bHRhIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzTW9zdHJhck9yZGVuQ29uc3VsdGEoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3JkZW5Db25zdWx0YVwiIG1heGxlbmd0aD1cIjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3JkZW5Db25zdWx0YSkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcmRlbkNvbnN1bHRhKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuY29uc3VsdGEnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e2NvbHVtbmFCYXNpY2EubGxhdmVUYWJsYSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7Y29sdW1uYUJhc2ljYS5sbGF2ZVRhYmxhID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyQ29sdW1uYUJhc2ljYSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbmFCYXNpY2EubGxhdmVUYWJsYSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyQ29sdW1uYUJhc2ljYSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxuICAgICAgICA8L3AtYWNjb3JkaW9uPlxuICAgICAgICA8cC1hY2NvcmRpb24gKG9uT3Blbik9XCJjYW1iaWFyVGFiQ29sdW1uYXJpbygkZXZlbnQpXCI+XG4gICAgICAgICAgICA8cC1hY2NvcmRpb25UYWIgPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAge3snZGF0b3NhZGljaW9uYWxlcyd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxwLWZpZWxkc2V0IGNsYXNzPVwiZmllbGRzaW50aXR1bG9cIiA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInJlcG9ydGVGdWVudGUuYXJjaGl2b0V4Y2VsQ29sdW1uYXJpbyA/IHJlcG9ydGVGdWVudGUuYXJjaGl2b0V4Y2VsQ29sdW1uYXJpbzogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtleHRlbnNpb25lc109XCIneGxzO3hsc3g7eGxzbSdcIiBbbW9zdHJhcm9ibGljYXJnb109XCJ0cnVlXCIgW2xhYmVscmFyXT1cIidwbGFudGlsbGEnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RlZCk9XCJvYnRlbmVyQXJjaGl2b0NvbHVtbmFyaW8oJGV2ZW50KVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuaG9qYUV4Y2VsXCIgc2l6ZT1cIjI1XCIgbWF4bGVuZ3RoPVwiMjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydub21icmUnIHwgdHJhbnNsYXRlIH19IHt7J2RlJyB8IHRyYW5zbGF0ZSB9fSB7eydsYScgfCB0cmFuc2xhdGUgfX0ge3snaG9qYScgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmZpbGFJbmljaW9Db2x1bW5hcmlvXCIgbWF4bGVuZ3RoPVwiNVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2ZpbGFpbmljaW9jb2x1bW5hcmlvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NpZnJhZG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9Db2x1bW5hcmlvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2lmcmFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTUwIG1heC1oLTEwMFwiICBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuc2ludGF4aXNDb2x1bW5hcmlvXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzaW50YXhpc2NvbHVtbmFyaW8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImFjdHVhbGl6YXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvcC1maWVsZHNldD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMyBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMSBjbGFzcz1cInRleHQteGxcIj57eydjb2x1bW5hYWRpY2lvbmFsJyB8IHRyYW5zbGF0ZX19PC9oMT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2YUNvbHVtbmFBZGljaW9uYWwoKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvQ29sdW1uYUFkaWNpb25hbFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gZmFsc2U7IGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTtcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J2NvbHVtbmFhZGljaW9uYWwnIHwgdHJhbnNsYXRlfX1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImNvbHVtbmFzQWRpY2lvbmFsZXNcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiICBcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImNvbHVtbmFzQWRpY2lvbmFsZXMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJjb2x1bW5hc0FkaWNpb25hbGVzLmxlbmd0aCA+IDEwXCIgKm5nSWY9XCIhdmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlckRldGFsbGVBZGljaW9uYWwoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckRldGFsbGVBZGljaW9uYWwoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J29yZGVuJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1jb2x1bW5hYWRpY2lvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJjb2x1bW5hYWRpY2lvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7Y29sdW1uYWFkaWNpb25hbC5ub21icmV9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7Y29sdW1uYWFkaWNpb25hbC5vcmRlbn19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIj4gXG4gICAgICAgICAgICAgICAgPGFwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT48L2FwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICAgICAgICAgIDxwLWZpZWxkc2V0IGNsYXNzPVwiZmllbGRzaW50aXR1bG9cIiAgKm5nSWY9XCJ2ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwubm9tYnJlXCIgbWF4bGVuZ3RoPVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm5vbWJyZSkgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm5vbWJyZSkgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsaWFzJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwub3JkZW5cIiBtYXhsZW5ndGg9XCI1XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm9yZGVuKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwub3JkZW4pICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YU9yZGVuYW1pZW50b1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwub3JkZXJCeVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwub3JkZXJCeSkgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm9yZGVyQnkpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW5hbWllbnRvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwub3JkZW5Db25zdWx0YVwiIG1heGxlbmd0aD1cIjVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwub3JkZW5Db25zdWx0YSkgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm9yZGVuQ29uc3VsdGEpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuY29uc3VsdGEnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJjb2x1bW5hQWRpY2lvbmFsLnNpbnRheGlzXCIgbWF4bGVuZ3RoPVwiNDAwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5zaW50YXhpcykgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLnNpbnRheGlzKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzaW50YXhpcycgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIHt7Y29sdW1uYUFkaWNpb25hbC5sbGF2ZVRhYmxhID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3tjb2x1bW5hQWRpY2lvbmFsLmxsYXZlVGFibGEgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCIgKGNsaWNrKT1cImd1YXJkYXJDb2x1bW5hQWRpY2lvbmFsKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uYUFkaWNpb25hbC5sbGF2ZVRhYmxhICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJDb2x1bW5hQWRpY2lvbmFsKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3AtZmllbGRzZXQ+XG4gICAgICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxuICAgICAgICAgICAgPHAtYWNjb3JkaW9uVGFiID5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtbm90ZXNcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIHt7J21hcmNhZG9yZXMnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGZvbnQtc2VtaWJvbGRcIiBpY29uPVwicGkgcGktcGx1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibnVldm9NYXJjYWRvckNvbHVtbmFyaW8oKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7IGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpbyA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlfX1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cIm1hcmNhZG9yZXNDb2x1bW5hcmlvXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhS2V5PVwibGxhdmVUYWJsYVwiIHNlbGVjdGlvbk1vZGU9XCJzaW5nbGVcIiAgXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJtYXJjYWRvcmVzQ29sdW1uYXJpby5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cIm1hcmNhZG9yZXNDb2x1bW5hcmlvLmxlbmd0aCA+IDEwXCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyRGV0YWxsZU1hcmNhZG9yQ29sdW1uYXJpbygkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwidmVyRGV0YWxsZU1hcmNhZG9yQ29sdW1uYXJpbygkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydub21icmUnIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3sndGlwb21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1tYXJjYWRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwibWFyY2Fkb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci5tYXJjYWRvcn19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci50aXBvIHwgcmVwb3J0ZUNvbHVtbmFyaW9QaXBlOiAnbGlzdGFUaXBvTWFyY2Fkb3InfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPiBcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPjwvYXBwLXRlbXBsYXRlLXRhYmxhLXZhY2lhPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwibWFyY2Fkb3JDb2x1bW5hcmlvLmRlc2NyaXBjaW9uXCIgbWF4bGVuZ3RoPVwiNDAwMFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby5kZXNjcmlwY2lvbikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby5kZXNjcmlwY2lvbikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwibWFyY2Fkb3JDb2x1bW5hcmlvLm1hcmNhZG9yXCIgbWF4bGVuZ3RoPVwiNTBcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby5tYXJjYWRvcikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvckNvbHVtbmFyaW9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXJjYWRvckNvbHVtbmFyaW8udGlwb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby50aXBvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLnRpcG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTUwIG1heC1oLTEwMFwiIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwibWFyY2Fkb3JDb2x1bW5hcmlvLnRleHRvUmVnaXN0cm9cIiBtYXhsZW5ndGg9XCI0MDAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8udGV4dG9SZWdpc3RybykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby50ZXh0b1JlZ2lzdHJvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3ZhbG9yJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3ttYXJjYWRvckNvbHVtbmFyaW8ubGxhdmVUYWJsYSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7bWFyY2Fkb3JDb2x1bW5hcmlvLmxsYXZlVGFibGEgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCIgKGNsaWNrKT1cImd1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW8oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtYXJjYWRvckNvbHVtbmFyaW8ubGxhdmVUYWJsYSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb3JDb2x1bW5hcmlvKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG4gICAgICAgIDwvcC1hY2NvcmRpb24+XG4gICAgPC9wLXRhYlBhbmVsPlxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J2dyYWZpY2EnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNvZGlnb1wiIHNpemU9XCIyNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2RpZ28nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnRpdHVsb0dyYWZpY29cIiBzaXplPVwiMjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGl0dWxvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9HcmFmaWNvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUudGlwb0dyYWZpY29cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiAqbmdJZj1cImlzU3FsKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJndWFyZGFyR3JhZmljbygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWQgYmFja2dyb3VuZC0xMDBcIiBpY29uPVwicGkgcGktZXllXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua192ZXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwidmVyR3JhZmljbygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJwYWdpbmFkb3JDb2x1bW5hc1wiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtyb3dzXT1cIjIwXCIgW3RvdGFsUmVjb3Jkc109XCJwYWdpbmFkb3JDb2x1bW5hcy5sZW5ndGhcIiBbcGFnaW5hdG9yXT1cInBhZ2luYWRvckNvbHVtbmFzLmxlbmd0aCA+IDIwXCIgPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydzaW50YXhpcycgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+e3sndGlwbycgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snYWNjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1iZWFuPlxuICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwiYmVhblwiPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3tiZWFuLm5vbWJyZX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi5zaW50YXhpc319PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi50aXBvRGF0byB8IHJlcG9ydGVGdWVudGVQaXBlIDogJ2xpc3RhVGlwb0RhdG8nfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUdyYWZpY29TZW5jaWxsb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImJlYW4uZ3JhZmljb0Z1ZW50ZVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIj4gXG4gICAgICAgICAgICAgICAgPGFwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT48L2FwcC10ZW1wbGF0ZS10YWJsYS12YWNpYT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT4gICAgICAgIDwvcC10YWJsZT4gXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTIgbWItMlwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bFwiPkNvbG9yZXM8L2gxPlxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJudWV2b0NvbG9yQ2F0ZWdvcmlhKClcIiBpY29uPVwicGkgcGktcGx1c1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIiBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cInBhZ2luYWRvckNvbG9yZXNHcmFmaWNhXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCJcbiAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJwYWdpbmFkb3JDb2xvcmVzR3JhZmljYS5sZW5ndGhcIlxuICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJwYWdpbmFkb3JDb2xvcmVzR3JhZmljYS5sZW5ndGggPiAxMFwiIFxuICAgICAgICAgICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCIgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cIntmaXJzdH0gYWwge2xhc3R9IGRlIHt0b3RhbFJlY29yZHN9IHJlZ2lzdHJvc1wiIFxuICAgICAgICAgICAgZWRpdE1vZGU9XCJyb3dcIiBkYXRhS2V5PVwibGxhdmVUYWJsYVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDUlXCI+e3snY2F0ZWdvcmlhJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDQ1JVwiPnt7J2NvbG9yJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJVwiPiA8L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiVGFibGFOdWV2b1JlZ2lzdHJvXCIgKm5nSWY9XCJ2ZXJDb2xvckNhdGVnb3JpYURldGFsbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbG9yQ2F0ZWdvcmlhLnRpdHVsb1wiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yQ2F0ZWdvcmlhLnRpdHVsbykgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3JDYXRlZ29yaWEudGl0dWxvKSAmJiBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYVwiPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jb2xvclBpY2tlciBbKG5nTW9kZWwpXT1cImNvbG9yQ2F0ZWdvcmlhLmJhbmRhXCIgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3JDYXRlZ29yaWEuYmFuZGEpICYmIGNsaWNrR3VhcmRhckNvbG9yQ2F0ZWdvcmlhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvckNhdGVnb3JpYS5iYW5kYSkgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ29sb3JDYXRlZ29yaWEoY29sb3JDYXRlZ29yaWEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZSA9IGZhbHNlXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhbmNlbGFyQ29sb3JDYXRlZ29yaWEoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtY29sb3IgbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LXJpPVwicm93SW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJjb2xvclwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbG9yLnRpdHVsb1wiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3IudGl0dWxvKSAmJiBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yLnRpdHVsbykgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb2xvci50aXR1bG99fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jb2xvclBpY2tlciBbKG5nTW9kZWwpXT1cImNvbG9yLmJhbmRhXCIgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvci5iYW5kYSkgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3IuYmFuZGEpICYmIGNsaWNrR3VhcmRhckNvbG9yQ2F0ZWdvcmlhXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY29sb3JQaWNrZXIgWyhuZ01vZGVsKV09XCJjb2xvci5iYW5kYVwiIFtkaXNhYmxlZF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENIRUNLIEdVQVJEQVIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBTYXZlRWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJDb2xvckNhdGVnb3JpYShjb2xvcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0FOQ0VMQVIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBDYW5jZWxFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIiAoY2xpY2spPVwiY2FuY2VsYXJFZGljaW9uQ29sb3IoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVESVRBUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBJbml0RWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1wZW5jaWxcIiBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiIChjbGljayk9XCJpbmljaWFyRWRpY2lvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zZWNvbmRhcnkgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRUxJTUlOQVIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwRGVsZXRlRWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCIgKGNsaWNrKT1cImVsaW1pbmFyQ29sb3JDYXRlZ29yaWEoJGV2ZW50LCBjb2xvcilcIiBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tb3V0bGluZWQgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCI+IFxuICAgICAgICAgICAgICAgIDxhcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+PC9hcHAtdGVtcGxhdGUtdGFibGEtdmFjaWE+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+ICAgICAgICA8L3AtdGFibGU+XG4gICAgICAgIDxkaXYgI2RpdkdyYWZpY2EgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGNhcmQgbXQtM1wiICpuZ0lmPVwiZ3JhZmljYVwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bFwiPnt7J2dyYWZpY2EnIHwgdHJhbnNsYXRlfX08L2gxPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiAzNSVcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzAlXCI+XG4gICAgICAgICAgICAgICAgPHAtY2hhcnQgW3R5cGVdPVwidGlwb0dyYWZpY2FcIiBbZGF0YV09XCJncmFmaWNhLmRhdG9zR3JhZmljYS5kYXRhXCIgW29wdGlvbnNdPVwiZ3JhZmljYS5kYXRvc0dyYWZpY2Eub3B0aW9uc1wiPjwvcC1jaGFydD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiAzNSVcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9wLXRhYlBhbmVsPlxuPC9wLXRhYlZpZXc+Il19