@tsi-developpement/tsi-shared-ui 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/consts/app-providers.mjs +11 -0
- package/esm2022/lib/consts/html-template.const.mjs +40 -0
- package/esm2022/lib/consts/index.mjs +8 -0
- package/esm2022/lib/consts/localization-key.mjs +12 -0
- package/esm2022/lib/consts/locals.const.mjs +8 -0
- package/esm2022/lib/consts/queryParamNames.const.mjs +11 -0
- package/esm2022/lib/consts/themes.mjs +5 -0
- package/esm2022/lib/consts/tsi-consts.mjs +45 -0
- package/esm2022/lib/end-points/authorization-endpoints.mjs +35 -0
- package/esm2022/lib/end-points/baseuri.mjs +11 -0
- package/esm2022/lib/end-points/endpoints.mjs +208 -0
- package/esm2022/lib/end-points/import-export-endpoint.mjs +35 -0
- package/esm2022/lib/end-points/index.mjs +7 -0
- package/esm2022/lib/end-points/presentation-settings-endpoints.mjs +13 -0
- package/esm2022/lib/end-points/reporting-endpoints.mjs +55 -0
- package/esm2022/lib/end-points/shared-endpoint.mjs +12 -0
- package/esm2022/lib/end-points/user-identity-endpoints.mjs +61 -0
- package/esm2022/lib/enums/Language.mjs +9 -0
- package/esm2022/lib/enums/auto-complete.mjs +6 -0
- package/esm2022/lib/enums/button-type.enum.mjs +6 -0
- package/esm2022/lib/enums/claim-types.mjs +15 -0
- package/esm2022/lib/enums/code-format.mjs +6 -0
- package/esm2022/lib/enums/component-use-modes-enum.mjs +19 -0
- package/esm2022/lib/enums/css-units.mjs +10 -0
- package/esm2022/lib/enums/decimal-format.mjs +8 -0
- package/esm2022/lib/enums/display-types.mjs +35 -0
- package/esm2022/lib/enums/filter-operator-type.mjs +34 -0
- package/esm2022/lib/enums/form-validation-error.mjs +7 -0
- package/esm2022/lib/enums/grid-selection-mode.mjs +7 -0
- package/esm2022/lib/enums/grid-sort-mode.mjs +7 -0
- package/esm2022/lib/enums/http-method-types.mjs +6 -0
- package/esm2022/lib/enums/index.mjs +25 -0
- package/esm2022/lib/enums/input-types.mjs +20 -0
- package/esm2022/lib/enums/layout-orientation.mjs +6 -0
- package/esm2022/lib/enums/logout-reason-enum.mjs +8 -0
- package/esm2022/lib/enums/modal-size-enum.mjs +10 -0
- package/esm2022/lib/enums/report-type.mjs +9 -0
- package/esm2022/lib/enums/status.mjs +9 -0
- package/esm2022/lib/enums/text-box-type.mjs +7 -0
- package/esm2022/lib/enums/tooltipPosition.enum.mjs +8 -0
- package/esm2022/lib/enums/tsi-component-enum.mjs +40 -0
- package/esm2022/lib/enums/type-import.mjs +6 -0
- package/esm2022/lib/functions/array.functions.mjs +8 -0
- package/esm2022/lib/functions/index.mjs +3 -0
- package/esm2022/lib/functions/modal-open.function.mjs +69 -0
- package/esm2022/lib/guards/admin.guard.mjs +37 -0
- package/esm2022/lib/guards/auth.guard.mjs +30 -0
- package/esm2022/lib/guards/index.mjs +4 -0
- package/esm2022/lib/guards/permission.guard.mjs +32 -0
- package/esm2022/lib/interfaces/configuration/configuration.mjs +2 -0
- package/esm2022/lib/interfaces/generic-form/generic-form.mjs +118 -0
- package/esm2022/lib/interfaces/generic-types/dictionary.mjs +2 -0
- package/esm2022/lib/interfaces/grid/grid-configuration.mjs +2 -0
- package/esm2022/lib/interfaces/index.mjs +12 -0
- package/esm2022/lib/interfaces/modal/dynamic.component.mjs +7 -0
- package/esm2022/lib/interfaces/modal/modal-size.mjs +2 -0
- package/esm2022/lib/interfaces/pagination/pagination-base.mjs +2 -0
- package/esm2022/lib/interfaces/select-list/combo-status-model.mjs +10 -0
- package/esm2022/lib/interfaces/settings/app-settings.mjs +2 -0
- package/esm2022/lib/interfaces/styles/css-size-property.mjs +17 -0
- package/esm2022/lib/interfaces/translation/translation.mjs +2 -0
- package/esm2022/lib/models/Notes/Note.mjs +7 -0
- package/esm2022/lib/models/application/configuration/endpoint-infos.mjs +3 -0
- package/esm2022/lib/models/application/configuration/entity-delete-behavior.mjs +2 -0
- package/esm2022/lib/models/authorization/authorization-token-mapper.mjs +24 -0
- package/esm2022/lib/models/authorization/authorization-token.mjs +2 -0
- package/esm2022/lib/models/common/component-descriminator.mjs +2 -0
- package/esm2022/lib/models/common/entity-properties.mjs +2 -0
- package/esm2022/lib/models/common/entity-validations.mjs +2 -0
- package/esm2022/lib/models/common/event-schema.mjs +2 -0
- package/esm2022/lib/models/common/key-value-pair.mjs +2 -0
- package/esm2022/lib/models/entity-info/entity-info.mjs +29 -0
- package/esm2022/lib/models/filter/filter-by-existing-values.mjs +7 -0
- package/esm2022/lib/models/filter/paged-result-request-base.mjs +13 -0
- package/esm2022/lib/models/filter/search-field.mjs +2 -0
- package/esm2022/lib/models/import-export/import-export.mjs +15 -0
- package/esm2022/lib/models/index.mjs +38 -0
- package/esm2022/lib/models/journalisation-application/journalisation-application.mjs +10 -0
- package/esm2022/lib/models/journalisation-application/status-history.mjs +3 -0
- package/esm2022/lib/models/layout/layout-config.mjs +2 -0
- package/esm2022/lib/models/modal/bs-modal.mjs +6 -0
- package/esm2022/lib/models/presentation-settings/presentation-settings.mjs +8 -0
- package/esm2022/lib/models/progress-bar/progress-bar-create-request.mjs +2 -0
- package/esm2022/lib/models/progress-bar/progress-bar-response.mjs +8 -0
- package/esm2022/lib/models/progress-bar/progress-bar-update-request.mjs +3 -0
- package/esm2022/lib/models/remote-services-utility/subscription-result.mjs +17 -0
- package/esm2022/lib/models/reporting/json-data-connection.mjs +2 -0
- package/esm2022/lib/models/reporting/optional-endpoints.mjs +2 -0
- package/esm2022/lib/models/reporting/report-template-response.mjs +2 -0
- package/esm2022/lib/models/reporting/report-to-edit-template.mjs +2 -0
- package/esm2022/lib/models/reporting/report-to-print.mjs +2 -0
- package/esm2022/lib/models/reporting/report-to-template.mjs +2 -0
- package/esm2022/lib/models/settings/devise.mjs +3 -0
- package/esm2022/lib/models/settings/fichier.mjs +6 -0
- package/esm2022/lib/models/settings/type-fichier.mjs +3 -0
- package/esm2022/lib/models/tsi-card/tsi-card.mjs +3 -0
- package/esm2022/lib/models/user-identity/login-response.mjs +7 -0
- package/esm2022/lib/models/user-identity/tenant.mjs +3 -0
- package/esm2022/lib/models/user-identity/user-identity.mjs +3 -0
- package/esm2022/lib/models/workflow/workflow.mjs +14 -0
- package/esm2022/lib/package-initializer.mjs +7 -0
- package/esm2022/lib/pipes/cut-label.pipe.mjs +23 -0
- package/esm2022/lib/pipes/index.mjs +8 -0
- package/esm2022/lib/pipes/localize.pipe.mjs +51 -0
- package/esm2022/lib/pipes/modal-label.pipe.mjs +37 -0
- package/esm2022/lib/pipes/shorten.pipe.mjs +20 -0
- package/esm2022/lib/pipes/to-number.pipe.mjs +20 -0
- package/esm2022/lib/pipes/tsi-currency.pipe.mjs +29 -0
- package/esm2022/lib/pipes/tsi-decimal.pipe.mjs +21 -0
- package/esm2022/lib/providers/index.mjs +2 -0
- package/esm2022/lib/providers/shared-ui-tsi.provider.mjs +15 -0
- package/esm2022/lib/routes/admin.routes.mjs +5 -0
- package/esm2022/lib/routes/app.routes.mjs +7 -0
- package/esm2022/lib/routes/identity.routes.mjs +4 -0
- package/esm2022/lib/routes/index.mjs +5 -0
- package/esm2022/lib/routes/manage-reporting.routes.mjs +5 -0
- package/esm2022/lib/services/Component-Finder/tsi-component-finder.service.mjs +22 -0
- package/esm2022/lib/services/Import-Export/modele-import.service.mjs +59 -0
- package/esm2022/lib/services/Note/Note.service.mjs +35 -0
- package/esm2022/lib/services/UserIdentity/identity-platform-authentication.service.mjs +29 -0
- package/esm2022/lib/services/UserIdentity/user-identity.service.mjs +40 -0
- package/esm2022/lib/services/application/api-explorer.service.mjs +24 -0
- package/esm2022/lib/services/application/app.layout.service.mjs +97 -0
- package/esm2022/lib/services/application/parametres-application-parambase.service.mjs +20 -0
- package/esm2022/lib/services/authorization/authorization.service.mjs +124 -0
- package/esm2022/lib/services/authorization/identity-manager.service.mjs +97 -0
- package/esm2022/lib/services/base/crud-base.service.mjs +38 -0
- package/esm2022/lib/services/configuration/entity-configuration.service.mjs +49 -0
- package/esm2022/lib/services/currentUser/currentUser.service.mjs +49 -0
- package/esm2022/lib/services/date-helper.service.mjs +133 -0
- package/esm2022/lib/services/dialog-data.service.mjs +32 -0
- package/esm2022/lib/services/fichier/fichier-upload.service.mjs +44 -0
- package/esm2022/lib/services/fichier/fichier.service.mjs +20 -0
- package/esm2022/lib/services/formula.service.mjs +20 -0
- package/esm2022/lib/services/generator/html-template-generator.service.mjs +196 -0
- package/esm2022/lib/services/index.mjs +41 -0
- package/esm2022/lib/services/journalisation/journalisation-application.service.mjs +23 -0
- package/esm2022/lib/services/journalisation/status-history.service.mjs +23 -0
- package/esm2022/lib/services/layout/layout-helper.service.mjs +72 -0
- package/esm2022/lib/services/modal/tsi-bs-modal.service.mjs +37 -0
- package/esm2022/lib/services/modal/tsi-modal.service.mjs +21 -0
- package/esm2022/lib/services/module-code/module-code.service.mjs +31 -0
- package/esm2022/lib/services/module-main-parameter.service.mjs +31 -0
- package/esm2022/lib/services/notification/error-response-manager.service.mjs +57 -0
- package/esm2022/lib/services/notification/tsi-confirmation.service.mjs +37 -0
- package/esm2022/lib/services/notification/tsi-message.service.mjs +54 -0
- package/esm2022/lib/services/notification/tsi-notification.service.mjs +47 -0
- package/esm2022/lib/services/presentation-setting/presentation-designer-base.service.mjs +26 -0
- package/esm2022/lib/services/presentation-setting/presentation-designer.service.mjs +58 -0
- package/esm2022/lib/services/presentation-setting/presentation-setting.service.mjs +39 -0
- package/esm2022/lib/services/progress-bar/progress-bar-helper.service.mjs +39 -0
- package/esm2022/lib/services/progress-bar/progress-bar.service.mjs +30 -0
- package/esm2022/lib/services/record-info-popup.service.mjs +21 -0
- package/esm2022/lib/services/reporting/dashboard-module.service.mjs +24 -0
- package/esm2022/lib/services/reporting/reporting.service.mjs +111 -0
- package/esm2022/lib/services/settings/app-settings.service.mjs +47 -0
- package/esm2022/lib/services/settings/keyboard-shortcut.service.mjs +30 -0
- package/esm2022/lib/services/status/entityStatus.service.mjs +21 -0
- package/esm2022/lib/services/translation/translation.service.mjs +71 -0
- package/esm2022/lib/services/validation/entity-validations.service.mjs +21 -0
- package/esm2022/lib/services/validation/generic-validation-state.service.mjs +30 -0
- package/esm2022/lib/services/validation/input-registry.service.mjs +25 -0
- package/esm2022/lib/services/workflow/workflow-configuration.service.mjs +80 -0
- package/esm2022/lib/shared.module.mjs +643 -0
- package/esm2022/lib/tsi-base/components/app-base/app-base.component.mjs +101 -0
- package/esm2022/lib/tsi-base/components/tsi-base/tsi-base.component.mjs +25 -0
- package/esm2022/lib/tsi-base/components/tsi-form-base/tsi-form-base.component.mjs +645 -0
- package/esm2022/lib/tsi-base/components/tsi-list-base/tsi-list-base.component.mjs +514 -0
- package/esm2022/lib/tsi-base/index.mjs +6 -0
- package/esm2022/lib/tsi-base/tsi-input-base/tsi-input-base.component.mjs +141 -0
- package/esm2022/lib/tsi-components/alert-import-message/alert-import-message.component.mjs +19 -0
- package/esm2022/lib/tsi-components/button-components/Tsi-Submit-Button/tsi-submit-button.component.mjs +40 -0
- package/esm2022/lib/tsi-components/button-components/tsi-button/tsi-button.component.mjs +75 -0
- package/esm2022/lib/tsi-components/create-or-edit-entity-informations/create-or-edit-entity-informations.component.mjs +173 -0
- package/esm2022/lib/tsi-components/create-or-edit-modele-import/create-or-edit-modele-import.component.mjs +201 -0
- package/esm2022/lib/tsi-components/index.mjs +80 -0
- package/esm2022/lib/tsi-components/input-components/editable-grid/editable-grid.component.mjs +643 -0
- package/esm2022/lib/tsi-components/input-components/tsi-checkbox/tsi-checkbox.component.mjs +120 -0
- package/esm2022/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.mjs +53 -0
- package/esm2022/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.mjs +62 -0
- package/esm2022/lib/tsi-components/input-components/tsi-date-picker/tsi-date-picker.component.mjs +116 -0
- package/esm2022/lib/tsi-components/input-components/tsi-decimal-input/tsi-decimal-input.component.mjs +51 -0
- package/esm2022/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.mjs +195 -0
- package/esm2022/lib/tsi-components/input-components/tsi-formula-box/tsi-formula-box.component.mjs +54 -0
- package/esm2022/lib/tsi-components/input-components/tsi-integer/tsi-integer.component.mjs +55 -0
- package/esm2022/lib/tsi-components/input-components/tsi-radio-button/tsi-radio-button.component.mjs +43 -0
- package/esm2022/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.mjs +56 -0
- package/esm2022/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.mjs +649 -0
- package/esm2022/lib/tsi-components/input-components/tsi-text-area/tsi-text-area.component.mjs +44 -0
- package/esm2022/lib/tsi-components/input-components/tsi-text-box/tsi-text-box.component.mjs +50 -0
- package/esm2022/lib/tsi-components/input-components/tsi-time-picker/tsi-time-picker.component.mjs +65 -0
- package/esm2022/lib/tsi-components/logout-popup/logout-popup.component.mjs +12 -0
- package/esm2022/lib/tsi-components/manage-import-export/manage-import-export.component.mjs +435 -0
- package/esm2022/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.mjs +148 -0
- package/esm2022/lib/tsi-components/manage-reporting/manage-reporting.component.mjs +1075 -0
- package/esm2022/lib/tsi-components/message-components/tsi-error-message/tsi-error-message.component.mjs +31 -0
- package/esm2022/lib/tsi-components/message-components/tsi-info-message/tsi-info-message.component.mjs +24 -0
- package/esm2022/lib/tsi-components/message-components/tsi-redirection-message/tsi-redirection-message.component.mjs +19 -0
- package/esm2022/lib/tsi-components/message-components/tsi-success-message/tsi-success-message.component.mjs +22 -0
- package/esm2022/lib/tsi-components/modal-component/modal.component.mjs +138 -0
- package/esm2022/lib/tsi-components/modal-loader/modal-loader.component.mjs +58 -0
- package/esm2022/lib/tsi-components/output-components/display-nested-prop/display-nested-prop.component.mjs +32 -0
- package/esm2022/lib/tsi-components/output-components/tsi-checkbox-display/tsi-checkbox-display.component.mjs +18 -0
- package/esm2022/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.mjs +17 -0
- package/esm2022/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.mjs +57 -0
- package/esm2022/lib/tsi-components/output-components/tsi-date-display/tsi-date-display.component.mjs +27 -0
- package/esm2022/lib/tsi-components/output-components/tsi-decimal-display/tsi-decimal-display.component.mjs +25 -0
- package/esm2022/lib/tsi-components/output-components/tsi-display-grid/tsi-display-grid.component.mjs +139 -0
- package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +1509 -0
- package/esm2022/lib/tsi-components/output-components/tsi-image-display/tsi-image-display.component.mjs +144 -0
- package/esm2022/lib/tsi-components/output-components/tsi-integer-display/tsi-integer-display.component.mjs +13 -0
- package/esm2022/lib/tsi-components/output-components/tsi-label/tsi-label.component.mjs +24 -0
- package/esm2022/lib/tsi-components/output-components/tsi-label-legend/tsi-label-legend.component.mjs +18 -0
- package/esm2022/lib/tsi-components/output-components/tsi-legend/tsi-legend.component.mjs +20 -0
- package/esm2022/lib/tsi-components/output-components/tsi-paragraph/tsi-paragraph.component.mjs +17 -0
- package/esm2022/lib/tsi-components/output-components/tsi-rate-display/tsi-rate-display.component.mjs +30 -0
- package/esm2022/lib/tsi-components/output-components/tsi-time-display/tsi-time-display.component.mjs +17 -0
- package/esm2022/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.mjs +427 -0
- package/esm2022/lib/tsi-components/reporting/reporting.component.mjs +667 -0
- package/esm2022/lib/tsi-components/spinner/spinner.component.mjs +15 -0
- package/esm2022/lib/tsi-components/tsi-bubble-info/tsi-bubble-info.component.mjs +21 -0
- package/esm2022/lib/tsi-components/tsi-calender/context-menu/context-menu.component.mjs +46 -0
- package/esm2022/lib/tsi-components/tsi-calender/tsi-calender.component.mjs +297 -0
- package/esm2022/lib/tsi-components/tsi-card/tsi-card.component.mjs +64 -0
- package/esm2022/lib/tsi-components/tsi-card-list/tsi-card-list.component.mjs +112 -0
- package/esm2022/lib/tsi-components/tsi-change-password/tsi-change-password.component.mjs +39 -0
- package/esm2022/lib/tsi-components/tsi-code-generator/tsi-code-generator.component.mjs +83 -0
- package/esm2022/lib/tsi-components/tsi-divider/tsi-divider.component.mjs +18 -0
- package/esm2022/lib/tsi-components/tsi-form/tsi-form.component.mjs +305 -0
- package/esm2022/lib/tsi-components/tsi-form-modal-footer/tsi-form-modal-footer.component.mjs +15 -0
- package/esm2022/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.mjs +883 -0
- package/esm2022/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.mjs +149 -0
- package/esm2022/lib/tsi-components/tsi-kanban/tsi-kanban.component.mjs +231 -0
- package/esm2022/lib/tsi-components/tsi-log-event-history/tsi-log-event-history.component.mjs +119 -0
- package/esm2022/lib/tsi-components/tsi-modal/tsi-modal.component.mjs +25 -0
- package/esm2022/lib/tsi-components/tsi-modal-footer/tsi-modal-footer.component.mjs +119 -0
- package/esm2022/lib/tsi-components/tsi-modal-header/tsi-modal-header.component.mjs +54 -0
- package/esm2022/lib/tsi-components/tsi-notes-avertir/tsi-notes-avertir.component.mjs +27 -0
- package/esm2022/lib/tsi-components/tsi-notes-createoredit/tsi-notes.component.mjs +123 -0
- package/esm2022/lib/tsi-components/tsi-notes-grid/tsi-notes-grid.component.mjs +41 -0
- package/esm2022/lib/tsi-components/tsi-popup-text-viewer/tsi-popup-text-viewer.component.mjs +187 -0
- package/esm2022/lib/tsi-components/tsi-progress-bar/tsi-progress-bar.component.mjs +170 -0
- package/esm2022/lib/tsi-components/tsi-search-box/tsi-search-box.component.mjs +142 -0
- package/esm2022/lib/tsi-components/tsi-send-mail/tsi-send-mail.component.mjs +37 -0
- package/esm2022/lib/tsi-components/tsi-tab-panel/tsi-tab-panel.component.mjs +52 -0
- package/esm2022/lib/tsi-components/tsi-tab-view/tsi-tab-view.component.mjs +46 -0
- package/esm2022/lib/tsi-components/tsi-tenants/tsi-tenants.component.mjs +122 -0
- package/esm2022/lib/tsi-components/tsi-tooltip/tsi-tooltip.component.mjs +21 -0
- package/esm2022/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.mjs +186 -0
- package/esm2022/lib/tsi-components/tsi-upload-grid/tsi-upload-grid.component.mjs +54 -0
- package/esm2022/lib/tsi-directives/auto-select.directive.mjs +33 -0
- package/esm2022/lib/tsi-directives/busy.directive.mjs +32 -0
- package/esm2022/lib/tsi-directives/dynamic-component-loader/ad.directive.mjs +16 -0
- package/esm2022/lib/tsi-directives/index.mjs +8 -0
- package/esm2022/lib/tsi-directives/module-main-parameter.directive.mjs +16 -0
- package/esm2022/lib/tsi-directives/presentation-designer-base.directive.mjs +238 -0
- package/esm2022/lib/tsi-directives/presentation-designer.directive.mjs +205 -0
- package/esm2022/lib/tsi-directives/validation.directive.mjs +85 -0
- package/esm2022/lib/tsi-helpers/compoent-reference.helper.mjs +7 -0
- package/esm2022/lib/tsi-helpers/date-helper.mjs +21 -0
- package/esm2022/lib/tsi-helpers/export-excel.helper.mjs +40 -0
- package/esm2022/lib/tsi-helpers/filter-helper.mjs +126 -0
- package/esm2022/lib/tsi-helpers/grid-col-style.helper.mjs +7 -0
- package/esm2022/lib/tsi-helpers/guid.helper.mjs +19 -0
- package/esm2022/lib/tsi-helpers/helpers.mjs +9 -0
- package/esm2022/lib/tsi-helpers/index.mjs +13 -0
- package/esm2022/lib/tsi-helpers/mapping-helper.mjs +10 -0
- package/esm2022/lib/tsi-helpers/object.helper.mjs +6 -0
- package/esm2022/lib/tsi-helpers/primeng-translate-config.mjs +55 -0
- package/esm2022/lib/tsi-helpers/storage-manager.mjs +33 -0
- package/esm2022/lib/tsi-helpers/type-registry.helper.mjs +49 -0
- package/esm2022/lib/types/enum-description.type.mjs +2 -0
- package/esm2022/lib/types/index.mjs +3 -0
- package/esm2022/lib/types/time-only.mjs +42 -0
- package/esm2022/public-api.mjs +21 -0
- package/esm2022/tsi-developpement-tsi-shared-ui.mjs +5 -0
- package/esm2022/tsi-tsi-shared-ui.mjs +5 -0
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +17486 -0
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -0
- package/fesm2022/tsi-tsi-shared-ui.mjs +17486 -0
- package/fesm2022/tsi-tsi-shared-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/consts/app-providers.d.ts +4 -0
- package/lib/consts/html-template.const.d.ts +12 -0
- package/lib/consts/index.d.ts +7 -0
- package/lib/consts/localization-key.d.ts +11 -0
- package/lib/consts/locals.const.d.ts +7 -0
- package/lib/consts/queryParamNames.const.d.ts +10 -0
- package/lib/consts/themes.d.ts +4 -0
- package/lib/consts/tsi-consts.d.ts +40 -0
- package/lib/end-points/authorization-endpoints.d.ts +31 -0
- package/lib/end-points/baseuri.d.ts +10 -0
- package/lib/end-points/endpoints.d.ts +205 -0
- package/lib/end-points/import-export-endpoint.d.ts +33 -0
- package/lib/end-points/index.d.ts +6 -0
- package/lib/end-points/presentation-settings-endpoints.d.ts +11 -0
- package/lib/end-points/reporting-endpoints.d.ts +53 -0
- package/lib/end-points/shared-endpoint.d.ts +9 -0
- package/lib/end-points/user-identity-endpoints.d.ts +59 -0
- package/lib/enums/Language.d.ts +9 -0
- package/lib/enums/auto-complete.d.ts +4 -0
- package/lib/enums/button-type.enum.d.ts +4 -0
- package/lib/enums/claim-types.d.ts +13 -0
- package/lib/enums/code-format.d.ts +4 -0
- package/lib/enums/component-use-modes-enum.d.ts +17 -0
- package/lib/enums/css-units.d.ts +8 -0
- package/lib/enums/decimal-format.d.ts +6 -0
- package/lib/enums/display-types.d.ts +17 -0
- package/lib/enums/filter-operator-type.d.ts +18 -0
- package/lib/enums/form-validation-error.d.ts +11 -0
- package/lib/enums/grid-selection-mode.d.ts +5 -0
- package/lib/enums/grid-sort-mode.d.ts +5 -0
- package/lib/enums/http-method-types.d.ts +4 -0
- package/lib/enums/index.d.ts +24 -0
- package/lib/enums/input-types.d.ts +18 -0
- package/lib/enums/layout-orientation.d.ts +4 -0
- package/lib/enums/logout-reason-enum.d.ts +6 -0
- package/lib/enums/modal-size-enum.d.ts +10 -0
- package/lib/enums/report-type.d.ts +7 -0
- package/lib/enums/status.d.ts +7 -0
- package/lib/enums/text-box-type.d.ts +5 -0
- package/lib/enums/tooltipPosition.enum.d.ts +6 -0
- package/lib/enums/tsi-component-enum.d.ts +37 -0
- package/lib/enums/type-import.d.ts +4 -0
- package/lib/functions/array.functions.d.ts +1 -0
- package/lib/functions/index.d.ts +1 -0
- package/lib/functions/modal-open.function.d.ts +9 -0
- package/lib/guards/admin.guard.d.ts +14 -0
- package/lib/guards/auth.guard.d.ts +12 -0
- package/lib/guards/index.d.ts +3 -0
- package/lib/guards/permission.guard.d.ts +2 -0
- package/lib/interfaces/configuration/configuration.d.ts +10 -0
- package/lib/interfaces/generic-form/generic-form.d.ts +45 -0
- package/lib/interfaces/generic-types/dictionary.d.ts +3 -0
- package/lib/interfaces/grid/grid-configuration.d.ts +116 -0
- package/lib/interfaces/index.d.ts +11 -0
- package/lib/interfaces/modal/dynamic.component.d.ts +18 -0
- package/lib/interfaces/modal/modal-size.d.ts +4 -0
- package/lib/interfaces/pagination/pagination-base.d.ts +46 -0
- package/lib/interfaces/select-list/combo-status-model.d.ts +8 -0
- package/lib/interfaces/settings/app-settings.d.ts +4 -0
- package/lib/interfaces/styles/css-size-property.d.ts +10 -0
- package/lib/interfaces/translation/translation.d.ts +10 -0
- package/lib/models/Notes/Note.d.ts +25 -0
- package/lib/models/application/configuration/endpoint-infos.d.ts +6 -0
- package/lib/models/application/configuration/entity-delete-behavior.d.ts +6 -0
- package/lib/models/authorization/authorization-token-mapper.d.ts +4 -0
- package/lib/models/authorization/authorization-token.d.ts +16 -0
- package/lib/models/common/component-descriminator.d.ts +4 -0
- package/lib/models/common/entity-properties.d.ts +5 -0
- package/lib/models/common/entity-validations.d.ts +7 -0
- package/lib/models/common/event-schema.d.ts +6 -0
- package/lib/models/common/key-value-pair.d.ts +4 -0
- package/lib/models/entity-info/entity-info.d.ts +37 -0
- package/lib/models/filter/filter-by-existing-values.d.ts +6 -0
- package/lib/models/filter/paged-result-request-base.d.ts +16 -0
- package/lib/models/filter/search-field.d.ts +35 -0
- package/lib/models/import-export/import-export.d.ts +28 -0
- package/lib/models/index.d.ts +37 -0
- package/lib/models/journalisation-application/journalisation-application.d.ts +39 -0
- package/lib/models/journalisation-application/status-history.d.ts +12 -0
- package/lib/models/layout/layout-config.d.ts +3 -0
- package/lib/models/modal/bs-modal.d.ts +5 -0
- package/lib/models/presentation-settings/presentation-settings.d.ts +14 -0
- package/lib/models/progress-bar/progress-bar-create-request.d.ts +8 -0
- package/lib/models/progress-bar/progress-bar-response.d.ts +10 -0
- package/lib/models/progress-bar/progress-bar-update-request.d.ts +9 -0
- package/lib/models/remote-services-utility/subscription-result.d.ts +15 -0
- package/lib/models/reporting/json-data-connection.d.ts +6 -0
- package/lib/models/reporting/optional-endpoints.d.ts +8 -0
- package/lib/models/reporting/report-template-response.d.ts +13 -0
- package/lib/models/reporting/report-to-edit-template.d.ts +29 -0
- package/lib/models/reporting/report-to-print.d.ts +18 -0
- package/lib/models/reporting/report-to-template.d.ts +19 -0
- package/lib/models/settings/devise.d.ts +9 -0
- package/lib/models/settings/fichier.d.ts +14 -0
- package/lib/models/settings/type-fichier.d.ts +4 -0
- package/lib/models/tsi-card/tsi-card.d.ts +9 -0
- package/lib/models/user-identity/login-response.d.ts +8 -0
- package/lib/models/user-identity/tenant.d.ts +5 -0
- package/lib/models/user-identity/user-identity.d.ts +5 -0
- package/lib/models/workflow/workflow.d.ts +36 -0
- package/lib/package-initializer.d.ts +1 -0
- package/lib/pipes/cut-label.pipe.d.ts +7 -0
- package/lib/pipes/index.d.ts +7 -0
- package/lib/pipes/localize.pipe.d.ts +11 -0
- package/lib/pipes/modal-label.pipe.d.ts +10 -0
- package/lib/pipes/shorten.pipe.d.ts +7 -0
- package/lib/pipes/to-number.pipe.d.ts +7 -0
- package/lib/pipes/tsi-currency.pipe.d.ts +10 -0
- package/lib/pipes/tsi-decimal.pipe.d.ts +7 -0
- package/lib/providers/index.d.ts +1 -0
- package/lib/providers/shared-ui-tsi.provider.d.ts +8 -0
- package/lib/routes/admin.routes.d.ts +4 -0
- package/lib/routes/app.routes.d.ts +6 -0
- package/lib/routes/identity.routes.d.ts +3 -0
- package/lib/routes/index.d.ts +4 -0
- package/lib/routes/manage-reporting.routes.d.ts +4 -0
- package/lib/services/Component-Finder/tsi-component-finder.service.d.ts +10 -0
- package/lib/services/Import-Export/modele-import.service.d.ts +21 -0
- package/lib/services/Note/Note.service.d.ts +15 -0
- package/lib/services/UserIdentity/identity-platform-authentication.service.d.ts +13 -0
- package/lib/services/UserIdentity/user-identity.service.d.ts +15 -0
- package/lib/services/application/api-explorer.service.d.ts +13 -0
- package/lib/services/application/app.layout.service.d.ts +47 -0
- package/lib/services/application/parametres-application-parambase.service.d.ts +10 -0
- package/lib/services/authorization/authorization.service.d.ts +46 -0
- package/lib/services/authorization/identity-manager.service.d.ts +23 -0
- package/lib/services/base/crud-base.service.d.ts +20 -0
- package/lib/services/configuration/entity-configuration.service.d.ts +22 -0
- package/lib/services/currentUser/currentUser.service.d.ts +26 -0
- package/lib/services/date-helper.service.d.ts +32 -0
- package/lib/services/dialog-data.service.d.ts +12 -0
- package/lib/services/fichier/fichier-upload.service.d.ts +15 -0
- package/lib/services/fichier/fichier.service.d.ts +10 -0
- package/lib/services/formula.service.d.ts +10 -0
- package/lib/services/generator/html-template-generator.service.d.ts +28 -0
- package/lib/services/index.d.ts +40 -0
- package/lib/services/journalisation/journalisation-application.service.d.ts +12 -0
- package/lib/services/journalisation/status-history.service.d.ts +12 -0
- package/lib/services/layout/layout-helper.service.d.ts +25 -0
- package/lib/services/modal/tsi-bs-modal.service.d.ts +16 -0
- package/lib/services/modal/tsi-modal.service.d.ts +9 -0
- package/lib/services/module-code/module-code.service.d.ts +18 -0
- package/lib/services/module-main-parameter.service.d.ts +12 -0
- package/lib/services/notification/error-response-manager.service.d.ts +13 -0
- package/lib/services/notification/tsi-confirmation.service.d.ts +11 -0
- package/lib/services/notification/tsi-message.service.d.ts +13 -0
- package/lib/services/notification/tsi-notification.service.d.ts +18 -0
- package/lib/services/presentation-setting/presentation-designer-base.service.d.ts +14 -0
- package/lib/services/presentation-setting/presentation-designer.service.d.ts +19 -0
- package/lib/services/presentation-setting/presentation-setting.service.d.ts +16 -0
- package/lib/services/progress-bar/progress-bar-helper.service.d.ts +19 -0
- package/lib/services/progress-bar/progress-bar.service.d.ts +16 -0
- package/lib/services/record-info-popup.service.d.ts +10 -0
- package/lib/services/reporting/dashboard-module.service.d.ts +11 -0
- package/lib/services/reporting/reporting.service.d.ts +32 -0
- package/lib/services/settings/app-settings.service.d.ts +13 -0
- package/lib/services/settings/keyboard-shortcut.service.d.ts +9 -0
- package/lib/services/status/entityStatus.service.d.ts +11 -0
- package/lib/services/translation/translation.service.d.ts +20 -0
- package/lib/services/validation/entity-validations.service.d.ts +10 -0
- package/lib/services/validation/generic-validation-state.service.d.ts +15 -0
- package/lib/services/validation/input-registry.service.d.ts +11 -0
- package/lib/services/workflow/workflow-configuration.service.d.ts +28 -0
- package/lib/shared.module.d.ts +141 -0
- package/lib/tsi-base/components/app-base/app-base.component.d.ts +28 -0
- package/lib/tsi-base/components/tsi-base/tsi-base.component.d.ts +11 -0
- package/lib/tsi-base/components/tsi-form-base/tsi-form-base.component.d.ts +118 -0
- package/lib/tsi-base/components/tsi-list-base/tsi-list-base.component.d.ts +85 -0
- package/lib/tsi-base/index.d.ts +5 -0
- package/lib/tsi-base/tsi-input-base/tsi-input-base.component.d.ts +34 -0
- package/lib/tsi-components/alert-import-message/alert-import-message.component.d.ts +10 -0
- package/lib/tsi-components/button-components/Tsi-Submit-Button/tsi-submit-button.component.d.ts +16 -0
- package/lib/tsi-components/button-components/tsi-button/tsi-button.component.d.ts +26 -0
- package/lib/tsi-components/create-or-edit-entity-informations/create-or-edit-entity-informations.component.d.ts +31 -0
- package/lib/tsi-components/create-or-edit-modele-import/create-or-edit-modele-import.component.d.ts +52 -0
- package/lib/tsi-components/index.d.ts +79 -0
- package/lib/tsi-components/input-components/editable-grid/editable-grid.component.d.ts +127 -0
- package/lib/tsi-components/input-components/tsi-checkbox/tsi-checkbox.component.d.ts +30 -0
- package/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.d.ts +18 -0
- package/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.d.ts +21 -0
- package/lib/tsi-components/input-components/tsi-date-picker/tsi-date-picker.component.d.ts +38 -0
- package/lib/tsi-components/input-components/tsi-decimal-input/tsi-decimal-input.component.d.ts +14 -0
- package/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.d.ts +45 -0
- package/lib/tsi-components/input-components/tsi-formula-box/tsi-formula-box.component.d.ts +17 -0
- package/lib/tsi-components/input-components/tsi-integer/tsi-integer.component.d.ts +19 -0
- package/lib/tsi-components/input-components/tsi-radio-button/tsi-radio-button.component.d.ts +16 -0
- package/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.d.ts +16 -0
- package/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.d.ts +92 -0
- package/lib/tsi-components/input-components/tsi-text-area/tsi-text-area.component.d.ts +17 -0
- package/lib/tsi-components/input-components/tsi-text-box/tsi-text-box.component.d.ts +21 -0
- package/lib/tsi-components/input-components/tsi-time-picker/tsi-time-picker.component.d.ts +23 -0
- package/lib/tsi-components/logout-popup/logout-popup.component.d.ts +5 -0
- package/lib/tsi-components/manage-import-export/manage-import-export.component.d.ts +64 -0
- package/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.d.ts +151 -0
- package/lib/tsi-components/manage-reporting/manage-reporting.component.d.ts +109 -0
- package/lib/tsi-components/message-components/tsi-error-message/tsi-error-message.component.d.ts +15 -0
- package/lib/tsi-components/message-components/tsi-info-message/tsi-info-message.component.d.ts +13 -0
- package/lib/tsi-components/message-components/tsi-redirection-message/tsi-redirection-message.component.d.ts +9 -0
- package/lib/tsi-components/message-components/tsi-success-message/tsi-success-message.component.d.ts +13 -0
- package/lib/tsi-components/modal-component/modal.component.d.ts +25 -0
- package/lib/tsi-components/modal-loader/modal-loader.component.d.ts +27 -0
- package/lib/tsi-components/output-components/display-nested-prop/display-nested-prop.component.d.ts +14 -0
- package/lib/tsi-components/output-components/tsi-checkbox-display/tsi-checkbox-display.component.d.ts +6 -0
- package/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.d.ts +7 -0
- package/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.d.ts +19 -0
- package/lib/tsi-components/output-components/tsi-date-display/tsi-date-display.component.d.ts +10 -0
- package/lib/tsi-components/output-components/tsi-decimal-display/tsi-decimal-display.component.d.ts +9 -0
- package/lib/tsi-components/output-components/tsi-display-grid/tsi-display-grid.component.d.ts +41 -0
- package/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.d.ts +231 -0
- package/lib/tsi-components/output-components/tsi-image-display/tsi-image-display.component.d.ts +46 -0
- package/lib/tsi-components/output-components/tsi-integer-display/tsi-integer-display.component.d.ts +6 -0
- package/lib/tsi-components/output-components/tsi-label/tsi-label.component.d.ts +8 -0
- package/lib/tsi-components/output-components/tsi-label-legend/tsi-label-legend.component.d.ts +6 -0
- package/lib/tsi-components/output-components/tsi-legend/tsi-legend.component.d.ts +9 -0
- package/lib/tsi-components/output-components/tsi-paragraph/tsi-paragraph.component.d.ts +6 -0
- package/lib/tsi-components/output-components/tsi-rate-display/tsi-rate-display.component.d.ts +10 -0
- package/lib/tsi-components/output-components/tsi-time-display/tsi-time-display.component.d.ts +7 -0
- package/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.d.ts +97 -0
- package/lib/tsi-components/reporting/reporting.component.d.ts +103 -0
- package/lib/tsi-components/spinner/spinner.component.d.ts +8 -0
- package/lib/tsi-components/tsi-bubble-info/tsi-bubble-info.component.d.ts +9 -0
- package/lib/tsi-components/tsi-calender/context-menu/context-menu.component.d.ts +25 -0
- package/lib/tsi-components/tsi-calender/tsi-calender.component.d.ts +50 -0
- package/lib/tsi-components/tsi-card/tsi-card.component.d.ts +25 -0
- package/lib/tsi-components/tsi-card-list/tsi-card-list.component.d.ts +35 -0
- package/lib/tsi-components/tsi-change-password/tsi-change-password.component.d.ts +21 -0
- package/lib/tsi-components/tsi-code-generator/tsi-code-generator.component.d.ts +23 -0
- package/lib/tsi-components/tsi-divider/tsi-divider.component.d.ts +6 -0
- package/lib/tsi-components/tsi-form/tsi-form.component.d.ts +91 -0
- package/lib/tsi-components/tsi-form-modal-footer/tsi-form-modal-footer.component.d.ts +8 -0
- package/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.d.ts +156 -0
- package/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.d.ts +28 -0
- package/lib/tsi-components/tsi-kanban/tsi-kanban.component.d.ts +68 -0
- package/lib/tsi-components/tsi-log-event-history/tsi-log-event-history.component.d.ts +35 -0
- package/lib/tsi-components/tsi-modal/tsi-modal.component.d.ts +10 -0
- package/lib/tsi-components/tsi-modal-footer/tsi-modal-footer.component.d.ts +38 -0
- package/lib/tsi-components/tsi-modal-header/tsi-modal-header.component.d.ts +19 -0
- package/lib/tsi-components/tsi-notes-avertir/tsi-notes-avertir.component.d.ts +13 -0
- package/lib/tsi-components/tsi-notes-createoredit/tsi-notes.component.d.ts +21 -0
- package/lib/tsi-components/tsi-notes-grid/tsi-notes-grid.component.d.ts +12 -0
- package/lib/tsi-components/tsi-popup-text-viewer/tsi-popup-text-viewer.component.d.ts +41 -0
- package/lib/tsi-components/tsi-progress-bar/tsi-progress-bar.component.d.ts +38 -0
- package/lib/tsi-components/tsi-search-box/tsi-search-box.component.d.ts +44 -0
- package/lib/tsi-components/tsi-send-mail/tsi-send-mail.component.d.ts +21 -0
- package/lib/tsi-components/tsi-tab-panel/tsi-tab-panel.component.d.ts +18 -0
- package/lib/tsi-components/tsi-tab-view/tsi-tab-view.component.d.ts +17 -0
- package/lib/tsi-components/tsi-tenants/tsi-tenants.component.d.ts +39 -0
- package/lib/tsi-components/tsi-tooltip/tsi-tooltip.component.d.ts +9 -0
- package/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.d.ts +35 -0
- package/lib/tsi-components/tsi-upload-grid/tsi-upload-grid.component.d.ts +13 -0
- package/lib/tsi-directives/auto-select.directive.d.ts +9 -0
- package/lib/tsi-directives/busy.directive.d.ts +11 -0
- package/lib/tsi-directives/dynamic-component-loader/ad.directive.d.ts +8 -0
- package/lib/tsi-directives/index.d.ts +7 -0
- package/lib/tsi-directives/module-main-parameter.directive.d.ts +8 -0
- package/lib/tsi-directives/presentation-designer-base.directive.d.ts +41 -0
- package/lib/tsi-directives/presentation-designer.directive.d.ts +37 -0
- package/lib/tsi-directives/validation.directive.d.ts +18 -0
- package/lib/tsi-helpers/compoent-reference.helper.d.ts +5 -0
- package/lib/tsi-helpers/date-helper.d.ts +6 -0
- package/lib/tsi-helpers/export-excel.helper.d.ts +5 -0
- package/lib/tsi-helpers/filter-helper.d.ts +12 -0
- package/lib/tsi-helpers/grid-col-style.helper.d.ts +5 -0
- package/lib/tsi-helpers/guid.helper.d.ts +6 -0
- package/lib/tsi-helpers/helpers.d.ts +4 -0
- package/lib/tsi-helpers/index.d.ts +12 -0
- package/lib/tsi-helpers/mapping-helper.d.ts +5 -0
- package/lib/tsi-helpers/object.helper.d.ts +3 -0
- package/lib/tsi-helpers/primeng-translate-config.d.ts +54 -0
- package/lib/tsi-helpers/storage-manager.d.ts +8 -0
- package/lib/tsi-helpers/type-registry.helper.d.ts +34 -0
- package/lib/types/enum-description.type.d.ts +3 -0
- package/lib/types/index.d.ts +2 -0
- package/lib/types/time-only.d.ts +17 -0
- package/package.json +24 -0
- package/public-api.d.ts +17 -0
|
@@ -0,0 +1,1075 @@
|
|
|
1
|
+
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import { TooltipPosition } from '../../enums/tooltipPosition.enum';
|
|
3
|
+
import { ButtonType } from '../../enums/button-type.enum';
|
|
4
|
+
import { AddReportPopupComponent } from './add-report-popup/add-report-popup.component';
|
|
5
|
+
import { firstValueFrom } from 'rxjs';
|
|
6
|
+
import { LocalizationKeys } from '../../consts/localization-key';
|
|
7
|
+
import { Segment } from '../../end-points';
|
|
8
|
+
import { GridSelectionMode, TsiReportType, DisplayTypes, CSSUnits, ModalSizeEnum, Modes } from '../../enums';
|
|
9
|
+
import { CSSSizeProperty } from '../../interfaces';
|
|
10
|
+
import { AppRoutes } from '../../routes/app.routes';
|
|
11
|
+
import { TsiFormComponentBaseComponent } from '../../tsi-base/components/tsi-form-base/tsi-form-base.component';
|
|
12
|
+
import { ReportingEndpoints } from '../../end-points/reporting-endpoints';
|
|
13
|
+
import { queryParamNamesConst } from '../../consts/queryParamNames.const';
|
|
14
|
+
import { ManageReportingRoutes } from '../../routes/manage-reporting.routes';
|
|
15
|
+
import { appProviders } from '../../consts/app-providers';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "../../services";
|
|
18
|
+
import * as i2 from "primeng/dynamicdialog";
|
|
19
|
+
import * as i3 from "@angular/router";
|
|
20
|
+
import * as i4 from "@angular/common";
|
|
21
|
+
import * as i5 from "@angular/forms";
|
|
22
|
+
import * as i6 from "primeng/api";
|
|
23
|
+
import * as i7 from "primeng/toolbar";
|
|
24
|
+
import * as i8 from "primeng/dialog";
|
|
25
|
+
import * as i9 from "primeng/dropdown";
|
|
26
|
+
import * as i10 from "primeng/fileupload";
|
|
27
|
+
import * as i11 from "../input-components/tsi-search-combo/tsi-search-combo.component";
|
|
28
|
+
import * as i12 from "../output-components/tsi-label/tsi-label.component";
|
|
29
|
+
import * as i13 from "../output-components/tsi-view-grid/tsi-view-grid.component";
|
|
30
|
+
import * as i14 from "../button-components/tsi-button/tsi-button.component";
|
|
31
|
+
import * as i15 from "../../tsi-directives/busy.directive";
|
|
32
|
+
import * as i16 from "../../pipes/localize.pipe";
|
|
33
|
+
export class ManageReportingComponent extends TsiFormComponentBaseComponent {
|
|
34
|
+
static { this.reportTypeLabels = {
|
|
35
|
+
[TsiReportType.Dashboard]: 'Dashboard',
|
|
36
|
+
[TsiReportType.List]: 'End user',
|
|
37
|
+
[TsiReportType.RTF]: 'RTF',
|
|
38
|
+
}; }
|
|
39
|
+
get isReportForFiche() {
|
|
40
|
+
return !this.otherFormEndpoint?.includes('getallpaged') && !this.requestData;
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
//#region Output properties
|
|
44
|
+
//@Output() hide: EventEmitter<void> = new EventEmitter<void>();
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region ctor
|
|
47
|
+
constructor(
|
|
48
|
+
// public _parametresApplicationPaieService: ParametresApplicationPaieService,
|
|
49
|
+
reportingService, identityManagerService, confirmationService, notificationService, ref, config, _tsiModalService, router) {
|
|
50
|
+
super(ref, config);
|
|
51
|
+
this.reportingService = reportingService;
|
|
52
|
+
this.identityManagerService = identityManagerService;
|
|
53
|
+
this.confirmationService = confirmationService;
|
|
54
|
+
this.notificationService = notificationService;
|
|
55
|
+
this.ref = ref;
|
|
56
|
+
this.config = config;
|
|
57
|
+
this._tsiModalService = _tsiModalService;
|
|
58
|
+
this.router = router;
|
|
59
|
+
//#region properties
|
|
60
|
+
this.EDITION_PERSONNALISE = 'app-edition-personnalise';
|
|
61
|
+
this.reports = [];
|
|
62
|
+
this.toUploadFileData = undefined;
|
|
63
|
+
this.columns = [];
|
|
64
|
+
this.isFromForm = false;
|
|
65
|
+
this.formNames = [];
|
|
66
|
+
this.selectedReports = [];
|
|
67
|
+
this.selectionMode = GridSelectionMode.Multiple;
|
|
68
|
+
this.getFormNamesEndpoint = ReportingEndpoints.getAvailableFormNames();
|
|
69
|
+
this.globalFilterFields = ['name'];
|
|
70
|
+
this.previousFormName = '';
|
|
71
|
+
this.isUpdateReportFromFileDialogVisible = false;
|
|
72
|
+
this.toUploadToUpdateReportFileData = undefined;
|
|
73
|
+
this.defaultReportTemplateData = [];
|
|
74
|
+
this.defaultTemplateColumns = [];
|
|
75
|
+
this.tooltipPosition = TooltipPosition;
|
|
76
|
+
this.isEditionPersonnalise = false;
|
|
77
|
+
this._isReportForFiche = false;
|
|
78
|
+
this.errorMessageKey = 'shared_reporting_error_occured';
|
|
79
|
+
this.dashboardModuleRoute = `${AppRoutes.app}/${AppRoutes.dashboard}`;
|
|
80
|
+
//#endregion
|
|
81
|
+
this.buttonType = ButtonType;
|
|
82
|
+
this.isFormEndpointPaged = false;
|
|
83
|
+
//init columns
|
|
84
|
+
this.columns = [
|
|
85
|
+
{
|
|
86
|
+
field: 'name',
|
|
87
|
+
header: 'shared_reporting_report_name',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
field: 'reportTypeName',
|
|
91
|
+
header: 'shared_reporting_report_type',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
field: 'isDefault',
|
|
95
|
+
header: 'shared_reporting_report_isdefault',
|
|
96
|
+
type: DisplayTypes.CHECKBOX_DISPLAY,
|
|
97
|
+
width: new CSSSizeProperty(10, CSSUnits.PRECENT),
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
header: '',
|
|
101
|
+
field: 'send',
|
|
102
|
+
isButton: true,
|
|
103
|
+
buttonIcon: 'pi pi-send',
|
|
104
|
+
styleClass: 'p-button-text p-button-success',
|
|
105
|
+
toolTipText: 'shared_send_report_by_email',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
header: '',
|
|
109
|
+
field: 'edit',
|
|
110
|
+
isButton: true,
|
|
111
|
+
buttonIcon: 'pi pi-file-edit',
|
|
112
|
+
styleClass: 'p-button-text p-button-success',
|
|
113
|
+
toolTipText: 'shared_reporting_edit',
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
header: '',
|
|
117
|
+
field: 'view',
|
|
118
|
+
isButton: true,
|
|
119
|
+
buttonIcon: 'pi pi-eye',
|
|
120
|
+
styleClass: 'p-button-text p-button-info',
|
|
121
|
+
toolTipText: 'shared_reporting_view',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
header: '',
|
|
125
|
+
field: 'export',
|
|
126
|
+
isButton: true,
|
|
127
|
+
buttonIcon: 'pi pi-file-export',
|
|
128
|
+
styleClass: 'p-button-text p-button-help',
|
|
129
|
+
toolTipText: 'shared_reporting_export',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
header: '',
|
|
133
|
+
field: 'import',
|
|
134
|
+
isButton: true,
|
|
135
|
+
buttonIcon: 'pi pi-paperclip',
|
|
136
|
+
styleClass: 'p-button-text p-button-warning',
|
|
137
|
+
toolTipText: 'shared_reporting_import',
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
header: '',
|
|
141
|
+
field: 'default',
|
|
142
|
+
isButton: true,
|
|
143
|
+
buttonIcon: 'pi pi-bookmark-fill',
|
|
144
|
+
styleClass: 'p-button-text',
|
|
145
|
+
toolTipText: 'shared_reporting_set_default',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
header: '',
|
|
149
|
+
field: 'delete',
|
|
150
|
+
isButton: true,
|
|
151
|
+
buttonIcon: 'pi pi-trash',
|
|
152
|
+
styleClass: 'p-button-text p-button-danger',
|
|
153
|
+
toolTipText: 'shared_reporting_delete_report',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
header: '',
|
|
157
|
+
field: 'Add_To_BuiltIn_Templates',
|
|
158
|
+
isButton: true,
|
|
159
|
+
buttonIcon: 'pi pi-arrow-circle-down',
|
|
160
|
+
styleClass: 'p-button-text p-button-help',
|
|
161
|
+
toolTipText: 'shared_reporting_export_dev_report',
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
header: '',
|
|
165
|
+
field: 'Make_default_report_layout',
|
|
166
|
+
isButton: true,
|
|
167
|
+
buttonIcon: 'pi pi-bookmark-fill',
|
|
168
|
+
styleClass: 'p-button-text p-button-danger',
|
|
169
|
+
toolTipText: 'shared_reporting_make_default_report_layout',
|
|
170
|
+
},
|
|
171
|
+
];
|
|
172
|
+
this.defaultTemplateColumns = [
|
|
173
|
+
{
|
|
174
|
+
field: 'name',
|
|
175
|
+
header: 'shared_reporting_report_name',
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
field: 'reportTypeName',
|
|
179
|
+
header: 'shared_reporting_report_type',
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
header: '',
|
|
183
|
+
field: 'deleteDefaultReportFile',
|
|
184
|
+
isButton: true,
|
|
185
|
+
buttonIcon: 'pi pi-trash',
|
|
186
|
+
styleClass: 'p-button-text p-button-danger',
|
|
187
|
+
toolTipText: 'shared_reporting_delete_default_report',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
header: '',
|
|
191
|
+
field: 'Add_From_BuiltIn_Templates',
|
|
192
|
+
isButton: true,
|
|
193
|
+
buttonIcon: 'pi pi-arrow-circle-up',
|
|
194
|
+
styleClass: 'p-button-text p-button-primary',
|
|
195
|
+
toolTipText: 'shared_reporting_add_to_my_list_report',
|
|
196
|
+
},
|
|
197
|
+
];
|
|
198
|
+
}
|
|
199
|
+
//#endregion
|
|
200
|
+
checkIfIsDevMode() {
|
|
201
|
+
if (Segment.production) {
|
|
202
|
+
let buttonAdBuiltinTemplatesIndex = this.columns.findIndex((col) => {
|
|
203
|
+
return col.field == 'Add_To_BuiltIn_Templates';
|
|
204
|
+
});
|
|
205
|
+
if (buttonAdBuiltinTemplatesIndex != -1) {
|
|
206
|
+
this.columns.splice(buttonAdBuiltinTemplatesIndex, 1);
|
|
207
|
+
}
|
|
208
|
+
let buttonDeleteDefaultReportFileIndex = this.defaultTemplateColumns.findIndex((col) => {
|
|
209
|
+
return col.field == 'deleteDefaultReportFile';
|
|
210
|
+
});
|
|
211
|
+
if (buttonDeleteDefaultReportFileIndex != -1) {
|
|
212
|
+
this.defaultTemplateColumns.splice(buttonDeleteDefaultReportFileIndex, 1);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//handle Lifecycle Hooks
|
|
217
|
+
async ngOnInit() {
|
|
218
|
+
this.isEditionPersonnalise = this.router.url.includes('administration');
|
|
219
|
+
this.checkIfIsDevMode();
|
|
220
|
+
super.ngOnInit();
|
|
221
|
+
// if (this.otherFormName ) {
|
|
222
|
+
this.isFromForm = true;
|
|
223
|
+
this.columns.splice(3, 0, {
|
|
224
|
+
header: '',
|
|
225
|
+
field: 'print',
|
|
226
|
+
isButton: true,
|
|
227
|
+
buttonIcon: 'pi pi-print',
|
|
228
|
+
styleClass: 'p-button-text p-button-secondary',
|
|
229
|
+
toolTipText: 'shared_reporting_report_print',
|
|
230
|
+
});
|
|
231
|
+
if (this.otherFormName && this.otherFormName != 'app-manage-reporting') {
|
|
232
|
+
this.formNames = [{ key: this.otherFormName, value: this.otherFormName }];
|
|
233
|
+
}
|
|
234
|
+
this.entityId = this.config.data?.id;
|
|
235
|
+
this.customReportingMode = this.config?.data?.customReportingMode;
|
|
236
|
+
this.httpMethodType = this.config?.data?.httpMethodType;
|
|
237
|
+
await this._refreshReports(true);
|
|
238
|
+
}
|
|
239
|
+
ngOnDestroy() {
|
|
240
|
+
super.ngOnDestroy();
|
|
241
|
+
if (this.refreshJobTimeOut) {
|
|
242
|
+
clearTimeout(this.refreshJobTimeOut);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//#endregion
|
|
246
|
+
//#region handle events
|
|
247
|
+
async onRefresh() {
|
|
248
|
+
await this._refreshReports(true);
|
|
249
|
+
}
|
|
250
|
+
onPrintDefault(event) {
|
|
251
|
+
if (this.otherFormName) {
|
|
252
|
+
this.reportingService.getDefaultReport(this.otherFormName).subscribe({
|
|
253
|
+
next: (data) => {
|
|
254
|
+
// let defaultReportId: string = data;
|
|
255
|
+
this._viewReport(data.uid);
|
|
256
|
+
},
|
|
257
|
+
error: (error) => { },
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
onFileSelected(event) {
|
|
262
|
+
const file = event.currentFiles[0];
|
|
263
|
+
this.toUploadFileData = file;
|
|
264
|
+
}
|
|
265
|
+
onImportFile(event) {
|
|
266
|
+
this.reportingService.uploadReportFile(this.toUploadFileData, this.reportDiscriminator).subscribe({
|
|
267
|
+
next: async (response) => {
|
|
268
|
+
await this._refreshReports();
|
|
269
|
+
this.notificationService.success('shared_reporting_report_uploaded_successfully');
|
|
270
|
+
this.fileUpload?.clear();
|
|
271
|
+
},
|
|
272
|
+
error: () => {
|
|
273
|
+
this.notificationService.error(this.errorMessageKey);
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
//cancel button click
|
|
278
|
+
onClear(event) {
|
|
279
|
+
this.toUploadFileData = undefined;
|
|
280
|
+
}
|
|
281
|
+
//cancel button click
|
|
282
|
+
onRemove(event) {
|
|
283
|
+
this.toUploadFileData = undefined;
|
|
284
|
+
}
|
|
285
|
+
handleButtonColumnClicked(event) {
|
|
286
|
+
switch (event.field) {
|
|
287
|
+
case 'send': {
|
|
288
|
+
console.log('send');
|
|
289
|
+
this._sendReport(event.key);
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
case 'edit': {
|
|
293
|
+
console.log('edit');
|
|
294
|
+
this._editReport(event.key);
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
case 'view': {
|
|
298
|
+
console.log('view');
|
|
299
|
+
this._viewDashboardt(event.key);
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
case 'delete': {
|
|
303
|
+
console.log('delete');
|
|
304
|
+
this._deleteReport(event.key);
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
case 'print': {
|
|
308
|
+
console.log('print');
|
|
309
|
+
this._viewReport(event.key);
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
case 'export': {
|
|
313
|
+
console.log('export');
|
|
314
|
+
this._exportReport(event.key);
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
case 'default': {
|
|
318
|
+
console.log('default');
|
|
319
|
+
this._setDefaultReport(event.key);
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
case 'import': {
|
|
323
|
+
console.log('import');
|
|
324
|
+
this._importToReport(event.key);
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
case 'Add_From_BuiltIn_Templates': {
|
|
328
|
+
console.log('Add_From_BuiltIn_Templates');
|
|
329
|
+
this._addFromBuiltInTemplates(event.key);
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
case 'Add_To_BuiltIn_Templates': {
|
|
333
|
+
console.log('Add_To_BuiltIn_Templates');
|
|
334
|
+
this._addToBuiltInTemplates(event.key);
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
case 'preview': {
|
|
338
|
+
console.log('preview');
|
|
339
|
+
this.previewBuiltInReportTemplate(event.key);
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
case 'Make_default_report_layout': {
|
|
343
|
+
this.makeReportDefaultLayout(event.key);
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
case 'deleteDefaultReportFile': {
|
|
347
|
+
this.deleteDefaultReportFile(event.key);
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
default:
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
deleteDefaultReportFile(fileName) {
|
|
355
|
+
this.confirmationService.confirm(LocalizationKeys.confirmDelete, undefined, (result) => {
|
|
356
|
+
if (result && result == true) {
|
|
357
|
+
this.isloading = true;
|
|
358
|
+
let formName = this.otherFormName ?? this.EDITION_PERSONNALISE;
|
|
359
|
+
this.reportingService
|
|
360
|
+
.deleteDefaultReportTemplateFile(formName, fileName)
|
|
361
|
+
.subscribe({
|
|
362
|
+
next: async () => {
|
|
363
|
+
await this._refreshReports(true);
|
|
364
|
+
this.notificationService.success(LocalizationKeys.deletedSuccessfully);
|
|
365
|
+
this.isloading = false;
|
|
366
|
+
},
|
|
367
|
+
error: () => {
|
|
368
|
+
this.notificationService.error(this.errorMessageKey);
|
|
369
|
+
this.isloading = false;
|
|
370
|
+
},
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
onDeleteSelectedReports() {
|
|
376
|
+
this.confirmationService.confirm(LocalizationKeys.confirmDelete, undefined, (result) => {
|
|
377
|
+
if (result &&
|
|
378
|
+
this.selectedReports != null &&
|
|
379
|
+
this.selectedReports != undefined) {
|
|
380
|
+
this.isloading = true;
|
|
381
|
+
this.reportingService
|
|
382
|
+
.deleteMultipleReports(this.selectedReports)
|
|
383
|
+
.subscribe({
|
|
384
|
+
next: async () => {
|
|
385
|
+
await this._refreshReports();
|
|
386
|
+
this.notificationService.success(LocalizationKeys.deletedSuccessfully);
|
|
387
|
+
this.isloading = false;
|
|
388
|
+
},
|
|
389
|
+
error: (error) => {
|
|
390
|
+
this.notificationService.error(this.errorMessageKey);
|
|
391
|
+
this.isloading = false;
|
|
392
|
+
},
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
onNewReport() {
|
|
398
|
+
if ((this.otherFormEndpoint && this.otherFormName) ||
|
|
399
|
+
this.isEditionPersonnalise) {
|
|
400
|
+
let reportToTemplateId;
|
|
401
|
+
let modalSize = ModalSizeEnum.Large;
|
|
402
|
+
let config = {
|
|
403
|
+
maximizable: true,
|
|
404
|
+
width: modalSize.width,
|
|
405
|
+
height: modalSize.height,
|
|
406
|
+
data: {
|
|
407
|
+
mode: Modes.create,
|
|
408
|
+
isEditionPersonnalise: this.isEditionPersonnalise,
|
|
409
|
+
fromEndpoint: this.otherFormEndpoint,
|
|
410
|
+
businessClass: this.businessClass,
|
|
411
|
+
customReportingMode: this.customReportingMode
|
|
412
|
+
},
|
|
413
|
+
};
|
|
414
|
+
this._dialogRef = this._tsiModalService.open(AddReportPopupComponent, config);
|
|
415
|
+
this._dialogRef.onClose.subscribe((val) => {
|
|
416
|
+
if (val === null || val === undefined)
|
|
417
|
+
return;
|
|
418
|
+
console.log(val);
|
|
419
|
+
if (this.isReportForFiche) {
|
|
420
|
+
val.endPointValue = val?.endPointValue?.replace('{id}', this.entityId);
|
|
421
|
+
val.endPointKey = val?.endPointKey?.replace('{id}', this.entityId);
|
|
422
|
+
}
|
|
423
|
+
this.reportingService
|
|
424
|
+
.addReportToModel(this._newReportToTemplate(val.reportType, val.reportName, val.endPointValue, val.module, val.triOrdre, val.reportNameAbrege, val.display))
|
|
425
|
+
.subscribe({
|
|
426
|
+
next: (value) => {
|
|
427
|
+
this.isloading = true;
|
|
428
|
+
reportToTemplateId = value;
|
|
429
|
+
let urlDesigner;
|
|
430
|
+
let tenantUid = this.identityManagerService.parseMyAuthToken()?.tenantUid;
|
|
431
|
+
if (val.reportType === TsiReportType.List) {
|
|
432
|
+
urlDesigner = `${Segment.reportingServiceBase}/report-designer/${reportToTemplateId}?${queryParamNamesConst.tenantUid}=${tenantUid}`;
|
|
433
|
+
}
|
|
434
|
+
else if (val.reportType === TsiReportType.Dashboard) {
|
|
435
|
+
urlDesigner = `${Segment.appBaseHref}/${this.dashboardModuleRoute}/${ManageReportingRoutes.dashboardDesigner}?${queryParamNamesConst.reportToTemplate}=${reportToTemplateId}&${queryParamNamesConst.tenantUid}=${tenantUid}`;
|
|
436
|
+
}
|
|
437
|
+
else if (val.reportType === TsiReportType.RTF) {
|
|
438
|
+
urlDesigner = `${Segment.reportingServiceBase}/mailmerge/${reportToTemplateId}?${queryParamNamesConst.tenantUid}=${tenantUid}`;
|
|
439
|
+
}
|
|
440
|
+
window.open(urlDesigner, '_blank');
|
|
441
|
+
this.notificationService.success('shared_reporting_redirected_to_new_report_successfully');
|
|
442
|
+
this.isloading = false;
|
|
443
|
+
},
|
|
444
|
+
error: () => {
|
|
445
|
+
this.isloading = false;
|
|
446
|
+
this.notificationService.error(this.errorMessageKey);
|
|
447
|
+
},
|
|
448
|
+
});
|
|
449
|
+
this._closeModal(val);
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
_closeModal(val) {
|
|
454
|
+
if (this._dialogRef) {
|
|
455
|
+
this._dialogRef.destroy();
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
async onFormChange() {
|
|
459
|
+
await this._refreshReports();
|
|
460
|
+
}
|
|
461
|
+
onImportFileToReportModalCancelClick() {
|
|
462
|
+
this._hideImportFileToReportDialog();
|
|
463
|
+
}
|
|
464
|
+
onImportFileToReportModalSaveClick() {
|
|
465
|
+
this._showImportFileToReportDialog();
|
|
466
|
+
}
|
|
467
|
+
//#region file import
|
|
468
|
+
onImportFileToReport_FileSelected(event) {
|
|
469
|
+
const file = event.currentFiles[0];
|
|
470
|
+
this.toUploadToUpdateReportFileData = file;
|
|
471
|
+
}
|
|
472
|
+
onImportFileToReport_ImportFile(event) {
|
|
473
|
+
if (this.selectedReportToUpdateFromFile) {
|
|
474
|
+
this.reportingService
|
|
475
|
+
.updateReportLayout(this.selectedReportToUpdateFromFile, this.toUploadToUpdateReportFileData)
|
|
476
|
+
.subscribe({
|
|
477
|
+
next: async (response) => {
|
|
478
|
+
await this._refreshReports();
|
|
479
|
+
this.notificationService.success('shared_reporting_report_uploaded_successfully');
|
|
480
|
+
this.importFileToReportFileUpload?.clear();
|
|
481
|
+
this._hideImportFileToReportDialog();
|
|
482
|
+
},
|
|
483
|
+
error: () => {
|
|
484
|
+
this.notificationService.error(this.errorMessageKey);
|
|
485
|
+
},
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
//cancel button click
|
|
490
|
+
onImportFileToReport_Clear(event) {
|
|
491
|
+
this.toUploadToUpdateReportFileData = undefined;
|
|
492
|
+
}
|
|
493
|
+
//cancel button click
|
|
494
|
+
onImportFileToReport_Remove(event) {
|
|
495
|
+
this.toUploadToUpdateReportFileData = undefined;
|
|
496
|
+
}
|
|
497
|
+
//#endregion
|
|
498
|
+
//#endregion
|
|
499
|
+
//#region private methods
|
|
500
|
+
getFormName(formName) {
|
|
501
|
+
if (this.config?.data?.reportDiscriminator)
|
|
502
|
+
return `${formName}_${this.config.data.reportDiscriminator}`;
|
|
503
|
+
else
|
|
504
|
+
return formName;
|
|
505
|
+
}
|
|
506
|
+
async _refreshReports(refreshReportList = false) {
|
|
507
|
+
this.isloading = true;
|
|
508
|
+
let formName = this.otherFormName
|
|
509
|
+
? this.otherFormName
|
|
510
|
+
: this.EDITION_PERSONNALISE;
|
|
511
|
+
try {
|
|
512
|
+
let items = await firstValueFrom(this.reportingService.getReports(formName, this.reportDiscriminator));
|
|
513
|
+
this.reports = items.map((r) => {
|
|
514
|
+
return {
|
|
515
|
+
...r,
|
|
516
|
+
reportTypeName: ManageReportingComponent.reportTypeLabels[r.reportType] ||
|
|
517
|
+
'Unknown',
|
|
518
|
+
};
|
|
519
|
+
});
|
|
520
|
+
this.isloading = false;
|
|
521
|
+
}
|
|
522
|
+
catch (error) {
|
|
523
|
+
this.notificationService.error(this.errorMessageKey);
|
|
524
|
+
this.isloading = false;
|
|
525
|
+
}
|
|
526
|
+
if (refreshReportList) {
|
|
527
|
+
try {
|
|
528
|
+
//get default report templates for this form
|
|
529
|
+
let result = await firstValueFrom(this.reportingService.getDefaultReportTemplate(formName));
|
|
530
|
+
this.defaultReportTemplateData = result?.data;
|
|
531
|
+
}
|
|
532
|
+
catch (error) {
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
_viewReport(uid) {
|
|
537
|
+
// if (this.otherFormEndpoint && uid) {
|
|
538
|
+
this.isloading = true;
|
|
539
|
+
let report = this.reports.find((r) => r.uid === uid);
|
|
540
|
+
if (report === undefined || report === null) {
|
|
541
|
+
this.notificationService.error(this.errorMessageKey);
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
this.reportingService
|
|
545
|
+
.addReportToPrint(this._newReportToPrint(uid, report.reportType, report?.restEndpoint))
|
|
546
|
+
.subscribe({
|
|
547
|
+
next: (data) => {
|
|
548
|
+
let reportToTemplateId = data.uid;
|
|
549
|
+
let urlDesigner;
|
|
550
|
+
let tenantUid = this.identityManagerService.parseMyAuthToken()?.tenantUid;
|
|
551
|
+
if (data.reportType === TsiReportType.List) {
|
|
552
|
+
urlDesigner = `${Segment.reportingServiceBase}/report-viewer/${reportToTemplateId}?${queryParamNamesConst.tenantUid}=${tenantUid}`;
|
|
553
|
+
}
|
|
554
|
+
else if (data.reportType === TsiReportType.Dashboard) {
|
|
555
|
+
urlDesigner = `${Segment.appBaseHref}/${this.dashboardModuleRoute}/${ManageReportingRoutes.dashboardDesigner}?${queryParamNamesConst.reportToPrint}=${reportToTemplateId}&${queryParamNamesConst.tenantUid}=${tenantUid}`;
|
|
556
|
+
}
|
|
557
|
+
window.open(urlDesigner, '_blank');
|
|
558
|
+
this.notificationService.success('shared_reporting_redirected_to_print_report_successfully');
|
|
559
|
+
this.isloading = false;
|
|
560
|
+
},
|
|
561
|
+
error: (error) => {
|
|
562
|
+
this.notificationService.error(this.errorMessageKey);
|
|
563
|
+
this.isloading = false;
|
|
564
|
+
},
|
|
565
|
+
complete: () => { },
|
|
566
|
+
});
|
|
567
|
+
// }
|
|
568
|
+
}
|
|
569
|
+
_sendReport(uid) {
|
|
570
|
+
// this.isloading = true;
|
|
571
|
+
//get email parameters
|
|
572
|
+
// this._parametresApplicationPaieService
|
|
573
|
+
// .getParametreApplicationPaie()
|
|
574
|
+
// .subscribe((data) => {
|
|
575
|
+
// this.parametre = data;
|
|
576
|
+
// });
|
|
577
|
+
// let report = this.reports.find((r) => r.uid === uid);
|
|
578
|
+
// if (report === undefined || report === null) {
|
|
579
|
+
// this.notificationService.error(this.errorMessageKey);
|
|
580
|
+
// return;
|
|
581
|
+
// }
|
|
582
|
+
// this.reportingService
|
|
583
|
+
// .addReportToPrint(
|
|
584
|
+
// this._newReportToPrint(uid, report.reportType, report?.restEndpoint)
|
|
585
|
+
// )
|
|
586
|
+
// .subscribe({
|
|
587
|
+
// next: (data: any) => {
|
|
588
|
+
// if (data != null && data != undefined) {
|
|
589
|
+
// this.reportToPrintId = data.uid;
|
|
590
|
+
// let modalSize = ModalSizeEnum.ExtraLarge;
|
|
591
|
+
// let saveSubject: Subject<any> = new Subject();
|
|
592
|
+
// let conf: DynamicDialogConfig = {
|
|
593
|
+
// data: { saveSubject },
|
|
594
|
+
// maximizable: true,
|
|
595
|
+
// width: modalSize.width,
|
|
596
|
+
// height: modalSize.height,
|
|
597
|
+
// };
|
|
598
|
+
// this._dialogRef = this._dialogService.open(
|
|
599
|
+
// TsiSendMailComponent,
|
|
600
|
+
// conf
|
|
601
|
+
// );
|
|
602
|
+
// saveSubject.subscribe((val: any) => {
|
|
603
|
+
// this.reportingService
|
|
604
|
+
// .exportReportFileToPdf(this.reportToPrintId!.toString())
|
|
605
|
+
// .subscribe(
|
|
606
|
+
// (blob) => {
|
|
607
|
+
// if (!this.parametre.attachments) {
|
|
608
|
+
// this.parametre.attachments = [];
|
|
609
|
+
// }
|
|
610
|
+
// const newFile = new File([blob], 'Report.pdf', {
|
|
611
|
+
// type: blob.type,
|
|
612
|
+
// });
|
|
613
|
+
// this.parametre.attachments.push(newFile);
|
|
614
|
+
// this._parametresApplicationPaieService
|
|
615
|
+
// .sendMail(
|
|
616
|
+
// this.parametre.fromAddress,
|
|
617
|
+
// this._dialogDataService.getData()?.toAddress,
|
|
618
|
+
// this._dialogDataService.getData()?.objet,
|
|
619
|
+
// this._dialogDataService.getData()?.message,
|
|
620
|
+
// this.parametre.attachments,
|
|
621
|
+
// this.parametre.host,
|
|
622
|
+
// this.parametre.credentialUser,
|
|
623
|
+
// this.parametre.credentialPWD,
|
|
624
|
+
// this.parametre.port,
|
|
625
|
+
// this.parametre.fromName,
|
|
626
|
+
// this._dialogDataService.getData()?.ccAddress
|
|
627
|
+
// )
|
|
628
|
+
// .subscribe({
|
|
629
|
+
// next: () => {
|
|
630
|
+
// this.notificationService.info(
|
|
631
|
+
// this.localization.transform(
|
|
632
|
+
// LocalizationKeys.savedSuccessfully
|
|
633
|
+
// )
|
|
634
|
+
// );
|
|
635
|
+
// this.isloading = false;
|
|
636
|
+
// },
|
|
637
|
+
// error: (response: HttpErrorResponse) => {
|
|
638
|
+
// console.log(response);
|
|
639
|
+
// this._errorResponseManagerService.showErrorMessage(
|
|
640
|
+
// response
|
|
641
|
+
// );
|
|
642
|
+
// },
|
|
643
|
+
// });
|
|
644
|
+
// },
|
|
645
|
+
// (error) => {
|
|
646
|
+
// console.error('Error downloading the PDF', error);
|
|
647
|
+
// }
|
|
648
|
+
// );
|
|
649
|
+
// this.notificationService.success(
|
|
650
|
+
// 'shared_reporting_redirected_to_print_report_successfully'
|
|
651
|
+
// );
|
|
652
|
+
// });
|
|
653
|
+
// this._dialogRef.onClose.subscribe((val?: any) => {
|
|
654
|
+
// this._closeModal(val);
|
|
655
|
+
// });
|
|
656
|
+
// }
|
|
657
|
+
// },
|
|
658
|
+
// error: (error) => {
|
|
659
|
+
// this.notificationService.error(this.errorMessageKey);
|
|
660
|
+
// this.isloading = false;
|
|
661
|
+
// },
|
|
662
|
+
// complete: () => { },
|
|
663
|
+
// });
|
|
664
|
+
}
|
|
665
|
+
_editReport(uid) {
|
|
666
|
+
this.isloading = true;
|
|
667
|
+
let report = this.reports.find((r) => r.uid === uid);
|
|
668
|
+
if (report === undefined || report === null) {
|
|
669
|
+
this.notificationService.error(this.errorMessageKey);
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
this.reportingService
|
|
673
|
+
.addReportToEditTemplate(this._newReportToEditTemplate(uid, report.reportType, report?.restEndpoint, report?.module, report?.order, report?.reportName, report?.shortName, report?.display))
|
|
674
|
+
.subscribe({
|
|
675
|
+
next: (value) => {
|
|
676
|
+
console.log(value);
|
|
677
|
+
if (this.isReportForFiche) {
|
|
678
|
+
const guidRegex = /[0-9a-fA-F-]{36}/;
|
|
679
|
+
value.restEndpoint = value?.restEndpoint?.replace(guidRegex, '{id}');
|
|
680
|
+
}
|
|
681
|
+
let config = {
|
|
682
|
+
maximizable: true,
|
|
683
|
+
width: ModalSizeEnum.Large.width,
|
|
684
|
+
height: ModalSizeEnum.Large.height,
|
|
685
|
+
data: {
|
|
686
|
+
value: value,
|
|
687
|
+
mode: Modes.edit,
|
|
688
|
+
isEditionPersonnalise: this.isEditionPersonnalise,
|
|
689
|
+
fromEndpoint: this.otherFormEndpoint
|
|
690
|
+
? this.otherFormEndpoint
|
|
691
|
+
: report?.restEndpoint,
|
|
692
|
+
businessClass: this.businessClass,
|
|
693
|
+
},
|
|
694
|
+
};
|
|
695
|
+
this._dialogRef = this._tsiModalService.open(AddReportPopupComponent, config);
|
|
696
|
+
this._dialogRef.onClose.subscribe((val) => {
|
|
697
|
+
if (val === null || val === undefined)
|
|
698
|
+
return;
|
|
699
|
+
console.log(val);
|
|
700
|
+
let model = {
|
|
701
|
+
reportTemplateUid: uid,
|
|
702
|
+
reportName: val.reportName,
|
|
703
|
+
restEndpoint: this.isReportForFiche
|
|
704
|
+
? this.reportingService.insertNewUidInRestEndPoint(val?.endPointValue, this.id) ?? this.otherFormEndpoint
|
|
705
|
+
: this.otherFormEndpoint,
|
|
706
|
+
module: val.module,
|
|
707
|
+
order: val.triOrdre,
|
|
708
|
+
shortName: val.reportNameAbrege,
|
|
709
|
+
display: val.display,
|
|
710
|
+
};
|
|
711
|
+
this.reportingService.editReportToEditTemplate(model).subscribe();
|
|
712
|
+
let reportToTemplateId = value.uid;
|
|
713
|
+
let urlDesigner;
|
|
714
|
+
let tenantUid = this.identityManagerService.parseMyAuthToken()?.tenantUid;
|
|
715
|
+
let canredirect = localStorage.getItem('canRedirect');
|
|
716
|
+
if (value.reportType === TsiReportType.List) {
|
|
717
|
+
urlDesigner = `${Segment.reportingServiceBase}/report-designer-edit/${reportToTemplateId}?${queryParamNamesConst.tenantUid}=${tenantUid}`;
|
|
718
|
+
}
|
|
719
|
+
else if (value.reportType === TsiReportType.Dashboard) {
|
|
720
|
+
urlDesigner = `${Segment.appBaseHref}/${this.dashboardModuleRoute}/${ManageReportingRoutes.dashboardDesigner}?${queryParamNamesConst.reportToEdit}=${reportToTemplateId}&${queryParamNamesConst.tenantUid}=${tenantUid}`;
|
|
721
|
+
}
|
|
722
|
+
else if (value.reportType === TsiReportType.RTF) {
|
|
723
|
+
urlDesigner = `${Segment.reportingServiceBase}/mailmerge-edit/${reportToTemplateId}?${queryParamNamesConst.tenantUid}=${tenantUid}`;
|
|
724
|
+
}
|
|
725
|
+
if (canredirect && JSON.parse(canredirect) == true) {
|
|
726
|
+
window.open(urlDesigner, '_blank');
|
|
727
|
+
}
|
|
728
|
+
this.notificationService.success('shared_reporting_redirected_to_edit_report_successfully');
|
|
729
|
+
});
|
|
730
|
+
this.isloading = false;
|
|
731
|
+
},
|
|
732
|
+
error: () => {
|
|
733
|
+
this.notificationService.error(this.errorMessageKey);
|
|
734
|
+
this.isloading = false;
|
|
735
|
+
},
|
|
736
|
+
});
|
|
737
|
+
}
|
|
738
|
+
_deleteReport(uid) {
|
|
739
|
+
this.confirmationService.confirm(LocalizationKeys.confirmDelete, undefined, (result) => {
|
|
740
|
+
if (result && uid != null && uid != undefined) {
|
|
741
|
+
this.isloading = true;
|
|
742
|
+
this.reportingService.deleteReport(uid).subscribe({
|
|
743
|
+
next: async () => {
|
|
744
|
+
this.notificationService.success(LocalizationKeys.deletedSuccessfully);
|
|
745
|
+
await this._refreshReports();
|
|
746
|
+
this.isloading = false;
|
|
747
|
+
},
|
|
748
|
+
error: (error) => {
|
|
749
|
+
this.isloading = false;
|
|
750
|
+
this.notificationService.error(this.errorMessageKey);
|
|
751
|
+
},
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
_setDefaultReport(id) {
|
|
757
|
+
this.confirmationService.confirm('shared_reporting_confirm_set_default_report_file', undefined, (result) => {
|
|
758
|
+
if (result && id != null && id != undefined) {
|
|
759
|
+
this.isloading = true;
|
|
760
|
+
this.reportingService.setDefaultReport(id).subscribe({
|
|
761
|
+
next: async () => {
|
|
762
|
+
this.notificationService.success(LocalizationKeys.savedSuccessfully);
|
|
763
|
+
await this._refreshReports();
|
|
764
|
+
this.isloading = false;
|
|
765
|
+
},
|
|
766
|
+
error: (error) => {
|
|
767
|
+
this.isloading = false;
|
|
768
|
+
this.notificationService.error(this.errorMessageKey);
|
|
769
|
+
},
|
|
770
|
+
});
|
|
771
|
+
}
|
|
772
|
+
});
|
|
773
|
+
}
|
|
774
|
+
_exportReport(uid) {
|
|
775
|
+
if (uid) {
|
|
776
|
+
let reportName = 'file-name.json';
|
|
777
|
+
let report = this.reports.find((r) => r.uid == uid);
|
|
778
|
+
if (report) {
|
|
779
|
+
reportName = report.name;
|
|
780
|
+
}
|
|
781
|
+
this.isloading = true;
|
|
782
|
+
this.reportingService.exportReportFile(uid).subscribe({
|
|
783
|
+
next: (response) => {
|
|
784
|
+
let file = new Blob([response], { type: 'application/json' });
|
|
785
|
+
var fileURL = URL.createObjectURL(file);
|
|
786
|
+
let reportRoute = fileURL;
|
|
787
|
+
var downloadLink = document.createElement('a');
|
|
788
|
+
downloadLink.download = reportName;
|
|
789
|
+
downloadLink.href = reportRoute;
|
|
790
|
+
downloadLink.click();
|
|
791
|
+
this.notificationService.success('shared_reporting_report_exported_successfully');
|
|
792
|
+
this.isloading = false;
|
|
793
|
+
},
|
|
794
|
+
error: () => {
|
|
795
|
+
this.notificationService.error(this.errorMessageKey);
|
|
796
|
+
this.isloading = false;
|
|
797
|
+
},
|
|
798
|
+
});
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
_importToReport(id) {
|
|
802
|
+
if (id) {
|
|
803
|
+
this.selectedReportToUpdateFromFile = id;
|
|
804
|
+
this._showImportFileToReportDialog();
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
_newJsonDataConnection() {
|
|
808
|
+
if (this.otherFormEndpoint != null && this.otherFormEndpoint != undefined) {
|
|
809
|
+
let newJsonDataConnection = {
|
|
810
|
+
name: `${this.otherFormName}-JsonDS`,
|
|
811
|
+
displayName: undefined,
|
|
812
|
+
uri: this.otherFormEndpoint,
|
|
813
|
+
httpRequestContent: undefined,
|
|
814
|
+
};
|
|
815
|
+
return newJsonDataConnection;
|
|
816
|
+
}
|
|
817
|
+
else {
|
|
818
|
+
throw Error('some of the required properties : uri have not been set !');
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
_newReportToPrint(uid, reportType, restEndpoint, module, order, shortName, display) {
|
|
822
|
+
let token = this.identityManagerService.getAuthToken();
|
|
823
|
+
let username = this.identityManagerService.parseMyAuthToken().name;
|
|
824
|
+
if (username) {
|
|
825
|
+
if (uid && /*this.otherFormEndpoint && this.otherFormName &&*/ token) {
|
|
826
|
+
let newReportToPrint = {
|
|
827
|
+
reportTemplateUid: uid,
|
|
828
|
+
restEndpoint: this.isReportForFiche
|
|
829
|
+
? this.reportingService.insertNewUidInRestEndPoint(restEndpoint, this.id) ??
|
|
830
|
+
this.otherFormEndpoint
|
|
831
|
+
: this.otherFormEndpoint,
|
|
832
|
+
requestData: !this.customReportingMode ? this.formEndpointBody : this.requestData,
|
|
833
|
+
formName: this.otherFormName,
|
|
834
|
+
reportType: reportType,
|
|
835
|
+
username: username,
|
|
836
|
+
userToken: reportType == TsiReportType.Dashboard ? undefined : token,
|
|
837
|
+
isPaged: this.isFormEndpointPaged == true ? true : false,
|
|
838
|
+
htmlFiltersText: this.filtersHtmlTemplate,
|
|
839
|
+
optionalEndpointsJson: this.optionalEndpoints,
|
|
840
|
+
module: module,
|
|
841
|
+
order: order,
|
|
842
|
+
shortName: shortName,
|
|
843
|
+
display: display,
|
|
844
|
+
httpMethodType: this.httpMethodType
|
|
845
|
+
};
|
|
846
|
+
return newReportToPrint;
|
|
847
|
+
}
|
|
848
|
+
else {
|
|
849
|
+
throw Error('some of the required properties : user token, formName, formEndpoint or selectedReport have not been set !');
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
else {
|
|
853
|
+
throw Error("property 'UserName ' of current user have not been set !");
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
_newReportToTemplate(reportType, reportName, restEndpoint, module, order, shortName, display) {
|
|
857
|
+
let token = this.identityManagerService.getAuthToken();
|
|
858
|
+
if (this.otherFormEndpoint && this.otherFormName && token) {
|
|
859
|
+
let reportToTemplate = {
|
|
860
|
+
restEndpoint: restEndpoint,
|
|
861
|
+
requestData: !this.customReportingMode ? this.formEndpointBody :
|
|
862
|
+
this.requestData,
|
|
863
|
+
formEntity: this.otherFormName, //this.getFormName(this.otherFormName), //this.otherFormName,
|
|
864
|
+
userToken: reportType == TsiReportType.Dashboard ? undefined : token,
|
|
865
|
+
reportName: reportName,
|
|
866
|
+
isPaged: this.isFormEndpointPaged == true ? true : false,
|
|
867
|
+
reportType: reportType, //this.isFormEndpointPaged == true ? TsiReportType.List : TsiReportType.Form,
|
|
868
|
+
optionalEndpointsJson: this.optionalEndpoints,
|
|
869
|
+
htmlFiltersText: this.filtersHtmlTemplate,
|
|
870
|
+
module: module,
|
|
871
|
+
order: order,
|
|
872
|
+
shortName: shortName,
|
|
873
|
+
display: display,
|
|
874
|
+
descriminatorValue: this.reportDiscriminator,
|
|
875
|
+
httpMethodType: this.httpMethodType
|
|
876
|
+
};
|
|
877
|
+
console.log(reportToTemplate);
|
|
878
|
+
return reportToTemplate;
|
|
879
|
+
}
|
|
880
|
+
else {
|
|
881
|
+
let reportToTemplate = {
|
|
882
|
+
restEndpoint: this.isReportForFiche || this.customReportingMode
|
|
883
|
+
? restEndpoint
|
|
884
|
+
: this.otherFormEndpoint,
|
|
885
|
+
requestData: !this.customReportingMode ? JSON.stringify({
|
|
886
|
+
sorting: [{ property: 'UID', order: 'ASC' }],
|
|
887
|
+
getAllData: true,
|
|
888
|
+
}) : this.requestData,
|
|
889
|
+
formEntity: '',
|
|
890
|
+
userToken: reportType == TsiReportType.Dashboard ? undefined : token,
|
|
891
|
+
reportName: reportName,
|
|
892
|
+
isPaged: this.isFormEndpointPaged == true ? true : false,
|
|
893
|
+
reportType: reportType, //this.isFormEndpointPaged == true ? TsiReportType.List : TsiReportType.Form,
|
|
894
|
+
optionalEndpointsJson: this.optionalEndpoints,
|
|
895
|
+
htmlFiltersText: this.filtersHtmlTemplate,
|
|
896
|
+
module: module,
|
|
897
|
+
order: order,
|
|
898
|
+
shortName: shortName,
|
|
899
|
+
display: display,
|
|
900
|
+
};
|
|
901
|
+
return reportToTemplate;
|
|
902
|
+
// throw Error('some of the required properties : user token, formName or formEndpoint have not been set !');
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
_newReportToEditTemplate(uid, reportType, restEndPoint, module, order, reportName, shortName, display) {
|
|
906
|
+
let token = this.identityManagerService.getAuthToken();
|
|
907
|
+
let username = this.identityManagerService.parseMyAuthToken().name;
|
|
908
|
+
if (username) {
|
|
909
|
+
if (uid && /*this.otherFormEndpoint && this.otherFormName &&*/ token) {
|
|
910
|
+
let reportToEditTemplate = {
|
|
911
|
+
restEndpoint: this.isReportForFiche
|
|
912
|
+
? this.reportingService.insertNewUidInRestEndPoint(restEndPoint, this.id) ??
|
|
913
|
+
this.otherFormEndpoint
|
|
914
|
+
: this.otherFormEndpoint,
|
|
915
|
+
requestData: !this.customReportingMode ? this.formEndpointBody : this.requestData,
|
|
916
|
+
formName: this.otherFormName, // this.getFormName(this.otherFormName!),
|
|
917
|
+
reportTemplateUid: uid,
|
|
918
|
+
reportType: reportType,
|
|
919
|
+
username: username,
|
|
920
|
+
userToken: reportType == TsiReportType.Dashboard ? undefined : token,
|
|
921
|
+
isPaged: this.isFormEndpointPaged == true ? true : false,
|
|
922
|
+
optionalEndpointsJson: this.optionalEndpoints,
|
|
923
|
+
htmlFiltersText: this.filtersHtmlTemplate,
|
|
924
|
+
module: module,
|
|
925
|
+
order: order,
|
|
926
|
+
reportName: reportName,
|
|
927
|
+
shortName: shortName,
|
|
928
|
+
display: display,
|
|
929
|
+
httpMethodType: this.httpMethodType
|
|
930
|
+
};
|
|
931
|
+
return reportToEditTemplate;
|
|
932
|
+
}
|
|
933
|
+
else {
|
|
934
|
+
throw Error('some of the required properties : user token or selectedReport have not been set !');
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
else {
|
|
938
|
+
this.isloading = false;
|
|
939
|
+
throw Error("property 'UserName ' of current user have not been set !");
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
_refreshReportsJob() {
|
|
943
|
+
console.warn('Refresh Reports Job at : ', new Date());
|
|
944
|
+
//
|
|
945
|
+
if (this.otherFormName != null && this.otherFormName != undefined) {
|
|
946
|
+
this.reportingService.getReports(this.otherFormName, this.reportDiscriminator).subscribe({
|
|
947
|
+
next: (items) => {
|
|
948
|
+
this.reports = items;
|
|
949
|
+
if (this.previousFormName != this.otherFormName) {
|
|
950
|
+
this.notificationService.success(LocalizationKeys.retrievedSuccessfully);
|
|
951
|
+
this.previousFormName = this.otherFormName ?? '';
|
|
952
|
+
}
|
|
953
|
+
//
|
|
954
|
+
this.refreshJobTimeOut = setTimeout(() => {
|
|
955
|
+
this._refreshReportsJob();
|
|
956
|
+
}, 10000);
|
|
957
|
+
},
|
|
958
|
+
error: (err) => {
|
|
959
|
+
this.notificationService.error(this.errorMessageKey);
|
|
960
|
+
this.refreshJobTimeOut = setTimeout(() => {
|
|
961
|
+
this._refreshReportsJob();
|
|
962
|
+
}, 10000);
|
|
963
|
+
},
|
|
964
|
+
complete: () => { },
|
|
965
|
+
});
|
|
966
|
+
}
|
|
967
|
+
else {
|
|
968
|
+
this.refreshJobTimeOut = setTimeout(() => {
|
|
969
|
+
this._refreshReportsJob();
|
|
970
|
+
}, 10000);
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
_showImportFileToReportDialog() {
|
|
974
|
+
this.isUpdateReportFromFileDialogVisible = true;
|
|
975
|
+
}
|
|
976
|
+
_hideImportFileToReportDialog() {
|
|
977
|
+
this.isUpdateReportFromFileDialogVisible = false;
|
|
978
|
+
this.toUploadToUpdateReportFileData = undefined;
|
|
979
|
+
}
|
|
980
|
+
// getDefaultReportTemplate(){
|
|
981
|
+
previewBuiltInReportTemplate(templateName) {
|
|
982
|
+
let url = `${Segment.reportingServiceBase}/report-viewer/${this.otherFormName}/${templateName}`;
|
|
983
|
+
window.open(url, '_blank');
|
|
984
|
+
}
|
|
985
|
+
//add a report from the built-in model to the user list
|
|
986
|
+
_addFromBuiltInTemplates(templateName) {
|
|
987
|
+
let formName = this.otherFormName ?? this.EDITION_PERSONNALISE;
|
|
988
|
+
this.reportingService
|
|
989
|
+
.addFromBuiltInTemplate(formName, templateName, this.reportDiscriminator)
|
|
990
|
+
.subscribe({
|
|
991
|
+
next: async (res) => {
|
|
992
|
+
if (res && res.isSuccess === true) {
|
|
993
|
+
await this._refreshReports();
|
|
994
|
+
this.notificationService.info(res.msg);
|
|
995
|
+
}
|
|
996
|
+
else
|
|
997
|
+
this.notificationService.warn('shared_reporting_cannot_add_from_built_in_template');
|
|
998
|
+
},
|
|
999
|
+
error: (err) => {
|
|
1000
|
+
this.notificationService.warn('shared_reporting_cannot_add_from_built_in_template');
|
|
1001
|
+
},
|
|
1002
|
+
});
|
|
1003
|
+
}
|
|
1004
|
+
//add a report from the user list to built-in model template
|
|
1005
|
+
_addToBuiltInTemplates(reportId) {
|
|
1006
|
+
this.reportingService.addToBuiltInTemplate(reportId).subscribe({
|
|
1007
|
+
next: async (res) => {
|
|
1008
|
+
await this._refreshReports(true);
|
|
1009
|
+
this.notificationService.info(LocalizationKeys.savedSuccessfully);
|
|
1010
|
+
},
|
|
1011
|
+
error: (err) => {
|
|
1012
|
+
this.notificationService.warn('shared_reporting_add_to_builtin_template_report_failed');
|
|
1013
|
+
},
|
|
1014
|
+
});
|
|
1015
|
+
}
|
|
1016
|
+
//#endregion
|
|
1017
|
+
//#region make report layout as default for all reports
|
|
1018
|
+
makeReportDefaultLayout(reportUid) {
|
|
1019
|
+
let request = {
|
|
1020
|
+
reportTemplateUid: reportUid,
|
|
1021
|
+
};
|
|
1022
|
+
this.reportingService.makeReportLayoutAsDefaultLayout(request).subscribe({
|
|
1023
|
+
next: (data) => {
|
|
1024
|
+
console.log(data);
|
|
1025
|
+
this.notificationService.success('shared_reporting_success_updated');
|
|
1026
|
+
},
|
|
1027
|
+
error: (error) => {
|
|
1028
|
+
this.notificationService.warn('shared_reporting_error_occured');
|
|
1029
|
+
},
|
|
1030
|
+
});
|
|
1031
|
+
}
|
|
1032
|
+
//#end region
|
|
1033
|
+
_viewDashboardt(uid) {
|
|
1034
|
+
this.isloading = true;
|
|
1035
|
+
let report = this.reports.find((r) => r.uid === uid);
|
|
1036
|
+
if (!report) {
|
|
1037
|
+
this.notificationService.error(this.errorMessageKey);
|
|
1038
|
+
return;
|
|
1039
|
+
}
|
|
1040
|
+
let reportTemplateId = report.uid;
|
|
1041
|
+
let tenantUid = this.identityManagerService.parseMyAuthToken()?.tenantUid;
|
|
1042
|
+
let urlViewer = `${Segment.appBaseHref}/${this.dashboardModuleRoute}/${ManageReportingRoutes.dashboardViewer}?${queryParamNamesConst.reportTemplate}=${reportTemplateId}&${queryParamNamesConst.tenantUid}=${tenantUid}`;
|
|
1043
|
+
console.log('>>> _viewDashboardt ~ urlViewer:', urlViewer);
|
|
1044
|
+
window.open(urlViewer, '_blank');
|
|
1045
|
+
this.notificationService.success('shared_reporting_redirected_to_print_report_successfully');
|
|
1046
|
+
this.isloading = false;
|
|
1047
|
+
}
|
|
1048
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ManageReportingComponent, deps: [{ token: i1.ReportingService }, { token: i1.IdentityManagerService }, { token: i1.TsiConfirmationService }, { token: i1.TsiNotificationService }, { token: i2.DynamicDialogRef }, { token: i2.DynamicDialogConfig }, { token: i1.TsiModalService }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1049
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ManageReportingComponent, selector: "app-manage-reporting", inputs: { otherFormName: "otherFormName", otherFormEndpoint: "otherFormEndpoint", formEndpointBody: "formEndpointBody", isFormEndpointPaged: "isFormEndpointPaged", filtersHtmlTemplate: "filtersHtmlTemplate", optionalEndpoints: "optionalEndpoints", customReportingMode: "customReportingMode" }, providers: [...appProviders], viewQueries: [{ propertyName: "fileUpload", first: true, predicate: ["fileUpload"], descendants: true }, { propertyName: "importFileToReportFileUpload", first: true, predicate: ["importFileToReportFileUpload"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\r\n<div class=\"card\">\r\n <div *busy=\"isloading\"></div>\r\n <div class=\"grid\">\r\n <div class=\"grid col-10\">\r\n <div *ngIf=\"isFromForm; else notFromForm\">\r\n <Tsi-Label class=\"col-2\" [labelValue]=\"'shared_reporting_form'\">\r\n </Tsi-Label>\r\n <p-dropdown class=\"col-10 tsi-component\" class=\"tsi-component\" styleClass=\"tsi-component\" appendTp=\"body\"\r\n [options]=\"formNames\" [ngModel]=\"otherFormName\" optionLabel=\"value\" optionValue=\"key\" [filter]=\"true\"\r\n filterBy=\"value\" [showClear]=\"true\" placeholder=\"{{'shared_reporting_select_form' | localize}}\"\r\n [disabled]=\"true\">\r\n </p-dropdown>\r\n </div>\r\n\r\n <ng-template #notFromForm>\r\n <ng-container>\r\n <Tsi-Label class=\"col-2\" [labelValue]=\"'shared_reporting_form'\">\r\n </Tsi-Label>\r\n <Tsi-Search-Combo class=\"col-10\" [(bind)]=\"otherFormName\" (bindChange)=\"onFormChange()\"\r\n [listSourceUrl]=\"getFormNamesEndpoint\" [elementSourceUrl]=\"getFormNamesEndpoint \" [isFiltered]=\"true\"\r\n id-field=\"key\" label-field=\"value\">\r\n </Tsi-Search-Combo>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <p-toolbar styleClass=\"mb-4 gap-2\">\r\n <ng-template pTemplate=\"left\">\r\n <Tsi-Button [text]=\"'shared_reporting_add_report' | localize\" icon=\"p-button-icon p-button-icon-left pi pi-plus\"\r\n styleClass=\"p-element p-button-success ml-2 mr-2 p-button p-component ng-star-inserted p-button-label\" (click)=\"onNewReport()\"></Tsi-Button>\r\n <Tsi-Button [buttonType]=\"buttonType.Submit\" [text]=\"'shared_reporting_delete_report' | localize\" icon=\"p-button-icon p-button-icon-left pi pi-trash\"\r\n styleClass=\"p-element p-button-danger p-button p-component ng-star-inserted p-button-label\" (click)=\"onDeleteSelectedReports()\"\r\n [disabled]=\"!selectedReports || !selectedReports.length\"></Tsi-Button>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"right\">\r\n <p-fileUpload #fileUpload name=\"demo[]\" (onBeforeUpload)=\"onImportFile($event)\"\r\n (onSelect)=\"onFileSelected($event)\" (onClear)=\"onClear($event)\" (onRemove)=\"onRemove($event)\" [multiple]=\"false\"\r\n accept=\"application/json\" [maxFileSize]=\"10000000\" \r\n [invalidFileSizeMessageSummary]=\"'shared_file_upload_invalid_file_size_message_summary' | localize\"\r\n [invalidFileSizeMessageDetail]=\"'shared_file_upload_invalid_file_size_message_detail' | localize\"\r\n [invalidFileTypeMessageSummary]=\"'shared_file_upload_invalid_file_type_message_summary' | localize\"\r\n [invalidFileLimitMessageDetail]=\"'shared_file_upload_invalid_file_limit_message_detail' | localize\"\r\n [invalidFileLimitMessageSummary]=\"'shared_file_upload_invalid_file_limit_message_summary' | localize\"\r\n [invalidFileTypeMessageDetail]=\"'shared_file_upload_invalid_file_type_message_detail' | localize\"\r\n [chooseIcon]=\"'pi pi-paperclip'\" cancelStyleClass=\"p-button-secondary\" uploadStyleClass=\"p-button-help\"\r\n removeStyleClass=\"p-button-danger\" [chooseLabel]=\"'shared_reporting_choose_report_file' | localize\"\r\n [uploadLabel]=\"'shared_reporting_import_report' | localize\"\r\n [cancelLabel]=\"'shared_reporting_cancel_choose_report_file' | localize\">\r\n <ng-template *ngIf=\"toUploadFileData\" pTemplate=\"fileupload-content\">\r\n </ng-template>\r\n </p-fileUpload>\r\n </ng-template>\r\n </p-toolbar>\r\n\r\n <!-- <Tsi-Display-Grid [showHeader]=\"true\"\r\n [header]=\"'shared_reporting_my_template'\"\r\n [columns]=\"columns\" [gridData]=\"reports\" key=\"uid\"\r\n (buttonColumnClicked)=\"handleButtonColumnClicked($event)\" [(selectedItems)]=\"selectedReports\"\r\n [showFilters]=\"false\"\r\n [paginator]=\"true\"\r\n [globalFilterFields]=\"globalFilterFields\">\r\n </Tsi-Display-Grid> -->\r\n\r\n\r\n <!--<div style=\"text-align:left\"> <p-button icon=\"pi pi-refresh\" [pTooltip]=\"'shared_reporting_refresh' | localize\" [tooltipPosition]=\"tooltipPosition.Top\" label=\"Reload\" severity=\"help\" (click)=\"onRefresh()\" /> </div>\r\n <p-button icon=\"pi pi-refresh\" class=\"p-button-rounded\" styleClass=\"p-button-text\" />\r\n-->\r\n \r\n <Tsi-Button styleClass=\"p-element p-button-text p-button-raised p-button-rounded mb-3 ml-3\" \r\n [tooltipText]=\"'shared_reporting_refresh'\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n icon=\"pi pi-refresh\" (click)=\"onRefresh()\"></Tsi-Button>\r\n\r\n <tsi-view-grid \r\n [header]=\"'shared_reporting_my_template'\"\r\n [columns]=\"columns\" [gridData]=\"reports\" key=\"uid\"\r\n (buttonColumnClicked)=\"handleButtonColumnClicked($event)\" [(selectedItems)]=\"selectedReports\"\r\n [getDataFromApi]=\"false\"\r\n [formName]=\"'my-report-templates'\"\r\n >\r\n </tsi-view-grid>\r\n <br/>\r\n <!-- Default Template -->\r\n <!-- <Tsi-Display-Grid \r\n [showHeader]=\"true\" \r\n [header]=\"'shared_reporting_BuiltIn_template'\"\r\n [showSummaryFooter]=\"false\" \r\n [paginator]=\"false\" \r\n [showFilters]=\"false\" \r\n [columns]=\"defaultTemplateColumns\" \r\n [gridData]=\"defaultReportTemplateData\" \r\n (buttonColumnClicked)=\"handleButtonColumnClicked($event)\"\r\n [paginator]=\"true\"\r\n key=\"name\">\r\n </Tsi-Display-Grid> -->\r\n\r\n \r\n <tsi-view-grid\r\n [header]=\"'shared_reporting_BuiltIn_template'\"\r\n [columns]=\"defaultTemplateColumns\" \r\n [gridData]=\"defaultReportTemplateData\" \r\n (buttonColumnClicked)=\"handleButtonColumnClicked($event)\"\r\n [getDataFromApi]=\"false\"\r\n [formName]=\"'default-my-report-templates'\"\r\n key=\"name\">\r\n </tsi-view-grid>\r\n\r\n\r\n\r\n\r\n \r\n\r\n <!-- dialog to import file to report -->\r\n <p-dialog header=\"{{'shared_reporting_select_file_to_import_into_report' | localize}}\" [(visible)]=\"isUpdateReportFromFileDialogVisible\" [style]=\"{width: '50vw'}\">\r\n <!-- <Tsi-Modal-Header (onCloseClick)=\"onImportFileToReportModalCancelClick()\" [inputTitle]=\"'shared_reporting_select_file_to_import_into_report'\"></Tsi-Modal-Header> -->\r\n\r\n <ng-template pTemplate=\"body\">\r\n <p-fileUpload #importFileToReportFileUpload name=\"importFileToReport\" (onBeforeUpload)=\"onImportFileToReport_ImportFile($event)\"\r\n (onSelect)=\"onImportFileToReport_FileSelected($event)\" (onClear)=\"onImportFileToReport_Clear($event)\" (onRemove)=\"onImportFileToReport_Remove($event)\" [multiple]=\"false\"\r\n accept=\"application/json\" [maxFileSize]=\"10000000\"\r\n [invalidFileSizeMessageSummary]=\"'shared_file_upload_invalid_file_size_message_summary' | localize\"\r\n [invalidFileSizeMessageDetail]=\"'shared_file_upload_invalid_file_size_message_detail' | localize\"\r\n [invalidFileTypeMessageSummary]=\"'shared_file_upload_invalid_file_type_message_summary' | localize\"\r\n [invalidFileLimitMessageDetail]=\"'shared_file_upload_invalid_file_limit_message_detail' | localize\"\r\n [invalidFileLimitMessageSummary]=\"'shared_file_upload_invalid_file_limit_message_summary' | localize\"\r\n [invalidFileTypeMessageDetail]=\"'shared_file_upload_invalid_file_type_message_detail' | localize\"\r\n [chooseIcon]=\"'pi pi-paperclip'\" cancelStyleClass=\"p-button-secondary\" uploadStyleClass=\"p-button-help\"\r\n removeStyleClass=\"p-button-danger\" [chooseLabel]=\"'shared_reporting_choose_report_file' | localize\"\r\n [uploadLabel]=\"'shared_reporting_import_report' | localize\"\r\n [cancelLabel]=\"'shared_reporting_cancel_choose_report_file' | localize\">\r\n <ng-template *ngIf=\"toUploadToUpdateReportFileData\" pTemplate=\"fileupload-content\">\r\n </ng-template>\r\n </p-fileUpload>\r\n </ng-template>\r\n\r\n <!-- <Tsi-Modal-Footer (onCancelClick)=\"onImportFileToReportModalCancelClick()\"\r\n (onSaveClick)=\"onImportFileToReportModalSaveClick()\"\r\n [saveDisabled]=\"!toUploadToUpdateReportFileData\"></Tsi-Modal-Footer> -->\r\n\r\n</p-dialog>\r\n</div>\r\n", styles: [".p-button.p-button-icon-only.p-button-rounded{height:2rem!important}::ng-deep .p-fileupload-choose input{display:none!important}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i7.Toolbar, selector: "p-toolbar", inputs: ["style", "styleClass", "ariaLabelledBy"] }, { kind: "component", type: i8.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "component", type: i9.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i10.FileUpload, selector: "p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }, { kind: "component", type: i11.TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: ["elementSourceUrl", "listSourceUrl", "id-field", "label-field", "multiple", "sort", "showClear", "reloadDataSource", "isFiltered", "selectedLabel", "maxWidth", "businessClass", "currentRowItem", "datasource", "bind", "showSearchButton", "showAddButton", "showConsultButton", "showUpdateButton"], outputs: ["bindChange", "datasource-loaded", "init", "isLoaded", "selectedLabelChange", "onClick", "onSearchButtonClick"] }, { kind: "component", type: i12.TsiLabelComponent, selector: "Tsi-Label", inputs: ["labelValue", "styleClass", "infoText"] }, { kind: "component", type: i13.TsiViewGridComponent, selector: "tsi-view-grid", inputs: ["columns", "gridConfiguration", "viewComponent", "crudService", "header", "modalSize", "showConsultButton", "showSearchField", "searchFields", "formEndpoint", "formName", "id", "showImportExportButton", "getDataFromApi", "gridData", "isSearchButtonDisabled", "selectKeyOnly", "selectionMode", "selectedItems", "key", "showGlobalSearch", "showExportButton", "showCalenderView", "calenderSchema", "showHeaderFilters", "showFilterButton", "selectAll", "checkedByField", "searchOnInit"], outputs: ["summariesChange", "selectedItemsChange", "buttonColumnClicked", "searchFieldsValueChanged", "getAllPagedResultChanged"] }, { kind: "component", type: i14.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "directive", type: i15.BusyDirective, selector: "[busy]", inputs: ["busy"] }, { kind: "pipe", type: i16.LocalizePipe, name: "localize" }] }); }
|
|
1050
|
+
}
|
|
1051
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ManageReportingComponent, decorators: [{
|
|
1052
|
+
type: Component,
|
|
1053
|
+
args: [{ selector: 'app-manage-reporting', providers: [...appProviders], template: "\r\n<div class=\"card\">\r\n <div *busy=\"isloading\"></div>\r\n <div class=\"grid\">\r\n <div class=\"grid col-10\">\r\n <div *ngIf=\"isFromForm; else notFromForm\">\r\n <Tsi-Label class=\"col-2\" [labelValue]=\"'shared_reporting_form'\">\r\n </Tsi-Label>\r\n <p-dropdown class=\"col-10 tsi-component\" class=\"tsi-component\" styleClass=\"tsi-component\" appendTp=\"body\"\r\n [options]=\"formNames\" [ngModel]=\"otherFormName\" optionLabel=\"value\" optionValue=\"key\" [filter]=\"true\"\r\n filterBy=\"value\" [showClear]=\"true\" placeholder=\"{{'shared_reporting_select_form' | localize}}\"\r\n [disabled]=\"true\">\r\n </p-dropdown>\r\n </div>\r\n\r\n <ng-template #notFromForm>\r\n <ng-container>\r\n <Tsi-Label class=\"col-2\" [labelValue]=\"'shared_reporting_form'\">\r\n </Tsi-Label>\r\n <Tsi-Search-Combo class=\"col-10\" [(bind)]=\"otherFormName\" (bindChange)=\"onFormChange()\"\r\n [listSourceUrl]=\"getFormNamesEndpoint\" [elementSourceUrl]=\"getFormNamesEndpoint \" [isFiltered]=\"true\"\r\n id-field=\"key\" label-field=\"value\">\r\n </Tsi-Search-Combo>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <p-toolbar styleClass=\"mb-4 gap-2\">\r\n <ng-template pTemplate=\"left\">\r\n <Tsi-Button [text]=\"'shared_reporting_add_report' | localize\" icon=\"p-button-icon p-button-icon-left pi pi-plus\"\r\n styleClass=\"p-element p-button-success ml-2 mr-2 p-button p-component ng-star-inserted p-button-label\" (click)=\"onNewReport()\"></Tsi-Button>\r\n <Tsi-Button [buttonType]=\"buttonType.Submit\" [text]=\"'shared_reporting_delete_report' | localize\" icon=\"p-button-icon p-button-icon-left pi pi-trash\"\r\n styleClass=\"p-element p-button-danger p-button p-component ng-star-inserted p-button-label\" (click)=\"onDeleteSelectedReports()\"\r\n [disabled]=\"!selectedReports || !selectedReports.length\"></Tsi-Button>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"right\">\r\n <p-fileUpload #fileUpload name=\"demo[]\" (onBeforeUpload)=\"onImportFile($event)\"\r\n (onSelect)=\"onFileSelected($event)\" (onClear)=\"onClear($event)\" (onRemove)=\"onRemove($event)\" [multiple]=\"false\"\r\n accept=\"application/json\" [maxFileSize]=\"10000000\" \r\n [invalidFileSizeMessageSummary]=\"'shared_file_upload_invalid_file_size_message_summary' | localize\"\r\n [invalidFileSizeMessageDetail]=\"'shared_file_upload_invalid_file_size_message_detail' | localize\"\r\n [invalidFileTypeMessageSummary]=\"'shared_file_upload_invalid_file_type_message_summary' | localize\"\r\n [invalidFileLimitMessageDetail]=\"'shared_file_upload_invalid_file_limit_message_detail' | localize\"\r\n [invalidFileLimitMessageSummary]=\"'shared_file_upload_invalid_file_limit_message_summary' | localize\"\r\n [invalidFileTypeMessageDetail]=\"'shared_file_upload_invalid_file_type_message_detail' | localize\"\r\n [chooseIcon]=\"'pi pi-paperclip'\" cancelStyleClass=\"p-button-secondary\" uploadStyleClass=\"p-button-help\"\r\n removeStyleClass=\"p-button-danger\" [chooseLabel]=\"'shared_reporting_choose_report_file' | localize\"\r\n [uploadLabel]=\"'shared_reporting_import_report' | localize\"\r\n [cancelLabel]=\"'shared_reporting_cancel_choose_report_file' | localize\">\r\n <ng-template *ngIf=\"toUploadFileData\" pTemplate=\"fileupload-content\">\r\n </ng-template>\r\n </p-fileUpload>\r\n </ng-template>\r\n </p-toolbar>\r\n\r\n <!-- <Tsi-Display-Grid [showHeader]=\"true\"\r\n [header]=\"'shared_reporting_my_template'\"\r\n [columns]=\"columns\" [gridData]=\"reports\" key=\"uid\"\r\n (buttonColumnClicked)=\"handleButtonColumnClicked($event)\" [(selectedItems)]=\"selectedReports\"\r\n [showFilters]=\"false\"\r\n [paginator]=\"true\"\r\n [globalFilterFields]=\"globalFilterFields\">\r\n </Tsi-Display-Grid> -->\r\n\r\n\r\n <!--<div style=\"text-align:left\"> <p-button icon=\"pi pi-refresh\" [pTooltip]=\"'shared_reporting_refresh' | localize\" [tooltipPosition]=\"tooltipPosition.Top\" label=\"Reload\" severity=\"help\" (click)=\"onRefresh()\" /> </div>\r\n <p-button icon=\"pi pi-refresh\" class=\"p-button-rounded\" styleClass=\"p-button-text\" />\r\n-->\r\n \r\n <Tsi-Button styleClass=\"p-element p-button-text p-button-raised p-button-rounded mb-3 ml-3\" \r\n [tooltipText]=\"'shared_reporting_refresh'\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n icon=\"pi pi-refresh\" (click)=\"onRefresh()\"></Tsi-Button>\r\n\r\n <tsi-view-grid \r\n [header]=\"'shared_reporting_my_template'\"\r\n [columns]=\"columns\" [gridData]=\"reports\" key=\"uid\"\r\n (buttonColumnClicked)=\"handleButtonColumnClicked($event)\" [(selectedItems)]=\"selectedReports\"\r\n [getDataFromApi]=\"false\"\r\n [formName]=\"'my-report-templates'\"\r\n >\r\n </tsi-view-grid>\r\n <br/>\r\n <!-- Default Template -->\r\n <!-- <Tsi-Display-Grid \r\n [showHeader]=\"true\" \r\n [header]=\"'shared_reporting_BuiltIn_template'\"\r\n [showSummaryFooter]=\"false\" \r\n [paginator]=\"false\" \r\n [showFilters]=\"false\" \r\n [columns]=\"defaultTemplateColumns\" \r\n [gridData]=\"defaultReportTemplateData\" \r\n (buttonColumnClicked)=\"handleButtonColumnClicked($event)\"\r\n [paginator]=\"true\"\r\n key=\"name\">\r\n </Tsi-Display-Grid> -->\r\n\r\n \r\n <tsi-view-grid\r\n [header]=\"'shared_reporting_BuiltIn_template'\"\r\n [columns]=\"defaultTemplateColumns\" \r\n [gridData]=\"defaultReportTemplateData\" \r\n (buttonColumnClicked)=\"handleButtonColumnClicked($event)\"\r\n [getDataFromApi]=\"false\"\r\n [formName]=\"'default-my-report-templates'\"\r\n key=\"name\">\r\n </tsi-view-grid>\r\n\r\n\r\n\r\n\r\n \r\n\r\n <!-- dialog to import file to report -->\r\n <p-dialog header=\"{{'shared_reporting_select_file_to_import_into_report' | localize}}\" [(visible)]=\"isUpdateReportFromFileDialogVisible\" [style]=\"{width: '50vw'}\">\r\n <!-- <Tsi-Modal-Header (onCloseClick)=\"onImportFileToReportModalCancelClick()\" [inputTitle]=\"'shared_reporting_select_file_to_import_into_report'\"></Tsi-Modal-Header> -->\r\n\r\n <ng-template pTemplate=\"body\">\r\n <p-fileUpload #importFileToReportFileUpload name=\"importFileToReport\" (onBeforeUpload)=\"onImportFileToReport_ImportFile($event)\"\r\n (onSelect)=\"onImportFileToReport_FileSelected($event)\" (onClear)=\"onImportFileToReport_Clear($event)\" (onRemove)=\"onImportFileToReport_Remove($event)\" [multiple]=\"false\"\r\n accept=\"application/json\" [maxFileSize]=\"10000000\"\r\n [invalidFileSizeMessageSummary]=\"'shared_file_upload_invalid_file_size_message_summary' | localize\"\r\n [invalidFileSizeMessageDetail]=\"'shared_file_upload_invalid_file_size_message_detail' | localize\"\r\n [invalidFileTypeMessageSummary]=\"'shared_file_upload_invalid_file_type_message_summary' | localize\"\r\n [invalidFileLimitMessageDetail]=\"'shared_file_upload_invalid_file_limit_message_detail' | localize\"\r\n [invalidFileLimitMessageSummary]=\"'shared_file_upload_invalid_file_limit_message_summary' | localize\"\r\n [invalidFileTypeMessageDetail]=\"'shared_file_upload_invalid_file_type_message_detail' | localize\"\r\n [chooseIcon]=\"'pi pi-paperclip'\" cancelStyleClass=\"p-button-secondary\" uploadStyleClass=\"p-button-help\"\r\n removeStyleClass=\"p-button-danger\" [chooseLabel]=\"'shared_reporting_choose_report_file' | localize\"\r\n [uploadLabel]=\"'shared_reporting_import_report' | localize\"\r\n [cancelLabel]=\"'shared_reporting_cancel_choose_report_file' | localize\">\r\n <ng-template *ngIf=\"toUploadToUpdateReportFileData\" pTemplate=\"fileupload-content\">\r\n </ng-template>\r\n </p-fileUpload>\r\n </ng-template>\r\n\r\n <!-- <Tsi-Modal-Footer (onCancelClick)=\"onImportFileToReportModalCancelClick()\"\r\n (onSaveClick)=\"onImportFileToReportModalSaveClick()\"\r\n [saveDisabled]=\"!toUploadToUpdateReportFileData\"></Tsi-Modal-Footer> -->\r\n\r\n</p-dialog>\r\n</div>\r\n", styles: [".p-button.p-button-icon-only.p-button-rounded{height:2rem!important}::ng-deep .p-fileupload-choose input{display:none!important}\n"] }]
|
|
1054
|
+
}], ctorParameters: () => [{ type: i1.ReportingService }, { type: i1.IdentityManagerService }, { type: i1.TsiConfirmationService }, { type: i1.TsiNotificationService }, { type: i2.DynamicDialogRef }, { type: i2.DynamicDialogConfig }, { type: i1.TsiModalService }, { type: i3.Router }], propDecorators: { fileUpload: [{
|
|
1055
|
+
type: ViewChild,
|
|
1056
|
+
args: ['fileUpload']
|
|
1057
|
+
}], importFileToReportFileUpload: [{
|
|
1058
|
+
type: ViewChild,
|
|
1059
|
+
args: ['importFileToReportFileUpload']
|
|
1060
|
+
}], otherFormName: [{
|
|
1061
|
+
type: Input
|
|
1062
|
+
}], otherFormEndpoint: [{
|
|
1063
|
+
type: Input
|
|
1064
|
+
}], formEndpointBody: [{
|
|
1065
|
+
type: Input
|
|
1066
|
+
}], isFormEndpointPaged: [{
|
|
1067
|
+
type: Input
|
|
1068
|
+
}], filtersHtmlTemplate: [{
|
|
1069
|
+
type: Input
|
|
1070
|
+
}], optionalEndpoints: [{
|
|
1071
|
+
type: Input
|
|
1072
|
+
}], customReportingMode: [{
|
|
1073
|
+
type: Input
|
|
1074
|
+
}] } });
|
|
1075
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlLXJlcG9ydGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvbWFuYWdlLXJlcG9ydGluZy9tYW5hZ2UtcmVwb3J0aW5nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy9tYW5hZ2UtcmVwb3J0aW5nL21hbmFnZS1yZXBvcnRpbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBa0IsYUFBYSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3SCxPQUFPLEVBQWMsZUFBZSxFQUFxQixNQUFNLGtCQUFrQixDQUFDO0FBRWxGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVMxRCxNQUFNLE9BQU8sd0JBQ1gsU0FBUSw2QkFBNkI7YUFnQ2IscUJBQWdCLEdBQTJCO1FBQ2pFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVc7UUFDdEMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVTtRQUNoQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLO0tBQzNCLEFBSnVDLENBSXRDO0lBSUYsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQy9FLENBQUM7SUFtQkQsWUFBWTtJQUVaLDJCQUEyQjtJQUMzQixnRUFBZ0U7SUFDaEUsWUFBWTtJQUVaLGNBQWM7SUFDZDtJQUNDLDhFQUE4RTtJQUNyRSxnQkFBa0MsRUFDbEMsc0JBQThDLEVBQzlDLG1CQUEyQyxFQUMzQyxtQkFBMkMsRUFDbkMsR0FBcUIsRUFDckIsTUFBMkIsRUFDbkMsZ0JBQWlDLEVBQ2pDLE1BQWM7UUFFdEIsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQVRYLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXdCO1FBQzNDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBd0I7UUFDbkMsUUFBRyxHQUFILEdBQUcsQ0FBa0I7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBcUI7UUFDbkMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUNqQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBM0V4QixvQkFBb0I7UUFFWCx5QkFBb0IsR0FBRywwQkFBMEIsQ0FBQztRQUMzRCxZQUFPLEdBQTZCLEVBQUUsQ0FBQztRQUl2QyxxQkFBZ0IsR0FBUSxTQUFTLENBQUM7UUFDbEMsWUFBTyxHQUFpQixFQUFFLENBQUM7UUFDM0IsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixjQUFTLEdBQW1DLEVBQUUsQ0FBQztRQUMvQyxvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUMvQixrQkFBYSxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztRQUMzQyx5QkFBb0IsR0FBVyxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzFFLHVCQUFrQixHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFOUIscUJBQWdCLEdBQVcsRUFBRSxDQUFDO1FBQzlCLHdDQUFtQyxHQUFZLEtBQUssQ0FBQztRQUNyRCxtQ0FBOEIsR0FBUSxTQUFTLENBQUM7UUFFaEQsOEJBQXlCLEdBQWEsRUFBRSxDQUFDO1FBQ3pDLDJCQUFzQixHQUFpQixFQUFFLENBQUM7UUFDMUMsb0JBQWUsR0FBRyxlQUFlLENBQUM7UUFFbEMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBWS9CLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQVMxQixvQkFBZSxHQUFXLGdDQUFnQyxDQUFDO1FBRTNELHlCQUFvQixHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbEYsWUFBWTtRQUNaLGVBQVUsR0FBRyxVQUFVLENBQUM7UUFNZix3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUF3QjVDLGNBQWM7UUFDZCxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2I7Z0JBQ0UsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsTUFBTSxFQUFFLDhCQUE4QjthQUN2QztZQUNEO2dCQUNFLEtBQUssRUFBRSxnQkFBZ0I7Z0JBQ3ZCLE1BQU0sRUFBRSw4QkFBOEI7YUFDdkM7WUFDRDtnQkFDRSxLQUFLLEVBQUUsV0FBVztnQkFDbEIsTUFBTSxFQUFFLG1DQUFtQztnQkFDM0MsSUFBSSxFQUFFLFlBQVksQ0FBQyxnQkFBZ0I7Z0JBQ25DLEtBQUssRUFBRSxJQUFJLGVBQWUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQzthQUNqRDtZQUNEO2dCQUNFLE1BQU0sRUFBRSxFQUFFO2dCQUNWLEtBQUssRUFBRSxNQUFNO2dCQUNiLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFVBQVUsRUFBRSxZQUFZO2dCQUN4QixVQUFVLEVBQUUsZ0NBQWdDO2dCQUM1QyxXQUFXLEVBQUUsNkJBQTZCO2FBQzNDO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsVUFBVSxFQUFFLGlCQUFpQjtnQkFDN0IsVUFBVSxFQUFFLGdDQUFnQztnQkFDNUMsV0FBVyxFQUFFLHVCQUF1QjthQUNyQztZQUNEO2dCQUNFLE1BQU0sRUFBRSxFQUFFO2dCQUNWLEtBQUssRUFBRSxNQUFNO2dCQUNiLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFVBQVUsRUFBRSxXQUFXO2dCQUN2QixVQUFVLEVBQUUsNkJBQTZCO2dCQUN6QyxXQUFXLEVBQUUsdUJBQXVCO2FBQ3JDO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLFFBQVE7Z0JBQ2YsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsVUFBVSxFQUFFLG1CQUFtQjtnQkFDL0IsVUFBVSxFQUFFLDZCQUE2QjtnQkFDekMsV0FBVyxFQUFFLHlCQUF5QjthQUN2QztZQUNEO2dCQUNFLE1BQU0sRUFBRSxFQUFFO2dCQUNWLEtBQUssRUFBRSxRQUFRO2dCQUNmLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFVBQVUsRUFBRSxpQkFBaUI7Z0JBQzdCLFVBQVUsRUFBRSxnQ0FBZ0M7Z0JBQzVDLFdBQVcsRUFBRSx5QkFBeUI7YUFDdkM7WUFDRDtnQkFDRSxNQUFNLEVBQUUsRUFBRTtnQkFDVixLQUFLLEVBQUUsU0FBUztnQkFDaEIsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsVUFBVSxFQUFFLHFCQUFxQjtnQkFDakMsVUFBVSxFQUFFLGVBQWU7Z0JBQzNCLFdBQVcsRUFBRSw4QkFBOEI7YUFDNUM7WUFDRDtnQkFDRSxNQUFNLEVBQUUsRUFBRTtnQkFDVixLQUFLLEVBQUUsUUFBUTtnQkFDZixRQUFRLEVBQUUsSUFBSTtnQkFDZCxVQUFVLEVBQUUsYUFBYTtnQkFDekIsVUFBVSxFQUFFLCtCQUErQjtnQkFDM0MsV0FBVyxFQUFFLGdDQUFnQzthQUM5QztZQUNEO2dCQUNFLE1BQU0sRUFBRSxFQUFFO2dCQUNWLEtBQUssRUFBRSwwQkFBMEI7Z0JBQ2pDLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFVBQVUsRUFBRSx5QkFBeUI7Z0JBQ3JDLFVBQVUsRUFBRSw2QkFBNkI7Z0JBQ3pDLFdBQVcsRUFBRSxvQ0FBb0M7YUFDbEQ7WUFDRDtnQkFDRSxNQUFNLEVBQUUsRUFBRTtnQkFDVixLQUFLLEVBQUUsNEJBQTRCO2dCQUNuQyxRQUFRLEVBQUUsSUFBSTtnQkFDZCxVQUFVLEVBQUUscUJBQXFCO2dCQUNqQyxVQUFVLEVBQUUsK0JBQStCO2dCQUMzQyxXQUFXLEVBQUUsNkNBQTZDO2FBQzNEO1NBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxzQkFBc0IsR0FBRztZQUM1QjtnQkFDRSxLQUFLLEVBQUUsTUFBTTtnQkFDYixNQUFNLEVBQUUsOEJBQThCO2FBQ3ZDO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLGdCQUFnQjtnQkFDdkIsTUFBTSxFQUFFLDhCQUE4QjthQUN2QztZQUNEO2dCQUNFLE1BQU0sRUFBRSxFQUFFO2dCQUNWLEtBQUssRUFBRSx5QkFBeUI7Z0JBQ2hDLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFVBQVUsRUFBRSxhQUFhO2dCQUN6QixVQUFVLEVBQUUsK0JBQStCO2dCQUMzQyxXQUFXLEVBQUUsd0NBQXdDO2FBQ3REO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLDRCQUE0QjtnQkFDbkMsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsVUFBVSxFQUFFLHVCQUF1QjtnQkFDbkMsVUFBVSxFQUFFLGdDQUFnQztnQkFDNUMsV0FBVyxFQUFFLHdDQUF3QzthQUN0RDtTQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsWUFBWTtJQUVaLGdCQUFnQjtRQUNkLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksNkJBQTZCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3hELENBQUMsR0FBZSxFQUFFLEVBQUU7Z0JBQ2xCLE9BQU8sR0FBRyxDQUFDLEtBQUssSUFBSSwwQkFBMEIsQ0FBQztZQUNqRCxDQUFDLENBQ0YsQ0FBQztZQUNGLElBQUksNkJBQTZCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsNkJBQTZCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEQsQ0FBQztZQUVELElBQUksa0NBQWtDLEdBQ3BDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFlLEVBQUUsRUFBRTtnQkFDeEQsT0FBTyxHQUFHLENBQUMsS0FBSyxJQUFJLHlCQUF5QixDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDO1lBRUwsSUFBSSxrQ0FBa0MsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUNoQyxrQ0FBa0MsRUFDbEMsQ0FBQyxDQUNGLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCx3QkFBd0I7SUFDZixLQUFLLENBQUMsUUFBUTtRQUNyQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsS0FBSyxFQUFFLE9BQU87WUFDZCxRQUFRLEVBQUUsSUFBSTtZQUNkLFVBQVUsRUFBRSxhQUFhO1lBQ3pCLFVBQVUsRUFBRSxrQ0FBa0M7WUFDOUMsV0FBVyxFQUFFLCtCQUErQjtTQUM3QyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFBO1FBQ2pFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFBO1FBQ3ZELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRVEsV0FBVztRQUNsQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFcEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFDRCxZQUFZO0lBRVosdUJBQXVCO0lBQ3ZCLEtBQUssQ0FBQyxTQUFTO1FBQ2IsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBVTtRQUN2QixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDbkUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ2Isc0NBQXNDO29CQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0IsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRSxHQUFHLENBQUM7YUFDM0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsS0FBVTtRQUN2QixNQUFNLElBQUksR0FBUyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFVO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hHLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQ3ZCLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUM5QiwrQ0FBK0MsQ0FDaEQsQ0FBQztnQkFDRixJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzNCLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLE9BQU8sQ0FBQyxLQUFVO1FBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7SUFDcEMsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixRQUFRLENBQUMsS0FBVTtRQUNqQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxLQUF3QjtRQUNoRCxRQUFRLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVCLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QixNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDWixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEMsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QixNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUIsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEMsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyw0QkFBNEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekMsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLDBCQUEwQixDQUFDLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN2QixJQUFJLENBQUMsNEJBQTRCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QyxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssNEJBQTRCLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUsseUJBQXlCLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNO1lBQ1IsQ0FBQztZQUNEO2dCQUNFLE1BQU07UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVELHVCQUF1QixDQUFDLFFBQWE7UUFDbkMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FDOUIsZ0JBQWdCLENBQUMsYUFBYSxFQUM5QixTQUFTLEVBQ1QsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUNsQixJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLGdCQUFnQjtxQkFDbEIsK0JBQStCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztxQkFDbkQsU0FBUyxDQUFDO29CQUNULElBQUksRUFBRSxLQUFLLElBQUksRUFBRTt3QkFDZixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2pDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQzlCLGdCQUFnQixDQUFDLG1CQUFtQixDQUNyQyxDQUFDO3dCQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUN6QixDQUFDO29CQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7d0JBQ1YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQ3JELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUN6QixDQUFDO2lCQUNGLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FDOUIsZ0JBQWdCLENBQUMsYUFBYSxFQUM5QixTQUFTLEVBQ1QsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUNsQixJQUNFLE1BQU07Z0JBQ04sSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJO2dCQUM1QixJQUFJLENBQUMsZUFBZSxJQUFJLFNBQVMsRUFDakMsQ0FBQztnQkFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGdCQUFnQjtxQkFDbEIscUJBQXFCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztxQkFDM0MsU0FBUyxDQUFDO29CQUNULElBQUksRUFBRSxLQUFLLElBQUksRUFBRTt3QkFDZixNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzt3QkFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FDOUIsZ0JBQWdCLENBQUMsbUJBQW1CLENBQ3JDLENBQUM7d0JBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7b0JBQ3pCLENBQUM7b0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7d0JBQ3BCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUNyRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztvQkFDekIsQ0FBQztpQkFDRixDQUFDLENBQUM7WUFDUCxDQUFDO1FBQ0gsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULElBQ0UsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUM5QyxJQUFJLENBQUMscUJBQXFCLEVBQzFCLENBQUM7WUFDRCxJQUFJLGtCQUEwQixDQUFDO1lBQy9CLElBQUksU0FBUyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDcEMsSUFBSSxNQUFNLEdBQXdCO2dCQUNoQyxXQUFXLEVBQUUsSUFBSTtnQkFDakIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLO2dCQUN0QixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07Z0JBQ3hCLElBQUksRUFBRTtvQkFDSixJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU07b0JBQ2xCLHFCQUFxQixFQUFFLElBQUksQ0FBQyxxQkFBcUI7b0JBQ2pELFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCO29CQUNwQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7b0JBQ2pDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7aUJBQzlDO2FBQ0YsQ0FBQztZQUVGLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FDMUMsdUJBQXVCLEVBQ3ZCLE1BQU0sQ0FDUCxDQUFDO1lBRUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQzdDLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUztvQkFBRSxPQUFPO2dCQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUVqQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUMxQixHQUFHLENBQUMsYUFBYSxHQUFHLEdBQUcsRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUM3QyxNQUFNLEVBQ04sSUFBSSxDQUFDLFFBQVEsQ0FDZCxDQUFDO29CQUNGLEdBQUcsQ0FBQyxXQUFXLEdBQUcsR0FBRyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDckUsQ0FBQztnQkFFRCxJQUFJLENBQUMsZ0JBQWdCO3FCQUNsQixnQkFBZ0IsQ0FDZixJQUFJLENBQUMsb0JBQW9CLENBQ3ZCLEdBQUcsQ0FBQyxVQUFVLEVBQ2QsR0FBRyxDQUFDLFVBQVUsRUFDZCxHQUFHLENBQUMsYUFBYSxFQUNqQixHQUFHLENBQUMsTUFBTSxFQUNWLEdBQUcsQ0FBQyxRQUFRLEVBQ1osR0FBRyxDQUFDLGdCQUFnQixFQUNwQixHQUFHLENBQUMsT0FBTyxDQUNaLENBQ0Y7cUJBQ0EsU0FBUyxDQUFDO29CQUNULElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO3dCQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO3dCQUN0QixrQkFBa0IsR0FBRyxLQUFLLENBQUM7d0JBQzNCLElBQUksV0FBVyxDQUFDO3dCQUNoQixJQUFJLFNBQVMsR0FDWCxJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxTQUFTLENBQUM7d0JBRTVELElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQzFDLFdBQVcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0Isb0JBQW9CLGtCQUFrQixJQUFJLG9CQUFvQixDQUFDLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FBQzt3QkFDdkksQ0FBQzs2QkFBTSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUN0RCxXQUFXLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxxQkFBcUIsQ0FBQyxpQkFBaUIsSUFBSSxvQkFBb0IsQ0FBQyxnQkFBZ0IsSUFBSSxrQkFBa0IsSUFBSSxvQkFBb0IsQ0FBQyxTQUFTLElBQUksU0FBUyxFQUFFLENBQUM7d0JBQy9OLENBQUM7NkJBQU0sSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFDaEQsV0FBVyxHQUFHLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixjQUFjLGtCQUFrQixJQUFJLG9CQUFvQixDQUFDLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FBQzt3QkFDakksQ0FBQzt3QkFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQzt3QkFFbkMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FDOUIsd0RBQXdELENBQ3pELENBQUM7d0JBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7b0JBQ3pCLENBQUM7b0JBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTt3QkFDVixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzt3QkFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3ZELENBQUM7aUJBQ0YsQ0FBQyxDQUFDO2dCQUVMLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxHQUFRO1FBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWTtRQUNoQixNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsb0NBQW9DO1FBQ2xDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxrQ0FBa0M7UUFDaEMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUNELHFCQUFxQjtJQUNyQixpQ0FBaUMsQ0FBQyxLQUFVO1FBQzFDLE1BQU0sSUFBSSxHQUFTLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQztJQUM3QyxDQUFDO0lBRUQsK0JBQStCLENBQUMsS0FBVTtRQUN4QyxJQUFJLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0I7aUJBQ2xCLGtCQUFrQixDQUNqQixJQUFJLENBQUMsOEJBQThCLEVBQ25DLElBQUksQ0FBQyw4QkFBOEIsQ0FDcEM7aUJBQ0EsU0FBUyxDQUFDO2dCQUNULElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7b0JBQ3ZCLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUM5QiwrQ0FBK0MsQ0FDaEQsQ0FBQztvQkFDRixJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxFQUFFLENBQUM7b0JBQzNDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO2dCQUN2QyxDQUFDO2dCQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7b0JBQ1YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ3ZELENBQUM7YUFDRixDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtJQUNyQiwwQkFBMEIsQ0FBQyxLQUFVO1FBQ25DLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLENBQUM7SUFDbEQsQ0FBQztJQUVELHFCQUFxQjtJQUNyQiwyQkFBMkIsQ0FBQyxLQUFVO1FBQ3BDLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLENBQUM7SUFDbEQsQ0FBQztJQUNELFlBQVk7SUFFWixZQUFZO0lBRVoseUJBQXlCO0lBQ2pCLFdBQVcsQ0FBQyxRQUFnQjtRQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQjtZQUN4QyxPQUFPLEdBQUcsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7O1lBQzFELE9BQU8sUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLG9CQUE2QixLQUFLO1FBQzlELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhO1lBQy9CLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYTtZQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBRTlCLElBQUksQ0FBQztZQUNILElBQUksS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUE7WUFDdEcsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLE9BQU87b0JBQ0wsR0FBRyxDQUFDO29CQUNKLGNBQWMsRUFDWix3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO3dCQUN2RCxTQUFTO2lCQUNaLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUM7UUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDO2dCQUNILDRDQUE0QztnQkFDNUMsSUFBSSxNQUFNLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7Z0JBQzNGLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxNQUFNLEVBQUUsSUFBSSxDQUFDO1lBQ2hELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBRWpCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFXO1FBQ3JCLHVDQUF1QztRQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUV0QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNyRCxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3JELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQjthQUNsQixnQkFBZ0IsQ0FDZixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUNyRTthQUNBLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNsQixJQUFJLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ2xDLElBQUksV0FBVyxDQUFDO2dCQUNoQixJQUFJLFNBQVMsR0FDWCxJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxTQUFTLENBQUM7Z0JBQzVELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQzNDLFdBQVcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0Isa0JBQWtCLGtCQUFrQixJQUFJLG9CQUFvQixDQUFDLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDckksQ0FBQztxQkFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUN2RCxXQUFXLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxxQkFBcUIsQ0FBQyxpQkFBaUIsSUFBSSxvQkFBb0IsQ0FBQyxhQUFhLElBQUksa0JBQWtCLElBQUksb0JBQW9CLENBQUMsU0FBUyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUM1TixDQUFDO2dCQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUM5QiwwREFBMEQsQ0FDM0QsQ0FBQztnQkFDRixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN6QixDQUFDO1lBRUQsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLENBQUM7WUFFRCxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztTQUNwQixDQUFDLENBQUM7UUFDTCxJQUFJO0lBQ04sQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFXO1FBQ3RCLHlCQUF5QjtRQUV4QixzQkFBc0I7UUFDdEIseUNBQXlDO1FBQ3pDLG1DQUFtQztRQUNuQywyQkFBMkI7UUFDM0IsNkJBQTZCO1FBQzdCLFFBQVE7UUFFUix3REFBd0Q7UUFDeEQsaURBQWlEO1FBQ2pELDBEQUEwRDtRQUMxRCxZQUFZO1FBQ1osSUFBSTtRQUVKLHdCQUF3QjtRQUN4Qix1QkFBdUI7UUFDdkIsMkVBQTJFO1FBQzNFLE1BQU07UUFDTixpQkFBaUI7UUFDakIsNkJBQTZCO1FBQzdCLGlEQUFpRDtRQUNqRCwyQ0FBMkM7UUFFM0Msb0RBQW9EO1FBQ3BELHlEQUF5RDtRQUN6RCw0Q0FBNEM7UUFDNUMsbUNBQW1DO1FBQ25DLCtCQUErQjtRQUMvQixvQ0FBb0M7UUFDcEMsc0NBQXNDO1FBQ3RDLGFBQWE7UUFDYixzREFBc0Q7UUFDdEQsa0NBQWtDO1FBQ2xDLGlCQUFpQjtRQUNqQixhQUFhO1FBQ2IsZ0RBQWdEO1FBQ2hELGtDQUFrQztRQUNsQyx1RUFBdUU7UUFDdkUsMEJBQTBCO1FBQzFCLDRCQUE0QjtRQUM1QixxREFBcUQ7UUFDckQscURBQXFEO1FBQ3JELG9CQUFvQjtRQUNwQixtRUFBbUU7UUFDbkUscUNBQXFDO1FBQ3JDLHNCQUFzQjtRQUV0Qiw0REFBNEQ7UUFDNUQseURBQXlEO1FBQ3pELCtCQUErQjtRQUMvQixrREFBa0Q7UUFDbEQsb0VBQW9FO1FBQ3BFLGdFQUFnRTtRQUNoRSxrRUFBa0U7UUFDbEUsa0RBQWtEO1FBQ2xELDJDQUEyQztRQUMzQyxxREFBcUQ7UUFDckQsb0RBQW9EO1FBQ3BELDJDQUEyQztRQUMzQywrQ0FBK0M7UUFDL0MsbUVBQW1FO1FBQ25FLHNCQUFzQjtRQUN0QixpQ0FBaUM7UUFDakMsb0NBQW9DO1FBQ3BDLHVEQUF1RDtRQUN2RCx1REFBdUQ7UUFDdkQsK0RBQStEO1FBQy9ELDRCQUE0QjtRQUM1QiwyQkFBMkI7UUFDM0IsZ0RBQWdEO1FBQ2hELHlCQUF5QjtRQUN6QixnRUFBZ0U7UUFDaEUsK0NBQStDO1FBQy9DLDRFQUE0RTtRQUM1RSxtQ0FBbUM7UUFDbkMsMkJBQTJCO1FBQzNCLHlCQUF5QjtRQUN6Qix3QkFBd0I7UUFDeEIsbUJBQW1CO1FBQ25CLDZCQUE2QjtRQUM3QixxRUFBcUU7UUFDckUsa0JBQWtCO1FBQ2xCLGlCQUFpQjtRQUNqQiw4Q0FBOEM7UUFDOUMseUVBQXlFO1FBQ3pFLGVBQWU7UUFDZixjQUFjO1FBRWQsNkRBQTZEO1FBQzdELG1DQUFtQztRQUNuQyxjQUFjO1FBQ2QsVUFBVTtRQUNWLFNBQVM7UUFFVCwwQkFBMEI7UUFDMUIsOERBQThEO1FBQzlELGdDQUFnQztRQUNoQyxTQUFTO1FBRVQsMkJBQTJCO1FBQzNCLFFBQVE7SUFDVixDQUFDO0lBR0QsV0FBVyxDQUFDLEdBQVc7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFFdEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFFckQsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNyRCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0I7YUFDbEIsdUJBQXVCLENBQ3RCLElBQUksQ0FBQyx3QkFBd0IsQ0FDM0IsR0FBRyxFQUNILE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sRUFBRSxZQUFZLEVBQ3BCLE1BQU0sRUFBRSxNQUFNLEVBQ2QsTUFBTSxFQUFFLEtBQUssRUFDYixNQUFNLEVBQUUsVUFBVSxFQUNsQixNQUFNLEVBQUUsU0FBUyxFQUNqQixNQUFNLEVBQUUsT0FBTyxDQUNoQixDQUNGO2FBQ0EsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRW5CLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBQzFCLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDO29CQUNyQyxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUMvQyxTQUFTLEVBQ1QsTUFBTSxDQUNQLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxJQUFJLE1BQU0sR0FBd0I7b0JBQ2hDLFdBQVcsRUFBRSxJQUFJO29CQUNqQixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLO29CQUNoQyxNQUFNLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNO29CQUNsQyxJQUFJLEVBQUU7d0JBQ0osS0FBSyxFQUFFLEtBQUs7d0JBQ1osSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO3dCQUNoQixxQkFBcUIsRUFBRSxJQUFJLENBQUMscUJBQXFCO3dCQUNqRCxZQUFZLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjs0QkFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUI7NEJBQ3hCLENBQUMsQ0FBQyxNQUFNLEVBQUUsWUFBWTt3QkFDeEIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO3FCQUNsQztpQkFDRixDQUFDO2dCQUNGLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FDMUMsdUJBQXVCLEVBQ3ZCLE1BQU0sQ0FDUCxDQUFDO2dCQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO29CQUM3QyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVM7d0JBQUUsT0FBTztvQkFFOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDakIsSUFBSSxLQUFLLEdBQWdDO3dCQUN2QyxpQkFBaUIsRUFBRSxHQUFHO3dCQUN0QixVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVU7d0JBQzFCLFlBQVksRUFBRSxJQUFJLENBQUMsZ0JBQWdCOzRCQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQixDQUNoRCxHQUFHLEVBQUUsYUFBYSxFQUNsQixJQUFJLENBQUMsRUFBRSxDQUNSLElBQUksSUFBSSxDQUFDLGlCQUFpQjs0QkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUI7d0JBQzFCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTt3QkFDbEIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxRQUFRO3dCQUNuQixTQUFTLEVBQUUsR0FBRyxDQUFDLGdCQUFnQjt3QkFDL0IsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO3FCQUNyQixDQUFDO29CQUVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFFbEUsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO29CQUNuQyxJQUFJLFdBQVcsQ0FBQztvQkFDaEIsSUFBSSxTQUFTLEdBQ1gsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLEVBQUUsU0FBUyxDQUFDO29CQUU1RCxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUV0RCxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUM1QyxXQUFXLEdBQUcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLHlCQUF5QixrQkFBa0IsSUFBSSxvQkFBb0IsQ0FBQyxTQUFTLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQzVJLENBQUM7eUJBQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDeEQsV0FBVyxHQUFHLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUkscUJBQXFCLENBQUMsaUJBQWlCLElBQUksb0JBQW9CLENBQUMsWUFBWSxJQUFJLGtCQUFrQixJQUFJLG9CQUFvQixDQUFDLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDM04sQ0FBQzt5QkFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsRCxXQUFXLEdBQUcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLG1CQUFtQixrQkFBa0IsSUFBSSxvQkFBb0IsQ0FBQyxTQUFTLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ3RJLENBQUM7b0JBRUQsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQzt3QkFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ3JDLENBQUM7b0JBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FDOUIseURBQXlELENBQzFELENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDekIsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sYUFBYSxDQUFDLEdBQVc7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FDOUIsZ0JBQWdCLENBQUMsYUFBYSxFQUM5QixTQUFTLEVBQ1QsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUNsQixJQUFJLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO29CQUNoRCxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUU7d0JBQ2YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FDOUIsZ0JBQWdCLENBQUMsbUJBQW1CLENBQ3JDLENBQUM7d0JBQ0YsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUN6QixDQUFDO29CQUNELEtBQUssRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO3dCQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzt3QkFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3ZELENBQUM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQixDQUFDLEVBQVU7UUFDbEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FDOUIsa0RBQWtELEVBQ2xELFNBQVMsRUFDVCxDQUFDLE1BQWUsRUFBRSxFQUFFO1lBQ2xCLElBQUksTUFBTSxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDbkQsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFO3dCQUNmLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQzlCLGdCQUFnQixDQUFDLGlCQUFpQixDQUNuQyxDQUFDO3dCQUNGLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO3dCQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztvQkFDekIsQ0FBQztvQkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRTt3QkFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7d0JBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUN2RCxDQUFDO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxhQUFhLENBQUMsR0FBVztRQUMvQixJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsSUFBSSxVQUFVLEdBQVcsZ0JBQWdCLENBQUM7WUFDMUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7WUFDcEQsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMzQixDQUFDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDcEQsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQ2pCLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO29CQUM5RCxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN4QyxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUM7b0JBQzFCLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQy9DLFlBQVksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO29CQUNuQyxZQUFZLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztvQkFDaEMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUM5QiwrQ0FBK0MsQ0FDaEQsQ0FBQztvQkFDRixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDekIsQ0FBQztnQkFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO29CQUNWLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUNyRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDekIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRU8sZUFBZSxDQUFDLEVBQVU7UUFDaEMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNQLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUMxRSxJQUFJLHFCQUFxQixHQUF1QjtnQkFDOUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsU0FBUztnQkFDcEMsV0FBVyxFQUFFLFNBQVM7Z0JBQ3RCLEdBQUcsRUFBRSxJQUFJLENBQUMsaUJBQWlCO2dCQUMzQixrQkFBa0IsRUFBRSxTQUFTO2FBQzlCLENBQUM7WUFFRixPQUFPLHFCQUFxQixDQUFDO1FBQy9CLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMzRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQixDQUN2QixHQUFXLEVBQ1gsVUFBa0IsRUFDbEIsWUFBcUIsRUFDckIsTUFBZSxFQUNmLEtBQWMsRUFDZCxTQUFrQixFQUNsQixPQUFpQjtRQUVqQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdkQsSUFBSSxRQUFRLEdBQ1YsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ3RELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLEdBQUcsSUFBSSxtREFBbUQsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDckUsSUFBSSxnQkFBZ0IsR0FBa0I7b0JBQ3BDLGlCQUFpQixFQUFFLEdBQUc7b0JBQ3RCLFlBQVksRUFBRSxJQUFJLENBQUMsZ0JBQWdCO3dCQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDOzRCQUN6RSxJQUFJLENBQUMsaUJBQWlCO3dCQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQjtvQkFDMUIsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXO29CQUNqRixRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWE7b0JBQzVCLFVBQVUsRUFBRSxVQUFVO29CQUN0QixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsU0FBUyxFQUFFLFVBQVUsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUs7b0JBQ3BFLE9BQU8sRUFBRSxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7b0JBQ3hELGVBQWUsRUFBRSxJQUFJLENBQUMsbUJBQW1CO29CQUN6QyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO29CQUM3QyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxLQUFLLEVBQUUsS0FBSztvQkFDWixTQUFTLEVBQUUsU0FBUztvQkFDcEIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztpQkFDcEMsQ0FBQztnQkFFRixPQUFPLGdCQUFnQixDQUFDO1lBQzFCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLEtBQUssQ0FDVCw0R0FBNEcsQ0FDN0csQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNILENBQUM7SUFFTyxvQkFBb0IsQ0FDMUIsVUFBeUIsRUFDekIsVUFBa0IsRUFDbEIsWUFBb0IsRUFDcEIsTUFBYyxFQUNkLEtBQWEsRUFDYixTQUFpQixFQUNqQixPQUFnQjtRQUVoQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFdkQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMxRCxJQUFJLGdCQUFnQixHQUFxQjtnQkFDdkMsWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBQ2hFLElBQUksQ0FBQyxXQUFXO2dCQUNoQixVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSw2REFBNkQ7Z0JBQzdGLFNBQVMsRUFBRSxVQUFVLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLO2dCQUNwRSxVQUFVLEVBQUUsVUFBVTtnQkFDdEIsT0FBTyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztnQkFDeEQsVUFBVSxFQUFFLFVBQVUsRUFBRSw2RUFBNkU7Z0JBQ3JHLHFCQUFxQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7Z0JBQzdDLGVBQWUsRUFBRSxJQUFJLENBQUMsbUJBQW1CO2dCQUN6QyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxLQUFLLEVBQUUsS0FBSztnQkFDWixTQUFTLEVBQUUsU0FBUztnQkFDcEIsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7Z0JBQzVDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYzthQUNwQyxDQUFDO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sZ0JBQWdCLENBQUM7UUFDMUIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLGdCQUFnQixHQUFxQjtnQkFDdkMsWUFBWSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsbUJBQW1CO29CQUM3RCxDQUFDLENBQUMsWUFBYTtvQkFDZixDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFrQjtnQkFDM0IsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUN0RCxPQUFPLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO29CQUM1QyxVQUFVLEVBQUUsSUFBSTtpQkFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVztnQkFDckIsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsU0FBUyxFQUFFLFVBQVUsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQU07Z0JBQ3JFLFVBQVUsRUFBRSxVQUFVO2dCQUN0QixPQUFPLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO2dCQUN4RCxVQUFVLEVBQUUsVUFBVSxFQUFFLDZFQUE2RTtnQkFDckcscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtnQkFDN0MsZUFBZSxFQUFFLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ3pDLE1BQU0sRUFBRSxNQUFNO2dCQUNkLEtBQUssRUFBRSxLQUFLO2dCQUNaLFNBQVMsRUFBRSxTQUFTO2dCQUNwQixPQUFPLEVBQUUsT0FBTzthQUNqQixDQUFDO1lBRUYsT0FBTyxnQkFBZ0IsQ0FBQztZQUN4Qiw2R0FBNkc7UUFDL0csQ0FBQztJQUNILENBQUM7SUFFTyx3QkFBd0IsQ0FDOUIsR0FBVyxFQUNYLFVBQXlCLEVBQ3pCLFlBQXFCLEVBQ3JCLE1BQWUsRUFDZixLQUFjLEVBQ2QsVUFBbUIsRUFDbkIsU0FBa0IsRUFDbEIsT0FBaUI7UUFFakIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZELElBQUksUUFBUSxHQUNWLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQztRQUV0RCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxHQUFHLElBQUksbURBQW1ELENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3JFLElBQUksb0JBQW9CLEdBQXlCO29CQUMvQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjt3QkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQzs0QkFDekUsSUFBSSxDQUFDLGlCQUFpQjt3QkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUI7b0JBQzFCLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVztvQkFDakYsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUseUNBQXlDO29CQUN2RSxpQkFBaUIsRUFBRSxHQUFHO29CQUN0QixVQUFVLEVBQUUsVUFBVTtvQkFDdEIsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLFNBQVMsRUFBRSxVQUFVLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLO29CQUNwRSxPQUFPLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO29CQUN4RCxxQkFBcUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO29CQUM3QyxlQUFlLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtvQkFDekMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsS0FBSyxFQUFFLEtBQUs7b0JBQ1osVUFBVSxFQUFFLFVBQVU7b0JBQ3RCLFNBQVMsRUFBRSxTQUFTO29CQUNwQixPQUFPLEVBQUUsT0FBTztvQkFDaEIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO2lCQUNwQyxDQUFDO2dCQUNGLE9BQU8sb0JBQW9CLENBQUM7WUFDOUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sS0FBSyxDQUNULG9GQUFvRixDQUNyRixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsTUFBTSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQztRQUMxRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RCxFQUFFO1FBQ0YsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3ZGLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNkLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO29CQUVyQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ2hELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQzlCLGdCQUFnQixDQUFDLHFCQUFxQixDQUN2QyxDQUFDO3dCQUNGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztvQkFDbkQsQ0FBQztvQkFFRCxFQUFFO29CQUNGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUN2QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDNUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNaLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUNyRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDdkMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzVCLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDWixDQUFDO2dCQUNELFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO2FBQ3BCLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBRU8sNkJBQTZCO1FBQ25DLElBQUksQ0FBQyxtQ0FBbUMsR0FBRyxJQUFJLENBQUM7SUFDbEQsQ0FBQztJQUVPLDZCQUE2QjtRQUNuQyxJQUFJLENBQUMsbUNBQW1DLEdBQUcsS0FBSyxDQUFDO1FBQ2pELElBQUksQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLENBQUM7SUFDbEQsQ0FBQztJQUVELDhCQUE4QjtJQUM5Qiw0QkFBNEIsQ0FBQyxZQUFvQjtRQUMvQyxJQUFJLEdBQUcsR0FBVyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0Isa0JBQWtCLElBQUksQ0FBQyxhQUFhLElBQUksWUFBWSxFQUFFLENBQUM7UUFDeEcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELHVEQUF1RDtJQUN2RCx3QkFBd0IsQ0FBQyxZQUFpQjtRQUN4QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUMvRCxJQUFJLENBQUMsZ0JBQWdCO2FBQ2xCLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDO2FBQ3hFLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ2xDLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekMsQ0FBQzs7b0JBQ0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FDM0Isb0RBQW9ELENBQ3JELENBQUM7WUFDTixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FDM0Isb0RBQW9ELENBQ3JELENBQUM7WUFDSixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELDREQUE0RDtJQUM1RCxzQkFBc0IsQ0FBQyxRQUFnQjtRQUNyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzdELElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ2xCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDYixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUMzQix3REFBd0QsQ0FDekQsQ0FBQztZQUNKLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsWUFBWTtJQUVaLHVEQUF1RDtJQUN2RCx1QkFBdUIsQ0FBQyxTQUFpQjtRQUN2QyxJQUFJLE9BQU8sR0FBRztZQUNaLGlCQUFpQixFQUFFLFNBQVM7U0FDN0IsQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywrQkFBK0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdkUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUF3QixFQUFFLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUNsRSxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGFBQWE7SUFFYixlQUFlLENBQUMsR0FBVztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUV0QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNyRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNsQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxTQUFTLENBQUM7UUFFMUUsSUFBSSxTQUFTLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxxQkFBcUIsQ0FBQyxlQUFlLElBQUksb0JBQW9CLENBQUMsY0FBYyxJQUFJLGdCQUFnQixJQUFJLG9CQUFvQixDQUFDLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUV6TixPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTNELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQzlCLDBEQUEwRCxDQUMzRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQzsrR0F0dUNVLHdCQUF3QjttR0FBeEIsd0JBQXdCLHFWQUZ4QixDQUFDLEdBQUcsWUFBWSxDQUFDLDBSQzFCOUIsK2xRQStJQTs7NEZEbkhhLHdCQUF3QjtrQkFOcEMsU0FBUzsrQkFDRSxzQkFBc0IsYUFHckIsQ0FBQyxHQUFHLFlBQVksQ0FBQzt3VEErQ0gsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUV2Qiw0QkFBNEI7c0JBRDNCLFNBQVM7dUJBQUMsOEJBQThCO2dCQVNoQyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZCB9IGZyb20gJ3ByaW1lbmcvZmlsZXVwbG9hZCc7XHJcbmltcG9ydCB7IFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gJy4uLy4uL2VudW1zL3Rvb2x0aXBQb3NpdGlvbi5lbnVtJztcclxuaW1wb3J0IHsgQnV0dG9uVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2J1dHRvbi10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBBZGRSZXBvcnRQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vYWRkLXJlcG9ydC1wb3B1cC9hZGQtcmVwb3J0LXBvcHVwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IExvY2FsaXphdGlvbktleXMgfSBmcm9tICcuLi8uLi9jb25zdHMvbG9jYWxpemF0aW9uLWtleSc7XHJcbmltcG9ydCB7IFNlZ21lbnQgfSBmcm9tICcuLi8uLi9lbmQtcG9pbnRzJztcclxuaW1wb3J0IHsgR3JpZFNlbGVjdGlvbk1vZGUsIEh0dHBNZXRob2RUeXBlLCBUc2lSZXBvcnRUeXBlLCBEaXNwbGF5VHlwZXMsIENTU1VuaXRzLCBNb2RhbFNpemVFbnVtLCBNb2RlcyB9IGZyb20gJy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgR3JpZENvbHVtbiwgQ1NTU2l6ZVByb3BlcnR5LCBCdXR0b25DbGlja1Jlc3VsdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBSZXBvcnRUZW1wbGF0ZVJlc3BvbnNlLCBKc29uRGF0YUNvbm5lY3Rpb24sIEtleVZhbHVlUGFpciwgT3B0aW9uYWxFbmRwb2ludHMsIFJlcG9ydFRvRWRpdFRlbXBsYXRlUGF5bG9hZCwgUmVwb3J0VG9QcmludCwgUmVwb3J0VG9UZW1wbGF0ZSwgUmVwb3J0VG9FZGl0VGVtcGxhdGUgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBBcHBSb3V0ZXMgfSBmcm9tICcuLi8uLi9yb3V0ZXMvYXBwLnJvdXRlcyc7XHJcbmltcG9ydCB7IFJlcG9ydGluZ1NlcnZpY2UsIElkZW50aXR5TWFuYWdlclNlcnZpY2UsIFRzaUNvbmZpcm1hdGlvblNlcnZpY2UsIFRzaU5vdGlmaWNhdGlvblNlcnZpY2UsIFRzaU1vZGFsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgVHNpRm9ybUNvbXBvbmVudEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi90c2ktYmFzZS9jb21wb25lbnRzL3RzaS1mb3JtLWJhc2UvdHNpLWZvcm0tYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSZXBvcnRpbmdFbmRwb2ludHMgfSBmcm9tICcuLi8uLi9lbmQtcG9pbnRzL3JlcG9ydGluZy1lbmRwb2ludHMnO1xyXG5pbXBvcnQgeyBxdWVyeVBhcmFtTmFtZXNDb25zdCB9IGZyb20gJy4uLy4uL2NvbnN0cy9xdWVyeVBhcmFtTmFtZXMuY29uc3QnO1xyXG5pbXBvcnQgeyBNYW5hZ2VSZXBvcnRpbmdSb3V0ZXMgfSBmcm9tICcuLi8uLi9yb3V0ZXMvbWFuYWdlLXJlcG9ydGluZy5yb3V0ZXMnO1xyXG5pbXBvcnQgeyBhcHBQcm92aWRlcnMgfSBmcm9tICcuLi8uLi9jb25zdHMvYXBwLXByb3ZpZGVycyc7XHJcbmltcG9ydCB7IER5bmFtaWNEaWFsb2dDb25maWcsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtbWFuYWdlLXJlcG9ydGluZycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL21hbmFnZS1yZXBvcnRpbmcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL21hbmFnZS1yZXBvcnRpbmcuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFsuLi5hcHBQcm92aWRlcnNdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWFuYWdlUmVwb3J0aW5nQ29tcG9uZW50XHJcbiAgZXh0ZW5kcyBUc2lGb3JtQ29tcG9uZW50QmFzZUNvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8vI3JlZ2lvbiBwcm9wZXJ0aWVzXHJcblxyXG4gIHJlYWRvbmx5IEVESVRJT05fUEVSU09OTkFMSVNFID0gJ2FwcC1lZGl0aW9uLXBlcnNvbm5hbGlzZSc7XHJcbiAgcmVwb3J0czogUmVwb3J0VGVtcGxhdGVSZXNwb25zZVtdID0gW107XHJcbiAganNvbkRhdGFDb25uZWN0aW9uOiBKc29uRGF0YUNvbm5lY3Rpb24gfCB1bmRlZmluZWQ7XHJcbiAganNvbkRhdGFDb25uZWN0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICByZXBvcnRUb1ByaW50SWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICB0b1VwbG9hZEZpbGVEYXRhOiBhbnkgPSB1bmRlZmluZWQ7XHJcbiAgY29sdW1uczogR3JpZENvbHVtbltdID0gW107XHJcbiAgaXNGcm9tRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGZvcm1OYW1lczogS2V5VmFsdWVQYWlyPHN0cmluZywgc3RyaW5nPltdID0gW107XHJcbiAgc2VsZWN0ZWRSZXBvcnRzOiBudW1iZXJbXSA9IFtdO1xyXG4gIHNlbGVjdGlvbk1vZGUgPSBHcmlkU2VsZWN0aW9uTW9kZS5NdWx0aXBsZTtcclxuICBnZXRGb3JtTmFtZXNFbmRwb2ludDogc3RyaW5nID0gUmVwb3J0aW5nRW5kcG9pbnRzLmdldEF2YWlsYWJsZUZvcm1OYW1lcygpO1xyXG4gIGdsb2JhbEZpbHRlckZpZWxkcyA9IFsnbmFtZSddO1xyXG4gIHJlZnJlc2hKb2JUaW1lT3V0OiBhbnk7XHJcbiAgcHJldmlvdXNGb3JtTmFtZTogc3RyaW5nID0gJyc7XHJcbiAgaXNVcGRhdGVSZXBvcnRGcm9tRmlsZURpYWxvZ1Zpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0b1VwbG9hZFRvVXBkYXRlUmVwb3J0RmlsZURhdGE6IGFueSA9IHVuZGVmaW5lZDtcclxuICBzZWxlY3RlZFJlcG9ydFRvVXBkYXRlRnJvbUZpbGU6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBkZWZhdWx0UmVwb3J0VGVtcGxhdGVEYXRhOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGRlZmF1bHRUZW1wbGF0ZUNvbHVtbnM6IEdyaWRDb2x1bW5bXSA9IFtdO1xyXG4gIHRvb2x0aXBQb3NpdGlvbiA9IFRvb2x0aXBQb3NpdGlvbjtcclxuICBwcml2YXRlIF9kaWFsb2dSZWY/OiBEeW5hbWljRGlhbG9nUmVmO1xyXG4gIGlzRWRpdGlvblBlcnNvbm5hbGlzZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGVudGl0eUlkPzogc3RyaW5nO1xyXG4gIHJlcG9ydERpc2NyaW1pbmF0b3I/OiBhbnk7XHJcbiAgaHR0cE1ldGhvZFR5cGU/OiBIdHRwTWV0aG9kVHlwZVxyXG4gIHJlcXVlc3REYXRhPzogYW55XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHJlcG9ydFR5cGVMYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICBbVHNpUmVwb3J0VHlwZS5EYXNoYm9hcmRdOiAnRGFzaGJvYXJkJyxcclxuICAgIFtUc2lSZXBvcnRUeXBlLkxpc3RdOiAnRW5kIHVzZXInLFxyXG4gICAgW1RzaVJlcG9ydFR5cGUuUlRGXTogJ1JURicsXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBfaXNSZXBvcnRGb3JGaWNoZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBnZXQgaXNSZXBvcnRGb3JGaWNoZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5vdGhlckZvcm1FbmRwb2ludD8uaW5jbHVkZXMoJ2dldGFsbHBhZ2VkJykgJiYgIXRoaXMucmVxdWVzdERhdGE7XHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKCdmaWxlVXBsb2FkJykgZmlsZVVwbG9hZD86IEZpbGVVcGxvYWQ7XHJcbiAgQFZpZXdDaGlsZCgnaW1wb3J0RmlsZVRvUmVwb3J0RmlsZVVwbG9hZCcpXHJcbiAgaW1wb3J0RmlsZVRvUmVwb3J0RmlsZVVwbG9hZD86IEZpbGVVcGxvYWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlcnJvck1lc3NhZ2VLZXk6IHN0cmluZyA9ICdzaGFyZWRfcmVwb3J0aW5nX2Vycm9yX29jY3VyZWQnO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRhc2hib2FyZE1vZHVsZVJvdXRlID0gYCR7QXBwUm91dGVzLmFwcH0vJHtBcHBSb3V0ZXMuZGFzaGJvYXJkfWA7XHJcbiAgLy8jZW5kcmVnaW9uXHJcbiAgYnV0dG9uVHlwZSA9IEJ1dHRvblR5cGU7XHJcbiAgLy8gcGFyYW1ldHJlOiBQYXJhbWV0cmVzQXBwbGljYXRpb25QYWllID0gbmV3IFBhcmFtZXRyZXNBcHBsaWNhdGlvblBhaWUoKTtcclxuICAvLyNyZWdpb24gSW5wdXQgcHJvcGVydGllc1xyXG4gIEBJbnB1dCgpIG90aGVyRm9ybU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDsgLy9mb3JtSWRlbnRpZmllclxyXG4gIEBJbnB1dCgpIG90aGVyRm9ybUVuZHBvaW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7IC8vPSBgJHtHZXN0aW9uQ29tbWVyY2lhbGVTZWdtZW50cy5mYWN0dXJlVmVudGV9LzE2NWVjNWZkLTRkMzQtNDU0Ni1hZTE1LTAwNDRlNzA4YjlkOWA7XHJcbiAgQElucHV0KCkgZm9ybUVuZHBvaW50Qm9keTogc3RyaW5nIHwgdW5kZWZpbmVkOyAvL2Zvcm1JZGVudGlmaWVyXHJcbiAgQElucHV0KCkgaXNGb3JtRW5kcG9pbnRQYWdlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGZpbHRlcnNIdG1sVGVtcGxhdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBvcHRpb25hbEVuZHBvaW50cz86IE9wdGlvbmFsRW5kcG9pbnRzO1xyXG4gIEBJbnB1dCgpIGN1c3RvbVJlcG9ydGluZ01vZGU/OiBib29sZWFuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBPdXRwdXQgcHJvcGVydGllc1xyXG4gIC8vQE91dHB1dCgpIGhpZGU6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGN0b3JcclxuICBjb25zdHJ1Y3RvcihcclxuICAgLy8gcHVibGljIF9wYXJhbWV0cmVzQXBwbGljYXRpb25QYWllU2VydmljZTogUGFyYW1ldHJlc0FwcGxpY2F0aW9uUGFpZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlcG9ydGluZ1NlcnZpY2U6IFJlcG9ydGluZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGlkZW50aXR5TWFuYWdlclNlcnZpY2U6IElkZW50aXR5TWFuYWdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IFRzaUNvbmZpcm1hdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IFRzaU5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVmOiBEeW5hbWljRGlhbG9nUmVmLFxyXG4gICAgcHVibGljIG92ZXJyaWRlIGNvbmZpZzogRHluYW1pY0RpYWxvZ0NvbmZpZyxcclxuICAgIHByaXZhdGUgX3RzaU1vZGFsU2VydmljZTogVHNpTW9kYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICApIHtcclxuICAgIHN1cGVyKHJlZiwgY29uZmlnKTtcclxuXHJcbiAgICAvL2luaXQgY29sdW1uc1xyXG4gICAgdGhpcy5jb2x1bW5zID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgZmllbGQ6ICduYW1lJyxcclxuICAgICAgICBoZWFkZXI6ICdzaGFyZWRfcmVwb3J0aW5nX3JlcG9ydF9uYW1lJyxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGZpZWxkOiAncmVwb3J0VHlwZU5hbWUnLFxyXG4gICAgICAgIGhlYWRlcjogJ3NoYXJlZF9yZXBvcnRpbmdfcmVwb3J0X3R5cGUnLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgZmllbGQ6ICdpc0RlZmF1bHQnLFxyXG4gICAgICAgIGhlYWRlcjogJ3NoYXJlZF9yZXBvcnRpbmdfcmVwb3J0X2lzZGVmYXVsdCcsXHJcbiAgICAgICAgdHlwZTogRGlzcGxheVR5cGVzLkNIRUNLQk9YX0RJU1BMQVksXHJcbiAgICAgICAgd2lkdGg6IG5ldyBDU1NTaXplUHJvcGVydHkoMTAsIENTU1VuaXRzLlBSRUNFTlQpLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyOiAnJyxcclxuICAgICAgICBmaWVsZDogJ3NlbmQnLFxyXG4gICAgICAgIGlzQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgIGJ1dHRvbkljb246ICdwaSBwaS1zZW5kJyxcclxuICAgICAgICBzdHlsZUNsYXNzOiAncC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zdWNjZXNzJyxcclxuICAgICAgICB0b29sVGlwVGV4dDogJ3NoYXJlZF9zZW5kX3JlcG9ydF9ieV9lbWFpbCcsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBoZWFkZXI6ICcnLFxyXG4gICAgICAgIGZpZWxkOiAnZWRpdCcsXHJcbiAgICAgICAgaXNCdXR0b246IHRydWUsXHJcbiAgICAgICAgYnV0dG9uSWNvbjogJ3BpIHBpLWZpbGUtZWRpdCcsXHJcbiAgICAgICAgc3R5bGVDbGFzczogJ3AtYnV0dG9uLXRleHQgcC1idXR0b24tc3VjY2VzcycsXHJcbiAgICAgICAgdG9vbFRpcFRleHQ6ICdzaGFyZWRfcmVwb3J0aW5nX2VkaXQnLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyOiAnJyxcclxuICAgICAgICBmaWVsZDogJ3ZpZXcnLFxyXG4gICAgICAgIGlzQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgIGJ1dHRvbkljb246ICdwaSBwaS1leWUnLFxyXG4gICAgICAgIHN0eWxlQ2xhc3M6ICdwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWluZm8nLFxyXG4gICAgICAgIHRvb2xUaXBUZXh0OiAnc2hhcmVkX3JlcG9ydGluZ192aWV3JyxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGhlYWRlcjogJycsXHJcbiAgICAgICAgZmllbGQ6ICdleHBvcnQnLFxyXG4gICAgICAgIGlzQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgIGJ1dHRvbkljb246ICdwaSBwaS1maWxlLWV4cG9ydCcsXHJcbiAgICAgICAgc3R5bGVDbGFzczogJ3AtYnV0dG9uLXRleHQgcC1idXR0b24taGVscCcsXHJcbiAgICAgICAgdG9vbFRpcFRleHQ6ICdzaGFyZWRfcmVwb3J0aW5nX2V4cG9ydCcsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBoZWFkZXI6ICcnLFxyXG4gICAgICAgIGZpZWxkOiAnaW1wb3J0JyxcclxuICAgICAgICBpc0J1dHRvbjogdHJ1ZSxcclxuICAgICAgICBidXR0b25JY29uOiAncGkgcGktcGFwZXJjbGlwJyxcclxuICAgICAgICBzdHlsZUNsYXNzOiAncC1idXR0b24tdGV4dCBwLWJ1dHRvbi13YXJuaW5nJyxcclxuICAgICAgICB0b29sVGlwVGV4dDogJ3NoYXJlZF9yZXBvcnRpbmdfaW1wb3J0JyxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGhlYWRlcjogJycsXHJcbiAgICAgICAgZmllbGQ6ICdkZWZhdWx0JyxcclxuICAgICAgICBpc0J1dHRvbjogdHJ1ZSxcclxuICAgICAgICBidXR0b25JY29uOiAncGkgcGktYm9va21hcmstZmlsbCcsXHJcbiAgICAgICAgc3R5bGVDbGFzczogJ3AtYnV0dG9uLXRleHQnLFxyXG4gICAgICAgIHRvb2xUaXBUZXh0OiAnc2hhcmVkX3JlcG9ydGluZ19zZXRfZGVmYXVsdCcsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBoZWFkZXI6ICcnLFxyXG4gICAgICAgIGZpZWxkOiAnZGVsZXRlJyxcclxuICAgICAgICBpc0J1dHRvbjogdHJ1ZSxcclxuICAgICAgICBidXR0b25JY29uOiAncGkgcGktdHJhc2gnLFxyXG4gICAgICAgIHN0eWxlQ2xhc3M6ICdwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlcicsXHJcbiAgICAgICAgdG9vbFRpcFRleHQ6ICdzaGFyZWRfcmVwb3J0aW5nX2RlbGV0ZV9yZXBvcnQnLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyOiAnJyxcclxuICAgICAgICBmaWVsZDogJ0FkZF9Ub19CdWlsdEluX1RlbXBsYXRlcycsXHJcbiAgICAgICAgaXNCdXR0b246IHRydWUsXHJcbiAgICAgICAgYnV0dG9uSWNvbjogJ3BpIHBpLWFycm93LWNpcmNsZS1kb3duJyxcclxuICAgICAgICBzdHlsZUNsYXNzOiAncC1idXR0b24tdGV4dCBwLWJ1dHRvbi1oZWxwJyxcclxuICAgICAgICB0b29sVGlwVGV4dDogJ3NoYXJlZF9yZXBvcnRpbmdfZXhwb3J0X2Rldl9yZXBvcnQnLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyOiAnJyxcclxuICAgICAgICBmaWVsZDogJ01ha2VfZGVmYXVsdF9yZXBvcnRfbGF5b3V0JyxcclxuICAgICAgICBpc0J1dHRvbjogdHJ1ZSxcclxuICAgICAgICBidXR0b25JY29uOiAncGkgcGktYm9va21hcmstZmlsbCcsXHJcbiAgICAgICAgc3R5bGVDbGFzczogJ3AtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyJyxcclxuICAgICAgICB0b29sVGlwVGV4dDogJ3NoYXJlZF9yZXBvcnRpbmdfbWFrZV9kZWZhdWx0X3JlcG9ydF9sYXlvdXQnLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICAgIHRoaXMuZGVmYXVsdFRlbXBsYXRlQ29sdW1ucyA9IFtcclxuICAgICAge1xyXG4gICAgICAgIGZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgaGVhZGVyOiAnc2hhcmVkX3JlcG9ydGluZ19yZXBvcnRfbmFtZScsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBmaWVsZDogJ3JlcG9ydFR5cGVOYW1lJyxcclxuICAgICAgICBoZWFkZXI6ICdzaGFyZWRfcmVwb3J0aW5nX3JlcG9ydF90eXBlJyxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGhlYWRlcjogJycsXHJcbiAgICAgICAgZmllbGQ6ICdkZWxldGVEZWZhdWx0UmVwb3J0RmlsZScsXHJcbiAgICAgICAgaXNCdXR0b246IHRydWUsXHJcbiAgICAgICAgYnV0dG9uSWNvbjogJ3BpIHBpLXRyYXNoJyxcclxuICAgICAgICBzdHlsZUNsYXNzOiAncC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXInLFxyXG4gICAgICAgIHRvb2xUaXBUZXh0OiAnc2hhcmVkX3JlcG9ydGluZ19kZWxldGVfZGVmYXVsdF9yZXBvcnQnLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyOiAnJyxcclxuICAgICAgICBmaWVsZDogJ0FkZF9Gcm9tX0J1aWx0SW5fVGVtcGxhdGVzJyxcclxuICAgICAgICBpc0J1dHRvbjogdHJ1ZSxcclxuICAgICAgICBidXR0b25JY29uOiAncGkgcGktYXJyb3ctY2lyY2xlLXVwJyxcclxuICAgICAgICBzdHlsZUNsYXNzOiAncC1idXR0b24tdGV4dCBwLWJ1dHRvbi1wcmltYXJ5JyxcclxuICAgICAgICB0b29sVGlwVGV4dDogJ3NoYXJlZF9yZXBvcnRpbmdfYWRkX3RvX215X2xpc3RfcmVwb3J0JyxcclxuICAgICAgfSxcclxuICAgIF07XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBjaGVja0lmSXNEZXZNb2RlKCkge1xyXG4gICAgaWYgKFNlZ21lbnQucHJvZHVjdGlvbikge1xyXG4gICAgICBsZXQgYnV0dG9uQWRCdWlsdGluVGVtcGxhdGVzSW5kZXggPSB0aGlzLmNvbHVtbnMuZmluZEluZGV4KFxyXG4gICAgICAgIChjb2w6IEdyaWRDb2x1bW4pID0+IHtcclxuICAgICAgICAgIHJldHVybiBjb2wuZmllbGQgPT0gJ0FkZF9Ub19CdWlsdEluX1RlbXBsYXRlcyc7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoYnV0dG9uQWRCdWlsdGluVGVtcGxhdGVzSW5kZXggIT0gLTEpIHtcclxuICAgICAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKGJ1dHRvbkFkQnVpbHRpblRlbXBsYXRlc0luZGV4LCAxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGJ1dHRvbkRlbGV0ZURlZmF1bHRSZXBvcnRGaWxlSW5kZXggPVxyXG4gICAgICAgIHRoaXMuZGVmYXVsdFRlbXBsYXRlQ29sdW1ucy5maW5kSW5kZXgoKGNvbDogR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGNvbC5maWVsZCA9PSAnZGVsZXRlRGVmYXVsdFJlcG9ydEZpbGUnO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKGJ1dHRvbkRlbGV0ZURlZmF1bHRSZXBvcnRGaWxlSW5kZXggIT0gLTEpIHtcclxuICAgICAgICB0aGlzLmRlZmF1bHRUZW1wbGF0ZUNvbHVtbnMuc3BsaWNlKFxyXG4gICAgICAgICAgYnV0dG9uRGVsZXRlRGVmYXVsdFJlcG9ydEZpbGVJbmRleCxcclxuICAgICAgICAgIDFcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL2hhbmRsZSBMaWZlY3ljbGUgSG9va3NcclxuICBvdmVycmlkZSBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuaXNFZGl0aW9uUGVyc29ubmFsaXNlID0gdGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCdhZG1pbmlzdHJhdGlvbicpO1xyXG4gICAgdGhpcy5jaGVja0lmSXNEZXZNb2RlKCk7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgLy8gaWYgKHRoaXMub3RoZXJGb3JtTmFtZSApIHtcclxuICAgIHRoaXMuaXNGcm9tRm9ybSA9IHRydWU7XHJcbiAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKDMsIDAsIHtcclxuICAgICAgaGVhZGVyOiAnJyxcclxuICAgICAgZmllbGQ6ICdwcmludCcsXHJcbiAgICAgIGlzQnV0dG9uOiB0cnVlLFxyXG4gICAgICBidXR0b25JY29uOiAncGkgcGktcHJpbnQnLFxyXG4gICAgICBzdHlsZUNsYXNzOiAncC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zZWNvbmRhcnknLFxyXG4gICAgICB0b29sVGlwVGV4dDogJ3NoYXJlZF9yZXBvcnRpbmdfcmVwb3J0X3ByaW50JyxcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMub3RoZXJGb3JtTmFtZSAmJiB0aGlzLm90aGVyRm9ybU5hbWUgIT0gJ2FwcC1tYW5hZ2UtcmVwb3J0aW5nJykge1xyXG4gICAgICB0aGlzLmZvcm1OYW1lcyA9IFt7IGtleTogdGhpcy5vdGhlckZvcm1OYW1lLCB2YWx1ZTogdGhpcy5vdGhlckZvcm1OYW1lIH1dO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHlJZCA9IHRoaXMuY29uZmlnLmRhdGE/LmlkO1xyXG4gICAgdGhpcy5jdXN0b21SZXBvcnRpbmdNb2RlID0gdGhpcy5jb25maWc/LmRhdGE/LmN1c3RvbVJlcG9ydGluZ01vZGVcclxuICAgIHRoaXMuaHR0cE1ldGhvZFR5cGUgPSB0aGlzLmNvbmZpZz8uZGF0YT8uaHR0cE1ldGhvZFR5cGVcclxuICAgIGF3YWl0IHRoaXMuX3JlZnJlc2hSZXBvcnRzKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG5cclxuICAgIGlmICh0aGlzLnJlZnJlc2hKb2JUaW1lT3V0KSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hKb2JUaW1lT3V0KTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBoYW5kbGUgZXZlbnRzXHJcbiAgYXN5bmMgb25SZWZyZXNoKCkge1xyXG4gICAgYXdhaXQgdGhpcy5fcmVmcmVzaFJlcG9ydHModHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBvblByaW50RGVmYXVsdChldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5vdGhlckZvcm1OYW1lKSB7XHJcbiAgICAgIHRoaXMucmVwb3J0aW5nU2VydmljZS5nZXREZWZhdWx0UmVwb3J0KHRoaXMub3RoZXJGb3JtTmFtZSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgLy8gbGV0IGRlZmF1bHRSZXBvcnRJZDogc3RyaW5nID0gZGF0YTtcclxuICAgICAgICAgIHRoaXMuX3ZpZXdSZXBvcnQoZGF0YS51aWQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7IH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZTogRmlsZSA9IGV2ZW50LmN1cnJlbnRGaWxlc1swXTtcclxuICAgIHRoaXMudG9VcGxvYWRGaWxlRGF0YSA9IGZpbGU7XHJcbiAgfVxyXG5cclxuICBvbkltcG9ydEZpbGUoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXBvcnRpbmdTZXJ2aWNlLnVwbG9hZFJlcG9ydEZpbGUodGhpcy50b1VwbG9hZEZpbGVEYXRhLCB0aGlzLnJlcG9ydERpc2NyaW1pbmF0b3IpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IGFzeW5jIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3JlZnJlc2hSZXBvcnRzKCk7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXHJcbiAgICAgICAgICAnc2hhcmVkX3JlcG9ydGluZ19yZXBvcnRfdXBsb2FkZWRfc3VjY2Vzc2Z1bGx5J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkPy5jbGVhcigpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcih0aGlzLmVycm9yTWVzc2FnZUtleSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vY2FuY2VsIGJ1dHRvbiBjbGlja1xyXG4gIG9uQ2xlYXIoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy50b1VwbG9hZEZpbGVEYXRhID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLy9jYW5jZWwgYnV0dG9uIGNsaWNrXHJcbiAgb25SZW1vdmUoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy50b1VwbG9hZEZpbGVEYXRhID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQnV0dG9uQ29sdW1uQ2xpY2tlZChldmVudDogQnV0dG9uQ2xpY2tSZXN1bHQpOiB2b2lkIHtcclxuICAgIHN3aXRjaCAoZXZlbnQuZmllbGQpIHtcclxuICAgICAgY2FzZSAnc2VuZCc6IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnc2VuZCcpO1xyXG4gICAgICAgIHRoaXMuX3NlbmRSZXBvcnQoZXZlbnQua2V5KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdlZGl0Jzoge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdlZGl0Jyk7XHJcbiAgICAgICAgdGhpcy5fZWRpdFJlcG9ydChldmVudC5rZXkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ3ZpZXcnOiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3ZpZXcnKTtcclxuICAgICAgICB0aGlzLl92aWV3RGFzaGJvYXJkdChldmVudC5rZXkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ2RlbGV0ZSc6IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnZGVsZXRlJyk7XHJcbiAgICAgICAgdGhpcy5fZGVsZXRlUmVwb3J0KGV2ZW50LmtleSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAncHJpbnQnOiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3ByaW50Jyk7XHJcbiAgICAgICAgdGhpcy5fdmlld1JlcG9ydChldmVudC5rZXkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ2V4cG9ydCc6IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnZXhwb3J0Jyk7XHJcbiAgICAgICAgdGhpcy5fZXhwb3J0UmVwb3J0KGV2ZW50LmtleSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnZGVmYXVsdCc6IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnZGVmYXVsdCcpO1xyXG4gICAgICAgIHRoaXMuX3NldERlZmF1bHRSZXBvcnQoZXZlbnQua2V5KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdpbXBvcnQnOiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2ltcG9ydCcpO1xyXG4gICAgICAgIHRoaXMuX2ltcG9ydFRvUmVwb3J0KGV2ZW50LmtleSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnQWRkX0Zyb21fQnVpbHRJbl9UZW1wbGF0ZXMnOiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0FkZF9Gcm9tX0J1aWx0SW5fVGVtcGxhdGVzJyk7XHJcbiAgICAgICAgdGhpcy5fYWRkRnJvbUJ1aWx0SW5UZW1wbGF0ZXMoZXZlbnQua2V5KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdBZGRfVG9fQnVpbHRJbl9UZW1wbGF0ZXMnOiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0FkZF9Ub19CdWlsdEluX1RlbXBsYXRlcycpO1xyXG4gICAgICAgIHRoaXMuX2FkZFRvQnVpbHRJblRlbXBsYXRlcyhldmVudC5rZXkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ3ByZXZpZXcnOiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3ByZXZpZXcnKTtcclxuICAgICAgICB0aGlzLnByZXZpZXdCdWlsdEluUmVwb3J0VGVtcGxhdGUoZXZlbnQua2V5KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdNYWtlX2RlZmF1bHRfcmVwb3J0X2xheW91dCc6IHtcclxuICAgICAgICB0aGlzLm1ha2VSZXBvcnREZWZhdWx0TGF5b3V0KGV2ZW50LmtleSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnZGVsZXRlRGVmYXVsdFJlcG9ydEZpbGUnOiB7XHJcbiAgICAgICAgdGhpcy5kZWxldGVEZWZhdWx0UmVwb3J0RmlsZShldmVudC5rZXkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkZWxldGVEZWZhdWx0UmVwb3J0RmlsZShmaWxlTmFtZTogYW55KSB7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybShcclxuICAgICAgTG9jYWxpemF0aW9uS2V5cy5jb25maXJtRGVsZXRlLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIChyZXN1bHQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGlzLmlzbG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICBsZXQgZm9ybU5hbWUgPSB0aGlzLm90aGVyRm9ybU5hbWUgPz8gdGhpcy5FRElUSU9OX1BFUlNPTk5BTElTRTtcclxuICAgICAgICAgIHRoaXMucmVwb3J0aW5nU2VydmljZVxyXG4gICAgICAgICAgICAuZGVsZXRlRGVmYXVsdFJlcG9ydFRlbXBsYXRlRmlsZShmb3JtTmFtZSwgZmlsZU5hbWUpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG5leHQ6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlZnJlc2hSZXBvcnRzKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXHJcbiAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbktleXMuZGVsZXRlZFN1Y2Nlc3NmdWxseVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKHRoaXMuZXJyb3JNZXNzYWdlS2V5KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25EZWxldGVTZWxlY3RlZFJlcG9ydHMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybShcclxuICAgICAgTG9jYWxpemF0aW9uS2V5cy5jb25maXJtRGVsZXRlLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIChyZXN1bHQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICByZXN1bHQgJiZcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSZXBvcnRzICE9IG51bGwgJiZcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSZXBvcnRzICE9IHVuZGVmaW5lZFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5pc2xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRpbmdTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5kZWxldGVNdWx0aXBsZVJlcG9ydHModGhpcy5zZWxlY3RlZFJlcG9ydHMpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG5leHQ6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlZnJlc2hSZXBvcnRzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc3VjY2VzcyhcclxuICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uS2V5cy5kZWxldGVkU3VjY2Vzc2Z1bGx5XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc2xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKHRoaXMuZXJyb3JNZXNzYWdlS2V5KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25OZXdSZXBvcnQoKTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgICh0aGlzLm90aGVyRm9ybUVuZHBvaW50ICYmIHRoaXMub3RoZXJGb3JtTmFtZSkgfHxcclxuICAgICAgdGhpcy5pc0VkaXRpb25QZXJzb25uYWxpc2VcclxuICAgICkge1xyXG4gICAgICBsZXQgcmVwb3J0VG9UZW1wbGF0ZUlkOiBudW1iZXI7XHJcbiAgICAgIGxldCBtb2RhbFNpemUgPSBNb2RhbFNpemVFbnVtLkxhcmdlO1xyXG4gICAgICBsZXQgY29uZmlnOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICAgIHdpZHRoOiBtb2RhbFNpemUud2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBtb2RhbFNpemUuaGVpZ2h0LFxyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIG1vZGU6IE1vZGVzLmNyZWF0ZSxcclxuICAgICAgICAgIGlzRWRpdGlvblBlcnNvbm5hbGlzZTogdGhpcy5pc0VkaXRpb25QZXJzb25uYWxpc2UsXHJcbiAgICAgICAgICBmcm9tRW5kcG9pbnQ6IHRoaXMub3RoZXJGb3JtRW5kcG9pbnQsXHJcbiAgICAgICAgICBidXNpbmVzc0NsYXNzOiB0aGlzLmJ1c2luZXNzQ2xhc3MsXHJcbiAgICAgICAgICBjdXN0b21SZXBvcnRpbmdNb2RlOiB0aGlzLmN1c3RvbVJlcG9ydGluZ01vZGVcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5fZGlhbG9nUmVmID0gdGhpcy5fdHNpTW9kYWxTZXJ2aWNlLm9wZW4oXHJcbiAgICAgICAgQWRkUmVwb3J0UG9wdXBDb21wb25lbnQsXHJcbiAgICAgICAgY29uZmlnXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLl9kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKHZhbDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHZhbCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzUmVwb3J0Rm9yRmljaGUpIHtcclxuICAgICAgICAgIHZhbC5lbmRQb2ludFZhbHVlID0gdmFsPy5lbmRQb2ludFZhbHVlPy5yZXBsYWNlKFxyXG4gICAgICAgICAgICAne2lkfScsXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5SWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB2YWwuZW5kUG9pbnRLZXkgPSB2YWw/LmVuZFBvaW50S2V5Py5yZXBsYWNlKCd7aWR9JywgdGhpcy5lbnRpdHlJZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlcG9ydGluZ1NlcnZpY2VcclxuICAgICAgICAgIC5hZGRSZXBvcnRUb01vZGVsKFxyXG4gICAgICAgICAgICB0aGlzLl9uZXdSZXBvcnRUb1RlbXBsYXRlKFxyXG4gICAgICAgICAgICAgIHZhbC5yZXBvcnRUeXBlLFxyXG4gICAgICAgICAgICAgIHZhbC5yZXBvcnROYW1lLFxyXG4gICAgICAgICAgICAgIHZhbC5lbmRQb2ludFZhbHVlLFxyXG4gICAgICAgICAgICAgIHZhbC5tb2R1bGUsXHJcbiAgICAgICAgICAgICAgdmFsLnRyaU9yZHJlLFxyXG4gICAgICAgICAgICAgIHZhbC5yZXBvcnROYW1lQWJyZWdlLFxyXG4gICAgICAgICAgICAgIHZhbC5kaXNwbGF5XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIClcclxuICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmlzbG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgcmVwb3J0VG9UZW1wbGF0ZUlkID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgbGV0IHVybERlc2lnbmVyO1xyXG4gICAgICAgICAgICAgIGxldCB0ZW5hbnRVaWQgPVxyXG4gICAgICAgICAgICAgICAgdGhpcy5pZGVudGl0eU1hbmFnZXJTZXJ2aWNlLnBhcnNlTXlBdXRoVG9rZW4oKT8udGVuYW50VWlkO1xyXG5cclxuICAgICAgICAgICAgICBpZiAodmFsLnJlcG9ydFR5cGUgPT09IFRzaVJlcG9ydFR5cGUuTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgdXJsRGVzaWduZXIgPSBgJHtTZWdtZW50LnJlcG9ydGluZ1NlcnZpY2VCYXNlfS9yZXBvcnQtZGVzaWduZXIvJHtyZXBvcnRUb1RlbXBsYXRlSWR9PyR7cXVlcnlQYXJhbU5hbWVzQ29uc3QudGVuYW50VWlkfT0ke3RlbmFudFVpZH1gO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsLnJlcG9ydFR5cGUgPT09IFRzaVJlcG9ydFR5cGUuRGFzaGJvYXJkKSB7XHJcbiAgICAgICAgICAgICAgICB1cmxEZXNpZ25lciA9IGAke1NlZ21lbnQuYXBwQmFzZUhyZWZ9LyR7dGhpcy5kYXNoYm9hcmRNb2R1bGVSb3V0ZX0vJHtNYW5hZ2VSZXBvcnRpbmdSb3V0ZXMuZGFzaGJvYXJkRGVzaWduZXJ9PyR7cXVlcnlQYXJhbU5hbWVzQ29uc3QucmVwb3J0VG9UZW1wbGF0ZX09JHtyZXBvcnRUb1RlbXBsYXRlSWR9JiR7cXVlcnlQYXJhbU5hbWVzQ29uc3QudGVuYW50VWlkfT0ke3RlbmFudFVpZH1gO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsLnJlcG9ydFR5cGUgPT09IFRzaVJlcG9ydFR5cGUuUlRGKSB7XHJcbiAgICAgICAgICAgICAgICB1cmxEZXNpZ25lciA9IGAke1NlZ21lbnQucmVwb3J0aW5nU2VydmljZUJhc2V9L21haWxtZXJnZS8ke3JlcG9ydFRvVGVtcGxhdGVJZH0/JHtxdWVyeVBhcmFtTmFtZXNDb25zdC50ZW5hbnRVaWR9PSR7dGVuYW50VWlkfWA7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICB3aW5kb3cub3Blbih1cmxEZXNpZ25lciwgJ19ibGFuaycpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc3VjY2VzcyhcclxuICAgICAgICAgICAgICAgICdzaGFyZWRfcmVwb3J0aW5nX3JlZGlyZWN0ZWRfdG9fbmV3X3JlcG9ydF9zdWNjZXNzZnVsbHknXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB0aGlzLmlzbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKHRoaXMuZXJyb3JNZXNzYWdlS2V5KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9jbG9zZU1vZGFsKHZhbCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xvc2VNb2RhbCh2YWw6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2RpYWxvZ1JlZikge1xyXG4gICAgICB0aGlzLl9kaWFsb2dSZWYuZGVzdHJveSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25Gb3JtQ2hhbmdlKCkge1xyXG4gICAgYXdhaXQgdGhpcy5fcmVmcmVzaFJlcG9ydHMoKTtcclxuICB9XHJcblxyXG4gIG9uSW1wb3J0RmlsZVRvUmVwb3J0TW9kYWxDYW5jZWxDbGljaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2hpZGVJbXBvcnRGaWxlVG9SZXBvcnREaWFsb2coKTtcclxuICB9XHJcblxyXG4gIG9uSW1wb3J0RmlsZVRvUmVwb3J0TW9kYWxTYXZlQ2xpY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zaG93SW1wb3J0RmlsZVRvUmVwb3J0RGlhbG9nKCk7XHJcbiAgfVxyXG4gIC8vI3JlZ2lvbiBmaWxlIGltcG9ydFxyXG4gIG9uSW1wb3J0RmlsZVRvUmVwb3J0X0ZpbGVTZWxlY3RlZChldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWxlOiBGaWxlID0gZXZlbnQuY3VycmVudEZpbGVzWzBdO1xyXG4gICAgdGhpcy50b1VwbG9hZFRvVXBkYXRlUmVwb3J0RmlsZURhdGEgPSBmaWxlO1xyXG4gIH1cclxuXHJcbiAgb25JbXBvcnRGaWxlVG9SZXBvcnRfSW1wb3J0RmlsZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJlcG9ydFRvVXBkYXRlRnJvbUZpbGUpIHtcclxuICAgICAgdGhpcy5yZXBvcnRpbmdTZXJ2aWNlXHJcbiAgICAgICAgLnVwZGF0ZVJlcG9ydExheW91dChcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSZXBvcnRUb1VwZGF0ZUZyb21GaWxlLFxyXG4gICAgICAgICAgdGhpcy50b1VwbG9hZFRvVXBkYXRlUmVwb3J0RmlsZURhdGFcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiBhc3luYyAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVmcmVzaFJlcG9ydHMoKTtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXHJcbiAgICAgICAgICAgICAgJ3NoYXJlZF9yZXBvcnRpbmdfcmVwb3J0X3VwbG9hZGVkX3N1Y2Nlc3NmdWxseSdcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5pbXBvcnRGaWxlVG9SZXBvcnRGaWxlVXBsb2FkPy5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLl9oaWRlSW1wb3J0RmlsZVRvUmVwb3J0RGlhbG9nKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKHRoaXMuZXJyb3JNZXNzYWdlS2V5KTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL2NhbmNlbCBidXR0b24gY2xpY2tcclxuICBvbkltcG9ydEZpbGVUb1JlcG9ydF9DbGVhcihldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnRvVXBsb2FkVG9VcGRhdGVSZXBvcnRGaWxlRGF0YSA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8vY2FuY2VsIGJ1dHRvbiBjbGlja1xyXG4gIG9uSW1wb3J0RmlsZVRvUmVwb3J0X1JlbW92ZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnRvVXBsb2FkVG9VcGRhdGVSZXBvcnRGaWxlRGF0YSA9IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gcHJpdmF0ZSBtZXRob2RzXHJcbiAgcHJpdmF0ZSBnZXRGb3JtTmFtZShmb3JtTmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWc/LmRhdGE/LnJlcG9ydERpc2NyaW1pbmF0b3IpXHJcbiAgICAgIHJldHVybiBgJHtmb3JtTmFtZX1fJHt0aGlzLmNvbmZpZy5kYXRhLnJlcG9ydERpc2NyaW1pbmF0b3J9YDtcclxuICAgIGVsc2UgcmV0dXJuIGZvcm1OYW1lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcmVmcmVzaFJlcG9ydHMocmVmcmVzaFJlcG9ydExpc3Q6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgdGhpcy5pc2xvYWRpbmcgPSB0cnVlO1xyXG4gICAgbGV0IGZvcm1OYW1lID0gdGhpcy5vdGhlckZvcm1OYW1lXHJcbiAgICAgID8gdGhpcy5vdGhlckZvcm1OYW1lXHJcbiAgICAgIDogdGhpcy5FRElUSU9OX1BFUlNPTk5BTElTRTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgaXRlbXMgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlcG9ydGluZ1NlcnZpY2UuZ2V0UmVwb3J0cyhmb3JtTmFtZSwgdGhpcy5yZXBvcnREaXNjcmltaW5hdG9yKSlcclxuICAgICAgdGhpcy5yZXBvcnRzID0gaXRlbXMubWFwKChyKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnIsXHJcbiAgICAgICAgICByZXBvcnRUeXBlTmFtZTpcclxuICAgICAgICAgICAgTWFuYWdlUmVwb3J0aW5nQ29tcG9uZW50LnJlcG9ydFR5cGVMYWJlbHNbci5yZXBvcnRUeXBlXSB8fFxyXG4gICAgICAgICAgICAnVW5rbm93bicsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuaXNsb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcih0aGlzLmVycm9yTWVzc2FnZUtleSk7XHJcbiAgICAgIHRoaXMuaXNsb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlZnJlc2hSZXBvcnRMaXN0KSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy9nZXQgZGVmYXVsdCByZXBvcnQgdGVtcGxhdGVzIGZvciB0aGlzIGZvcm1cclxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5yZXBvcnRpbmdTZXJ2aWNlLmdldERlZmF1bHRSZXBvcnRUZW1wbGF0ZShmb3JtTmFtZSkpXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0UmVwb3J0VGVtcGxhdGVEYXRhID0gcmVzdWx0Py5kYXRhO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgX3ZpZXdSZXBvcnQodWlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIGlmICh0aGlzLm90aGVyRm9ybUVuZHBvaW50ICYmIHVpZCkge1xyXG4gICAgdGhpcy5pc2xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgIGxldCByZXBvcnQgPSB0aGlzLnJlcG9ydHMuZmluZCgocikgPT4gci51aWQgPT09IHVpZCk7XHJcbiAgICBpZiAocmVwb3J0ID09PSB1bmRlZmluZWQgfHwgcmVwb3J0ID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcih0aGlzLmVycm9yTWVzc2FnZUtleSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlcG9ydGluZ1NlcnZpY2VcclxuICAgICAgLmFkZFJlcG9ydFRvUHJpbnQoXHJcbiAgICAgICAgdGhpcy5fbmV3UmVwb3J0VG9QcmludCh1aWQsIHJlcG9ydC5yZXBvcnRUeXBlLCByZXBvcnQ/LnJlc3RFbmRwb2ludClcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgcmVwb3J0VG9UZW1wbGF0ZUlkID0gZGF0YS51aWQ7XHJcbiAgICAgICAgICBsZXQgdXJsRGVzaWduZXI7XHJcbiAgICAgICAgICBsZXQgdGVuYW50VWlkID1cclxuICAgICAgICAgICAgdGhpcy5pZGVudGl0eU1hbmFnZXJTZXJ2aWNlLnBhcnNlTXlBdXRoVG9rZW4oKT8udGVuYW50VWlkO1xyXG4gICAgICAgICAgaWYgKGRhdGEucmVwb3J0VHlwZSA9PT0gVHNpUmVwb3J0VHlwZS5MaXN0KSB7XHJcbiAgICAgICAgICAgIHVybERlc2lnbmVyID0gYCR7U2VnbWVudC5yZXBvcnRpbmdTZXJ2aWNlQmFzZX0vcmVwb3J0LXZpZXdlci8ke3JlcG9ydFRvVGVtcGxhdGVJZH0/JHtxdWVyeVBhcmFtTmFtZXNDb25zdC50ZW5hbnRVaWR9PSR7dGVuYW50VWlkfWA7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEucmVwb3J0VHlwZSA9PT0gVHNpUmVwb3J0VHlwZS5EYXNoYm9hcmQpIHtcclxuICAgICAgICAgICAgdXJsRGVzaWduZXIgPSBgJHtTZWdtZW50LmFwcEJhc2VIcmVmfS8ke3RoaXMuZGFzaGJvYXJkTW9kdWxlUm91dGV9LyR7TWFuYWdlUmVwb3J0aW5nUm91dGVzLmRhc2hib2FyZERlc2lnbmVyfT8ke3F1ZXJ5UGFyYW1OYW1lc0NvbnN0LnJlcG9ydFRvUHJpbnR9PSR7cmVwb3J0VG9UZW1wbGF0ZUlkfSYke3F1ZXJ5UGFyYW1OYW1lc0NvbnN0LnRlbmFudFVpZH09JHt0ZW5hbnRVaWR9YDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB3aW5kb3cub3Blbih1cmxEZXNpZ25lciwgJ19ibGFuaycpO1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXHJcbiAgICAgICAgICAgICdzaGFyZWRfcmVwb3J0aW5nX3JlZGlyZWN0ZWRfdG9fcHJpbnRfcmVwb3J0X3N1Y2Nlc3NmdWxseSdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmlzbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcih0aGlzLmVycm9yTWVzc2FnZUtleSk7XHJcbiAgICAgICAgICB0aGlzLmlzbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICAgIH0pO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgX3NlbmRSZXBvcnQodWlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgLy8gdGhpcy5pc2xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgIC8vZ2V0IGVtYWlsIHBhcmFtZXRlcnNcclxuICAgIC8vIHRoaXMuX3BhcmFtZXRyZXNBcHBsaWNhdGlvblBhaWVTZXJ2aWNlXHJcbiAgICAvLyAgIC5nZXRQYXJhbWV0cmVBcHBsaWNhdGlvblBhaWUoKVxyXG4gICAgLy8gICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAvLyAgICAgdGhpcy5wYXJhbWV0cmUgPSBkYXRhO1xyXG4gICAgLy8gICB9KTtcclxuXHJcbiAgICAvLyBsZXQgcmVwb3J0ID0gdGhpcy5yZXBvcnRzLmZpbmQoKHIpID0+IHIudWlkID09PSB1aWQpO1xyXG4gICAgLy8gaWYgKHJlcG9ydCA9PT0gdW5kZWZpbmVkIHx8IHJlcG9ydCA9PT0gbnVsbCkge1xyXG4gICAgLy8gICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZXJyb3IodGhpcy5lcnJvck1lc3NhZ2VLZXkpO1xyXG4gICAgLy8gICByZXR1cm47XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gdGhpcy5yZXBvcnRpbmdTZXJ2aWNlXHJcbiAgICAvLyAgIC5hZGRSZXBvcnRUb1ByaW50KFxyXG4gICAgLy8gICAgIHRoaXMuX25ld1JlcG9ydFRvUHJpbnQodWlkLCByZXBvcnQucmVwb3J0VHlwZSwgcmVwb3J0Py5yZXN0RW5kcG9pbnQpXHJcbiAgICAvLyAgIClcclxuICAgIC8vICAgLnN1YnNjcmliZSh7XHJcbiAgICAvLyAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgLy8gICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhICE9IHVuZGVmaW5lZCkge1xyXG4gICAgLy8gICAgICAgICB0aGlzLnJlcG9ydFRvUHJpbnRJZCA9IGRhdGEudWlkO1xyXG5cclxuICAgIC8vICAgICAgICAgbGV0IG1vZGFsU2l6ZSA9IE1vZGFsU2l6ZUVudW0uRXh0cmFMYXJnZTtcclxuICAgIC8vICAgICAgICAgbGV0IHNhdmVTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG4gICAgLy8gICAgICAgICBsZXQgY29uZjogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgIC8vICAgICAgICAgICBkYXRhOiB7IHNhdmVTdWJqZWN0IH0sXHJcbiAgICAvLyAgICAgICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAvLyAgICAgICAgICAgd2lkdGg6IG1vZGFsU2l6ZS53aWR0aCxcclxuICAgIC8vICAgICAgICAgICBoZWlnaHQ6IG1vZGFsU2l6ZS5oZWlnaHQsXHJcbiAgICAvLyAgICAgICAgIH07XHJcbiAgICAvLyAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZ1NlcnZpY2Uub3BlbihcclxuICAgIC8vICAgICAgICAgICBUc2lTZW5kTWFpbENvbXBvbmVudCxcclxuICAgIC8vICAgICAgICAgICBjb25mXHJcbiAgICAvLyAgICAgICAgICk7XHJcbiAgICAvLyAgICAgICAgIHNhdmVTdWJqZWN0LnN1YnNjcmliZSgodmFsOiBhbnkpID0+IHtcclxuICAgIC8vICAgICAgICAgICB0aGlzLnJlcG9ydGluZ1NlcnZpY2VcclxuICAgIC8vICAgICAgICAgICAgIC5leHBvcnRSZXBvcnRGaWxlVG9QZGYodGhpcy5yZXBvcnRUb1ByaW50SWQhLnRvU3RyaW5nKCkpXHJcbiAgICAvLyAgICAgICAgICAgICAuc3Vic2NyaWJlKFxyXG4gICAgLy8gICAgICAgICAgICAgICAoYmxvYikgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYXJhbWV0cmUuYXR0YWNobWVudHMpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldHJlLmF0dGFjaG1lbnRzID0gW107XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IG5ld0ZpbGUgPSBuZXcgRmlsZShbYmxvYl0sICdSZXBvcnQucGRmJywge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgdHlwZTogYmxvYi50eXBlLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLnBhcmFtZXRyZS5hdHRhY2htZW50cy5wdXNoKG5ld0ZpbGUpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMuX3BhcmFtZXRyZXNBcHBsaWNhdGlvblBhaWVTZXJ2aWNlXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAuc2VuZE1haWwoXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldHJlLmZyb21BZGRyZXNzLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaWFsb2dEYXRhU2VydmljZS5nZXREYXRhKCk/LnRvQWRkcmVzcyxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlhbG9nRGF0YVNlcnZpY2UuZ2V0RGF0YSgpPy5vYmpldCxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlhbG9nRGF0YVNlcnZpY2UuZ2V0RGF0YSgpPy5tZXNzYWdlLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmFtZXRyZS5hdHRhY2htZW50cyxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0cmUuaG9zdCxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0cmUuY3JlZGVudGlhbFVzZXIsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldHJlLmNyZWRlbnRpYWxQV0QsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldHJlLnBvcnQsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldHJlLmZyb21OYW1lLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaWFsb2dEYXRhU2VydmljZS5nZXREYXRhKCk/LmNjQWRkcmVzc1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgKVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuaW5mbyhcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxpemF0aW9uLnRyYW5zZm9ybShcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uS2V5cy5zYXZlZFN1Y2Nlc3NmdWxseVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc2xvYWRpbmcgPSBmYWxzZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChyZXNwb25zZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLnNob3dFcnJvck1lc3NhZ2UoXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICAgICAgICAgfSxcclxuICAgIC8vICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZG93bmxvYWRpbmcgdGhlIFBERicsIGVycm9yKTtcclxuICAgIC8vICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgKTtcclxuICAgIC8vICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc3VjY2VzcyhcclxuICAgIC8vICAgICAgICAgICAgICdzaGFyZWRfcmVwb3J0aW5nX3JlZGlyZWN0ZWRfdG9fcHJpbnRfcmVwb3J0X3N1Y2Nlc3NmdWxseSdcclxuICAgIC8vICAgICAgICAgICApO1xyXG4gICAgLy8gICAgICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5vbkNsb3NlLnN1YnNjcmliZSgodmFsPzogYW55KSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgdGhpcy5fY2xvc2VNb2RhbCh2YWwpO1xyXG4gICAgLy8gICAgICAgICB9KTtcclxuICAgIC8vICAgICAgIH1cclxuICAgIC8vICAgICB9LFxyXG5cclxuICAgIC8vICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAvLyAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZXJyb3IodGhpcy5lcnJvck1lc3NhZ2VLZXkpO1xyXG4gICAgLy8gICAgICAgdGhpcy5pc2xvYWRpbmcgPSBmYWxzZTtcclxuICAgIC8vICAgICB9LFxyXG5cclxuICAgIC8vICAgICBjb21wbGV0ZTogKCkgPT4geyB9LFxyXG4gICAgLy8gICB9KTtcclxuICB9XHJcblxyXG5cclxuICBfZWRpdFJlcG9ydCh1aWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5pc2xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgIGxldCByZXBvcnQgPSB0aGlzLnJlcG9ydHMuZmluZCgocikgPT4gci51aWQgPT09IHVpZCk7XHJcblxyXG4gICAgaWYgKHJlcG9ydCA9PT0gdW5kZWZpbmVkIHx8IHJlcG9ydCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZXJyb3IodGhpcy5lcnJvck1lc3NhZ2VLZXkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlcG9ydGluZ1NlcnZpY2VcclxuICAgICAgLmFkZFJlcG9ydFRvRWRpdFRlbXBsYXRlKFxyXG4gICAgICAgIHRoaXMuX25ld1JlcG9ydFRvRWRpdFRlbXBsYXRlKFxyXG4gICAgICAgICAgdWlkLFxyXG4gICAgICAgICAgcmVwb3J0LnJlcG9ydFR5cGUsXHJcbiAgICAgICAgICByZXBvcnQ/LnJlc3RFbmRwb2ludCxcclxuICAgICAgICAgIHJlcG9ydD8ubW9kdWxlLFxyXG4gICAgICAgICAgcmVwb3J0Py5vcmRlcixcclxuICAgICAgICAgIHJlcG9ydD8ucmVwb3J0TmFtZSxcclxuICAgICAgICAgIHJlcG9ydD8uc2hvcnROYW1lLFxyXG4gICAgICAgICAgcmVwb3J0Py5kaXNwbGF5XHJcbiAgICAgICAgKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6ICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNSZXBvcnRGb3JGaWNoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBndWlkUmVnZXggPSAvWzAtOWEtZkEtRi1dezM2fS87XHJcbiAgICAgICAgICAgIHZhbHVlLnJlc3RFbmRwb2ludCA9IHZhbHVlPy5yZXN0RW5kcG9pbnQ/LnJlcGxhY2UoXHJcbiAgICAgICAgICAgICAgZ3VpZFJlZ2V4LFxyXG4gICAgICAgICAgICAgICd7aWR9J1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBjb25maWc6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICB3aWR0aDogTW9kYWxTaXplRW51bS5MYXJnZS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLkxhcmdlLmhlaWdodCxcclxuICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcclxuICAgICAgICAgICAgICBtb2RlOiBNb2Rlcy5lZGl0LFxyXG4gICAgICAgICAgICAgIGlzRWRpdGlvblBlcnNvbm5hbGlzZTogdGhpcy5pc0VkaXRpb25QZXJzb25uYWxpc2UsXHJcbiAgICAgICAgICAgICAgZnJvbUVuZHBvaW50OiB0aGlzLm90aGVyRm9ybUVuZHBvaW50XHJcbiAgICAgICAgICAgICAgICA/IHRoaXMub3RoZXJGb3JtRW5kcG9pbnRcclxuICAgICAgICAgICAgICAgIDogcmVwb3J0Py5yZXN0RW5kcG9pbnQsXHJcbiAgICAgICAgICAgICAgYnVzaW5lc3NDbGFzczogdGhpcy5idXNpbmVzc0NsYXNzLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZiA9IHRoaXMuX3RzaU1vZGFsU2VydmljZS5vcGVuKFxyXG4gICAgICAgICAgICBBZGRSZXBvcnRQb3B1cENvbXBvbmVudCxcclxuICAgICAgICAgICAgY29uZmlnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKCh2YWw6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh2YWwpO1xyXG4gICAgICAgICAgICBsZXQgbW9kZWw6IFJlcG9ydFRvRWRpdFRlbXBsYXRlUGF5bG9hZCA9IHtcclxuICAgICAgICAgICAgICByZXBvcnRUZW1wbGF0ZVVpZDogdWlkLFxyXG4gICAgICAgICAgICAgIHJlcG9ydE5hbWU6IHZhbC5yZXBvcnROYW1lLFxyXG4gICAgICAgICAgICAgIHJlc3RFbmRwb2ludDogdGhpcy5pc1JlcG9ydEZvckZpY2hlXHJcbiAgICAgICAgICAgICAgICA/IHRoaXMucmVwb3J0aW5nU2VydmljZS5pbnNlcnROZXdVaWRJblJlc3RFbmRQb2ludChcclxuICAgICAgICAgICAgICAgICAgdmFsPy5lbmRQb2ludFZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmlkXHJcbiAgICAgICAgICAgICAgICApID8/IHRoaXMub3RoZXJGb3JtRW5kcG9pbnRcclxuICAgICAgICAgICAgICAgIDogdGhpcy5vdGhlckZvcm1FbmRwb2ludCxcclxuICAgICAgICAgICAgICBtb2R1bGU6IHZhbC5tb2R1bGUsXHJcbiAgICAgICAgICAgICAgb3JkZXI6IHZhbC50cmlPcmRyZSxcclxuICAgICAgICAgICAgICBzaG9ydE5hbWU6IHZhbC5yZXBvcnROYW1lQWJyZWdlLFxyXG4gICAgICAgICAgICAgIGRpc3BsYXk6IHZhbC5kaXNwbGF5LFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXBvcnRpbmdTZXJ2aWNlLmVkaXRSZXBvcnRUb0VkaXRUZW1wbGF0ZShtb2RlbCkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVwb3J0VG9UZW1wbGF0ZUlkID0gdmFsdWUudWlkO1xyXG4gICAgICAgICAgICBsZXQgdXJsRGVzaWduZXI7XHJcbiAgICAgICAgICAgIGxldCB0ZW5hbnRVaWQgPVxyXG4gICAgICAgICAgICAgIHRoaXMuaWRlbnRpdHlNYW5hZ2VyU2VydmljZS5wYXJzZU15QXV0aFRva2VuKCk/LnRlbmFudFVpZDtcclxuXHJcbiAgICAgICAgICAgIGxldCBjYW5yZWRpcmVjdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYW5SZWRpcmVjdCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHZhbHVlLnJlcG9ydFR5cGUgPT09IFRzaVJlcG9ydFR5cGUuTGlzdCkge1xyXG4gICAgICAgICAgICAgIHVybERlc2lnbmVyID0gYCR7U2VnbWVudC5yZXBvcnRpbmdTZXJ2aWNlQmFzZX0vcmVwb3J0LWRlc2lnbmVyLWVkaXQvJHtyZXBvcnRUb1RlbXBsYXRlSWR9PyR7cXVlcnlQYXJhbU5hbWVzQ29uc3QudGVuYW50VWlkfT0ke3RlbmFudFVpZH1gO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnJlcG9ydFR5cGUgPT09IFRzaVJlcG9ydFR5cGUuRGFzaGJvYXJkKSB7XHJcbiAgICAgICAgICAgICAgdXJsRGVzaWduZXIgPSBgJHtTZWdtZW50LmFwcEJhc2VIcmVmfS8ke3RoaXMuZGFzaGJvYXJkTW9kdWxlUm91dGV9LyR7TWFuYWdlUmVwb3J0aW5nUm91dGVzLmRhc2hib2FyZERlc2lnbmVyfT8ke3F1ZXJ5UGFyYW1OYW1lc0NvbnN0LnJlcG9ydFRvRWRpdH09JHtyZXBvcnRUb1RlbXBsYXRlSWR9JiR7cXVlcnlQYXJhbU5hbWVzQ29uc3QudGVuYW50VWlkfT0ke3RlbmFudFVpZH1gO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnJlcG9ydFR5cGUgPT09IFRzaVJlcG9ydFR5cGUuUlRGKSB7XHJcbiAgICAgICAgICAgICAgdXJsRGVzaWduZXIgPSBgJHtTZWdtZW50LnJlcG9ydGluZ1NlcnZpY2VCYXNlfS9tYWlsbWVyZ2UtZWRpdC8ke3JlcG9ydFRvVGVtcGxhdGVJZH0/JHtxdWVyeVBhcmFtTmFtZXNDb25zdC50ZW5hbnRVaWR9PSR7dGVuYW50VWlkfWA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjYW5yZWRpcmVjdCAmJiBKU09OLnBhcnNlKGNhbnJlZGlyZWN0KSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgd2luZG93Lm9wZW4odXJsRGVzaWduZXIsICdfYmxhbmsnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXHJcbiAgICAgICAgICAgICAgJ3NoYXJlZF9yZXBvcnRpbmdfcmVkaXJlY3RlZF90b19lZGl0X3JlcG9ydF9zdWNjZXNzZnVsbHknXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLmlzbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcih0aGlzLmVycm9yTWVzc2FnZUtleSk7XHJcbiAgICAgICAgICB0aGlzLmlzbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZGVsZXRlUmVwb3J0KHVpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybShcclxuICAgICAgTG9jYWxpemF0aW9uS2V5cy5jb25maXJtRGVsZXRlLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIChyZXN1bHQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0ICYmIHVpZCAhPSBudWxsICYmIHVpZCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRoaXMuaXNsb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMucmVwb3J0aW5nU2VydmljZS5kZWxldGVSZXBvcnQodWlkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXHJcbiAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25LZXlzLmRlbGV0ZWRTdWNjZXNzZnVsbHlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlZnJlc2hSZXBvcnRzKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5pc2xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5pc2xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZXJyb3IodGhpcy5lcnJvck1lc3NhZ2VLZXkpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0RGVmYXVsdFJlcG9ydChpZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybShcclxuICAgICAgJ3NoYXJlZF9yZXBvcnRpbmdfY29uZmlybV9zZXRfZGVmYXVsdF9yZXBvcnRfZmlsZScsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgKHJlc3VsdDogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRoaXMuaXNsb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMucmVwb3J0aW5nU2VydmljZS5zZXREZWZhdWx0UmVwb3J0KGlkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXHJcbiAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25LZXlzLnNhdmVkU3VjY2Vzc2Z1bGx5XHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9yZWZyZXNoUmVwb3J0cygpO1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKHRoaXMuZXJyb3JNZXNzYWdlS2V5KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4cG9ydFJlcG9ydCh1aWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHVpZCkge1xyXG4gICAgICBsZXQgcmVwb3J0TmFtZTogc3RyaW5nID0gJ2ZpbGUtbmFtZS5qc29uJztcclxuICAgICAgbGV0IHJlcG9ydCA9IHRoaXMucmVwb3J0cy5maW5kKChyKSA9PiByLnVpZCA9PSB1aWQpO1xyXG4gICAgICBpZiAocmVwb3J0KSB7XHJcbiAgICAgICAgcmVwb3J0TmFtZSA9IHJlcG9ydC5uYW1lO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNsb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5yZXBvcnRpbmdTZXJ2aWNlLmV4cG9ydFJlcG9ydEZpbGUodWlkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGZpbGUgPSBuZXcgQmxvYihbcmVzcG9uc2VdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcclxuICAgICAgICAgIHZhciBmaWxlVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcclxuICAgICAgICAgIGxldCByZXBvcnRSb3V0ZSA9IGZpbGVVUkw7XHJcbiAgICAgICAgICB2YXIgZG93bmxvYWRMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgZG93bmxvYWRMaW5rLmRvd25sb2FkID0gcmVwb3J0TmFtZTtcclxuICAgICAgICAgIGRvd25sb2FkTGluay5ocmVmID0gcmVwb3J0Um91dGU7XHJcbiAgICAgICAgICBkb3dubG9hZExpbmsuY2xpY2soKTtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zdWNjZXNzKFxyXG4gICAgICAgICAgICAnc2hhcmVkX3JlcG9ydGluZ19yZXBvcnRfZXhwb3J0ZWRfc3VjY2Vzc2Z1bGx5J1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuaXNsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKHRoaXMuZXJyb3JNZXNzYWdlS2V5KTtcclxuICAgICAgICAgIHRoaXMuaXNsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbXBvcnRUb1JlcG9ydChpZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaWQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFJlcG9ydFRvVXBkYXRlRnJvbUZpbGUgPSBpZDtcclxuICAgICAgdGhpcy5fc2hvd0ltcG9ydEZpbGVUb1JlcG9ydERpYWxvZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbmV3SnNvbkRhdGFDb25uZWN0aW9uKCk6IEpzb25EYXRhQ29ubmVjdGlvbiB7XHJcbiAgICBpZiAodGhpcy5vdGhlckZvcm1FbmRwb2ludCAhPSBudWxsICYmIHRoaXMub3RoZXJGb3JtRW5kcG9pbnQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCBuZXdKc29uRGF0YUNvbm5lY3Rpb246IEpzb25EYXRhQ29ubmVjdGlvbiA9IHtcclxuICAgICAgICBuYW1lOiBgJHt0aGlzLm90aGVyRm9ybU5hbWV9LUpzb25EU2AsXHJcbiAgICAgICAgZGlzcGxheU5hbWU6IHVuZGVmaW5lZCxcclxuICAgICAgICB1cmk6IHRoaXMub3RoZXJGb3JtRW5kcG9pbnQsXHJcbiAgICAgICAgaHR0cFJlcXVlc3RDb250ZW50OiB1bmRlZmluZWQsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gbmV3SnNvbkRhdGFDb25uZWN0aW9uO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ3NvbWUgb2YgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgOiB1cmkgaGF2ZSBub3QgYmVlbiBzZXQgIScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbmV3UmVwb3J0VG9QcmludChcclxuICAgIHVpZDogc3RyaW5nLFxyXG4gICAgcmVwb3J0VHlwZTogbnVtYmVyLFxyXG4gICAgcmVzdEVuZHBvaW50Pzogc3RyaW5nLFxyXG4gICAgbW9kdWxlPzogc3RyaW5nLFxyXG4gICAgb3JkZXI/OiBudW1iZXIsXHJcbiAgICBzaG9ydE5hbWU/OiBzdHJpbmcsXHJcbiAgICBkaXNwbGF5PzogYm9vbGVhblxyXG4gICk6IFJlcG9ydFRvUHJpbnQge1xyXG4gICAgbGV0IHRva2VuID0gdGhpcy5pZGVudGl0eU1hbmFnZXJTZXJ2aWNlLmdldEF1dGhUb2tlbigpO1xyXG4gICAgbGV0IHVzZXJuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxyXG4gICAgICB0aGlzLmlkZW50aXR5TWFuYWdlclNlcnZpY2UucGFyc2VNeUF1dGhUb2tlbigpLm5hbWU7XHJcbiAgICBpZiAodXNlcm5hbWUpIHtcclxuICAgICAgaWYgKHVpZCAmJiAvKnRoaXMub3RoZXJGb3JtRW5kcG9pbnQgJiYgdGhpcy5vdGhlckZvcm1OYW1lICYmKi8gdG9rZW4pIHtcclxuICAgICAgICBsZXQgbmV3UmVwb3J0VG9QcmludDogUmVwb3J0VG9QcmludCA9IHtcclxuICAgICAgICAgIHJlcG9ydFRlbXBsYXRlVWlkOiB1aWQsXHJcbiAgICAgICAgICByZXN0RW5kcG9pbnQ6IHRoaXMuaXNSZXBvcnRGb3JGaWNoZVxyXG4gICAgICAgICAgICA/IHRoaXMucmVwb3J0aW5nU2VydmljZS5pbnNlcnROZXdVaWRJblJlc3RFbmRQb2ludChyZXN0RW5kcG9pbnQsIHRoaXMuaWQpID8/XHJcbiAgICAgICAgICAgIHRoaXMub3RoZXJGb3JtRW5kcG9pbnRcclxuICAgICAgICAgICAgOiB0aGlzLm90aGVyRm9ybUVuZHBvaW50LFxyXG4gICAgICAgICAgcmVxdWVzdERhdGE6ICF0aGlzLmN1c3RvbVJlcG9ydGluZ01vZGUgPyB0aGlzLmZvcm1FbmRwb2ludEJvZHkgOiB0aGlzLnJlcXVlc3REYXRhLFxyXG4gICAgICAgICAgZm9ybU5hbWU6IHRoaXMub3RoZXJGb3JtTmFtZSxcclxuICAgICAgICAgIHJlcG9ydFR5cGU6IHJlcG9ydFR5cGUsXHJcbiAgICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsXHJcbiAgICAgICAgICB1c2VyVG9rZW46IHJlcG9ydFR5cGUgPT0gVHNpUmVwb3J0VHlwZS5EYXNoYm9hcmQgPyB1bmRlZmluZWQgOiB0b2tlbixcclxuICAgICAgICAgIGlzUGFnZWQ6IHRoaXMuaXNGb3JtRW5kcG9pbnRQYWdlZCA9PSB0cnVlID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgICAgaHRtbEZpbHRlcnNUZXh0OiB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUsXHJcbiAgICAgICAgICBvcHRpb25hbEVuZHBvaW50c0pzb246IHRoaXMub3B0aW9uYWxFbmRwb2ludHMsXHJcbiAgICAgICAgICBtb2R1bGU6IG1vZHVsZSxcclxuICAgICAgICAgIG9yZGVyOiBvcmRlcixcclxuICAgICAgICAgIHNob3J0TmFtZTogc2hvcnROYW1lLFxyXG4gICAgICAgICAgZGlzcGxheTogZGlzcGxheSxcclxuICAgICAgICAgIGh0dHBNZXRob2RUeXBlOiB0aGlzLmh0dHBNZXRob2RUeXBlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ld1JlcG9ydFRvUHJpbnQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgICAnc29tZSBvZiB0aGUgcmVxdWlyZWQgcHJvcGVydGllcyA6IHVzZXIgdG9rZW4sIGZvcm1OYW1lLCBmb3JtRW5kcG9pbnQgb3Igc2VsZWN0ZWRSZXBvcnQgaGF2ZSBub3QgYmVlbiBzZXQgISdcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBFcnJvcihcInByb3BlcnR5ICdVc2VyTmFtZSAnIG9mIGN1cnJlbnQgdXNlciBoYXZlIG5vdCBiZWVuIHNldCAhXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbmV3UmVwb3J0VG9UZW1wbGF0ZShcclxuICAgIHJlcG9ydFR5cGU6IFRzaVJlcG9ydFR5cGUsXHJcbiAgICByZXBvcnROYW1lOiBzdHJpbmcsXHJcbiAgICByZXN0RW5kcG9pbnQ6IHN0cmluZyxcclxuICAgIG1vZHVsZTogc3RyaW5nLFxyXG4gICAgb3JkZXI6IG51bWJlcixcclxuICAgIHNob3J0TmFtZTogc3RyaW5nLFxyXG4gICAgZGlzcGxheTogYm9vbGVhbixcclxuICApOiBSZXBvcnRUb1RlbXBsYXRlIHtcclxuICAgIGxldCB0b2tlbiA9IHRoaXMuaWRlbnRpdHlNYW5hZ2VyU2VydmljZS5nZXRBdXRoVG9rZW4oKTtcclxuXHJcbiAgICBpZiAodGhpcy5vdGhlckZvcm1FbmRwb2ludCAmJiB0aGlzLm90aGVyRm9ybU5hbWUgJiYgdG9rZW4pIHtcclxuICAgICAgbGV0IHJlcG9ydFRvVGVtcGxhdGU6IFJlcG9ydFRvVGVtcGxhdGUgPSB7XHJcbiAgICAgICAgcmVzdEVuZHBvaW50OiByZXN0RW5kcG9pbnQsXHJcbiAgICAgICAgcmVxdWVzdERhdGE6ICF0aGlzLmN1c3RvbVJlcG9ydGluZ01vZGUgPyB0aGlzLmZvcm1FbmRwb2ludEJvZHkgOiBcclxuICAgICAgICB0aGlzLnJlcXVlc3REYXRhLFxyXG4gICAgICAgIGZvcm1FbnRpdHk6IHRoaXMub3RoZXJGb3JtTmFtZSwgLy90aGlzLmdldEZvcm1OYW1lKHRoaXMub3RoZXJGb3JtTmFtZSksIC8vdGhpcy5vdGhlckZvcm1OYW1lLFxyXG4gICAgICAgIHVzZXJUb2tlbjogcmVwb3J0VHlwZSA9PSBUc2lSZXBvcnRUeXBlLkRhc2hib2FyZCA/IHVuZGVmaW5lZCA6IHRva2VuLFxyXG4gICAgICAgIHJlcG9ydE5hbWU6IHJlcG9ydE5hbWUsXHJcbiAgICAgICAgaXNQYWdlZDogdGhpcy5pc0Zvcm1FbmRwb2ludFBhZ2VkID09IHRydWUgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgcmVwb3J0VHlwZTogcmVwb3J0VHlwZSwgLy90aGlzLmlzRm9ybUVuZHBvaW50UGFnZWQgPT0gdHJ1ZSA/IFRzaVJlcG9ydFR5cGUuTGlzdCA6IFRzaVJlcG9ydFR5cGUuRm9ybSxcclxuICAgICAgICBvcHRpb25hbEVuZHBvaW50c0pzb246IHRoaXMub3B0aW9uYWxFbmRwb2ludHMsXHJcbiAgICAgICAgaHRtbEZpbHRlcnNUZXh0OiB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUsXHJcbiAgICAgICAgbW9kdWxlOiBtb2R1bGUsXHJcbiAgICAgICAgb3JkZXI6IG9yZGVyLFxyXG4gICAgICAgIHNob3J0TmFtZTogc2hvcnROYW1lLFxyXG4gICAgICAgIGRpc3BsYXk6IGRpc3BsYXksXHJcbiAgICAgICAgZGVzY3JpbWluYXRvclZhbHVlOiB0aGlzLnJlcG9ydERpc2NyaW1pbmF0b3IsXHJcbiAgICAgICAgaHR0cE1ldGhvZFR5cGU6IHRoaXMuaHR0cE1ldGhvZFR5cGVcclxuICAgICAgfTtcclxuICAgICAgY29uc29sZS5sb2cocmVwb3J0VG9UZW1wbGF0ZSk7XHJcbiAgICAgIHJldHVybiByZXBvcnRUb1RlbXBsYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHJlcG9ydFRvVGVtcGxhdGU6IFJlcG9ydFRvVGVtcGxhdGUgPSB7XHJcbiAgICAgICAgcmVzdEVuZHBvaW50OiB0aGlzLmlzUmVwb3J0Rm9yRmljaGUgfHwgdGhpcy5jdXN0b21SZXBvcnRpbmdNb2RlXHJcbiAgICAgICAgICA/IHJlc3RFbmRwb2ludCFcclxuICAgICAgICAgIDogdGhpcy5vdGhlckZvcm1FbmRwb2ludCEsXHJcbiAgICAgICAgcmVxdWVzdERhdGE6ICF0aGlzLmN1c3RvbVJlcG9ydGluZ01vZGUgPyBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICBzb3J0aW5nOiBbeyBwcm9wZXJ0eTogJ1VJRCcsIG9yZGVyOiAnQVNDJyB9XSxcclxuICAgICAgICAgIGdldEFsbERhdGE6IHRydWUsXHJcbiAgICAgICAgfSkgOiB0aGlzLnJlcXVlc3REYXRhLFxyXG4gICAgICAgIGZvcm1FbnRpdHk6ICcnLFxyXG4gICAgICAgIHVzZXJUb2tlbjogcmVwb3J0VHlwZSA9PSBUc2lSZXBvcnRUeXBlLkRhc2hib2FyZCA/IHVuZGVmaW5lZCA6IHRva2VuISxcclxuICAgICAgICByZXBvcnROYW1lOiByZXBvcnROYW1lLFxyXG4gICAgICAgIGlzUGFnZWQ6IHRoaXMuaXNGb3JtRW5kcG9pbnRQYWdlZCA9PSB0cnVlID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgIHJlcG9ydFR5cGU6IHJlcG9ydFR5cGUsIC8vdGhpcy5pc0Zvcm1FbmRwb2ludFBhZ2VkID09IHRydWUgPyBUc2lSZXBvcnRUeXBlLkxpc3QgOiBUc2lSZXBvcnRUeXBlLkZvcm0sXHJcbiAgICAgICAgb3B0aW9uYWxFbmRwb2ludHNKc29uOiB0aGlzLm9wdGlvbmFsRW5kcG9pbnRzLFxyXG4gICAgICAgIGh0bWxGaWx0ZXJzVGV4dDogdGhpcy5maWx0ZXJzSHRtbFRlbXBsYXRlLFxyXG4gICAgICAgIG1vZHVsZTogbW9kdWxlLFxyXG4gICAgICAgIG9yZGVyOiBvcmRlcixcclxuICAgICAgICBzaG9ydE5hbWU6IHNob3J0TmFtZSxcclxuICAgICAgICBkaXNwbGF5OiBkaXNwbGF5LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmV0dXJuIHJlcG9ydFRvVGVtcGxhdGU7XHJcbiAgICAgIC8vIHRocm93IEVycm9yKCdzb21lIG9mIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIDogdXNlciB0b2tlbiwgZm9ybU5hbWUgb3IgZm9ybUVuZHBvaW50IGhhdmUgbm90IGJlZW4gc2V0ICEnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX25ld1JlcG9ydFRvRWRpdFRlbXBsYXRlKFxyXG4gICAgdWlkOiBzdHJpbmcsXHJcbiAgICByZXBvcnRUeXBlOiBUc2lSZXBvcnRUeXBlLFxyXG4gICAgcmVzdEVuZFBvaW50Pzogc3RyaW5nLFxyXG4gICAgbW9kdWxlPzogc3RyaW5nLFxyXG4gICAgb3JkZXI/OiBudW1iZXIsXHJcbiAgICByZXBvcnROYW1lPzogc3RyaW5nLFxyXG4gICAgc2hvcnROYW1lPzogc3RyaW5nLFxyXG4gICAgZGlzcGxheT86IGJvb2xlYW5cclxuICApOiBSZXBvcnRUb0VkaXRUZW1wbGF0ZSB7XHJcbiAgICBsZXQgdG9rZW4gPSB0aGlzLmlkZW50aXR5TWFuYWdlclNlcnZpY2UuZ2V0QXV0aFRva2VuKCk7XHJcbiAgICBsZXQgdXNlcm5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9XHJcbiAgICAgIHRoaXMuaWRlbnRpdHlNYW5hZ2VyU2VydmljZS5wYXJzZU15QXV0aFRva2VuKCkubmFtZTtcclxuXHJcbiAgICBpZiAodXNlcm5hbWUpIHtcclxuICAgICAgaWYgKHVpZCAmJiAvKnRoaXMub3RoZXJGb3JtRW5kcG9pbnQgJiYgdGhpcy5vdGhlckZvcm1OYW1lICYmKi8gdG9rZW4pIHtcclxuICAgICAgICBsZXQgcmVwb3J0VG9FZGl0VGVtcGxhdGU6IFJlcG9ydFRvRWRpdFRlbXBsYXRlID0ge1xyXG4gICAgICAgICAgcmVzdEVuZHBvaW50OiB0aGlzLmlzUmVwb3J0Rm9yRmljaGVcclxuICAgICAgICAgICAgPyB0aGlzLnJlcG9ydGluZ1NlcnZpY2UuaW5zZXJ0TmV3VWlkSW5SZXN0RW5kUG9pbnQocmVzdEVuZFBvaW50LCB0aGlzLmlkKSA/P1xyXG4gICAgICAgICAgICB0aGlzLm90aGVyRm9ybUVuZHBvaW50XHJcbiAgICAgICAgICAgIDogdGhpcy5vdGhlckZvcm1FbmRwb2ludCxcclxuICAgICAgICAgIHJlcXVlc3REYXRhOiAhdGhpcy5jdXN0b21SZXBvcnRpbmdNb2RlID8gdGhpcy5mb3JtRW5kcG9pbnRCb2R5IDogdGhpcy5yZXF1ZXN0RGF0YSxcclxuICAgICAgICAgIGZvcm1OYW1lOiB0aGlzLm90aGVyRm9ybU5hbWUsIC8vIHRoaXMuZ2V0Rm9ybU5hbWUodGhpcy5vdGhlckZvcm1OYW1lISksXHJcbiAgICAgICAgICByZXBvcnRUZW1wbGF0ZVVpZDogdWlkLFxyXG4gICAgICAgICAgcmVwb3J0VHlwZTogcmVwb3J0VHlwZSxcclxuICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcclxuICAgICAgICAgIHVzZXJUb2tlbjogcmVwb3J0VHlwZSA9PSBUc2lSZXBvcnRUeXBlLkRhc2hib2FyZCA/IHVuZGVmaW5lZCA6IHRva2VuLFxyXG4gICAgICAgICAgaXNQYWdlZDogdGhpcy5pc0Zvcm1FbmRwb2ludFBhZ2VkID09IHRydWUgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgICBvcHRpb25hbEVuZHBvaW50c0pzb246IHRoaXMub3B0aW9uYWxFbmRwb2ludHMsXHJcbiAgICAgICAgICBodG1sRmlsdGVyc1RleHQ6IHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZSxcclxuICAgICAgICAgIG1vZHVsZTogbW9kdWxlLFxyXG4gICAgICAgICAgb3JkZXI6IG9yZGVyLFxyXG4gICAgICAgICAgcmVwb3J0TmFtZTogcmVwb3J0TmFtZSxcclxuICAgICAgICAgIHNob3J0TmFtZTogc2hvcnROYW1lLFxyXG4gICAgICAgICAgZGlzcGxheTogZGlzcGxheSxcclxuICAgICAgICAgIGh0dHBNZXRob2RUeXBlOiB0aGlzLmh0dHBNZXRob2RUeXBlXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gcmVwb3J0VG9FZGl0VGVtcGxhdGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgICAnc29tZSBvZiB0aGUgcmVxdWlyZWQgcHJvcGVydGllcyA6IHVzZXIgdG9rZW4gb3Igc2VsZWN0ZWRSZXBvcnQgaGF2ZSBub3QgYmVlbiBzZXQgISdcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aHJvdyBFcnJvcihcInByb3BlcnR5ICdVc2VyTmFtZSAnIG9mIGN1cnJlbnQgdXNlciBoYXZlIG5vdCBiZWVuIHNldCAhXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVmcmVzaFJlcG9ydHNKb2IoKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLndhcm4oJ1JlZnJlc2ggUmVwb3J0cyBKb2IgYXQgOiAnLCBuZXcgRGF0ZSgpKTtcclxuICAgIC8vXHJcbiAgICBpZiAodGhpcy5vdGhlckZvcm1OYW1lICE9IG51bGwgJiYgdGhpcy5vdGhlckZvcm1OYW1lICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLnJlcG9ydGluZ1NlcnZpY2UuZ2V0UmVwb3J0cyh0aGlzLm90aGVyRm9ybU5hbWUsIHRoaXMucmVwb3J0RGlzY3JpbWluYXRvcikuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoaXRlbXMpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVwb3J0cyA9IGl0ZW1zO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzRm9ybU5hbWUgIT0gdGhpcy5vdGhlckZvcm1OYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zdWNjZXNzKFxyXG4gICAgICAgICAgICAgIExvY2FsaXphdGlvbktleXMucmV0cmlldmVkU3VjY2Vzc2Z1bGx5XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNGb3JtTmFtZSA9IHRoaXMub3RoZXJGb3JtTmFtZSA/PyAnJztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoSm9iVGltZU91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoUmVwb3J0c0pvYigpO1xyXG4gICAgICAgICAgfSwgMTAwMDApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKHRoaXMuZXJyb3JNZXNzYWdlS2V5KTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaEpvYlRpbWVPdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFJlcG9ydHNKb2IoKTtcclxuICAgICAgICAgIH0sIDEwMDAwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZWZyZXNoSm9iVGltZU91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX3JlZnJlc2hSZXBvcnRzSm9iKCk7XHJcbiAgICAgIH0sIDEwMDAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Nob3dJbXBvcnRGaWxlVG9SZXBvcnREaWFsb2coKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzVXBkYXRlUmVwb3J0RnJvbUZpbGVEaWFsb2dWaXNpYmxlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hpZGVJbXBvcnRGaWxlVG9SZXBvcnREaWFsb2coKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzVXBkYXRlUmVwb3J0RnJvbUZpbGVEaWFsb2dWaXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLnRvVXBsb2FkVG9VcGRhdGVSZXBvcnRGaWxlRGF0YSA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8vIGdldERlZmF1bHRSZXBvcnRUZW1wbGF0ZSgpe1xyXG4gIHByZXZpZXdCdWlsdEluUmVwb3J0VGVtcGxhdGUodGVtcGxhdGVOYW1lOiBzdHJpbmcpIHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IGAke1NlZ21lbnQucmVwb3J0aW5nU2VydmljZUJhc2V9L3JlcG9ydC12aWV3ZXIvJHt0aGlzLm90aGVyRm9ybU5hbWV9LyR7dGVtcGxhdGVOYW1lfWA7XHJcbiAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcclxuICB9XHJcblxyXG4gIC8vYWRkIGEgcmVwb3J0IGZyb20gdGhlIGJ1aWx0LWluIG1vZGVsIHRvIHRoZSB1c2VyIGxpc3RcclxuICBfYWRkRnJvbUJ1aWx0SW5UZW1wbGF0ZXModGVtcGxhdGVOYW1lOiBhbnkpIHtcclxuICAgIGxldCBmb3JtTmFtZSA9IHRoaXMub3RoZXJGb3JtTmFtZSA/PyB0aGlzLkVESVRJT05fUEVSU09OTkFMSVNFO1xyXG4gICAgdGhpcy5yZXBvcnRpbmdTZXJ2aWNlXHJcbiAgICAgIC5hZGRGcm9tQnVpbHRJblRlbXBsYXRlKGZvcm1OYW1lLCB0ZW1wbGF0ZU5hbWUsIHRoaXMucmVwb3J0RGlzY3JpbWluYXRvcilcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogYXN5bmMgKHJlcykgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuaXNTdWNjZXNzID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlZnJlc2hSZXBvcnRzKCk7XHJcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5pbmZvKHJlcy5tc2cpO1xyXG4gICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS53YXJuKFxyXG4gICAgICAgICAgICAgICdzaGFyZWRfcmVwb3J0aW5nX2Nhbm5vdF9hZGRfZnJvbV9idWlsdF9pbl90ZW1wbGF0ZSdcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uud2FybihcclxuICAgICAgICAgICAgJ3NoYXJlZF9yZXBvcnRpbmdfY2Fubm90X2FkZF9mcm9tX2J1aWx0X2luX3RlbXBsYXRlJ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vYWRkIGEgcmVwb3J0IGZyb20gdGhlIHVzZXIgbGlzdCB0byBidWlsdC1pbiBtb2RlbCB0ZW1wbGF0ZVxyXG4gIF9hZGRUb0J1aWx0SW5UZW1wbGF0ZXMocmVwb3J0SWQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5yZXBvcnRpbmdTZXJ2aWNlLmFkZFRvQnVpbHRJblRlbXBsYXRlKHJlcG9ydElkKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiBhc3luYyAocmVzKSA9PiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVmcmVzaFJlcG9ydHModHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmluZm8oTG9jYWxpemF0aW9uS2V5cy5zYXZlZFN1Y2Nlc3NmdWxseSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLndhcm4oXHJcbiAgICAgICAgICAnc2hhcmVkX3JlcG9ydGluZ19hZGRfdG9fYnVpbHRpbl90ZW1wbGF0ZV9yZXBvcnRfZmFpbGVkJ1xyXG4gICAgICAgICk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBtYWtlIHJlcG9ydCBsYXlvdXQgYXMgZGVmYXVsdCBmb3IgYWxsIHJlcG9ydHNcclxuICBtYWtlUmVwb3J0RGVmYXVsdExheW91dChyZXBvcnRVaWQ6IHN0cmluZykge1xyXG4gICAgbGV0IHJlcXVlc3QgPSB7XHJcbiAgICAgIHJlcG9ydFRlbXBsYXRlVWlkOiByZXBvcnRVaWQsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZXBvcnRpbmdTZXJ2aWNlLm1ha2VSZXBvcnRMYXlvdXRBc0RlZmF1bHRMYXlvdXQocmVxdWVzdCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc3VjY2Vzcygnc2hhcmVkX3JlcG9ydGluZ19zdWNjZXNzX3VwZGF0ZWQnKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uud2Fybignc2hhcmVkX3JlcG9ydGluZ19lcnJvcl9vY2N1cmVkJyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8jZW5kIHJlZ2lvblxyXG5cclxuICBfdmlld0Rhc2hib2FyZHQodWlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNsb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgcmVwb3J0ID0gdGhpcy5yZXBvcnRzLmZpbmQoKHIpID0+IHIudWlkID09PSB1aWQpO1xyXG4gICAgaWYgKCFyZXBvcnQpIHtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKHRoaXMuZXJyb3JNZXNzYWdlS2V5KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXBvcnRUZW1wbGF0ZUlkID0gcmVwb3J0LnVpZDtcclxuICAgIGxldCB0ZW5hbnRVaWQgPSB0aGlzLmlkZW50aXR5TWFuYWdlclNlcnZpY2UucGFyc2VNeUF1dGhUb2tlbigpPy50ZW5hbnRVaWQ7XHJcblxyXG4gICAgbGV0IHVybFZpZXdlciA9IGAke1NlZ21lbnQuYXBwQmFzZUhyZWZ9LyR7dGhpcy5kYXNoYm9hcmRNb2R1bGVSb3V0ZX0vJHtNYW5hZ2VSZXBvcnRpbmdSb3V0ZXMuZGFzaGJvYXJkVmlld2VyfT8ke3F1ZXJ5UGFyYW1OYW1lc0NvbnN0LnJlcG9ydFRlbXBsYXRlfT0ke3JlcG9ydFRlbXBsYXRlSWR9JiR7cXVlcnlQYXJhbU5hbWVzQ29uc3QudGVuYW50VWlkfT0ke3RlbmFudFVpZH1gO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCc+Pj4gX3ZpZXdEYXNoYm9hcmR0IH4gdXJsVmlld2VyOicsIHVybFZpZXdlcik7XHJcblxyXG4gICAgd2luZG93Lm9wZW4odXJsVmlld2VyLCAnX2JsYW5rJyk7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc3VjY2VzcyhcclxuICAgICAgJ3NoYXJlZF9yZXBvcnRpbmdfcmVkaXJlY3RlZF90b19wcmludF9yZXBvcnRfc3VjY2Vzc2Z1bGx5J1xyXG4gICAgKTtcclxuICAgIHRoaXMuaXNsb2FkaW5nID0gZmFsc2U7XHJcbiAgfVxyXG59XHJcbiIsIlxyXG48ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gIDxkaXYgKmJ1c3k9XCJpc2xvYWRpbmdcIj48L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImdyaWQgY29sLTEwXCI+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJpc0Zyb21Gb3JtOyBlbHNlIG5vdEZyb21Gb3JtXCI+XHJcbiAgICAgICAgPFRzaS1MYWJlbCBjbGFzcz1cImNvbC0yXCIgW2xhYmVsVmFsdWVdPVwiJ3NoYXJlZF9yZXBvcnRpbmdfZm9ybSdcIj5cclxuICAgICAgICA8L1RzaS1MYWJlbD5cclxuICAgICAgICA8cC1kcm9wZG93biBjbGFzcz1cImNvbC0xMCB0c2ktY29tcG9uZW50XCIgY2xhc3M9XCJ0c2ktY29tcG9uZW50XCIgc3R5bGVDbGFzcz1cInRzaS1jb21wb25lbnRcIiBhcHBlbmRUcD1cImJvZHlcIlxyXG4gICAgICAgICAgW29wdGlvbnNdPVwiZm9ybU5hbWVzXCIgW25nTW9kZWxdPVwib3RoZXJGb3JtTmFtZVwiIG9wdGlvbkxhYmVsPVwidmFsdWVcIiBvcHRpb25WYWx1ZT1cImtleVwiIFtmaWx0ZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICBmaWx0ZXJCeT1cInZhbHVlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgcGxhY2Vob2xkZXI9XCJ7eydzaGFyZWRfcmVwb3J0aW5nX3NlbGVjdF9mb3JtJyB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIj5cclxuICAgICAgICA8L3AtZHJvcGRvd24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICNub3RGcm9tRm9ybT5cclxuICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPFRzaS1MYWJlbCBjbGFzcz1cImNvbC0yXCIgW2xhYmVsVmFsdWVdPVwiJ3NoYXJlZF9yZXBvcnRpbmdfZm9ybSdcIj5cclxuICAgICAgICAgIDwvVHNpLUxhYmVsPlxyXG4gICAgICAgICAgPFRzaS1TZWFyY2gtQ29tYm8gY2xhc3M9XCJjb2wtMTBcIiBbKGJpbmQpXT1cIm90aGVyRm9ybU5hbWVcIiAoYmluZENoYW5nZSk9XCJvbkZvcm1DaGFuZ2UoKVwiXHJcbiAgICAgICAgICAgIFtsaXN0U291cmNlVXJsXT1cImdldEZvcm1OYW1lc0VuZHBvaW50XCIgW2VsZW1lbnRTb3VyY2VVcmxdPVwiZ2V0Rm9ybU5hbWVzRW5kcG9pbnQgXCIgW2lzRmlsdGVyZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIGlkLWZpZWxkPVwia2V5XCIgbGFiZWwtZmllbGQ9XCJ2YWx1ZVwiPlxyXG4gICAgICAgICAgPC9Uc2ktU2VhcmNoLUNvbWJvPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxwLXRvb2xiYXIgc3R5bGVDbGFzcz1cIm1iLTQgZ2FwLTJcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJsZWZ0XCI+XHJcbiAgICAgIDxUc2ktQnV0dG9uIFt0ZXh0XT1cIidzaGFyZWRfcmVwb3J0aW5nX2FkZF9yZXBvcnQnIHwgbG9jYWxpemVcIiBpY29uPVwicC1idXR0b24taWNvbiBwLWJ1dHRvbi1pY29uLWxlZnQgcGkgcGktcGx1c1wiXHJcbiAgICAgICAgc3R5bGVDbGFzcz1cInAtZWxlbWVudCBwLWJ1dHRvbi1zdWNjZXNzIG1sLTIgbXItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBuZy1zdGFyLWluc2VydGVkIHAtYnV0dG9uLWxhYmVsXCIgKGNsaWNrKT1cIm9uTmV3UmVwb3J0KClcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgIDxUc2ktQnV0dG9uIFtidXR0b25UeXBlXT1cImJ1dHRvblR5cGUuU3VibWl0XCIgW3RleHRdPVwiJ3NoYXJlZF9yZXBvcnRpbmdfZGVsZXRlX3JlcG9ydCcgfCBsb2NhbGl6ZVwiIGljb249XCJwLWJ1dHRvbi1pY29uIHAtYnV0dG9uLWljb24tbGVmdCBwaSBwaS10cmFzaFwiXHJcbiAgICAgICAgc3R5bGVDbGFzcz1cInAtZWxlbWVudCBwLWJ1dHRvbi1kYW5nZXIgcC1idXR0b24gcC1jb21wb25lbnQgbmctc3Rhci1pbnNlcnRlZCBwLWJ1dHRvbi1sYWJlbFwiIChjbGljayk9XCJvbkRlbGV0ZVNlbGVjdGVkUmVwb3J0cygpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkUmVwb3J0cyB8fCAhc2VsZWN0ZWRSZXBvcnRzLmxlbmd0aFwiPjwvVHNpLUJ1dHRvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInJpZ2h0XCI+XHJcbiAgICAgIDxwLWZpbGVVcGxvYWQgI2ZpbGVVcGxvYWQgbmFtZT1cImRlbW9bXVwiIChvbkJlZm9yZVVwbG9hZCk9XCJvbkltcG9ydEZpbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgKG9uU2VsZWN0KT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIiAob25DbGVhcik9XCJvbkNsZWFyKCRldmVudClcIiAob25SZW1vdmUpPVwib25SZW1vdmUoJGV2ZW50KVwiIFttdWx0aXBsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgYWNjZXB0PVwiYXBwbGljYXRpb24vanNvblwiIFttYXhGaWxlU2l6ZV09XCIxMDAwMDAwMFwiIFxyXG4gICAgICAgIFtpbnZhbGlkRmlsZVNpemVNZXNzYWdlU3VtbWFyeV09XCInc2hhcmVkX2ZpbGVfdXBsb2FkX2ludmFsaWRfZmlsZV9zaXplX21lc3NhZ2Vfc3VtbWFyeScgfCBsb2NhbGl6ZVwiXHJcbiAgICAgICAgW2ludmFsaWRGaWxlU2l6ZU1lc3NhZ2VEZXRhaWxdPVwiJ3NoYXJlZF9maWxlX3VwbG9hZF9pbnZhbGlkX2ZpbGVfc2l6ZV9tZXNzYWdlX2RldGFpbCcgfCBsb2NhbGl6ZVwiXHJcbiAgICAgICAgW2ludmFsaWRGaWxlVHlwZU1lc3NhZ2VTdW1tYXJ5XT1cIidzaGFyZWRfZmlsZV91cGxvYWRfaW52YWxpZF9maWxlX3R5cGVfbWVzc2FnZV9zdW1tYXJ5JyB8IGxvY2FsaXplXCJcclxuICAgICAgICBbaW52YWxpZEZpbGVMaW1pdE1lc3NhZ2VEZXRhaWxdPVwiJ3NoYXJlZF9maWxlX3VwbG9hZF9pbnZhbGlkX2ZpbGVfbGltaXRfbWVzc2FnZV9kZXRhaWwnIHwgbG9jYWxpemVcIlxyXG4gICAgICAgIFtpbnZhbGlkRmlsZUxpbWl0TWVzc2FnZVN1bW1hcnldPVwiJ3NoYXJlZF9maWxlX3VwbG9hZF9pbnZhbGlkX2ZpbGVfbGltaXRfbWVzc2FnZV9zdW1tYXJ5JyB8IGxvY2FsaXplXCJcclxuICAgICAgICBbaW52YWxpZEZpbGVUeXBlTWVzc2FnZURldGFpbF09XCInc2hhcmVkX2ZpbGVfdXBsb2FkX2ludmFsaWRfZmlsZV90eXBlX21lc3NhZ2VfZGV0YWlsJyB8IGxvY2FsaXplXCJcclxuICAgICAgICBbY2hvb3NlSWNvbl09XCIncGkgcGktcGFwZXJjbGlwJ1wiIGNhbmNlbFN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnlcIiB1cGxvYWRTdHlsZUNsYXNzPVwicC1idXR0b24taGVscFwiXHJcbiAgICAgICAgcmVtb3ZlU3R5bGVDbGFzcz1cInAtYnV0dG9uLWRhbmdlclwiIFtjaG9vc2VMYWJlbF09XCInc2hhcmVkX3JlcG9ydGluZ19jaG9vc2VfcmVwb3J0X2ZpbGUnIHwgbG9jYWxpemVcIlxyXG4gICAgICAgIFt1cGxvYWRMYWJlbF09XCInc2hhcmVkX3JlcG9ydGluZ19pbXBvcnRfcmVwb3J0JyB8IGxvY2FsaXplXCJcclxuICAgICAgICBbY2FuY2VsTGFiZWxdPVwiJ3NoYXJlZF9yZXBvcnRpbmdfY2FuY2VsX2Nob29zZV9yZXBvcnRfZmlsZScgfCBsb2NhbGl6ZVwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cInRvVXBsb2FkRmlsZURhdGFcIiBwVGVtcGxhdGU9XCJmaWxldXBsb2FkLWNvbnRlbnRcIj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L3AtZmlsZVVwbG9hZD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9wLXRvb2xiYXI+XHJcblxyXG4gIDwhLS0gPFRzaS1EaXNwbGF5LUdyaWQgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiXHJcbiAgICBbaGVhZGVyXT1cIidzaGFyZWRfcmVwb3J0aW5nX215X3RlbXBsYXRlJ1wiXHJcbiAgICBbY29sdW1uc109XCJjb2x1bW5zXCIgW2dyaWREYXRhXT1cInJlcG9ydHNcIiBrZXk9XCJ1aWRcIlxyXG4gICAgKGJ1dHRvbkNvbHVtbkNsaWNrZWQpPVwiaGFuZGxlQnV0dG9uQ29sdW1uQ2xpY2tlZCgkZXZlbnQpXCIgWyhzZWxlY3RlZEl0ZW1zKV09XCJzZWxlY3RlZFJlcG9ydHNcIlxyXG4gICAgW3Nob3dGaWx0ZXJzXT1cImZhbHNlXCJcclxuICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXHJcbiAgICBbZ2xvYmFsRmlsdGVyRmllbGRzXT1cImdsb2JhbEZpbHRlckZpZWxkc1wiPlxyXG4gIDwvVHNpLURpc3BsYXktR3JpZD4gLS0+XHJcblxyXG5cclxuICA8IS0tPGRpdiBzdHlsZT1cInRleHQtYWxpZ246bGVmdFwiPiA8cC1idXR0b24gaWNvbj1cInBpIHBpLXJlZnJlc2hcIiAgW3BUb29sdGlwXT1cIidzaGFyZWRfcmVwb3J0aW5nX3JlZnJlc2gnIHwgbG9jYWxpemVcIiBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiAgbGFiZWw9XCJSZWxvYWRcIiBzZXZlcml0eT1cImhlbHBcIiAoY2xpY2spPVwib25SZWZyZXNoKClcIiAvPiA8L2Rpdj5cclxuICA8cC1idXR0b24gaWNvbj1cInBpIHBpLXJlZnJlc2hcIiBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWRcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tdGV4dFwiIC8+XHJcbi0tPlxyXG4gIFxyXG4gIDxUc2ktQnV0dG9uIHN0eWxlQ2xhc3M9XCJwLWVsZW1lbnQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1yYWlzZWQgcC1idXR0b24tcm91bmRlZCBtYi0zIG1sLTNcIiAgXHJcbiAgICBbdG9vbHRpcFRleHRdPVwiJ3NoYXJlZF9yZXBvcnRpbmdfcmVmcmVzaCdcIiBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIlxyXG4gICAgaWNvbj1cInBpIHBpLXJlZnJlc2hcIiAoY2xpY2spPVwib25SZWZyZXNoKClcIj48L1RzaS1CdXR0b24+XHJcblxyXG4gIDx0c2ktdmlldy1ncmlkIFxyXG4gICAgW2hlYWRlcl09XCInc2hhcmVkX3JlcG9ydGluZ19teV90ZW1wbGF0ZSdcIlxyXG4gICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiIFtncmlkRGF0YV09XCJyZXBvcnRzXCIga2V5PVwidWlkXCJcclxuICAgIChidXR0b25Db2x1bW5DbGlja2VkKT1cImhhbmRsZUJ1dHRvbkNvbHVtbkNsaWNrZWQoJGV2ZW50KVwiIFsoc2VsZWN0ZWRJdGVtcyldPVwic2VsZWN0ZWRSZXBvcnRzXCJcclxuICAgIFtnZXREYXRhRnJvbUFwaV09XCJmYWxzZVwiXHJcbiAgICBbZm9ybU5hbWVdPVwiJ215LXJlcG9ydC10ZW1wbGF0ZXMnXCJcclxuICAgID5cclxuICA8L3RzaS12aWV3LWdyaWQ+XHJcbiAgPGJyLz5cclxuICAgPCEtLSBEZWZhdWx0IFRlbXBsYXRlIC0tPlxyXG4gICA8IS0tIDxUc2ktRGlzcGxheS1HcmlkIFxyXG4gICBbc2hvd0hlYWRlcl09XCJ0cnVlXCIgXHJcbiAgIFtoZWFkZXJdPVwiJ3NoYXJlZF9yZXBvcnRpbmdfQnVpbHRJbl90ZW1wbGF0ZSdcIlxyXG4gICBbc2hvd1N1bW1hcnlGb290ZXJdPVwiZmFsc2VcIiBcclxuICAgW3BhZ2luYXRvcl09XCJmYWxzZVwiIFxyXG4gICBbc2hvd0ZpbHRlcnNdPVwiZmFsc2VcIiBcclxuICAgW2NvbHVtbnNdPVwiZGVmYXVsdFRlbXBsYXRlQ29sdW1uc1wiIFxyXG4gICBbZ3JpZERhdGFdPVwiZGVmYXVsdFJlcG9ydFRlbXBsYXRlRGF0YVwiIFxyXG4gICAoYnV0dG9uQ29sdW1uQ2xpY2tlZCk9XCJoYW5kbGVCdXR0b25Db2x1bW5DbGlja2VkKCRldmVudClcIlxyXG4gICBbcGFnaW5hdG9yXT1cInRydWVcIlxyXG4gICBrZXk9XCJuYW1lXCI+XHJcbiAgPC9Uc2ktRGlzcGxheS1HcmlkPiAtLT5cclxuXHJcbiAgXHJcbiAgPHRzaS12aWV3LWdyaWRcclxuICAgW2hlYWRlcl09XCInc2hhcmVkX3JlcG9ydGluZ19CdWlsdEluX3RlbXBsYXRlJ1wiXHJcbiAgIFtjb2x1bW5zXT1cImRlZmF1bHRUZW1wbGF0ZUNvbHVtbnNcIiBcclxuICAgW2dyaWREYXRhXT1cImRlZmF1bHRSZXBvcnRUZW1wbGF0ZURhdGFcIiBcclxuICAgKGJ1dHRvbkNvbHVtbkNsaWNrZWQpPVwiaGFuZGxlQnV0dG9uQ29sdW1uQ2xpY2tlZCgkZXZlbnQpXCJcclxuICAgW2dldERhdGFGcm9tQXBpXT1cImZhbHNlXCJcclxuICAgW2Zvcm1OYW1lXT1cIidkZWZhdWx0LW15LXJlcG9ydC10ZW1wbGF0ZXMnXCJcclxuICAga2V5PVwibmFtZVwiPlxyXG4gIDwvdHNpLXZpZXctZ3JpZD5cclxuXHJcblxyXG5cclxuXHJcbiAgXHJcblxyXG4gIDwhLS0gZGlhbG9nIHRvIGltcG9ydCBmaWxlIHRvIHJlcG9ydCAtLT5cclxuICA8cC1kaWFsb2cgaGVhZGVyPVwie3snc2hhcmVkX3JlcG9ydGluZ19zZWxlY3RfZmlsZV90b19pbXBvcnRfaW50b19yZXBvcnQnIHwgbG9jYWxpemV9fVwiIFsodmlzaWJsZSldPVwiaXNVcGRhdGVSZXBvcnRGcm9tRmlsZURpYWxvZ1Zpc2libGVcIiBbc3R5bGVdPVwie3dpZHRoOiAnNTB2dyd9XCI+XHJcbiAgICA8IS0tIDxUc2ktTW9kYWwtSGVhZGVyIChvbkNsb3NlQ2xpY2spPVwib25JbXBvcnRGaWxlVG9SZXBvcnRNb2RhbENhbmNlbENsaWNrKClcIiBbaW5wdXRUaXRsZV09XCInc2hhcmVkX3JlcG9ydGluZ19zZWxlY3RfZmlsZV90b19pbXBvcnRfaW50b19yZXBvcnQnXCI+PC9Uc2ktTW9kYWwtSGVhZGVyPiAtLT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiPlxyXG4gICAgICA8cC1maWxlVXBsb2FkICNpbXBvcnRGaWxlVG9SZXBvcnRGaWxlVXBsb2FkIG5hbWU9XCJpbXBvcnRGaWxlVG9SZXBvcnRcIiAob25CZWZvcmVVcGxvYWQpPVwib25JbXBvcnRGaWxlVG9SZXBvcnRfSW1wb3J0RmlsZSgkZXZlbnQpXCJcclxuICAgICAgICAob25TZWxlY3QpPVwib25JbXBvcnRGaWxlVG9SZXBvcnRfRmlsZVNlbGVjdGVkKCRldmVudClcIiAob25DbGVhcik9XCJvbkltcG9ydEZpbGVUb1JlcG9ydF9DbGVhcigkZXZlbnQpXCIgKG9uUmVtb3ZlKT1cIm9uSW1wb3J0RmlsZVRvUmVwb3J0X1JlbW92ZSgkZXZlbnQpXCIgW211bHRpcGxlXT1cImZhbHNlXCJcclxuICAgICAgICBhY2NlcHQ9XCJhcHBsaWNhdGlvbi9qc29uXCIgW21heEZpbGVTaXplXT1cIjEwMDAwMDAwXCJcclxuICAgICAgICBbaW52YWxpZEZpbGVTaXplTWVzc2FnZVN1bW1hcnldPVwiJ3NoYXJlZF9maWxlX3VwbG9hZF9pbnZhbGlkX2ZpbGVfc2l6ZV9tZXNzYWdlX3N1bW1hcnknIHwgbG9jYWxpemVcIlxyXG4gICAgICAgIFtpbnZhbGlkRmlsZVNpemVNZXNzYWdlRGV0YWlsXT1cIidzaGFyZWRfZmlsZV91cGxvYWRfaW52YWxpZF9maWxlX3NpemVfbWVzc2FnZV9kZXRhaWwnIHwgbG9jYWxpemVcIlxyXG4gICAgICAgIFtpbnZhbGlkRmlsZVR5cGVNZXNzYWdlU3VtbWFyeV09XCInc2hhcmVkX2ZpbGVfdXBsb2FkX2ludmFsaWRfZmlsZV90eXBlX21lc3NhZ2Vfc3VtbWFyeScgfCBsb2NhbGl6ZVwiXHJcbiAgICAgICAgW2ludmFsaWRGaWxlTGltaXRNZXNzYWdlRGV0YWlsXT1cIidzaGFyZWRfZmlsZV91cGxvYWRfaW52YWxpZF9maWxlX2xpbWl0X21lc3NhZ2VfZGV0YWlsJyB8IGxvY2FsaXplXCJcclxuICAgICAgICBbaW52YWxpZEZpbGVMaW1pdE1lc3NhZ2VTdW1tYXJ5XT1cIidzaGFyZWRfZmlsZV91cGxvYWRfaW52YWxpZF9maWxlX2xpbWl0X21lc3NhZ2Vfc3VtbWFyeScgfCBsb2NhbGl6ZVwiXHJcbiAgICAgICAgW2ludmFsaWRGaWxlVHlwZU1lc3NhZ2VEZXRhaWxdPVwiJ3NoYXJlZF9maWxlX3VwbG9hZF9pbnZhbGlkX2ZpbGVfdHlwZV9tZXNzYWdlX2RldGFpbCcgfCBsb2NhbGl6ZVwiXHJcbiAgICAgICAgW2Nob29zZUljb25dPVwiJ3BpIHBpLXBhcGVyY2xpcCdcIiBjYW5jZWxTdHlsZUNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5XCIgdXBsb2FkU3R5bGVDbGFzcz1cInAtYnV0dG9uLWhlbHBcIlxyXG4gICAgICAgIHJlbW92ZVN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXJcIiBbY2hvb3NlTGFiZWxdPVwiJ3NoYXJlZF9yZXBvcnRpbmdfY2hvb3NlX3JlcG9ydF9maWxlJyB8IGxvY2FsaXplXCJcclxuICAgICAgICBbdXBsb2FkTGFiZWxdPVwiJ3NoYXJlZF9yZXBvcnRpbmdfaW1wb3J0X3JlcG9ydCcgfCBsb2NhbGl6ZVwiXHJcbiAgICAgICAgW2NhbmNlbExhYmVsXT1cIidzaGFyZWRfcmVwb3J0aW5nX2NhbmNlbF9jaG9vc2VfcmVwb3J0X2ZpbGUnIHwgbG9jYWxpemVcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJ0b1VwbG9hZFRvVXBkYXRlUmVwb3J0RmlsZURhdGFcIiBwVGVtcGxhdGU9XCJmaWxldXBsb2FkLWNvbnRlbnRcIj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L3AtZmlsZVVwbG9hZD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPCEtLSA8VHNpLU1vZGFsLUZvb3RlciAob25DYW5jZWxDbGljayk9XCJvbkltcG9ydEZpbGVUb1JlcG9ydE1vZGFsQ2FuY2VsQ2xpY2soKVwiXHJcbiAgICAob25TYXZlQ2xpY2spPVwib25JbXBvcnRGaWxlVG9SZXBvcnRNb2RhbFNhdmVDbGljaygpXCJcclxuICAgIFtzYXZlRGlzYWJsZWRdPVwiIXRvVXBsb2FkVG9VcGRhdGVSZXBvcnRGaWxlRGF0YVwiPjwvVHNpLU1vZGFsLUZvb3Rlcj4gLS0+XHJcblxyXG48L3AtZGlhbG9nPlxyXG48L2Rpdj5cclxuIl19
|