@eqproject/eqp-dynamic-module 2.6.16 → 2.6.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/esm2020/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.mjs +1 -1
  2. package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +35 -13
  3. package/esm2020/lib/components/private/add-formula-field/add-formula-field.component.mjs +6 -3
  4. package/esm2020/lib/components/private/dynamic-module-field/dynamic-module-field.component.mjs +1 -1
  5. package/esm2020/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.mjs +1 -1
  6. package/esm2020/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.mjs +5 -2
  7. package/esm2020/lib/components/private/field-templates/date-field-template/date-field-template.component.mjs +5 -2
  8. package/esm2020/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.mjs +5 -2
  9. package/esm2020/lib/components/private/field-templates/label-field-template/label-field-template.component.mjs +5 -2
  10. package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +5 -2
  11. package/esm2020/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +5 -2
  12. package/esm2020/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +5 -2
  13. package/esm2020/lib/components/private/form-records/add-form-record/add-form-record.component.mjs +6 -3
  14. package/esm2020/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +1 -1
  15. package/esm2020/lib/components/private/form-records/list-view-form-record/single-record/single-record.component.mjs +1 -1
  16. package/esm2020/lib/models/getter.model.mjs +3 -0
  17. package/esm2020/lib/services/utilityHelper.services.mjs +3 -3
  18. package/fesm2015/eqproject-eqp-dynamic-module.mjs +69 -21
  19. package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -1
  20. package/fesm2020/eqproject-eqp-dynamic-module.mjs +69 -21
  21. package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -1
  22. package/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.d.ts +9 -1
  23. package/lib/components/private/add-formula-field/add-formula-field.component.d.ts +1 -0
  24. package/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.d.ts +2 -1
  25. package/lib/components/private/field-templates/date-field-template/date-field-template.component.d.ts +2 -1
  26. package/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.d.ts +2 -1
  27. package/lib/components/private/field-templates/label-field-template/label-field-template.component.d.ts +2 -1
  28. package/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.d.ts +2 -1
  29. package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +2 -1
  30. package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +2 -1
  31. package/lib/components/private/form-records/add-form-record/add-form-record.component.d.ts +2 -1
  32. package/lib/models/getter.model.d.ts +4 -0
  33. package/lib/services/utilityHelper.services.d.ts +1 -1
  34. package/package.json +1 -1
@@ -540,7 +540,7 @@ export class ListViewFormRecordComponent {
540
540
  }
541
541
  }
542
542
  ListViewFormRecordComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ListViewFormRecordComponent, deps: [{ token: i1.UtilityHelperService }, { token: i0.ChangeDetectorRef }, { token: i2.MatDialog }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Component });
543
- ListViewFormRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ListViewFormRecordComponent, selector: "list-view-form-record", inputs: { configurations: "configurations", compileConfigurations: "compileConfigurations", endPointConfiguration: "endPointConfiguration", userID: "userID", formID: "formID", orgaID: "orgaID", form: "form", defaultListViewFunction: "defaultListViewFunction", externalButtons: "externalButtons", onlyView: "onlyView", records: "records", highlightFilter: "highlightFilter", QueryEditorComponent: "QueryEditorComponent" }, outputs: { onAddViewEditRecord: "onAddViewEditRecord", onDeleteRecord: "onDeleteRecord", saveRecordEvent: "saveRecordEvent", afterSaveRecordEvent: "afterSaveRecordEvent", dragStarted: "dragStarted", dragReleased: "dragReleased", out: "out", fireTrigger: "fireTrigger" }, viewQueries: [{ propertyName: "tableRecords", first: true, predicate: ["tableRecords"], descendants: true, static: true }, { propertyName: "openAddDialog", first: true, predicate: ["openAddDialog"], descendants: true }, { propertyName: "openGraphDialog", first: true, predicate: ["openGraphDialog"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-card class=\"list-view-form-record\">\r\n <mat-card-header *ngIf=\"showTitle || defaultListActions.add\" class=\"align-items-center justify-content-between\">\r\n <mat-card-title *ngIf=\"showTitle && loadedform\">Modulo {{ form.Name }} </mat-card-title>\r\n <mat-card-actions *ngIf=\"defaultListActions.add || defaultListActions.graphs\">\r\n <button \r\n *ngIf=\"defaultListActions.graphs\"\r\n class=\"btn btn-primary mr-2\" \r\n mat-raised-button \r\n color=\"primary\" \r\n type=\"button\"\r\n (click)=\"openGraphs()\">\r\n <mat-icon>pie_chart</mat-icon>\r\n <span style=\"margin-left: 10px\">Grafici</span>\r\n </button>\r\n <button \r\n *ngIf=\"defaultListActions.add\"\r\n class=\"btn btn-primary\" \r\n mat-raised-button \r\n color=\"primary\" \r\n type=\"button\"\r\n (click)=\"openAddPopup()\">\r\n <mat-icon>add</mat-icon>\r\n <span style=\"margin-left: 10px\">Aggiungi</span>\r\n </button> \r\n </mat-card-actions>\r\n </mat-card-header>\r\n\r\n \r\n <mat-card-content>\r\n <mat-accordion #doneList=\"cdkDropList\" cdkDropList [cdkDropListConnectedTo]=\"[todoList]\" [hideToggle]=\"test\" [multi]=\"true\" class=\"df-list-view-accordion\">\r\n <mat-expansion-panel *ngFor=\"let panel of panels; index as i\" \r\n [expanded]=\"panel.isOpen\"\r\n [disabled]=\"1\" \r\n [class]=\"panel.highlighted ? 'dm_panel_highlighted' : '0'\"\r\n >\r\n <mat-expansion-panel-header \r\n (click)=\"togglePanel(panel, panel.record)\">\r\n <mat-panel-title cdkDrag (cdkDragStarted)=\"onDragStarted([panel.record,form])\" (cdkDragReleased)=\"onDragReleased()\">\r\n <mat-icon class=\"drag-icon\">drag_indicator</mat-icon> {{ !showTitle ? form.Name : \"\" }} v.{{ panel.record.Version }} - {{ panel.record.AnswerDate | date : \"EEEE, d MMMM y, H:mm:ss\" }} {{ printAdditionalInfo(panel.record) }}\r\n </mat-panel-title>\r\n <!--#region BOTTONI PER LE AZIONI -->\r\n <mat-panel-description>\r\n <button *ngFor=\"let button of buttons\" \r\n mat-icon-button \r\n class=\"record-icon {{button.extraClass}}\" \r\n [matTooltip]=\"button.text\"\r\n [hidden]=\"button.icon == 'file_copy' && (panels.length == 0 || panel.record.Version != panels[0].record.Version)\"\r\n (click)=\"button.fn(panel,i,$event)\">\r\n <mat-icon>{{button.icon}}</mat-icon>\r\n </button>\r\n <button *ngFor=\"let button of externalButtons\" \r\n mat-icon-button \r\n class=\"record-icon {{button.extraClass}}\"\r\n [matTooltip]=\"button.text\"\r\n (click)=\"externalCallback($event,button.fn,panel.record)\">\r\n <mat-icon>{{button.icon}}</mat-icon>\r\n </button> \r\n <span class=\"example-spacer\"></span>\r\n \r\n </mat-panel-description>\r\n <!--#endregion BOTTONI PER LE AZIONI -->\r\n </mat-expansion-panel-header>\r\n\r\n <!-- #region CONTENUTO -->\r\n <ng-container *ngIf=\"panel.pageState != null\">\r\n\r\n <lib-single-record\r\n [onlyView]=\"onlyView\"\r\n [record] = \"panel.record\" \r\n [endPointConfiguration] = \"endPointConfiguration\"\r\n [form]=\"form\"\r\n [userID]=\"userID\"\r\n [QueryEditorComponent]=\"QueryEditorComponent\"\r\n [outCompileConfigurations]=\"outCompileConfigurations\"\r\n [pageState]=\"panel.pageState\"\r\n (out)=\"onExternalComponentOut($event)\"\r\n (saveRecordEvent)=\"saveOrExitForm($event)\"\r\n (afterSaveRecordEvent)=\"onAfterSaveRecord($event)\"\r\n (fireTrigger)=\"onFireTrigger($event)\"\r\n >\r\n\r\n </lib-single-record>\r\n </ng-container>\r\n <!--#endregion CONTENUTO -->\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n\r\n\r\n </mat-card-content>\r\n <mat-card-footer>\r\n </mat-card-footer>\r\n</mat-card>\r\n\r\n<!--#region DIALOG AGGIUNTA RISPOSTA -->\r\n<ng-template #openAddDialog>\r\n <mat-card class=\"card-default overlay-card card-inmodal-true\">\r\n <mat-card-content>\r\n\r\n <add-form-record\r\n class=\"dynamic-module-compile\"\r\n [formID]=\"formID\"\r\n [orgaID]=\"orgaID\"\r\n [onlyView]=\"false\"\r\n [record]=\"selectedRecord\"\r\n\r\n [QueryEditorComponent]=\"QueryEditorComponent\"\r\n [endPointConfiguration]=\"endPointConfiguration\"\r\n [userID]=\"userID\"\r\n\r\n [configurations]=\"compileConfigurations\"\r\n\r\n (out)=\"onExternalComponentOut($event)\"\r\n (saveRecordEvent)=\"onAddSaveRecord($event)\"\r\n (afterSaveRecordEvent)=\"onAddAfterSaveRecord($event)\"\r\n (fireTrigger)=\"onFireTrigger($event)\"\r\n >\r\n </add-form-record>\r\n\r\n </mat-card-content>\r\n </mat-card>\r\n</ng-template>\r\n<!--#endregion DIALOG AGGIUNTA RISPOSTA -->\r\n\r\n<!--#region DIALOG VISUALIZZAZIONE GRAFICI -->\r\n<ng-template #openGraphDialog>\r\n <mat-card class=\"card-default overlay-card card-inmodal-true graphCard\">\r\n \r\n <mat-card-header class=\"align-items-center justify-content-between\">\r\n <mat-card-title>\r\n <div class=\"row eqp-dynamic-module-title graph-header\">\r\n <div class=\"col-md-12\">\r\n <span>Grafico {{ form.Name }} </span>\r\n </div>\r\n </div>\r\n </mat-card-title>\r\n <mat-card-actions>\r\n <button \r\n class=\"btn btn-primary mr-2\" \r\n mat-raised-button \r\n color=\"primary\" \r\n type=\"button\"\r\n (click)=\"closeGraphs()\">\r\n <span class=\"material-icons\">\r\n arrow_back\r\n </span>\r\n <span style=\"margin-left: 10px\">Indietro</span>\r\n </button>\r\n </mat-card-actions>\r\n </mat-card-header>\r\n <mat-card-content>\r\n\r\n <graphs\r\n [formID]=\"formID\"\r\n [userID]=\"userID\"\r\n [configurations] = \"outCompileConfigurations\"\r\n [endPointConfiguration] = \"endPointConfiguration\"\r\n >\r\n </graphs>\r\n\r\n </mat-card-content>\r\n </mat-card>\r\n</ng-template>\r\n<!--#endregion DIALOG VISUALIZZAZIONE GRAFICI -->\r\n", styles: ["::ng-deep .error-color{color:var(--danger)}::ng-deep .success-color{color:var(--success)}::ng-deep .df-list-view-accordion .mat-expansion-panel-header-description{flex-grow:0!important}::ng-deep .mat-expansion-panel-header[aria-disabled=true]{color:#0000008a}.drag-icon{cursor:move;margin-right:10px}\n"], dependencies: [{ kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i5.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i5.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i5.MatCardFooter, selector: "mat-card-footer" }, { kind: "component", type: i5.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i5.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: i6.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i6.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i6.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i6.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i6.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i10.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i11.AddFormRecordComponent, selector: "add-form-record", inputs: ["configurations", "endPointConfiguration", "userID", "orgaID", "formID", "form", "record", "onlyView", "isDuplicate", "inConfig", "QueryEditorComponent"], outputs: ["saveRecordEvent", "afterSaveRecordEvent", "out", "fireTrigger"] }, { kind: "component", type: i12.SingleRecordComponent, selector: "lib-single-record", inputs: ["endPointConfiguration", "record", "pageState", "userID", "form", "showBackButton", "outCompileConfigurations", "onlyView", "QueryEditorComponent"], outputs: ["saveRecordEvent", "afterSaveRecordEvent", "out", "fireTrigger"] }, { kind: "component", type: i13.GraphsComponent, selector: "graphs", inputs: ["configurations", "endPointConfiguration", "userID", "formID", "form"] }, { kind: "pipe", type: i9.DatePipe, name: "date" }] });
543
+ ListViewFormRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ListViewFormRecordComponent, selector: "list-view-form-record", inputs: { configurations: "configurations", compileConfigurations: "compileConfigurations", endPointConfiguration: "endPointConfiguration", userID: "userID", formID: "formID", orgaID: "orgaID", form: "form", defaultListViewFunction: "defaultListViewFunction", externalButtons: "externalButtons", onlyView: "onlyView", records: "records", highlightFilter: "highlightFilter", QueryEditorComponent: "QueryEditorComponent" }, outputs: { onAddViewEditRecord: "onAddViewEditRecord", onDeleteRecord: "onDeleteRecord", saveRecordEvent: "saveRecordEvent", afterSaveRecordEvent: "afterSaveRecordEvent", dragStarted: "dragStarted", dragReleased: "dragReleased", out: "out", fireTrigger: "fireTrigger" }, viewQueries: [{ propertyName: "tableRecords", first: true, predicate: ["tableRecords"], descendants: true, static: true }, { propertyName: "openAddDialog", first: true, predicate: ["openAddDialog"], descendants: true }, { propertyName: "openGraphDialog", first: true, predicate: ["openGraphDialog"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-card class=\"list-view-form-record\">\r\n <mat-card-header *ngIf=\"showTitle || defaultListActions.add\" class=\"align-items-center justify-content-between\">\r\n <mat-card-title *ngIf=\"showTitle && loadedform\">Modulo {{ form.Name }} </mat-card-title>\r\n <mat-card-actions *ngIf=\"defaultListActions.add || defaultListActions.graphs\">\r\n <button \r\n *ngIf=\"defaultListActions.graphs\"\r\n class=\"btn btn-primary mr-2\" \r\n mat-raised-button \r\n color=\"primary\" \r\n type=\"button\"\r\n (click)=\"openGraphs()\">\r\n <mat-icon>pie_chart</mat-icon>\r\n <span style=\"margin-left: 10px\">Grafici</span>\r\n </button>\r\n <button \r\n *ngIf=\"defaultListActions.add\"\r\n class=\"btn btn-primary\" \r\n mat-raised-button \r\n color=\"primary\" \r\n type=\"button\"\r\n (click)=\"openAddPopup()\">\r\n <mat-icon>add</mat-icon>\r\n <span style=\"margin-left: 10px\">Aggiungi</span>\r\n </button> \r\n </mat-card-actions>\r\n </mat-card-header>\r\n\r\n \r\n <mat-card-content>\r\n <mat-accordion #doneList=\"cdkDropList\" cdkDropList [cdkDropListConnectedTo]=\"[todoList]\" [hideToggle]=\"test\" [multi]=\"true\" class=\"df-list-view-accordion\">\r\n <mat-expansion-panel *ngFor=\"let panel of panels; index as i\" \r\n [expanded]=\"panel.isOpen\"\r\n [disabled]=\"1\" \r\n [class]=\"panel.highlighted ? 'dm_panel_highlighted' : '0'\"\r\n >\r\n <mat-expansion-panel-header \r\n (click)=\"togglePanel(panel, panel.record)\">\r\n <mat-panel-title cdkDrag (cdkDragStarted)=\"onDragStarted([panel.record,form])\" (cdkDragReleased)=\"onDragReleased()\">\r\n <mat-icon class=\"drag-icon\">drag_indicator</mat-icon> {{ !showTitle ? form.Name : \"\" }} v.{{ panel.record.Version }} - {{ panel.record.AnswerDate | date : \"EEEE, d MMMM y, H:mm:ss\" }} {{ printAdditionalInfo(panel.record) }}\r\n </mat-panel-title>\r\n <!--#region BOTTONI PER LE AZIONI -->\r\n <mat-panel-description>\r\n <button *ngFor=\"let button of buttons\" \r\n mat-icon-button \r\n class=\"record-icon {{button.extraClass}}\" \r\n [matTooltip]=\"button.text\"\r\n [hidden]=\"button.icon == 'file_copy' && (panels.length == 0 || panel.record.Version != panels[0].record.Version)\"\r\n (click)=\"button.fn(panel,i,$event)\">\r\n <mat-icon>{{button.icon}}</mat-icon>\r\n </button>\r\n <button *ngFor=\"let button of externalButtons\" \r\n mat-icon-button \r\n class=\"record-icon {{button.extraClass}}\"\r\n [matTooltip]=\"button.text\"\r\n (click)=\"externalCallback($event,button.fn,panel.record)\">\r\n <mat-icon>{{button.icon}}</mat-icon>\r\n </button> \r\n <span class=\"example-spacer\"></span>\r\n \r\n </mat-panel-description>\r\n <!--#endregion BOTTONI PER LE AZIONI -->\r\n </mat-expansion-panel-header>\r\n\r\n <!-- #region CONTENUTO -->\r\n <ng-container *ngIf=\"panel.pageState != null\">\r\n\r\n <lib-single-record\r\n [onlyView]=\"onlyView\"\r\n [record] = \"panel.record\" \r\n [endPointConfiguration] = \"endPointConfiguration\"\r\n [form]=\"form\"\r\n [userID]=\"userID\"\r\n [QueryEditorComponent]=\"QueryEditorComponent\"\r\n [outCompileConfigurations]=\"outCompileConfigurations\"\r\n [pageState]=\"panel.pageState\"\r\n (out)=\"onExternalComponentOut($event)\"\r\n (saveRecordEvent)=\"saveOrExitForm($event)\"\r\n (afterSaveRecordEvent)=\"onAfterSaveRecord($event)\"\r\n (fireTrigger)=\"onFireTrigger($event)\"\r\n >\r\n\r\n </lib-single-record>\r\n </ng-container>\r\n <!--#endregion CONTENUTO -->\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n\r\n\r\n </mat-card-content>\r\n <mat-card-footer>\r\n </mat-card-footer>\r\n</mat-card>\r\n\r\n<!--#region DIALOG AGGIUNTA RISPOSTA -->\r\n<ng-template #openAddDialog>\r\n <mat-card class=\"card-default overlay-card card-inmodal-true\">\r\n <mat-card-content>\r\n\r\n <add-form-record\r\n class=\"dynamic-module-compile\"\r\n [formID]=\"formID\"\r\n [orgaID]=\"orgaID\"\r\n [onlyView]=\"false\"\r\n [record]=\"selectedRecord\"\r\n\r\n [QueryEditorComponent]=\"QueryEditorComponent\"\r\n [endPointConfiguration]=\"endPointConfiguration\"\r\n [userID]=\"userID\"\r\n\r\n [configurations]=\"compileConfigurations\"\r\n\r\n (out)=\"onExternalComponentOut($event)\"\r\n (saveRecordEvent)=\"onAddSaveRecord($event)\"\r\n (afterSaveRecordEvent)=\"onAddAfterSaveRecord($event)\"\r\n (fireTrigger)=\"onFireTrigger($event)\"\r\n >\r\n </add-form-record>\r\n\r\n </mat-card-content>\r\n </mat-card>\r\n</ng-template>\r\n<!--#endregion DIALOG AGGIUNTA RISPOSTA -->\r\n\r\n<!--#region DIALOG VISUALIZZAZIONE GRAFICI -->\r\n<ng-template #openGraphDialog>\r\n <mat-card class=\"card-default overlay-card card-inmodal-true graphCard\">\r\n \r\n <mat-card-header class=\"align-items-center justify-content-between\">\r\n <mat-card-title>\r\n <div class=\"row eqp-dynamic-module-title graph-header\">\r\n <div class=\"col-md-12\">\r\n <span>Grafico {{ form.Name }} </span>\r\n </div>\r\n </div>\r\n </mat-card-title>\r\n <mat-card-actions>\r\n <button \r\n class=\"btn btn-primary mr-2\" \r\n mat-raised-button \r\n color=\"primary\" \r\n type=\"button\"\r\n (click)=\"closeGraphs()\">\r\n <span class=\"material-icons\">\r\n arrow_back\r\n </span>\r\n <span style=\"margin-left: 10px\">Indietro</span>\r\n </button>\r\n </mat-card-actions>\r\n </mat-card-header>\r\n <mat-card-content>\r\n\r\n <graphs\r\n [formID]=\"formID\"\r\n [userID]=\"userID\"\r\n [configurations] = \"outCompileConfigurations\"\r\n [endPointConfiguration] = \"endPointConfiguration\"\r\n >\r\n </graphs>\r\n\r\n </mat-card-content>\r\n </mat-card>\r\n</ng-template>\r\n<!--#endregion DIALOG VISUALIZZAZIONE GRAFICI -->\r\n", styles: ["::ng-deep .error-color{color:var(--danger)}::ng-deep .success-color{color:var(--success)}::ng-deep .df-list-view-accordion .mat-expansion-panel-header-description{flex-grow:0!important}::ng-deep .mat-expansion-panel-header[aria-disabled=true]{color:#0000008a}.drag-icon{cursor:move;margin-right:10px}\n"], dependencies: [{ kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i5.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i5.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i5.MatCardFooter, selector: "mat-card-footer" }, { kind: "component", type: i5.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i5.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: i6.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i6.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i6.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i6.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i6.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i10.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i11.AddFormRecordComponent, selector: "add-form-record", inputs: ["configurations", "endPointConfiguration", "userID", "orgaID", "formID", "form", "record", "onlyView", "isDuplicate", "inConfig", "showAllFields", "QueryEditorComponent"], outputs: ["saveRecordEvent", "afterSaveRecordEvent", "out", "fireTrigger"] }, { kind: "component", type: i12.SingleRecordComponent, selector: "lib-single-record", inputs: ["endPointConfiguration", "record", "pageState", "userID", "form", "showBackButton", "outCompileConfigurations", "onlyView", "QueryEditorComponent"], outputs: ["saveRecordEvent", "afterSaveRecordEvent", "out", "fireTrigger"] }, { kind: "component", type: i13.GraphsComponent, selector: "graphs", inputs: ["configurations", "endPointConfiguration", "userID", "formID", "form"] }, { kind: "pipe", type: i9.DatePipe, name: "date" }] });
544
544
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ListViewFormRecordComponent, decorators: [{
545
545
  type: Component,
546
546
  args: [{ selector: "list-view-form-record", template: "<mat-card class=\"list-view-form-record\">\r\n <mat-card-header *ngIf=\"showTitle || defaultListActions.add\" class=\"align-items-center justify-content-between\">\r\n <mat-card-title *ngIf=\"showTitle && loadedform\">Modulo {{ form.Name }} </mat-card-title>\r\n <mat-card-actions *ngIf=\"defaultListActions.add || defaultListActions.graphs\">\r\n <button \r\n *ngIf=\"defaultListActions.graphs\"\r\n class=\"btn btn-primary mr-2\" \r\n mat-raised-button \r\n color=\"primary\" \r\n type=\"button\"\r\n (click)=\"openGraphs()\">\r\n <mat-icon>pie_chart</mat-icon>\r\n <span style=\"margin-left: 10px\">Grafici</span>\r\n </button>\r\n <button \r\n *ngIf=\"defaultListActions.add\"\r\n class=\"btn btn-primary\" \r\n mat-raised-button \r\n color=\"primary\" \r\n type=\"button\"\r\n (click)=\"openAddPopup()\">\r\n <mat-icon>add</mat-icon>\r\n <span style=\"margin-left: 10px\">Aggiungi</span>\r\n </button> \r\n </mat-card-actions>\r\n </mat-card-header>\r\n\r\n \r\n <mat-card-content>\r\n <mat-accordion #doneList=\"cdkDropList\" cdkDropList [cdkDropListConnectedTo]=\"[todoList]\" [hideToggle]=\"test\" [multi]=\"true\" class=\"df-list-view-accordion\">\r\n <mat-expansion-panel *ngFor=\"let panel of panels; index as i\" \r\n [expanded]=\"panel.isOpen\"\r\n [disabled]=\"1\" \r\n [class]=\"panel.highlighted ? 'dm_panel_highlighted' : '0'\"\r\n >\r\n <mat-expansion-panel-header \r\n (click)=\"togglePanel(panel, panel.record)\">\r\n <mat-panel-title cdkDrag (cdkDragStarted)=\"onDragStarted([panel.record,form])\" (cdkDragReleased)=\"onDragReleased()\">\r\n <mat-icon class=\"drag-icon\">drag_indicator</mat-icon> {{ !showTitle ? form.Name : \"\" }} v.{{ panel.record.Version }} - {{ panel.record.AnswerDate | date : \"EEEE, d MMMM y, H:mm:ss\" }} {{ printAdditionalInfo(panel.record) }}\r\n </mat-panel-title>\r\n <!--#region BOTTONI PER LE AZIONI -->\r\n <mat-panel-description>\r\n <button *ngFor=\"let button of buttons\" \r\n mat-icon-button \r\n class=\"record-icon {{button.extraClass}}\" \r\n [matTooltip]=\"button.text\"\r\n [hidden]=\"button.icon == 'file_copy' && (panels.length == 0 || panel.record.Version != panels[0].record.Version)\"\r\n (click)=\"button.fn(panel,i,$event)\">\r\n <mat-icon>{{button.icon}}</mat-icon>\r\n </button>\r\n <button *ngFor=\"let button of externalButtons\" \r\n mat-icon-button \r\n class=\"record-icon {{button.extraClass}}\"\r\n [matTooltip]=\"button.text\"\r\n (click)=\"externalCallback($event,button.fn,panel.record)\">\r\n <mat-icon>{{button.icon}}</mat-icon>\r\n </button> \r\n <span class=\"example-spacer\"></span>\r\n \r\n </mat-panel-description>\r\n <!--#endregion BOTTONI PER LE AZIONI -->\r\n </mat-expansion-panel-header>\r\n\r\n <!-- #region CONTENUTO -->\r\n <ng-container *ngIf=\"panel.pageState != null\">\r\n\r\n <lib-single-record\r\n [onlyView]=\"onlyView\"\r\n [record] = \"panel.record\" \r\n [endPointConfiguration] = \"endPointConfiguration\"\r\n [form]=\"form\"\r\n [userID]=\"userID\"\r\n [QueryEditorComponent]=\"QueryEditorComponent\"\r\n [outCompileConfigurations]=\"outCompileConfigurations\"\r\n [pageState]=\"panel.pageState\"\r\n (out)=\"onExternalComponentOut($event)\"\r\n (saveRecordEvent)=\"saveOrExitForm($event)\"\r\n (afterSaveRecordEvent)=\"onAfterSaveRecord($event)\"\r\n (fireTrigger)=\"onFireTrigger($event)\"\r\n >\r\n\r\n </lib-single-record>\r\n </ng-container>\r\n <!--#endregion CONTENUTO -->\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n\r\n\r\n </mat-card-content>\r\n <mat-card-footer>\r\n </mat-card-footer>\r\n</mat-card>\r\n\r\n<!--#region DIALOG AGGIUNTA RISPOSTA -->\r\n<ng-template #openAddDialog>\r\n <mat-card class=\"card-default overlay-card card-inmodal-true\">\r\n <mat-card-content>\r\n\r\n <add-form-record\r\n class=\"dynamic-module-compile\"\r\n [formID]=\"formID\"\r\n [orgaID]=\"orgaID\"\r\n [onlyView]=\"false\"\r\n [record]=\"selectedRecord\"\r\n\r\n [QueryEditorComponent]=\"QueryEditorComponent\"\r\n [endPointConfiguration]=\"endPointConfiguration\"\r\n [userID]=\"userID\"\r\n\r\n [configurations]=\"compileConfigurations\"\r\n\r\n (out)=\"onExternalComponentOut($event)\"\r\n (saveRecordEvent)=\"onAddSaveRecord($event)\"\r\n (afterSaveRecordEvent)=\"onAddAfterSaveRecord($event)\"\r\n (fireTrigger)=\"onFireTrigger($event)\"\r\n >\r\n </add-form-record>\r\n\r\n </mat-card-content>\r\n </mat-card>\r\n</ng-template>\r\n<!--#endregion DIALOG AGGIUNTA RISPOSTA -->\r\n\r\n<!--#region DIALOG VISUALIZZAZIONE GRAFICI -->\r\n<ng-template #openGraphDialog>\r\n <mat-card class=\"card-default overlay-card card-inmodal-true graphCard\">\r\n \r\n <mat-card-header class=\"align-items-center justify-content-between\">\r\n <mat-card-title>\r\n <div class=\"row eqp-dynamic-module-title graph-header\">\r\n <div class=\"col-md-12\">\r\n <span>Grafico {{ form.Name }} </span>\r\n </div>\r\n </div>\r\n </mat-card-title>\r\n <mat-card-actions>\r\n <button \r\n class=\"btn btn-primary mr-2\" \r\n mat-raised-button \r\n color=\"primary\" \r\n type=\"button\"\r\n (click)=\"closeGraphs()\">\r\n <span class=\"material-icons\">\r\n arrow_back\r\n </span>\r\n <span style=\"margin-left: 10px\">Indietro</span>\r\n </button>\r\n </mat-card-actions>\r\n </mat-card-header>\r\n <mat-card-content>\r\n\r\n <graphs\r\n [formID]=\"formID\"\r\n [userID]=\"userID\"\r\n [configurations] = \"outCompileConfigurations\"\r\n [endPointConfiguration] = \"endPointConfiguration\"\r\n >\r\n </graphs>\r\n\r\n </mat-card-content>\r\n </mat-card>\r\n</ng-template>\r\n<!--#endregion DIALOG VISUALIZZAZIONE GRAFICI -->\r\n", styles: ["::ng-deep .error-color{color:var(--danger)}::ng-deep .success-color{color:var(--success)}::ng-deep .df-list-view-accordion .mat-expansion-panel-header-description{flex-grow:0!important}::ng-deep .mat-expansion-panel-header[aria-disabled=true]{color:#0000008a}.drag-icon{cursor:move;margin-right:10px}\n"] }]
@@ -41,7 +41,7 @@ export class SingleRecordComponent {
41
41
  }
42
42
  }
43
43
  SingleRecordComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SingleRecordComponent, deps: [{ token: i1.UtilityHelperService }], target: i0.ɵɵFactoryTarget.Component });
44
- SingleRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: SingleRecordComponent, selector: "lib-single-record", inputs: { endPointConfiguration: "endPointConfiguration", record: "record", pageState: "pageState", userID: "userID", form: "form", showBackButton: "showBackButton", outCompileConfigurations: "outCompileConfigurations", onlyView: "onlyView", QueryEditorComponent: "QueryEditorComponent" }, outputs: { saveRecordEvent: "saveRecordEvent", afterSaveRecordEvent: "afterSaveRecordEvent", out: "out", fireTrigger: "fireTrigger" }, ngImport: i0, template: "<ng-container *ngIf=\"loaded && record && pageState\">\r\n\r\n <!--#region VISUALIZZA CONTENUTO -->\r\n <ng-container *ngIf=\"pageState == 'visualizzaContenuto'\">\r\n <view-form-record \r\n [endPointConfiguration]=\"endPointConfiguration\"\r\n [record]=\"record\" \r\n [showBackButton]=\"false\">\r\n </view-form-record>\r\n </ng-container>\r\n <!--#endregion VISUALIZZA CONTENUTO -->\r\n\r\n <!--#region MODIFICA RISPOSTA -->\r\n <ng-container *ngIf=\"pageState == 'modificaContenuto'\">\r\n <add-form-record\r\n [onlyView]=\"onlyView\"\r\n [form]=\"form\"\r\n [userID]=\"userID\"\r\n [record]=\"record\"\r\n\r\n [QueryEditorComponent]=\"QueryEditorComponent\"\r\n [configurations]=\"outCompileConfigurations\"\r\n [endPointConfiguration]=\"endPointConfiguration\"\r\n\r\n (out)=\"onExternalComponentOut($event)\"\r\n (saveRecordEvent)=\"saveOrExitForm($event)\"\r\n (afterSaveRecordEvent)=\"onAfterSaveRecord($event)\"\r\n (fireTrigger)=\"onFireTrigger($event)\"\r\n >\r\n </add-form-record>\r\n </ng-container>\r\n <!--#endregion MODIFICA RISPOSTA -->\r\n\r\n</ng-container>", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.AddFormRecordComponent, selector: "add-form-record", inputs: ["configurations", "endPointConfiguration", "userID", "orgaID", "formID", "form", "record", "onlyView", "isDuplicate", "inConfig", "QueryEditorComponent"], outputs: ["saveRecordEvent", "afterSaveRecordEvent", "out", "fireTrigger"] }, { kind: "component", type: i4.ViewFormRecordComponent, selector: "view-form-record", inputs: ["endPointConfiguration", "record", "showBackButton"], outputs: ["goBackEvent"] }] });
44
+ SingleRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: SingleRecordComponent, selector: "lib-single-record", inputs: { endPointConfiguration: "endPointConfiguration", record: "record", pageState: "pageState", userID: "userID", form: "form", showBackButton: "showBackButton", outCompileConfigurations: "outCompileConfigurations", onlyView: "onlyView", QueryEditorComponent: "QueryEditorComponent" }, outputs: { saveRecordEvent: "saveRecordEvent", afterSaveRecordEvent: "afterSaveRecordEvent", out: "out", fireTrigger: "fireTrigger" }, ngImport: i0, template: "<ng-container *ngIf=\"loaded && record && pageState\">\r\n\r\n <!--#region VISUALIZZA CONTENUTO -->\r\n <ng-container *ngIf=\"pageState == 'visualizzaContenuto'\">\r\n <view-form-record \r\n [endPointConfiguration]=\"endPointConfiguration\"\r\n [record]=\"record\" \r\n [showBackButton]=\"false\">\r\n </view-form-record>\r\n </ng-container>\r\n <!--#endregion VISUALIZZA CONTENUTO -->\r\n\r\n <!--#region MODIFICA RISPOSTA -->\r\n <ng-container *ngIf=\"pageState == 'modificaContenuto'\">\r\n <add-form-record\r\n [onlyView]=\"onlyView\"\r\n [form]=\"form\"\r\n [userID]=\"userID\"\r\n [record]=\"record\"\r\n\r\n [QueryEditorComponent]=\"QueryEditorComponent\"\r\n [configurations]=\"outCompileConfigurations\"\r\n [endPointConfiguration]=\"endPointConfiguration\"\r\n\r\n (out)=\"onExternalComponentOut($event)\"\r\n (saveRecordEvent)=\"saveOrExitForm($event)\"\r\n (afterSaveRecordEvent)=\"onAfterSaveRecord($event)\"\r\n (fireTrigger)=\"onFireTrigger($event)\"\r\n >\r\n </add-form-record>\r\n </ng-container>\r\n <!--#endregion MODIFICA RISPOSTA -->\r\n\r\n</ng-container>", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.AddFormRecordComponent, selector: "add-form-record", inputs: ["configurations", "endPointConfiguration", "userID", "orgaID", "formID", "form", "record", "onlyView", "isDuplicate", "inConfig", "showAllFields", "QueryEditorComponent"], outputs: ["saveRecordEvent", "afterSaveRecordEvent", "out", "fireTrigger"] }, { kind: "component", type: i4.ViewFormRecordComponent, selector: "view-form-record", inputs: ["endPointConfiguration", "record", "showBackButton"], outputs: ["goBackEvent"] }] });
45
45
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SingleRecordComponent, decorators: [{
46
46
  type: Component,
47
47
  args: [{ selector: 'lib-single-record', template: "<ng-container *ngIf=\"loaded && record && pageState\">\r\n\r\n <!--#region VISUALIZZA CONTENUTO -->\r\n <ng-container *ngIf=\"pageState == 'visualizzaContenuto'\">\r\n <view-form-record \r\n [endPointConfiguration]=\"endPointConfiguration\"\r\n [record]=\"record\" \r\n [showBackButton]=\"false\">\r\n </view-form-record>\r\n </ng-container>\r\n <!--#endregion VISUALIZZA CONTENUTO -->\r\n\r\n <!--#region MODIFICA RISPOSTA -->\r\n <ng-container *ngIf=\"pageState == 'modificaContenuto'\">\r\n <add-form-record\r\n [onlyView]=\"onlyView\"\r\n [form]=\"form\"\r\n [userID]=\"userID\"\r\n [record]=\"record\"\r\n\r\n [QueryEditorComponent]=\"QueryEditorComponent\"\r\n [configurations]=\"outCompileConfigurations\"\r\n [endPointConfiguration]=\"endPointConfiguration\"\r\n\r\n (out)=\"onExternalComponentOut($event)\"\r\n (saveRecordEvent)=\"saveOrExitForm($event)\"\r\n (afterSaveRecordEvent)=\"onAfterSaveRecord($event)\"\r\n (fireTrigger)=\"onFireTrigger($event)\"\r\n >\r\n </add-form-record>\r\n </ng-container>\r\n <!--#endregion MODIFICA RISPOSTA -->\r\n\r\n</ng-container>" }]
@@ -0,0 +1,3 @@
1
+ export class Contestualization {
2
+ }
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0dGVyLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvbW9kZWxzL2dldHRlci5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8saUJBQWlCO0NBRzdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIENvbnRlc3R1YWxpemF0aW9uIHtcclxuICAgIGVudGl0eVRhYmxlTmFtZTogc3RyaW5nO1xyXG4gICAgZW50aXR5SUQ6IG51bWJlcjsgICBcclxufSJdfQ==
@@ -163,7 +163,7 @@ export class UtilityHelperService {
163
163
  * @param field BaseField da visualizzare.
164
164
  * @returns Restituisce una stringa contenente le classi css da applicare.
165
165
  */
166
- getFieldSyleClass(field) {
166
+ getFieldSyleClass(field, showAllFields = false) {
167
167
  var colspanvalues = "";
168
168
  var visibilityvalues = "";
169
169
  if (field.ColSpanSizes && field.ColSpanSizes.length > 0) {
@@ -172,7 +172,7 @@ export class UtilityHelperService {
172
172
  else {
173
173
  colspanvalues = this.getDefaultStyleClass(field, 'align-self-end');
174
174
  }
175
- if (!field.InListView) {
175
+ if (!field.InListView && !showAllFields) {
176
176
  if (field.Invisibility == FieldInvisibilityEnum.NASCOSTO) {
177
177
  visibilityvalues = "visibility_hidden";
178
178
  }
@@ -580,4 +580,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
580
580
  providedIn: "root",
581
581
  }]
582
582
  }], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i2.HttpClient }, { type: i3.SpinnerService }]; } });
583
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0eUhlbHBlci5zZXJ2aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBR0wsa0JBQWtCLEVBR2xCLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGFBQWEsR0FDZCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRCxPQUFPLEVBQ0wscUJBQXFCLEVBR3JCLGFBQWEsRUFDYixpQkFBaUIsR0FDbEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUsvQyxPQUFPLEVBQ0wsWUFBWSxFQUNaLFNBQVMsRUFDVCxRQUFRLEVBQ1IsUUFBUSxHQUNULE1BQU0sa0NBQWtDLENBQUM7QUFHMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7OztBQVNwRixNQUFNLE9BQU8sb0JBQW9CO0lBSS9CLFFBQVEsQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUNsQyxJQUFHLElBQUksQ0FBQyxTQUFTLEVBQUM7WUFDaEIsSUFBRyxJQUFJLEVBQUM7Z0JBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7YUFDM0I7aUJBQUk7Z0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTthQUNyQjtTQUNGO0lBQ0gsQ0FBQztJQUVELFlBQ1UsV0FBK0IsRUFDL0IsSUFBZ0IsRUFDaEIsY0FBOEI7UUFGOUIsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBZHhDLGNBQVMsR0FBWSxLQUFLLENBQUM7SUFleEIsQ0FBQztJQUVHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDaEMsT0FBZSxFQUNmLEdBQVcsRUFDWCxHQUFRO1FBRVIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNoRCxDQUFDO0lBRU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFZO1FBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLENBQUM7SUFDTSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRO1FBQy9CLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVNLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBZ0I7UUFDekMsUUFBUSxLQUFLLENBQUMsU0FBUyxFQUFFO1lBQ3ZCLEtBQUssYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxDQUFDLEdBQWMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFNBQVMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzRCxPQUFPLENBQUMsQ0FBQztnQkFDVCxNQUFNO2FBQ1A7WUFDRCxPQUFPLENBQUMsQ0FBQztnQkFDUCxNQUFNO2FBQ1A7U0FDRjtJQUNILENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxNQUFNLENBQUMsc0JBQXNCLENBQ2xDLE1BQXdCLEVBQ3hCLFlBQW9CO1FBRXBCLElBQUksbUJBQW1CLEdBQTRDLEVBQUUsQ0FBQztRQUV0RSxrRUFBa0U7UUFDbEUsTUFBTSxzQkFBc0IsR0FBa0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzdELENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FDN0IsQ0FBQztRQUVGLDRIQUE0SDtRQUM1SCx3SUFBd0k7UUFDeEksSUFDRSxDQUFDLFlBQVk7WUFDYixDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQzFCLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FDOUIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQ3JFLENBQUMsRUFDSjtZQUNBLG1CQUFtQixHQUFHO2dCQUNwQixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRTtnQkFDbkUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUU7YUFDcEUsQ0FBQztTQUNIO1FBQ0Qsa0hBQWtIO1FBQ2xILHNIQUFzSDtRQUN0SCx5R0FBeUc7YUFDcEcsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLE1BQU0sYUFBYSxHQUFrQixZQUFZO2lCQUM5QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQ1YsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELElBQUksYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFO2dCQUNyRCxtQkFBbUIsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsQ0FBQyxDQUFDLENBQUM7YUFDSjtpQkFBTSxJQUFJLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDNUQsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQ2pFLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ0osT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsQ0FBQyxDQUNGLENBQUM7YUFDSDtpQkFBTSxJQUNMLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDeEIsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSztnQkFDakQsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUNsRDtnQkFDQSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUMvQixvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNsQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNWLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQy9DLENBQUMsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO2FBQzFCO1NBQ0Y7UUFDRCx3R0FBd0c7UUFDeEcsc0dBQXNHO1FBQ3RHLHdIQUF3SDtRQUN4SCwrREFBK0Q7YUFDMUQ7WUFDSCxNQUFNLGdCQUFnQixHQUE0QyxFQUFFLENBQUM7WUFFckUsMkRBQTJEO1lBQzNELE1BQU0sZUFBZSxHQUFrQixZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9ELDJEQUEyRDtZQUMzRCxNQUFNLGVBQWUsR0FDbkIsZUFBZSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFOUMsNEZBQTRGO1lBQzVGLHlGQUF5RjtZQUN6RixJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQ3ZELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUU1RCxJQUFJLGlCQUFpQixHQUFrQixFQUFFLENBQUM7Z0JBRTFDLElBQUksWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7b0JBQzVCLGlCQUFpQixHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUNwQztxQkFBTSxJQUNMLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDdkIsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUMvQztvQkFDQSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUMvRDtxQkFBTSxJQUNMLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDdkIsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSztvQkFDL0MsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUNoRDtvQkFDQSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEU7cUJBQU0sSUFDTCxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ3ZCLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFDL0M7b0JBQ0EsaUJBQWlCLEdBQUcsc0JBQXNCLENBQUM7aUJBQzVDO2dCQUVELHlHQUF5RztnQkFDekcscUNBQXFDO2dCQUNyQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDakMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFO3dCQUNsQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7NEJBQ3BCLEtBQUssRUFBRSxJQUFJOzRCQUNYLEtBQUssRUFDSCxZQUFZO2dDQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO3lCQUNwRCxDQUFDLENBQUM7cUJBQ0o7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUVELG1CQUFtQixHQUFHLGdCQUFnQixDQUFDO1NBQ3hDO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsaUJBQWlCLENBQUMsS0FBZ0I7UUFFaEMsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7WUFDdEQsYUFBYSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDaEQsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDOUM7YUFBTTtZQUNMLGFBQWEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7U0FDcEU7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBQztZQUNwQixJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUkscUJBQXFCLENBQUMsUUFBUSxFQUFDO2dCQUFFLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO2FBQUU7WUFDcEcsSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLHFCQUFxQixDQUFDLDRCQUE0QixDQUFDLEVBQUM7Z0JBQUUsZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUM7YUFBRTtTQUMvSDtRQUVELE9BQU8sYUFBYSxHQUFHLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsd0JBQXdCLENBQUMsS0FBZ0I7UUFFdkMsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBRTFCLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBRW5HLGFBQWEsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUMxRCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FDbEMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDYjthQUFNO1lBQ0wsYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztTQUN0RTtRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBQztZQUNoQyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsWUFBWSxJQUFJLHFCQUFxQixDQUFDLFFBQVEsRUFBQztnQkFBRSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQzthQUFFO1lBQ2hILElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLElBQUkscUJBQXFCLENBQUMsNEJBQTRCLENBQUMsRUFBQztnQkFBRSxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQzthQUFFO1NBQzNJO1FBRUQsT0FBTyxhQUFhLEdBQUcsR0FBRyxHQUFHLGdCQUFnQixDQUFDO0lBQ2hELENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxLQUFnQixFQUFFLFlBQW9CO1FBRWpFLFFBQVEsS0FBSyxDQUFDLFNBQVMsRUFBRTtZQUN2QixLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDbEMsMENBQTBDO2dCQUMxQyxPQUFPLDhCQUE4QixHQUFHLFlBQVksQ0FBQztZQUN2RCxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQUM7Z0JBQ2pDLHlDQUF5QztnQkFDekMsT0FBTyxnQ0FBZ0MsR0FBRyxZQUFZLENBQUM7WUFDekQsS0FBSyxhQUFhLENBQUMsVUFBVSxDQUFDO2dCQUM1QixvQ0FBb0M7Z0JBQ3BDLE9BQU8sOEJBQThCLEdBQUcsWUFBWSxDQUFDO1lBQ3ZELEtBQUssYUFBYSxDQUFDLGNBQWMsQ0FBQztnQkFDaEMsd0NBQXdDO2dCQUN4QyxPQUFPLDhCQUE4QixHQUFHLFlBQVksQ0FBQztZQUN2RCxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDbEMsMENBQTBDO2dCQUMxQyxPQUFPLDhCQUE4QixHQUFHLFlBQVksQ0FBQztZQUN2RCxLQUFLLGFBQWEsQ0FBQyxVQUFVLENBQUM7Z0JBQzVCLG9DQUFvQztnQkFDcEMsSUFDRyxLQUF5QixDQUFDLGFBQWE7b0JBQ3hDLENBQUUsS0FBeUIsQ0FBQyxjQUFjO3dCQUN2QyxLQUF5QixDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQ3ZEO29CQUNBLE9BQU8sZ0NBQWdDLEdBQUcsWUFBWSxDQUFDO2lCQUN4RDtxQkFBTTtvQkFDTCxPQUFPLDhCQUE4QixHQUFHLFlBQVksQ0FBQztpQkFDdEQ7WUFDSCxLQUFLLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM3QixvQ0FBb0M7WUFDcEM7Ozs7Ozs7OztlQVNHO1lBRUwsS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7Z0JBQ25DLDJDQUEyQztnQkFDM0MsT0FBTyw4QkFBOEIsR0FBRyxZQUFZLENBQUM7WUFDdkQsS0FBSyxhQUFhLENBQUMsUUFBUSxDQUFDO2dCQUMxQixrQ0FBa0M7Z0JBQ2xDLE9BQU8sOEJBQThCLEdBQUcsWUFBWSxDQUFDO1lBQ3ZELEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO2dCQUNyQyw2Q0FBNkM7Z0JBQzdDLE9BQU8sZ0NBQWdDLEdBQUcsWUFBWSxDQUFDO1lBQ3pELEtBQUssYUFBYSxDQUFDLGlCQUFpQixDQUFDO2dCQUNuQyxPQUFPLDhCQUE4QixHQUFHLFlBQVksQ0FBQztZQUN2RCxLQUFLLGFBQWEsQ0FBQyxXQUFXLENBQUM7Z0JBQzdCLE9BQU8sOEJBQThCLEdBQUcsWUFBWSxDQUFDO1NBQ3hEO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxtQkFBbUIsQ0FDeEIsVUFBNEIsRUFDNUIsTUFBYyxFQUNkLFFBQVEsR0FBRyxLQUFLLEVBQ2hCLHlCQUF5QixHQUFHLElBQUk7UUFFaEMsc0RBQXNEO1FBQ3RELDhDQUE4QztRQUM5QyxrREFBa0Q7UUFDbEQsb0ZBQW9GO1FBRXBGLE1BQU0sUUFBUSxHQUFxQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU5RCxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDN0IscUNBQXFDO1lBQ25DLFFBQVEsQ0FBQyxVQUFVLENBQ2pCLEtBQUssQ0FBQyxJQUFJLEVBQ1YsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FDM0MsQ0FBQztZQUNGLElBQUkseUJBQXlCLEVBQUU7Z0JBQzdCLG1DQUFtQztnQkFFbkMsS0FBSyxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7YUFDaEM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksUUFBUSxFQUFFO1lBQ1osUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3BCO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxzQkFBc0IsQ0FDNUIsS0FBZ0IsRUFDaEIsTUFBYztRQUVkLE1BQU0sVUFBVSxHQUF1QixFQUFFLENBQUM7UUFFMUMsSUFBSSxLQUFLLENBQUMsUUFBUTtZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXpELFFBQVEsS0FBSyxDQUFDLFNBQVMsRUFBRTtZQUN2QixLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDbEMsSUFBSyxLQUFtQixDQUFDLFNBQVMsRUFBRTtvQkFDbEMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFFLEtBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztpQkFDdkU7Z0JBQ0QsSUFBSyxLQUFtQixDQUFDLFNBQVMsRUFBRTtvQkFDbEMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFFLEtBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztpQkFDdkU7Z0JBQ0QsUUFBUyxLQUFtQixDQUFDLFFBQVEsRUFBRTtvQkFDckMsS0FBSyxZQUFZLENBQUMsR0FBRzt3QkFDbkIsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7d0JBQzlDLE1BQU07b0JBQ1IsS0FBSyxZQUFZLENBQUMsS0FBSzt3QkFDckIsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ2xDLE1BQU07b0JBQ1IsS0FBSyxZQUFZLENBQUMsUUFBUTt3QkFDeEIsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7d0JBQzlDLE1BQU07aUJBQ1Q7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztnQkFDakMsSUFBSyxLQUF1QixDQUFDLFNBQVMsRUFBRTtvQkFDdEMsVUFBVSxDQUFDLElBQUksQ0FDYixVQUFVLENBQUMsU0FBUyxDQUFFLEtBQXVCLENBQUMsU0FBUyxDQUFDLENBQ3pELENBQUM7aUJBQ0g7Z0JBQ0QsSUFBSyxLQUF1QixDQUFDLFNBQVMsRUFBRTtvQkFDdEMsVUFBVSxDQUFDLElBQUksQ0FDYixVQUFVLENBQUMsU0FBUyxDQUFFLEtBQXVCLENBQUMsU0FBUyxDQUFDLENBQ3pELENBQUM7aUJBQ0g7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssYUFBYSxDQUFDLFFBQVEsQ0FBQztZQUM1QixLQUFLLGFBQWEsQ0FBQyxRQUFRO2dCQUN6QixJQUFJLEtBQUssQ0FBQyxRQUFRO29CQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsRSxNQUFNO1lBQ1IsS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7Z0JBQ25DLElBQUssS0FBd0IsQ0FBQyxjQUFjO29CQUMxQyxJQUFJLEtBQUssQ0FBQyxRQUFRO3dCQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwRSxNQUFNO1lBQ1IsS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7Z0JBQ25DLElBQUssS0FBNEIsQ0FBQyxjQUFjO29CQUM5QyxJQUFJLEtBQUssQ0FBQyxRQUFRO3dCQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwRSxNQUFNO1NBQ1Q7UUFFRCxPQUFPLElBQUksa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUVoRSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kseUJBQXlCLENBQzlCLGFBQXFCLEVBQ3JCLFNBQWlCO1FBRWpCLElBQUkscUJBQXFCLEdBQ3ZCLElBQUkscUJBQXFCLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXRELG9DQUFvQztRQUNwQywyQkFBMkI7UUFDM0IsNkNBQTZDO1FBQzdDLHdCQUF3QjtRQUN4Qiw0Q0FBNEM7UUFDNUMsT0FBTztRQUNQLG9DQUFvQztRQUNwQyxxREFBcUQ7UUFDckQsd0JBQXdCO1FBQ3hCLDRDQUE0QztRQUM1QyxPQUFPO1FBQ1AsdUJBQXVCO1FBQ3ZCLDhDQUE4QztRQUM5Qyx3QkFBd0I7UUFDeEIsNENBQTRDO1FBQzVDLE9BQU87UUFDUCxvQkFBb0I7UUFDcEIsMkNBQTJDO1FBQzNDLHdCQUF3QjtRQUN4Qiw2Q0FBNkM7UUFDN0MsT0FBTztRQUNQLHlCQUF5QjtRQUN6QixnREFBZ0Q7UUFDaEQsd0JBQXdCO1FBQ3hCLDRDQUE0QztRQUM1QyxPQUFPO1FBQ1Asc0JBQXNCO1FBQ3RCLDZDQUE2QztRQUM3Qyx3QkFBd0I7UUFDeEIsK0NBQStDO1FBQy9DLE9BQU87UUFDUCxLQUFLO1FBQ0wsa0NBQWtDO1FBQ2xDLHVCQUF1QjtRQUN2Qiw2Q0FBNkM7UUFDN0Msd0JBQXdCO1FBQ3hCLDRDQUE0QztRQUM1QyxPQUFPO1FBQ1AsaUNBQWlDO1FBQ2pDLDBEQUEwRDtRQUMxRCx3QkFBd0I7UUFDeEIsNENBQTRDO1FBQzVDLE9BQU87UUFDUCxvQkFBb0I7UUFDcEIsNkNBQTZDO1FBQzdDLHdCQUF3QjtRQUN4Qiw2Q0FBNkM7UUFDN0MsT0FBTztRQUNQLEtBQUs7UUFDTCxPQUFPLHFCQUFxQixDQUFDO0lBQy9CLENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxRQUFRLEdBQUcsS0FBSztRQUM5RCxJQUFJLFVBQVUsSUFBSSxTQUFTLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUNqRCxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDaEM7UUFDRCxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLE9BQU8sQ0FBQztRQUNaLE1BQU0sV0FBVyxHQUFHO1lBQ2xCLEdBQUcsRUFBRSxHQUFHO1lBQ1IsR0FBRyxFQUFFLEdBQUc7WUFDUixHQUFHLEVBQUUsR0FBRztTQUNULENBQUM7UUFFRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO1lBRS9ELElBQUksT0FBTyxLQUFLLEdBQUcsSUFBSSxPQUFPLEtBQUssR0FBRyxJQUFJLE9BQU8sS0FBSyxHQUFHLEVBQUU7Z0JBQ3pELEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDckI7aUJBQU0sSUFBSSxPQUFPLEtBQUssR0FBRyxJQUFJLE9BQU8sS0FBSyxHQUFHLElBQUksT0FBTyxLQUFLLEdBQUcsRUFBRTtnQkFDaEUsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUVoQyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxPQUFPLEVBQUU7b0JBQ3hDLHNGQUFzRjtvQkFFdEYsT0FBTyxLQUFLLENBQUMsQ0FBQyxpRUFBaUU7aUJBQ2hGO2FBQ0Y7U0FDRjtRQUVELE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxzQ0FBc0M7SUFDbkUsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksZUFBZSxDQUNwQixZQUEwQixFQUMxQixzQkFBaUQsSUFBSSxFQUNyRCxXQUE0RyxJQUFJLEVBQ2hILGdCQUF3QyxJQUFJO1FBRTVDLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV4QyxJQUFJLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLFdBQVcsR0FBVyxJQUFJLENBQUM7UUFDL0IsTUFBTSxVQUFVLEdBQUc7WUFDakIsZ0JBQWdCLEVBQUUsRUFBRTtTQUNyQixDQUFDO1FBRUYsb0JBQW9CO1FBQ3BCLHdIQUF3SDtRQUN4SCxJQUFJLFlBQVksQ0FBQyxNQUFNLElBQUksU0FBUyxJQUFJLFlBQVksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ25FLFlBQVksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxtQkFBbUIsSUFBSSxTQUFTLElBQUksbUJBQW1CLElBQUksSUFBSSxFQUFFO1lBQ25FLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztTQUMxQjtRQUVELE1BQU0sWUFBWSxHQUE4QixDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpFLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2xDLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQzFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxTQUFTLENBQzNDLENBQUM7WUFFRixJQUFJLGFBQWEsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDeEIsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO2dCQUN4RCxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7YUFDdkQ7aUJBQU07Z0JBQ0wsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN4QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxZQUFZLEVBQUU7WUFDaEIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUM3QixRQUFRLEtBQUssQ0FBQyxTQUFTLEVBQUU7b0JBQ3ZCLEtBQUssYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7d0JBQ2pDLE1BQU0sV0FBVyxHQUNmLEtBQUssQ0FBQyxTQUFTLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7d0JBQzNDLFdBQVc7NEJBQ1QsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUM7d0JBQy9ELE1BQU07cUJBQ1A7b0JBQ0QsS0FBSyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzt3QkFDOUIsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQzt3QkFDOUQsTUFBTTtxQkFDUDtvQkFDRCxLQUFLLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3dCQUM3QixVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7d0JBQy9DLE1BQU07cUJBQ1A7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsdUJBQXVCO1FBRXZCLDBCQUEwQjtRQUMxQiwyR0FBMkc7UUFDM0csbURBQW1EO1FBQ25ELDZCQUE2QjtRQUM3Qiw2Q0FBNkM7UUFDN0MscUNBQXFDO1FBQ3JDLG1EQUFtRDtRQUNuRCx3RkFBd0Y7UUFDeEYsOEZBQThGO1FBQzlGLHlCQUF5QjtRQUN6QixnQkFBZ0I7UUFDaEIsZ0RBQWdEO1FBQ2hELGlGQUFpRjtRQUNqRix5QkFBeUI7UUFDekIsZ0JBQWdCO1FBQ2hCLCtDQUErQztRQUMvQyxtRkFBbUY7UUFDbkYseUJBQXlCO1FBQ3pCLGdCQUFnQjtRQUNoQixZQUFZO1FBQ1osVUFBVTtRQUNWLElBQUk7UUFDSiw2QkFBNkI7UUFFN0IsMkJBQTJCO1FBQzNCLHVHQUF1RztRQUN2Ryw2R0FBNkc7UUFDN0csNkJBQTZCO1FBQzdCLDZDQUE2QztRQUM3QyxxQ0FBcUM7UUFDckMsbURBQW1EO1FBQ25ELHdGQUF3RjtRQUN4Riw4RkFBOEY7UUFDOUYseUJBQXlCO1FBQ3pCLGdCQUFnQjtRQUNoQixnREFBZ0Q7UUFDaEQsaUZBQWlGO1FBQ2pGLHlCQUF5QjtRQUN6QixnQkFBZ0I7UUFDaEIsK0NBQStDO1FBQy9DLGtFQUFrRTtRQUNsRSx5QkFBeUI7UUFDekIsZ0JBQWdCO1FBQ2hCLFlBQVk7UUFDWixTQUFTO1FBQ1QsSUFBSTtRQUNKLDhCQUE4QjtRQUU5QixJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7WUFDdkIsR0FBRztnQkFDRCxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztvQkFDNUQsR0FBRztvQkFDSCxXQUFXLENBQUM7U0FDZjtRQUVELElBQUksQ0FBQyxJQUFJO2FBQ04sT0FBTyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO1lBQ3hDLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSztnQkFDekIsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUU7Z0JBQ3ZDLENBQUMsQ0FBQyxJQUFJO1lBQ1IsSUFBSSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUMvRCxZQUFZLENBQUMsYUFBYSxDQUMzQjtnQkFDQyxDQUFDLENBQUMsVUFBVTtnQkFDWixDQUFDLENBQUMsSUFBSTtTQUNULENBQUM7YUFDRCxTQUFTLENBQ1IsQ0FBQyxHQUFrQyxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzNDLElBQUksUUFBUSxFQUFFO2dCQUNaLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNmO1FBQ0gsQ0FBQyxFQUNELENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDM0MsSUFBSSxhQUFhLEVBQUU7Z0JBQ2pCLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtZQUNELDZCQUE2QixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsOERBQThEO1FBQ2hFLENBQUMsQ0FDRixDQUFDO0lBRU4sQ0FBQzs7QUFqcEJhLDRCQUFPLEdBQVksSUFBSSxPQUFPLEVBQUUsQ0FBQztrSEFEcEMsb0JBQW9CO3NIQUFwQixvQkFBb0IsY0FGbkIsTUFBTTs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgVW50eXBlZEZvcm1CdWlsZGVyLFxyXG4gIFVudHlwZWRGb3JtQ29udHJvbCxcclxuICBVbnR5cGVkRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvckZuLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUZpZWxkLFxyXG4gIENvbFNwYW5TaXplc0VudW0sXHJcbiAgRmllbGRJbnZpc2liaWxpdHlFbnVtLFxyXG4gIEZpZWxkVHlwZUVudW0sXHJcbn0gZnJvbSBcIi4uL21vZGVscy9iYXNlRmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9tb2RlbHMvY29udGV4dC5tb2RlbFwiO1xyXG5pbXBvcnQge1xyXG4gIEVuZFBvaW50Q29uZmlndXJhdGlvbixcclxuICBFbmRQb2ludERhdGEsXHJcbiAgRW5kUG9pbnREYXRhUGFyYW1zLFxyXG4gIFBhcmFtVHlwZUVudW0sXHJcbiAgUmVxdWVzdE1ldGhvZEVudW0sXHJcbn0gZnJvbSBcIi4uL21vZGVscy9lbmRQb2ludENvbmZpZ3VyYXRpb24ubW9kZWxcIjtcclxuaW1wb3J0IHsgQXR0YWNobWVudEZpZWxkIH0gZnJvbSBcIi4uL21vZGVscy9maWVsZHMvYXR0YWNobWVudEZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IEltYWdlRmllbGQgfSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy9pbWFnZUZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IExpc3RWYWx1ZUZpZWxkIH0gZnJvbSBcIi4uL21vZGVscy9maWVsZHMvbGlzdFZhbHVlRmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgVGV4dGFyZWFGaWVsZCB9IGZyb20gXCIuLi9tb2RlbHMvZmllbGRzL3RleHRhcmVhRmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHtcclxuICBUZXh0TWFza0VudW0sXHJcbiAgVGV4dEZpZWxkLFxyXG4gIFVybFJlZ2V4LFxyXG4gIFRlbFJlZ2V4LFxyXG59IGZyb20gXCIuLi9tb2RlbHMvZmllbGRzL3RleHRGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBGb3JtIH0gZnJvbSBcIi4uL21vZGVscy9mb3JtLm1vZGVsXCI7XHJcbmltcG9ydCB7IFJlY29yZCB9IGZyb20gXCIuLi9tb2RlbHMvcmVjb3JkLm1vZGVsXCI7XHJcbmltcG9ydCB7IEFycmF5VmFsaWRhdG9ycyB9IGZyb20gXCIuL2N1c3RvbS1mb3JtLXZhbGlkYXRvcnMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBFcXBEeW5hbWljTW9kdWxlRGlhbG9nU2VydmljZSB9IGZyb20gXCIuL2VxcC1keW5hbWljLW1vZHVsZS1kaWFsb2cuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTcGlubmVyU2VydmljZSB9IGZyb20gXCIuL3NwaW5uZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXJ2aWNlIH0gZnJvbSBcIi4vZ2xvYmFsLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSW1hZ2VTZWxlY3RvckZpZWxkIH0gZnJvbSBcIi4uL21vZGVscy9maWVsZHMvaW1hZ2VTZWxlY3RvckZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IER5bkF0dGFjaG1lbnQgfSBmcm9tIFwiLi4vbW9kZWxzL2R5bkF0dGFjaG1lbnRcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFV0aWxpdHlIZWxwZXJTZXJ2aWNlIHtcclxuICBwdWJsaWMgc3RhdGljIGNvbnRleHQ6IENvbnRleHQgPSBuZXcgQ29udGV4dCgpO1xyXG5cclxuICBkZWJ1Z01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkZWJ1Z0xvZyhtZXNzYWdlOiBzdHJpbmcsIGl0ZW0/OiBhbnkpe1xyXG4gICAgaWYodGhpcy5kZWJ1Z01vZGUpe1xyXG4gICAgICBpZihpdGVtKXtcclxuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlLCBpdGVtKVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgc3Bpbm5lclNlcnZpY2U6IFNwaW5uZXJTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBwdWJsaWMgc3RhdGljIEV2YWx1YXRlRmllbGRGb3JtdWxhKFxyXG4gICAgZm9ybXVsYTogc3RyaW5nLFxyXG4gICAgcmVjOiBSZWNvcmQsXHJcbiAgICBjdHg6IGFueVxyXG4gICk6IGFueSB7XHJcbiAgICBjb25zdCBldmFsdWF0ZWRWYWx1ZSA9IGV2YWwoZm9ybXVsYSk7XHJcbiAgICByZXR1cm4gZXZhbHVhdGVkVmFsdWUgPyBldmFsdWF0ZWRWYWx1ZSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIFNldENvbnRleHQoY3R4OiBDb250ZXh0KSB7XHJcbiAgICB0aGlzLmNvbnRleHQgPSBjdHg7XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1lcmljKG4pIHtcclxuICAgIHJldHVybiAhaXNOYU4obik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGluaXRTdHlsZXMoc3R5bGVjc3MpIHtcclxuICAgIHJldHVybiBzdHlsZWNzcy5zcGxpdChcIjtcIikucmVkdWNlKChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IGtleXBhciA9IGIuc3BsaXQoXCI6XCIpO1xyXG4gICAgICBpZiAoa2V5cGFyLmxlbmd0aCA+IDEpIGFba2V5cGFyWzBdLnRyaW0oKV0gPSBrZXlwYXJbMV0udHJpbSgpO1xyXG4gICAgICByZXR1cm4gYTtcclxuICAgIH0sIHt9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgR2V0RmllbGRUeXBlKGZpZWxkOiBCYXNlRmllbGQpIHtcclxuICAgIHN3aXRjaCAoZmllbGQuRmllbGRUeXBlKSB7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIGRpIHRlc3RvXCJdOiB7XHJcbiAgICAgICAgY29uc3QgdDogVGV4dEZpZWxkID0gT2JqZWN0LmFzc2lnbihuZXcgVGV4dEZpZWxkKCksIGZpZWxkKTtcclxuICAgICAgICByZXR1cm4gdDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgaW1wb3N0YXJlIGkgdmFsb3JpIGRhIHN1Z2dlcmlyZSBuZWxsJ2F1dG9jb21wbGV0ZSBwZXIgaSBjYW1waSBpbiBjdWkgbCd1dGVudGUgZGV2ZSBzY3JpdmVyZSBjb21hbmRpIGphdmFzY3JpcHQuXHJcbiAgICogSW4gYmFzZSBhbGwndWx0aW1vIGNhcmF0dGVyZSBkaWdpdGF0byB2aWVuZSBpbXBvc3RhdG8gdW4gZWxlbmNvIGRpIG9nZ2V0dGkgbyBwcm9wcmlldMOgIGNoZSBsJ3V0ZW50ZSBoYSBhIGRpc3Bvc2l6aW9uZSBpbiBxdWVsIG1vbWVudG8uXHJcbiAgICogQHBhcmFtIGZpZWxkcyBBcnJheSBkaSBCYXNlRmllbGQgYWdnaXVudGkgYWxsYSBGb3JtXHJcbiAgICogQHBhcmFtIHR5cGVkRm9ybXVsYSBTdHJpbmdhIGRpZ2l0YXRhIGRhbGwndXRlbnRlXHJcbiAgICogQHN1bW1hcnkgSWwgbWV0b2RvIGltcG9zdGEgaSBzdWdnZXJpbWVudGkgYmFzYW5kb3NpIHN1IDMgY2FzaTpcclxuICAgKiAgMSkgbCd1dGVudGUgbm9uIGhhIGRpZ2l0YXRvIG51bGxhIG8gbGEgc3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZSBmaW5pc2NlIGNvbiB1bm8gc3BhemlvIHZ1b3RvXHJcbiAgICogIDIpIGxhIHN0cmluZ2EgZGlnaXRhdGEgZGFsbCd1dGVudGUgZmluaXNjZSBjb24gdW4gXCIuXCJcclxuICAgKiAgMykgbGEgc3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZSBub24gY29pbmNpZGUgY29uIG5lc3N1biBhbHRybyBjYXNvIHNvcHJhIChmaW5pc2NlIGNvbiB1biBjYXJhdHRlcmUgcXVhbHVucXVlKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgR2V0QXV0b2NvbXBsZXRlT3B0aW9ucyhcclxuICAgIGZpZWxkczogQXJyYXk8QmFzZUZpZWxkPixcclxuICAgIHR5cGVkRm9ybXVsYTogc3RyaW5nXHJcbiAgKTogQXJyYXk8eyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+IHtcclxuICAgIGxldCBhdXRvY29tcGxldGVPcHRpb25zOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4gPSBbXTtcclxuXHJcbiAgICAvLyBSZWN1cGVybyBpIG5vbWkgZGkgdHV0dGkgaSBjYW1waSBjcmVhdGkgZmlubyBhZCBvcmEgbmVsbGEgZm9ybS5cclxuICAgIGNvbnN0IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBmaWVsZHMubWFwKChmKSA9PlxyXG4gICAgICBmLkxhYmVsLnNwbGl0KFwiIFwiKS5qb2luKFwiX1wiKVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBOZWwgY2FzaSBpbiBjdWkgbCd1dGVudGUgbm9uIGhhIGluc2VyaXRvIG51bGxhIG9wcHVyZSBsYSBzdHJpbmdhIGZpbmlzY2UgY29uIHVubyBzcGF6aW8gdnVvdG8gbyB1biBzaW1ib2xvIGRpdmVyc28gZGEgXCIuXCJcclxuICAgIC8vICh1biBjYXJhdHRlcmUgbm9uIGFsZmFudW1lcmljbykgaW1wb3N0byBjb21lIHN1Z2dlcmltZW50aSBzb2xvIFwicmVjXCIgZSBcImN0eFwiLCBvdnZlcm8gZ2xpIHVuaWNpIGR1ZSBvZ2dldHRpIGEgY3VpIGwndXRlbnRlIGhhIGFjY2Vzc28uXHJcbiAgICBpZiAoXHJcbiAgICAgICF0eXBlZEZvcm11bGEgfHxcclxuICAgICAgKCF0eXBlZEZvcm11bGEuZW5kc1dpdGgoXCIuXCIpICYmXHJcbiAgICAgICAgbmV3IFJlZ0V4cChcIlteMC05YS16QS1aX11cIikudGVzdChcclxuICAgICAgICAgIHR5cGVkRm9ybXVsYS5zdWJzdHJpbmcodHlwZWRGb3JtdWxhLmxlbmd0aCAtIDEsIHR5cGVkRm9ybXVsYS5sZW5ndGgpXHJcbiAgICAgICAgKSlcclxuICAgICkge1xyXG4gICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gW1xyXG4gICAgICAgIHsgbGFiZWw6IFwicmVjXCIsIHZhbHVlOiAodHlwZWRGb3JtdWxhID8gdHlwZWRGb3JtdWxhIDogXCJcIikgKyBcInJlY1wiIH0sXHJcbiAgICAgICAgeyBsYWJlbDogXCJjdHhcIiwgdmFsdWU6ICh0eXBlZEZvcm11bGEgPyB0eXBlZEZvcm11bGEgOiBcIlwiKSArIFwiY3R4XCIgfSxcclxuICAgICAgXTtcclxuICAgIH1cclxuICAgIC8vIFNlIGxhIHN0cmluZ2EgZmluaXNjZSBjb24gdW4gXCIuXCIgdnVvbCBkaXJlIGNoZSBsJ3V0ZW50ZSBzdGEgY2VyY2FuZG8gZGkgYWNjZWRlcmUgYWQgdW5hIHByb3ByaWV0w6AgZGkgdW4gb2dnZXR0b1xyXG4gICAgLy8gYSBzdWEgZGlzcG9zaXppb25lLiBSZWN1cGVybyBpbCBub21lIGRlbGwndWx0aW1vIG9nZ2V0dG8gZGlnaXRhdG8gZGFsbCd1dGVudGUgZSBzZSBsJ29nZ2V0dG8gc2NlbHRvIMOoIFwicmVjXCIgbyBcImN0eFwiXHJcbiAgICAvLyBhbGxvcmEgc3VnZ2VyaXNjbyBsZSBwcm9wcmlldMOgIGNoZSBlc2lzdG9ubyBhbGwnaW50ZXJubyBkaSBxdWVzdGkgb2dnZXR0aSBhbHRyaW1lbnRpIG5vbiBtb3N0cm8gbnVsbGEuXHJcbiAgICBlbHNlIGlmICh0eXBlZEZvcm11bGEuZW5kc1dpdGgoXCIuXCIpKSB7XHJcbiAgICAgIGNvbnN0IGZvcm11bGFQaWVjZXM6IEFycmF5PHN0cmluZz4gPSB0eXBlZEZvcm11bGFcclxuICAgICAgICAuc3BsaXQoXCIgXCIpXHJcbiAgICAgICAgW3R5cGVkRm9ybXVsYS5zcGxpdChcIiBcIikubGVuZ3RoIC0gMV0uc3BsaXQoXCIuXCIpO1xyXG4gICAgICBpZiAoZm9ybXVsYVBpZWNlc1tmb3JtdWxhUGllY2VzLmxlbmd0aCAtIDJdID09PSBcInJlY1wiKSB7XHJcbiAgICAgICAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXMubWFwKChmKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4geyBsYWJlbDogZiwgdmFsdWU6IHR5cGVkRm9ybXVsYSArIGYgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmIChmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gMl0gPT09IFwiY3R4XCIpIHtcclxuICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gT2JqZWN0LmtleXMoVXRpbGl0eUhlbHBlclNlcnZpY2UuY29udGV4dCkubWFwKFxyXG4gICAgICAgICAgKGYpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6IGYsIHZhbHVlOiB0eXBlZEZvcm11bGEgKyBmIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICBmb3JtdWxhUGllY2VzLmxlbmd0aCA+IDIgJiZcclxuICAgICAgICBmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gM10gPT09IFwiY3R4XCIgJiZcclxuICAgICAgICBmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gMl0gPT09IFwiVXNlclwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBPYmplY3Qua2V5cyhcclxuICAgICAgICAgIFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmNvbnRleHQuVXNlclxyXG4gICAgICAgICkubWFwKChmKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4geyBsYWJlbDogZiwgdmFsdWU6IHR5cGVkRm9ybXVsYSArIGYgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEluIHR1dHRpIGdsaSBhbHRyaSBjYXNpLCBvdnZlcm8gcXVhbmRvIGxhIHN0cmluZ2EgZGlnaXRhdGEgZmluaXNjZSBjb24gdW4gY2FyYXR0ZXJlIGRpdmVyc28gZGEgcXVlbGxpXHJcbiAgICAvLyBjb250cm9sbGF0aSBmaW5vcmEsIHZ1b2wgZGlyZSBjaGUgbCd1dGVudGUgc3RhIGRpZ2l0YW50byBpbCBub21lIGRpIHVuIG9nZ2V0dG8sIHVuYSBwcm9wcmlldMOgIG8gdW5hXHJcbiAgICAvLyBmdW56aW9uZSBqYXZhc2NyaXB0LiBDb250cm9sbG8gbGEgcGFyb2xhIGNoZSBsJ3V0ZW50ZSBzdGEgZGlnaXRhbmRvIGUgc2UgZmEgcGFydGUgZGkgdW5vIGRlZ2xpIG9nZ2V0dGkgYSBkaXNwb3NpemlvbmVcclxuICAgIC8vIG8gdW5hIHByb3ByaWV0w6AgZGkgZXNzaSBhbGxvcmEgc3VnZ2VyaXNjbyBpIHBvc3NpYmlsaSBtYXRjaC5cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zdCBhdmFpbGFibGVPcHRpb25zOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4gPSBbXTtcclxuXHJcbiAgICAgIC8vIFByZW5kbyB0dXR0aSBpIGJsb2NjaGkgZGkgY2FyYXR0ZXJpIGRpZ2l0YXRpIGRhbGwndXRlbnRlXHJcbiAgICAgIGNvbnN0IGFsbEZvcm11bGFXb3JkczogQXJyYXk8c3RyaW5nPiA9IHR5cGVkRm9ybXVsYS5zcGxpdChcIiBcIik7XHJcbiAgICAgIC8vIFByZW5kbyBsJ3VsdGltbyBibG9jY28gZGkgY2FyYXR0ZXJpIGRpZ2l0YXRvIGRhbGwndXRlbnRlXHJcbiAgICAgIGNvbnN0IGxhc3RUeXBlZFN0cmluZzogc3RyaW5nID1cclxuICAgICAgICBhbGxGb3JtdWxhV29yZHNbYWxsRm9ybXVsYVdvcmRzLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgLy8gU2UgbGEgbCd1bHRpbWEgc3RyaW5nYSBkaWdpdGF0YSBub24gY29udGllbmUgY2FyYXR0ZXJpIHNwZWNpYWxpIGFsbG9yYSBzcGxpdHRvIGxhIHN0cmluZ2FcclxuICAgICAgLy8gc3VpIFwiLlwiIGUgaW1wb3N0byBpIHN1Z2dlcmltZW50aSBpbiBiYXNlIGFsIHBhdGggZGVsbGEgcHJvcnBpZXTDoCBjaGUgc2kgc3RhIGRpZ2l0YW5kby5cclxuICAgICAgaWYgKCFuZXcgUmVnRXhwKFwiW14wLTlhLXpBLVpfLl1cIikudGVzdChsYXN0VHlwZWRTdHJpbmcpKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydHlQYXRoID0gbGFzdFR5cGVkU3RyaW5nLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBjb25zdCBsYXN0VHlwZWRXb3JrID0gcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgbGV0IHByb3BlcnRpZXNUb0NoZWNrOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgICAgIGlmIChwcm9wZXJ0eVBhdGgubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gW1wicmVjXCIsIFwiY3R4XCJdO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICBwcm9wZXJ0eVBhdGgubGVuZ3RoID4gMSAmJlxyXG4gICAgICAgICAgcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAyXSA9PT0gXCJjdHhcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcHJvcGVydGllc1RvQ2hlY2sgPSBPYmplY3Qua2V5cyhVdGlsaXR5SGVscGVyU2VydmljZS5jb250ZXh0KTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgcHJvcGVydHlQYXRoLmxlbmd0aCA+IDIgJiZcclxuICAgICAgICAgIHByb3BlcnR5UGF0aFtwcm9wZXJ0eVBhdGgubGVuZ3RoIC0gM10gPT09IFwiY3R4XCIgJiZcclxuICAgICAgICAgIHByb3BlcnR5UGF0aFtwcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMl0gPT09IFwiVXNlclwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjayA9IE9iamVjdC5rZXlzKFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmNvbnRleHQuVXNlcik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgIHByb3BlcnR5UGF0aC5sZW5ndGggPiAxICYmXHJcbiAgICAgICAgICBwcm9wZXJ0eVBhdGhbcHJvcGVydHlQYXRoLmxlbmd0aCAtIDJdID09PSBcInJlY1wiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjayA9IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFc2VndW8gaWwgY29udHJvbGxvIHN1bGxlIHByb3ByaWV0w6AgcmVjdXBlcmF0ZSwgYWdnaXVuZ28gYWkgc3VnZ2VyaW1lbnRpIHR1dHRpIGkgbm9taSBjaGUgaW5pemlhbm8gY29uXHJcbiAgICAgICAgLy8gcXVlbGxvIGNoZSBzdGEgZGlnaXRhbmRvIGwndXRlbnRlLlxyXG4gICAgICAgIHByb3BlcnRpZXNUb0NoZWNrLmZvckVhY2goKHByb3ApID0+IHtcclxuICAgICAgICAgIGlmIChwcm9wLnN0YXJ0c1dpdGgobGFzdFR5cGVkV29yaykpIHtcclxuICAgICAgICAgICAgYXZhaWxhYmxlT3B0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgICBsYWJlbDogcHJvcCxcclxuICAgICAgICAgICAgICB2YWx1ZTpcclxuICAgICAgICAgICAgICAgIHR5cGVkRm9ybXVsYSArXHJcbiAgICAgICAgICAgICAgICBwcm9wLnN1YnN0cmluZyhsYXN0VHlwZWRXb3JrLmxlbmd0aCwgcHJvcC5sZW5ndGgpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IGF2YWlsYWJsZU9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGF1dG9jb21wbGV0ZU9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gaW52b2NhdG8gZGFsbCdodG1sIHBlciBpbXBvc3RhcmUgbGUgY2xhc3NpIGNzcyBwZXIgdmlzdWFsaXp6YXJlIGlsIGNhbXBvIGFsbCdpbnRlcm5vIGRlbGxhIGZvcm0uXHJcbiAgICogU2UgcGVyIGlsIGZpZWxkIHNvbm8gc3RhdGUgc3BlY2lmaWNhdGUgZGVsbGUgY2xhc3NpIGFsbG9yYSB2ZW5nb25vIGFwcGxjYXRlIHF1ZWxsZSwgYWx0cmltZW50aSB2ZW5nb25vIHVzYXRlXHJcbiAgICogZGVsbGUgY2xhc3NpIGRpIGRlZmF1bHQuXHJcbiAgICogQHBhcmFtIGZpZWxkIEJhc2VGaWVsZCBkYSB2aXN1YWxpenphcmUuXHJcbiAgICogQHJldHVybnMgUmVzdGl0dWlzY2UgdW5hIHN0cmluZ2EgY29udGVuZW50ZSBsZSBjbGFzc2kgY3NzIGRhIGFwcGxpY2FyZS5cclxuICAgKi9cclxuICBnZXRGaWVsZFN5bGVDbGFzcyhmaWVsZDogQmFzZUZpZWxkKTogc3RyaW5nIHtcclxuICAgICAgICBcclxuICAgIHZhciBjb2xzcGFudmFsdWVzID0gXCJcIjtcclxuICAgIHZhciB2aXNpYmlsaXR5dmFsdWVzID0gXCJcIjtcclxuICAgIGlmIChmaWVsZC5Db2xTcGFuU2l6ZXMgJiYgZmllbGQuQ29sU3BhblNpemVzLmxlbmd0aCA+IDApe1xyXG4gICAgICBjb2xzcGFudmFsdWVzID0gZmllbGQuQ29sU3BhblNpemVzLm1hcCgoc2l6ZSkgPT5cclxuICAgICAgQ29sU3BhblNpemVzRW51bVtzaXplXS50b1N0cmluZygpKS5qb2luKFwiIFwiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbHNwYW52YWx1ZXMgPSB0aGlzLmdldERlZmF1bHRTdHlsZUNsYXNzKGZpZWxkLCAnYWxpZ24tc2VsZi1lbmQnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZpZWxkLkluTGlzdFZpZXcpe1xyXG4gICAgICBpZiAoZmllbGQuSW52aXNpYmlsaXR5ID09IEZpZWxkSW52aXNpYmlsaXR5RW51bS5OQVNDT1NUTyl7IHZpc2liaWxpdHl2YWx1ZXMgPSBcInZpc2liaWxpdHlfaGlkZGVuXCI7IH1cclxuICAgICAgaWYgKGZpZWxkLkludmlzaWJpbGl0eSA9PSBGaWVsZEludmlzaWJpbGl0eUVudW1bXCJOQVNDT1NUTyBDT04gQVJFQSBWSVNJQklMRVwiXSl7IHZpc2liaWxpdHl2YWx1ZXMgPSBcInZpc2liaWxpdHlfdHJhbnNwYXJlbnRcIjsgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2xzcGFudmFsdWVzICsgXCIgXCIgKyB2aXNpYmlsaXR5dmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGludm9jYXRvIGRhbGwnaHRtbCBwZXIgaW1wb3N0YXJlIGxlIGNsYXNzaSBjc3MgcGVyIHZpc3VhbGl6emFyZSBpbCBjYW1wbyBhbGwnaW50ZXJubyBkZWxsYSBmb3JtLlxyXG4gICAqIFNlIHBlciBpbCBmaWVsZCBzb25vIHN0YXRlIHNwZWNpZmljYXRlIGRlbGxlIGNsYXNzaSBhbGxvcmEgdmVuZ29ubyBhcHBsY2F0ZSBxdWVsbGUsIGFsdHJpbWVudGkgdmVuZ29ubyB1c2F0ZVxyXG4gICAqIGRlbGxlIGNsYXNzaSBkaSBkZWZhdWx0LlxyXG4gICAqIEBwYXJhbSBmaWVsZCBCYXNlRmllbGQgZGEgdmlzdWFsaXp6YXJlLlxyXG4gICAqIEByZXR1cm5zIFJlc3RpdHVpc2NlIHVuYSBzdHJpbmdhIGNvbnRlbmVudGUgbGUgY2xhc3NpIGNzcyBkYSBhcHBsaWNhcmUuXHJcbiAgICovXHJcbiAgZ2V0RmllbGRBbnN3ZXJTdHlsZUNsYXNzKGZpZWxkOiBCYXNlRmllbGQpOiBzdHJpbmcge1xyXG4gICAgICAgIFxyXG4gICAgdmFyIGNvbHNwYW52YWx1ZXMgPSBcIlwiO1xyXG4gICAgdmFyIHZpc2liaWxpdHl2YWx1ZXMgPSBcIlwiO1xyXG5cclxuICAgIGlmIChmaWVsZC5BbnN3ZXJTdHlsZSAmJiBmaWVsZC5BbnN3ZXJTdHlsZS5Db2xTcGFuU2l6ZXMgJiYgZmllbGQuQW5zd2VyU3R5bGUuQ29sU3BhblNpemVzLmxlbmd0aCA+IDApe1xyXG5cclxuICAgICAgY29sc3BhbnZhbHVlcyA9IGZpZWxkLkFuc3dlclN0eWxlLkNvbFNwYW5TaXplcy5tYXAoKHNpemUpID0+XHJcbiAgICAgICAgQ29sU3BhblNpemVzRW51bVtzaXplXS50b1N0cmluZygpXHJcbiAgICAgICkuam9pbihcIiBcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb2xzcGFudmFsdWVzID0gdGhpcy5nZXREZWZhdWx0U3R5bGVDbGFzcyhmaWVsZCwgJ2FsaWduLXNlbGYtc3RhcnQnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZpZWxkLkFuc3dlclN0eWxlLkluTGlzdFZpZXcpe1xyXG4gICAgICBpZiAoZmllbGQuQW5zd2VyU3R5bGUuSW52aXNpYmlsaXR5ID09IEZpZWxkSW52aXNpYmlsaXR5RW51bS5OQVNDT1NUTyl7IHZpc2liaWxpdHl2YWx1ZXMgPSBcInZpc2liaWxpdHlfaGlkZGVuXCI7IH1cclxuICAgICAgaWYgKGZpZWxkLkFuc3dlclN0eWxlLkludmlzaWJpbGl0eSA9PSBGaWVsZEludmlzaWJpbGl0eUVudW1bXCJOQVNDT1NUTyBDT04gQVJFQSBWSVNJQklMRVwiXSl7IHZpc2liaWxpdHl2YWx1ZXMgPSBcInZpc2liaWxpdHlfdHJhbnNwYXJlbnRcIjsgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2xzcGFudmFsdWVzICsgXCIgXCIgKyB2aXNpYmlsaXR5dmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREZWZhdWx0U3R5bGVDbGFzcyhmaWVsZDogQmFzZUZpZWxkLCBkZWZhdWx0QWxpZ246IHN0cmluZyk6IHN0cmluZ3tcclxuICAgIFxyXG4gICAgc3dpdGNoIChmaWVsZC5GaWVsZFR5cGUpIHtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQ2FtcG8gZGkgdGVzdG9cIl06XHJcbiAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdDYW1wbyBkaSB0ZXN0bycpXHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IFwiICsgZGVmYXVsdEFsaWduO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJBcmVhIGRpIHRlc3RvXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnQXJlYSBkaSB0ZXN0bycpXHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTIgXCIgKyBkZWZhdWx0QWxpZ247XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkJvb2xlYW5vXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnQm9vbGVhbm8nKVxyXG4gICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNCBcIiArIGRlZmF1bHRBbGlnbjtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiRGF0YSBlL28gb3JhXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnRGF0YSBlL28gb3JhJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgXCIgKyBkZWZhdWx0QWxpZ247XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIG51bWVyaWNvXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnQ2FtcG8gbnVtZXJpY28nKVxyXG4gICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNCBcIiArIGRlZmF1bHRBbGlnbjtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQWxsZWdhdG9cIl06XHJcbiAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdBbGxlZ2F0bycpXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgKGZpZWxkIGFzIEF0dGFjaG1lbnRGaWVsZCkuSXNNdWx0aUF0dGFjaCB8fFxyXG4gICAgICAgICAgKChmaWVsZCBhcyBBdHRhY2htZW50RmllbGQpLk1ldGFkYXRhRmllbGRzICYmXHJcbiAgICAgICAgICAgIChmaWVsZCBhcyBBdHRhY2htZW50RmllbGQpLk1ldGFkYXRhRmllbGRzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMiBcIiArIGRlZmF1bHRBbGlnbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IFwiICsgZGVmYXVsdEFsaWduO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiSW1tYWdpbmVcIl06XHJcbiAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdJbW1hZ2luZScpXHJcbiAgICAgICAgLypcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAoZmllbGQgYXMgSW1hZ2VGaWVsZCkuQXR0YWNoRGVmaW5pdGlvbi5Jc011bHRpQXR0YWNoIHx8XHJcbiAgICAgICAgICAoKGZpZWxkIGFzIEltYWdlRmllbGQpLkF0dGFjaERlZmluaXRpb24uTWV0YWRhdGFGaWVsZHMgJiZcclxuICAgICAgICAgICAgKGZpZWxkIGFzIEltYWdlRmllbGQpLkF0dGFjaERlZmluaXRpb24uTWV0YWRhdGFGaWVsZHMubGVuZ3RoID4gMClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtMTIgY29sLWxnLTEyIFwiICsgZGVmYXVsdEFsaWduO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgXCIgKyBkZWZhdWx0QWxpZ247XHJcbiAgICAgICAgfSovXHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkVsZW5jbyBnZW5lcmljb1wiXTpcclxuICAgICAgICAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coJ0VsZW5jbyBnZW5lcmljbycpXHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IFwiICsgZGVmYXVsdEFsaWduO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJMb29rdXBcIl06XHJcbiAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdMb29rdXAnKVxyXG4gICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNCBcIiArIGRlZmF1bHRBbGlnbjtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiRm9ybSBkaSBkZXR0YWdsaW9cIl06XHJcbiAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdGb3JtIGRpIGRldHRhZ2xpbycpXHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTIgXCIgKyBkZWZhdWx0QWxpZ247XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkVsZW5jbyBpbW1hZ2luaVwiXTpcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgXCIgKyBkZWZhdWx0QWxpZ247XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkV0aWNoZXR0YVwiXTpcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgXCIgKyBkZWZhdWx0QWxpZ247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGNyZWFyZSBpbCBGb3JtR3JvdXAgY2hlIHJhcHByZXNlbnRhIHVuYSBGb3JtIGEgcGFydGlyZSBkYWkgc3VvaSBCYXNlRmllbGQuXHJcbiAgICogQHBhcmFtIGZvcm1GaWVsZHMgTGlzdGEgZGVpIEJhc2VGaWVsZCBjaGUgY29tcG9uZ29ubyBsYSBmb3JtLlxyXG4gICAqIEBwYXJhbSByZWNvcmQgT2dnZXR0byBkaSB0aXBvIFJlY29yZCBjaGUgY29udGllbmUgaSB2YWxvcmkgZGVpIGNhbXBpLlxyXG4gICAqIEBwYXJhbSBvbmx5VmlldyBTZSBUUlVFIGRpc2FiaWxpdGEgbGEgZm9ybSBwZXIgcmVuZGVybGEgaW4gc29sYSBsZXR0dXJhLlxyXG4gICAqIEBwYXJhbSBpbmNsdWRlQ3VycmVudEZvcm1JbkZpZWxkIFNlIFRSVUUgcG9wb2xhIGxhIHByb3ByaWV0w6AgRm9ybUZvcm1Hcm91cCBhbGwnaW50ZXJubyBkaSBvZ25pIEJhc2VGaWVsZCBjb24gaWwgRm9ybUdyb3VwIGNvcnJlbnRlLlxyXG4gICAqIEByZXR1cm5zIFJlc3RpdHVpc2NlIHVuIEZvcm1Hcm91cCByYXBwcmVzZW50YXRlIGxhIEZvcm0gYSBjdWkgYXBwYXJ0ZW5nb25vIGkgQmFzZUZpZWxkIHJpY2V2dXRpIGluIGlucHV0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBDcmVhdGVGb3JtRm9ybUdyb3VwKFxyXG4gICAgZm9ybUZpZWxkczogQXJyYXk8QmFzZUZpZWxkPixcclxuICAgIHJlY29yZDogUmVjb3JkLFxyXG4gICAgb25seVZpZXcgPSBmYWxzZSxcclxuICAgIGluY2x1ZGVDdXJyZW50Rm9ybUluRmllbGQgPSB0cnVlXHJcbiAgKTogVW50eXBlZEZvcm1Hcm91cCB7XHJcbiAgICAvLyAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJmb3JtRmllbGRzXCIsIGZvcm1GaWVsZHMpO1xyXG4gICAgLy8gLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwicmVjb3JkXCIsIHJlY29yZCk7XHJcbiAgICAvLyAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJvbmx5Vmlld1wiLCBvbmx5Vmlldyk7XHJcbiAgICAvLyAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJpbmNsdWRlQ3VycmVudEZvcm1JbkZpZWxkXCIsIGluY2x1ZGVDdXJyZW50Rm9ybUluRmllbGQpO1xyXG5cclxuICAgIGNvbnN0IGZvcm1Gb3JtOiBVbnR5cGVkRm9ybUdyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChbXSk7XHJcblxyXG4gICAgZm9ybUZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgLy8gICAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coZmllbGQpO1xyXG4gICAgICBmb3JtRm9ybS5hZGRDb250cm9sKFxyXG4gICAgICAgIGZpZWxkLk5hbWUsXHJcbiAgICAgICAgdGhpcy5jcmVhdGVGaWVsZEZvcm1Db250cm9sKGZpZWxkLCByZWNvcmQpXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChpbmNsdWRlQ3VycmVudEZvcm1JbkZpZWxkKSB7XHJcbiAgICAgICAgLy8gLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKGZpZWxkKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgIGZpZWxkLkZvcm1Gb3JtR3JvdXAgPSBmb3JtRm9ybTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAob25seVZpZXcpIHtcclxuICAgICAgZm9ybUZvcm0uZGlzYWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JtRm9ybTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bnppb25lIHBlciBjcmVhcmUgZSBhZ2dpdW5nZXJlIGFsIEZvcm1Hcm91cCByYXBwcmVzZW50YW50ZSBsYSBmb3JtIHVuIG51b3ZvIEZvcm1Db250cm9sIGEgcGFydGlyZSBkYSB1biBGaWVsZC5cclxuICAgKiBJbiBudW92byBGb3JtQ29udHJvbCBhdnLDoCBpbCBub21lIGRlbCBjYW1wbyBwYXNzYXRvIGUgdmVycmFubm8gaW1wb3N0YXRpIGkgVmFsaWRhdG9ycyBpbiBiYXNlIGFsIHRpcG8gZGVsIGNhbXBvIHN0ZXNzby5cclxuICAgKiBAcGFyYW0gZmllbGQgQmFzZUZpZWxkIHBlciBjdWkgY3JlYXJlIGlsIEZvcm1Db250cm9sIGRhIGluc2VyaXJlIG5lbCBGb3JtR3JvdXAgZGVsYSBmb3JtLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlRmllbGRGb3JtQ29udHJvbChcclxuICAgIGZpZWxkOiBCYXNlRmllbGQsXHJcbiAgICByZWNvcmQ6IFJlY29yZFxyXG4gICk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICBjb25zdCB2YWxpZGF0b3JzOiBBcnJheTxWYWxpZGF0b3JGbj4gPSBbXTtcclxuXHJcbiAgICBpZiAoZmllbGQuUmVxdWlyZWQpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICBzd2l0Y2ggKGZpZWxkLkZpZWxkVHlwZSkge1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJDYW1wbyBkaSB0ZXN0b1wiXTpcclxuICAgICAgICBpZiAoKGZpZWxkIGFzIFRleHRGaWVsZCkuTWF4TGVuZ2h0KSB7XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoKGZpZWxkIGFzIFRleHRGaWVsZCkuTWF4TGVuZ2h0KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoZmllbGQgYXMgVGV4dEZpZWxkKS5NaW5MZW5naHQpIHtcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCgoZmllbGQgYXMgVGV4dEZpZWxkKS5NaW5MZW5naHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoICgoZmllbGQgYXMgVGV4dEZpZWxkKS5UZXh0TWFzaykge1xyXG4gICAgICAgICAgY2FzZSBUZXh0TWFza0VudW0uVXJsOlxyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKFVybFJlZ2V4KSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBUZXh0TWFza0VudW0uRW1haWw6XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFRleHRNYXNrRW51bS5UZWxlZm9ubzpcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybihUZWxSZWdleCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkFyZWEgZGkgdGVzdG9cIl06XHJcbiAgICAgICAgaWYgKChmaWVsZCBhcyBUZXh0YXJlYUZpZWxkKS5NYXhMZW5naHQpIHtcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChcclxuICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoKGZpZWxkIGFzIFRleHRhcmVhRmllbGQpLk1heExlbmdodClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoZmllbGQgYXMgVGV4dGFyZWFGaWVsZCkuTWluTGVuZ2h0KSB7XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goXHJcbiAgICAgICAgICAgIFZhbGlkYXRvcnMubWluTGVuZ3RoKChmaWVsZCBhcyBUZXh0YXJlYUZpZWxkKS5NaW5MZW5naHQpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtLkFsbGVnYXRvOlxyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW0uSW1tYWdpbmU6XHJcbiAgICAgICAgaWYgKGZpZWxkLlJlcXVpcmVkKSB2YWxpZGF0b3JzLnB1c2goQXJyYXlWYWxpZGF0b3JzLm1pbkxlbmdodCgxKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkVsZW5jbyBnZW5lcmljb1wiXTpcclxuICAgICAgICBpZiAoKGZpZWxkIGFzIExpc3RWYWx1ZUZpZWxkKS5Jc011bHRpQ2hvaWNoZSlcclxuICAgICAgICAgIGlmIChmaWVsZC5SZXF1aXJlZCkgdmFsaWRhdG9ycy5wdXNoKEFycmF5VmFsaWRhdG9ycy5taW5MZW5naHQoMSkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJFbGVuY28gaW1tYWdpbmlcIl06XHJcbiAgICAgICAgaWYgKChmaWVsZCBhcyBJbWFnZVNlbGVjdG9yRmllbGQpLklzTXVsdGlDaG9pY2hlKVxyXG4gICAgICAgICAgaWYgKGZpZWxkLlJlcXVpcmVkKSB2YWxpZGF0b3JzLnB1c2goQXJyYXlWYWxpZGF0b3JzLm1pbkxlbmdodCgxKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wocmVjb3JkW2ZpZWxkLk5hbWVdLCB2YWxpZGF0b3JzKTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGNvbmZpZ3VyYXJlIGdsaSBlbmRwb2ludCBkYSB1c2FyZSBkaSBkZWZhdWx0IGEgcGFydGlyZSBkYWxsJ3VybCBiYXNlIGRlbCBzZXJ2ZXJcclxuICAgKiBhIGN1aSBzaSBkZXZlIGNvbm5ldHRlcmUgZSBhbCB0b2tlbiBkYSBwYXNzYXJlIHBlciBhdXRlbnRpY2Fyc2kuXHJcbiAgICogQHBhcmFtIGJhc2VTZXJ2ZXJVcmwgU3RyaW5nYSBkZWxsJ3VybCBiYXNlIGRlbCBzZXJ2ZXIgKGVzOiBcImh0dHA6Ly9sb2NhbGhvc3Q6NTAwMFwiKS5cclxuICAgKiBAcGFyYW0gdXNlclRva2VuIFRva2VuIGRlbGwndXRlbnRlIGxvZ2dhdG8gZGEgdXNhcmUgcGVyIGF1dGVudGljYXJzaSBzZSBuZWNlc3NhcmlvLlxyXG4gICAqIEByZXR1cm5zIFJlc2l0dWlzY2UgbGEgY29uZmlndXJhemlvbmUgY29tcGxldGEgZGVnbGkgZW5kUG9pbnQgZGEgdXNhcmUgZGkgZGVmYXVsdC5cclxuICAgKi9cclxuICBwdWJsaWMgQ29uZmlndXJlRGVmYXVsdEVuZFBvaW50cyhcclxuICAgIGJhc2VTZXJ2ZXJVcmw6IHN0cmluZyxcclxuICAgIHVzZXJUb2tlbjogc3RyaW5nXHJcbiAgKTogRW5kUG9pbnRDb25maWd1cmF0aW9uIHtcclxuICAgIGxldCBlbmRQb2ludENvbmZpZ3VyYXRpb246IEVuZFBvaW50Q29uZmlndXJhdGlvbiA9XHJcbiAgICAgIG5ldyBFbmRQb2ludENvbmZpZ3VyYXRpb24oYmFzZVNlcnZlclVybCwgdXNlclRva2VuKTtcclxuXHJcbiAgICAvLyBlbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3JkcyA9IHtcclxuICAgIC8vICAgR2V0QnlGb3JtSURFbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS92MS9nZXRhbGxcIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgR2V0QWxsQnlFbnRBbmRVc2VySURFbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS92MS9HZXRBbGxCeVVzZXJJRFwiLFxyXG4gICAgLy8gICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAvLyAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uR0VULFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBHZXRCeUlERW5kUG9pbnQ6IHtcclxuICAgIC8vICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvZ2V0QnlJRFwiLFxyXG4gICAgLy8gICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAvLyAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uR0VULFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBTYXZlRW5kUG9pbnQ6IHtcclxuICAgIC8vICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvc2F2ZVwiLFxyXG4gICAgLy8gICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAvLyAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uUE9TVCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgRHVwbGljYXRlRW5kUG9pbnQ6IHtcclxuICAgIC8vICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvZHVwbGljYXRlXCIsXHJcbiAgICAvLyAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgIC8vICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5HRVQsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIERlbGV0ZUVuZFBvaW50OiB7XHJcbiAgICAvLyAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL3YxL2RlbGV0ZVwiLFxyXG4gICAgLy8gICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAvLyAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uREVMRVRFLFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gfTtcclxuICAgIC8vIGVuZFBvaW50Q29uZmlndXJhdGlvbi5Gb3JtcyA9IHtcclxuICAgIC8vICAgR2V0QnlJREVuZFBvaW50OiB7XHJcbiAgICAvLyAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL2NvbmYvZm9ybVwiLFxyXG4gICAgLy8gICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAvLyAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uR0VULFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBHZXRCeUlEQW5kVmVyc2lvbkVuZFBvaW50OiB7XHJcbiAgICAvLyAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL2NvbmYvR2V0QnlJREFuZFZlcnNpb25cIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgU2F2ZUVuZFBvaW50OiB7XHJcbiAgICAvLyAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL2NvbmYvZm9ybVwiLFxyXG4gICAgLy8gICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAvLyAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uUE9TVCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vIH07XHJcbiAgICByZXR1cm4gZW5kUG9pbnRDb25maWd1cmF0aW9uO1xyXG4gIH1cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSBleHByZXNzaW9uIHByZW5kZSB1bmEgc3RyaW5nYSBpbiBpbnB1dCBlIHZlcmlmaWNhIGNoZSBvZ25pIHBhcmVudGVzaSBhcGVydGEgdmVuZ2EgYW5jaGUgY2hpdXNhXHJcbiAgICogQHJldHVybnMgdHJ1ZSBzZSBsZSBwYXJlbnRlc2kgc29ubyBwYXJpIGUgb2duaSBwYXJlbnRlc2kgY2hpdWRlIHNlIHN0ZXNzYSwgZmFsc2Ugc2UgbWFuY2FubyBwYXJlbnRlc2kgbyBub24gdmVuZ29ubyBjaGl1c2VcclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIHN0cmluZ0NoZWNrUGFyZW50ZXNpcyhleHByZXNzaW9uLCByZXF1aXJlZCA9IGZhbHNlKSB7XHJcbiAgICBpZiAoZXhwcmVzc2lvbiA9PSB1bmRlZmluZWQgfHwgZXhwcmVzc2lvbiA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiByZXF1aXJlZCA/IGZhbHNlIDogdHJ1ZTtcclxuICAgIH1cclxuICAgIGxldCBzdGFjayA9IFtdO1xyXG4gICAgbGV0IGN1cnJlbnQ7XHJcbiAgICBjb25zdCBtYXRjaExvb2t1cCA9IHtcclxuICAgICAgXCIoXCI6IFwiKVwiLFxyXG4gICAgICBcIltcIjogXCJdXCIsXHJcbiAgICAgIFwie1wiOiBcIn1cIixcclxuICAgIH07XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHByZXNzaW9uLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGN1cnJlbnQgPSBleHByZXNzaW9uW2ldOyAvL2Vhc2llciB0aGFuIHdyaXRpbmcgaXQgb3ZlciBhbmQgb3ZlclxyXG5cclxuICAgICAgaWYgKGN1cnJlbnQgPT09IFwiKFwiIHx8IGN1cnJlbnQgPT09IFwiW1wiIHx8IGN1cnJlbnQgPT09IFwie1wiKSB7XHJcbiAgICAgICAgc3RhY2sucHVzaChjdXJyZW50KTtcclxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50ID09PSBcIilcIiB8fCBjdXJyZW50ID09PSBcIl1cIiB8fCBjdXJyZW50ID09PSBcIn1cIikge1xyXG4gICAgICAgIGNvbnN0IGxhc3RCcmFja2V0ID0gc3RhY2sucG9wKCk7XHJcblxyXG4gICAgICAgIGlmIChtYXRjaExvb2t1cFtsYXN0QnJhY2tldF0gIT09IGN1cnJlbnQpIHtcclxuICAgICAgICAgIC8vaWYgdGhlIHN0YWNrIGlzIGVtcHR5LCAucG9wKCkgcmV0dXJucyB1bmRlZmluZWQsIHNvIHRoaXMgZXhwcmVzc2lvbiBpcyBzdGlsbCBjb3JyZWN0XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlOyAvL3Rlcm1pbmF0ZSBpbW1lZGlhdGVseSAtIG5vIG5lZWQgdG8gY29udGludWUgc2Nhbm5pbmcgdGhlIHN0cmluZ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdGFjay5sZW5ndGggPT09IDA7IC8vYW55IGVsZW1lbnRzIG1lYW4gYnJhY2tldHMgbGVmdCBvcGVuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gY2hlIGRhdGEgbGEgY29uZmlndXJhemlvbmUgZGkgdW4gZW5kcG9pbnQgY29zdHJ1aXNjZSBsJ3VybCBkYSBjaGlhbWFyZSwgZ2xpIGV2ZW50dWFsaSBwYXJhbWV0cmlcclxuICAgKiBkYSBwYXNzYXJlIChuZWwgYm9keSBvIG5lbGxhIHJvdHRhKSBlZCBlZmZldHR1YSBsYSBjaGlhbWF0YS4gQWwgdGVybWluZSBkZWxsYSBjaGlhbWF0YSBlc2VndWUgbGUgZXZlbnR1YWxpXHJcbiAgICogZnVuemlvbmkgZGkgY2FsbGJhY2sgKHNpYSBpbiBjYXNvIGRpIHN1Y2Nlc3NvIGNoZSBpbiBjYXNvIGRpIGVycm9yZSkgcGFzc2F0ZSBpbiBpbnB1dC5cclxuICAgKiBAcGFyYW0gZW5kUG9pbnREYXRhIENvZmlndXJhemlvbmUgZGVsbCdlbmRwb2ludCBkYSBjaGlhbWFyZS5cclxuICAgKiBAcGFyYW0gZHluYW1pY01vZHVsZVBhcmFtcyBBcnJheSBkZWkgcGFyYW1ldHJpIGFnZ2l1bnRpIGRhbCBtb2R1bG8gZGluYW1pY28gYSBxdWVsbGkgZ2nDoCBjb25maWd1cmF0aVxyXG4gICAqIChhZCBlc2VtcGlvIGlsIHJlY29yZCBvIGxhIGZvcm0gZGEgc2FsdmFyZSBvcHB1cmUgbCdJRCBwZXIgcmVjdXBlcmFyZSB1bmEgcGFydGljb2xhcmUgZW50aXTDoCkuXHJcbiAgICogQHBhcmFtIGNhbGxiYWNrIE1ldG9kbyBkYSBlc2VndWlyZSBpbiBjYXNvIGRpIHN1Y2Nlc3NvIGRvcG8gbGEgY2hpYW1hdGEgaHR0cC5cclxuICAgKiBOT1RBOiBpbiBpbnB1dCB2aWVuZSBwYXNzYXRhIGxhIHJpc3Bvc3RhIGRlbGxhIGNoaWFtYXRhIHN0ZXNzYS5cclxuICAgKiBAcGFyYW0gZXJyb3JDYWxsQmFjayBNZXRvZG8gZGEgZXNlZ3VpcmUgaW4gY2FzbyBkaSBlcnJvcmUgZG9wbyBsYSBjaGlhbWF0YSBodHRwLlxyXG4gICAqIE5PVEE6IGluIGlucHV0IHZpZW5lIHBhc3NhdG8gbCdlcnJvcmUgZ2VuZXJhdG8gZGVsbGEgY2hpYW1hdGEgc3Rlc3NhLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBSdW5FbmRQb2ludENhbGwoXHJcbiAgICBlbmRQb2ludERhdGE6IEVuZFBvaW50RGF0YSxcclxuICAgIGR5bmFtaWNNb2R1bGVQYXJhbXM6IEFycmF5PEVuZFBvaW50RGF0YVBhcmFtcz4gPSBudWxsLFxyXG4gICAgY2FsbGJhY2s6IChlOiBGb3JtIHwgQXJyYXk8Rm9ybT4gfCBSZWNvcmQgfCBBcnJheTxSZWNvcmQ+IHwgRHluQXR0YWNobWVudCB8IEFycmF5PER5bkF0dGFjaG1lbnQ+KSA9PiB2b2lkID0gbnVsbCxcclxuICAgIGVycm9yQ2FsbEJhY2s6IChlcnI6IHVua25vd24pID0+IHZvaWQgPSBudWxsXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmFkZFJlcXVlc3RDb3VudGVyKCk7XHJcblxyXG4gICAgbGV0IHVybCA9IGAke2VuZFBvaW50RGF0YS5Vcmx9YDtcclxuICAgIGxldCBxdWVyeVBhcmFtczogc3RyaW5nID0gbnVsbDtcclxuICAgIGNvbnN0IGJvZHlQYXJhbXMgPSB7XHJcbiAgICAgIEFkZGl0aW9uYWxQYXJhbXM6IHt9LFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyNyZWdpb24gbWVyZ2VQYXJhbVxyXG4gICAgLy8gdW5pc2NvIGkgZGF0aSBkaSBkZWZhdWx0IGRlZmluaXRpIG5lbGxhIGNvbmZpZ3VyYXppb25lIGRlbGxhIGNoaWFtYXRhIGNvbiBpIGRhdGkgY2hlIGltcG9zdG8gbmVsbGEgY2hpYW1hdGEgc3BlY2lmaWNhXHJcbiAgICBpZiAoZW5kUG9pbnREYXRhLlBhcmFtcyA9PSB1bmRlZmluZWQgfHwgZW5kUG9pbnREYXRhLlBhcmFtcyA9PSBudWxsKSB7XHJcbiAgICAgIGVuZFBvaW50RGF0YS5QYXJhbXMgPSBbXTtcclxuICAgIH1cclxuICAgIGlmIChkeW5hbWljTW9kdWxlUGFyYW1zID09IHVuZGVmaW5lZCB8fCBkeW5hbWljTW9kdWxlUGFyYW1zID09IG51bGwpIHtcclxuICAgICAgZHluYW1pY01vZHVsZVBhcmFtcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1lcmdlZFBhcmFtczogQXJyYXk8RW5kUG9pbnREYXRhUGFyYW1zPiA9IFsuLi5lbmRQb2ludERhdGEuUGFyYW1zXTtcclxuXHJcbiAgICBkeW5hbWljTW9kdWxlUGFyYW1zLmZvckVhY2goKG9iaikgPT4ge1xyXG4gICAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gbWVyZ2VkUGFyYW1zLmZpbmRJbmRleChcclxuICAgICAgICAoaXRlbSkgPT4gaXRlbS5QYXJhbU5hbWUgPT09IG9iai5QYXJhbU5hbWVcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIG1lcmdlZFBhcmFtc1tleGlzdGluZ0luZGV4XS5QYXJhbVZhbHVlID0gb2JqLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgbWVyZ2VkUGFyYW1zW2V4aXN0aW5nSW5kZXhdLlBhcmFtVHlwZSA9IG9iai5QYXJhbVR5cGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbWVyZ2VkUGFyYW1zLnB1c2gob2JqKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKG1lcmdlZFBhcmFtcykge1xyXG4gICAgICBtZXJnZWRQYXJhbXMuZm9yRWFjaCgocGFyYW0pID0+IHtcclxuICAgICAgICBzd2l0Y2ggKHBhcmFtLlBhcmFtVHlwZSkge1xyXG4gICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl06IHtcclxuICAgICAgICAgICAgY29uc3Qgc3RyaW5nUGFyYW06IHN0cmluZyA9XHJcbiAgICAgICAgICAgICAgcGFyYW0uUGFyYW1OYW1lICsgXCI9XCIgKyBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgICAgICAgICBxdWVyeVBhcmFtcyA9XHJcbiAgICAgICAgICAgICAgKHF1ZXJ5UGFyYW1zID09IG51bGwgPyBcIlwiIDogcXVlcnlQYXJhbXMgKyBcIiZcIikgKyBzdHJpbmdQYXJhbTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bXCJJbiByb3V0ZVwiXToge1xyXG4gICAgICAgICAgICB1cmwgPSB1cmwgKyAodXJsLmVuZHNXaXRoKFwiL1wiKSA/IFwiXCIgOiBcIi9cIikgKyBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVtcIkluIEJvZHlcIl06IHtcclxuICAgICAgICAgICAgYm9keVBhcmFtc1twYXJhbS5QYXJhbU5hbWVdID0gcGFyYW0uUGFyYW1WYWx1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvbiBtZXJnZVBhcmFtXHJcblxyXG4gICAgLy8jcmVnaW9uIGFkZERlZmF1bHRQYXJhbXNcclxuICAgIC8vIFNlIG5lbGxhIGNvbmZpZ3VyYXppb25lIHNvbm8gc3RhdGkgZGVmaW5pdGkgcGFyYW1ldHJpIGRhIGFnZ2l1bmdlcmUgYWxsYSBjaGlhbWF0YSBxdWVzdGkgdmVuZ29ubyBjaWNsYXRpXHJcbiAgICAvLyBlIGFnZ2l1bnRpIG5lbCBwdW50byBpbiBjdWkgZGV2b25vIGVzc2VyZSB1c2F0aS5cclxuICAgIC8vIGlmIChlbmRQb2ludERhdGEuUGFyYW1zKSB7XHJcbiAgICAvLyAgICAgZW5kUG9pbnREYXRhLlBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcclxuICAgIC8vICAgICAgICAgc3dpdGNoIChwYXJhbS5QYXJhbVR5cGUpIHtcclxuICAgIC8vICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnUXVlcnkgcGFyYW0nXToge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ1BhcmFtOiBzdHJpbmcgPSBwYXJhbS5QYXJhbU5hbWUgKyBcIj1cIiArIHBhcmFtLlBhcmFtVmFsdWU7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMgPSAocXVlcnlQYXJhbXMgPT0gbnVsbCA/IFwiXCIgOiBxdWVyeVBhcmFtcyArIFwiJlwiKSArIHN0cmluZ1BhcmFtO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydJbiByb3V0ZSddOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgKHVybC5lbmRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCIpICsgcGFyYW0uUGFyYW1WYWx1ZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnSW4gQm9keSddOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYm9keVBhcmFtcy5BZGRpdGlvbmFsUGFyYW1zW3BhcmFtLlBhcmFtTmFtZV0gPSBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyB9XHJcbiAgICAvLyNlbmRyZWdpb24gYWRkRGVmYXVsdFBhcmFtc1xyXG5cclxuICAgIC8vI3JlZ2lvbiBhZGRTcGVjaWZpY1BhcmFtc1xyXG4gICAgLy8gU2Ugc29ubyBzdGF0aSBwYXNzYXRpIHBhcmFtZXRyaSBkYSBhZ2dpdW5nZXJlIGFsbGEgY2hpYW1hdGEgZGVmaW5pdGkgYWxsJ2ludGVybm8gZGVsIG1vZHVsbyBkaW5hbWljb1xyXG4gICAgLy8gdmVuZ29ubyBjaWNsYXRpIGUgYWdnaXVudGkgbmVsIHB1bnRvIGluIGN1aSBkZXZvbm8gZXNzZXJlIHVzYXRpIGRvcG8gcXVlbGxpIGRlZmluaXRpIG5lbGxhIGNvbmZpZ3VyYXppb25lLlxyXG4gICAgLy8gaWYgKGR5bmFtaWNNb2R1bGVQYXJhbXMpIHtcclxuICAgIC8vICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xyXG4gICAgLy8gICAgICAgICBzd2l0Y2ggKHBhcmFtLlBhcmFtVHlwZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydRdWVyeSBwYXJhbSddOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nUGFyYW06IHN0cmluZyA9IHBhcmFtLlBhcmFtTmFtZSArIFwiPVwiICsgcGFyYW0uUGFyYW1WYWx1ZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcyA9IChxdWVyeVBhcmFtcyA9PSBudWxsID8gXCJcIiA6IHF1ZXJ5UGFyYW1zICsgXCImXCIpICsgc3RyaW5nUGFyYW07XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ0luIHJvdXRlJ106IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAodXJsLmVuZHNXaXRoKFwiL1wiKSA/IFwiXCIgOiBcIi9cIikgKyBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydJbiBCb2R5J106IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBib2R5UGFyYW1zW3BhcmFtLlBhcmFtTmFtZV0gPSBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfSlcclxuICAgIC8vIH1cclxuICAgIC8vI2VuZHJlZ2lvbiBhZGRTcGVjaWZpY1BhcmFtc1xyXG5cclxuICAgIGlmIChxdWVyeVBhcmFtcyAhPSBudWxsKSB7XHJcbiAgICAgIHVybCA9XHJcbiAgICAgICAgKHVybC5lbmRzV2l0aChcIi9cIikgPyB1cmwuc3Vic3RyaW5nKDAsIHVybC5sZW5ndGggLSAxKSA6IHVybCkgK1xyXG4gICAgICAgIFwiP1wiICtcclxuICAgICAgICBxdWVyeVBhcmFtcztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmh0dHBcclxuICAgICAgLnJlcXVlc3QoZW5kUG9pbnREYXRhLlJlcXVlc3RNZXRob2QsIHVybCwge1xyXG4gICAgICAgIGhlYWRlcnM6IGVuZFBvaW50RGF0YS5Ub2tlblxyXG4gICAgICAgICAgPyB7IEF1dGhvcml6YXRpb246IGVuZFBvaW50RGF0YS5Ub2tlbiB9XHJcbiAgICAgICAgICA6IG51bGwsXHJcbiAgICAgICAgYm9keTogIVtSZXF1ZXN0TWV0aG9kRW51bS5ERUxFVEUsIFJlcXVlc3RNZXRob2RFbnVtLkdFVF0uaW5jbHVkZXMoXHJcbiAgICAgICAgICBlbmRQb2ludERhdGEuUmVxdWVzdE1ldGhvZFxyXG4gICAgICAgIClcclxuICAgICAgICAgID8gYm9keVBhcmFtc1xyXG4gICAgICAgICAgOiBudWxsLFxyXG4gICAgICB9KVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZXM6IEZvcm0gfCBSZWNvcmQgfCBBcnJheTxSZWNvcmQ+KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnJlbW92ZVJlcXVlc3RDb3VudGVyKCk7XHJcbiAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgY2FsbGJhY2socmVzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5yZW1vdmVSZXF1ZXN0Q291bnRlcigpO1xyXG4gICAgICAgICAgaWYgKGVycm9yQ2FsbEJhY2spIHtcclxuICAgICAgICAgICAgZXJyb3JDYWxsQmFjayhlcnJvcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBFcXBEeW5hbWljTW9kdWxlRGlhbG9nU2VydmljZS5FcnJvcihlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIlJ1bkVuZFBvaW50Q2FsbCAtIHN1YnNjcmliZSAtIGVuZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gIH1cclxufVxyXG4iXX0=
583
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0eUhlbHBlci5zZXJ2aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBR0wsa0JBQWtCLEVBR2xCLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGFBQWEsR0FDZCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRCxPQUFPLEVBQ0wscUJBQXFCLEVBR3JCLGFBQWEsRUFDYixpQkFBaUIsR0FDbEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUsvQyxPQUFPLEVBQ0wsWUFBWSxFQUNaLFNBQVMsRUFDVCxRQUFRLEVBQ1IsUUFBUSxHQUNULE1BQU0sa0NBQWtDLENBQUM7QUFHMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7OztBQVNwRixNQUFNLE9BQU8sb0JBQW9CO0lBSS9CLFFBQVEsQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUNsQyxJQUFHLElBQUksQ0FBQyxTQUFTLEVBQUM7WUFDaEIsSUFBRyxJQUFJLEVBQUM7Z0JBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7YUFDM0I7aUJBQUk7Z0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTthQUNyQjtTQUNGO0lBQ0gsQ0FBQztJQUVELFlBQ1UsV0FBK0IsRUFDL0IsSUFBZ0IsRUFDaEIsY0FBOEI7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QUFhLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRTtnQkFDdkMsQ0FBQyxDQUFDLElBQUk7WUFDUixJQUFJLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQy9ELFlBQVksQ0FBQyxhQUFhLENBQzNCO2dCQUNDLENBQUMsQ0FBQyxVQUFVO2dCQUNaLENBQUMsQ0FBQyxJQUFJO1NBQ1QsQ0FBQzthQUNELFNBQVMsQ0FDUixDQUFDLEdBQWtDLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDM0MsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2Y7UUFDSCxDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMzQyxJQUFJLGFBQWEsRUFBRTtnQkFDakIsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RCO1lBQ0QsNkJBQTZCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQiw4REFBOEQ7UUFDaEUsQ0FBQyxDQUNGLENBQUM7SUFFTixDQUFDOztBQWpwQmEsNEJBQU8sR0FBWSxJQUFJLE9BQU8sRUFBRSxDQUFDO2tIQURwQyxvQkFBb0I7c0hBQXBCLG9CQUFvQixjQUZuQixNQUFNOzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgVW50eXBlZEZvcm1Db250cm9sLFxyXG4gIFVudHlwZWRGb3JtR3JvdXAsXHJcbiAgVmFsaWRhdG9yRm4sXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtcclxuICBCYXNlRmllbGQsXHJcbiAgQ29sU3BhblNpemVzRW51bSxcclxuICBGaWVsZEludmlzaWJpbGl0eUVudW0sXHJcbiAgRmllbGRUeXBlRW51bSxcclxufSBmcm9tIFwiLi4vbW9kZWxzL2Jhc2VGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4uL21vZGVscy9jb250ZXh0Lm1vZGVsXCI7XHJcbmltcG9ydCB7XHJcbiAgRW5kUG9pbnRDb25maWd1cmF0aW9uLFxyXG4gIEVuZFBvaW50RGF0YSxcclxuICBFbmRQb2ludERhdGFQYXJhbXMsXHJcbiAgUGFyYW1UeXBlRW51bSxcclxuICBSZXF1ZXN0TWV0aG9kRW51bSxcclxufSBmcm9tIFwiLi4vbW9kZWxzL2VuZFBvaW50Q29uZmlndXJhdGlvbi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50RmllbGQgfSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy9hdHRhY2htZW50RmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgSW1hZ2VGaWVsZCB9IGZyb20gXCIuLi9tb2RlbHMvZmllbGRzL2ltYWdlRmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgTGlzdFZhbHVlRmllbGQgfSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy9saXN0VmFsdWVGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBUZXh0YXJlYUZpZWxkIH0gZnJvbSBcIi4uL21vZGVscy9maWVsZHMvdGV4dGFyZWFGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQge1xyXG4gIFRleHRNYXNrRW51bSxcclxuICBUZXh0RmllbGQsXHJcbiAgVXJsUmVnZXgsXHJcbiAgVGVsUmVnZXgsXHJcbn0gZnJvbSBcIi4uL21vZGVscy9maWVsZHMvdGV4dEZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IEZvcm0gfSBmcm9tIFwiLi4vbW9kZWxzL2Zvcm0ubW9kZWxcIjtcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSBcIi4uL21vZGVscy9yZWNvcmQubW9kZWxcIjtcclxuaW1wb3J0IHsgQXJyYXlWYWxpZGF0b3JzIH0gZnJvbSBcIi4vY3VzdG9tLWZvcm0tdmFsaWRhdG9ycy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEVxcER5bmFtaWNNb2R1bGVEaWFsb2dTZXJ2aWNlIH0gZnJvbSBcIi4vZXFwLWR5bmFtaWMtbW9kdWxlLWRpYWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNwaW5uZXJTZXJ2aWNlIH0gZnJvbSBcIi4vc3Bpbm5lci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEdsb2JhbFNlcnZpY2UgfSBmcm9tIFwiLi9nbG9iYWwuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBJbWFnZVNlbGVjdG9yRmllbGQgfSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy9pbWFnZVNlbGVjdG9yRmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgRHluQXR0YWNobWVudCB9IGZyb20gXCIuLi9tb2RlbHMvZHluQXR0YWNobWVudFwiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXRpbGl0eUhlbHBlclNlcnZpY2Uge1xyXG4gIHB1YmxpYyBzdGF0aWMgY29udGV4dDogQ29udGV4dCA9IG5ldyBDb250ZXh0KCk7XHJcblxyXG4gIGRlYnVnTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRlYnVnTG9nKG1lc3NhZ2U6IHN0cmluZywgaXRlbT86IGFueSl7XHJcbiAgICBpZih0aGlzLmRlYnVnTW9kZSl7XHJcbiAgICAgIGlmKGl0ZW0pe1xyXG4gICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UsIGl0ZW0pXHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBzcGlubmVyU2VydmljZTogU3Bpbm5lclNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgRXZhbHVhdGVGaWVsZEZvcm11bGEoXHJcbiAgICBmb3JtdWxhOiBzdHJpbmcsXHJcbiAgICByZWM6IFJlY29yZCxcclxuICAgIGN0eDogYW55XHJcbiAgKTogYW55IHtcclxuICAgIGNvbnN0IGV2YWx1YXRlZFZhbHVlID0gZXZhbChmb3JtdWxhKTtcclxuICAgIHJldHVybiBldmFsdWF0ZWRWYWx1ZSA/IGV2YWx1YXRlZFZhbHVlIDogbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgU2V0Q29udGV4dChjdHg6IENvbnRleHQpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IGN0eDtcclxuICB9XHJcbiAgcHVibGljIHN0YXRpYyBpc051bWVyaWMobikge1xyXG4gICAgcmV0dXJuICFpc05hTihuKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaW5pdFN0eWxlcyhzdHlsZWNzcykge1xyXG4gICAgcmV0dXJuIHN0eWxlY3NzLnNwbGl0KFwiO1wiKS5yZWR1Y2UoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3Qga2V5cGFyID0gYi5zcGxpdChcIjpcIik7XHJcbiAgICAgIGlmIChrZXlwYXIubGVuZ3RoID4gMSkgYVtrZXlwYXJbMF0udHJpbSgpXSA9IGtleXBhclsxXS50cmltKCk7XHJcbiAgICAgIHJldHVybiBhO1xyXG4gICAgfSwge30pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBHZXRGaWVsZFR5cGUoZmllbGQ6IEJhc2VGaWVsZCkge1xyXG4gICAgc3dpdGNoIChmaWVsZC5GaWVsZFR5cGUpIHtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQ2FtcG8gZGkgdGVzdG9cIl06IHtcclxuICAgICAgICBjb25zdCB0OiBUZXh0RmllbGQgPSBPYmplY3QuYXNzaWduKG5ldyBUZXh0RmllbGQoKSwgZmllbGQpO1xyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBpbXBvc3RhcmUgaSB2YWxvcmkgZGEgc3VnZ2VyaXJlIG5lbGwnYXV0b2NvbXBsZXRlIHBlciBpIGNhbXBpIGluIGN1aSBsJ3V0ZW50ZSBkZXZlIHNjcml2ZXJlIGNvbWFuZGkgamF2YXNjcmlwdC5cclxuICAgKiBJbiBiYXNlIGFsbCd1bHRpbW8gY2FyYXR0ZXJlIGRpZ2l0YXRvIHZpZW5lIGltcG9zdGF0byB1biBlbGVuY28gZGkgb2dnZXR0aSBvIHByb3ByaWV0w6AgY2hlIGwndXRlbnRlIGhhIGEgZGlzcG9zaXppb25lIGluIHF1ZWwgbW9tZW50by5cclxuICAgKiBAcGFyYW0gZmllbGRzIEFycmF5IGRpIEJhc2VGaWVsZCBhZ2dpdW50aSBhbGxhIEZvcm1cclxuICAgKiBAcGFyYW0gdHlwZWRGb3JtdWxhIFN0cmluZ2EgZGlnaXRhdGEgZGFsbCd1dGVudGVcclxuICAgKiBAc3VtbWFyeSBJbCBtZXRvZG8gaW1wb3N0YSBpIHN1Z2dlcmltZW50aSBiYXNhbmRvc2kgc3UgMyBjYXNpOlxyXG4gICAqICAxKSBsJ3V0ZW50ZSBub24gaGEgZGlnaXRhdG8gbnVsbGEgbyBsYSBzdHJpbmdhIGRpZ2l0YXRhIGRhbGwndXRlbnRlIGZpbmlzY2UgY29uIHVubyBzcGF6aW8gdnVvdG9cclxuICAgKiAgMikgbGEgc3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZSBmaW5pc2NlIGNvbiB1biBcIi5cIlxyXG4gICAqICAzKSBsYSBzdHJpbmdhIGRpZ2l0YXRhIGRhbGwndXRlbnRlIG5vbiBjb2luY2lkZSBjb24gbmVzc3VuIGFsdHJvIGNhc28gc29wcmEgKGZpbmlzY2UgY29uIHVuIGNhcmF0dGVyZSBxdWFsdW5xdWUpXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyBHZXRBdXRvY29tcGxldGVPcHRpb25zKFxyXG4gICAgZmllbGRzOiBBcnJheTxCYXNlRmllbGQ+LFxyXG4gICAgdHlwZWRGb3JtdWxhOiBzdHJpbmdcclxuICApOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4ge1xyXG4gICAgbGV0IGF1dG9jb21wbGV0ZU9wdGlvbnM6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PiA9IFtdO1xyXG5cclxuICAgIC8vIFJlY3VwZXJvIGkgbm9taSBkaSB0dXR0aSBpIGNhbXBpIGNyZWF0aSBmaW5vIGFkIG9yYSBuZWxsYSBmb3JtLlxyXG4gICAgY29uc3QgYXZhaWxhYmxlUmVjUHJvcGVydGllczogQXJyYXk8c3RyaW5nPiA9IGZpZWxkcy5tYXAoKGYpID0+XHJcbiAgICAgIGYuTGFiZWwuc3BsaXQoXCIgXCIpLmpvaW4oXCJfXCIpXHJcbiAgICApO1xyXG5cclxuICAgIC8vIE5lbCBjYXNpIGluIGN1aSBsJ3V0ZW50ZSBub24gaGEgaW5zZXJpdG8gbnVsbGEgb3BwdXJlIGxhIHN0cmluZ2EgZmluaXNjZSBjb24gdW5vIHNwYXppbyB2dW90byBvIHVuIHNpbWJvbG8gZGl2ZXJzbyBkYSBcIi5cIlxyXG4gICAgLy8gKHVuIGNhcmF0dGVyZSBub24gYWxmYW51bWVyaWNvKSBpbXBvc3RvIGNvbWUgc3VnZ2VyaW1lbnRpIHNvbG8gXCJyZWNcIiBlIFwiY3R4XCIsIG92dmVybyBnbGkgdW5pY2kgZHVlIG9nZ2V0dGkgYSBjdWkgbCd1dGVudGUgaGEgYWNjZXNzby5cclxuICAgIGlmIChcclxuICAgICAgIXR5cGVkRm9ybXVsYSB8fFxyXG4gICAgICAoIXR5cGVkRm9ybXVsYS5lbmRzV2l0aChcIi5cIikgJiZcclxuICAgICAgICBuZXcgUmVnRXhwKFwiW14wLTlhLXpBLVpfXVwiKS50ZXN0KFxyXG4gICAgICAgICAgdHlwZWRGb3JtdWxhLnN1YnN0cmluZyh0eXBlZEZvcm11bGEubGVuZ3RoIC0gMSwgdHlwZWRGb3JtdWxhLmxlbmd0aClcclxuICAgICAgICApKVxyXG4gICAgKSB7XHJcbiAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBbXHJcbiAgICAgICAgeyBsYWJlbDogXCJyZWNcIiwgdmFsdWU6ICh0eXBlZEZvcm11bGEgPyB0eXBlZEZvcm11bGEgOiBcIlwiKSArIFwicmVjXCIgfSxcclxuICAgICAgICB7IGxhYmVsOiBcImN0eFwiLCB2YWx1ZTogKHR5cGVkRm9ybXVsYSA/IHR5cGVkRm9ybXVsYSA6IFwiXCIpICsgXCJjdHhcIiB9LFxyXG4gICAgICBdO1xyXG4gICAgfVxyXG4gICAgLy8gU2UgbGEgc3RyaW5nYSBmaW5pc2NlIGNvbiB1biBcIi5cIiB2dW9sIGRpcmUgY2hlIGwndXRlbnRlIHN0YSBjZXJjYW5kbyBkaSBhY2NlZGVyZSBhZCB1bmEgcHJvcHJpZXTDoCBkaSB1biBvZ2dldHRvXHJcbiAgICAvLyBhIHN1YSBkaXNwb3NpemlvbmUuIFJlY3VwZXJvIGlsIG5vbWUgZGVsbCd1bHRpbW8gb2dnZXR0byBkaWdpdGF0byBkYWxsJ3V0ZW50ZSBlIHNlIGwnb2dnZXR0byBzY2VsdG8gw6ggXCJyZWNcIiBvIFwiY3R4XCJcclxuICAgIC8vIGFsbG9yYSBzdWdnZXJpc2NvIGxlIHByb3ByaWV0w6AgY2hlIGVzaXN0b25vIGFsbCdpbnRlcm5vIGRpIHF1ZXN0aSBvZ2dldHRpIGFsdHJpbWVudGkgbm9uIG1vc3RybyBudWxsYS5cclxuICAgIGVsc2UgaWYgKHR5cGVkRm9ybXVsYS5lbmRzV2l0aChcIi5cIikpIHtcclxuICAgICAgY29uc3QgZm9ybXVsYVBpZWNlczogQXJyYXk8c3RyaW5nPiA9IHR5cGVkRm9ybXVsYVxyXG4gICAgICAgIC5zcGxpdChcIiBcIilcclxuICAgICAgICBbdHlwZWRGb3JtdWxhLnNwbGl0KFwiIFwiKS5sZW5ndGggLSAxXS5zcGxpdChcIi5cIik7XHJcbiAgICAgIGlmIChmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gMl0gPT09IFwicmVjXCIpIHtcclxuICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gYXZhaWxhYmxlUmVjUHJvcGVydGllcy5tYXAoKGYpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7IGxhYmVsOiBmLCB2YWx1ZTogdHlwZWRGb3JtdWxhICsgZiB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKGZvcm11bGFQaWVjZXNbZm9ybXVsYVBpZWNlcy5sZW5ndGggLSAyXSA9PT0gXCJjdHhcIikge1xyXG4gICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBPYmplY3Qua2V5cyhVdGlsaXR5SGVscGVyU2VydmljZS5jb250ZXh0KS5tYXAoXHJcbiAgICAgICAgICAoZikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4geyBsYWJlbDogZiwgdmFsdWU6IHR5cGVkRm9ybXVsYSArIGYgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgIGZvcm11bGFQaWVjZXMubGVuZ3RoID4gMiAmJlxyXG4gICAgICAgIGZvcm11bGFQaWVjZXNbZm9ybXVsYVBpZWNlcy5sZW5ndGggLSAzXSA9PT0gXCJjdHhcIiAmJlxyXG4gICAgICAgIGZvcm11bGFQaWVjZXNbZm9ybXVsYVBpZWNlcy5sZW5ndGggLSAyXSA9PT0gXCJVc2VyXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IE9iamVjdC5rZXlzKFxyXG4gICAgICAgICAgVXRpbGl0eUhlbHBlclNlcnZpY2UuY29udGV4dC5Vc2VyXHJcbiAgICAgICAgKS5tYXAoKGYpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7IGxhYmVsOiBmLCB2YWx1ZTogdHlwZWRGb3JtdWxhICsgZiB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gSW4gdHV0dGkgZ2xpIGFsdHJpIGNhc2ksIG92dmVybyBxdWFuZG8gbGEgc3RyaW5nYSBkaWdpdGF0YSBmaW5pc2NlIGNvbiB1biBjYXJhdHRlcmUgZGl2ZXJzbyBkYSBxdWVsbGlcclxuICAgIC8vIGNvbnRyb2xsYXRpIGZpbm9yYSwgdnVvbCBkaXJlIGNoZSBsJ3V0ZW50ZSBzdGEgZGlnaXRhbnRvIGlsIG5vbWUgZGkgdW4gb2dnZXR0bywgdW5hIHByb3ByaWV0w6AgbyB1bmFcclxuICAgIC8vIGZ1bnppb25lIGphdmFzY3JpcHQuIENvbnRyb2xsbyBsYSBwYXJvbGEgY2hlIGwndXRlbnRlIHN0YSBkaWdpdGFuZG8gZSBzZSBmYSBwYXJ0ZSBkaSB1bm8gZGVnbGkgb2dnZXR0aSBhIGRpc3Bvc2l6aW9uZVxyXG4gICAgLy8gbyB1bmEgcHJvcHJpZXTDoCBkaSBlc3NpIGFsbG9yYSBzdWdnZXJpc2NvIGkgcG9zc2liaWxpIG1hdGNoLlxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnN0IGF2YWlsYWJsZU9wdGlvbnM6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PiA9IFtdO1xyXG5cclxuICAgICAgLy8gUHJlbmRvIHR1dHRpIGkgYmxvY2NoaSBkaSBjYXJhdHRlcmkgZGlnaXRhdGkgZGFsbCd1dGVudGVcclxuICAgICAgY29uc3QgYWxsRm9ybXVsYVdvcmRzOiBBcnJheTxzdHJpbmc+ID0gdHlwZWRGb3JtdWxhLnNwbGl0KFwiIFwiKTtcclxuICAgICAgLy8gUHJlbmRvIGwndWx0aW1vIGJsb2NjbyBkaSBjYXJhdHRlcmkgZGlnaXRhdG8gZGFsbCd1dGVudGVcclxuICAgICAgY29uc3QgbGFzdFR5cGVkU3RyaW5nOiBzdHJpbmcgPVxyXG4gICAgICAgIGFsbEZvcm11bGFXb3Jkc1thbGxGb3JtdWxhV29yZHMubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAvLyBTZSBsYSBsJ3VsdGltYSBzdHJpbmdhIGRpZ2l0YXRhIG5vbiBjb250aWVuZSBjYXJhdHRlcmkgc3BlY2lhbGkgYWxsb3JhIHNwbGl0dG8gbGEgc3RyaW5nYVxyXG4gICAgICAvLyBzdWkgXCIuXCIgZSBpbXBvc3RvIGkgc3VnZ2VyaW1lbnRpIGluIGJhc2UgYWwgcGF0aCBkZWxsYSBwcm9ycGlldMOgIGNoZSBzaSBzdGEgZGlnaXRhbmRvLlxyXG4gICAgICBpZiAoIW5ldyBSZWdFeHAoXCJbXjAtOWEtekEtWl8uXVwiKS50ZXN0KGxhc3RUeXBlZFN0cmluZykpIHtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0eVBhdGggPSBsYXN0VHlwZWRTdHJpbmcuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGNvbnN0IGxhc3RUeXBlZFdvcmsgPSBwcm9wZXJ0eVBhdGhbcHJvcGVydHlQYXRoLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICBsZXQgcHJvcGVydGllc1RvQ2hlY2s6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHByb3BlcnR5UGF0aC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgcHJvcGVydGllc1RvQ2hlY2sgPSBbXCJyZWNcIiwgXCJjdHhcIl07XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgIHByb3BlcnR5UGF0aC5sZW5ndGggPiAxICYmXHJcbiAgICAgICAgICBwcm9wZXJ0eVBhdGhbcHJvcGVydHlQYXRoLmxlbmd0aCAtIDJdID09PSBcImN0eFwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjayA9IE9iamVjdC5rZXlzKFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmNvbnRleHQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICBwcm9wZXJ0eVBhdGgubGVuZ3RoID4gMiAmJlxyXG4gICAgICAgICAgcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAzXSA9PT0gXCJjdHhcIiAmJlxyXG4gICAgICAgICAgcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAyXSA9PT0gXCJVc2VyXCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gT2JqZWN0LmtleXMoVXRpbGl0eUhlbHBlclNlcnZpY2UuY29udGV4dC5Vc2VyKTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgcHJvcGVydHlQYXRoLmxlbmd0aCA+IDEgJiZcclxuICAgICAgICAgIHByb3BlcnR5UGF0aFtwcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMl0gPT09IFwicmVjXCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gYXZhaWxhYmxlUmVjUHJvcGVydGllcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVzZWd1byBpbCBjb250cm9sbG8gc3VsbGUgcHJvcHJpZXTDoCByZWN1cGVyYXRlLCBhZ2dpdW5nbyBhaSBzdWdnZXJpbWVudGkgdHV0dGkgaSBub21pIGNoZSBpbml6aWFubyBjb25cclxuICAgICAgICAvLyBxdWVsbG8gY2hlIHN0YSBkaWdpdGFuZG8gbCd1dGVudGUuXHJcbiAgICAgICAgcHJvcGVydGllc1RvQ2hlY2suZm9yRWFjaCgocHJvcCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHByb3Auc3RhcnRzV2l0aChsYXN0VHlwZWRXb3JrKSkge1xyXG4gICAgICAgICAgICBhdmFpbGFibGVPcHRpb25zLnB1c2goe1xyXG4gICAgICAgICAgICAgIGxhYmVsOiBwcm9wLFxyXG4gICAgICAgICAgICAgIHZhbHVlOlxyXG4gICAgICAgICAgICAgICAgdHlwZWRGb3JtdWxhICtcclxuICAgICAgICAgICAgICAgIHByb3Auc3Vic3RyaW5nKGxhc3RUeXBlZFdvcmsubGVuZ3RoLCBwcm9wLmxlbmd0aCksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gYXZhaWxhYmxlT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXV0b2NvbXBsZXRlT3B0aW9ucztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBpbnZvY2F0byBkYWxsJ2h0bWwgcGVyIGltcG9zdGFyZSBsZSBjbGFzc2kgY3NzIHBlciB2aXN1YWxpenphcmUgaWwgY2FtcG8gYWxsJ2ludGVybm8gZGVsbGEgZm9ybS5cclxuICAgKiBTZSBwZXIgaWwgZmllbGQgc29ubyBzdGF0ZSBzcGVjaWZpY2F0ZSBkZWxsZSBjbGFzc2kgYWxsb3JhIHZlbmdvbm8gYXBwbGNhdGUgcXVlbGxlLCBhbHRyaW1lbnRpIHZlbmdvbm8gdXNhdGVcclxuICAgKiBkZWxsZSBjbGFzc2kgZGkgZGVmYXVsdC5cclxuICAgKiBAcGFyYW0gZmllbGQgQmFzZUZpZWxkIGRhIHZpc3VhbGl6emFyZS5cclxuICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1bmEgc3RyaW5nYSBjb250ZW5lbnRlIGxlIGNsYXNzaSBjc3MgZGEgYXBwbGljYXJlLlxyXG4gICAqL1xyXG4gIGdldEZpZWxkU3lsZUNsYXNzKGZpZWxkOiBCYXNlRmllbGQsIHNob3dBbGxGaWVsZHM6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XHJcbiAgICAgICAgXHJcbiAgICB2YXIgY29sc3BhbnZhbHVlcyA9IFwiXCI7XHJcbiAgICB2YXIgdmlzaWJpbGl0eXZhbHVlcyA9IFwiXCI7XHJcbiAgICBpZiAoZmllbGQuQ29sU3BhblNpemVzICYmIGZpZWxkLkNvbFNwYW5TaXplcy5sZW5ndGggPiAwKXtcclxuICAgICAgY29sc3BhbnZhbHVlcyA9IGZpZWxkLkNvbFNwYW5TaXplcy5tYXAoKHNpemUpID0+XHJcbiAgICAgIENvbFNwYW5TaXplc0VudW1bc2l6ZV0udG9TdHJpbmcoKSkuam9pbihcIiBcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb2xzcGFudmFsdWVzID0gdGhpcy5nZXREZWZhdWx0U3R5bGVDbGFzcyhmaWVsZCwgJ2FsaWduLXNlbGYtZW5kJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmaWVsZC5Jbkxpc3RWaWV3ICYmICFzaG93QWxsRmllbGRzKXtcclxuICAgICAgaWYgKGZpZWxkLkludmlzaWJpbGl0eSA9PSBGaWVsZEludmlzaWJpbGl0eUVudW0uTkFTQ09TVE8peyB2aXNpYmlsaXR5dmFsdWVzID0gXCJ2aXNpYmlsaXR5X2hpZGRlblwiOyB9XHJcbiAgICAgIGlmIChmaWVsZC5JbnZpc2liaWxpdHkgPT0gRmllbGRJbnZpc2liaWxpdHlFbnVtW1wiTkFTQ09TVE8gQ09OIEFSRUEgVklTSUJJTEVcIl0peyB2aXNpYmlsaXR5dmFsdWVzID0gXCJ2aXNpYmlsaXR5X3RyYW5zcGFyZW50XCI7IH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sc3BhbnZhbHVlcyArIFwiIFwiICsgdmlzaWJpbGl0eXZhbHVlcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBpbnZvY2F0byBkYWxsJ2h0bWwgcGVyIGltcG9zdGFyZSBsZSBjbGFzc2kgY3NzIHBlciB2aXN1YWxpenphcmUgaWwgY2FtcG8gYWxsJ2ludGVybm8gZGVsbGEgZm9ybS5cclxuICAgKiBTZSBwZXIgaWwgZmllbGQgc29ubyBzdGF0ZSBzcGVjaWZpY2F0ZSBkZWxsZSBjbGFzc2kgYWxsb3JhIHZlbmdvbm8gYXBwbGNhdGUgcXVlbGxlLCBhbHRyaW1lbnRpIHZlbmdvbm8gdXNhdGVcclxuICAgKiBkZWxsZSBjbGFzc2kgZGkgZGVmYXVsdC5cclxuICAgKiBAcGFyYW0gZmllbGQgQmFzZUZpZWxkIGRhIHZpc3VhbGl6emFyZS5cclxuICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1bmEgc3RyaW5nYSBjb250ZW5lbnRlIGxlIGNsYXNzaSBjc3MgZGEgYXBwbGljYXJlLlxyXG4gICAqL1xyXG4gIGdldEZpZWxkQW5zd2VyU3R5bGVDbGFzcyhmaWVsZDogQmFzZUZpZWxkKTogc3RyaW5nIHtcclxuICAgICAgICBcclxuICAgIHZhciBjb2xzcGFudmFsdWVzID0gXCJcIjtcclxuICAgIHZhciB2aXNpYmlsaXR5dmFsdWVzID0gXCJcIjtcclxuXHJcbiAgICBpZiAoZmllbGQuQW5zd2VyU3R5bGUgJiYgZmllbGQuQW5zd2VyU3R5bGUuQ29sU3BhblNpemVzICYmIGZpZWxkLkFuc3dlclN0eWxlLkNvbFNwYW5TaXplcy5sZW5ndGggPiAwKXtcclxuXHJcbiAgICAgIGNvbHNwYW52YWx1ZXMgPSBmaWVsZC5BbnN3ZXJTdHlsZS5Db2xTcGFuU2l6ZXMubWFwKChzaXplKSA9PlxyXG4gICAgICAgIENvbFNwYW5TaXplc0VudW1bc2l6ZV0udG9TdHJpbmcoKVxyXG4gICAgICApLmpvaW4oXCIgXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29sc3BhbnZhbHVlcyA9IHRoaXMuZ2V0RGVmYXVsdFN0eWxlQ2xhc3MoZmllbGQsICdhbGlnbi1zZWxmLXN0YXJ0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmaWVsZC5BbnN3ZXJTdHlsZS5Jbkxpc3RWaWV3KXtcclxuICAgICAgaWYgKGZpZWxkLkFuc3dlclN0eWxlLkludmlzaWJpbGl0eSA9PSBGaWVsZEludmlzaWJpbGl0eUVudW0uTkFTQ09TVE8peyB2aXNpYmlsaXR5dmFsdWVzID0gXCJ2aXNpYmlsaXR5X2hpZGRlblwiOyB9XHJcbiAgICAgIGlmIChmaWVsZC5BbnN3ZXJTdHlsZS5JbnZpc2liaWxpdHkgPT0gRmllbGRJbnZpc2liaWxpdHlFbnVtW1wiTkFTQ09TVE8gQ09OIEFSRUEgVklTSUJJTEVcIl0peyB2aXNpYmlsaXR5dmFsdWVzID0gXCJ2aXNpYmlsaXR5X3RyYW5zcGFyZW50XCI7IH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sc3BhbnZhbHVlcyArIFwiIFwiICsgdmlzaWJpbGl0eXZhbHVlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFN0eWxlQ2xhc3MoZmllbGQ6IEJhc2VGaWVsZCwgZGVmYXVsdEFsaWduOiBzdHJpbmcpOiBzdHJpbmd7XHJcbiAgICBcclxuICAgIHN3aXRjaCAoZmllbGQuRmllbGRUeXBlKSB7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIGRpIHRlc3RvXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnQ2FtcG8gZGkgdGVzdG8nKVxyXG4gICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNCBcIiArIGRlZmF1bHRBbGlnbjtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQXJlYSBkaSB0ZXN0b1wiXTpcclxuICAgICAgICAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coJ0FyZWEgZGkgdGVzdG8nKVxyXG4gICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtMTIgY29sLWxnLTEyIFwiICsgZGVmYXVsdEFsaWduO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJCb29sZWFub1wiXTpcclxuICAgICAgICAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coJ0Jvb2xlYW5vJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgXCIgKyBkZWZhdWx0QWxpZ247XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkRhdGEgZS9vIG9yYVwiXTpcclxuICAgICAgICAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coJ0RhdGEgZS9vIG9yYScpXHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IFwiICsgZGVmYXVsdEFsaWduO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJDYW1wbyBudW1lcmljb1wiXTpcclxuICAgICAgICAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coJ0NhbXBvIG51bWVyaWNvJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgXCIgKyBkZWZhdWx0QWxpZ247XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkFsbGVnYXRvXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnQWxsZWdhdG8nKVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIChmaWVsZCBhcyBBdHRhY2htZW50RmllbGQpLklzTXVsdGlBdHRhY2ggfHxcclxuICAgICAgICAgICgoZmllbGQgYXMgQXR0YWNobWVudEZpZWxkKS5NZXRhZGF0YUZpZWxkcyAmJlxyXG4gICAgICAgICAgICAoZmllbGQgYXMgQXR0YWNobWVudEZpZWxkKS5NZXRhZGF0YUZpZWxkcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTIgXCIgKyBkZWZhdWx0QWxpZ247XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNCBcIiArIGRlZmF1bHRBbGlnbjtcclxuICAgICAgICB9XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkltbWFnaW5lXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnSW1tYWdpbmUnKVxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgKGZpZWxkIGFzIEltYWdlRmllbGQpLkF0dGFjaERlZmluaXRpb24uSXNNdWx0aUF0dGFjaCB8fFxyXG4gICAgICAgICAgKChmaWVsZCBhcyBJbWFnZUZpZWxkKS5BdHRhY2hEZWZpbml0aW9uLk1ldGFkYXRhRmllbGRzICYmXHJcbiAgICAgICAgICAgIChmaWVsZCBhcyBJbWFnZUZpZWxkKS5BdHRhY2hEZWZpbml0aW9uLk1ldGFkYXRhRmllbGRzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMiBcIiArIGRlZmF1bHRBbGlnbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IFwiICsgZGVmYXVsdEFsaWduO1xyXG4gICAgICAgIH0qL1xyXG4gICAgICAgIFxyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJFbGVuY28gZ2VuZXJpY29cIl06XHJcbiAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdFbGVuY28gZ2VuZXJpY28nKVxyXG4gICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNCBcIiArIGRlZmF1bHRBbGlnbjtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiTG9va3VwXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnTG9va3VwJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgXCIgKyBkZWZhdWx0QWxpZ247XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkZvcm0gZGkgZGV0dGFnbGlvXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnRm9ybSBkaSBkZXR0YWdsaW8nKVxyXG4gICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtMTIgY29sLWxnLTEyIFwiICsgZGVmYXVsdEFsaWduO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJFbGVuY28gaW1tYWdpbmlcIl06XHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IFwiICsgZGVmYXVsdEFsaWduO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJFdGljaGV0dGFcIl06XHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IFwiICsgZGVmYXVsdEFsaWduO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgaWwgRm9ybUdyb3VwIGNoZSByYXBwcmVzZW50YSB1bmEgRm9ybSBhIHBhcnRpcmUgZGFpIHN1b2kgQmFzZUZpZWxkLlxyXG4gICAqIEBwYXJhbSBmb3JtRmllbGRzIExpc3RhIGRlaSBCYXNlRmllbGQgY2hlIGNvbXBvbmdvbm8gbGEgZm9ybS5cclxuICAgKiBAcGFyYW0gcmVjb3JkIE9nZ2V0dG8gZGkgdGlwbyBSZWNvcmQgY2hlIGNvbnRpZW5lIGkgdmFsb3JpIGRlaSBjYW1waS5cclxuICAgKiBAcGFyYW0gb25seVZpZXcgU2UgVFJVRSBkaXNhYmlsaXRhIGxhIGZvcm0gcGVyIHJlbmRlcmxhIGluIHNvbGEgbGV0dHVyYS5cclxuICAgKiBAcGFyYW0gaW5jbHVkZUN1cnJlbnRGb3JtSW5GaWVsZCBTZSBUUlVFIHBvcG9sYSBsYSBwcm9wcmlldMOgIEZvcm1Gb3JtR3JvdXAgYWxsJ2ludGVybm8gZGkgb2duaSBCYXNlRmllbGQgY29uIGlsIEZvcm1Hcm91cCBjb3JyZW50ZS5cclxuICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1biBGb3JtR3JvdXAgcmFwcHJlc2VudGF0ZSBsYSBGb3JtIGEgY3VpIGFwcGFydGVuZ29ubyBpIEJhc2VGaWVsZCByaWNldnV0aSBpbiBpbnB1dC5cclxuICAgKi9cclxuICBwdWJsaWMgQ3JlYXRlRm9ybUZvcm1Hcm91cChcclxuICAgIGZvcm1GaWVsZHM6IEFycmF5PEJhc2VGaWVsZD4sXHJcbiAgICByZWNvcmQ6IFJlY29yZCxcclxuICAgIG9ubHlWaWV3ID0gZmFsc2UsXHJcbiAgICBpbmNsdWRlQ3VycmVudEZvcm1JbkZpZWxkID0gdHJ1ZVxyXG4gICk6IFVudHlwZWRGb3JtR3JvdXAge1xyXG4gICAgLy8gLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiZm9ybUZpZWxkc1wiLCBmb3JtRmllbGRzKTtcclxuICAgIC8vIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcInJlY29yZFwiLCByZWNvcmQpO1xyXG4gICAgLy8gLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwib25seVZpZXdcIiwgb25seVZpZXcpO1xyXG4gICAgLy8gLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiaW5jbHVkZUN1cnJlbnRGb3JtSW5GaWVsZFwiLCBpbmNsdWRlQ3VycmVudEZvcm1JbkZpZWxkKTtcclxuXHJcbiAgICBjb25zdCBmb3JtRm9ybTogVW50eXBlZEZvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoW10pO1xyXG5cclxuICAgIGZvcm1GaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgIC8vICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKGZpZWxkKTtcclxuICAgICAgZm9ybUZvcm0uYWRkQ29udHJvbChcclxuICAgICAgICBmaWVsZC5OYW1lLFxyXG4gICAgICAgIHRoaXMuY3JlYXRlRmllbGRGb3JtQ29udHJvbChmaWVsZCwgcmVjb3JkKVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoaW5jbHVkZUN1cnJlbnRGb3JtSW5GaWVsZCkge1xyXG4gICAgICAgIC8vIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhmaWVsZCk7XHJcbiAgICAgICAgICBcclxuICAgICAgICBmaWVsZC5Gb3JtRm9ybUdyb3VwID0gZm9ybUZvcm07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKG9ubHlWaWV3KSB7XHJcbiAgICAgIGZvcm1Gb3JtLmRpc2FibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ybUZvcm07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW56aW9uZSBwZXIgY3JlYXJlIGUgYWdnaXVuZ2VyZSBhbCBGb3JtR3JvdXAgcmFwcHJlc2VudGFudGUgbGEgZm9ybSB1biBudW92byBGb3JtQ29udHJvbCBhIHBhcnRpcmUgZGEgdW4gRmllbGQuXHJcbiAgICogSW4gbnVvdm8gRm9ybUNvbnRyb2wgYXZyw6AgaWwgbm9tZSBkZWwgY2FtcG8gcGFzc2F0byBlIHZlcnJhbm5vIGltcG9zdGF0aSBpIFZhbGlkYXRvcnMgaW4gYmFzZSBhbCB0aXBvIGRlbCBjYW1wbyBzdGVzc28uXHJcbiAgICogQHBhcmFtIGZpZWxkIEJhc2VGaWVsZCBwZXIgY3VpIGNyZWFyZSBpbCBGb3JtQ29udHJvbCBkYSBpbnNlcmlyZSBuZWwgRm9ybUdyb3VwIGRlbGEgZm9ybS5cclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZUZpZWxkRm9ybUNvbnRyb2woXHJcbiAgICBmaWVsZDogQmFzZUZpZWxkLFxyXG4gICAgcmVjb3JkOiBSZWNvcmRcclxuICApOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgY29uc3QgdmFsaWRhdG9yczogQXJyYXk8VmFsaWRhdG9yRm4+ID0gW107XHJcblxyXG4gICAgaWYgKGZpZWxkLlJlcXVpcmVkKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblxyXG4gICAgc3dpdGNoIChmaWVsZC5GaWVsZFR5cGUpIHtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQ2FtcG8gZGkgdGVzdG9cIl06XHJcbiAgICAgICAgaWYgKChmaWVsZCBhcyBUZXh0RmllbGQpLk1heExlbmdodCkge1xyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKChmaWVsZCBhcyBUZXh0RmllbGQpLk1heExlbmdodCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKGZpZWxkIGFzIFRleHRGaWVsZCkuTWluTGVuZ2h0KSB7XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoKGZpZWxkIGFzIFRleHRGaWVsZCkuTWluTGVuZ2h0KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAoKGZpZWxkIGFzIFRleHRGaWVsZCkuVGV4dE1hc2spIHtcclxuICAgICAgICAgIGNhc2UgVGV4dE1hc2tFbnVtLlVybDpcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybihVcmxSZWdleCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgVGV4dE1hc2tFbnVtLkVtYWlsOlxyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBUZXh0TWFza0VudW0uVGVsZWZvbm86XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oVGVsUmVnZXgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJBcmVhIGRpIHRlc3RvXCJdOlxyXG4gICAgICAgIGlmICgoZmllbGQgYXMgVGV4dGFyZWFGaWVsZCkuTWF4TGVuZ2h0KSB7XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goXHJcbiAgICAgICAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKChmaWVsZCBhcyBUZXh0YXJlYUZpZWxkKS5NYXhMZW5naHQpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKGZpZWxkIGFzIFRleHRhcmVhRmllbGQpLk1pbkxlbmdodCkge1xyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFxyXG4gICAgICAgICAgICBWYWxpZGF0b3JzLm1pbkxlbmd0aCgoZmllbGQgYXMgVGV4dGFyZWFGaWVsZCkuTWluTGVuZ2h0KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bS5BbGxlZ2F0bzpcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtLkltbWFnaW5lOlxyXG4gICAgICAgIGlmIChmaWVsZC5SZXF1aXJlZCkgdmFsaWRhdG9ycy5wdXNoKEFycmF5VmFsaWRhdG9ycy5taW5MZW5naHQoMSkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJFbGVuY28gZ2VuZXJpY29cIl06XHJcbiAgICAgICAgaWYgKChmaWVsZCBhcyBMaXN0VmFsdWVGaWVsZCkuSXNNdWx0aUNob2ljaGUpXHJcbiAgICAgICAgICBpZiAoZmllbGQuUmVxdWlyZWQpIHZhbGlkYXRvcnMucHVzaChBcnJheVZhbGlkYXRvcnMubWluTGVuZ2h0KDEpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiRWxlbmNvIGltbWFnaW5pXCJdOlxyXG4gICAgICAgIGlmICgoZmllbGQgYXMgSW1hZ2VTZWxlY3RvckZpZWxkKS5Jc011bHRpQ2hvaWNoZSlcclxuICAgICAgICAgIGlmIChmaWVsZC5SZXF1aXJlZCkgdmFsaWRhdG9ycy5wdXNoKEFycmF5VmFsaWRhdG9ycy5taW5MZW5naHQoMSkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgVW50eXBlZEZvcm1Db250cm9sKHJlY29yZFtmaWVsZC5OYW1lXSwgdmFsaWRhdG9ycyk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjb25maWd1cmFyZSBnbGkgZW5kcG9pbnQgZGEgdXNhcmUgZGkgZGVmYXVsdCBhIHBhcnRpcmUgZGFsbCd1cmwgYmFzZSBkZWwgc2VydmVyXHJcbiAgICogYSBjdWkgc2kgZGV2ZSBjb25uZXR0ZXJlIGUgYWwgdG9rZW4gZGEgcGFzc2FyZSBwZXIgYXV0ZW50aWNhcnNpLlxyXG4gICAqIEBwYXJhbSBiYXNlU2VydmVyVXJsIFN0cmluZ2EgZGVsbCd1cmwgYmFzZSBkZWwgc2VydmVyIChlczogXCJodHRwOi8vbG9jYWxob3N0OjUwMDBcIikuXHJcbiAgICogQHBhcmFtIHVzZXJUb2tlbiBUb2tlbiBkZWxsJ3V0ZW50ZSBsb2dnYXRvIGRhIHVzYXJlIHBlciBhdXRlbnRpY2Fyc2kgc2UgbmVjZXNzYXJpby5cclxuICAgKiBAcmV0dXJucyBSZXNpdHVpc2NlIGxhIGNvbmZpZ3VyYXppb25lIGNvbXBsZXRhIGRlZ2xpIGVuZFBvaW50IGRhIHVzYXJlIGRpIGRlZmF1bHQuXHJcbiAgICovXHJcbiAgcHVibGljIENvbmZpZ3VyZURlZmF1bHRFbmRQb2ludHMoXHJcbiAgICBiYXNlU2VydmVyVXJsOiBzdHJpbmcsXHJcbiAgICB1c2VyVG9rZW46IHN0cmluZ1xyXG4gICk6IEVuZFBvaW50Q29uZmlndXJhdGlvbiB7XHJcbiAgICBsZXQgZW5kUG9pbnRDb25maWd1cmF0aW9uOiBFbmRQb2ludENvbmZpZ3VyYXRpb24gPVxyXG4gICAgICBuZXcgRW5kUG9pbnRDb25maWd1cmF0aW9uKGJhc2VTZXJ2ZXJVcmwsIHVzZXJUb2tlbik7XHJcblxyXG4gICAgLy8gZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMgPSB7XHJcbiAgICAvLyAgIEdldEJ5Rm9ybUlERW5kUG9pbnQ6IHtcclxuICAgIC8vICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvZ2V0YWxsXCIsXHJcbiAgICAvLyAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgIC8vICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5HRVQsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIEdldEFsbEJ5RW50QW5kVXNlcklERW5kUG9pbnQ6IHtcclxuICAgIC8vICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvR2V0QWxsQnlVc2VySURcIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgR2V0QnlJREVuZFBvaW50OiB7XHJcbiAgICAvLyAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL3YxL2dldEJ5SURcIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgU2F2ZUVuZFBvaW50OiB7XHJcbiAgICAvLyAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL3YxL3NhdmVcIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLlBPU1QsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIER1cGxpY2F0ZUVuZFBvaW50OiB7XHJcbiAgICAvLyAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL3YxL2R1cGxpY2F0ZVwiLFxyXG4gICAgLy8gICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAvLyAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uR0VULFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBEZWxldGVFbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS92MS9kZWxldGVcIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkRFTEVURSxcclxuICAgIC8vICAgfSxcclxuICAgIC8vIH07XHJcbiAgICAvLyBlbmRQb2ludENvbmZpZ3VyYXRpb24uRm9ybXMgPSB7XHJcbiAgICAvLyAgIEdldEJ5SURFbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS9jb25mL2Zvcm1cIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgR2V0QnlJREFuZFZlcnNpb25FbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS9jb25mL0dldEJ5SURBbmRWZXJzaW9uXCIsXHJcbiAgICAvLyAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgIC8vICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5HRVQsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIFNhdmVFbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS9jb25mL2Zvcm1cIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLlBPU1QsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyB9O1xyXG4gICAgcmV0dXJuIGVuZFBvaW50Q29uZmlndXJhdGlvbjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBwcmVuZGUgdW5hIHN0cmluZ2EgaW4gaW5wdXQgZSB2ZXJpZmljYSBjaGUgb2duaSBwYXJlbnRlc2kgYXBlcnRhIHZlbmdhIGFuY2hlIGNoaXVzYVxyXG4gICAqIEByZXR1cm5zIHRydWUgc2UgbGUgcGFyZW50ZXNpIHNvbm8gcGFyaSBlIG9nbmkgcGFyZW50ZXNpIGNoaXVkZSBzZSBzdGVzc2EsIGZhbHNlIHNlIG1hbmNhbm8gcGFyZW50ZXNpIG8gbm9uIHZlbmdvbm8gY2hpdXNlXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyBzdHJpbmdDaGVja1BhcmVudGVzaXMoZXhwcmVzc2lvbiwgcmVxdWlyZWQgPSBmYWxzZSkge1xyXG4gICAgaWYgKGV4cHJlc3Npb24gPT0gdW5kZWZpbmVkIHx8IGV4cHJlc3Npb24gPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gcmVxdWlyZWQgPyBmYWxzZSA6IHRydWU7XHJcbiAgICB9XHJcbiAgICBsZXQgc3RhY2sgPSBbXTtcclxuICAgIGxldCBjdXJyZW50O1xyXG4gICAgY29uc3QgbWF0Y2hMb29rdXAgPSB7XHJcbiAgICAgIFwiKFwiOiBcIilcIixcclxuICAgICAgXCJbXCI6IFwiXVwiLFxyXG4gICAgICBcIntcIjogXCJ9XCIsXHJcbiAgICB9O1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwcmVzc2lvbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjdXJyZW50ID0gZXhwcmVzc2lvbltpXTsgLy9lYXNpZXIgdGhhbiB3cml0aW5nIGl0IG92ZXIgYW5kIG92ZXJcclxuXHJcbiAgICAgIGlmIChjdXJyZW50ID09PSBcIihcIiB8fCBjdXJyZW50ID09PSBcIltcIiB8fCBjdXJyZW50ID09PSBcIntcIikge1xyXG4gICAgICAgIHN0YWNrLnB1c2goY3VycmVudCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudCA9PT0gXCIpXCIgfHwgY3VycmVudCA9PT0gXCJdXCIgfHwgY3VycmVudCA9PT0gXCJ9XCIpIHtcclxuICAgICAgICBjb25zdCBsYXN0QnJhY2tldCA9IHN0YWNrLnBvcCgpO1xyXG5cclxuICAgICAgICBpZiAobWF0Y2hMb29rdXBbbGFzdEJyYWNrZXRdICE9PSBjdXJyZW50KSB7XHJcbiAgICAgICAgICAvL2lmIHRoZSBzdGFjayBpcyBlbXB0eSwgLnBvcCgpIHJldHVybnMgdW5kZWZpbmVkLCBzbyB0aGlzIGV4cHJlc3Npb24gaXMgc3RpbGwgY29ycmVjdFxyXG5cclxuICAgICAgICAgIHJldHVybiBmYWxzZTsgLy90ZXJtaW5hdGUgaW1tZWRpYXRlbHkgLSBubyBuZWVkIHRvIGNvbnRpbnVlIHNjYW5uaW5nIHRoZSBzdHJpbmdcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3RhY2subGVuZ3RoID09PSAwOyAvL2FueSBlbGVtZW50cyBtZWFuIGJyYWNrZXRzIGxlZnQgb3BlblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGNoZSBkYXRhIGxhIGNvbmZpZ3VyYXppb25lIGRpIHVuIGVuZHBvaW50IGNvc3RydWlzY2UgbCd1cmwgZGEgY2hpYW1hcmUsIGdsaSBldmVudHVhbGkgcGFyYW1ldHJpXHJcbiAgICogZGEgcGFzc2FyZSAobmVsIGJvZHkgbyBuZWxsYSByb3R0YSkgZWQgZWZmZXR0dWEgbGEgY2hpYW1hdGEuIEFsIHRlcm1pbmUgZGVsbGEgY2hpYW1hdGEgZXNlZ3VlIGxlIGV2ZW50dWFsaVxyXG4gICAqIGZ1bnppb25pIGRpIGNhbGxiYWNrIChzaWEgaW4gY2FzbyBkaSBzdWNjZXNzbyBjaGUgaW4gY2FzbyBkaSBlcnJvcmUpIHBhc3NhdGUgaW4gaW5wdXQuXHJcbiAgICogQHBhcmFtIGVuZFBvaW50RGF0YSBDb2ZpZ3VyYXppb25lIGRlbGwnZW5kcG9pbnQgZGEgY2hpYW1hcmUuXHJcbiAgICogQHBhcmFtIGR5bmFtaWNNb2R1bGVQYXJhbXMgQXJyYXkgZGVpIHBhcmFtZXRyaSBhZ2dpdW50aSBkYWwgbW9kdWxvIGRpbmFtaWNvIGEgcXVlbGxpIGdpw6AgY29uZmlndXJhdGlcclxuICAgKiAoYWQgZXNlbXBpbyBpbCByZWNvcmQgbyBsYSBmb3JtIGRhIHNhbHZhcmUgb3BwdXJlIGwnSUQgcGVyIHJlY3VwZXJhcmUgdW5hIHBhcnRpY29sYXJlIGVudGl0w6ApLlxyXG4gICAqIEBwYXJhbSBjYWxsYmFjayBNZXRvZG8gZGEgZXNlZ3VpcmUgaW4gY2FzbyBkaSBzdWNjZXNzbyBkb3BvIGxhIGNoaWFtYXRhIGh0dHAuXHJcbiAgICogTk9UQTogaW4gaW5wdXQgdmllbmUgcGFzc2F0YSBsYSByaXNwb3N0YSBkZWxsYSBjaGlhbWF0YSBzdGVzc2EuXHJcbiAgICogQHBhcmFtIGVycm9yQ2FsbEJhY2sgTWV0b2RvIGRhIGVzZWd1aXJlIGluIGNhc28gZGkgZXJyb3JlIGRvcG8gbGEgY2hpYW1hdGEgaHR0cC5cclxuICAgKiBOT1RBOiBpbiBpbnB1dCB2aWVuZSBwYXNzYXRvIGwnZXJyb3JlIGdlbmVyYXRvIGRlbGxhIGNoaWFtYXRhIHN0ZXNzYS5cclxuICAgKi9cclxuICBwdWJsaWMgUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgZW5kUG9pbnREYXRhOiBFbmRQb2ludERhdGEsXHJcbiAgICBkeW5hbWljTW9kdWxlUGFyYW1zOiBBcnJheTxFbmRQb2ludERhdGFQYXJhbXM+ID0gbnVsbCxcclxuICAgIGNhbGxiYWNrOiAoZTogRm9ybSB8IEFycmF5PEZvcm0+IHwgUmVjb3JkIHwgQXJyYXk8UmVjb3JkPiB8IER5bkF0dGFjaG1lbnQgfCBBcnJheTxEeW5BdHRhY2htZW50PikgPT4gdm9pZCA9IG51bGwsXHJcbiAgICBlcnJvckNhbGxCYWNrOiAoZXJyOiB1bmtub3duKSA9PiB2b2lkID0gbnVsbFxyXG4gICk6IHZvaWQge1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5hZGRSZXF1ZXN0Q291bnRlcigpO1xyXG5cclxuICAgIGxldCB1cmwgPSBgJHtlbmRQb2ludERhdGEuVXJsfWA7XHJcbiAgICBsZXQgcXVlcnlQYXJhbXM6IHN0cmluZyA9IG51bGw7XHJcbiAgICBjb25zdCBib2R5UGFyYW1zID0ge1xyXG4gICAgICBBZGRpdGlvbmFsUGFyYW1zOiB7fSxcclxuICAgIH07XHJcblxyXG4gICAgLy8jcmVnaW9uIG1lcmdlUGFyYW1cclxuICAgIC8vIHVuaXNjbyBpIGRhdGkgZGkgZGVmYXVsdCBkZWZpbml0aSBuZWxsYSBjb25maWd1cmF6aW9uZSBkZWxsYSBjaGlhbWF0YSBjb24gaSBkYXRpIGNoZSBpbXBvc3RvIG5lbGxhIGNoaWFtYXRhIHNwZWNpZmljYVxyXG4gICAgaWYgKGVuZFBvaW50RGF0YS5QYXJhbXMgPT0gdW5kZWZpbmVkIHx8IGVuZFBvaW50RGF0YS5QYXJhbXMgPT0gbnVsbCkge1xyXG4gICAgICBlbmRQb2ludERhdGEuUGFyYW1zID0gW107XHJcbiAgICB9XHJcbiAgICBpZiAoZHluYW1pY01vZHVsZVBhcmFtcyA9PSB1bmRlZmluZWQgfHwgZHluYW1pY01vZHVsZVBhcmFtcyA9PSBudWxsKSB7XHJcbiAgICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtZXJnZWRQYXJhbXM6IEFycmF5PEVuZFBvaW50RGF0YVBhcmFtcz4gPSBbLi4uZW5kUG9pbnREYXRhLlBhcmFtc107XHJcblxyXG4gICAgZHluYW1pY01vZHVsZVBhcmFtcy5mb3JFYWNoKChvYmopID0+IHtcclxuICAgICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IG1lcmdlZFBhcmFtcy5maW5kSW5kZXgoXHJcbiAgICAgICAgKGl0ZW0pID0+IGl0ZW0uUGFyYW1OYW1lID09PSBvYmouUGFyYW1OYW1lXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBtZXJnZWRQYXJhbXNbZXhpc3RpbmdJbmRleF0uUGFyYW1WYWx1ZSA9IG9iai5QYXJhbVZhbHVlO1xyXG4gICAgICAgIG1lcmdlZFBhcmFtc1tleGlzdGluZ0luZGV4XS5QYXJhbVR5cGUgPSBvYmouUGFyYW1UeXBlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1lcmdlZFBhcmFtcy5wdXNoKG9iaik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChtZXJnZWRQYXJhbXMpIHtcclxuICAgICAgbWVyZ2VkUGFyYW1zLmZvckVhY2goKHBhcmFtKSA9PiB7XHJcbiAgICAgICAgc3dpdGNoIChwYXJhbS5QYXJhbVR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdOiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ1BhcmFtOiBzdHJpbmcgPVxyXG4gICAgICAgICAgICAgIHBhcmFtLlBhcmFtTmFtZSArIFwiPVwiICsgcGFyYW0uUGFyYW1WYWx1ZTtcclxuICAgICAgICAgICAgcXVlcnlQYXJhbXMgPVxyXG4gICAgICAgICAgICAgIChxdWVyeVBhcmFtcyA9PSBudWxsID8gXCJcIiA6IHF1ZXJ5UGFyYW1zICsgXCImXCIpICsgc3RyaW5nUGFyYW07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtW1wiSW4gcm91dGVcIl06IHtcclxuICAgICAgICAgICAgdXJsID0gdXJsICsgKHVybC5lbmRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCIpICsgcGFyYW0uUGFyYW1WYWx1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bXCJJbiBCb2R5XCJdOiB7XHJcbiAgICAgICAgICAgIGJvZHlQYXJhbXNbcGFyYW0uUGFyYW1OYW1lXSA9IHBhcmFtLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb24gbWVyZ2VQYXJhbVxyXG5cclxuICAgIC8vI3JlZ2lvbiBhZGREZWZhdWx0UGFyYW1zXHJcbiAgICAvLyBTZSBuZWxsYSBjb25maWd1cmF6aW9uZSBzb25vIHN0YXRpIGRlZmluaXRpIHBhcmFtZXRyaSBkYSBhZ2dpdW5nZXJlIGFsbGEgY2hpYW1hdGEgcXVlc3RpIHZlbmdvbm8gY2ljbGF0aVxyXG4gICAgLy8gZSBhZ2dpdW50aSBuZWwgcHVudG8gaW4gY3VpIGRldm9ubyBlc3NlcmUgdXNhdGkuXHJcbiAgICAvLyBpZiAoZW5kUG9pbnREYXRhLlBhcmFtcykge1xyXG4gICAgLy8gICAgIGVuZFBvaW50RGF0YS5QYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XHJcbiAgICAvLyAgICAgICAgIHN3aXRjaCAocGFyYW0uUGFyYW1UeXBlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ1F1ZXJ5IHBhcmFtJ106IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdQYXJhbTogc3RyaW5nID0gcGFyYW0uUGFyYW1OYW1lICsgXCI9XCIgKyBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zID09IG51bGwgPyBcIlwiIDogcXVlcnlQYXJhbXMgKyBcIiZcIikgKyBzdHJpbmdQYXJhbTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnSW4gcm91dGUnXToge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHVybCA9IHVybCArICh1cmwuZW5kc1dpdGgoXCIvXCIpID8gXCJcIiA6IFwiL1wiKSArIHBhcmFtLlBhcmFtVmFsdWU7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ0luIEJvZHknXToge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGJvZHlQYXJhbXMuQWRkaXRpb25hbFBhcmFtc1twYXJhbS5QYXJhbU5hbWVdID0gcGFyYW0uUGFyYW1WYWx1ZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG4gICAgLy8jZW5kcmVnaW9uIGFkZERlZmF1bHRQYXJhbXNcclxuXHJcbiAgICAvLyNyZWdpb24gYWRkU3BlY2lmaWNQYXJhbXNcclxuICAgIC8vIFNlIHNvbm8gc3RhdGkgcGFzc2F0aSBwYXJhbWV0cmkgZGEgYWdnaXVuZ2VyZSBhbGxhIGNoaWFtYXRhIGRlZmluaXRpIGFsbCdpbnRlcm5vIGRlbCBtb2R1bG8gZGluYW1pY29cclxuICAgIC8vIHZlbmdvbm8gY2ljbGF0aSBlIGFnZ2l1bnRpIG5lbCBwdW50byBpbiBjdWkgZGV2b25vIGVzc2VyZSB1c2F0aSBkb3BvIHF1ZWxsaSBkZWZpbml0aSBuZWxsYSBjb25maWd1cmF6aW9uZS5cclxuICAgIC8vIGlmIChkeW5hbWljTW9kdWxlUGFyYW1zKSB7XHJcbiAgICAvLyAgICAgZHluYW1pY01vZHVsZVBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcclxuICAgIC8vICAgICAgICAgc3dpdGNoIChwYXJhbS5QYXJhbVR5cGUpIHtcclxuICAgIC8vICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnUXVlcnkgcGFyYW0nXToge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ1BhcmFtOiBzdHJpbmcgPSBwYXJhbS5QYXJhbU5hbWUgKyBcIj1cIiArIHBhcmFtLlBhcmFtVmFsdWU7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMgPSAocXVlcnlQYXJhbXMgPT0gbnVsbCA/IFwiXCIgOiBxdWVyeVBhcmFtcyArIFwiJlwiKSArIHN0cmluZ1BhcmFtO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydJbiByb3V0ZSddOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgKHVybC5lbmRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCIpICsgcGFyYW0uUGFyYW1WYWx1ZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnSW4gQm9keSddOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYm9keVBhcmFtc1twYXJhbS5QYXJhbU5hbWVdID0gcGFyYW0uUGFyYW1WYWx1ZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0pXHJcbiAgICAvLyB9XHJcbiAgICAvLyNlbmRyZWdpb24gYWRkU3BlY2lmaWNQYXJhbXNcclxuXHJcbiAgICBpZiAocXVlcnlQYXJhbXMgIT0gbnVsbCkge1xyXG4gICAgICB1cmwgPVxyXG4gICAgICAgICh1cmwuZW5kc1dpdGgoXCIvXCIpID8gdXJsLnN1YnN0cmluZygwLCB1cmwubGVuZ3RoIC0gMSkgOiB1cmwpICtcclxuICAgICAgICBcIj9cIiArXHJcbiAgICAgICAgcXVlcnlQYXJhbXM7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5odHRwXHJcbiAgICAgIC5yZXF1ZXN0KGVuZFBvaW50RGF0YS5SZXF1ZXN0TWV0aG9kLCB1cmwsIHtcclxuICAgICAgICBoZWFkZXJzOiBlbmRQb2ludERhdGEuVG9rZW5cclxuICAgICAgICAgID8geyBBdXRob3JpemF0aW9uOiBlbmRQb2ludERhdGEuVG9rZW4gfVxyXG4gICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgIGJvZHk6ICFbUmVxdWVzdE1ldGhvZEVudW0uREVMRVRFLCBSZXF1ZXN0TWV0aG9kRW51bS5HRVRdLmluY2x1ZGVzKFxyXG4gICAgICAgICAgZW5kUG9pbnREYXRhLlJlcXVlc3RNZXRob2RcclxuICAgICAgICApXHJcbiAgICAgICAgICA/IGJvZHlQYXJhbXNcclxuICAgICAgICAgIDogbnVsbCxcclxuICAgICAgfSlcclxuICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAocmVzOiBGb3JtIHwgUmVjb3JkIHwgQXJyYXk8UmVjb3JkPikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5yZW1vdmVSZXF1ZXN0Q291bnRlcigpO1xyXG4gICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKHJlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UucmVtb3ZlUmVxdWVzdENvdW50ZXIoKTtcclxuICAgICAgICAgIGlmIChlcnJvckNhbGxCYWNrKSB7XHJcbiAgICAgICAgICAgIGVycm9yQ2FsbEJhY2soZXJyb3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgRXFwRHluYW1pY01vZHVsZURpYWxvZ1NlcnZpY2UuRXJyb3IoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgICAgICAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJSdW5FbmRQb2ludENhbGwgLSBzdWJzY3JpYmUgLSBlbmRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICB9XHJcbn1cclxuIl19