@mediusinc/mng-commons 2.6.0 → 3.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -4
- package/dev-scripts/version-info.js +1 -0
- package/esm2022/lib/api/models/filter-param.model.mjs +33 -0
- package/esm2022/lib/api/models/query-param.model.mjs +68 -0
- package/esm2022/lib/api/models/query-result.model.mjs +24 -0
- package/esm2022/lib/api/utils/medius-rest.util.mjs +255 -0
- package/esm2022/lib/api/utils/object-serializer.util.mjs +258 -0
- package/esm2022/lib/components/action/action.component.mjs +304 -0
- package/esm2022/lib/components/action/editor/action-editor.component.mjs +386 -0
- package/esm2022/lib/components/action/localization/data-language-dropdown.component.mjs +54 -0
- package/{esm2020 → esm2022}/lib/components/action/models/action-execution.model.mjs +1 -1
- package/esm2022/lib/components/action/models/tableview-action-default-categories.model.mjs +11 -0
- package/{esm2020 → esm2022}/lib/components/action/route/action-route.component.mjs +4 -4
- package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +300 -0
- package/{esm2020 → esm2022}/lib/components/form/date-range/date-range.component.mjs +5 -5
- package/esm2022/lib/components/form/dropdown/dropdown.component.mjs +212 -0
- package/esm2022/lib/components/form/editor/form-editor.component.mjs +288 -0
- package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-custom/formly-custom-field-base.model.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +7 -7
- package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +4 -4
- package/esm2022/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +19 -0
- package/{esm2020 → esm2022}/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +4 -4
- package/esm2022/lib/components/form/models/form-editor.event.mjs +49 -0
- package/esm2022/lib/components/layout/breadcrumb.component.mjs +34 -0
- package/{esm2020 → esm2022}/lib/components/layout/footer.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/layout/main-layout.component.mjs +4 -4
- package/esm2022/lib/components/layout/menu-item.component.mjs +297 -0
- package/{esm2020 → esm2022}/lib/components/layout/menu.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/layout/services/main-layout.component.service.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/layout/topbar-user.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/layout/topbar.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/layout/version.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/pages/error/error-page.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/pages/not-found/not-found-page.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/tableview/models/table.event.mjs +1 -1
- package/{esm2020 → esm2022}/lib/components/tableview/route/tableview-route.abstract.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/tableview/route/tableview-route.component.mjs +4 -4
- package/esm2022/lib/components/tableview/table/column-filter/column-filter.component.mjs +124 -0
- package/esm2022/lib/components/tableview/table/column-value/column-value.component.mjs +110 -0
- package/esm2022/lib/components/tableview/table/table.component.mjs +747 -0
- package/esm2022/lib/components/tableview/tableview.component.mjs +147 -0
- package/esm2022/lib/descriptors/action/action.descriptor.mjs +634 -0
- package/esm2022/lib/descriptors/editor/editor.descriptor.mjs +304 -0
- package/esm2022/lib/descriptors/table/table.descriptor.mjs +542 -0
- package/esm2022/lib/descriptors/tableview/tableview.descriptor.mjs +352 -0
- package/{esm2020 → esm2022}/lib/descriptors/types/table.type.mjs +1 -5
- package/{esm2020 → esm2022}/lib/directives/component.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/directives/template.directive.mjs +5 -5
- package/esm2022/lib/mng-commons.module.mjs +465 -0
- package/{esm2020 → esm2022}/lib/pipes/boolean.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/pipes/class-map.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/pipes/enum.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/pipes/enumerate-async.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/pipes/enumerate.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/pipes/getter.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/pipes/i18n-property.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/pipes/json-path.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/pipes/locale-default-row-class.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/pipes/parametrize.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/pipes/template.pipe.mjs +4 -4
- package/esm2022/lib/router/route-builder.mjs +308 -0
- package/esm2022/lib/router/routes-builder.mjs +61 -0
- package/esm2022/lib/security/authorization.guard.mjs +15 -0
- package/{esm2020 → esm2022}/lib/security/authorization.service.mjs +4 -4
- package/esm2022/lib/services/action-executor.service.mjs +703 -0
- package/{esm2020 → esm2022}/lib/services/commons.service.mjs +4 -4
- package/esm2022/lib/services/configuration.service.mjs +150 -0
- package/{esm2020 → esm2022}/lib/services/internal/commons-init.service.mjs +4 -4
- package/{esm2020 → esm2022}/lib/services/mng-localstorage-config.service.mjs +4 -4
- package/{esm2020 → esm2022}/lib/services/navigation.service.mjs +4 -4
- package/{esm2020 → esm2022}/lib/services/router.service.mjs +4 -4
- package/{esm2020 → esm2022}/lib/services/version.service.mjs +4 -4
- package/{esm2020 → esm2022}/lib/services/view-container.component.service.mjs +4 -4
- package/esm2022/lib/styles/styles.util.mjs +42 -0
- package/esm2022/lib/types/type.model.mjs +2 -0
- package/esm2022/lib/utils/date.util.mjs +120 -0
- package/esm2022/lib/utils/tableview.util.mjs +193 -0
- package/esm2022/lib/utils/type.util.mjs +94 -0
- package/{fesm2020 → fesm2022}/mediusinc-mng-commons.mjs +930 -908
- package/fesm2022/mediusinc-mng-commons.mjs.map +1 -0
- package/lib/api/utils/medius-rest.util.d.ts +4 -3
- package/lib/components/action/action.component.d.ts +1 -1
- package/lib/components/action/editor/action-editor.component.d.ts +6 -9
- package/lib/components/action/localization/data-language-dropdown.component.d.ts +1 -1
- package/lib/components/form/autocomplete/autocomplete.component.d.ts +4 -4
- package/lib/components/form/date-range/date-range.component.d.ts +1 -1
- package/lib/components/form/dropdown/dropdown.component.d.ts +3 -3
- package/lib/components/form/editor/form-editor.component.d.ts +1 -1
- package/lib/components/form/formly/fields/formly-field-custom/formly-custom-field-base.model.d.ts +1 -1
- package/lib/components/layout/breadcrumb.component.d.ts +5 -0
- package/lib/components/layout/menu-item.component.d.ts +1 -1
- package/lib/components/layout/version.component.d.ts +1 -1
- package/lib/components/tableview/models/table.event.d.ts +2 -2
- package/lib/components/tableview/route/tableview-route.component.d.ts +1 -1
- package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +2 -2
- package/lib/components/tableview/table/column-value/column-value.component.d.ts +1 -1
- package/lib/components/tableview/table/table.component.d.ts +6 -7
- package/lib/components/tableview/tableview.component.d.ts +7 -11
- package/lib/descriptors/editor/editor.descriptor.d.ts +1 -1
- package/lib/descriptors/table/table.descriptor.d.ts +7 -1
- package/lib/descriptors/tableview/tableview.descriptor.d.ts +4 -4
- package/lib/descriptors/types/table.type.d.ts +1 -5
- package/lib/directives/component.directive.d.ts +1 -1
- package/lib/directives/template.directive.d.ts +1 -1
- package/lib/router/route-builder.d.ts +6 -10
- package/lib/router/routes-builder.d.ts +0 -5
- package/lib/security/authorization.guard.d.ts +2 -11
- package/lib/services/action-executor.service.d.ts +1 -15
- package/lib/utils/route.util.d.ts +8 -19
- package/lib/utils/tableview.util.d.ts +5 -0
- package/package.json +12 -19
- package/esm2020/lib/api/models/filter-param.model.mjs +0 -33
- package/esm2020/lib/api/models/query-param.model.mjs +0 -68
- package/esm2020/lib/api/models/query-result.model.mjs +0 -24
- package/esm2020/lib/api/utils/medius-rest.util.mjs +0 -246
- package/esm2020/lib/api/utils/object-serializer.util.mjs +0 -258
- package/esm2020/lib/components/action/action.component.mjs +0 -303
- package/esm2020/lib/components/action/editor/action-editor.component.mjs +0 -390
- package/esm2020/lib/components/action/localization/data-language-dropdown.component.mjs +0 -47
- package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +0 -11
- package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +0 -303
- package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +0 -214
- package/esm2020/lib/components/form/editor/form-editor.component.mjs +0 -288
- package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +0 -19
- package/esm2020/lib/components/form/models/form-editor.event.mjs +0 -49
- package/esm2020/lib/components/layout/breadcrumb.component.mjs +0 -19
- package/esm2020/lib/components/layout/menu-item.component.mjs +0 -294
- package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +0 -126
- package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +0 -108
- package/esm2020/lib/components/tableview/table/table.component.mjs +0 -749
- package/esm2020/lib/components/tableview/tableview.component.mjs +0 -146
- package/esm2020/lib/descriptors/action/action.descriptor.mjs +0 -634
- package/esm2020/lib/descriptors/editor/editor.descriptor.mjs +0 -304
- package/esm2020/lib/descriptors/table/table.descriptor.mjs +0 -521
- package/esm2020/lib/descriptors/tableview/tableview.descriptor.mjs +0 -347
- package/esm2020/lib/mng-commons.module.mjs +0 -469
- package/esm2020/lib/router/route-builder.mjs +0 -312
- package/esm2020/lib/router/routes-builder.mjs +0 -68
- package/esm2020/lib/security/authorization.guard.mjs +0 -30
- package/esm2020/lib/services/action-executor.service.mjs +0 -722
- package/esm2020/lib/services/configuration.service.mjs +0 -150
- package/esm2020/lib/styles/styles.util.mjs +0 -42
- package/esm2020/lib/types/type.model.mjs +0 -2
- package/esm2020/lib/utils/date.util.mjs +0 -120
- package/esm2020/lib/utils/tableview.util.mjs +0 -171
- package/esm2020/lib/utils/type.util.mjs +0 -94
- package/fesm2015/mediusinc-mng-commons.mjs +0 -15900
- package/fesm2015/mediusinc-mng-commons.mjs.map +0 -1
- package/fesm2020/mediusinc-mng-commons.mjs.map +0 -1
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/api/models/builders/query-param.builder.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/api/models/filter-match-type.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/api/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/api/models/mappers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/api/models/query-mode.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/api/models/serialization.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/api/services/api.abstract.service.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/api/services/crud-api.abstract.service.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/api/services/get-all-api.abstract.service.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/api/services/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/api/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/action/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/action/models/action-component.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/action/models/action-confirmation-service.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/action/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/form/formly/fields/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/form/formly/formly.config.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/form/formly/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/form/formly/models/formly-config.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/form/formly/models/formly-field.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/form/formly/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/form/formly/wrappers/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/form/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/form/models/field-action-context.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/form/models/form-editor.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/form/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/layout/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/layout/services/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/pages/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/tableview/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/tableview/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/tableview/table/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/tableview/table/models/table.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data-providers/base.data-provider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data-providers/editor.data-provider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data-providers/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data-providers/lookup.data-provider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data-providers/table.data-provider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data-providers/tableview-crud.data-provider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data-providers/tableview.data-provider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/action/action-button.descriptor.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/action/action-confirmation.descriptor.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/action/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/editor/field-validation.descriptor.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/editor/field.descriptor.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/editor/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/filter/filter.descriptor.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/filter/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/interfaces/field-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/interfaces/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/model.descriptor.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/table/column.descriptor.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/table/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/tableview/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/types/action.type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/types/column.type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/types/editor.type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/types/field.type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/types/filter.type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/descriptors/types/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/directives/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/column-value.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/config.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/enum.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/error-internal.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/error.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/menu.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/tableview-attr.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/user.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/version.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/view-container.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/pipes/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/pipes/models/internal/enumrate-pipe-i18n.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/pipes/models/internal/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/provide-commons.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/router/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/router/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/router/models/router.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/router/tableview-route-builder.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/security/authorization.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/security/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/security/model/authorization.type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/security/model/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/security/model/permission-service.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/security/model/permissions.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/error-mapper.service.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/internal/commons-init.provider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/internal/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/providers/config-service.provider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/providers/formly-config.provider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/providers/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/tokens/browser-storage.token.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/tokens/commons-init.token.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/tokens/default-setting.token.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/tokens/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/tokens/module-config.token.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/styles/button-style.builder.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/styles/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/styles/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/styles/models/style-level.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/styles/models/style-size.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/types/i18n.type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/types/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/types/mng-localstorage-config-value.type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/types/type.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/action-data-provider.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/editor-formly.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/enum.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/export.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/file.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/i18n.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/model.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/notification.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/object.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/route.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/string.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/validators/field.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/validators/index.mjs +0 -0
- /package/{esm2020 → esm2022}/mediusinc-mng-commons.mjs +0 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { AsyncPipe, NgIf } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Injector, Input, Optional, Output, ViewChild, forwardRef } from '@angular/core';
|
|
3
|
+
import { FormControl, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
|
|
4
|
+
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
5
|
+
import { Dropdown, DropdownModule } from 'primeng/dropdown';
|
|
6
|
+
import { MultiSelectModule } from 'primeng/multiselect';
|
|
7
|
+
import { ReplaySubject, of, switchMap } from 'rxjs';
|
|
8
|
+
import { first, map } from 'rxjs/operators';
|
|
9
|
+
import { MediusQueryParamBuilder } from '../../../api/models';
|
|
10
|
+
import { MngErrorInternal } from '../../../models';
|
|
11
|
+
import { MngFormlyFieldWrapperComponent } from '../formly/wrappers';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "@ngx-translate/core";
|
|
14
|
+
import * as i2 from "../formly/wrappers";
|
|
15
|
+
import * as i3 from "primeng/dropdown";
|
|
16
|
+
import * as i4 from "primeng/multiselect";
|
|
17
|
+
import * as i5 from "@angular/forms";
|
|
18
|
+
export const MNG_DROPDOWN_VALUE_ACCESSOR = {
|
|
19
|
+
provide: NG_VALUE_ACCESSOR,
|
|
20
|
+
useExisting: forwardRef(() => MngDropdownComponent),
|
|
21
|
+
multi: true
|
|
22
|
+
};
|
|
23
|
+
export class MngDropdownComponent {
|
|
24
|
+
constructor(injector, translate, formlyWrapper) {
|
|
25
|
+
this.injector = injector;
|
|
26
|
+
this.translate = translate;
|
|
27
|
+
this.formlyWrapper = formlyWrapper;
|
|
28
|
+
this.itemsLabelTranslate = false;
|
|
29
|
+
this.multiselect = false;
|
|
30
|
+
this.showClear = true;
|
|
31
|
+
this.selectFirstItem = false;
|
|
32
|
+
this.changeValueOnBlur = false;
|
|
33
|
+
this.loadingSubject = new ReplaySubject(1);
|
|
34
|
+
this.$loading = this.loadingSubject.asObservable();
|
|
35
|
+
this.valueChangeEventEmitter = new EventEmitter();
|
|
36
|
+
this.itemsSubject = new ReplaySubject(1);
|
|
37
|
+
this.dataProviderService = null;
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
39
|
+
this.onTouchedFn = () => { };
|
|
40
|
+
this.dropdownFormControl = new FormControl();
|
|
41
|
+
this.items$ = this.itemsSubject.asObservable();
|
|
42
|
+
this.loadingSubject.next(false);
|
|
43
|
+
}
|
|
44
|
+
ngOnInit() {
|
|
45
|
+
this.itemsLabelProperty = this.itemsLabelPropertyInit;
|
|
46
|
+
this.itemsValueProperty = this.itemsValuePropertyInit;
|
|
47
|
+
this.dropdownFormControl.valueChanges.subscribe(v => {
|
|
48
|
+
if (!this.changeValueOnBlur) {
|
|
49
|
+
this.propagateValueChange(v);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
if (this.dataProvider) {
|
|
53
|
+
this.loadingSubject.next(true);
|
|
54
|
+
this.dataProviderService = this.dataProvider.serviceType ? this.injector.get(this.dataProvider.serviceType) : null;
|
|
55
|
+
const queryParamBuilder = MediusQueryParamBuilder.create();
|
|
56
|
+
if (this.itemsLabelTranslate) {
|
|
57
|
+
// setup translation properties
|
|
58
|
+
if (this.itemsLabelPropertyInit) {
|
|
59
|
+
this.itemsLabelProperty = `${this.itemsLabelPropertyInit}_i18n`;
|
|
60
|
+
}
|
|
61
|
+
else if (!this.itemsLabelProperty && !this.itemsValuePropertyInit) {
|
|
62
|
+
this.itemsLabelProperty = 'title_i18n';
|
|
63
|
+
this.itemsValueProperty = 'value';
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw new MngErrorInternal(`Invalid use with value (${this.itemsLabelPropertyInit}) and label (${this.itemsLabelPropertyInit}) property setup.`, 'MngDropdownComponent error').consoleError();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
this.itemsSubscription = this.dataProvider
|
|
70
|
+
.lookup(queryParamBuilder.build(), this.dataProviderService)
|
|
71
|
+
.pipe(switchMap(items => {
|
|
72
|
+
if (this.itemsLabelTranslate) {
|
|
73
|
+
const translationKeys = items.map(item => (typeof item === 'object' && this.itemsLabelPropertyInit ? item[this.itemsLabelPropertyInit] : item));
|
|
74
|
+
if (translationKeys.length === 0) {
|
|
75
|
+
return of([]);
|
|
76
|
+
}
|
|
77
|
+
return this.translate.stream(translationKeys).pipe(map(translations => items.map(item => {
|
|
78
|
+
if (typeof item === 'object' && this.itemsLabelPropertyInit) {
|
|
79
|
+
const label = item[this.itemsLabelPropertyInit];
|
|
80
|
+
const translation = translations[label];
|
|
81
|
+
if (translation) {
|
|
82
|
+
return { ...item, [this.itemsLabelProperty]: translation };
|
|
83
|
+
}
|
|
84
|
+
return { ...item };
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const translation = translations[item];
|
|
88
|
+
return {
|
|
89
|
+
[this.itemsLabelProperty]: translation ?? item,
|
|
90
|
+
[this.itemsValueProperty]: item
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
})));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return of(items);
|
|
97
|
+
}
|
|
98
|
+
}))
|
|
99
|
+
.subscribe(res => {
|
|
100
|
+
this.itemsSubject.next(res);
|
|
101
|
+
this.loadingSubject.next(false);
|
|
102
|
+
});
|
|
103
|
+
if (this.selectFirstItem && !this.dropdownFormControl?.value) {
|
|
104
|
+
this.items$.pipe(first()).subscribe(res => {
|
|
105
|
+
const value = this.itemsValueProperty ? res[0][this.itemsValueProperty] : res[0];
|
|
106
|
+
this.dropdownFormControl?.setValue(value);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
console.warn(`Data provider should be provided for MngDropdownComponent.`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
ngOnDestroy() {
|
|
115
|
+
this.itemsSubscription?.unsubscribe();
|
|
116
|
+
}
|
|
117
|
+
registerOnChange(fn) {
|
|
118
|
+
this.onChangeFn = fn;
|
|
119
|
+
}
|
|
120
|
+
registerOnTouched(fn) {
|
|
121
|
+
this.onTouchedFn = fn;
|
|
122
|
+
}
|
|
123
|
+
setDisabledState(isDisabled) {
|
|
124
|
+
if (isDisabled) {
|
|
125
|
+
this.dropdownFormControl.disable();
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
this.dropdownFormControl.enable();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
writeValue(obj) {
|
|
132
|
+
// this check is required because angular in some cases writes null value
|
|
133
|
+
// before value accessor is initialized
|
|
134
|
+
// if form control value is of primitive type (ex: enums) then write value is not called (we think)
|
|
135
|
+
if (!this.itemsValuePropertyInit && obj === null && !this.isValueAccessorInitialized()) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
this.dropdownFormControl.setValue(obj, { emitEvent: false });
|
|
139
|
+
}
|
|
140
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
141
|
+
onDropdownBlur(event) {
|
|
142
|
+
if (this.changeValueOnBlur) {
|
|
143
|
+
this.propagateValueChange(this.dropdownFormControl.value);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
147
|
+
onPanelHide(event) {
|
|
148
|
+
if (this.changeValueOnBlur) {
|
|
149
|
+
this.propagateValueChange(this.dropdownFormControl.value);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
propagateValueChange(value) {
|
|
153
|
+
if (!this.isValueAccessorInitialized()) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
this.formlyWrapper?.formControl?.markAsTouched();
|
|
157
|
+
this.onChangeFn(value);
|
|
158
|
+
this.valueChangeEventEmitter.next(value);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Prevents executions for writing and outputting value which is sometimes committed as null in cmp initialization stage.
|
|
162
|
+
* In dropdown (from ang. 15 and switch to standalone cmp) null value was always committed to dropdown even if default value was set (using ngModel or formControl) which is incorrect.
|
|
163
|
+
* Github issue: https://github.com/angular/angular/issues/14988
|
|
164
|
+
* @private
|
|
165
|
+
*/
|
|
166
|
+
isValueAccessorInitialized() {
|
|
167
|
+
return typeof this.onChangeFn !== 'undefined';
|
|
168
|
+
}
|
|
169
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MngDropdownComponent, deps: [{ token: i0.Injector }, { token: i1.TranslateService }, { token: i2.MngFormlyFieldWrapperComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
170
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MngDropdownComponent, isStandalone: true, selector: "mng-dropdown", inputs: { dataProvider: "dataProvider", dataKeyProperty: "dataKeyProperty", itemsLabelPropertyInit: ["itemsLabelProperty", "itemsLabelPropertyInit"], itemsLabelTranslate: "itemsLabelTranslate", itemsValuePropertyInit: ["itemsValueProperty", "itemsValuePropertyInit"], itemsDisabledProperty: "itemsDisabledProperty", multiselect: "multiselect", placeholder: "placeholder", showClear: "showClear", selectFirstItem: "selectFirstItem", className: "className", dropdownClassName: "dropdownClassName", changeValueOnBlur: "changeValueOnBlur" }, outputs: { valueChangeEventEmitter: "valueChange" }, providers: [MNG_DROPDOWN_VALUE_ACCESSOR], viewQueries: [{ propertyName: "primeDropdown", first: true, predicate: Dropdown, descendants: true }], ngImport: i0, template: "<p-dropdown\n *ngIf=\"!multiselect; else pMultiselect\"\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"placeholder\"\n [dataKey]=\"dataKeyProperty\"\n [optionLabel]=\"itemsLabelProperty\"\n [optionValue]=\"itemsValueProperty\"\n [optionDisabled]=\"itemsDisabledProperty\"\n [options]=\"(items$ | async) ?? undefined\"\n [showClear]=\"showClear\"\n [autoDisplayFirst]=\"false\"\n [styleClass]=\"className\"\n [panelStyleClass]=\"dropdownClassName\"\n (onBlur)=\"onDropdownBlur($event)\"\n [dropdownIcon]=\"($loading | async) ?? false ? 'pi pi-spinner pi-spin' : 'pi pi-chevron-down'\"\n appendTo=\"body\">\n</p-dropdown>\n<ng-template #pMultiselect>\n <p-multiSelect\n [maxSelectedLabels]=\"1\"\n [selectedItemsLabel]=\"'mngDropdown.multiselectOverMaxDisplayLimit' | translate\"\n [formControl]=\"dropdownFormControl\"\n [defaultLabel]=\"placeholder\"\n [dataKey]=\"dataKeyProperty\"\n [optionLabel]=\"itemsLabelProperty\"\n [optionValue]=\"itemsValueProperty\"\n [optionDisabled]=\"itemsDisabledProperty\"\n [options]=\"(items$ | async) ?? []\"\n [styleClass]=\"className\"\n [panelStyleClass]=\"dropdownClassName\"\n [filter]=\"true\"\n [showToggleAll]=\"false\"\n (onPanelHide)=\"onPanelHide($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i3.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i4.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
171
|
+
}
|
|
172
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MngDropdownComponent, decorators: [{
|
|
173
|
+
type: Component,
|
|
174
|
+
args: [{ standalone: true, selector: 'mng-dropdown', providers: [MNG_DROPDOWN_VALUE_ACCESSOR], imports: [DropdownModule, MultiSelectModule, TranslateModule, AsyncPipe, NgIf, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-dropdown\n *ngIf=\"!multiselect; else pMultiselect\"\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"placeholder\"\n [dataKey]=\"dataKeyProperty\"\n [optionLabel]=\"itemsLabelProperty\"\n [optionValue]=\"itemsValueProperty\"\n [optionDisabled]=\"itemsDisabledProperty\"\n [options]=\"(items$ | async) ?? undefined\"\n [showClear]=\"showClear\"\n [autoDisplayFirst]=\"false\"\n [styleClass]=\"className\"\n [panelStyleClass]=\"dropdownClassName\"\n (onBlur)=\"onDropdownBlur($event)\"\n [dropdownIcon]=\"($loading | async) ?? false ? 'pi pi-spinner pi-spin' : 'pi pi-chevron-down'\"\n appendTo=\"body\">\n</p-dropdown>\n<ng-template #pMultiselect>\n <p-multiSelect\n [maxSelectedLabels]=\"1\"\n [selectedItemsLabel]=\"'mngDropdown.multiselectOverMaxDisplayLimit' | translate\"\n [formControl]=\"dropdownFormControl\"\n [defaultLabel]=\"placeholder\"\n [dataKey]=\"dataKeyProperty\"\n [optionLabel]=\"itemsLabelProperty\"\n [optionValue]=\"itemsValueProperty\"\n [optionDisabled]=\"itemsDisabledProperty\"\n [options]=\"(items$ | async) ?? []\"\n [styleClass]=\"className\"\n [panelStyleClass]=\"dropdownClassName\"\n [filter]=\"true\"\n [showToggleAll]=\"false\"\n (onPanelHide)=\"onPanelHide($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n</ng-template>\n" }]
|
|
175
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.TranslateService }, { type: i2.MngFormlyFieldWrapperComponent, decorators: [{
|
|
176
|
+
type: Optional
|
|
177
|
+
}] }]; }, propDecorators: { dataProvider: [{
|
|
178
|
+
type: Input
|
|
179
|
+
}], dataKeyProperty: [{
|
|
180
|
+
type: Input
|
|
181
|
+
}], itemsLabelPropertyInit: [{
|
|
182
|
+
type: Input,
|
|
183
|
+
args: ['itemsLabelProperty']
|
|
184
|
+
}], itemsLabelTranslate: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}], itemsValuePropertyInit: [{
|
|
187
|
+
type: Input,
|
|
188
|
+
args: ['itemsValueProperty']
|
|
189
|
+
}], itemsDisabledProperty: [{
|
|
190
|
+
type: Input
|
|
191
|
+
}], multiselect: [{
|
|
192
|
+
type: Input
|
|
193
|
+
}], placeholder: [{
|
|
194
|
+
type: Input
|
|
195
|
+
}], showClear: [{
|
|
196
|
+
type: Input
|
|
197
|
+
}], selectFirstItem: [{
|
|
198
|
+
type: Input
|
|
199
|
+
}], className: [{
|
|
200
|
+
type: Input
|
|
201
|
+
}], dropdownClassName: [{
|
|
202
|
+
type: Input
|
|
203
|
+
}], changeValueOnBlur: [{
|
|
204
|
+
type: Input
|
|
205
|
+
}], valueChangeEventEmitter: [{
|
|
206
|
+
type: Output,
|
|
207
|
+
args: ['valueChange']
|
|
208
|
+
}], primeDropdown: [{
|
|
209
|
+
type: ViewChild,
|
|
210
|
+
args: [Dropdown]
|
|
211
|
+
}] } });
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBb0IsUUFBUSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlLLE9BQU8sRUFBdUIsV0FBVyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFekcsT0FBTyxFQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxRQUFRLEVBQUUsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFhLGFBQWEsRUFBeUIsRUFBRSxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNyRixPQUFPLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRTVELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBQyw4QkFBOEIsRUFBQyxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7O0FBRWxFLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFxQjtJQUN6RCxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUM7SUFDbkQsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBVUYsTUFBTSxPQUFPLG9CQUFvQjtJQW1DN0IsWUFBb0IsUUFBa0IsRUFBVSxTQUEyQixFQUFzQixhQUE2QztRQUExSCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFBc0Isa0JBQWEsR0FBYixhQUFhLENBQWdDO1FBL0I5SCx3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFHNUIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFcEIsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUd4QixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFbEMsbUJBQWMsR0FBRyxJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztRQUNoRCxhQUFRLEdBQXdCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFNUMsNEJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQU1uRSxpQkFBWSxHQUF3QixJQUFJLGFBQWEsQ0FBYSxDQUFDLENBQUMsQ0FBQztRQUNyRSx3QkFBbUIsR0FBUSxJQUFJLENBQUM7UUFHeEMsZ0VBQWdFO1FBQ3hELGdCQUFXLEdBQVEsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBRTdCLHdCQUFtQixHQUFnQixJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3JELFdBQU0sR0FBMkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUlyRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDdEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztRQUV0RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUN6QixJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUV4SCxNQUFNLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBRTNELElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUMxQiwrQkFBK0I7Z0JBQy9CLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO29CQUM3QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLE9BQU8sQ0FBQztpQkFDbkU7cUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtvQkFDakUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFlBQVksQ0FBQztvQkFDdkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztpQkFDckM7cUJBQU07b0JBQ0gsTUFBTSxJQUFJLGdCQUFnQixDQUN0QiwyQkFBMkIsSUFBSSxDQUFDLHNCQUFzQixnQkFBZ0IsSUFBSSxDQUFDLHNCQUFzQixtQkFBbUIsRUFDcEgsNEJBQTRCLENBQy9CLENBQUMsWUFBWSxFQUFFLENBQUM7aUJBQ3BCO2FBQ0o7WUFFRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVk7aUJBQ3JDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUM7aUJBQzNELElBQUksQ0FDRCxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7b0JBQzFCLE1BQU0sZUFBZSxHQUFhLEtBQUssQ0FBQyxHQUFHLENBQ3ZDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQyxDQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBVyxDQUNySixDQUFDO29CQUVGLElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7d0JBQzlCLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUNqQjtvQkFFRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FDOUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQ2YsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDYixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7NEJBQ3pELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNDLENBQVcsQ0FBQzs0QkFDMUUsTUFBTSxXQUFXLEdBQXVCLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDNUQsSUFBSSxXQUFXLEVBQUU7Z0NBQ2IsT0FBTyxFQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFtQixDQUFDLEVBQUUsV0FBVyxFQUFDLENBQUM7NkJBQzdEOzRCQUNELE9BQU8sRUFBQyxHQUFHLElBQUksRUFBQyxDQUFDO3lCQUNwQjs2QkFBTTs0QkFDSCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3ZDLE9BQU87Z0NBQ0gsQ0FBQyxJQUFJLENBQUMsa0JBQW1CLENBQUMsRUFBRSxXQUFXLElBQUksSUFBSTtnQ0FDL0MsQ0FBQyxJQUFJLENBQUMsa0JBQW1CLENBQUMsRUFBRSxJQUFJOzZCQUNuQyxDQUFDO3lCQUNMO29CQUNMLENBQUMsQ0FBQyxDQUNMLENBQ0osQ0FBQztpQkFDTDtxQkFBTTtvQkFDSCxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDcEI7WUFDTCxDQUFDLENBQUMsQ0FDTDtpQkFDQSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxDQUFDO1lBRVAsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssRUFBRTtnQkFDMUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2pGLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzlDLENBQUMsQ0FBQyxDQUFDO2FBQ047U0FDSjthQUFNO1lBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1NBQzlFO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQU87UUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQU87UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2hDLElBQUksVUFBVSxFQUFFO1lBQ1osSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3RDO2FBQU07WUFDSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDckM7SUFDTCxDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQVE7UUFDZix5RUFBeUU7UUFDekUsdUNBQXVDO1FBQ3ZDLG1HQUFtRztRQUNuRyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRTtZQUNwRixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsY0FBYyxDQUFDLEtBQVU7UUFDckIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3RDtJQUNMLENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsV0FBVyxDQUFDLEtBQVU7UUFDbEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3RDtJQUNMLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxLQUFVO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRTtZQUNwQyxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUVqRCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssMEJBQTBCO1FBQzlCLE9BQU8sT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLFdBQVcsQ0FBQztJQUNsRCxDQUFDOzhHQTNMUSxvQkFBb0I7a0dBQXBCLG9CQUFvQiwwb0JBSmxCLENBQUMsMkJBQTJCLENBQUMseUVBd0I3QixRQUFRLGdEQ2pEdkIsczVDQW9DQSwyQ0RWYyxjQUFjLCtrQ0FBRSxpQkFBaUIsa3JDQUFFLGVBQWUsdUZBQUUsU0FBUyw4Q0FBRSxJQUFJLDRGQUFFLG1CQUFtQjs7MkZBR3pGLG9CQUFvQjtrQkFSaEMsU0FBUztpQ0FDTSxJQUFJLFlBQ04sY0FBYyxhQUViLENBQUMsMkJBQTJCLENBQUMsV0FDL0IsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsbUJBQ2xGLHVCQUF1QixDQUFDLE1BQU07OzBCQXFDK0IsUUFBUTs0Q0FsQ3RFLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsZUFBZTtzQkFBOUIsS0FBSztnQkFDOEIsc0JBQXNCO3NCQUF6RCxLQUFLO3VCQUFDLG9CQUFvQjtnQkFDWCxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBQzhCLHNCQUFzQjtzQkFBekQsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBQ1gscUJBQXFCO3NCQUFwQyxLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxpQkFBaUI7c0JBQWhDLEtBQUs7Z0JBQ1UsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUt3Qix1QkFBdUI7c0JBQXBELE1BQU07dUJBQUMsYUFBYTtnQkFFTyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZSwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBFeGlzdGluZ1Byb3ZpZGVyLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBWaWV3Q2hpbGQsIGZvcndhcmRSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SLCBSZWFjdGl2ZUZvcm1zTW9kdWxlfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7RHJvcGRvd24sIERyb3Bkb3duTW9kdWxlfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7TXVsdGlTZWxlY3RNb2R1bGV9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIG9mLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaXJzdCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7TWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXJ9IGZyb20gJy4uLy4uLy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtJTG9va3VwRGF0YVByb3ZpZGVyfSBmcm9tICcuLi8uLi8uLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge01uZ0Vycm9ySW50ZXJuYWx9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge01uZ0Zvcm1seUZpZWxkV3JhcHBlckNvbXBvbmVudH0gZnJvbSAnLi4vZm9ybWx5L3dyYXBwZXJzJztcblxuZXhwb3J0IGNvbnN0IE1OR19EUk9QRE9XTl9WQUxVRV9BQ0NFU1NPUjogRXhpc3RpbmdQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNbmdEcm9wZG93bkNvbXBvbmVudCksXG4gICAgbXVsdGk6IHRydWVcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdtbmctZHJvcGRvd24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbTU5HX0RST1BET1dOX1ZBTFVFX0FDQ0VTU09SXSxcbiAgICBpbXBvcnRzOiBbRHJvcGRvd25Nb2R1bGUsIE11bHRpU2VsZWN0TW9kdWxlLCBUcmFuc2xhdGVNb2R1bGUsIEFzeW5jUGlwZSwgTmdJZiwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTW5nRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRhUHJvdmlkZXI/OiBJTG9va3VwRGF0YVByb3ZpZGVyPGFueSwgYW55PjtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0YUtleVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgnaXRlbXNMYWJlbFByb3BlcnR5JykgcHVibGljIGl0ZW1zTGFiZWxQcm9wZXJ0eUluaXQ/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zTGFiZWxUcmFuc2xhdGUgPSBmYWxzZTtcbiAgICBASW5wdXQoJ2l0ZW1zVmFsdWVQcm9wZXJ0eScpIHB1YmxpYyBpdGVtc1ZhbHVlUHJvcGVydHlJbml0Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtc0Rpc2FibGVkUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIG11bHRpc2VsZWN0ID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93Q2xlYXIgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RGaXJzdEl0ZW0gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkcm9wZG93bkNsYXNzTmFtZT86IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgY2hhbmdlVmFsdWVPbkJsdXIgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgbG9hZGluZ1N1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcbiAgICBwdWJsaWMgJGxvYWRpbmc6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmxvYWRpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgQE91dHB1dCgndmFsdWVDaGFuZ2UnKSBwdWJsaWMgdmFsdWVDaGFuZ2VFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAVmlld0NoaWxkKERyb3Bkb3duKSBwdWJsaWMgcHJpbWVEcm9wZG93bj86IERyb3Bkb3duO1xuXG4gICAgcHVibGljIGl0ZW1zTGFiZWxQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwdWJsaWMgaXRlbXNWYWx1ZVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgaXRlbXNTdWJqZWN0OiBTdWJqZWN0PEFycmF5PGFueT4+ID0gbmV3IFJlcGxheVN1YmplY3Q8QXJyYXk8YW55Pj4oMSk7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTZXJ2aWNlOiBhbnkgPSBudWxsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIG9uQ2hhbmdlRm46IGFueTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgcHJpdmF0ZSBvblRvdWNoZWRGbjogYW55ID0gKCkgPT4ge307XG5cbiAgICBwdWJsaWMgZHJvcGRvd25Gb3JtQ29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgICBwdWJsaWMgaXRlbXMkOiBPYnNlcnZhYmxlPEFycmF5PGFueT4+ID0gdGhpcy5pdGVtc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHJpdmF0ZSBpdGVtc1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLCBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSwgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtbHlXcmFwcGVyOiBNbmdGb3JtbHlGaWVsZFdyYXBwZXJDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkgPSB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXQ7XG4gICAgICAgIHRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5ID0gdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHlJbml0O1xuXG4gICAgICAgIHRoaXMuZHJvcGRvd25Gb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNoYW5nZVZhbHVlT25CbHVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZUNoYW5nZSh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclNlcnZpY2UgPSB0aGlzLmRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSA/IHRoaXMuaW5qZWN0b3IuZ2V0PGFueT4odGhpcy5kYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpIDogbnVsbDtcblxuICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbUJ1aWxkZXIgPSBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlci5jcmVhdGUoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMYWJlbFRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIHNldHVwIHRyYW5zbGF0aW9uIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5ID0gYCR7dGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0fV9pMThuYDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSAmJiAhdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHlJbml0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5ID0gJ3RpdGxlX2kxOG4nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eSA9ICd2YWx1ZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1uZ0Vycm9ySW50ZXJuYWwoXG4gICAgICAgICAgICAgICAgICAgICAgICBgSW52YWxpZCB1c2Ugd2l0aCB2YWx1ZSAoJHt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXR9KSBhbmQgbGFiZWwgKCR7dGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0fSkgcHJvcGVydHkgc2V0dXAuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdNbmdEcm9wZG93bkNvbXBvbmVudCBlcnJvcidcbiAgICAgICAgICAgICAgICAgICAgKS5jb25zb2xlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXRlbXNTdWJzY3JpcHRpb24gPSB0aGlzLmRhdGFQcm92aWRlclxuICAgICAgICAgICAgICAgIC5sb29rdXAocXVlcnlQYXJhbUJ1aWxkZXIuYnVpbGQoKSwgdGhpcy5kYXRhUHJvdmlkZXJTZXJ2aWNlKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoaXRlbXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMYWJlbFRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uS2V5czogc3RyaW5nW10gPSBpdGVtcy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPT4gKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXQgPyAoaXRlbVt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXQgYXMga2V5b2Ygb2JqZWN0XSBhcyBzdHJpbmcpIDogaXRlbSkgYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLnN0cmVhbSh0cmFuc2xhdGlvbktleXMpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCh0cmFuc2xhdGlvbnMgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGl0ZW1bdGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0IGFzIGtleW9mIG9iamVjdF0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdHJhbnNsYXRpb25zW2xhYmVsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLml0ZW0sIFt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSFdOiB0cmFuc2xhdGlvbn07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5pdGVtfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uc1tpdGVtXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSFdOiB0cmFuc2xhdGlvbiA/PyBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMuaXRlbXNWYWx1ZVByb3BlcnR5IV06IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGl0ZW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zU3ViamVjdC5uZXh0KHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdEZpcnN0SXRlbSAmJiAhdGhpcy5kcm9wZG93bkZvcm1Db250cm9sPy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHkgPyByZXNbMF1bdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHldIDogcmVzWzBdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duRm9ybUNvbnRyb2w/LnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRGF0YSBwcm92aWRlciBzaG91bGQgYmUgcHJvdmlkZWQgZm9yIE1uZ0Ryb3Bkb3duQ29tcG9uZW50LmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuaXRlbXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VGbiA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRGbiA9IGZuO1xuICAgIH1cblxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bkZvcm1Db250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Gb3JtQ29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gdGhpcyBjaGVjayBpcyByZXF1aXJlZCBiZWNhdXNlIGFuZ3VsYXIgaW4gc29tZSBjYXNlcyB3cml0ZXMgbnVsbCB2YWx1ZVxuICAgICAgICAvLyBiZWZvcmUgdmFsdWUgYWNjZXNzb3IgaXMgaW5pdGlhbGl6ZWRcbiAgICAgICAgLy8gaWYgZm9ybSBjb250cm9sIHZhbHVlIGlzIG9mIHByaW1pdGl2ZSB0eXBlIChleDogZW51bXMpIHRoZW4gd3JpdGUgdmFsdWUgaXMgbm90IGNhbGxlZCAod2UgdGhpbmspXG4gICAgICAgIGlmICghdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHlJbml0ICYmIG9iaiA9PT0gbnVsbCAmJiAhdGhpcy5pc1ZhbHVlQWNjZXNzb3JJbml0aWFsaXplZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcm9wZG93bkZvcm1Db250cm9sLnNldFZhbHVlKG9iaiwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb25Ecm9wZG93bkJsdXIoZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5jaGFuZ2VWYWx1ZU9uQmx1cikge1xuICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZUNoYW5nZSh0aGlzLmRyb3Bkb3duRm9ybUNvbnRyb2wudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uUGFuZWxIaWRlKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhbmdlVmFsdWVPbkJsdXIpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVDaGFuZ2UodGhpcy5kcm9wZG93bkZvcm1Db250cm9sLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcHJvcGFnYXRlVmFsdWVDaGFuZ2UodmFsdWU6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWx1ZUFjY2Vzc29ySW5pdGlhbGl6ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb3JtbHlXcmFwcGVyPy5mb3JtQ29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2VGbih2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VFdmVudEVtaXR0ZXIubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJldmVudHMgZXhlY3V0aW9ucyBmb3Igd3JpdGluZyBhbmQgb3V0cHV0dGluZyB2YWx1ZSB3aGljaCBpcyBzb21ldGltZXMgY29tbWl0dGVkIGFzIG51bGwgaW4gY21wIGluaXRpYWxpemF0aW9uIHN0YWdlLlxuICAgICAqIEluIGRyb3Bkb3duIChmcm9tIGFuZy4gMTUgYW5kIHN3aXRjaCB0byBzdGFuZGFsb25lIGNtcCkgbnVsbCB2YWx1ZSB3YXMgYWx3YXlzIGNvbW1pdHRlZCB0byBkcm9wZG93biBldmVuIGlmIGRlZmF1bHQgdmFsdWUgd2FzIHNldCAodXNpbmcgbmdNb2RlbCBvciBmb3JtQ29udHJvbCkgd2hpY2ggaXMgaW5jb3JyZWN0LlxuICAgICAqIEdpdGh1YiBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTQ5ODhcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgaXNWYWx1ZUFjY2Vzc29ySW5pdGlhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5vbkNoYW5nZUZuICE9PSAndW5kZWZpbmVkJztcbiAgICB9XG59XG4iLCI8cC1kcm9wZG93blxuICAgICpuZ0lmPVwiIW11bHRpc2VsZWN0OyBlbHNlIHBNdWx0aXNlbGVjdFwiXG4gICAgW2Zvcm1Db250cm9sXT1cImRyb3Bkb3duRm9ybUNvbnRyb2xcIlxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgW2RhdGFLZXldPVwiZGF0YUtleVByb3BlcnR5XCJcbiAgICBbb3B0aW9uTGFiZWxdPVwiaXRlbXNMYWJlbFByb3BlcnR5XCJcbiAgICBbb3B0aW9uVmFsdWVdPVwiaXRlbXNWYWx1ZVByb3BlcnR5XCJcbiAgICBbb3B0aW9uRGlzYWJsZWRdPVwiaXRlbXNEaXNhYmxlZFByb3BlcnR5XCJcbiAgICBbb3B0aW9uc109XCIoaXRlbXMkIHwgYXN5bmMpID8/IHVuZGVmaW5lZFwiXG4gICAgW3Nob3dDbGVhcl09XCJzaG93Q2xlYXJcIlxuICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcbiAgICBbc3R5bGVDbGFzc109XCJjbGFzc05hbWVcIlxuICAgIFtwYW5lbFN0eWxlQ2xhc3NdPVwiZHJvcGRvd25DbGFzc05hbWVcIlxuICAgIChvbkJsdXIpPVwib25Ecm9wZG93bkJsdXIoJGV2ZW50KVwiXG4gICAgW2Ryb3Bkb3duSWNvbl09XCIoJGxvYWRpbmcgfCBhc3luYykgPz8gZmFsc2UgPyAncGkgcGktc3Bpbm5lciBwaS1zcGluJyA6ICdwaSBwaS1jaGV2cm9uLWRvd24nXCJcbiAgICBhcHBlbmRUbz1cImJvZHlcIj5cbjwvcC1kcm9wZG93bj5cbjxuZy10ZW1wbGF0ZSAjcE11bHRpc2VsZWN0PlxuICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgIFttYXhTZWxlY3RlZExhYmVsc109XCIxXCJcbiAgICAgICAgW3NlbGVjdGVkSXRlbXNMYWJlbF09XCInbW5nRHJvcGRvd24ubXVsdGlzZWxlY3RPdmVyTWF4RGlzcGxheUxpbWl0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJkcm9wZG93bkZvcm1Db250cm9sXCJcbiAgICAgICAgW2RlZmF1bHRMYWJlbF09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIFtkYXRhS2V5XT1cImRhdGFLZXlQcm9wZXJ0eVwiXG4gICAgICAgIFtvcHRpb25MYWJlbF09XCJpdGVtc0xhYmVsUHJvcGVydHlcIlxuICAgICAgICBbb3B0aW9uVmFsdWVdPVwiaXRlbXNWYWx1ZVByb3BlcnR5XCJcbiAgICAgICAgW29wdGlvbkRpc2FibGVkXT1cIml0ZW1zRGlzYWJsZWRQcm9wZXJ0eVwiXG4gICAgICAgIFtvcHRpb25zXT1cIihpdGVtcyQgfCBhc3luYykgPz8gW11cIlxuICAgICAgICBbc3R5bGVDbGFzc109XCJjbGFzc05hbWVcIlxuICAgICAgICBbcGFuZWxTdHlsZUNsYXNzXT1cImRyb3Bkb3duQ2xhc3NOYW1lXCJcbiAgICAgICAgW2ZpbHRlcl09XCJ0cnVlXCJcbiAgICAgICAgW3Nob3dUb2dnbGVBbGxdPVwiZmFsc2VcIlxuICAgICAgICAob25QYW5lbEhpZGUpPVwib25QYW5lbEhpZGUoJGV2ZW50KVwiXG4gICAgICAgIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgIDwvcC1tdWx0aVNlbGVjdD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { AsyncPipe } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, ContentChildren, ElementRef, EventEmitter, Input, Output, QueryList, ViewChild } from '@angular/core';
|
|
3
|
+
import { FormArray, FormGroup, ReactiveFormsModule } from '@angular/forms';
|
|
4
|
+
import { FormlyModule } from '@ngx-formly/core';
|
|
5
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
6
|
+
import { ButtonModule } from 'primeng/button';
|
|
7
|
+
import { MessagesModule } from 'primeng/messages';
|
|
8
|
+
import { Observable, ReplaySubject, debounceTime, distinctUntilChanged, of } from 'rxjs';
|
|
9
|
+
import { EditorDescriptor } from '../../../descriptors/editor';
|
|
10
|
+
import { TableviewEditorTypeEnum } from '../../../descriptors/types';
|
|
11
|
+
import { MngTemplateDirective } from '../../../directives';
|
|
12
|
+
import { MngCommonsService } from '../../../services';
|
|
13
|
+
import { EditorFormlyUtil, NotificationUtil, ObjectUtil } from '../../../utils';
|
|
14
|
+
import { MngFormEditorSubmitEvent, MngFormEventTypeEnum, MngFormFieldEventComponentSubtype } from '../models';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "../../../services";
|
|
17
|
+
import * as i2 from "@ngx-translate/core";
|
|
18
|
+
import * as i3 from "@ngx-formly/core";
|
|
19
|
+
import * as i4 from "@angular/forms";
|
|
20
|
+
import * as i5 from "primeng/messages";
|
|
21
|
+
import * as i6 from "primeng/button";
|
|
22
|
+
export class MngFormEditorComponent {
|
|
23
|
+
constructor(mngCommonsService, translateService) {
|
|
24
|
+
this.mngCommonsService = mngCommonsService;
|
|
25
|
+
this.translateService = translateService;
|
|
26
|
+
this.submitLoading = false;
|
|
27
|
+
this.viewContainerSubject = new ReplaySubject(1);
|
|
28
|
+
this.viewContainer$ = this.viewContainerSubject.asObservable();
|
|
29
|
+
// extra features input
|
|
30
|
+
this.isFormDisabled = false;
|
|
31
|
+
// event outputs
|
|
32
|
+
this.formSubmitEventEmitter = new EventEmitter();
|
|
33
|
+
this.form = new FormGroup({});
|
|
34
|
+
this.formOptions = {
|
|
35
|
+
formState: {
|
|
36
|
+
add: false,
|
|
37
|
+
edit: false,
|
|
38
|
+
disabled: false
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
this.formModel = {};
|
|
42
|
+
this.formMessages = [];
|
|
43
|
+
this.subscriptions = [];
|
|
44
|
+
}
|
|
45
|
+
ngOnInit() {
|
|
46
|
+
this.setInitialFormState();
|
|
47
|
+
this.resetFormModel(this.item);
|
|
48
|
+
this.submitLoading$ = this.submitLoading instanceof Observable ? this.submitLoading : of(this.submitLoading);
|
|
49
|
+
if (this.descriptor) {
|
|
50
|
+
// init fields for formly
|
|
51
|
+
this.formFields = EditorFormlyUtil.createFormlyConfigFromDescriptor(this.descriptor, this);
|
|
52
|
+
this.updateFormState();
|
|
53
|
+
// let the user know, that adding new value in table view with localizations is only supported in the default language
|
|
54
|
+
if (this.descriptor.isLocalized &&
|
|
55
|
+
(this.descriptor.tableviewEditorType === TableviewEditorTypeEnum.Add || this.descriptor.tableviewEditorType === TableviewEditorTypeEnum.Edit)) {
|
|
56
|
+
this.formMessages.push(NotificationUtil.getFormEditorInfoMessage(this.translateService, 'mngEditor.localizations.addInDefaultLanguageTitle', 'mngEditor.localizations.addInDefaultLanguageDescription', { defaultLanguage: this.mngCommonsService.defaultDataLanguage }));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// emit lifecycle event
|
|
60
|
+
this.descriptor?.nextEvent(MngFormEventTypeEnum.ComponentLifecycle, MngFormEditorComponent, this, {
|
|
61
|
+
eventSubtype: MngFormFieldEventComponentSubtype.ON_INIT
|
|
62
|
+
});
|
|
63
|
+
this.subscriptions.push(this.form.valueChanges.pipe(debounceTime(250), distinctUntilChanged()).subscribe(v => {
|
|
64
|
+
this.descriptor?.nextEvent(MngFormEventTypeEnum.ValueChange, MngFormEditorComponent, this, {
|
|
65
|
+
value: v,
|
|
66
|
+
formValue: () => this.getFormValue()
|
|
67
|
+
});
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
ngOnChanges(changes) {
|
|
71
|
+
if (changes['viewContainerInit'] && !changes['viewContainerInit'].firstChange) {
|
|
72
|
+
this.viewContainerSubject.next(changes['viewContainerInit']);
|
|
73
|
+
}
|
|
74
|
+
if (changes['isFormDisabled'] && !changes['isFormDisabled'].firstChange) {
|
|
75
|
+
this.updateFormState();
|
|
76
|
+
}
|
|
77
|
+
if (changes['item'] && !changes['item'].firstChange) {
|
|
78
|
+
this.resetFormModel(this.item);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
ngOnDestroy() {
|
|
82
|
+
this.subscriptions.forEach(s => s.unsubscribe());
|
|
83
|
+
// emit lifecycle event
|
|
84
|
+
this.descriptor?.nextEvent(MngFormEventTypeEnum.ComponentLifecycle, MngFormEditorComponent, this, {
|
|
85
|
+
eventSubtype: MngFormFieldEventComponentSubtype.ON_DESTROY
|
|
86
|
+
});
|
|
87
|
+
// complete emitting events
|
|
88
|
+
this.descriptor?.completeEvents();
|
|
89
|
+
}
|
|
90
|
+
submit() {
|
|
91
|
+
this.submitButtonElementRef?.nativeElement.click();
|
|
92
|
+
}
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
94
|
+
onSubmit(event) {
|
|
95
|
+
this.formOptions.formState.submittedOn = Date.now();
|
|
96
|
+
this.formMessages = [];
|
|
97
|
+
const formSubmitItem = this.getFormValue();
|
|
98
|
+
if (this.form.valid) {
|
|
99
|
+
this.formSubmitEventEmitter.next(new MngFormEditorSubmitEvent(formSubmitItem));
|
|
100
|
+
this.descriptor?.nextEvent(MngFormEventTypeEnum.Submit, MngFormEditorComponent, this, {
|
|
101
|
+
submitValid: true,
|
|
102
|
+
submitValue: formSubmitItem
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// find and mark invalid tabs
|
|
107
|
+
if (this.formFields[0].type === 'tabs' && this.formFields[0].fieldGroup) {
|
|
108
|
+
for (const tab of this.formFields[0].fieldGroup) {
|
|
109
|
+
const isInvalid = this.isAnyFieldInvalid(tab.fieldGroup);
|
|
110
|
+
this.formOptions.formState['tab_' + (tab.id ? tab.id : tab.props.props.label) + '_invalid'] = isInvalid;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const event = new MngFormEditorSubmitEvent(formSubmitItem);
|
|
114
|
+
event.success = false;
|
|
115
|
+
this.formMessages.push(NotificationUtil.getFormEditorWarningMessage(this.translateService, 'mngEditor.invalidFormToastTitle', 'mngEditor.invalidFormToastMessage'));
|
|
116
|
+
this.formSubmitEventEmitter.next(event);
|
|
117
|
+
this.descriptor?.nextEvent(MngFormEventTypeEnum.Submit, MngFormEditorComponent, this, {
|
|
118
|
+
submitValid: false,
|
|
119
|
+
submitValue: formSubmitItem
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
getFormValue() {
|
|
124
|
+
const formValue = ObjectUtil.deepCopyObject(this.form.getRawValue(), { mapGettersToProperties: true });
|
|
125
|
+
this.descriptor?.fields.forEach(field => {
|
|
126
|
+
if (field && field.setter) {
|
|
127
|
+
const splitPath = field.property.split('.');
|
|
128
|
+
let fieldValue = formValue;
|
|
129
|
+
for (let i = 0; i < splitPath.length - 1; i++) {
|
|
130
|
+
const currentSubPath = splitPath[i];
|
|
131
|
+
if (typeof fieldValue[currentSubPath] !== 'object') {
|
|
132
|
+
fieldValue[currentSubPath] = {};
|
|
133
|
+
}
|
|
134
|
+
fieldValue = fieldValue[currentSubPath];
|
|
135
|
+
}
|
|
136
|
+
fieldValue = fieldValue[splitPath[splitPath.length - 1]];
|
|
137
|
+
field.setter(formValue, fieldValue);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
return formValue;
|
|
141
|
+
}
|
|
142
|
+
resetFormModel(item) {
|
|
143
|
+
if (typeof item !== 'undefined') {
|
|
144
|
+
this.originalItemPrototype = Object.getPrototypeOf(item);
|
|
145
|
+
}
|
|
146
|
+
const formModel = ObjectUtil.deepCopyObject(item, { mapGettersToProperties: true }) ?? {};
|
|
147
|
+
this.descriptor?.fields.forEach(field => {
|
|
148
|
+
if (field.getter && item) {
|
|
149
|
+
const splitPath = field.property.split('.');
|
|
150
|
+
let currentObject = formModel;
|
|
151
|
+
for (let i = 0; i < splitPath.length; i++) {
|
|
152
|
+
const currentSubPath = splitPath[i];
|
|
153
|
+
if (i === splitPath.length - 1) {
|
|
154
|
+
currentObject[currentSubPath] = field.getter(item);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
if (typeof currentObject[currentSubPath] !== 'object') {
|
|
158
|
+
currentObject[currentSubPath] = {};
|
|
159
|
+
}
|
|
160
|
+
currentObject = currentObject[currentSubPath];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
if (typeof this.formOptions.resetModel === 'function') {
|
|
166
|
+
// could not be initiated yet
|
|
167
|
+
this.formOptions.resetModel(this.formModel);
|
|
168
|
+
}
|
|
169
|
+
this.formModel = formModel;
|
|
170
|
+
}
|
|
171
|
+
getFormField(key) {
|
|
172
|
+
return this.findFormField(this.form, key.split('.'));
|
|
173
|
+
}
|
|
174
|
+
setFormFieldValue(key, value) {
|
|
175
|
+
const control = this.getFormField(key);
|
|
176
|
+
if (control) {
|
|
177
|
+
control.setValue(value);
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
console.warn(`Value was not set, because field ${key} was not found.`);
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
patchFormFieldValue(key, value) {
|
|
186
|
+
const control = this.getFormField(key);
|
|
187
|
+
if (control) {
|
|
188
|
+
control.patchValue(value);
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
console.warn(`Value was not set, because field ${key} was not found.`);
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
resetFormFieldValue(key, value) {
|
|
197
|
+
const control = this.getFormField(key);
|
|
198
|
+
if (control) {
|
|
199
|
+
control.reset(value);
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
console.warn(`Value was not set, because field ${key} was not found.`);
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
findFormField(control, keyPath) {
|
|
208
|
+
if (keyPath.length === 0) {
|
|
209
|
+
return control;
|
|
210
|
+
}
|
|
211
|
+
if (keyPath.length === 1) {
|
|
212
|
+
return control.get(keyPath[0]);
|
|
213
|
+
}
|
|
214
|
+
let nextControl = null;
|
|
215
|
+
if (control instanceof FormGroup) {
|
|
216
|
+
nextControl = control.get(keyPath[0]);
|
|
217
|
+
}
|
|
218
|
+
else if (control instanceof FormArray) {
|
|
219
|
+
const idx = +keyPath[0];
|
|
220
|
+
if (!isNaN(idx)) {
|
|
221
|
+
nextControl = control.at(idx);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (!control) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
return this.findFormField(nextControl, keyPath.slice(1));
|
|
228
|
+
}
|
|
229
|
+
isAnyFieldInvalid(fields = []) {
|
|
230
|
+
for (const field of fields) {
|
|
231
|
+
let fieldInvalid = false;
|
|
232
|
+
if (Array.isArray(field.fieldGroup)) {
|
|
233
|
+
fieldInvalid = this.isAnyFieldInvalid(field.fieldGroup);
|
|
234
|
+
}
|
|
235
|
+
else if (typeof field.type !== 'undefined') {
|
|
236
|
+
fieldInvalid = !field.formControl?.valid;
|
|
237
|
+
}
|
|
238
|
+
if (fieldInvalid) {
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
updateFormState() {
|
|
245
|
+
const isDisabled = this.isFormDisabled || this.descriptor?.disabled === true || this.descriptor?.tableviewEditorType === TableviewEditorTypeEnum.Details;
|
|
246
|
+
this.formOptions.formState.disabled = isDisabled;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* @private Sets form state based on editor descriptor type.
|
|
250
|
+
* Possible options are: disabled, add or edit.
|
|
251
|
+
*/
|
|
252
|
+
setInitialFormState() {
|
|
253
|
+
if (this.descriptor?.tableviewEditorType === TableviewEditorTypeEnum.Add) {
|
|
254
|
+
this.formOptions.formState.add = true;
|
|
255
|
+
}
|
|
256
|
+
else if (this.descriptor?.tableviewEditorType === TableviewEditorTypeEnum.Edit) {
|
|
257
|
+
this.formOptions.formState.edit = true;
|
|
258
|
+
}
|
|
259
|
+
this.updateFormState();
|
|
260
|
+
}
|
|
261
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MngFormEditorComponent, deps: [{ token: i1.MngCommonsService }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
262
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MngFormEditorComponent, isStandalone: true, selector: "mng-form-editor", inputs: { descriptor: "descriptor", submitLoading: "submitLoading", item: "item", viewContainerInit: ["viewContainer", "viewContainerInit"], isFormDisabled: "isFormDisabled" }, outputs: { formSubmitEventEmitter: "formSubmit" }, queries: [{ propertyName: "templates", predicate: MngTemplateDirective }], viewQueries: [{ propertyName: "submitButtonElementRef", first: true, predicate: ["submitButton"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formFields\" [options]=\"formOptions\" [model]=\"formModel\"></formly-form>\n <button #submitButton pButton type=\"submit\" class=\"hidden\" [disabled]=\"form.disabled\" [loading]=\"(submitLoading$ | async) ?? false\"></button>\n</form>\n<p-messages [value]=\"formMessages\" [enableService]=\"false\"></p-messages>\n", dependencies: [{ kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i3.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MessagesModule }, { kind: "component", type: i5.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
263
|
+
}
|
|
264
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MngFormEditorComponent, decorators: [{
|
|
265
|
+
type: Component,
|
|
266
|
+
args: [{ standalone: true, selector: 'mng-form-editor', imports: [FormlyModule, ReactiveFormsModule, MessagesModule, AsyncPipe, ButtonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formFields\" [options]=\"formOptions\" [model]=\"formModel\"></formly-form>\n <button #submitButton pButton type=\"submit\" class=\"hidden\" [disabled]=\"form.disabled\" [loading]=\"(submitLoading$ | async) ?? false\"></button>\n</form>\n<p-messages [value]=\"formMessages\" [enableService]=\"false\"></p-messages>\n" }]
|
|
267
|
+
}], ctorParameters: function () { return [{ type: i1.MngCommonsService }, { type: i2.TranslateService }]; }, propDecorators: { descriptor: [{
|
|
268
|
+
type: Input
|
|
269
|
+
}], submitLoading: [{
|
|
270
|
+
type: Input
|
|
271
|
+
}], item: [{
|
|
272
|
+
type: Input
|
|
273
|
+
}], viewContainerInit: [{
|
|
274
|
+
type: Input,
|
|
275
|
+
args: ['viewContainer']
|
|
276
|
+
}], isFormDisabled: [{
|
|
277
|
+
type: Input
|
|
278
|
+
}], formSubmitEventEmitter: [{
|
|
279
|
+
type: Output,
|
|
280
|
+
args: ['formSubmit']
|
|
281
|
+
}], templates: [{
|
|
282
|
+
type: ContentChildren,
|
|
283
|
+
args: [MngTemplateDirective]
|
|
284
|
+
}], submitButtonElementRef: [{
|
|
285
|
+
type: ViewChild,
|
|
286
|
+
args: ['submitButton']
|
|
287
|
+
}] } });
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZWRpdG9yL2Zvcm0tZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2VkaXRvci9mb3JtLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFDTixTQUFTLEVBR1QsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBa0IsU0FBUyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFGLE9BQU8sRUFBdUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDcEYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsVUFBVSxFQUFFLGFBQWEsRUFBZ0IsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVyRyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUV6RCxPQUFPLEVBQUMsaUJBQWlC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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVHlwZSxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtGb3JtbHlGaWVsZENvbmZpZywgRm9ybWx5Rm9ybU9wdGlvbnMsIEZvcm1seU1vZHVsZX0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtNZXNzYWdlfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge0J1dHRvbk1vZHVsZX0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHtNZXNzYWdlc01vZHVsZX0gZnJvbSAncHJpbWVuZy9tZXNzYWdlcyc7XG5pbXBvcnQge09ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YnNjcmlwdGlvbiwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgb2Z9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0VkaXRvckRlc2NyaXB0b3J9IGZyb20gJy4uLy4uLy4uL2Rlc2NyaXB0b3JzL2VkaXRvcic7XG5pbXBvcnQge1RhYmxldmlld0VkaXRvclR5cGVFbnVtfSBmcm9tICcuLi8uLi8uLi9kZXNjcmlwdG9ycy90eXBlcyc7XG5pbXBvcnQge01uZ1RlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7SVZpZXdDb250YWluZXJ9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge01uZ0NvbW1vbnNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge0VkaXRvckZvcm1seVV0aWwsIE5vdGlmaWNhdGlvblV0aWwsIE9iamVjdFV0aWx9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7TW5nRm9ybWx5RmllbGRDb25maWd9IGZyb20gJy4uL2Zvcm1seS9tb2RlbHMnO1xuaW1wb3J0IHtJRm9ybUVkaXRvckNvbXBvbmVudCwgTW5nRm9ybUVkaXRvclN1Ym1pdEV2ZW50LCBNbmdGb3JtRXZlbnRUeXBlRW51bSwgTW5nRm9ybUZpZWxkRXZlbnRDb21wb25lbnRTdWJ0eXBlfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnbW5nLWZvcm0tZWRpdG9yJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIGltcG9ydHM6IFtGb3JtbHlNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE1lc3NhZ2VzTW9kdWxlLCBBc3luY1BpcGUsIEJ1dHRvbk1vZHVsZV0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTW5nRm9ybUVkaXRvckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIElGb3JtRWRpdG9yQ29tcG9uZW50PFQ+LCBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgICAvLyBtZXRhZGF0YSBhbmQgZWRpdG9yIG1vZGUgaW5wdXRcbiAgICBASW5wdXQoKSBwdWJsaWMgZGVzY3JpcHRvcj86IEVkaXRvckRlc2NyaXB0b3I8VD47XG4gICAgQElucHV0KCkgcHVibGljIHN1Ym1pdExvYWRpbmc6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBkYXRhIHNvdXJjZSBpbnB1dHM7XG4gICAgQElucHV0KCkgcHVibGljIGl0ZW0/OiBUO1xuICAgIEBJbnB1dCgndmlld0NvbnRhaW5lcicpIHB1YmxpYyB2aWV3Q29udGFpbmVySW5pdD86IElWaWV3Q29udGFpbmVyPFQsIHVua25vd24+O1xuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxJVmlld0NvbnRhaW5lcjxULCB1bmtub3duPj4oMSk7XG4gICAgcHVibGljIHZpZXdDb250YWluZXIkID0gdGhpcy52aWV3Q29udGFpbmVyU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIC8vIGV4dHJhIGZlYXR1cmVzIGlucHV0XG4gICAgQElucHV0KCkgcHVibGljIGlzRm9ybURpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvLyBldmVudCBvdXRwdXRzXG4gICAgQE91dHB1dCgnZm9ybVN1Ym1pdCcpIHB1YmxpYyBmb3JtU3VibWl0RXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxNbmdGb3JtRWRpdG9yU3VibWl0RXZlbnQ8VD4+KCk7XG5cbiAgICAvLyBjb250ZW50IGFuZCB2aWV3IHF1ZXJpZXNcbiAgICBAQ29udGVudENoaWxkcmVuKE1uZ1RlbXBsYXRlRGlyZWN0aXZlKSBwdWJsaWMgdGVtcGxhdGVzITogUXVlcnlMaXN0PE1uZ1RlbXBsYXRlRGlyZWN0aXZlPjtcbiAgICBAVmlld0NoaWxkKCdzdWJtaXRCdXR0b24nKSBwdWJsaWMgc3VibWl0QnV0dG9uRWxlbWVudFJlZj86IEVsZW1lbnRSZWY7XG5cbiAgICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgcHVibGljIGZvcm1PcHRpb25zOiBGb3JtbHlGb3JtT3B0aW9ucyA9IHtcbiAgICAgICAgZm9ybVN0YXRlOiB7XG4gICAgICAgICAgICBhZGQ6IGZhbHNlLFxuICAgICAgICAgICAgZWRpdDogZmFsc2UsXG4gICAgICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgICAgfVxuICAgIH07XG4gICAgcHVibGljIGZvcm1GaWVsZHMhOiBGb3JtbHlGaWVsZENvbmZpZ1tdO1xuICAgIHB1YmxpYyBmb3JtTW9kZWw6IGFueSA9IHt9O1xuICAgIHB1YmxpYyBmb3JtTWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuICAgIHB1YmxpYyBzdWJtaXRMb2FkaW5nJCE6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHJpdmF0ZSBvcmlnaW5hbEl0ZW1Qcm90b3R5cGU/OiBUeXBlPFQ+O1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBtbmdDb21tb25zU2VydmljZTogTW5nQ29tbW9uc1NlcnZpY2UsIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSkge31cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsRm9ybVN0YXRlKCk7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtTW9kZWwodGhpcy5pdGVtKTtcbiAgICAgICAgdGhpcy5zdWJtaXRMb2FkaW5nJCA9IHRoaXMuc3VibWl0TG9hZGluZyBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyB0aGlzLnN1Ym1pdExvYWRpbmcgOiBvZih0aGlzLnN1Ym1pdExvYWRpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLmRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIC8vIGluaXQgZmllbGRzIGZvciBmb3JtbHlcbiAgICAgICAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IEVkaXRvckZvcm1seVV0aWwuY3JlYXRlRm9ybWx5Q29uZmlnRnJvbURlc2NyaXB0b3IodGhpcy5kZXNjcmlwdG9yLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybVN0YXRlKCk7XG5cbiAgICAgICAgICAgIC8vIGxldCB0aGUgdXNlciBrbm93LCB0aGF0IGFkZGluZyBuZXcgdmFsdWUgaW4gdGFibGUgdmlldyB3aXRoIGxvY2FsaXphdGlvbnMgaXMgb25seSBzdXBwb3J0ZWQgaW4gdGhlIGRlZmF1bHQgbGFuZ3VhZ2VcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IuaXNMb2NhbGl6ZWQgJiZcbiAgICAgICAgICAgICAgICAodGhpcy5kZXNjcmlwdG9yLnRhYmxldmlld0VkaXRvclR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkFkZCB8fCB0aGlzLmRlc2NyaXB0b3IudGFibGV2aWV3RWRpdG9yVHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRWRpdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybU1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblV0aWwuZ2V0Rm9ybUVkaXRvckluZm9NZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21uZ0VkaXRvci5sb2NhbGl6YXRpb25zLmFkZEluRGVmYXVsdExhbmd1YWdlVGl0bGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21uZ0VkaXRvci5sb2NhbGl6YXRpb25zLmFkZEluRGVmYXVsdExhbmd1YWdlRGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAge2RlZmF1bHRMYW5ndWFnZTogdGhpcy5tbmdDb21tb25zU2VydmljZS5kZWZhdWx0RGF0YUxhbmd1YWdlfVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVtaXQgbGlmZWN5Y2xlIGV2ZW50XG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8ubmV4dEV2ZW50KE1uZ0Zvcm1FdmVudFR5cGVFbnVtLkNvbXBvbmVudExpZmVjeWNsZSwgTW5nRm9ybUVkaXRvckNvbXBvbmVudCwgdGhpcywge1xuICAgICAgICAgICAgZXZlbnRTdWJ0eXBlOiBNbmdGb3JtRmllbGRFdmVudENvbXBvbmVudFN1YnR5cGUuT05fSU5JVFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMjUwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSkuc3Vic2NyaWJlKHYgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcj8ubmV4dEV2ZW50KE1uZ0Zvcm1FdmVudFR5cGVFbnVtLlZhbHVlQ2hhbmdlLCBNbmdGb3JtRWRpdG9yQ29tcG9uZW50LCB0aGlzLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2LFxuICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWU6ICgpID0+IHRoaXMuZ2V0Rm9ybVZhbHVlKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlc1sndmlld0NvbnRhaW5lckluaXQnXSAmJiAhY2hhbmdlc1sndmlld0NvbnRhaW5lckluaXQnXS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyU3ViamVjdC5uZXh0KGNoYW5nZXNbJ3ZpZXdDb250YWluZXJJbml0J10gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1snaXNGb3JtRGlzYWJsZWQnXSAmJiAhY2hhbmdlc1snaXNGb3JtRGlzYWJsZWQnXS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1snaXRlbSddICYmICFjaGFuZ2VzWydpdGVtJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtTW9kZWwodGhpcy5pdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuXG4gICAgICAgIC8vIGVtaXQgbGlmZWN5Y2xlIGV2ZW50XG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8ubmV4dEV2ZW50KE1uZ0Zvcm1FdmVudFR5cGVFbnVtLkNvbXBvbmVudExpZmVjeWNsZSwgTW5nRm9ybUVkaXRvckNvbXBvbmVudCwgdGhpcywge1xuICAgICAgICAgICAgZXZlbnRTdWJ0eXBlOiBNbmdGb3JtRmllbGRFdmVudENvbXBvbmVudFN1YnR5cGUuT05fREVTVFJPWVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gY29tcGxldGUgZW1pdHRpbmcgZXZlbnRzXG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8uY29tcGxldGVFdmVudHMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3VibWl0KCkge1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbkVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIG9uU3VibWl0KGV2ZW50OiBFdmVudCkge1xuICAgICAgICB0aGlzLmZvcm1PcHRpb25zLmZvcm1TdGF0ZS5zdWJtaXR0ZWRPbiA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuZm9ybU1lc3NhZ2VzID0gW107XG5cbiAgICAgICAgY29uc3QgZm9ybVN1Ym1pdEl0ZW0gPSB0aGlzLmdldEZvcm1WYWx1ZSgpO1xuICAgICAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1TdWJtaXRFdmVudEVtaXR0ZXIubmV4dChuZXcgTW5nRm9ybUVkaXRvclN1Ym1pdEV2ZW50KGZvcm1TdWJtaXRJdGVtKSk7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3I/Lm5leHRFdmVudChNbmdGb3JtRXZlbnRUeXBlRW51bS5TdWJtaXQsIE1uZ0Zvcm1FZGl0b3JDb21wb25lbnQsIHRoaXMsIHtcbiAgICAgICAgICAgICAgICBzdWJtaXRWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzdWJtaXRWYWx1ZTogZm9ybVN1Ym1pdEl0ZW1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZmluZCBhbmQgbWFyayBpbnZhbGlkIHRhYnNcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1GaWVsZHNbMF0udHlwZSA9PT0gJ3RhYnMnICYmIHRoaXMuZm9ybUZpZWxkc1swXS5maWVsZEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWIgb2YgdGhpcy5mb3JtRmllbGRzWzBdLmZpZWxkR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkID0gdGhpcy5pc0FueUZpZWxkSW52YWxpZCh0YWIuZmllbGRHcm91cCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybU9wdGlvbnMuZm9ybVN0YXRlWyd0YWJfJyArICh0YWIuaWQgPyB0YWIuaWQgOiAodGFiLnByb3BzIGFzIE1uZ0Zvcm1seUZpZWxkQ29uZmlnKS5wcm9wcy5sYWJlbCkgKyAnX2ludmFsaWQnXSA9IGlzSW52YWxpZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBNbmdGb3JtRWRpdG9yU3VibWl0RXZlbnQoZm9ybVN1Ym1pdEl0ZW0pO1xuICAgICAgICAgICAgZXZlbnQuc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5mb3JtTWVzc2FnZXMucHVzaChOb3RpZmljYXRpb25VdGlsLmdldEZvcm1FZGl0b3JXYXJuaW5nTWVzc2FnZSh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UsICdtbmdFZGl0b3IuaW52YWxpZEZvcm1Ub2FzdFRpdGxlJywgJ21uZ0VkaXRvci5pbnZhbGlkRm9ybVRvYXN0TWVzc2FnZScpKTtcblxuICAgICAgICAgICAgdGhpcy5mb3JtU3VibWl0RXZlbnRFbWl0dGVyLm5leHQoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yPy5uZXh0RXZlbnQoTW5nRm9ybUV2ZW50VHlwZUVudW0uU3VibWl0LCBNbmdGb3JtRWRpdG9yQ29tcG9uZW50LCB0aGlzLCB7XG4gICAgICAgICAgICAgICAgc3VibWl0VmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHN1Ym1pdFZhbHVlOiBmb3JtU3VibWl0SXRlbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Rm9ybVZhbHVlKCk6IFQge1xuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSBPYmplY3RVdGlsLmRlZXBDb3B5T2JqZWN0KHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpLCB7bWFwR2V0dGVyc1RvUHJvcGVydGllczogdHJ1ZX0pO1xuXG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8uZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLnNldHRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0UGF0aCA9IGZpZWxkLnByb3BlcnR5LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgbGV0IGZpZWxkVmFsdWUgPSBmb3JtVmFsdWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdFBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdWJQYXRoID0gc3BsaXRQYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWVbY3VycmVudFN1YlBhdGhdICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZVtjdXJyZW50U3ViUGF0aF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlW2N1cnJlbnRTdWJQYXRoXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gZmllbGRWYWx1ZVtzcGxpdFBhdGhbc3BsaXRQYXRoLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgICAgICAgICBmaWVsZC5zZXR0ZXIoZm9ybVZhbHVlLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmb3JtVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0Rm9ybU1vZGVsKGl0ZW0/OiBUKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxJdGVtUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybU1vZGVsID0gKE9iamVjdFV0aWwuZGVlcENvcHlPYmplY3QoaXRlbSwge21hcEdldHRlcnNUb1Byb3BlcnRpZXM6IHRydWV9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA/PyB7fTtcblxuICAgICAgICB0aGlzLmRlc2NyaXB0b3I/LmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5nZXR0ZXIgJiYgaXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0UGF0aCA9IGZpZWxkLnByb3BlcnR5LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRPYmplY3QgPSBmb3JtTW9kZWw7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0UGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U3ViUGF0aCA9IHNwbGl0UGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IHNwbGl0UGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0W2N1cnJlbnRTdWJQYXRoXSA9IGZpZWxkLmdldHRlcihpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdCA9IGN1cnJlbnRPYmplY3RbY3VycmVudFN1YlBhdGhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZvcm1PcHRpb25zLnJlc2V0TW9kZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGNvdWxkIG5vdCBiZSBpbml0aWF0ZWQgeWV0XG4gICAgICAgICAgICB0aGlzLmZvcm1PcHRpb25zLnJlc2V0TW9kZWwodGhpcy5mb3JtTW9kZWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybU1vZGVsID0gZm9ybU1vZGVsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtRmllbGQoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZvcm1GaWVsZCh0aGlzLmZvcm0sIGtleS5zcGxpdCgnLicpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Rm9ybUZpZWxkVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZ2V0Rm9ybUZpZWxkKGtleSk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBWYWx1ZSB3YXMgbm90IHNldCwgYmVjYXVzZSBmaWVsZCAke2tleX0gd2FzIG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaEZvcm1GaWVsZFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmdldEZvcm1GaWVsZChrZXkpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBWYWx1ZSB3YXMgbm90IHNldCwgYmVjYXVzZSBmaWVsZCAke2tleX0gd2FzIG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZXNldEZvcm1GaWVsZFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZT86IGFueSkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5nZXRGb3JtRmllbGQoa2V5KTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wucmVzZXQodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFZhbHVlIHdhcyBub3Qgc2V0LCBiZWNhdXNlIGZpZWxkICR7a2V5fSB3YXMgbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRm9ybUZpZWxkKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwga2V5UGF0aDogc3RyaW5nW10pOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICAgICAgaWYgKGtleVBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udHJvbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5UGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250cm9sLmdldChrZXlQYXRoWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dENvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgICAgbmV4dENvbnRyb2wgPSBjb250cm9sLmdldChrZXlQYXRoWzBdKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSAra2V5UGF0aFswXTtcbiAgICAgICAgICAgIGlmICghaXNOYU4oaWR4KSkge1xuICAgICAgICAgICAgICAgIG5leHRDb250cm9sID0gY29udHJvbC5hdChpZHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5maW5kRm9ybUZpZWxkKG5leHRDb250cm9sISwga2V5UGF0aC5zbGljZSgxKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0FueUZpZWxkSW52YWxpZChmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXSk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgbGV0IGZpZWxkSW52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuZmllbGRHcm91cCkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZEludmFsaWQgPSB0aGlzLmlzQW55RmllbGRJbnZhbGlkKGZpZWxkLmZpZWxkR3JvdXApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGQudHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBmaWVsZEludmFsaWQgPSAhZmllbGQuZm9ybUNvbnRyb2w/LnZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUZvcm1TdGF0ZSgpIHtcbiAgICAgICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaXNGb3JtRGlzYWJsZWQgfHwgdGhpcy5kZXNjcmlwdG9yPy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fCB0aGlzLmRlc2NyaXB0b3I/LnRhYmxldmlld0VkaXRvclR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkRldGFpbHM7XG4gICAgICAgIHRoaXMuZm9ybU9wdGlvbnMuZm9ybVN0YXRlLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZSBTZXRzIGZvcm0gc3RhdGUgYmFzZWQgb24gZWRpdG9yIGRlc2NyaXB0b3IgdHlwZS5cbiAgICAgKiBQb3NzaWJsZSBvcHRpb25zIGFyZTogZGlzYWJsZWQsIGFkZCBvciBlZGl0LlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0SW5pdGlhbEZvcm1TdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcj8udGFibGV2aWV3RWRpdG9yVHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uQWRkKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1PcHRpb25zLmZvcm1TdGF0ZS5hZGQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVzY3JpcHRvcj8udGFibGV2aWV3RWRpdG9yVHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRWRpdCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtT3B0aW9ucy5mb3JtU3RhdGUuZWRpdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVGb3JtU3RhdGUoKTtcbiAgICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiPlxuICAgIDxmb3JtbHktZm9ybSBbZm9ybV09XCJmb3JtXCIgW2ZpZWxkc109XCJmb3JtRmllbGRzXCIgW29wdGlvbnNdPVwiZm9ybU9wdGlvbnNcIiBbbW9kZWxdPVwiZm9ybU1vZGVsXCI+PC9mb3JtbHktZm9ybT5cbiAgICA8YnV0dG9uICNzdWJtaXRCdXR0b24gcEJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJoaWRkZW5cIiBbZGlzYWJsZWRdPVwiZm9ybS5kaXNhYmxlZFwiIFtsb2FkaW5nXT1cIihzdWJtaXRMb2FkaW5nJCB8IGFzeW5jKSA/PyBmYWxzZVwiPjwvYnV0dG9uPlxuPC9mb3JtPlxuPHAtbWVzc2FnZXMgW3ZhbHVlXT1cImZvcm1NZXNzYWdlc1wiIFtlbmFibGVTZXJ2aWNlXT1cImZhbHNlXCI+PC9wLW1lc3NhZ2VzPlxuIl19
|