@valtimo/dossier-management 12.5.1 → 12.6.0

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.
@@ -453,10 +453,10 @@ export class DossierManagementListColumnsComponent {
453
453
  };
454
454
  }
455
455
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DossierManagementListColumnsComponent, deps: [{ token: i1.DocumentService }, { token: i2.ActivatedRoute }, { token: i3.TranslateService }, { token: i4.ConfigService }, { token: i5.DomSanitizer }, { token: i6.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
456
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DossierManagementListColumnsComponent, selector: "valtimo-dossier-management-list-columns", ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n caseListColumn: translatedCaseListColumns$ | async,\n documentDefinitionName: documentDefinitionName$ | async,\n hasEnvironmentConfig: hasEnvironmentConfig$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n loadingCaseListColumns: loadingCaseListColumns$ | async,\n } as obs\"\n>\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"createEditModal\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"deleteModal\"></ng-container>\n</ng-container>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-carbon-list\n [actionItems]=\"actionItems\"\n [loading]=\"obs.loadingCaseListColumns\"\n [items]=\"obs.caseListColumn\"\n [fields]=\"fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n [movingRowsEnabled]=\"true\"\n (moveRow)=\"onMoveRowEvent($event, obs.documentDefinitionName)\"\n (rowClicked)=\"columnRowClicked($event)\"\n >\n <ng-container\n carbonToolbarContent\n *ngTemplateOutlet=\"buttons; context: {obs: obs}\"\n ></ng-container>\n\n <valtimo-no-results\n *ngIf=\"!obs.hasEnvironmentConfig\"\n [title]=\"'listColumn.noConfigWarningTitle' | translate\"\n [description]=\"'listColumn.noConfigWarning' | translate\"\n illustration=\"valtimo-layout/img/emptystate-empty.svg\"\n ></valtimo-no-results>\n\n <valtimo-no-results\n *ngIf=\"obs.hasEnvironmentConfig\"\n [title]=\"'listColumn.hasEnvConfigWarningTitle' | translate\"\n [description]=\"'listColumn.hasEnvConfigWarning' | translate\"\n illustration=\"valtimo-layout/img/emptystate-error.svg\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n</ng-template>\n\n<ng-template #buttons let-obs=\"obs\">\n <button\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [disabled]=\"\n obs.hasEnvironmentConfig ||\n !obs.downloadUrl ||\n !obs.downloadName ||\n obs.caseListColumn?.length < 1 ||\n obs.disableInput ||\n loadingCaseListColumns\n \"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"download\" size=\"16\"></svg>\n </button>\n\n <button\n (click)=\"openModal('create')\"\n cdsButton=\"primary\"\n [disabled]=\"obs.hasEnvironmentConfig || loadingCaseListColumns\"\n >\n {{ 'listColumn.addButtonText' | translate }}\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<ng-template #environmentConfigWarning>\n <div class=\"pl-2 pr-2 pb-2 pt-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'warning',\n title: 'listColumn.hasEnvConfigWarningTitle' | translate,\n message: 'listColumn.hasEnvConfigWarning' | translate,\n showClose: false,\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2 pt-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'listColumn.noConfigWarningTitle' | translate,\n message: 'listColumn.noConfigWarning' | translate,\n showClose: false,\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #createEditModal>\n <cds-modal\n valtimoCdsModal\n *ngIf=\"{\n type: currentModalType$ | async,\n show: showModal$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async,\n validKey: validKey$ | async,\n disableDefaultSort: disableDefaultSort$ | async,\n showEnum: showEnum$ | async,\n isYesNo: isYesNo$ | async,\n } as modalObs\"\n [open]=\"modalObs.show\"\n >\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('listColumn.addButtonText' | translate)\n : ('listColumn.editColumnTitle' | translate)\n }}\n </h3>\n </cds-modal-header>\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </cds-modal>\n</ng-template>\n\n<ng-template #modalContent let-modalObs=\"modalObs\">\n <form [formGroup]=\"formGroup\" class=\"list-column-form\">\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.titleTitle' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.titleTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"title\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label\n [disabled]=\"modalObs.disableInput || modalObs.type === 'edit'\"\n [invalid]=\"modalObs.validKey === false\"\n [invalidText]=\"'listColumn.uniqueKeyWarning' | translate\"\n >\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.key' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.keyTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.path' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.pathTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <valtimo-value-path-selector\n formControlName=\"path\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n ></valtimo-value-path-selector>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.displayType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.displayTypeTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"displayType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"viewTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"showDateFormat$ | async\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.dateFormat' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.dateFormatTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"dateFormat\" />\n </cds-label>\n </div>\n <div\n class=\"cds--text-input__field-wrapper\"\n *ngIf=\"modalObs.showEnum || modalObs.isYesNo\"\n [ngClass]=\"{'no-margin': modalObs.isYesNo}\"\n >\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{\n modalObs.isYesNo\n ? ('listColumn.enumTitleOptional' | translate)\n : ('listColumn.enumTitle' | translate)\n }}\n <v-tooltip-icon\n [tooltip]=\"\n modalObs.isYesNo\n ? ('listColumn.enumTooltipOptional' | translate)\n : ('listColumn.enumTooltip' | translate)\n \"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <valtimo-carbon-multi-input\n *ngIf=\"(showModal$ | async) || (modalShowing$ | async)\"\n type=\"keyValue\"\n (valueChange)=\"enumValueChange($event)\"\n [defaultValues]=\"defaultEnumValues$ | async\"\n [hideAddButton]=\"modalObs.isYesNo\"\n [hideDeleteButton]=\"modalObs.isYesNo\"\n [maxRows]=\"modalObs.isYesNo ? 1 : null\"\n [keyColumnTitle]=\"modalObs.isYesNo && ('viewTypeConverter.Yes' | translate)\"\n [valueColumnTitle]=\"modalObs.isYesNo && ('viewTypeConverter.No' | translate)\"\n ></valtimo-carbon-multi-input>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-checkbox formControlName=\"sortable\"\n >{{ 'listColumn.sortable' | translate }}\n </cds-checkbox>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.defaultSortTitle' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.defaultSortTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown\n formControlName=\"defaultSort\"\n [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\"\n >\n <cds-dropdown-list [items]=\"sortItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <cds-modal-footer>\n <ng-container>\n <button\n cdsButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'listColumn.close' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n [attr.modal-primary-focus]=\"true\"\n [disabled]=\"modalObs.valid === false\"\n (click)=\"saveCasListColumns()\"\n [disabled]=\"\n modalObs.disableInput || modalObs.valid === false || modalObs.validKey === false\n \"\n >\n {{ 'listColumn.save' | translate }}\n </button>\n </ng-container>\n </cds-modal-footer>\n</ng-template>\n\n<ng-template #deleteModal>\n <valtimo-confirmation-modal\n [showModalSubject$]=\"showDeleteModal$\"\n [outputOnConfirm]=\"deleteRowKey$ | async\"\n (confirmEvent)=\"deleteRowConfirmation($event)\"\n confirmButtonTextTranslationKey=\"listColumn.deleteColumn\"\n titleTranslationKey=\"listColumn.deleteColumn\"\n contentTranslationKey=\"listColumn.deleteColumnConfirmation\"\n ></valtimo-confirmation-modal>\n</ng-template>\n", styles: ["::ng-deep .tab-container{min-height:unset!important}::ng-deep .cds--inline-notification{max-width:100%}.label-with-tooltip{display:flex;align-items:center}.cds--text-input__field-wrapper:not(:last-child){margin-bottom:1rem}.no-margin{margin-bottom:0!important}.display-type-dropdown{width:300px}.list-column-form{margin-bottom:3rem}.select-label{padding-bottom:.5rem;width:250px}.center-link{display:flex;align-items:center}.dossier-list-columns__actions{display:flex;gap:8px}.list-columns__buttons{display:flex;gap:16px;flex-direction:row;justify-content:flex-end}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i6.Notification, selector: "cds-notification, cds-inline-notification, ibm-notification, ibm-inline-notification", inputs: ["notificationObj"] }, { kind: "directive", type: i6.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i6.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i6.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i6.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i6.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i6.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i6.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "component", type: i6.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i6.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "directive", type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i6.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i6.Checkbox, selector: "cds-checkbox, ibm-checkbox", inputs: ["disabled", "skeleton", "hideLabel", "name", "id", "required", "value", "ariaLabel", "ariaLabelledby", "indeterminate", "checked"], outputs: ["click", "checkedChange", "indeterminateChange"] }, { kind: "component", type: i9.TooltipIconComponent, selector: "v-tooltip-icon", inputs: ["tooltip", "disabled"] }, { kind: "component", type: i9.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["name", "title", "titleTranslationKey", "type", "arbitraryValueAmount", "arbitraryAmountTitles", "initialAmountOfRows", "minimumAmountOfRows", "maxRows", "addRowText", "addRowTranslationKey", "deleteRowText", "deleteRowTranslationKey", "disabled", "defaultValues", "margin", "tooltip", "required", "keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "hideDeleteButton", "hideAddButton", "dropdownItems", "dropdownWidth", "fullWidth", "carbonTheme"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "component", type: i9.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }, { kind: "directive", type: i9.ValtimoCdsModalDirective, selector: "[valtimoCdsModal]" }, { kind: "component", type: i9.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "actionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "component", type: i9.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "component", type: i9.ValuePathSelectorComponent, selector: "valtimo-value-path-selector", inputs: ["name", "appendInline", "margin", "marginLg", "marginXl", "disabled", "documentDefinitionName", "version", "prefixes", "label", "tooltip", "required", "showDocumentDefinitionSelector", "notation", "defaultValue"], outputs: ["valueChangeEvent"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
456
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DossierManagementListColumnsComponent, selector: "valtimo-dossier-management-list-columns", ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n caseListColumn: translatedCaseListColumns$ | async,\n documentDefinitionName: documentDefinitionName$ | async,\n hasEnvironmentConfig: hasEnvironmentConfig$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n loadingCaseListColumns: loadingCaseListColumns$ | async,\n } as obs\"\n>\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"createEditModal\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"deleteModal\"></ng-container>\n</ng-container>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-carbon-list\n [actionItems]=\"actionItems\"\n [loading]=\"obs.loadingCaseListColumns\"\n [items]=\"obs.caseListColumn\"\n [fields]=\"fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n [movingRowsEnabled]=\"true\"\n (moveRow)=\"onMoveRowEvent($event, obs.documentDefinitionName)\"\n (rowClicked)=\"columnRowClicked($event)\"\n >\n <ng-container\n carbonToolbarContent\n *ngTemplateOutlet=\"buttons; context: {obs: obs}\"\n ></ng-container>\n\n <valtimo-no-results\n *ngIf=\"!obs.hasEnvironmentConfig\"\n [title]=\"'listColumn.noConfigWarningTitle' | translate\"\n [description]=\"'listColumn.noConfigWarning' | translate\"\n illustration=\"valtimo-layout/img/emptystate-empty.svg\"\n ></valtimo-no-results>\n\n <valtimo-no-results\n *ngIf=\"obs.hasEnvironmentConfig\"\n [title]=\"'listColumn.hasEnvConfigWarningTitle' | translate\"\n [description]=\"'listColumn.hasEnvConfigWarning' | translate\"\n illustration=\"valtimo-layout/img/emptystate-error.svg\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n</ng-template>\n\n<ng-template #buttons let-obs=\"obs\">\n <button\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [disabled]=\"\n obs.hasEnvironmentConfig ||\n !obs.downloadUrl ||\n !obs.downloadName ||\n obs.caseListColumn?.length < 1 ||\n obs.disableInput ||\n loadingCaseListColumns\n \"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"download\" size=\"16\"></svg>\n </button>\n\n <button\n (click)=\"openModal('create')\"\n cdsButton=\"primary\"\n [disabled]=\"obs.hasEnvironmentConfig || loadingCaseListColumns\"\n >\n {{ 'listColumn.addButtonText' | translate }}\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<ng-template #environmentConfigWarning>\n <div class=\"pl-2 pr-2 pb-2 pt-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'warning',\n title: 'listColumn.hasEnvConfigWarningTitle' | translate,\n message: 'listColumn.hasEnvConfigWarning' | translate,\n showClose: false,\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2 pt-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'listColumn.noConfigWarningTitle' | translate,\n message: 'listColumn.noConfigWarning' | translate,\n showClose: false,\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #createEditModal>\n <cds-modal\n valtimoCdsModal\n *ngIf=\"{\n type: currentModalType$ | async,\n show: showModal$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async,\n validKey: validKey$ | async,\n disableDefaultSort: disableDefaultSort$ | async,\n showEnum: showEnum$ | async,\n isYesNo: isYesNo$ | async,\n } as modalObs\"\n [open]=\"modalObs.show\"\n size=\"sm\"\n >\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('listColumn.addButtonText' | translate)\n : ('listColumn.editColumnTitle' | translate)\n }}\n </h3>\n </cds-modal-header>\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </cds-modal>\n</ng-template>\n\n<ng-template #modalContent let-modalObs=\"modalObs\">\n <form [formGroup]=\"formGroup\" class=\"list-column-form\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.titleTitle' | translate }}\n\n <v-tooltip-icon\n [tooltip]=\"'listColumn.titleTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <input cdsText formControlName=\"title\" />\n </cds-label>\n\n <cds-label\n [disabled]=\"modalObs.disableInput || modalObs.type === 'edit'\"\n [invalid]=\"modalObs.validKey === false\"\n [invalidText]=\"'listColumn.uniqueKeyWarning' | translate\"\n >\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.key' | translate }}\n\n <v-tooltip-icon\n [tooltip]=\"'listColumn.keyTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <input cdsText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </cds-label>\n\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.path' | translate }}\n\n <v-tooltip-icon\n [tooltip]=\"'listColumn.pathTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <valtimo-value-path-selector\n formControlName=\"path\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n ></valtimo-value-path-selector>\n </cds-label>\n\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.displayType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.displayTypeTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <cds-dropdown formControlName=\"displayType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"viewTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n\n <cds-label *ngIf=\"showDateFormat$ | async\" [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.dateFormat' | translate }}\n\n <v-tooltip-icon\n [tooltip]=\"'listColumn.dateFormatTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <input cdsText formControlName=\"dateFormat\" />\n </cds-label>\n\n <cds-label *ngIf=\"modalObs.showEnum || modalObs.isYesNo\" [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{\n modalObs.isYesNo\n ? ('listColumn.enumTitleOptional' | translate)\n : ('listColumn.enumTitle' | translate)\n }}\n\n <v-tooltip-icon\n [tooltip]=\"\n modalObs.isYesNo\n ? ('listColumn.enumTooltipOptional' | translate)\n : ('listColumn.enumTooltip' | translate)\n \"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <valtimo-carbon-multi-input\n *ngIf=\"(showModal$ | async) || (modalShowing$ | async)\"\n type=\"keyValue\"\n (valueChange)=\"enumValueChange($event)\"\n [defaultValues]=\"defaultEnumValues$ | async\"\n [hideAddButton]=\"modalObs.isYesNo\"\n [hideDeleteButton]=\"modalObs.isYesNo\"\n [maxRows]=\"modalObs.isYesNo ? 1 : null\"\n [keyColumnTitle]=\"modalObs.isYesNo && ('viewTypeConverter.Yes' | translate)\"\n [valueColumnTitle]=\"modalObs.isYesNo && ('viewTypeConverter.No' | translate)\"\n ></valtimo-carbon-multi-input>\n </cds-label>\n\n <cds-checkbox formControlName=\"sortable\">{{ 'listColumn.sortable' | translate }} </cds-checkbox>\n\n <cds-label [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.defaultSortTitle' | translate }}\n\n <v-tooltip-icon\n [tooltip]=\"'listColumn.defaultSortTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <cds-dropdown\n formControlName=\"defaultSort\"\n [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\"\n >\n <cds-dropdown-list [items]=\"sortItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <cds-modal-footer>\n <ng-container>\n <button\n cdsButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'listColumn.close' | translate }}\n </button>\n\n <button\n cdsButton=\"primary\"\n [attr.modal-primary-focus]=\"true\"\n [disabled]=\"modalObs.valid === false\"\n (click)=\"saveCasListColumns()\"\n [disabled]=\"\n modalObs.disableInput || modalObs.valid === false || modalObs.validKey === false\n \"\n >\n {{ 'listColumn.save' | translate }}\n </button>\n </ng-container>\n </cds-modal-footer>\n</ng-template>\n\n<ng-template #deleteModal>\n <valtimo-confirmation-modal\n [showModalSubject$]=\"showDeleteModal$\"\n [outputOnConfirm]=\"deleteRowKey$ | async\"\n (confirmEvent)=\"deleteRowConfirmation($event)\"\n confirmButtonTextTranslationKey=\"listColumn.deleteColumn\"\n titleTranslationKey=\"listColumn.deleteColumn\"\n contentTranslationKey=\"listColumn.deleteColumnConfirmation\"\n ></valtimo-confirmation-modal>\n</ng-template>\n", styles: ["::ng-deep .tab-container{min-height:unset!important}::ng-deep .cds--inline-notification{max-width:100%}::ng-deep .cds--label{width:100%}.label-with-tooltip{display:flex;align-items:center}.display-type-dropdown{width:300px}.list-column-form{display:flex;flex-direction:column;gap:16px;margin-bottom:3rem}.select-label{padding-bottom:.5rem;width:250px}.center-link{display:flex;align-items:center}.dossier-list-columns__actions{display:flex;gap:8px}.list-columns__buttons{display:flex;gap:16px;flex-direction:row;justify-content:flex-end}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i6.Notification, selector: "cds-notification, cds-inline-notification, ibm-notification, ibm-inline-notification", inputs: ["notificationObj"] }, { kind: "directive", type: i6.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i6.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i6.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i6.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i6.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i6.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i6.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "component", type: i6.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i6.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "directive", type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i6.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i6.Checkbox, selector: "cds-checkbox, ibm-checkbox", inputs: ["disabled", "skeleton", "hideLabel", "name", "id", "required", "value", "ariaLabel", "ariaLabelledby", "indeterminate", "checked"], outputs: ["click", "checkedChange", "indeterminateChange"] }, { kind: "component", type: i9.TooltipIconComponent, selector: "v-tooltip-icon", inputs: ["tooltip", "disabled"] }, { kind: "component", type: i9.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["name", "title", "titleTranslationKey", "type", "arbitraryValueAmount", "arbitraryAmountTitles", "initialAmountOfRows", "minimumAmountOfRows", "maxRows", "addRowText", "addRowTranslationKey", "deleteRowText", "deleteRowTranslationKey", "disabled", "defaultValues", "margin", "tooltip", "required", "keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "hideDeleteButton", "hideAddButton", "dropdownItems", "dropdownWidth", "fullWidth", "carbonTheme"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "component", type: i9.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }, { kind: "directive", type: i9.ValtimoCdsModalDirective, selector: "[valtimoCdsModal]" }, { kind: "component", type: i9.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "actionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "component", type: i9.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "component", type: i9.ValuePathSelectorComponent, selector: "valtimo-value-path-selector", inputs: ["name", "appendInline", "margin", "marginLg", "marginXl", "disabled", "documentDefinitionName", "version", "prefixes", "label", "tooltip", "required", "showDocumentDefinitionSelector", "notation", "defaultValue"], outputs: ["valueChangeEvent"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
457
457
  }
458
458
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DossierManagementListColumnsComponent, decorators: [{
459
459
  type: Component,
460
- args: [{ selector: 'valtimo-dossier-management-list-columns', template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n caseListColumn: translatedCaseListColumns$ | async,\n documentDefinitionName: documentDefinitionName$ | async,\n hasEnvironmentConfig: hasEnvironmentConfig$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n loadingCaseListColumns: loadingCaseListColumns$ | async,\n } as obs\"\n>\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"createEditModal\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"deleteModal\"></ng-container>\n</ng-container>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-carbon-list\n [actionItems]=\"actionItems\"\n [loading]=\"obs.loadingCaseListColumns\"\n [items]=\"obs.caseListColumn\"\n [fields]=\"fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n [movingRowsEnabled]=\"true\"\n (moveRow)=\"onMoveRowEvent($event, obs.documentDefinitionName)\"\n (rowClicked)=\"columnRowClicked($event)\"\n >\n <ng-container\n carbonToolbarContent\n *ngTemplateOutlet=\"buttons; context: {obs: obs}\"\n ></ng-container>\n\n <valtimo-no-results\n *ngIf=\"!obs.hasEnvironmentConfig\"\n [title]=\"'listColumn.noConfigWarningTitle' | translate\"\n [description]=\"'listColumn.noConfigWarning' | translate\"\n illustration=\"valtimo-layout/img/emptystate-empty.svg\"\n ></valtimo-no-results>\n\n <valtimo-no-results\n *ngIf=\"obs.hasEnvironmentConfig\"\n [title]=\"'listColumn.hasEnvConfigWarningTitle' | translate\"\n [description]=\"'listColumn.hasEnvConfigWarning' | translate\"\n illustration=\"valtimo-layout/img/emptystate-error.svg\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n</ng-template>\n\n<ng-template #buttons let-obs=\"obs\">\n <button\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [disabled]=\"\n obs.hasEnvironmentConfig ||\n !obs.downloadUrl ||\n !obs.downloadName ||\n obs.caseListColumn?.length < 1 ||\n obs.disableInput ||\n loadingCaseListColumns\n \"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"download\" size=\"16\"></svg>\n </button>\n\n <button\n (click)=\"openModal('create')\"\n cdsButton=\"primary\"\n [disabled]=\"obs.hasEnvironmentConfig || loadingCaseListColumns\"\n >\n {{ 'listColumn.addButtonText' | translate }}\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<ng-template #environmentConfigWarning>\n <div class=\"pl-2 pr-2 pb-2 pt-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'warning',\n title: 'listColumn.hasEnvConfigWarningTitle' | translate,\n message: 'listColumn.hasEnvConfigWarning' | translate,\n showClose: false,\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2 pt-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'listColumn.noConfigWarningTitle' | translate,\n message: 'listColumn.noConfigWarning' | translate,\n showClose: false,\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #createEditModal>\n <cds-modal\n valtimoCdsModal\n *ngIf=\"{\n type: currentModalType$ | async,\n show: showModal$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async,\n validKey: validKey$ | async,\n disableDefaultSort: disableDefaultSort$ | async,\n showEnum: showEnum$ | async,\n isYesNo: isYesNo$ | async,\n } as modalObs\"\n [open]=\"modalObs.show\"\n >\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('listColumn.addButtonText' | translate)\n : ('listColumn.editColumnTitle' | translate)\n }}\n </h3>\n </cds-modal-header>\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </cds-modal>\n</ng-template>\n\n<ng-template #modalContent let-modalObs=\"modalObs\">\n <form [formGroup]=\"formGroup\" class=\"list-column-form\">\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.titleTitle' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.titleTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"title\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label\n [disabled]=\"modalObs.disableInput || modalObs.type === 'edit'\"\n [invalid]=\"modalObs.validKey === false\"\n [invalidText]=\"'listColumn.uniqueKeyWarning' | translate\"\n >\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.key' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.keyTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.path' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.pathTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <valtimo-value-path-selector\n formControlName=\"path\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n ></valtimo-value-path-selector>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.displayType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.displayTypeTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"displayType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"viewTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"showDateFormat$ | async\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.dateFormat' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.dateFormatTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"dateFormat\" />\n </cds-label>\n </div>\n <div\n class=\"cds--text-input__field-wrapper\"\n *ngIf=\"modalObs.showEnum || modalObs.isYesNo\"\n [ngClass]=\"{'no-margin': modalObs.isYesNo}\"\n >\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{\n modalObs.isYesNo\n ? ('listColumn.enumTitleOptional' | translate)\n : ('listColumn.enumTitle' | translate)\n }}\n <v-tooltip-icon\n [tooltip]=\"\n modalObs.isYesNo\n ? ('listColumn.enumTooltipOptional' | translate)\n : ('listColumn.enumTooltip' | translate)\n \"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <valtimo-carbon-multi-input\n *ngIf=\"(showModal$ | async) || (modalShowing$ | async)\"\n type=\"keyValue\"\n (valueChange)=\"enumValueChange($event)\"\n [defaultValues]=\"defaultEnumValues$ | async\"\n [hideAddButton]=\"modalObs.isYesNo\"\n [hideDeleteButton]=\"modalObs.isYesNo\"\n [maxRows]=\"modalObs.isYesNo ? 1 : null\"\n [keyColumnTitle]=\"modalObs.isYesNo && ('viewTypeConverter.Yes' | translate)\"\n [valueColumnTitle]=\"modalObs.isYesNo && ('viewTypeConverter.No' | translate)\"\n ></valtimo-carbon-multi-input>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-checkbox formControlName=\"sortable\"\n >{{ 'listColumn.sortable' | translate }}\n </cds-checkbox>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.defaultSortTitle' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.defaultSortTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown\n formControlName=\"defaultSort\"\n [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\"\n >\n <cds-dropdown-list [items]=\"sortItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <cds-modal-footer>\n <ng-container>\n <button\n cdsButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'listColumn.close' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n [attr.modal-primary-focus]=\"true\"\n [disabled]=\"modalObs.valid === false\"\n (click)=\"saveCasListColumns()\"\n [disabled]=\"\n modalObs.disableInput || modalObs.valid === false || modalObs.validKey === false\n \"\n >\n {{ 'listColumn.save' | translate }}\n </button>\n </ng-container>\n </cds-modal-footer>\n</ng-template>\n\n<ng-template #deleteModal>\n <valtimo-confirmation-modal\n [showModalSubject$]=\"showDeleteModal$\"\n [outputOnConfirm]=\"deleteRowKey$ | async\"\n (confirmEvent)=\"deleteRowConfirmation($event)\"\n confirmButtonTextTranslationKey=\"listColumn.deleteColumn\"\n titleTranslationKey=\"listColumn.deleteColumn\"\n contentTranslationKey=\"listColumn.deleteColumnConfirmation\"\n ></valtimo-confirmation-modal>\n</ng-template>\n", styles: ["::ng-deep .tab-container{min-height:unset!important}::ng-deep .cds--inline-notification{max-width:100%}.label-with-tooltip{display:flex;align-items:center}.cds--text-input__field-wrapper:not(:last-child){margin-bottom:1rem}.no-margin{margin-bottom:0!important}.display-type-dropdown{width:300px}.list-column-form{margin-bottom:3rem}.select-label{padding-bottom:.5rem;width:250px}.center-link{display:flex;align-items:center}.dossier-list-columns__actions{display:flex;gap:8px}.list-columns__buttons{display:flex;gap:16px;flex-direction:row;justify-content:flex-end}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
460
+ args: [{ selector: 'valtimo-dossier-management-list-columns', template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n caseListColumn: translatedCaseListColumns$ | async,\n documentDefinitionName: documentDefinitionName$ | async,\n hasEnvironmentConfig: hasEnvironmentConfig$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n loadingCaseListColumns: loadingCaseListColumns$ | async,\n } as obs\"\n>\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"createEditModal\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"deleteModal\"></ng-container>\n</ng-container>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-carbon-list\n [actionItems]=\"actionItems\"\n [loading]=\"obs.loadingCaseListColumns\"\n [items]=\"obs.caseListColumn\"\n [fields]=\"fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n [movingRowsEnabled]=\"true\"\n (moveRow)=\"onMoveRowEvent($event, obs.documentDefinitionName)\"\n (rowClicked)=\"columnRowClicked($event)\"\n >\n <ng-container\n carbonToolbarContent\n *ngTemplateOutlet=\"buttons; context: {obs: obs}\"\n ></ng-container>\n\n <valtimo-no-results\n *ngIf=\"!obs.hasEnvironmentConfig\"\n [title]=\"'listColumn.noConfigWarningTitle' | translate\"\n [description]=\"'listColumn.noConfigWarning' | translate\"\n illustration=\"valtimo-layout/img/emptystate-empty.svg\"\n ></valtimo-no-results>\n\n <valtimo-no-results\n *ngIf=\"obs.hasEnvironmentConfig\"\n [title]=\"'listColumn.hasEnvConfigWarningTitle' | translate\"\n [description]=\"'listColumn.hasEnvConfigWarning' | translate\"\n illustration=\"valtimo-layout/img/emptystate-error.svg\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n</ng-template>\n\n<ng-template #buttons let-obs=\"obs\">\n <button\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [disabled]=\"\n obs.hasEnvironmentConfig ||\n !obs.downloadUrl ||\n !obs.downloadName ||\n obs.caseListColumn?.length < 1 ||\n obs.disableInput ||\n loadingCaseListColumns\n \"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"download\" size=\"16\"></svg>\n </button>\n\n <button\n (click)=\"openModal('create')\"\n cdsButton=\"primary\"\n [disabled]=\"obs.hasEnvironmentConfig || loadingCaseListColumns\"\n >\n {{ 'listColumn.addButtonText' | translate }}\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<ng-template #environmentConfigWarning>\n <div class=\"pl-2 pr-2 pb-2 pt-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'warning',\n title: 'listColumn.hasEnvConfigWarningTitle' | translate,\n message: 'listColumn.hasEnvConfigWarning' | translate,\n showClose: false,\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2 pt-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'listColumn.noConfigWarningTitle' | translate,\n message: 'listColumn.noConfigWarning' | translate,\n showClose: false,\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #createEditModal>\n <cds-modal\n valtimoCdsModal\n *ngIf=\"{\n type: currentModalType$ | async,\n show: showModal$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async,\n validKey: validKey$ | async,\n disableDefaultSort: disableDefaultSort$ | async,\n showEnum: showEnum$ | async,\n isYesNo: isYesNo$ | async,\n } as modalObs\"\n [open]=\"modalObs.show\"\n size=\"sm\"\n >\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('listColumn.addButtonText' | translate)\n : ('listColumn.editColumnTitle' | translate)\n }}\n </h3>\n </cds-modal-header>\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </cds-modal>\n</ng-template>\n\n<ng-template #modalContent let-modalObs=\"modalObs\">\n <form [formGroup]=\"formGroup\" class=\"list-column-form\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.titleTitle' | translate }}\n\n <v-tooltip-icon\n [tooltip]=\"'listColumn.titleTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <input cdsText formControlName=\"title\" />\n </cds-label>\n\n <cds-label\n [disabled]=\"modalObs.disableInput || modalObs.type === 'edit'\"\n [invalid]=\"modalObs.validKey === false\"\n [invalidText]=\"'listColumn.uniqueKeyWarning' | translate\"\n >\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.key' | translate }}\n\n <v-tooltip-icon\n [tooltip]=\"'listColumn.keyTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <input cdsText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </cds-label>\n\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.path' | translate }}\n\n <v-tooltip-icon\n [tooltip]=\"'listColumn.pathTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <valtimo-value-path-selector\n formControlName=\"path\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n ></valtimo-value-path-selector>\n </cds-label>\n\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.displayType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.displayTypeTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <cds-dropdown formControlName=\"displayType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"viewTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n\n <cds-label *ngIf=\"showDateFormat$ | async\" [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.dateFormat' | translate }}\n\n <v-tooltip-icon\n [tooltip]=\"'listColumn.dateFormatTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <input cdsText formControlName=\"dateFormat\" />\n </cds-label>\n\n <cds-label *ngIf=\"modalObs.showEnum || modalObs.isYesNo\" [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{\n modalObs.isYesNo\n ? ('listColumn.enumTitleOptional' | translate)\n : ('listColumn.enumTitle' | translate)\n }}\n\n <v-tooltip-icon\n [tooltip]=\"\n modalObs.isYesNo\n ? ('listColumn.enumTooltipOptional' | translate)\n : ('listColumn.enumTooltip' | translate)\n \"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <valtimo-carbon-multi-input\n *ngIf=\"(showModal$ | async) || (modalShowing$ | async)\"\n type=\"keyValue\"\n (valueChange)=\"enumValueChange($event)\"\n [defaultValues]=\"defaultEnumValues$ | async\"\n [hideAddButton]=\"modalObs.isYesNo\"\n [hideDeleteButton]=\"modalObs.isYesNo\"\n [maxRows]=\"modalObs.isYesNo ? 1 : null\"\n [keyColumnTitle]=\"modalObs.isYesNo && ('viewTypeConverter.Yes' | translate)\"\n [valueColumnTitle]=\"modalObs.isYesNo && ('viewTypeConverter.No' | translate)\"\n ></valtimo-carbon-multi-input>\n </cds-label>\n\n <cds-checkbox formControlName=\"sortable\">{{ 'listColumn.sortable' | translate }} </cds-checkbox>\n\n <cds-label [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.defaultSortTitle' | translate }}\n\n <v-tooltip-icon\n [tooltip]=\"'listColumn.defaultSortTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n\n <cds-dropdown\n formControlName=\"defaultSort\"\n [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\"\n >\n <cds-dropdown-list [items]=\"sortItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <cds-modal-footer>\n <ng-container>\n <button\n cdsButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'listColumn.close' | translate }}\n </button>\n\n <button\n cdsButton=\"primary\"\n [attr.modal-primary-focus]=\"true\"\n [disabled]=\"modalObs.valid === false\"\n (click)=\"saveCasListColumns()\"\n [disabled]=\"\n modalObs.disableInput || modalObs.valid === false || modalObs.validKey === false\n \"\n >\n {{ 'listColumn.save' | translate }}\n </button>\n </ng-container>\n </cds-modal-footer>\n</ng-template>\n\n<ng-template #deleteModal>\n <valtimo-confirmation-modal\n [showModalSubject$]=\"showDeleteModal$\"\n [outputOnConfirm]=\"deleteRowKey$ | async\"\n (confirmEvent)=\"deleteRowConfirmation($event)\"\n confirmButtonTextTranslationKey=\"listColumn.deleteColumn\"\n titleTranslationKey=\"listColumn.deleteColumn\"\n contentTranslationKey=\"listColumn.deleteColumnConfirmation\"\n ></valtimo-confirmation-modal>\n</ng-template>\n", styles: ["::ng-deep .tab-container{min-height:unset!important}::ng-deep .cds--inline-notification{max-width:100%}::ng-deep .cds--label{width:100%}.label-with-tooltip{display:flex;align-items:center}.display-type-dropdown{width:300px}.list-column-form{display:flex;flex-direction:column;gap:16px;margin-bottom:3rem}.select-label{padding-bottom:.5rem;width:250px}.center-link{display:flex;align-items:center}.dossier-list-columns__actions{display:flex;gap:8px}.list-columns__buttons{display:flex;gap:16px;flex-direction:row;justify-content:flex-end}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
461
461
  }], ctorParameters: () => [{ type: i1.DocumentService }, { type: i2.ActivatedRoute }, { type: i3.TranslateService }, { type: i4.ConfigService }, { type: i5.DomSanitizer }, { type: i6.IconService }] });
462
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2Rvc3NpZXItbWFuYWdlbWVudC9zcmMvbGliL2NvbXBvbmVudHMvZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci1tYW5hZ2VtZW50L3NyYy9saWIvY29tcG9uZW50cy9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zL2Rvc3NpZXItbWFuYWdlbWVudC1saXN0LWNvbHVtbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxPQUFPLEVBQWdCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUdsRSxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVyRCxPQUFPLEVBR0wsZ0JBQWdCLEVBR2hCLHVCQUF1QixFQUN2QixRQUFRLEdBQ1QsTUFBTSxxQkFBcUIsQ0FBQztBQVU3QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixLQUFLLEVBQ0wsTUFBTSxFQUNOLEdBQUcsRUFFSCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBUXBDLE1BQU0sT0FBTyxxQ0FBcUM7SUEwUmhELFlBQ21CLGVBQWdDLEVBQ2hDLEtB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Q0UseUNBQXlDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjQgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtEb21TYW5pdGl6ZXIsIFNhZmVVcmx9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7QXJyb3dEb3duMTYsIEFycm93VXAxNn0gZnJvbSAnQGNhcmJvbi9pY29ucyc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWN0aW9uSXRlbSxcbiAgQ29sdW1uQ29uZmlnLFxuICBNb3ZlUm93RGlyZWN0aW9uLFxuICBNb3ZlUm93RXZlbnQsXG4gIE11bHRpSW5wdXRWYWx1ZXMsXG4gIFZhbHVlUGF0aFNlbGVjdG9yUHJlZml4LFxuICBWaWV3VHlwZSxcbn0gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge0NvbmZpZ1NlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5pbXBvcnQge1xuICBDYXNlTGlzdENvbHVtbixcbiAgQ2FzZUxpc3RDb2x1bW5WaWV3LFxuICBEaXNwbGF5VHlwZVBhcmFtZXRlcnMsXG4gIERvY3VtZW50U2VydmljZSxcbn0gZnJvbSAnQHZhbHRpbW8vZG9jdW1lbnQnO1xuaW1wb3J0IHtJY29uU2VydmljZX0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG5pbXBvcnQge0xpc3RJdGVtfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL2Ryb3Bkb3duL2xpc3QtaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkZWxheSxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHt0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0xpc3RDb2x1bW5Nb2RhbH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsdGltby1kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rvc3NpZXItbWFuYWdlbWVudC1saXN0LWNvbHVtbnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIERvc3NpZXJNYW5hZ2VtZW50TGlzdENvbHVtbnNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgcmVhZG9ubHkgZG93bmxvYWROYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGRvd25sb2FkVXJsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2FmZVVybD4odW5kZWZpbmVkKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgYWN0aW9uSXRlbXM6IEFjdGlvbkl0ZW1bXSA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogJ2ludGVyZmFjZS5kZWxldGUnLFxuICAgICAgY2FsbGJhY2s6IHRoaXMuZGVsZXRlUm93LmJpbmQodGhpcyksXG4gICAgICB0eXBlOiAnZGFuZ2VyJyxcbiAgICB9LFxuICBdO1xuICBwdWJsaWMgcmVhZG9ubHkgbG9hZGluZ0Nhc2VMaXN0Q29sdW1ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuXG4gIHB1YmxpYyByZWFkb25seSBsYXN0SXRlbUluZGV4JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigtMSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGZpZWxkczogQXJyYXk8Q29sdW1uQ29uZmlnPiA9IFtcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBrZXk6ICd0aXRsZScsXG4gICAgICBsYWJlbDogJ2xpc3RDb2x1bW4udGl0bGUnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAga2V5OiAna2V5JyxcbiAgICAgIGxhYmVsOiAnbGlzdENvbHVtbi5rZXknLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAga2V5OiAncGF0aCcsXG4gICAgICBsYWJlbDogJ2xpc3RDb2x1bW4ucGF0aCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBrZXk6ICdkaXNwbGF5VHlwZScsXG4gICAgICBsYWJlbDogJ2xpc3RDb2x1bW4uZGlzcGxheVR5cGUnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAga2V5OiAnZGlzcGxheVR5cGVQYXJhbWV0ZXJzJyxcbiAgICAgIGxhYmVsOiAnbGlzdENvbHVtbi5kaXNwbGF5VHlwZVBhcmFtZXRlcnMnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAga2V5OiAnc29ydGFibGUnLFxuICAgICAgbGFiZWw6ICdsaXN0Q29sdW1uLnNvcnRhYmxlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIGtleTogJ2RlZmF1bHRTb3J0JyxcbiAgICAgIGxhYmVsOiAnbGlzdENvbHVtbi5kZWZhdWx0U29ydCcsXG4gICAgfSxcbiAgXTtcblxuICByZWFkb25seSBkb2N1bWVudERlZmluaXRpb25OYW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShcbiAgICBtYXAocGFyYW1zID0+IHBhcmFtcy5uYW1lIHx8ICcnKSxcbiAgICBmaWx0ZXIoZG9jRGVmTmFtZSA9PiAhIWRvY0RlZk5hbWUpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGlzYWJsZUlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHJlYWRvbmx5IGhhc0Vudmlyb25tZW50Q29uZmlnJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZShcbiAgICBtYXAoXG4gICAgICBkb2N1bWVudERlZmluaXRpb25OYW1lID0+XG4gICAgICAgICEhdGhpcy5jb25maWdTZXJ2aWNlPy5jb25maWc/LmN1c3RvbURlZmluaXRpb25UYWJsZXNbZG9jdW1lbnREZWZpbml0aW9uTmFtZV1cbiAgICApXG4gICk7XG5cbiAgcHJpdmF0ZSBjYWNoZWRDYXNlTGlzdENvbHVtbnM6IEFycmF5PENhc2VMaXN0Q29sdW1uPiA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaENhc2VMaXN0Y29sdW1ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bGw+KG51bGwpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FzZUxpc3RDb2x1bW5zJDogT2JzZXJ2YWJsZTxBcnJheTxDYXNlTGlzdENvbHVtbj4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJCxcbiAgICB0aGlzLnJlZnJlc2hDYXNlTGlzdGNvbHVtbnMkLFxuICBdKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoW2RvY3VtZW50RGVmaW5pdGlvbk5hbWVdKSA9PlxuICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0Q2FzZUxpc3RGb3JNYW5hZ2VtZW50KGRvY3VtZW50RGVmaW5pdGlvbk5hbWUpXG4gICAgKSxcbiAgICB0YXAoY2FzZUxpc3RDb2x1bW5zID0+IHtcbiAgICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PiB7XG4gICAgICAgIGlmIChjYXNlTGlzdENvbHVtbnMgJiYgQXJyYXkuaXNBcnJheShjYXNlTGlzdENvbHVtbnMpICYmIGNhc2VMaXN0Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXREb3dubG9hZChkb2N1bWVudERlZmluaXRpb25OYW1lLCBjYXNlTGlzdENvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KSxcbiAgICB0YXAoY2FzZUxpc3RDb2x1bW5zID0+IHtcbiAgICAgIHRoaXMubGFzdEl0ZW1JbmRleCQubmV4dChjYXNlTGlzdENvbHVtbnMubGVuZ3RoIC0gMSk7XG4gICAgICB0aGlzLmNhY2hlZENhc2VMaXN0Q29sdW1ucyA9IGNhc2VMaXN0Q29sdW1ucztcbiAgICAgIHRoaXMubG9hZGluZ0Nhc2VMaXN0Q29sdW1ucyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgfSlcbiAgKTtcblxuICByZWFkb25seSB0cmFuc2xhdGVkQ2FzZUxpc3RDb2x1bW5zJDogT2JzZXJ2YWJsZTxBcnJheTxDYXNlTGlzdENvbHVtblZpZXc+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY2FzZUxpc3RDb2x1bW5zJCxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtjb2x1bW5zXSkgPT5cbiAgICAgIGNvbHVtbnMubWFwKGNvbHVtbiA9PiAoe1xuICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgIHRpdGxlOiBjb2x1bW4udGl0bGUgfHwgJy0nLFxuICAgICAgICBzb3J0YWJsZTogY29sdW1uLnNvcnRhYmxlXG4gICAgICAgICAgPyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZVllcycpXG4gICAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZU5vJyksXG4gICAgICAgIGRlZmF1bHRTb3J0OlxuICAgICAgICAgIChjb2x1bW4uZGVmYXVsdFNvcnQgPT09ICdBU0MnICYmXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZUFzYycpKSB8fFxuICAgICAgICAgIChjb2x1bW4uZGVmYXVsdFNvcnQgPT09ICdERVNDJyAmJlxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2xpc3RDb2x1bW4uc29ydGFibGVEZXNjJykpIHx8XG4gICAgICAgICAgJy0nLFxuICAgICAgICBkaXNwbGF5VHlwZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgYGxpc3RDb2x1bW5EaXNwbGF5VHlwZS4ke2NvbHVtbj8uZGlzcGxheVR5cGU/LnR5cGV9YFxuICAgICAgICApLFxuICAgICAgICBkaXNwbGF5VHlwZVBhcmFtZXRlcnM6IHRoaXMuZ2V0RGlzcGxheVR5cGVQYXJhbWV0ZXJzVmlldyhcbiAgICAgICAgICBjb2x1bW4uZGlzcGxheVR5cGUuZGlzcGxheVR5cGVQYXJhbWV0ZXJzXG4gICAgICAgICksXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudE1vZGFsVHlwZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PExpc3RDb2x1bW5Nb2RhbD4oJ2NyZWF0ZScpO1xuXG4gIHJlYWRvbmx5IHNob3dNb2RhbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSBtb2RhbFNob3dpbmckID0gdGhpcy5zaG93TW9kYWwkLnBpcGUoZGVsYXkoMjUwKSk7XG5cbiAgcmVhZG9ubHkgSU5WQUxJRF9LRVkgPSAnaW52YWxpZCc7XG5cbiAgcmVhZG9ubHkgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgdGl0bGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAga2V5OiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIHBhdGg6IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgZGF0ZUZvcm1hdDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBkaXNwbGF5VHlwZTogbmV3IEZvcm1Db250cm9sKHtcbiAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICB9KSxcbiAgICBzb3J0YWJsZTogbmV3IEZvcm1Db250cm9sKGZhbHNlKSxcbiAgICBkZWZhdWx0U29ydDogbmV3IEZvcm1Db250cm9sKHtcbiAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICB9KSxcbiAgICBlbnVtOiBuZXcgRm9ybUNvbnRyb2woW10pLFxuICB9KTtcblxuICByZWFkb25seSBkaXNhYmxlRGVmYXVsdFNvcnQkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5jdXJyZW50TW9kYWxUeXBlJCxcbiAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMsXG4gIF0pLnBpcGUoXG4gICAgbWFwKFxuICAgICAgKFtjdXJyZW50TW9kYWxUeXBlXSkgPT5cbiAgICAgICAgY3VycmVudE1vZGFsVHlwZSA9PT0gJ2NyZWF0ZScgJiZcbiAgICAgICAgdGhpcy5jYWNoZWRDYXNlTGlzdENvbHVtbnMuZmluZChjb2x1bW4gPT4gISFjb2x1bW4uZGVmYXVsdFNvcnQpXG4gICAgKSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgRElTUExBWV9UWVBFUzogQXJyYXk8Vmlld1R5cGU+ID0gW1xuICAgIFZpZXdUeXBlLlRFWFQsXG4gICAgVmlld1R5cGUuREFURSxcbiAgICBWaWV3VHlwZS5CT09MRUFOLFxuICAgIFZpZXdUeXBlLkVOVU0sXG4gICAgVmlld1R5cGUuQVJSQVlfQ09VTlQsXG4gICAgVmlld1R5cGUuVU5ERVJTQ09SRVNfVE9fU1BBQ0VTLFxuICAgIFZpZXdUeXBlLlRBR1MsXG4gIF07XG5cbiAgcmVhZG9ubHkgc2hvd0RhdGVGb3JtYXQkID0gdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgbWFwKGZvcm1WYWx1ZXMgPT4gISEoZm9ybVZhbHVlcy5kaXNwbGF5VHlwZT8ua2V5ID09PSB0aGlzLkRJU1BMQVlfVFlQRVNbMV0pKSxcbiAgICB0YXAoc2hvd0RhdGVGb3JtYXQgPT4ge1xuICAgICAgaWYgKHNob3dEYXRlRm9ybWF0ID09PSBmYWxzZSAmJiAhIXRoaXMuZm9ybUdyb3VwLnZhbHVlLmRhdGVGb3JtYXQpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7ZGF0ZUZvcm1hdDogJyd9KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd0VudW0kID0gdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgbWFwKFxuICAgICAgZm9ybVZhbHVlcyA9PlxuICAgICAgICAhIShcbiAgICAgICAgICBmb3JtVmFsdWVzLmRpc3BsYXlUeXBlPy5rZXkgPT09IHRoaXMuRElTUExBWV9UWVBFU1szXSB8fFxuICAgICAgICAgIGZvcm1WYWx1ZXMuZGlzcGxheVR5cGU/LmtleSA9PT0gdGhpcy5ESVNQTEFZX1RZUEVTWzJdXG4gICAgICAgIClcbiAgICApLFxuICAgIHRhcChzaG93RW51bSA9PiB7XG4gICAgICBjb25zdCBlbnVtVmFsdWUgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZS5lbnVtO1xuICAgICAgaWYgKHNob3dFbnVtID09PSBmYWxzZSAmJiBBcnJheS5pc0FycmF5KGVudW1WYWx1ZSkgJiYgZW51bVZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7ZW51bTogW119KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNZZXNObyQgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICBtYXAoZm9ybVZhbHVlcyA9PiAhIShmb3JtVmFsdWVzLmRpc3BsYXlUeXBlPy5rZXkgPT09IHRoaXMuRElTUExBWV9UWVBFU1syXSkpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRWaWV3VHlwZUl0ZW1JbmRleCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG5cbiAgcmVhZG9ubHkgdmlld1R5cGVJdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8TGlzdEl0ZW0+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuc2VsZWN0ZWRWaWV3VHlwZUl0ZW1JbmRleCQsXG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JyksXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbc2VsZWN0ZWRWaWV3VHlwZUl0ZW1JbmRleF0pID0+XG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbkRpc3BsYXlUeXBlLnNlbGVjdGApLFxuICAgICAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4udGhpcy5ESVNQTEFZX1RZUEVTLm1hcCh0eXBlID0+ICh7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYGxpc3RDb2x1bW5EaXNwbGF5VHlwZS4ke3R5cGV9YCksXG4gICAgICAgICAga2V5OiB0eXBlLFxuICAgICAgICB9KSksXG4gICAgICBdLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XG4gICAgICAgIC4uLml0ZW0sXG4gICAgICAgIHNlbGVjdGVkOiBpbmRleCA9PT0gc2VsZWN0ZWRWaWV3VHlwZUl0ZW1JbmRleCxcbiAgICAgIH0pKVxuICAgIClcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZFNvcnRJdGVtSW5kZXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuXG4gIHJlYWRvbmx5IHNvcnRJdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8TGlzdEl0ZW0+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuc2VsZWN0ZWRTb3J0SXRlbUluZGV4JCxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtzZWxlY3RlZFNvcnRJdGVtSW5kZXhdKSA9PlxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYGxpc3RDb2x1bW4uc2VsZWN0RGVmYXVsdFNvcnRgKSxcbiAgICAgICAgICBrZXk6IHRoaXMuSU5WQUxJRF9LRVksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbi5zb3J0YWJsZUFzY2ApLFxuICAgICAgICAgIGtleTogJ0FTQycsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbi5zb3J0YWJsZURlc2NgKSxcbiAgICAgICAgICBrZXk6ICdERVNDJyxcbiAgICAgICAgfSxcbiAgICAgIF0ubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgc2VsZWN0ZWQ6IGluZGV4ID09PSBzZWxlY3RlZFNvcnRJdGVtSW5kZXgsXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgdmFsaWRLZXkkID0gY29tYmluZUxhdGVzdChbdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLCB0aGlzLmN1cnJlbnRNb2RhbFR5cGUkXSkucGlwZShcbiAgICBtYXAoKFtmb3JtVmFsdWVzLCBjdXJyZW50TW9kYWxUeXBlXSkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdLZXlzID0gdGhpcy5jYWNoZWRDYXNlTGlzdENvbHVtbnMubWFwKGNvbHVtbiA9PiBjb2x1bW4ua2V5KTtcbiAgICAgIHJldHVybiBjdXJyZW50TW9kYWxUeXBlID09PSAnY3JlYXRlJyA/ICFleGlzdGluZ0tleXMuaW5jbHVkZXMoZm9ybVZhbHVlcy5rZXkpIDogdHJ1ZTtcbiAgICB9KSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgdmFsaWQkID0gY29tYmluZUxhdGVzdChbdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLCB0aGlzLnZhbGlkS2V5JF0pLnBpcGUoXG4gICAgbWFwKFxuICAgICAgKFtmb3JtVmFsdWVzLCB2YWxpZEtleV0pID0+XG4gICAgICAgICEhKFxuICAgICAgICAgIGZvcm1WYWx1ZXMuZGlzcGxheVR5cGU/LmtleSAhPT0gdGhpcy5JTlZBTElEX0tFWSAmJlxuICAgICAgICAgIGZvcm1WYWx1ZXMucGF0aCAmJlxuICAgICAgICAgIHZhbGlkS2V5ICYmXG4gICAgICAgICAgKGZvcm1WYWx1ZXMuZGlzcGxheVR5cGUua2V5ID09PSAnZW51bScgPyBmb3JtVmFsdWVzLmVudW0/Lmxlbmd0aCA+IDAgOiB0cnVlKVxuICAgICAgICApXG4gICAgKSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd0RlbGV0ZU1vZGFsJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgcmVhZG9ubHkgZGVsZXRlUm93S2V5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG5cbiAgcmVhZG9ubHkgZGVmYXVsdEVudW1WYWx1ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNdWx0aUlucHV0VmFsdWVzPih1bmRlZmluZWQpO1xuXG4gIHB1YmxpYyByZWFkb25seSBWYWx1ZVBhdGhTZWxlY3RvclByZWZpeCA9IFZhbHVlUGF0aFNlbGVjdG9yUHJlZml4O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRTZXJ2aWNlOiBEb2N1bWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvblNlcnZpY2U6IEljb25TZXJ2aWNlXG4gICkge31cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaWNvblNlcnZpY2UucmVnaXN0ZXJBbGwoW0Fycm93RG93bjE2LCBBcnJvd1VwMTZdKTtcbiAgfVxuXG4gIG9wZW5Nb2RhbChtb2RhbFR5cGU6IExpc3RDb2x1bW5Nb2RhbCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd01vZGFsJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuY3VycmVudE1vZGFsVHlwZSQubmV4dChtb2RhbFR5cGUpO1xuXG4gICAgaWYgKG1vZGFsVHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzWydrZXknXS5lbmFibGUoKTtcbiAgICAgIHRoaXMucmVzZXRGb3JtR3JvdXAoKTtcbiAgICB9IGVsc2UgaWYgKG1vZGFsVHlwZSA9PT0gJ2VkaXQnKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1sna2V5J10uZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TW9kYWwkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgZGVsZXRlUm93KGNhc2VMaXN0Q29sdW1uOiBDYXNlTGlzdENvbHVtbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0RlbGV0ZU1vZGFsJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVsZXRlUm93S2V5JC5uZXh0KGNhc2VMaXN0Q29sdW1uLmtleSk7XG4gIH1cblxuICBkZWxldGVSb3dDb25maXJtYXRpb24oY29sdW1uS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoY29sdW1uS2V5KSB7XG4gICAgICB0aGlzLmRpc2FibGVJbnB1dCgpO1xuXG4gICAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGRvY0RlZk5hbWUgPT4ge1xuICAgICAgICB0aGlzLmRvY3VtZW50U2VydmljZS5kZWxldGVDYXNlTGlzdEZvck1hbmFnZW1lbnQoZG9jRGVmTmFtZSwgY29sdW1uS2V5KS5zdWJzY3JpYmUoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2FzZUxpc3RDb2x1bW5zKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25Nb3ZlUm93RXZlbnQoZXZlbnQ6IE1vdmVSb3dFdmVudCwgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2FzZUxpc3RDb2x1bW5zID0gWy4uLnRoaXMuY2FjaGVkQ2FzZUxpc3RDb2x1bW5zXTtcbiAgICBjb25zdCBjYXNlTGlzdENvbHVtblJvdyA9IGNhc2VMaXN0Q29sdW1uc1tldmVudC5pbmRleF07XG4gICAgY29uc3QgbW92ZVVwOiBib29sZWFuID0gZXZlbnQuZGlyZWN0aW9uID09PSBNb3ZlUm93RGlyZWN0aW9uLlVQO1xuXG4gICAgY29uc3QgY2FzZUxpc3RDb2x1bW5JbmRleCA9IGNhc2VMaXN0Q29sdW1ucy5maW5kSW5kZXgoXG4gICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IGNhc2VMaXN0Q29sdW1uUm93LmtleVxuICAgICk7XG4gICAgY29uc3QgZm91bmRDYXNlTGlzdENvbHVtbiA9IHsuLi5jYXNlTGlzdENvbHVtbnNbY2FzZUxpc3RDb2x1bW5JbmRleF19O1xuICAgIGNvbnN0IGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zID0gY2FzZUxpc3RDb2x1bW5zLmZpbHRlcihcbiAgICAgIGZpZWxkID0+IGZpZWxkLmtleSAhPT0gY2FzZUxpc3RDb2x1bW5Sb3cua2V5XG4gICAgKTtcbiAgICBjb25zdCBtdWx0aXBsZUNhc2VMaXN0Q29sdW1ucyA9IGNhc2VMaXN0Q29sdW1ucy5sZW5ndGggPiAxO1xuXG4gICAgaWYgKG11bHRpcGxlQ2FzZUxpc3RDb2x1bW5zICYmIG1vdmVVcCAmJiBjYXNlTGlzdENvbHVtbkluZGV4ID4gMCkge1xuICAgICAgY29uc3QgY2FzZUxpc3RDb2x1bW5CZWZvcmVLZXkgPSBgJHtjYXNlTGlzdENvbHVtbnNbY2FzZUxpc3RDb2x1bW5JbmRleCAtIDFdLmtleX1gO1xuICAgICAgY29uc3QgY2FzZUxpc3RDb2x1bW5CZWZvcmVJbmRleCA9IGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zLmZpbmRJbmRleChcbiAgICAgICAgZmllbGQgPT4gZmllbGQua2V5ID09PSBjYXNlTGlzdENvbHVtbkJlZm9yZUtleVxuICAgICAgKTtcbiAgICAgIGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zLnNwbGljZShjYXNlTGlzdENvbHVtbkJlZm9yZUluZGV4LCAwLCBmb3VuZENhc2VMaXN0Q29sdW1uKTtcbiAgICAgIHRoaXMudXBkYXRlQ2FzZUxpc3RDb2x1bW5zKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsIGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zKTtcbiAgICB9IGVsc2UgaWYgKG11bHRpcGxlQ2FzZUxpc3RDb2x1bW5zICYmICFtb3ZlVXAgJiYgY2FzZUxpc3RDb2x1bW5JbmRleCA8IGNhc2VMaXN0Q29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNhc2VMaXN0Q29sdW1uQWZ0ZXJLZXkgPSBgJHtjYXNlTGlzdENvbHVtbnNbY2FzZUxpc3RDb2x1bW5JbmRleCArIDFdLmtleX1gO1xuICAgICAgY29uc3QgY2FzZUxpc3RDb2x1bW5BZnRlckluZGV4ID0gZmlsdGVyZWRDYXNlTGlzdENvbHVtbnMuZmluZEluZGV4KFxuICAgICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IGNhc2VMaXN0Q29sdW1uQWZ0ZXJLZXlcbiAgICAgICk7XG4gICAgICBmaWx0ZXJlZENhc2VMaXN0Q29sdW1ucy5zcGxpY2UoY2FzZUxpc3RDb2x1bW5BZnRlckluZGV4ICsgMSwgMCwgZm91bmRDYXNlTGlzdENvbHVtbik7XG4gICAgICB0aGlzLnVwZGF0ZUNhc2VMaXN0Q29sdW1ucyhkb2N1bWVudERlZmluaXRpb25OYW1lLCBmaWx0ZXJlZENhc2VMaXN0Q29sdW1ucyk7XG4gICAgfVxuICB9XG5cbiAgc2F2ZUNhc0xpc3RDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb2RhbFR5cGUkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGN1cnJlbnRNb2RhbFR5cGUgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnKSB7XG4gICAgICAgIHRoaXMuYWRkQ29sdW1uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZW51bVZhbHVlQ2hhbmdlKHZhbHVlOiBBcnJheTx7W2tleTogc3RyaW5nXTogc3RyaW5nfT4pOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtlbnVtOiB2YWx1ZX0pO1xuICB9XG5cbiAgY29sdW1uUm93Q2xpY2tlZChyb3c6IHtrZXk6IHN0cmluZ30pOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0Rm9ybUdyb3VwKCk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnZpZXdUeXBlSXRlbXMkLCB0aGlzLnNvcnRJdGVtcyRdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFt2aWV3VHlwZUl0ZW1zLCBzb3J0SXRlbXNdKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY2FjaGVkQ2FzZUxpc3RDb2x1bW5zLmZpbmQoXG4gICAgICAgICAgY2FjaGVkQ29sdW1uID0+IGNhY2hlZENvbHVtbi5rZXkgPT09IHJvdy5rZXlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgdmlld1R5cGVJdGVtID0gdmlld1R5cGVJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kaXNwbGF5VHlwZS50eXBlKTtcbiAgICAgICAgY29uc3Qgdmlld1R5cGVJdGVtSW5kZXggPSB2aWV3VHlwZUl0ZW1zLmZpbmRJbmRleChcbiAgICAgICAgICBpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW4uZGlzcGxheVR5cGUudHlwZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzb3J0SXRlbSA9IHNvcnRJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kZWZhdWx0U29ydCk7XG4gICAgICAgIGNvbnN0IHNvcnRJdGVtSW5kZXggPSBzb3J0SXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kZWZhdWx0U29ydCk7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSBjb2x1bW4/LmRpc3BsYXlUeXBlPy5kaXNwbGF5VHlwZVBhcmFtZXRlcnM/LmVudW07XG4gICAgICAgIGNvbnN0IG1hcHBlZEVudW1WYWx1ZXM6IE11bHRpSW5wdXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgY29sdW1uRGF0ZUZvcm1hdCA9IGNvbHVtbj8uZGlzcGxheVR5cGU/LmRpc3BsYXlUeXBlUGFyYW1ldGVycz8uZGF0ZUZvcm1hdDtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkVmlld1R5cGVJdGVtSW5kZXgkLm5leHQodmlld1R5cGVJdGVtSW5kZXgpO1xuXG4gICAgICAgIGlmIChzb3J0SXRlbSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTb3J0SXRlbUluZGV4JC5uZXh0KHNvcnRJdGVtSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudW1WYWx1ZXMpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhlbnVtVmFsdWVzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBtYXBwZWRFbnVtVmFsdWVzLnB1c2goe2tleSwgdmFsdWU6IGVudW1WYWx1ZXNba2V5XX0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGVmYXVsdEVudW1WYWx1ZXMkLm5leHQobWFwcGVkRW51bVZhbHVlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kZWZhdWx0RW51bVZhbHVlcyQubmV4dChbe2tleTogJycsIHZhbHVlOiAnJ31dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe1xuICAgICAgICAgIGtleTogY29sdW1uLmtleSxcbiAgICAgICAgICB0aXRsZTogY29sdW1uLnRpdGxlLFxuICAgICAgICAgIHBhdGg6IGNvbHVtbi5wYXRoLFxuICAgICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGUsXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGRpc3BsYXlUeXBlOiB7Li4udmlld1R5cGVJdGVtfSxcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgZGVmYXVsdFNvcnQ6IHNvcnRJdGVtID8gey4uLnNvcnRJdGVtfSA6IHsuLi5zb3J0SXRlbXNbMF19LFxuICAgICAgICAgIC4uLihjb2x1bW5EYXRlRm9ybWF0ICYmIHtcbiAgICAgICAgICAgIGRhdGVGb3JtYXQ6IGNvbHVtbkRhdGVGb3JtYXQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3Blbk1vZGFsKCdlZGl0Jyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2FzZUxpc3RDb2x1bW5zKFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZyxcbiAgICBuZXdDYXNlTGlzdENvbHVtbnM6IEFycmF5PENhc2VMaXN0Q29sdW1uPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCgpO1xuXG4gICAgdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgIC5wdXRDYXNlTGlzdEZvck1hbmFnZW1lbnQoZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgbmV3Q2FzZUxpc3RDb2x1bW5zKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVmcmVzaENhc2VMaXN0Q29sdW1ucygpO1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBsaXN0LXNlYXJjaC0ke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9YCwgbnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZENvbHVtbigpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZTtcblxuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZG9jRGVmTmFtZSA9PiB7XG4gICAgICB0aGlzLmRvY3VtZW50U2VydmljZVxuICAgICAgICAucG9zdENhc2VMaXN0Rm9yTWFuYWdlbWVudChkb2NEZWZOYW1lLCB0aGlzLm1hcEZvcm1WYWx1ZXNUb0NvbHVtbihmb3JtVmFsdWUpKVxuICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2FzZUxpc3RDb2x1bW5zKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VHlwZVBhcmFtZXRlcnNWaWV3KGRpc3BsYXlUeXBlUGFyYW1ldGVyczogRGlzcGxheVR5cGVQYXJhbWV0ZXJzKTogc3RyaW5nIHtcbiAgICBpZiAoZGlzcGxheVR5cGVQYXJhbWV0ZXJzPy5kYXRlRm9ybWF0KSB7XG4gICAgICByZXR1cm4gZGlzcGxheVR5cGVQYXJhbWV0ZXJzLmRhdGVGb3JtYXQ7XG4gICAgfSBlbHNlIGlmIChkaXNwbGF5VHlwZVBhcmFtZXRlcnM/LmVudW0pIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhkaXNwbGF5VHlwZVBhcmFtZXRlcnMuZW51bSkucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICAgICAgY29uc3Qga2V5VmFsdWVQYWlyU3RyaW5nID0gYCR7Y3Vycn06ICR7ZGlzcGxheVR5cGVQYXJhbWV0ZXJzLmVudW1bY3Vycl19YDtcbiAgICAgICAgaWYgKCFhY2MpIHtcbiAgICAgICAgICByZXR1cm4gYCR7a2V5VmFsdWVQYWlyU3RyaW5nfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7YWNjfSwgJHtrZXlWYWx1ZVBhaXJTdHJpbmd9YDtcbiAgICAgIH0sICcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJy0nO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW4oKTogdm9pZCB7XG4gICAgY29uc3QgdXBkYXRlZENvbHVtbkZvcm1WYWx1ZSA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlO1xuICAgIGNvbnN0IG1hcHBlZFVwZGF0ZWRDb2x1bW4gPSB0aGlzLm1hcEZvcm1WYWx1ZXNUb0NvbHVtbih1cGRhdGVkQ29sdW1uRm9ybVZhbHVlKTtcbiAgICBjb25zdCBjdXJyZW50Q29sdW1ucyA9IHRoaXMuY2FjaGVkQ2FzZUxpc3RDb2x1bW5zO1xuICAgIGNvbnN0IG1hcHBlZEN1cnJlbnRDb2x1bW5zID0gY3VycmVudENvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5Db3B5ID0gey4uLmNvbHVtbn07XG4gICAgICBpZiAoY29sdW1uQ29weS5rZXkgPT09IHVwZGF0ZWRDb2x1bW5Gb3JtVmFsdWUua2V5KSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZWRDb2x1bW4gPSB7Li4uY29sdW1uQ29weSwgLi4ubWFwcGVkVXBkYXRlZENvbHVtbn07XG4gICAgICAgIGlmICghbWFwcGVkVXBkYXRlZENvbHVtbi5kZWZhdWx0U29ydCkge1xuICAgICAgICAgIGRlbGV0ZSBjaGFuZ2VkQ29sdW1uLmRlZmF1bHRTb3J0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VkQ29sdW1uO1xuICAgICAgfVxuICAgICAgaWYgKG1hcHBlZFVwZGF0ZWRDb2x1bW4uZGVmYXVsdFNvcnQpIHtcbiAgICAgICAgZGVsZXRlIGNvbHVtbkNvcHkuZGVmYXVsdFNvcnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sdW1uQ29weTtcbiAgICB9KTtcblxuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZG9jRGVmTmFtZSA9PiB7XG4gICAgICB0aGlzLmRvY3VtZW50U2VydmljZS5wdXRDYXNlTGlzdEZvck1hbmFnZW1lbnQoZG9jRGVmTmFtZSwgbWFwcGVkQ3VycmVudENvbHVtbnMpLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgICAgICAgIHRoaXMucmVmcmVzaENhc2VMaXN0Q29sdW1ucygpO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREb3dubG9hZChcbiAgICBkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcsXG4gICAgY2FzZUxpc3RDb2x1bW5zOiBBcnJheTxDYXNlTGlzdENvbHVtbj5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5kb3dubG9hZE5hbWUkLm5leHQoYCR7ZG9jdW1lbnREZWZpbml0aW9uTmFtZX0uanNvbmApO1xuICAgIHRoaXMuZG93bmxvYWRVcmwkLm5leHQoXG4gICAgICB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKFxuICAgICAgICAnZGF0YTp0ZXh0L2pzb247Y2hhcnNldD1VVEYtOCwnICtcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY2FzZUxpc3RDb2x1bW5zLCBudWxsLCAyKSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5mb3JtR3JvdXAuZGlzYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVJbnB1dCgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5mb3JtR3JvdXAuZW5hYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hDYXNlTGlzdENvbHVtbnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoQ2FzZUxpc3Rjb2x1bW5zJC5uZXh0KG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZvcm1Hcm91cCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5yZXNldCgpO1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuc29ydEl0ZW1zJCwgdGhpcy52aWV3VHlwZUl0ZW1zJF0pXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoW3NvcnRJdGVtcywgdmlld1R5cGVJdGVtc10pID0+IHtcbiAgICAgICAgdGhpcy5kZWZhdWx0RW51bVZhbHVlcyQubmV4dChbe2tleTogJycsIHZhbHVlOiAnJ31dKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4JC5uZXh0KDApO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe2Rpc3BsYXlUeXBlOiB2aWV3VHlwZUl0ZW1zWzBdfSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTb3J0SXRlbUluZGV4JC5uZXh0KDApO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe2RlZmF1bHRTb3J0OiBzb3J0SXRlbXNbMF19KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBGb3JtVmFsdWVzVG9Db2x1bW4oZm9ybVZhbHVlOiBhbnkpOiBDYXNlTGlzdENvbHVtbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogZm9ybVZhbHVlLmtleSxcbiAgICAgIHNvcnRhYmxlOiBmb3JtVmFsdWUuc29ydGFibGUsXG4gICAgICAuLi4oZm9ybVZhbHVlLmRlZmF1bHRTb3J0Py5rZXkgIT09IHRoaXMuSU5WQUxJRF9LRVkgJiYge1xuICAgICAgICBkZWZhdWx0U29ydDogZm9ybVZhbHVlLmRlZmF1bHRTb3J0Py5rZXksXG4gICAgICB9KSxcbiAgICAgIHRpdGxlOiBmb3JtVmFsdWUudGl0bGUgfHwgJycsXG4gICAgICBwYXRoOiBmb3JtVmFsdWUucGF0aCxcbiAgICAgIGRpc3BsYXlUeXBlOiB7XG4gICAgICAgIHR5cGU6IGZvcm1WYWx1ZS5kaXNwbGF5VHlwZT8ua2V5LFxuICAgICAgICBkaXNwbGF5VHlwZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAuLi4oZm9ybVZhbHVlLmRhdGVGb3JtYXQgJiYge2RhdGVGb3JtYXQ6IGZvcm1WYWx1ZS5kYXRlRm9ybWF0fSksXG4gICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZm9ybVZhbHVlLmVudW0pICYmXG4gICAgICAgICAgICBmb3JtVmFsdWUuZW51bS5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgICAgICAgZW51bTogZm9ybVZhbHVlLmVudW0ucmVkdWNlKChhY2MsIGN1cnIpID0+ICh7Li4uYWNjLCBbY3Vyci5rZXldOiBjdXJyLnZhbHVlfSksIHt9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJ7XG4gICAgY2FzZUxpc3RDb2x1bW46IHRyYW5zbGF0ZWRDYXNlTGlzdENvbHVtbnMkIHwgYXN5bmMsXG4gICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgfCBhc3luYyxcbiAgICBoYXNFbnZpcm9ubWVudENvbmZpZzogaGFzRW52aXJvbm1lbnRDb25maWckIHwgYXN5bmMsXG4gICAgZG93bmxvYWRVcmw6IGRvd25sb2FkVXJsJCB8IGFzeW5jLFxuICAgIGRvd25sb2FkTmFtZTogZG93bmxvYWROYW1lJCB8IGFzeW5jLFxuICAgIGxvYWRpbmdDYXNlTGlzdENvbHVtbnM6IGxvYWRpbmdDYXNlTGlzdENvbHVtbnMkIHwgYXN5bmMsXG4gIH0gYXMgb2JzXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3Q7IGNvbnRleHQ6IHtvYnM6IG9ic31cIj48L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3JlYXRlRWRpdE1vZGFsXCI+PC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlbGV0ZU1vZGFsXCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNsaXN0IGxldC1vYnM9XCJvYnNcIj5cbiAgPHZhbHRpbW8tY2FyYm9uLWxpc3RcbiAgICBbYWN0aW9uSXRlbXNdPVwiYWN0aW9uSXRlbXNcIlxuICAgIFtsb2FkaW5nXT1cIm9icy5sb2FkaW5nQ2FzZUxpc3RDb2x1bW5zXCJcbiAgICBbaXRlbXNdPVwib2JzLmNhc2VMaXN0Q29sdW1uXCJcbiAgICBbZmllbGRzXT1cImZpZWxkc1wiXG4gICAgW3ZpZXdNb2RlXT1cImZhbHNlXCJcbiAgICBbaGVhZGVyXT1cImZhbHNlXCJcbiAgICBbbW92aW5nUm93c0VuYWJsZWRdPVwidHJ1ZVwiXG4gICAgKG1vdmVSb3cpPVwib25Nb3ZlUm93RXZlbnQoJGV2ZW50LCBvYnMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSlcIlxuICAgIChyb3dDbGlja2VkKT1cImNvbHVtblJvd0NsaWNrZWQoJGV2ZW50KVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBjYXJib25Ub29sYmFyQ29udGVudFxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25zOyBjb250ZXh0OiB7b2JzOiBvYnN9XCJcbiAgICA+PC9uZy1jb250YWluZXI+XG5cbiAgICA8dmFsdGltby1uby1yZXN1bHRzXG4gICAgICAqbmdJZj1cIiFvYnMuaGFzRW52aXJvbm1lbnRDb25maWdcIlxuICAgICAgW3RpdGxlXT1cIidsaXN0Q29sdW1uLm5vQ29uZmlnV2FybmluZ1RpdGxlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbZGVzY3JpcHRpb25dPVwiJ2xpc3RDb2x1bW4ubm9Db25maWdXYXJuaW5nJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBpbGx1c3RyYXRpb249XCJ2YWx0aW1vLWxheW91dC9pbWcvZW1wdHlzdGF0ZS1lbXB0eS5zdmdcIlxuICAgID48L3ZhbHRpbW8tbm8tcmVzdWx0cz5cblxuICAgIDx2YWx0aW1vLW5vLXJlc3VsdHNcbiAgICAgICpuZ0lmPVwib2JzLmhhc0Vudmlyb25tZW50Q29uZmlnXCJcbiAgICAgIFt0aXRsZV09XCInbGlzdENvbHVtbi5oYXNFbnZDb25maWdXYXJuaW5nVGl0bGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtkZXNjcmlwdGlvbl09XCInbGlzdENvbHVtbi5oYXNFbnZDb25maWdXYXJuaW5nJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBpbGx1c3RyYXRpb249XCJ2YWx0aW1vLWxheW91dC9pbWcvZW1wdHlzdGF0ZS1lcnJvci5zdmdcIlxuICAgID48L3ZhbHRpbW8tbm8tcmVzdWx0cz5cbiAgPC92YWx0aW1vLWNhcmJvbi1saXN0PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNidXR0b25zIGxldC1vYnM9XCJvYnNcIj5cbiAgPGJ1dHRvblxuICAgIGNkc0J1dHRvbj1cImdob3N0XCJcbiAgICBpY29uT25seT1cInRydWVcIlxuICAgIFtocmVmXT1cIm9icy5kb3dubG9hZFVybFwiXG4gICAgW2Rvd25sb2FkXT1cIm9icy5kb3dubG9hZE5hbWVcIlxuICAgIFtkaXNhYmxlZF09XCJcbiAgICAgIG9icy5oYXNFbnZpcm9ubWVudENvbmZpZyB8fFxuICAgICAgIW9icy5kb3dubG9hZFVybCB8fFxuICAgICAgIW9icy5kb3dubG9hZE5hbWUgfHxcbiAgICAgIG9icy5jYXNlTGlzdENvbHVtbj8ubGVuZ3RoIDwgMSB8fFxuICAgICAgb2JzLmRpc2FibGVJbnB1dCB8fFxuICAgICAgbG9hZGluZ0Nhc2VMaXN0Q29sdW1uc1xuICAgIFwiXG4gID5cbiAgICA8c3ZnIGNsYXNzPVwiY2RzLS1idG5fX2ljb25cIiBjZHNJY29uPVwiZG93bmxvYWRcIiBzaXplPVwiMTZcIj48L3N2Zz5cbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgIChjbGljayk9XCJvcGVuTW9kYWwoJ2NyZWF0ZScpXCJcbiAgICBjZHNCdXR0b249XCJwcmltYXJ5XCJcbiAgICBbZGlzYWJsZWRdPVwib2JzLmhhc0Vudmlyb25tZW50Q29uZmlnIHx8IGxvYWRpbmdDYXNlTGlzdENvbHVtbnNcIlxuICA+XG4gICAge3sgJ2xpc3RDb2x1bW4uYWRkQnV0dG9uVGV4dCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8c3ZnIGNsYXNzPVwiY2RzLS1idG5fX2ljb25cIiBjZHNJY29uPVwiYWRkXCIgc2l6ZT1cIjE2XCI+PC9zdmc+XG4gIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNlbnZpcm9ubWVudENvbmZpZ1dhcm5pbmc+XG4gIDxkaXYgY2xhc3M9XCJwbC0yIHByLTIgcGItMiBwdC0yXCI+XG4gICAgPGNkcy1ub3RpZmljYXRpb25cbiAgICAgIFtub3RpZmljYXRpb25PYmpdPVwie1xuICAgICAgICB0eXBlOiAnd2FybmluZycsXG4gICAgICAgIHRpdGxlOiAnbGlzdENvbHVtbi5oYXNFbnZDb25maWdXYXJuaW5nVGl0bGUnIHwgdHJhbnNsYXRlLFxuICAgICAgICBtZXNzYWdlOiAnbGlzdENvbHVtbi5oYXNFbnZDb25maWdXYXJuaW5nJyB8IHRyYW5zbGF0ZSxcbiAgICAgICAgc2hvd0Nsb3NlOiBmYWxzZSxcbiAgICAgIH1cIlxuICAgID5cbiAgICA8L2Nkcy1ub3RpZmljYXRpb24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNub0NvbmZpZ1dhcm5pbmc+XG4gIDxkaXYgY2xhc3M9XCJwbC0yIHByLTIgcGItMiBwdC0yXCI+XG4gICAgPGNkcy1ub3RpZmljYXRpb25cbiAgICAgIFtub3RpZmljYXRpb25PYmpdPVwie1xuICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgIHRpdGxlOiAnbGlzdENvbHVtbi5ub0NvbmZpZ1dhcm5pbmdUaXRsZScgfCB0cmFuc2xhdGUsXG4gICAgICAgIG1lc3NhZ2U6ICdsaXN0Q29sdW1uLm5vQ29uZmlnV2FybmluZycgfCB0cmFuc2xhdGUsXG4gICAgICAgIHNob3dDbG9zZTogZmFsc2UsXG4gICAgICB9XCJcbiAgICA+XG4gICAgPC9jZHMtbm90aWZpY2F0aW9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY3JlYXRlRWRpdE1vZGFsPlxuICA8Y2RzLW1vZGFsXG4gICAgdmFsdGltb0Nkc01vZGFsXG4gICAgKm5nSWY9XCJ7XG4gICAgICB0eXBlOiBjdXJyZW50TW9kYWxUeXBlJCB8IGFzeW5jLFxuICAgICAgc2hvdzogc2hvd01vZGFsJCB8IGFzeW5jLFxuICAgICAgdmFsaWQ6IHZhbGlkJCB8IGFzeW5jLFxuICAgICAgZGlzYWJsZUlucHV0OiBkaXNhYmxlSW5wdXQkIHwgYXN5bmMsXG4gICAgICB2YWxpZEtleTogdmFsaWRLZXkkIHwgYXN5bmMsXG4gICAgICBkaXNhYmxlRGVmYXVsdFNvcnQ6IGRpc2FibGVEZWZhdWx0U29ydCQgfCBhc3luYyxcbiAgICAgIHNob3dFbnVtOiBzaG93RW51bSQgfCBhc3luYyxcbiAgICAgIGlzWWVzTm86IGlzWWVzTm8kIHwgYXN5bmMsXG4gICAgfSBhcyBtb2RhbE9ic1wiXG4gICAgW29wZW5dPVwibW9kYWxPYnMuc2hvd1wiXG4gID5cbiAgICA8Y2RzLW1vZGFsLWhlYWRlciBbc2hvd0Nsb3NlQnV0dG9uXT1cInRydWVcIiAoY2xvc2VTZWxlY3QpPVwiY2xvc2VNb2RhbCgpXCI+XG4gICAgICA8aDMgY2RzTW9kYWxIZWFkZXJIZWFkaW5nPlxuICAgICAgICB7e1xuICAgICAgICAgIG1vZGFsT2JzLnR5cGUgPT09ICdjcmVhdGUnXG4gICAgICAgICAgICA/ICgnbGlzdENvbHVtbi5hZGRCdXR0b25UZXh0JyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgIDogKCdsaXN0Q29sdW1uLmVkaXRDb2x1bW5UaXRsZScgfCB0cmFuc2xhdGUpXG4gICAgICAgIH19XG4gICAgICA8L2gzPlxuICAgIDwvY2RzLW1vZGFsLWhlYWRlcj5cbiAgICA8c2VjdGlvbiBjZHNNb2RhbENvbnRlbnQ+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9kYWxDb250ZW50OyBjb250ZXh0OiB7bW9kYWxPYnM6IG1vZGFsT2JzfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvc2VjdGlvbj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9kYWxGb290ZXI7IGNvbnRleHQ6IHttb2RhbE9iczogbW9kYWxPYnN9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvY2RzLW1vZGFsPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtb2RhbENvbnRlbnQgbGV0LW1vZGFsT2JzPVwibW9kYWxPYnNcIj5cbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIiBjbGFzcz1cImxpc3QtY29sdW1uLWZvcm1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXBcIj5cbiAgICAgICAgICB7eyAnbGlzdENvbHVtbi50aXRsZVRpdGxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ2xpc3RDb2x1bW4udGl0bGVUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXQgY2RzVGV4dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIC8+XG4gICAgICA8L2Nkcy1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsXG4gICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXQgfHwgbW9kYWxPYnMudHlwZSA9PT0gJ2VkaXQnXCJcbiAgICAgICAgW2ludmFsaWRdPVwibW9kYWxPYnMudmFsaWRLZXkgPT09IGZhbHNlXCJcbiAgICAgICAgW2ludmFsaWRUZXh0XT1cIidsaXN0Q29sdW1uLnVuaXF1ZUtleVdhcm5pbmcnIHwgdHJhbnNsYXRlXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXBcIj5cbiAgICAgICAgICB7eyAnbGlzdENvbHVtbi5rZXknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5rZXlUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXQgY2RzVGV4dCBmb3JtQ29udHJvbE5hbWU9XCJrZXlcIiBbaW52YWxpZF09XCJtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcIiAvPlxuICAgICAgPC9jZHMtbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGNkcy1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4ucGF0aCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidsaXN0Q29sdW1uLnBhdGhUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDx2YWx0aW1vLXZhbHVlLXBhdGgtc2VsZWN0b3JcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwYXRoXCJcbiAgICAgICAgICBbZG9jdW1lbnREZWZpbml0aW9uTmFtZV09XCJkb2N1bWVudERlZmluaXRpb25OYW1lJCB8IGFzeW5jXCJcbiAgICAgICAgICBbcHJlZml4ZXNdPVwiW1ZhbHVlUGF0aFNlbGVjdG9yUHJlZml4LkRPQywgVmFsdWVQYXRoU2VsZWN0b3JQcmVmaXguQ0FTRV1cIlxuICAgICAgICA+PC92YWx0aW1vLXZhbHVlLXBhdGgtc2VsZWN0b3I+XG4gICAgICA8L2Nkcy1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4uZGlzcGxheVR5cGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5kaXNwbGF5VHlwZVRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxjZHMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheVR5cGVcIiBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJ2aWV3VHlwZUl0ZW1zJCB8IGFzeW5jXCI+PC9jZHMtZHJvcGRvd24tbGlzdD5cbiAgICAgICAgPC9jZHMtZHJvcGRvd24+XG4gICAgICA8L2Nkcy1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCIgKm5nSWY9XCJzaG93RGF0ZUZvcm1hdCQgfCBhc3luY1wiPlxuICAgICAgPGNkcy1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4uZGF0ZUZvcm1hdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidsaXN0Q29sdW1uLmRhdGVGb3JtYXRUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXQgY2RzVGV4dCBmb3JtQ29udHJvbE5hbWU9XCJkYXRlRm9ybWF0XCIgLz5cbiAgICAgIDwvY2RzLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCJcbiAgICAgICpuZ0lmPVwibW9kYWxPYnMuc2hvd0VudW0gfHwgbW9kYWxPYnMuaXNZZXNOb1wiXG4gICAgICBbbmdDbGFzc109XCJ7J25vLW1hcmdpbic6IG1vZGFsT2JzLmlzWWVzTm99XCJcbiAgICA+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgICAge3tcbiAgICAgICAgICAgIG1vZGFsT2JzLmlzWWVzTm9cbiAgICAgICAgICAgICAgPyAoJ2xpc3RDb2x1bW4uZW51bVRpdGxlT3B0aW9uYWwnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICA6ICgnbGlzdENvbHVtbi5lbnVtVGl0bGUnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCJcbiAgICAgICAgICAgICAgbW9kYWxPYnMuaXNZZXNOb1xuICAgICAgICAgICAgICAgID8gKCdsaXN0Q29sdW1uLmVudW1Ub29sdGlwT3B0aW9uYWwnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgIDogKCdsaXN0Q29sdW1uLmVudW1Ub29sdGlwJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8dmFsdGltby1jYXJib24tbXVsdGktaW5wdXRcbiAgICAgICAgICAqbmdJZj1cIihzaG93TW9kYWwkIHwgYXN5bmMpIHx8IChtb2RhbFNob3dpbmckIHwgYXN5bmMpXCJcbiAgICAgICAgICB0eXBlPVwia2V5VmFsdWVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJlbnVtVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgW2RlZmF1bHRWYWx1ZXNdPVwiZGVmYXVsdEVudW1WYWx1ZXMkIHwgYXN5bmNcIlxuICAgICAgICAgIFtoaWRlQWRkQnV0dG9uXT1cIm1vZGFsT2JzLmlzWWVzTm9cIlxuICAgICAgICAgIFtoaWRlRGVsZXRlQnV0dG9uXT1cIm1vZGFsT2JzLmlzWWVzTm9cIlxuICAgICAgICAgIFttYXhSb3dzXT1cIm1vZGFsT2JzLmlzWWVzTm8gPyAxIDogbnVsbFwiXG4gICAgICAgICAgW2tleUNvbHVtblRpdGxlXT1cIm1vZGFsT2JzLmlzWWVzTm8gJiYgKCd2aWV3VHlwZUNvbnZlcnRlci5ZZXMnIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgICAgW3ZhbHVlQ29sdW1uVGl0bGVdPVwibW9kYWxPYnMuaXNZZXNObyAmJiAoJ3ZpZXdUeXBlQ29udmVydGVyLk5vJyB8IHRyYW5zbGF0ZSlcIlxuICAgICAgICA+PC92YWx0aW1vLWNhcmJvbi1tdWx0aS1pbnB1dD5cbiAgICAgIDwvY2RzLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXJcIj5cbiAgICAgIDxjZHMtY2hlY2tib3ggZm9ybUNvbnRyb2xOYW1lPVwic29ydGFibGVcIlxuICAgICAgICA+e3sgJ2xpc3RDb2x1bW4uc29ydGFibGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Nkcy1jaGVja2JveD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXQgfHwgbW9kYWxPYnMuZGlzYWJsZURlZmF1bHRTb3J0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwIHNlbGVjdC1sYWJlbFwiPlxuICAgICAgICAgIHt7ICdsaXN0Q29sdW1uLmRlZmF1bHRTb3J0VGl0bGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5kZWZhdWx0U29ydFRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxjZHMtZHJvcGRvd25cbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWZhdWx0U29ydFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dCB8fCBtb2RhbE9icy5kaXNhYmxlRGVmYXVsdFNvcnRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJzb3J0SXRlbXMkIHwgYXN5bmNcIj48L2Nkcy1kcm9wZG93bi1saXN0PlxuICAgICAgICA8L2Nkcy1kcm9wZG93bj5cbiAgICAgIDwvY2RzLWxhYmVsPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGFsRm9vdGVyIGxldC1tb2RhbE9icz1cIm1vZGFsT2JzXCI+XG4gIDxjZHMtbW9kYWwtZm9vdGVyPlxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNkc0J1dHRvbj1cInNlY29uZGFyeVwiXG4gICAgICAgIFthdHRyLm1vZGFsLXByaW1hcnktZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgIChjbGljayk9XCJjbG9zZU1vZGFsKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgID5cbiAgICAgICAge3sgJ2xpc3RDb2x1bW4uY2xvc2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICAgIFthdHRyLm1vZGFsLXByaW1hcnktZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy52YWxpZCA9PT0gZmFsc2VcIlxuICAgICAgICAoY2xpY2spPVwic2F2ZUNhc0xpc3RDb2x1bW5zKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgbW9kYWxPYnMuZGlzYWJsZUlucHV0IHx8IG1vZGFsT2JzLnZhbGlkID09PSBmYWxzZSB8fCBtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgJ2xpc3RDb2x1bW4uc2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Nkcy1tb2RhbC1mb290ZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlbGV0ZU1vZGFsPlxuICA8dmFsdGltby1jb25maXJtYXRpb24tbW9kYWxcbiAgICBbc2hvd01vZGFsU3ViamVjdCRdPVwic2hvd0RlbGV0ZU1vZGFsJFwiXG4gICAgW291dHB1dE9uQ29uZmlybV09XCJkZWxldGVSb3dLZXkkIHwgYXN5bmNcIlxuICAgIChjb25maXJtRXZlbnQpPVwiZGVsZXRlUm93Q29uZmlybWF0aW9uKCRldmVudClcIlxuICAgIGNvbmZpcm1CdXR0b25UZXh0VHJhbnNsYXRpb25LZXk9XCJsaXN0Q29sdW1uLmRlbGV0ZUNvbHVtblwiXG4gICAgdGl0bGVUcmFuc2xhdGlvbktleT1cImxpc3RDb2x1bW4uZGVsZXRlQ29sdW1uXCJcbiAgICBjb250ZW50VHJhbnNsYXRpb25LZXk9XCJsaXN0Q29sdW1uLmRlbGV0ZUNvbHVtbkNvbmZpcm1hdGlvblwiXG4gID48L3ZhbHRpbW8tY29uZmlybWF0aW9uLW1vZGFsPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
462
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2Rvc3NpZXItbWFuYWdlbWVudC9zcmMvbGliL2NvbXBvbmVudHMvZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci1tYW5hZ2VtZW50L3NyYy9saWIvY29tcG9uZW50cy9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zL2Rvc3NpZXItbWFuYWdlbWVudC1saXN0LWNvbHVtbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxPQUFPLEVBQWdCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUdsRSxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVyRCxPQUFPLEVBR0wsZ0JBQWdCLEVBR2hCLHVCQUF1QixFQUN2QixRQUFRLEdBQ1QsTUFBTSxxQkFBcUIsQ0FBQztBQVU3QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixLQUFLLEVBQ0wsTUFBTSxFQUNOLEdBQUcsRUFFSCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBUXBDLE1BQU0sT0FBTyxxQ0FBcUM7SUEwUmhELFlBQ21CLGVBQWdDLEVBQ2hDLEtB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Q0UseUNBQXlDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjQgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtEb21TYW5pdGl6ZXIsIFNhZmVVcmx9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7QXJyb3dEb3duMTYsIEFycm93VXAxNn0gZnJvbSAnQGNhcmJvbi9pY29ucyc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWN0aW9uSXRlbSxcbiAgQ29sdW1uQ29uZmlnLFxuICBNb3ZlUm93RGlyZWN0aW9uLFxuICBNb3ZlUm93RXZlbnQsXG4gIE11bHRpSW5wdXRWYWx1ZXMsXG4gIFZhbHVlUGF0aFNlbGVjdG9yUHJlZml4LFxuICBWaWV3VHlwZSxcbn0gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge0NvbmZpZ1NlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5pbXBvcnQge1xuICBDYXNlTGlzdENvbHVtbixcbiAgQ2FzZUxpc3RDb2x1bW5WaWV3LFxuICBEaXNwbGF5VHlwZVBhcmFtZXRlcnMsXG4gIERvY3VtZW50U2VydmljZSxcbn0gZnJvbSAnQHZhbHRpbW8vZG9jdW1lbnQnO1xuaW1wb3J0IHtJY29uU2VydmljZX0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG5pbXBvcnQge0xpc3RJdGVtfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL2Ryb3Bkb3duL2xpc3QtaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkZWxheSxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHt0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0xpc3RDb2x1bW5Nb2RhbH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsdGltby1kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rvc3NpZXItbWFuYWdlbWVudC1saXN0LWNvbHVtbnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIERvc3NpZXJNYW5hZ2VtZW50TGlzdENvbHVtbnNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgcmVhZG9ubHkgZG93bmxvYWROYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGRvd25sb2FkVXJsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2FmZVVybD4odW5kZWZpbmVkKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgYWN0aW9uSXRlbXM6IEFjdGlvbkl0ZW1bXSA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogJ2ludGVyZmFjZS5kZWxldGUnLFxuICAgICAgY2FsbGJhY2s6IHRoaXMuZGVsZXRlUm93LmJpbmQodGhpcyksXG4gICAgICB0eXBlOiAnZGFuZ2VyJyxcbiAgICB9LFxuICBdO1xuICBwdWJsaWMgcmVhZG9ubHkgbG9hZGluZ0Nhc2VMaXN0Q29sdW1ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuXG4gIHB1YmxpYyByZWFkb25seSBsYXN0SXRlbUluZGV4JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigtMSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGZpZWxkczogQXJyYXk8Q29sdW1uQ29uZmlnPiA9IFtcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBrZXk6ICd0aXRsZScsXG4gICAgICBsYWJlbDogJ2xpc3RDb2x1bW4udGl0bGUnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAga2V5OiAna2V5JyxcbiAgICAgIGxhYmVsOiAnbGlzdENvbHVtbi5rZXknLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAga2V5OiAncGF0aCcsXG4gICAgICBsYWJlbDogJ2xpc3RDb2x1bW4ucGF0aCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBrZXk6ICdkaXNwbGF5VHlwZScsXG4gICAgICBsYWJlbDogJ2xpc3RDb2x1bW4uZGlzcGxheVR5cGUnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAga2V5OiAnZGlzcGxheVR5cGVQYXJhbWV0ZXJzJyxcbiAgICAgIGxhYmVsOiAnbGlzdENvbHVtbi5kaXNwbGF5VHlwZVBhcmFtZXRlcnMnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAga2V5OiAnc29ydGFibGUnLFxuICAgICAgbGFiZWw6ICdsaXN0Q29sdW1uLnNvcnRhYmxlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIGtleTogJ2RlZmF1bHRTb3J0JyxcbiAgICAgIGxhYmVsOiAnbGlzdENvbHVtbi5kZWZhdWx0U29ydCcsXG4gICAgfSxcbiAgXTtcblxuICByZWFkb25seSBkb2N1bWVudERlZmluaXRpb25OYW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShcbiAgICBtYXAocGFyYW1zID0+IHBhcmFtcy5uYW1lIHx8ICcnKSxcbiAgICBmaWx0ZXIoZG9jRGVmTmFtZSA9PiAhIWRvY0RlZk5hbWUpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGlzYWJsZUlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHJlYWRvbmx5IGhhc0Vudmlyb25tZW50Q29uZmlnJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZShcbiAgICBtYXAoXG4gICAgICBkb2N1bWVudERlZmluaXRpb25OYW1lID0+XG4gICAgICAgICEhdGhpcy5jb25maWdTZXJ2aWNlPy5jb25maWc/LmN1c3RvbURlZmluaXRpb25UYWJsZXNbZG9jdW1lbnREZWZpbml0aW9uTmFtZV1cbiAgICApXG4gICk7XG5cbiAgcHJpdmF0ZSBjYWNoZWRDYXNlTGlzdENvbHVtbnM6IEFycmF5PENhc2VMaXN0Q29sdW1uPiA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaENhc2VMaXN0Y29sdW1ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bGw+KG51bGwpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FzZUxpc3RDb2x1bW5zJDogT2JzZXJ2YWJsZTxBcnJheTxDYXNlTGlzdENvbHVtbj4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJCxcbiAgICB0aGlzLnJlZnJlc2hDYXNlTGlzdGNvbHVtbnMkLFxuICBdKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoW2RvY3VtZW50RGVmaW5pdGlvbk5hbWVdKSA9PlxuICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0Q2FzZUxpc3RGb3JNYW5hZ2VtZW50KGRvY3VtZW50RGVmaW5pdGlvbk5hbWUpXG4gICAgKSxcbiAgICB0YXAoY2FzZUxpc3RDb2x1bW5zID0+IHtcbiAgICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PiB7XG4gICAgICAgIGlmIChjYXNlTGlzdENvbHVtbnMgJiYgQXJyYXkuaXNBcnJheShjYXNlTGlzdENvbHVtbnMpICYmIGNhc2VMaXN0Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXREb3dubG9hZChkb2N1bWVudERlZmluaXRpb25OYW1lLCBjYXNlTGlzdENvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KSxcbiAgICB0YXAoY2FzZUxpc3RDb2x1bW5zID0+IHtcbiAgICAgIHRoaXMubGFzdEl0ZW1JbmRleCQubmV4dChjYXNlTGlzdENvbHVtbnMubGVuZ3RoIC0gMSk7XG4gICAgICB0aGlzLmNhY2hlZENhc2VMaXN0Q29sdW1ucyA9IGNhc2VMaXN0Q29sdW1ucztcbiAgICAgIHRoaXMubG9hZGluZ0Nhc2VMaXN0Q29sdW1ucyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgfSlcbiAgKTtcblxuICByZWFkb25seSB0cmFuc2xhdGVkQ2FzZUxpc3RDb2x1bW5zJDogT2JzZXJ2YWJsZTxBcnJheTxDYXNlTGlzdENvbHVtblZpZXc+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY2FzZUxpc3RDb2x1bW5zJCxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtjb2x1bW5zXSkgPT5cbiAgICAgIGNvbHVtbnMubWFwKGNvbHVtbiA9PiAoe1xuICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgIHRpdGxlOiBjb2x1bW4udGl0bGUgfHwgJy0nLFxuICAgICAgICBzb3J0YWJsZTogY29sdW1uLnNvcnRhYmxlXG4gICAgICAgICAgPyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZVllcycpXG4gICAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZU5vJyksXG4gICAgICAgIGRlZmF1bHRTb3J0OlxuICAgICAgICAgIChjb2x1bW4uZGVmYXVsdFNvcnQgPT09ICdBU0MnICYmXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZUFzYycpKSB8fFxuICAgICAgICAgIChjb2x1bW4uZGVmYXVsdFNvcnQgPT09ICdERVNDJyAmJlxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2xpc3RDb2x1bW4uc29ydGFibGVEZXNjJykpIHx8XG4gICAgICAgICAgJy0nLFxuICAgICAgICBkaXNwbGF5VHlwZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgYGxpc3RDb2x1bW5EaXNwbGF5VHlwZS4ke2NvbHVtbj8uZGlzcGxheVR5cGU/LnR5cGV9YFxuICAgICAgICApLFxuICAgICAgICBkaXNwbGF5VHlwZVBhcmFtZXRlcnM6IHRoaXMuZ2V0RGlzcGxheVR5cGVQYXJhbWV0ZXJzVmlldyhcbiAgICAgICAgICBjb2x1bW4uZGlzcGxheVR5cGUuZGlzcGxheVR5cGVQYXJhbWV0ZXJzXG4gICAgICAgICksXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudE1vZGFsVHlwZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PExpc3RDb2x1bW5Nb2RhbD4oJ2NyZWF0ZScpO1xuXG4gIHJlYWRvbmx5IHNob3dNb2RhbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSBtb2RhbFNob3dpbmckID0gdGhpcy5zaG93TW9kYWwkLnBpcGUoZGVsYXkoMjUwKSk7XG5cbiAgcmVhZG9ubHkgSU5WQUxJRF9LRVkgPSAnaW52YWxpZCc7XG5cbiAgcmVhZG9ubHkgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgdGl0bGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAga2V5OiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIHBhdGg6IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgZGF0ZUZvcm1hdDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBkaXNwbGF5VHlwZTogbmV3IEZvcm1Db250cm9sKHtcbiAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICB9KSxcbiAgICBzb3J0YWJsZTogbmV3IEZvcm1Db250cm9sKGZhbHNlKSxcbiAgICBkZWZhdWx0U29ydDogbmV3IEZvcm1Db250cm9sKHtcbiAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICB9KSxcbiAgICBlbnVtOiBuZXcgRm9ybUNvbnRyb2woW10pLFxuICB9KTtcblxuICByZWFkb25seSBkaXNhYmxlRGVmYXVsdFNvcnQkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5jdXJyZW50TW9kYWxUeXBlJCxcbiAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMsXG4gIF0pLnBpcGUoXG4gICAgbWFwKFxuICAgICAgKFtjdXJyZW50TW9kYWxUeXBlXSkgPT5cbiAgICAgICAgY3VycmVudE1vZGFsVHlwZSA9PT0gJ2NyZWF0ZScgJiZcbiAgICAgICAgdGhpcy5jYWNoZWRDYXNlTGlzdENvbHVtbnMuZmluZChjb2x1bW4gPT4gISFjb2x1bW4uZGVmYXVsdFNvcnQpXG4gICAgKSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgRElTUExBWV9UWVBFUzogQXJyYXk8Vmlld1R5cGU+ID0gW1xuICAgIFZpZXdUeXBlLlRFWFQsXG4gICAgVmlld1R5cGUuREFURSxcbiAgICBWaWV3VHlwZS5CT09MRUFOLFxuICAgIFZpZXdUeXBlLkVOVU0sXG4gICAgVmlld1R5cGUuQVJSQVlfQ09VTlQsXG4gICAgVmlld1R5cGUuVU5ERVJTQ09SRVNfVE9fU1BBQ0VTLFxuICAgIFZpZXdUeXBlLlRBR1MsXG4gIF07XG5cbiAgcmVhZG9ubHkgc2hvd0RhdGVGb3JtYXQkID0gdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgbWFwKGZvcm1WYWx1ZXMgPT4gISEoZm9ybVZhbHVlcy5kaXNwbGF5VHlwZT8ua2V5ID09PSB0aGlzLkRJU1BMQVlfVFlQRVNbMV0pKSxcbiAgICB0YXAoc2hvd0RhdGVGb3JtYXQgPT4ge1xuICAgICAgaWYgKHNob3dEYXRlRm9ybWF0ID09PSBmYWxzZSAmJiAhIXRoaXMuZm9ybUdyb3VwLnZhbHVlLmRhdGVGb3JtYXQpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7ZGF0ZUZvcm1hdDogJyd9KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd0VudW0kID0gdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgbWFwKFxuICAgICAgZm9ybVZhbHVlcyA9PlxuICAgICAgICAhIShcbiAgICAgICAgICBmb3JtVmFsdWVzLmRpc3BsYXlUeXBlPy5rZXkgPT09IHRoaXMuRElTUExBWV9UWVBFU1szXSB8fFxuICAgICAgICAgIGZvcm1WYWx1ZXMuZGlzcGxheVR5cGU/LmtleSA9PT0gdGhpcy5ESVNQTEFZX1RZUEVTWzJdXG4gICAgICAgIClcbiAgICApLFxuICAgIHRhcChzaG93RW51bSA9PiB7XG4gICAgICBjb25zdCBlbnVtVmFsdWUgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZS5lbnVtO1xuICAgICAgaWYgKHNob3dFbnVtID09PSBmYWxzZSAmJiBBcnJheS5pc0FycmF5KGVudW1WYWx1ZSkgJiYgZW51bVZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7ZW51bTogW119KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNZZXNObyQgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICBtYXAoZm9ybVZhbHVlcyA9PiAhIShmb3JtVmFsdWVzLmRpc3BsYXlUeXBlPy5rZXkgPT09IHRoaXMuRElTUExBWV9UWVBFU1syXSkpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRWaWV3VHlwZUl0ZW1JbmRleCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG5cbiAgcmVhZG9ubHkgdmlld1R5cGVJdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8TGlzdEl0ZW0+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuc2VsZWN0ZWRWaWV3VHlwZUl0ZW1JbmRleCQsXG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JyksXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbc2VsZWN0ZWRWaWV3VHlwZUl0ZW1JbmRleF0pID0+XG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbkRpc3BsYXlUeXBlLnNlbGVjdGApLFxuICAgICAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4udGhpcy5ESVNQTEFZX1RZUEVTLm1hcCh0eXBlID0+ICh7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYGxpc3RDb2x1bW5EaXNwbGF5VHlwZS4ke3R5cGV9YCksXG4gICAgICAgICAga2V5OiB0eXBlLFxuICAgICAgICB9KSksXG4gICAgICBdLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XG4gICAgICAgIC4uLml0ZW0sXG4gICAgICAgIHNlbGVjdGVkOiBpbmRleCA9PT0gc2VsZWN0ZWRWaWV3VHlwZUl0ZW1JbmRleCxcbiAgICAgIH0pKVxuICAgIClcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZFNvcnRJdGVtSW5kZXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuXG4gIHJlYWRvbmx5IHNvcnRJdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8TGlzdEl0ZW0+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuc2VsZWN0ZWRTb3J0SXRlbUluZGV4JCxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtzZWxlY3RlZFNvcnRJdGVtSW5kZXhdKSA9PlxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYGxpc3RDb2x1bW4uc2VsZWN0RGVmYXVsdFNvcnRgKSxcbiAgICAgICAgICBrZXk6IHRoaXMuSU5WQUxJRF9LRVksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbi5zb3J0YWJsZUFzY2ApLFxuICAgICAgICAgIGtleTogJ0FTQycsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbi5zb3J0YWJsZURlc2NgKSxcbiAgICAgICAgICBrZXk6ICdERVNDJyxcbiAgICAgICAgfSxcbiAgICAgIF0ubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgc2VsZWN0ZWQ6IGluZGV4ID09PSBzZWxlY3RlZFNvcnRJdGVtSW5kZXgsXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgdmFsaWRLZXkkID0gY29tYmluZUxhdGVzdChbdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLCB0aGlzLmN1cnJlbnRNb2RhbFR5cGUkXSkucGlwZShcbiAgICBtYXAoKFtmb3JtVmFsdWVzLCBjdXJyZW50TW9kYWxUeXBlXSkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdLZXlzID0gdGhpcy5jYWNoZWRDYXNlTGlzdENvbHVtbnMubWFwKGNvbHVtbiA9PiBjb2x1bW4ua2V5KTtcbiAgICAgIHJldHVybiBjdXJyZW50TW9kYWxUeXBlID09PSAnY3JlYXRlJyA/ICFleGlzdGluZ0tleXMuaW5jbHVkZXMoZm9ybVZhbHVlcy5rZXkpIDogdHJ1ZTtcbiAgICB9KSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgdmFsaWQkID0gY29tYmluZUxhdGVzdChbdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLCB0aGlzLnZhbGlkS2V5JF0pLnBpcGUoXG4gICAgbWFwKFxuICAgICAgKFtmb3JtVmFsdWVzLCB2YWxpZEtleV0pID0+XG4gICAgICAgICEhKFxuICAgICAgICAgIGZvcm1WYWx1ZXMuZGlzcGxheVR5cGU/LmtleSAhPT0gdGhpcy5JTlZBTElEX0tFWSAmJlxuICAgICAgICAgIGZvcm1WYWx1ZXMucGF0aCAmJlxuICAgICAgICAgIHZhbGlkS2V5ICYmXG4gICAgICAgICAgKGZvcm1WYWx1ZXMuZGlzcGxheVR5cGUua2V5ID09PSAnZW51bScgPyBmb3JtVmFsdWVzLmVudW0/Lmxlbmd0aCA+IDAgOiB0cnVlKVxuICAgICAgICApXG4gICAgKSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd0RlbGV0ZU1vZGFsJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgcmVhZG9ubHkgZGVsZXRlUm93S2V5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG5cbiAgcmVhZG9ubHkgZGVmYXVsdEVudW1WYWx1ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNdWx0aUlucHV0VmFsdWVzPih1bmRlZmluZWQpO1xuXG4gIHB1YmxpYyByZWFkb25seSBWYWx1ZVBhdGhTZWxlY3RvclByZWZpeCA9IFZhbHVlUGF0aFNlbGVjdG9yUHJlZml4O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRTZXJ2aWNlOiBEb2N1bWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvblNlcnZpY2U6IEljb25TZXJ2aWNlXG4gICkge31cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaWNvblNlcnZpY2UucmVnaXN0ZXJBbGwoW0Fycm93RG93bjE2LCBBcnJvd1VwMTZdKTtcbiAgfVxuXG4gIG9wZW5Nb2RhbChtb2RhbFR5cGU6IExpc3RDb2x1bW5Nb2RhbCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd01vZGFsJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuY3VycmVudE1vZGFsVHlwZSQubmV4dChtb2RhbFR5cGUpO1xuXG4gICAgaWYgKG1vZGFsVHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzWydrZXknXS5lbmFibGUoKTtcbiAgICAgIHRoaXMucmVzZXRGb3JtR3JvdXAoKTtcbiAgICB9IGVsc2UgaWYgKG1vZGFsVHlwZSA9PT0gJ2VkaXQnKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1sna2V5J10uZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TW9kYWwkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgZGVsZXRlUm93KGNhc2VMaXN0Q29sdW1uOiBDYXNlTGlzdENvbHVtbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0RlbGV0ZU1vZGFsJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVsZXRlUm93S2V5JC5uZXh0KGNhc2VMaXN0Q29sdW1uLmtleSk7XG4gIH1cblxuICBkZWxldGVSb3dDb25maXJtYXRpb24oY29sdW1uS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoY29sdW1uS2V5KSB7XG4gICAgICB0aGlzLmRpc2FibGVJbnB1dCgpO1xuXG4gICAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGRvY0RlZk5hbWUgPT4ge1xuICAgICAgICB0aGlzLmRvY3VtZW50U2VydmljZS5kZWxldGVDYXNlTGlzdEZvck1hbmFnZW1lbnQoZG9jRGVmTmFtZSwgY29sdW1uS2V5KS5zdWJzY3JpYmUoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2FzZUxpc3RDb2x1bW5zKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25Nb3ZlUm93RXZlbnQoZXZlbnQ6IE1vdmVSb3dFdmVudCwgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2FzZUxpc3RDb2x1bW5zID0gWy4uLnRoaXMuY2FjaGVkQ2FzZUxpc3RDb2x1bW5zXTtcbiAgICBjb25zdCBjYXNlTGlzdENvbHVtblJvdyA9IGNhc2VMaXN0Q29sdW1uc1tldmVudC5pbmRleF07XG4gICAgY29uc3QgbW92ZVVwOiBib29sZWFuID0gZXZlbnQuZGlyZWN0aW9uID09PSBNb3ZlUm93RGlyZWN0aW9uLlVQO1xuXG4gICAgY29uc3QgY2FzZUxpc3RDb2x1bW5JbmRleCA9IGNhc2VMaXN0Q29sdW1ucy5maW5kSW5kZXgoXG4gICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IGNhc2VMaXN0Q29sdW1uUm93LmtleVxuICAgICk7XG4gICAgY29uc3QgZm91bmRDYXNlTGlzdENvbHVtbiA9IHsuLi5jYXNlTGlzdENvbHVtbnNbY2FzZUxpc3RDb2x1bW5JbmRleF19O1xuICAgIGNvbnN0IGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zID0gY2FzZUxpc3RDb2x1bW5zLmZpbHRlcihcbiAgICAgIGZpZWxkID0+IGZpZWxkLmtleSAhPT0gY2FzZUxpc3RDb2x1bW5Sb3cua2V5XG4gICAgKTtcbiAgICBjb25zdCBtdWx0aXBsZUNhc2VMaXN0Q29sdW1ucyA9IGNhc2VMaXN0Q29sdW1ucy5sZW5ndGggPiAxO1xuXG4gICAgaWYgKG11bHRpcGxlQ2FzZUxpc3RDb2x1bW5zICYmIG1vdmVVcCAmJiBjYXNlTGlzdENvbHVtbkluZGV4ID4gMCkge1xuICAgICAgY29uc3QgY2FzZUxpc3RDb2x1bW5CZWZvcmVLZXkgPSBgJHtjYXNlTGlzdENvbHVtbnNbY2FzZUxpc3RDb2x1bW5JbmRleCAtIDFdLmtleX1gO1xuICAgICAgY29uc3QgY2FzZUxpc3RDb2x1bW5CZWZvcmVJbmRleCA9IGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zLmZpbmRJbmRleChcbiAgICAgICAgZmllbGQgPT4gZmllbGQua2V5ID09PSBjYXNlTGlzdENvbHVtbkJlZm9yZUtleVxuICAgICAgKTtcbiAgICAgIGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zLnNwbGljZShjYXNlTGlzdENvbHVtbkJlZm9yZUluZGV4LCAwLCBmb3VuZENhc2VMaXN0Q29sdW1uKTtcbiAgICAgIHRoaXMudXBkYXRlQ2FzZUxpc3RDb2x1bW5zKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsIGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zKTtcbiAgICB9IGVsc2UgaWYgKG11bHRpcGxlQ2FzZUxpc3RDb2x1bW5zICYmICFtb3ZlVXAgJiYgY2FzZUxpc3RDb2x1bW5JbmRleCA8IGNhc2VMaXN0Q29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNhc2VMaXN0Q29sdW1uQWZ0ZXJLZXkgPSBgJHtjYXNlTGlzdENvbHVtbnNbY2FzZUxpc3RDb2x1bW5JbmRleCArIDFdLmtleX1gO1xuICAgICAgY29uc3QgY2FzZUxpc3RDb2x1bW5BZnRlckluZGV4ID0gZmlsdGVyZWRDYXNlTGlzdENvbHVtbnMuZmluZEluZGV4KFxuICAgICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IGNhc2VMaXN0Q29sdW1uQWZ0ZXJLZXlcbiAgICAgICk7XG4gICAgICBmaWx0ZXJlZENhc2VMaXN0Q29sdW1ucy5zcGxpY2UoY2FzZUxpc3RDb2x1bW5BZnRlckluZGV4ICsgMSwgMCwgZm91bmRDYXNlTGlzdENvbHVtbik7XG4gICAgICB0aGlzLnVwZGF0ZUNhc2VMaXN0Q29sdW1ucyhkb2N1bWVudERlZmluaXRpb25OYW1lLCBmaWx0ZXJlZENhc2VMaXN0Q29sdW1ucyk7XG4gICAgfVxuICB9XG5cbiAgc2F2ZUNhc0xpc3RDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb2RhbFR5cGUkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGN1cnJlbnRNb2RhbFR5cGUgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnKSB7XG4gICAgICAgIHRoaXMuYWRkQ29sdW1uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZW51bVZhbHVlQ2hhbmdlKHZhbHVlOiBBcnJheTx7W2tleTogc3RyaW5nXTogc3RyaW5nfT4pOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtlbnVtOiB2YWx1ZX0pO1xuICB9XG5cbiAgY29sdW1uUm93Q2xpY2tlZChyb3c6IHtrZXk6IHN0cmluZ30pOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0Rm9ybUdyb3VwKCk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnZpZXdUeXBlSXRlbXMkLCB0aGlzLnNvcnRJdGVtcyRdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFt2aWV3VHlwZUl0ZW1zLCBzb3J0SXRlbXNdKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY2FjaGVkQ2FzZUxpc3RDb2x1bW5zLmZpbmQoXG4gICAgICAgICAgY2FjaGVkQ29sdW1uID0+IGNhY2hlZENvbHVtbi5rZXkgPT09IHJvdy5rZXlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgdmlld1R5cGVJdGVtID0gdmlld1R5cGVJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kaXNwbGF5VHlwZS50eXBlKTtcbiAgICAgICAgY29uc3Qgdmlld1R5cGVJdGVtSW5kZXggPSB2aWV3VHlwZUl0ZW1zLmZpbmRJbmRleChcbiAgICAgICAgICBpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW4uZGlzcGxheVR5cGUudHlwZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzb3J0SXRlbSA9IHNvcnRJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kZWZhdWx0U29ydCk7XG4gICAgICAgIGNvbnN0IHNvcnRJdGVtSW5kZXggPSBzb3J0SXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kZWZhdWx0U29ydCk7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSBjb2x1bW4/LmRpc3BsYXlUeXBlPy5kaXNwbGF5VHlwZVBhcmFtZXRlcnM/LmVudW07XG4gICAgICAgIGNvbnN0IG1hcHBlZEVudW1WYWx1ZXM6IE11bHRpSW5wdXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgY29sdW1uRGF0ZUZvcm1hdCA9IGNvbHVtbj8uZGlzcGxheVR5cGU/LmRpc3BsYXlUeXBlUGFyYW1ldGVycz8uZGF0ZUZvcm1hdDtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkVmlld1R5cGVJdGVtSW5kZXgkLm5leHQodmlld1R5cGVJdGVtSW5kZXgpO1xuXG4gICAgICAgIGlmIChzb3J0SXRlbSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTb3J0SXRlbUluZGV4JC5uZXh0KHNvcnRJdGVtSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudW1WYWx1ZXMpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhlbnVtVmFsdWVzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBtYXBwZWRFbnVtVmFsdWVzLnB1c2goe2tleSwgdmFsdWU6IGVudW1WYWx1ZXNba2V5XX0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGVmYXVsdEVudW1WYWx1ZXMkLm5leHQobWFwcGVkRW51bVZhbHVlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kZWZhdWx0RW51bVZhbHVlcyQubmV4dChbe2tleTogJycsIHZhbHVlOiAnJ31dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe1xuICAgICAgICAgIGtleTogY29sdW1uLmtleSxcbiAgICAgICAgICB0aXRsZTogY29sdW1uLnRpdGxlLFxuICAgICAgICAgIHBhdGg6IGNvbHVtbi5wYXRoLFxuICAgICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGUsXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGRpc3BsYXlUeXBlOiB7Li4udmlld1R5cGVJdGVtfSxcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgZGVmYXVsdFNvcnQ6IHNvcnRJdGVtID8gey4uLnNvcnRJdGVtfSA6IHsuLi5zb3J0SXRlbXNbMF19LFxuICAgICAgICAgIC4uLihjb2x1bW5EYXRlRm9ybWF0ICYmIHtcbiAgICAgICAgICAgIGRhdGVGb3JtYXQ6IGNvbHVtbkRhdGVGb3JtYXQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3Blbk1vZGFsKCdlZGl0Jyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2FzZUxpc3RDb2x1bW5zKFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZyxcbiAgICBuZXdDYXNlTGlzdENvbHVtbnM6IEFycmF5PENhc2VMaXN0Q29sdW1uPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCgpO1xuXG4gICAgdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgIC5wdXRDYXNlTGlzdEZvck1hbmFnZW1lbnQoZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgbmV3Q2FzZUxpc3RDb2x1bW5zKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVmcmVzaENhc2VMaXN0Q29sdW1ucygpO1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBsaXN0LXNlYXJjaC0ke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9YCwgbnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZENvbHVtbigpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZTtcblxuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZG9jRGVmTmFtZSA9PiB7XG4gICAgICB0aGlzLmRvY3VtZW50U2VydmljZVxuICAgICAgICAucG9zdENhc2VMaXN0Rm9yTWFuYWdlbWVudChkb2NEZWZOYW1lLCB0aGlzLm1hcEZvcm1WYWx1ZXNUb0NvbHVtbihmb3JtVmFsdWUpKVxuICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2FzZUxpc3RDb2x1bW5zKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VHlwZVBhcmFtZXRlcnNWaWV3KGRpc3BsYXlUeXBlUGFyYW1ldGVyczogRGlzcGxheVR5cGVQYXJhbWV0ZXJzKTogc3RyaW5nIHtcbiAgICBpZiAoZGlzcGxheVR5cGVQYXJhbWV0ZXJzPy5kYXRlRm9ybWF0KSB7XG4gICAgICByZXR1cm4gZGlzcGxheVR5cGVQYXJhbWV0ZXJzLmRhdGVGb3JtYXQ7XG4gICAgfSBlbHNlIGlmIChkaXNwbGF5VHlwZVBhcmFtZXRlcnM/LmVudW0pIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhkaXNwbGF5VHlwZVBhcmFtZXRlcnMuZW51bSkucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICAgICAgY29uc3Qga2V5VmFsdWVQYWlyU3RyaW5nID0gYCR7Y3Vycn06ICR7ZGlzcGxheVR5cGVQYXJhbWV0ZXJzLmVudW1bY3Vycl19YDtcbiAgICAgICAgaWYgKCFhY2MpIHtcbiAgICAgICAgICByZXR1cm4gYCR7a2V5VmFsdWVQYWlyU3RyaW5nfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7YWNjfSwgJHtrZXlWYWx1ZVBhaXJTdHJpbmd9YDtcbiAgICAgIH0sICcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJy0nO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW4oKTogdm9pZCB7XG4gICAgY29uc3QgdXBkYXRlZENvbHVtbkZvcm1WYWx1ZSA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlO1xuICAgIGNvbnN0IG1hcHBlZFVwZGF0ZWRDb2x1bW4gPSB0aGlzLm1hcEZvcm1WYWx1ZXNUb0NvbHVtbih1cGRhdGVkQ29sdW1uRm9ybVZhbHVlKTtcbiAgICBjb25zdCBjdXJyZW50Q29sdW1ucyA9IHRoaXMuY2FjaGVkQ2FzZUxpc3RDb2x1bW5zO1xuICAgIGNvbnN0IG1hcHBlZEN1cnJlbnRDb2x1bW5zID0gY3VycmVudENvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5Db3B5ID0gey4uLmNvbHVtbn07XG4gICAgICBpZiAoY29sdW1uQ29weS5rZXkgPT09IHVwZGF0ZWRDb2x1bW5Gb3JtVmFsdWUua2V5KSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZWRDb2x1bW4gPSB7Li4uY29sdW1uQ29weSwgLi4ubWFwcGVkVXBkYXRlZENvbHVtbn07XG4gICAgICAgIGlmICghbWFwcGVkVXBkYXRlZENvbHVtbi5kZWZhdWx0U29ydCkge1xuICAgICAgICAgIGRlbGV0ZSBjaGFuZ2VkQ29sdW1uLmRlZmF1bHRTb3J0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VkQ29sdW1uO1xuICAgICAgfVxuICAgICAgaWYgKG1hcHBlZFVwZGF0ZWRDb2x1bW4uZGVmYXVsdFNvcnQpIHtcbiAgICAgICAgZGVsZXRlIGNvbHVtbkNvcHkuZGVmYXVsdFNvcnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sdW1uQ29weTtcbiAgICB9KTtcblxuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZG9jRGVmTmFtZSA9PiB7XG4gICAgICB0aGlzLmRvY3VtZW50U2VydmljZS5wdXRDYXNlTGlzdEZvck1hbmFnZW1lbnQoZG9jRGVmTmFtZSwgbWFwcGVkQ3VycmVudENvbHVtbnMpLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgICAgICAgIHRoaXMucmVmcmVzaENhc2VMaXN0Q29sdW1ucygpO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREb3dubG9hZChcbiAgICBkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcsXG4gICAgY2FzZUxpc3RDb2x1bW5zOiBBcnJheTxDYXNlTGlzdENvbHVtbj5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5kb3dubG9hZE5hbWUkLm5leHQoYCR7ZG9jdW1lbnREZWZpbml0aW9uTmFtZX0uanNvbmApO1xuICAgIHRoaXMuZG93bmxvYWRVcmwkLm5leHQoXG4gICAgICB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKFxuICAgICAgICAnZGF0YTp0ZXh0L2pzb247Y2hhcnNldD1VVEYtOCwnICtcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY2FzZUxpc3RDb2x1bW5zLCBudWxsLCAyKSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5mb3JtR3JvdXAuZGlzYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVJbnB1dCgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5mb3JtR3JvdXAuZW5hYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hDYXNlTGlzdENvbHVtbnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoQ2FzZUxpc3Rjb2x1bW5zJC5uZXh0KG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZvcm1Hcm91cCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5yZXNldCgpO1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuc29ydEl0ZW1zJCwgdGhpcy52aWV3VHlwZUl0ZW1zJF0pXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoW3NvcnRJdGVtcywgdmlld1R5cGVJdGVtc10pID0+IHtcbiAgICAgICAgdGhpcy5kZWZhdWx0RW51bVZhbHVlcyQubmV4dChbe2tleTogJycsIHZhbHVlOiAnJ31dKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4JC5uZXh0KDApO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe2Rpc3BsYXlUeXBlOiB2aWV3VHlwZUl0ZW1zWzBdfSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTb3J0SXRlbUluZGV4JC5uZXh0KDApO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe2RlZmF1bHRTb3J0OiBzb3J0SXRlbXNbMF19KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBGb3JtVmFsdWVzVG9Db2x1bW4oZm9ybVZhbHVlOiBhbnkpOiBDYXNlTGlzdENvbHVtbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogZm9ybVZhbHVlLmtleSxcbiAgICAgIHNvcnRhYmxlOiBmb3JtVmFsdWUuc29ydGFibGUsXG4gICAgICAuLi4oZm9ybVZhbHVlLmRlZmF1bHRTb3J0Py5rZXkgIT09IHRoaXMuSU5WQUxJRF9LRVkgJiYge1xuICAgICAgICBkZWZhdWx0U29ydDogZm9ybVZhbHVlLmRlZmF1bHRTb3J0Py5rZXksXG4gICAgICB9KSxcbiAgICAgIHRpdGxlOiBmb3JtVmFsdWUudGl0bGUgfHwgJycsXG4gICAgICBwYXRoOiBmb3JtVmFsdWUucGF0aCxcbiAgICAgIGRpc3BsYXlUeXBlOiB7XG4gICAgICAgIHR5cGU6IGZvcm1WYWx1ZS5kaXNwbGF5VHlwZT8ua2V5LFxuICAgICAgICBkaXNwbGF5VHlwZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAuLi4oZm9ybVZhbHVlLmRhdGVGb3JtYXQgJiYge2RhdGVGb3JtYXQ6IGZvcm1WYWx1ZS5kYXRlRm9ybWF0fSksXG4gICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZm9ybVZhbHVlLmVudW0pICYmXG4gICAgICAgICAgICBmb3JtVmFsdWUuZW51bS5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgICAgICAgZW51bTogZm9ybVZhbHVlLmVudW0ucmVkdWNlKChhY2MsIGN1cnIpID0+ICh7Li4uYWNjLCBbY3Vyci5rZXldOiBjdXJyLnZhbHVlfSksIHt9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJ7XG4gICAgY2FzZUxpc3RDb2x1bW46IHRyYW5zbGF0ZWRDYXNlTGlzdENvbHVtbnMkIHwgYXN5bmMsXG4gICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgfCBhc3luYyxcbiAgICBoYXNFbnZpcm9ubWVudENvbmZpZzogaGFzRW52aXJvbm1lbnRDb25maWckIHwgYXN5bmMsXG4gICAgZG93bmxvYWRVcmw6IGRvd25sb2FkVXJsJCB8IGFzeW5jLFxuICAgIGRvd25sb2FkTmFtZTogZG93bmxvYWROYW1lJCB8IGFzeW5jLFxuICAgIGxvYWRpbmdDYXNlTGlzdENvbHVtbnM6IGxvYWRpbmdDYXNlTGlzdENvbHVtbnMkIHwgYXN5bmMsXG4gIH0gYXMgb2JzXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3Q7IGNvbnRleHQ6IHtvYnM6IG9ic31cIj48L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3JlYXRlRWRpdE1vZGFsXCI+PC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlbGV0ZU1vZGFsXCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNsaXN0IGxldC1vYnM9XCJvYnNcIj5cbiAgPHZhbHRpbW8tY2FyYm9uLWxpc3RcbiAgICBbYWN0aW9uSXRlbXNdPVwiYWN0aW9uSXRlbXNcIlxuICAgIFtsb2FkaW5nXT1cIm9icy5sb2FkaW5nQ2FzZUxpc3RDb2x1bW5zXCJcbiAgICBbaXRlbXNdPVwib2JzLmNhc2VMaXN0Q29sdW1uXCJcbiAgICBbZmllbGRzXT1cImZpZWxkc1wiXG4gICAgW3ZpZXdNb2RlXT1cImZhbHNlXCJcbiAgICBbaGVhZGVyXT1cImZhbHNlXCJcbiAgICBbbW92aW5nUm93c0VuYWJsZWRdPVwidHJ1ZVwiXG4gICAgKG1vdmVSb3cpPVwib25Nb3ZlUm93RXZlbnQoJGV2ZW50LCBvYnMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSlcIlxuICAgIChyb3dDbGlja2VkKT1cImNvbHVtblJvd0NsaWNrZWQoJGV2ZW50KVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBjYXJib25Ub29sYmFyQ29udGVudFxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25zOyBjb250ZXh0OiB7b2JzOiBvYnN9XCJcbiAgICA+PC9uZy1jb250YWluZXI+XG5cbiAgICA8dmFsdGltby1uby1yZXN1bHRzXG4gICAgICAqbmdJZj1cIiFvYnMuaGFzRW52aXJvbm1lbnRDb25maWdcIlxuICAgICAgW3RpdGxlXT1cIidsaXN0Q29sdW1uLm5vQ29uZmlnV2FybmluZ1RpdGxlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbZGVzY3JpcHRpb25dPVwiJ2xpc3RDb2x1bW4ubm9Db25maWdXYXJuaW5nJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBpbGx1c3RyYXRpb249XCJ2YWx0aW1vLWxheW91dC9pbWcvZW1wdHlzdGF0ZS1lbXB0eS5zdmdcIlxuICAgID48L3ZhbHRpbW8tbm8tcmVzdWx0cz5cblxuICAgIDx2YWx0aW1vLW5vLXJlc3VsdHNcbiAgICAgICpuZ0lmPVwib2JzLmhhc0Vudmlyb25tZW50Q29uZmlnXCJcbiAgICAgIFt0aXRsZV09XCInbGlzdENvbHVtbi5oYXNFbnZDb25maWdXYXJuaW5nVGl0bGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtkZXNjcmlwdGlvbl09XCInbGlzdENvbHVtbi5oYXNFbnZDb25maWdXYXJuaW5nJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBpbGx1c3RyYXRpb249XCJ2YWx0aW1vLWxheW91dC9pbWcvZW1wdHlzdGF0ZS1lcnJvci5zdmdcIlxuICAgID48L3ZhbHRpbW8tbm8tcmVzdWx0cz5cbiAgPC92YWx0aW1vLWNhcmJvbi1saXN0PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNidXR0b25zIGxldC1vYnM9XCJvYnNcIj5cbiAgPGJ1dHRvblxuICAgIGNkc0J1dHRvbj1cImdob3N0XCJcbiAgICBpY29uT25seT1cInRydWVcIlxuICAgIFtocmVmXT1cIm9icy5kb3dubG9hZFVybFwiXG4gICAgW2Rvd25sb2FkXT1cIm9icy5kb3dubG9hZE5hbWVcIlxuICAgIFtkaXNhYmxlZF09XCJcbiAgICAgIG9icy5oYXNFbnZpcm9ubWVudENvbmZpZyB8fFxuICAgICAgIW9icy5kb3dubG9hZFVybCB8fFxuICAgICAgIW9icy5kb3dubG9hZE5hbWUgfHxcbiAgICAgIG9icy5jYXNlTGlzdENvbHVtbj8ubGVuZ3RoIDwgMSB8fFxuICAgICAgb2JzLmRpc2FibGVJbnB1dCB8fFxuICAgICAgbG9hZGluZ0Nhc2VMaXN0Q29sdW1uc1xuICAgIFwiXG4gID5cbiAgICA8c3ZnIGNsYXNzPVwiY2RzLS1idG5fX2ljb25cIiBjZHNJY29uPVwiZG93bmxvYWRcIiBzaXplPVwiMTZcIj48L3N2Zz5cbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgIChjbGljayk9XCJvcGVuTW9kYWwoJ2NyZWF0ZScpXCJcbiAgICBjZHNCdXR0b249XCJwcmltYXJ5XCJcbiAgICBbZGlzYWJsZWRdPVwib2JzLmhhc0Vudmlyb25tZW50Q29uZmlnIHx8IGxvYWRpbmdDYXNlTGlzdENvbHVtbnNcIlxuICA+XG4gICAge3sgJ2xpc3RDb2x1bW4uYWRkQnV0dG9uVGV4dCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8c3ZnIGNsYXNzPVwiY2RzLS1idG5fX2ljb25cIiBjZHNJY29uPVwiYWRkXCIgc2l6ZT1cIjE2XCI+PC9zdmc+XG4gIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNlbnZpcm9ubWVudENvbmZpZ1dhcm5pbmc+XG4gIDxkaXYgY2xhc3M9XCJwbC0yIHByLTIgcGItMiBwdC0yXCI+XG4gICAgPGNkcy1ub3RpZmljYXRpb25cbiAgICAgIFtub3RpZmljYXRpb25PYmpdPVwie1xuICAgICAgICB0eXBlOiAnd2FybmluZycsXG4gICAgICAgIHRpdGxlOiAnbGlzdENvbHVtbi5oYXNFbnZDb25maWdXYXJuaW5nVGl0bGUnIHwgdHJhbnNsYXRlLFxuICAgICAgICBtZXNzYWdlOiAnbGlzdENvbHVtbi5oYXNFbnZDb25maWdXYXJuaW5nJyB8IHRyYW5zbGF0ZSxcbiAgICAgICAgc2hvd0Nsb3NlOiBmYWxzZSxcbiAgICAgIH1cIlxuICAgID5cbiAgICA8L2Nkcy1ub3RpZmljYXRpb24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNub0NvbmZpZ1dhcm5pbmc+XG4gIDxkaXYgY2xhc3M9XCJwbC0yIHByLTIgcGItMiBwdC0yXCI+XG4gICAgPGNkcy1ub3RpZmljYXRpb25cbiAgICAgIFtub3RpZmljYXRpb25PYmpdPVwie1xuICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgIHRpdGxlOiAnbGlzdENvbHVtbi5ub0NvbmZpZ1dhcm5pbmdUaXRsZScgfCB0cmFuc2xhdGUsXG4gICAgICAgIG1lc3NhZ2U6ICdsaXN0Q29sdW1uLm5vQ29uZmlnV2FybmluZycgfCB0cmFuc2xhdGUsXG4gICAgICAgIHNob3dDbG9zZTogZmFsc2UsXG4gICAgICB9XCJcbiAgICA+XG4gICAgPC9jZHMtbm90aWZpY2F0aW9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY3JlYXRlRWRpdE1vZGFsPlxuICA8Y2RzLW1vZGFsXG4gICAgdmFsdGltb0Nkc01vZGFsXG4gICAgKm5nSWY9XCJ7XG4gICAgICB0eXBlOiBjdXJyZW50TW9kYWxUeXBlJCB8IGFzeW5jLFxuICAgICAgc2hvdzogc2hvd01vZGFsJCB8IGFzeW5jLFxuICAgICAgdmFsaWQ6IHZhbGlkJCB8IGFzeW5jLFxuICAgICAgZGlzYWJsZUlucHV0OiBkaXNhYmxlSW5wdXQkIHwgYXN5bmMsXG4gICAgICB2YWxpZEtleTogdmFsaWRLZXkkIHwgYXN5bmMsXG4gICAgICBkaXNhYmxlRGVmYXVsdFNvcnQ6IGRpc2FibGVEZWZhdWx0U29ydCQgfCBhc3luYyxcbiAgICAgIHNob3dFbnVtOiBzaG93RW51bSQgfCBhc3luYyxcbiAgICAgIGlzWWVzTm86IGlzWWVzTm8kIHwgYXN5bmMsXG4gICAgfSBhcyBtb2RhbE9ic1wiXG4gICAgW29wZW5dPVwibW9kYWxPYnMuc2hvd1wiXG4gICAgc2l6ZT1cInNtXCJcbiAgPlxuICAgIDxjZHMtbW9kYWwtaGVhZGVyIFtzaG93Q2xvc2VCdXR0b25dPVwidHJ1ZVwiIChjbG9zZVNlbGVjdCk9XCJjbG9zZU1vZGFsKClcIj5cbiAgICAgIDxoMyBjZHNNb2RhbEhlYWRlckhlYWRpbmc+XG4gICAgICAgIHt7XG4gICAgICAgICAgbW9kYWxPYnMudHlwZSA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgICAgID8gKCdsaXN0Q29sdW1uLmFkZEJ1dHRvblRleHQnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgOiAoJ2xpc3RDb2x1bW4uZWRpdENvbHVtblRpdGxlJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgfX1cbiAgICAgIDwvaDM+XG4gICAgPC9jZHMtbW9kYWwtaGVhZGVyPlxuICAgIDxzZWN0aW9uIGNkc01vZGFsQ29udGVudD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtb2RhbENvbnRlbnQ7IGNvbnRleHQ6IHttb2RhbE9iczogbW9kYWxPYnN9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9zZWN0aW9uPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtb2RhbEZvb3RlcjsgY29udGV4dDoge21vZGFsT2JzOiBtb2RhbE9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9jZHMtbW9kYWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGFsQ29udGVudCBsZXQtbW9kYWxPYnM9XCJtb2RhbE9ic1wiPlxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIGNsYXNzPVwibGlzdC1jb2x1bW4tZm9ybVwiPlxuICAgIDxjZHMtbGFiZWwgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXBcIj5cbiAgICAgICAge3sgJ2xpc3RDb2x1bW4udGl0bGVUaXRsZScgfCB0cmFuc2xhdGUgfX1cblxuICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi50aXRsZVRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxpbnB1dCBjZHNUZXh0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgLz5cbiAgICA8L2Nkcy1sYWJlbD5cblxuICAgIDxjZHMtbGFiZWxcbiAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXQgfHwgbW9kYWxPYnMudHlwZSA9PT0gJ2VkaXQnXCJcbiAgICAgIFtpbnZhbGlkXT1cIm1vZGFsT2JzLnZhbGlkS2V5ID09PSBmYWxzZVwiXG4gICAgICBbaW52YWxpZFRleHRdPVwiJ2xpc3RDb2x1bW4udW5pcXVlS2V5V2FybmluZycgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgIHt7ICdsaXN0Q29sdW1uLmtleScgfCB0cmFuc2xhdGUgfX1cblxuICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5rZXlUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8aW5wdXQgY2RzVGV4dCBmb3JtQ29udHJvbE5hbWU9XCJrZXlcIiBbaW52YWxpZF09XCJtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcIiAvPlxuICAgIDwvY2RzLWxhYmVsPlxuXG4gICAgPGNkcy1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXdpdGgtdG9vbHRpcFwiPlxuICAgICAgICB7eyAnbGlzdENvbHVtbi5wYXRoJyB8IHRyYW5zbGF0ZSB9fVxuXG4gICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgIFt0b29sdGlwXT1cIidsaXN0Q29sdW1uLnBhdGhUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8dmFsdGltby12YWx1ZS1wYXRoLXNlbGVjdG9yXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBhdGhcIlxuICAgICAgICBbZG9jdW1lbnREZWZpbml0aW9uTmFtZV09XCJkb2N1bWVudERlZmluaXRpb25OYW1lJCB8IGFzeW5jXCJcbiAgICAgICAgW3ByZWZpeGVzXT1cIltWYWx1ZVBhdGhTZWxlY3RvclByZWZpeC5ET0MsIFZhbHVlUGF0aFNlbGVjdG9yUHJlZml4LkNBU0VdXCJcbiAgICAgID48L3ZhbHRpbW8tdmFsdWUtcGF0aC1zZWxlY3Rvcj5cbiAgICA8L2Nkcy1sYWJlbD5cblxuICAgIDxjZHMtbGFiZWwgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgIHt7ICdsaXN0Q29sdW1uLmRpc3BsYXlUeXBlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5kaXNwbGF5VHlwZVRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxjZHMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheVR5cGVcIiBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxjZHMtZHJvcGRvd24tbGlzdCBbaXRlbXNdPVwidmlld1R5cGVJdGVtcyQgfCBhc3luY1wiPjwvY2RzLWRyb3Bkb3duLWxpc3Q+XG4gICAgICA8L2Nkcy1kcm9wZG93bj5cbiAgICA8L2Nkcy1sYWJlbD5cblxuICAgIDxjZHMtbGFiZWwgKm5nSWY9XCJzaG93RGF0ZUZvcm1hdCQgfCBhc3luY1wiIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgIHt7ICdsaXN0Q29sdW1uLmRhdGVGb3JtYXQnIHwgdHJhbnNsYXRlIH19XG5cbiAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ2xpc3RDb2x1bW4uZGF0ZUZvcm1hdFRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxpbnB1dCBjZHNUZXh0IGZvcm1Db250cm9sTmFtZT1cImRhdGVGb3JtYXRcIiAvPlxuICAgIDwvY2RzLWxhYmVsPlxuXG4gICAgPGNkcy1sYWJlbCAqbmdJZj1cIm1vZGFsT2JzLnNob3dFbnVtIHx8IG1vZGFsT2JzLmlzWWVzTm9cIiBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXdpdGgtdG9vbHRpcCBzZWxlY3QtbGFiZWxcIj5cbiAgICAgICAge3tcbiAgICAgICAgICBtb2RhbE9icy5pc1llc05vXG4gICAgICAgICAgICA/ICgnbGlzdENvbHVtbi5lbnVtVGl0bGVPcHRpb25hbCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICA6ICgnbGlzdENvbHVtbi5lbnVtVGl0bGUnIHwgdHJhbnNsYXRlKVxuICAgICAgICB9fVxuXG4gICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgIFt0b29sdGlwXT1cIlxuICAgICAgICAgICAgbW9kYWxPYnMuaXNZZXNOb1xuICAgICAgICAgICAgICA/ICgnbGlzdENvbHVtbi5lbnVtVG9vbHRpcE9wdGlvbmFsJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgOiAoJ2xpc3RDb2x1bW4uZW51bVRvb2x0aXAnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8dmFsdGltby1jYXJib24tbXVsdGktaW5wdXRcbiAgICAgICAgKm5nSWY9XCIoc2hvd01vZGFsJCB8IGFzeW5jKSB8fCAobW9kYWxTaG93aW5nJCB8IGFzeW5jKVwiXG4gICAgICAgIHR5cGU9XCJrZXlWYWx1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJlbnVtVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIFtkZWZhdWx0VmFsdWVzXT1cImRlZmF1bHRFbnVtVmFsdWVzJCB8IGFzeW5jXCJcbiAgICAgICAgW2hpZGVBZGRCdXR0b25dPVwibW9kYWxPYnMuaXNZZXNOb1wiXG4gICAgICAgIFtoaWRlRGVsZXRlQnV0dG9uXT1cIm1vZGFsT2JzLmlzWWVzTm9cIlxuICAgICAgICBbbWF4Um93c109XCJtb2RhbE9icy5pc1llc05vID8gMSA6IG51bGxcIlxuICAgICAgICBba2V5Q29sdW1uVGl0bGVdPVwibW9kYWxPYnMuaXNZZXNObyAmJiAoJ3ZpZXdUeXBlQ29udmVydGVyLlllcycgfCB0cmFuc2xhdGUpXCJcbiAgICAgICAgW3ZhbHVlQ29sdW1uVGl0bGVdPVwibW9kYWxPYnMuaXNZZXNObyAmJiAoJ3ZpZXdUeXBlQ29udmVydGVyLk5vJyB8IHRyYW5zbGF0ZSlcIlxuICAgICAgPjwvdmFsdGltby1jYXJib24tbXVsdGktaW5wdXQ+XG4gICAgPC9jZHMtbGFiZWw+XG5cbiAgICA8Y2RzLWNoZWNrYm94IGZvcm1Db250cm9sTmFtZT1cInNvcnRhYmxlXCI+e3sgJ2xpc3RDb2x1bW4uc29ydGFibGUnIHwgdHJhbnNsYXRlIH19IDwvY2RzLWNoZWNrYm94PlxuXG4gICAgPGNkcy1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0IHx8IG1vZGFsT2JzLmRpc2FibGVEZWZhdWx0U29ydFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgIHt7ICdsaXN0Q29sdW1uLmRlZmF1bHRTb3J0VGl0bGUnIHwgdHJhbnNsYXRlIH19XG5cbiAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ2xpc3RDb2x1bW4uZGVmYXVsdFNvcnRUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8Y2RzLWRyb3Bkb3duXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlZmF1bHRTb3J0XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dCB8fCBtb2RhbE9icy5kaXNhYmxlRGVmYXVsdFNvcnRcIlxuICAgICAgPlxuICAgICAgICA8Y2RzLWRyb3Bkb3duLWxpc3QgW2l0ZW1zXT1cInNvcnRJdGVtcyQgfCBhc3luY1wiPjwvY2RzLWRyb3Bkb3duLWxpc3Q+XG4gICAgICA8L2Nkcy1kcm9wZG93bj5cbiAgICA8L2Nkcy1sYWJlbD5cbiAgPC9mb3JtPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtb2RhbEZvb3RlciBsZXQtbW9kYWxPYnM9XCJtb2RhbE9ic1wiPlxuICA8Y2RzLW1vZGFsLWZvb3Rlcj5cbiAgICA8bmctY29udGFpbmVyPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjZHNCdXR0b249XCJzZWNvbmRhcnlcIlxuICAgICAgICBbYXR0ci5tb2RhbC1wcmltYXJ5LWZvY3VzXT1cInRydWVcIlxuICAgICAgICAoY2xpY2spPVwiY2xvc2VNb2RhbCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICA+XG4gICAgICAgIHt7ICdsaXN0Q29sdW1uLmNsb3NlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICAgIFthdHRyLm1vZGFsLXByaW1hcnktZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy52YWxpZCA9PT0gZmFsc2VcIlxuICAgICAgICAoY2xpY2spPVwic2F2ZUNhc0xpc3RDb2x1bW5zKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgbW9kYWxPYnMuZGlzYWJsZUlucHV0IHx8IG1vZGFsT2JzLnZhbGlkID09PSBmYWxzZSB8fCBtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgJ2xpc3RDb2x1bW4uc2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Nkcy1tb2RhbC1mb290ZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlbGV0ZU1vZGFsPlxuICA8dmFsdGltby1jb25maXJtYXRpb24tbW9kYWxcbiAgICBbc2hvd01vZGFsU3ViamVjdCRdPVwic2hvd0RlbGV0ZU1vZGFsJFwiXG4gICAgW291dHB1dE9uQ29uZmlybV09XCJkZWxldGVSb3dLZXkkIHwgYXN5bmNcIlxuICAgIChjb25maXJtRXZlbnQpPVwiZGVsZXRlUm93Q29uZmlybWF0aW9uKCRldmVudClcIlxuICAgIGNvbmZpcm1CdXR0b25UZXh0VHJhbnNsYXRpb25LZXk9XCJsaXN0Q29sdW1uLmRlbGV0ZUNvbHVtblwiXG4gICAgdGl0bGVUcmFuc2xhdGlvbktleT1cImxpc3RDb2x1bW4uZGVsZXRlQ29sdW1uXCJcbiAgICBjb250ZW50VHJhbnNsYXRpb25LZXk9XCJsaXN0Q29sdW1uLmRlbGV0ZUNvbHVtbkNvbmZpcm1hdGlvblwiXG4gID48L3ZhbHRpbW8tY29uZmlybWF0aW9uLW1vZGFsPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==