@mediusinc/mng-commons 6.0.0-rc.5 → 6.0.0-rc.6
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/core/components/notification/notification-wrapper.component.d.ts +4 -4
- package/core/error/error.model.d.ts +4 -4
- package/core/helpers/notification.d.ts +2 -2
- package/core/provide.d.ts +3 -3
- package/core/styles/style-constants.d.ts +9 -8
- package/core/styles/style.model.d.ts +2 -1
- package/fesm2022/mediusinc-mng-commons-core.mjs +91 -104
- package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form-api.mjs +8 -9
- package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form.mjs +149 -49
- package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-DTSBP9WQ.mjs +31 -0
- package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-DTSBP9WQ.mjs.map +1 -0
- package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-JZpyiDIL.mjs +2118 -0
- package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-JZpyiDIL.mjs.map +1 -0
- package/fesm2022/mediusinc-mng-commons-table.mjs +1 -2154
- package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +97 -49
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview.mjs +326 -290
- package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
- package/form/api/index.d.ts +1 -0
- package/form/api/models/empty-value.model.d.ts +7 -0
- package/form/components/autocomplete/autocomplete.component.d.ts +1 -2
- package/form/components/date-range/date-range.component.d.ts +4 -3
- package/form/components/dropdown/dropdown.component.d.ts +3 -2
- package/form/components/number-range/number-range.component.d.ts +3 -2
- package/form/directives/input-empty-value.directive.d.ts +40 -0
- package/form/directives/input-trim.directive.d.ts +3 -5
- package/form/index.d.ts +1 -0
- package/i18n/en.json +57 -8
- package/i18n/sl.json +1 -3
- package/package.json +16 -42
- package/provide.d.ts +2 -2
- package/table/components/column-toggle/column-toggle.component.d.ts +12 -0
- package/table/components/filter/filter-form/filter-form.component.d.ts +2 -2
- package/table/components/table/table.component.d.ts +0 -1
- package/table/helpers/filters.d.ts +3 -2
- package/table/helpers/notification.d.ts +2 -2
- package/table/services/table-metadata.service.d.ts +3 -3
- package/tableview/action/components/action/action.component.d.ts +1 -0
- package/tableview/action/components/editor/action-editor.component.d.ts +1 -1
- package/tableview/action/components/table/action-table.component.d.ts +2 -1
- package/tableview/action/helpers/notification.d.ts +3 -3
- package/tableview/action/models/execution/action-context.model.d.ts +2 -2
- package/tableview/action/services/action-executor.service.d.ts +1 -1
- package/tableview/api/action/models/execution/action-context.model.d.ts +2 -2
- package/tableview/api/editor/descriptors/editor.descriptor.d.ts +5 -0
- package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +14 -10
- package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +10 -0
- package/tableview/api/editor/descriptors/field.descriptor.d.ts +36 -9
- package/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.d.ts +1 -1
- package/tableview/api/editor/models/field-action-context.model.d.ts +1 -1
- package/tableview/api/editor/models/field.model.d.ts +1 -2
- package/tableview/api/editor/models/form-editor.interface.d.ts +2 -2
- package/tableview/api/editor/models/formly-custom-field.model.d.ts +1 -1
- package/tableview/api/editor/models/formly-field.model.d.ts +2 -2
- package/tableview/editor/components/editor/form-editor.component.d.ts +2 -2
- package/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.d.ts +1 -1
- package/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.d.ts +2 -1
- package/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +4 -6
- package/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +0 -2
- package/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +2 -2
- package/tableview/editor/components/formly/fields/formly-field-type.abstract.component.d.ts +8 -15
- package/tableview/editor/components/formly/fields/formly-group-type.abstract.component.d.ts +7 -0
- package/tableview/editor/components/formly/fields/formly-type.abstract.component.d.ts +20 -0
- package/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +11 -4
- package/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +2 -1
- package/tableview/editor/helpers/formly-config.d.ts +1 -1
- package/tableview/editor/helpers/notification.d.ts +3 -3
- package/tableview/editor/models/formly-config.model.d.ts +10 -1
- package/tableview/editor/models/formly.model.d.ts +23 -0
- package/tableview/editor/services/form-editor.service.d.ts +2 -2
- package/tableview/tableview/router/tableview-route-builder.d.ts +10 -3
- package/tableview/tableview/services/tableview-feature-config.token.d.ts +1 -1
- package/version-info.json +3 -3
- package/esm2022/core/action/action-data.model.mjs +0 -2
- package/esm2022/core/action/action-parameters.model.mjs +0 -2
- package/esm2022/core/components/notification/notification-wrapper.component.mjs +0 -50
- package/esm2022/core/data-list/data-list-params-helpers.mjs +0 -465
- package/esm2022/core/data-list/data-list.model.mjs +0 -2
- package/esm2022/core/data-list/filter-match.model.mjs +0 -105
- package/esm2022/core/data-list/filter-metadata.model.mjs +0 -2
- package/esm2022/core/data-providers/base.data-provider.mjs +0 -16
- package/esm2022/core/data-providers/lookup.data-provider.mjs +0 -2
- package/esm2022/core/descriptors/action.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/column.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/editor.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/enum.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/filter.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/lookup.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/model.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/table.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/tableview.descriptor.mjs +0 -2
- package/esm2022/core/directives/component.directive.mjs +0 -75
- package/esm2022/core/directives/rerender.directive.mjs +0 -25
- package/esm2022/core/directives/template.directive.mjs +0 -29
- package/esm2022/core/enum/enum-helpers.mjs +0 -90
- package/esm2022/core/enum/enum.model.mjs +0 -2
- package/esm2022/core/error/error-handler.mjs +0 -20
- package/esm2022/core/error/error-helpers.mjs +0 -273
- package/esm2022/core/error/error.model.mjs +0 -33
- package/esm2022/core/helpers/coercion.mjs +0 -55
- package/esm2022/core/helpers/date.mjs +0 -119
- package/esm2022/core/helpers/notification.mjs +0 -21
- package/esm2022/core/helpers/number.mjs +0 -19
- package/esm2022/core/helpers/object.mjs +0 -152
- package/esm2022/core/helpers/route.mjs +0 -58
- package/esm2022/core/helpers/string.mjs +0 -57
- package/esm2022/core/helpers/templates.mjs +0 -4
- package/esm2022/core/helpers/type-helpers.mjs +0 -2
- package/esm2022/core/i18n/i18n-common.mjs +0 -24
- package/esm2022/core/i18n/i18n-error.mjs +0 -29
- package/esm2022/core/i18n/i18n-type.mjs +0 -46
- package/esm2022/core/index.mjs +0 -107
- package/esm2022/core/log/log-publisher-console.service.mjs +0 -40
- package/esm2022/core/log/log.model.mjs +0 -10
- package/esm2022/core/log/logger.service.mjs +0 -131
- package/esm2022/core/mediusinc-mng-commons-core.mjs +0 -5
- package/esm2022/core/models/class-attribute.model.mjs +0 -2
- package/esm2022/core/models/class-service.model.mjs +0 -2
- package/esm2022/core/models/getter.model.mjs +0 -2
- package/esm2022/core/models/i18n.model.mjs +0 -2
- package/esm2022/core/models/menu.model.mjs +0 -2
- package/esm2022/core/models/user.model.mjs +0 -2
- package/esm2022/core/models/version.model.mjs +0 -2
- package/esm2022/core/pipes/boolean.pipe.mjs +0 -34
- package/esm2022/core/pipes/class-map.pipe.mjs +0 -23
- package/esm2022/core/pipes/enum.pipe.mjs +0 -38
- package/esm2022/core/pipes/enumerate-async.pipe.mjs +0 -36
- package/esm2022/core/pipes/enumerate.pipe.mjs +0 -49
- package/esm2022/core/pipes/getter.pipe.mjs +0 -21
- package/esm2022/core/pipes/i18n-property.pipe.mjs +0 -19
- package/esm2022/core/pipes/json-path.pipe.mjs +0 -25
- package/esm2022/core/pipes/parametrize.pipe.mjs +0 -86
- package/esm2022/core/pipes/template.pipe.mjs +0 -25
- package/esm2022/core/provide.mjs +0 -79
- package/esm2022/core/reactivity/effect.mjs +0 -22
- package/esm2022/core/reflect/type-enum-decorator.mjs +0 -12
- package/esm2022/core/reflect/type-enum-metadata.mjs +0 -62
- package/esm2022/core/registry/registry.model.mjs +0 -2
- package/esm2022/core/registry/type-registry.mjs +0 -106
- package/esm2022/core/router/route-builder.mjs +0 -431
- package/esm2022/core/router/router.model.mjs +0 -2
- package/esm2022/core/router/routes-builder.mjs +0 -52
- package/esm2022/core/rxjs/map-data-list-result-operator.mjs +0 -22
- package/esm2022/core/security/permission-helpers.mjs +0 -14
- package/esm2022/core/security/permission.guard.mjs +0 -15
- package/esm2022/core/security/permission.service.mjs +0 -101
- package/esm2022/core/security/permissions.model.mjs +0 -93
- package/esm2022/core/services/commons-configuration.service.mjs +0 -189
- package/esm2022/core/services/commons-init.service.mjs +0 -111
- package/esm2022/core/services/commons-router.service.mjs +0 -181
- package/esm2022/core/services/commons-storage.service.mjs +0 -31
- package/esm2022/core/services/commons.service.mjs +0 -324
- package/esm2022/core/services/providers/commons-init.provider.mjs +0 -4
- package/esm2022/core/services/tokens/browser-storage.token.mjs +0 -3
- package/esm2022/core/services/tokens/commons-init.token.mjs +0 -3
- package/esm2022/core/services/tokens/log-publisher.token.mjs +0 -3
- package/esm2022/core/services/tokens/module-config.token.mjs +0 -3
- package/esm2022/core/styles/style-constants.mjs +0 -11
- package/esm2022/core/styles/style.model.mjs +0 -20
- package/esm2022/filter/descriptors/filter-generic.descriptor.mjs +0 -31
- package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +0 -168
- package/esm2022/filter/descriptors/filter.descriptor.mjs +0 -421
- package/esm2022/filter/index.mjs +0 -8
- package/esm2022/filter/mediusinc-mng-commons-filter.mjs +0 -5
- package/esm2022/filter/models/filter-generic-property.model.mjs +0 -2
- package/esm2022/filter/models/filter.model.mjs +0 -20
- package/esm2022/form/api/data-providers/lookup-data-provider.factory.mjs +0 -15
- package/esm2022/form/api/data-providers/lookup.data-provider.mjs +0 -15
- package/esm2022/form/api/descriptors/action-button.descriptor.mjs +0 -56
- package/esm2022/form/api/descriptors/button-style.builder.mjs +0 -153
- package/esm2022/form/api/index.mjs +0 -10
- package/esm2022/form/api/mediusinc-mng-commons-form-api.mjs +0 -5
- package/esm2022/form/api/models/button.model.mjs +0 -2
- package/esm2022/form/api/models/trim.model.mjs +0 -2
- package/esm2022/form/components/autocomplete/autocomplete.component.mjs +0 -436
- package/esm2022/form/components/date-range/date-range.component.mjs +0 -147
- package/esm2022/form/components/dropdown/dropdown.component.mjs +0 -372
- package/esm2022/form/components/number-range/number-range.component.mjs +0 -123
- package/esm2022/form/directives/input-trim.directive.mjs +0 -50
- package/esm2022/form/index.mjs +0 -8
- package/esm2022/form/mediusinc-mng-commons-form.mjs +0 -5
- package/esm2022/index.mjs +0 -2
- package/esm2022/mediusinc-mng-commons.mjs +0 -5
- package/esm2022/model/class/data-providers/base-from-class-data-provider.factory.mjs +0 -5
- package/esm2022/model/class/descriptors/model-class.descriptor.mjs +0 -28
- package/esm2022/model/class/descriptors/type-class.descriptor.mjs +0 -6
- package/esm2022/model/class/helpers/model.mjs +0 -53
- package/esm2022/model/class/index.mjs +0 -8
- package/esm2022/model/class/mediusinc-mng-commons-model-class.mjs +0 -5
- package/esm2022/model/data-providers/base-from-type-data-provider.factory.mjs +0 -13
- package/esm2022/model/descriptors/enum.descriptor.mjs +0 -28
- package/esm2022/model/descriptors/model.descriptor.mjs +0 -53
- package/esm2022/model/descriptors/type.descriptor.mjs +0 -7
- package/esm2022/model/helpers/i18n.mjs +0 -47
- package/esm2022/model/index.mjs +0 -9
- package/esm2022/model/mediusinc-mng-commons-model.mjs +0 -5
- package/esm2022/provide.mjs +0 -6
- package/esm2022/table/api/class/class-table-attribute-converter.mjs +0 -80
- package/esm2022/table/api/class/class-table-attribute.model.mjs +0 -2
- package/esm2022/table/api/class/class-table-data-provider.factory.mjs +0 -5
- package/esm2022/table/api/class/class-table-descriptor-helpers.mjs +0 -99
- package/esm2022/table/api/class/class-table-descriptor.factory.mjs +0 -21
- package/esm2022/table/api/class/index.mjs +0 -6
- package/esm2022/table/api/class/mediusinc-mng-commons-table-api-class.mjs +0 -5
- package/esm2022/table/api/data-providers/table-data-provider.factory.mjs +0 -15
- package/esm2022/table/api/data-providers/table.data-provider.mjs +0 -33
- package/esm2022/table/api/descriptors/column.descriptor.mjs +0 -475
- package/esm2022/table/api/descriptors/sort.descriptor.mjs +0 -67
- package/esm2022/table/api/descriptors/table-descriptor.factory.mjs +0 -22
- package/esm2022/table/api/descriptors/table.descriptor.mjs +0 -1116
- package/esm2022/table/api/helpers/column-converter.mjs +0 -25
- package/esm2022/table/api/helpers/table-data-provider-descriptor-convert.mjs +0 -7
- package/esm2022/table/api/index.mjs +0 -19
- package/esm2022/table/api/mediusinc-mng-commons-table-api.mjs +0 -5
- package/esm2022/table/api/models/column-value.model.mjs +0 -2
- package/esm2022/table/api/models/column.model.mjs +0 -21
- package/esm2022/table/api/models/row-expandable-component.model.mjs +0 -2
- package/esm2022/table/api/models/table-columns.model.mjs +0 -2
- package/esm2022/table/api/models/table-event.model.mjs +0 -2
- package/esm2022/table/api/models/table.model.mjs +0 -21
- package/esm2022/table/components/column-filter/column-filter.component.mjs +0 -389
- package/esm2022/table/components/column-value/column-value.component.mjs +0 -78
- package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +0 -55
- package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +0 -226
- package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +0 -219
- package/esm2022/table/components/table/table.component.mjs +0 -319
- package/esm2022/table/helpers/filters.mjs +0 -312
- package/esm2022/table/helpers/notification.mjs +0 -21
- package/esm2022/table/helpers/table-layout-prefs.mjs +0 -10
- package/esm2022/table/helpers/table.mjs +0 -24
- package/esm2022/table/index.mjs +0 -24
- package/esm2022/table/mediusinc-mng-commons-table.mjs +0 -5
- package/esm2022/table/models/column-preferences.model.mjs +0 -2
- package/esm2022/table/models/filter.model.mjs +0 -2
- package/esm2022/table/pipes/filter-value.pipe.mjs +0 -77
- package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +0 -27
- package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +0 -25
- package/esm2022/table/provide.mjs +0 -19
- package/esm2022/table/services/table-data.service.mjs +0 -194
- package/esm2022/table/services/table-feature-config.token.mjs +0 -3
- package/esm2022/table/services/table-metadata.service.mjs +0 -136
- package/esm2022/table/services/table-preferences.service.mjs +0 -142
- package/esm2022/tableview/action/components/action/action.component.mjs +0 -277
- package/esm2022/tableview/action/components/editor/action-editor.component.mjs +0 -86
- package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +0 -428
- package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +0 -35
- package/esm2022/tableview/action/components/route/action-route.component.mjs +0 -146
- package/esm2022/tableview/action/components/table/action-table.component.mjs +0 -102
- package/esm2022/tableview/action/guards/unsaved-changes.guard.mjs +0 -4
- package/esm2022/tableview/action/helpers/action-execution.mjs +0 -25
- package/esm2022/tableview/action/helpers/i18n.mjs +0 -102
- package/esm2022/tableview/action/helpers/notification.mjs +0 -78
- package/esm2022/tableview/action/helpers/styles.mjs +0 -32
- package/esm2022/tableview/action/models/action-editor-dialog-data.model.mjs +0 -2
- package/esm2022/tableview/action/models/can-component-deactivate.model.mjs +0 -2
- package/esm2022/tableview/action/models/execution/action-context.model.mjs +0 -64
- package/esm2022/tableview/action/models/execution/action-instance.model.mjs +0 -169
- package/esm2022/tableview/action/services/action-error-mapper.service.mjs +0 -20
- package/esm2022/tableview/action/services/action-executor.service.mjs +0 -772
- package/esm2022/tableview/action/services/component-action-executor.service.mjs +0 -19
- package/esm2022/tableview/action/services/data-provider-executor.service.mjs +0 -41
- package/esm2022/tableview/action/services/navigation.service.mjs +0 -53
- package/esm2022/tableview/action/services/providers/provide-action-executor.mjs +0 -9
- package/esm2022/tableview/action/services/providers/provide-view-container.mjs +0 -17
- package/esm2022/tableview/action/services/root-action-executor.service.mjs +0 -18
- package/esm2022/tableview/action/services/tokens/action-editor.token.mjs +0 -3
- package/esm2022/tableview/action/services/view-container.service.mjs +0 -40
- package/esm2022/tableview/api/action/descriptors/action-descriptor.factory.mjs +0 -28
- package/esm2022/tableview/api/action/descriptors/action-editor-descriptor.factory.mjs +0 -30
- package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +0 -223
- package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +0 -32
- package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +0 -74
- package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +0 -302
- package/esm2022/tableview/api/action/descriptors/editor-action-descriptor.factory.mjs +0 -21
- package/esm2022/tableview/api/action/descriptors/editor-action-editor-descriptor.factory.mjs +0 -21
- package/esm2022/tableview/api/action/descriptors/table-action-descriptor.factory.mjs +0 -37
- package/esm2022/tableview/api/action/descriptors/table-action-editor-descriptor.factory.mjs +0 -40
- package/esm2022/tableview/api/action/helpers/data-provider-executors.mjs +0 -100
- package/esm2022/tableview/api/action/models/action-component.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/action-confirmation.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/action-descriptor.types.mjs +0 -2
- package/esm2022/tableview/api/action/models/action-editor.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/action-error.model.mjs +0 -14
- package/esm2022/tableview/api/action/models/action.type.mjs +0 -26
- package/esm2022/tableview/api/action/models/execution/action-context-validation.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/execution/action-context.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/execution/action-execution-error.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/execution/action-instance-state.model.mjs +0 -32
- package/esm2022/tableview/api/action/models/execution/action-instance.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/execution/view-container.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/tableview-action-default-categories.model.mjs +0 -11
- package/esm2022/tableview/api/action/services/data-provider-executor.service.mjs +0 -28
- package/esm2022/tableview/api/action/services/tokens/data-language-dropdown.token.mjs +0 -3
- package/esm2022/tableview/api/class/editor/class-editor-attribute-converter.mjs +0 -85
- package/esm2022/tableview/api/class/editor/class-editor-attribute.model.mjs +0 -2
- package/esm2022/tableview/api/class/editor/class-editor-data-provider.factory.mjs +0 -5
- package/esm2022/tableview/api/class/editor/class-editor-descriptor-helpers.mjs +0 -95
- package/esm2022/tableview/api/class/editor/class-editor-descriptor.factory.mjs +0 -21
- package/esm2022/tableview/api/class/index.mjs +0 -13
- package/esm2022/tableview/api/class/mediusinc-mng-commons-tableview-api-class.mjs +0 -5
- package/esm2022/tableview/api/class/tableview/class-tableview-attribute-converter.mjs +0 -35
- package/esm2022/tableview/api/class/tableview/class-tableview-attribute.model.mjs +0 -2
- package/esm2022/tableview/api/class/tableview/class-tableview-data-provider.factory.mjs +0 -5
- package/esm2022/tableview/api/class/tableview/class-tableview-descriptor-helpers.mjs +0 -111
- package/esm2022/tableview/api/class/tableview/class-tableview-descriptor.factory.mjs +0 -26
- package/esm2022/tableview/api/editor/data-providers/editor-data-provider.factory.mjs +0 -15
- package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +0 -114
- package/esm2022/tableview/api/editor/descriptors/editor-descriptor.factory.mjs +0 -15
- package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +0 -437
- package/esm2022/tableview/api/editor/descriptors/field-action.descriptor.mjs +0 -51
- package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +0 -314
- package/esm2022/tableview/api/editor/descriptors/field-group.descriptor.mjs +0 -103
- package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +0 -211
- package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +0 -142
- package/esm2022/tableview/api/editor/descriptors/field-validation.descriptor.mjs +0 -25
- package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +0 -402
- package/esm2022/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.mjs +0 -51
- package/esm2022/tableview/api/editor/models/editor-fields.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/editor.model.mjs +0 -9
- package/esm2022/tableview/api/editor/models/field-action-context.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/field-image-preview.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/field-validation.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/field.model.mjs +0 -57
- package/esm2022/tableview/api/editor/models/form-editor.event.mjs +0 -28
- package/esm2022/tableview/api/editor/models/form-editor.interface.mjs +0 -2
- package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +0 -70
- package/esm2022/tableview/api/editor/models/formly-field.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/formly-options.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/radio.model.mjs +0 -2
- package/esm2022/tableview/api/index.mjs +0 -76
- package/esm2022/tableview/api/mediusinc-mng-commons-tableview-api.mjs +0 -5
- package/esm2022/tableview/api/tableview/data-providers/tableview-data-provider.factory.mjs +0 -18
- package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +0 -84
- package/esm2022/tableview/api/tableview/descriptors/tableview-descriptor.factory.mjs +0 -34
- package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +0 -377
- package/esm2022/tableview/api/tableview/helpers/files-export.mjs +0 -34
- package/esm2022/tableview/api/tableview/helpers/tableview-create.mjs +0 -26
- package/esm2022/tableview/api/tableview/helpers/tableview-data-provider-descriptor-convert.mjs +0 -7
- package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +0 -324
- package/esm2022/tableview/api/tableview/helpers/tableview-input-builder.mjs +0 -319
- package/esm2022/tableview/api/tableview/models/tableview-descriptor-fields-manage-helper.type.mjs +0 -2
- package/esm2022/tableview/api/tableview/models/tableview-descriptor-helper.type.mjs +0 -2
- package/esm2022/tableview/api/tableview/models/tableview-input.model.mjs +0 -2
- package/esm2022/tableview/api/tableview/models/tableview-route.model.mjs +0 -2
- package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +0 -82
- package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +0 -480
- package/esm2022/tableview/editor/components/formly/constants.mjs +0 -2
- package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +0 -66
- package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +0 -47
- package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +0 -39
- package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +0 -165
- package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +0 -42
- package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +0 -34
- package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +0 -211
- package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +0 -23
- package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +0 -195
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +0 -239
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +0 -205
- package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +0 -28
- package/esm2022/tableview/editor/components/formly/fields/formly-field-type.abstract.component.mjs +0 -46
- package/esm2022/tableview/editor/components/formly/pipes/formly-field-label.pipe.mjs +0 -19
- package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +0 -33
- package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +0 -59
- package/esm2022/tableview/editor/helpers/editor-autosave.mjs +0 -49
- package/esm2022/tableview/editor/helpers/editor-field.mjs +0 -39
- package/esm2022/tableview/editor/helpers/editor-formly.mjs +0 -388
- package/esm2022/tableview/editor/helpers/editor-validators.mjs +0 -25
- package/esm2022/tableview/editor/helpers/field-create.mjs +0 -21
- package/esm2022/tableview/editor/helpers/formly-config.mjs +0 -260
- package/esm2022/tableview/editor/helpers/notification.mjs +0 -11
- package/esm2022/tableview/editor/models/editor-auto-save-preview.model.mjs +0 -2
- package/esm2022/tableview/editor/models/formly-config.model.mjs +0 -2
- package/esm2022/tableview/editor/services/form-editor.service.mjs +0 -96
- package/esm2022/tableview/editor/services/formly-config.provider.mjs +0 -31
- package/esm2022/tableview/index.mjs +0 -67
- package/esm2022/tableview/mediusinc-mng-commons-tableview.mjs +0 -5
- package/esm2022/tableview/provide.mjs +0 -105
- package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +0 -15
- package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +0 -59
- package/esm2022/tableview/tableview/router/tableview-route-builder.mjs +0 -175
- package/esm2022/tableview/tableview/services/tableview-feature-config.token.mjs +0 -3
|
@@ -1,1116 +0,0 @@
|
|
|
1
|
-
import { CommonsInternalError, flattenObjectKeys } from '@mediusinc/mng-commons/core';
|
|
2
|
-
import { FilterDescriptor, FilterGenericDescriptor, FilterLookupDescriptor, FilterLookupEnumDescriptor, FilterTypeEnum } from '@mediusinc/mng-commons/filter';
|
|
3
|
-
import { columnToDateNumberOrBoolean } from '../helpers/column-converter';
|
|
4
|
-
import { ColumnTypeEnum } from '../models/column.model';
|
|
5
|
-
import { TableDynamicColumnsModeEnum, TableSizeEnum } from '../models/table.model';
|
|
6
|
-
import { ColumnDescriptor, ColumnDynamicDescriptor } from './column.descriptor';
|
|
7
|
-
import { SortDescriptor } from './sort.descriptor';
|
|
8
|
-
export class TableDescriptorInst {
|
|
9
|
-
constructor(model, autoGenerated = false) {
|
|
10
|
-
this._columns = [];
|
|
11
|
-
this._hideHeader = false;
|
|
12
|
-
this._loadingIcon = 'pi pi-spinner';
|
|
13
|
-
// extra
|
|
14
|
-
this._hasHover = true;
|
|
15
|
-
this._hasGridlines = false;
|
|
16
|
-
this._hasResizableColumns = false;
|
|
17
|
-
// styling
|
|
18
|
-
this._size = TableSizeEnum.Large;
|
|
19
|
-
this._className = '';
|
|
20
|
-
// filters&sorts
|
|
21
|
-
this._filters = [];
|
|
22
|
-
this._sorts = [];
|
|
23
|
-
// localization
|
|
24
|
-
this._isLocalized = false;
|
|
25
|
-
// row expand
|
|
26
|
-
this._rowExpandable = false;
|
|
27
|
-
this._rowExpandableColSpan = 100;
|
|
28
|
-
// row reorder
|
|
29
|
-
this._rowReorderable = false;
|
|
30
|
-
this._model = model;
|
|
31
|
-
this._trackProperty = this._model.idProperty;
|
|
32
|
-
this._autoGenerated = autoGenerated;
|
|
33
|
-
}
|
|
34
|
-
get identifier() {
|
|
35
|
-
return this._identifier;
|
|
36
|
-
}
|
|
37
|
-
get trackProperty() {
|
|
38
|
-
return this._trackProperty;
|
|
39
|
-
}
|
|
40
|
-
get paginationMode() {
|
|
41
|
-
return this._paginationMode;
|
|
42
|
-
}
|
|
43
|
-
get rowsPerPageOptions() {
|
|
44
|
-
return this._rowsPerPageOptions;
|
|
45
|
-
}
|
|
46
|
-
get defaultNumRows() {
|
|
47
|
-
return this._defaultNumRows;
|
|
48
|
-
}
|
|
49
|
-
get columns() {
|
|
50
|
-
return this._columns;
|
|
51
|
-
}
|
|
52
|
-
get title() {
|
|
53
|
-
return this._title;
|
|
54
|
-
}
|
|
55
|
-
get hideHeader() {
|
|
56
|
-
return this._hideHeader;
|
|
57
|
-
}
|
|
58
|
-
get loadingText() {
|
|
59
|
-
return this._loadingText;
|
|
60
|
-
}
|
|
61
|
-
get loadingIcon() {
|
|
62
|
-
return this._loadingIcon;
|
|
63
|
-
}
|
|
64
|
-
get filters() {
|
|
65
|
-
return this._filters;
|
|
66
|
-
}
|
|
67
|
-
get genericFilter() {
|
|
68
|
-
return this._genericFilter;
|
|
69
|
-
}
|
|
70
|
-
get sorts() {
|
|
71
|
-
return this._sorts;
|
|
72
|
-
}
|
|
73
|
-
get model() {
|
|
74
|
-
return this._model;
|
|
75
|
-
}
|
|
76
|
-
get search() {
|
|
77
|
-
return this._search;
|
|
78
|
-
}
|
|
79
|
-
get searchLimitMaxWords() {
|
|
80
|
-
return this._searchLimitMaxWords;
|
|
81
|
-
}
|
|
82
|
-
get searchFields() {
|
|
83
|
-
return this._searchFields;
|
|
84
|
-
}
|
|
85
|
-
get className() {
|
|
86
|
-
return this._className;
|
|
87
|
-
}
|
|
88
|
-
get size() {
|
|
89
|
-
return this._size;
|
|
90
|
-
}
|
|
91
|
-
get hasHover() {
|
|
92
|
-
return this._hasHover;
|
|
93
|
-
}
|
|
94
|
-
get hasGridlines() {
|
|
95
|
-
return this._hasGridlines;
|
|
96
|
-
}
|
|
97
|
-
get hasResizableColumns() {
|
|
98
|
-
return this._hasResizableColumns;
|
|
99
|
-
}
|
|
100
|
-
get columnResizeMode() {
|
|
101
|
-
return this._columnResizeMode;
|
|
102
|
-
}
|
|
103
|
-
get rowClassName() {
|
|
104
|
-
return this._rowClassName;
|
|
105
|
-
}
|
|
106
|
-
get rowClassNameMapFn() {
|
|
107
|
-
return this._rowClassNameMapFn;
|
|
108
|
-
}
|
|
109
|
-
get selectionColumnFrozen() {
|
|
110
|
-
return this._selectionColumnFrozen;
|
|
111
|
-
}
|
|
112
|
-
get actionColumnFrozen() {
|
|
113
|
-
return this._actionColumnFrozen;
|
|
114
|
-
}
|
|
115
|
-
get headerClassName() {
|
|
116
|
-
return this._headerClassName;
|
|
117
|
-
}
|
|
118
|
-
get isLocalized() {
|
|
119
|
-
return this._isLocalized;
|
|
120
|
-
}
|
|
121
|
-
get localizationLocaleProperty() {
|
|
122
|
-
return this._localizationLocaleProperty;
|
|
123
|
-
}
|
|
124
|
-
get rowReorderable() {
|
|
125
|
-
return this._rowReorderable;
|
|
126
|
-
}
|
|
127
|
-
get rowExpandable() {
|
|
128
|
-
return this._rowExpandable;
|
|
129
|
-
}
|
|
130
|
-
get rowExpandableColSpan() {
|
|
131
|
-
return this._rowExpandableColSpan;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* This table model property tells us if the specific row should be expandable or not based on row item value
|
|
135
|
-
*/
|
|
136
|
-
get rowExpandableProperty() {
|
|
137
|
-
return this._rowExpandableProperty;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* This table model property tells us when the table row should be expanded by default, without clicking on the toggle button.
|
|
141
|
-
*/
|
|
142
|
-
get isRowExpanded() {
|
|
143
|
-
return this._isRowExpanded;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* This property is used to define the type of the custom component that will be used to render the expanded row.
|
|
147
|
-
*/
|
|
148
|
-
get rowExpandableComponentType() {
|
|
149
|
-
return this._rowExpandableComponentType;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Identifier is used for the purpose of combined saving user preferences in localstorage if 2 tables have the same track properties they will share the same localstorage entry.
|
|
153
|
-
* Similarly, this property can also be used to differentiate two tables of the same model on the same url (so that they have separate entries in localstorage).
|
|
154
|
-
* @param identifier
|
|
155
|
-
*/
|
|
156
|
-
withIdentifier(identifier) {
|
|
157
|
-
this._identifier = identifier;
|
|
158
|
-
return this;
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Sets the track property (identifier of table row) for the table.
|
|
162
|
-
*
|
|
163
|
-
* @param {keyof TableModel} property - The property to track the row items by.
|
|
164
|
-
*/
|
|
165
|
-
withTrackProperty(property) {
|
|
166
|
-
return this.withTrackPropertyUnsafe(property);
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Sets the track property (identifier of table row) for the table.
|
|
170
|
-
*
|
|
171
|
-
* This function is UNSAFE!
|
|
172
|
-
*
|
|
173
|
-
* @param {string} property - The property to set '_trackProperty' to.
|
|
174
|
-
*/
|
|
175
|
-
withTrackPropertyUnsafe(property) {
|
|
176
|
-
this._trackProperty = property;
|
|
177
|
-
return this;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Retrieves the column descriptor for the given property.
|
|
181
|
-
*
|
|
182
|
-
* @param {keyof TableModel} property - The property for column descriptor.
|
|
183
|
-
*
|
|
184
|
-
* @return The column descriptor.
|
|
185
|
-
*/
|
|
186
|
-
getColumn(property) {
|
|
187
|
-
return this.getColumnUnsafe(property);
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Retrieves the column descriptor for the given property.
|
|
191
|
-
*
|
|
192
|
-
* This function is UNSAFE!
|
|
193
|
-
*
|
|
194
|
-
* @param {keyof TableModel} property - The property for column descriptor.
|
|
195
|
-
*
|
|
196
|
-
* @return The column descriptor.
|
|
197
|
-
*/
|
|
198
|
-
getColumnUnsafe(property) {
|
|
199
|
-
return this._columns.find(col => col.property === property) ?? null;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Removes the column descriptor for the given property.
|
|
203
|
-
*
|
|
204
|
-
* @param {keyof TableModel} property - The property for column descriptor.
|
|
205
|
-
*/
|
|
206
|
-
removeColumn(property) {
|
|
207
|
-
this.removeColumnUnsafe(property);
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Removes the column descriptor for the given property.
|
|
211
|
-
*
|
|
212
|
-
* This function is UNSAFE!
|
|
213
|
-
*
|
|
214
|
-
* @param {keyof TableModel} property - The property for column descriptor.
|
|
215
|
-
*/
|
|
216
|
-
removeColumnUnsafe(property) {
|
|
217
|
-
const columnIdx = this._columns.findIndex(c => c.property === property);
|
|
218
|
-
this._columns.splice(columnIdx, 1);
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Adds column descriptor to table columns.
|
|
222
|
-
*
|
|
223
|
-
* @param {ColumnDescriptor<ColumnModel, TableModel, ColumnValue>} column - The property for column descriptor.
|
|
224
|
-
*/
|
|
225
|
-
withColumn(column) {
|
|
226
|
-
this._columns.push(column);
|
|
227
|
-
return this;
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Adds a column to the table.
|
|
231
|
-
*
|
|
232
|
-
* @param {PropertyKey} property - The property key of the column in the table model.
|
|
233
|
-
*
|
|
234
|
-
* @returns The newly added column descriptor.
|
|
235
|
-
*/
|
|
236
|
-
addColumn(property) {
|
|
237
|
-
const column = new ColumnDescriptor(property);
|
|
238
|
-
this._columns.push(column);
|
|
239
|
-
return column;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Adds a column with enum display to the table.
|
|
243
|
-
*
|
|
244
|
-
* @param {PropertyKey} property - The property key of the table model.
|
|
245
|
-
* @param {EnumDescriptor<Enum>} enumDesc - The enum descriptor for column display.
|
|
246
|
-
* @return {ColumnDescriptor<Enum, TableModel, TableModel[PropertyKey]>} - The added column descriptor.
|
|
247
|
-
*/
|
|
248
|
-
addColumnEnum(property, enumDesc) {
|
|
249
|
-
const column = new ColumnDescriptor(property);
|
|
250
|
-
column.asEnumUnsafe(enumDesc);
|
|
251
|
-
this._columns.push(column);
|
|
252
|
-
return column;
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Adds a column to the table.
|
|
256
|
-
*
|
|
257
|
-
* This function is UNSAFE!
|
|
258
|
-
*
|
|
259
|
-
* @param {string} property - The property key of the column in the table model.
|
|
260
|
-
*
|
|
261
|
-
* @returns The newly added column descriptor.
|
|
262
|
-
*/
|
|
263
|
-
addColumnUnsafe(property) {
|
|
264
|
-
const column = new ColumnDescriptor(property);
|
|
265
|
-
this._columns.push(column);
|
|
266
|
-
return column;
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Adds one or more columns to the table model.
|
|
270
|
-
*
|
|
271
|
-
* @param properties - An array of property names to add as columns.
|
|
272
|
-
*/
|
|
273
|
-
withColumns(...properties) {
|
|
274
|
-
properties.forEach(p => this.addColumn(p));
|
|
275
|
-
return this;
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Set the pagination mode for the table.
|
|
279
|
-
*
|
|
280
|
-
* @param {TablePaginationModeEnum} paginationMode - The pagination mode to set. Must be one of the values from the TablePaginationModeEnum.
|
|
281
|
-
*/
|
|
282
|
-
withPaginationMode(paginationMode) {
|
|
283
|
-
this._paginationMode = paginationMode;
|
|
284
|
-
return this;
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Sets the number of rows per page for a paginated display.
|
|
288
|
-
*
|
|
289
|
-
* @param {number} rows - The default number of rows to display per page.
|
|
290
|
-
* @param {Array<number>} [options] - Rows per page options to be available in table paginator.
|
|
291
|
-
*/
|
|
292
|
-
withRowsPerPage(rows, options) {
|
|
293
|
-
this._defaultNumRows = rows;
|
|
294
|
-
this._rowsPerPageOptions = options;
|
|
295
|
-
return this;
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Sets the title for an instance of the class.
|
|
299
|
-
*
|
|
300
|
-
* @param {string} [title] - The title value to be set. It undefined, no title will be displayed.
|
|
301
|
-
*/
|
|
302
|
-
withTitle(title) {
|
|
303
|
-
this._title = title;
|
|
304
|
-
return this;
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* Shows/hides the header row with column titles.
|
|
308
|
-
*
|
|
309
|
-
* @param {boolean} hideHeader - A boolean value indicating whether to hide the header.
|
|
310
|
-
*/
|
|
311
|
-
withHideHeader(hideHeader = true) {
|
|
312
|
-
this._hideHeader = hideHeader;
|
|
313
|
-
return this;
|
|
314
|
-
}
|
|
315
|
-
/**
|
|
316
|
-
* Adjusts loading display with custom text and/or icon.
|
|
317
|
-
*
|
|
318
|
-
* @param {string} [text] - Text to be displayed when loading indicator is shown.
|
|
319
|
-
* @param {string | null} [icon] - Icon to be used when loading indicator is shown.
|
|
320
|
-
*/
|
|
321
|
-
withLoading(text, icon) {
|
|
322
|
-
this._loadingText = text;
|
|
323
|
-
this._loadingIcon = icon === undefined ? 'pi pi-spinner' : icon;
|
|
324
|
-
return this;
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Retrieves the sort descriptor for a given property.
|
|
328
|
-
*
|
|
329
|
-
* @param {Sorts} property - The property to retrieve the sort for.
|
|
330
|
-
*
|
|
331
|
-
* @return {SortDescriptor<TableModel> | null} The sort descriptor or null.
|
|
332
|
-
*/
|
|
333
|
-
getSort(property) {
|
|
334
|
-
return this.getSortUnsafe(property);
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* Retrieves the sort descriptor for a given property.
|
|
338
|
-
*
|
|
339
|
-
* This function is UNSAFE!
|
|
340
|
-
*
|
|
341
|
-
* @param {Sorts} property - The property to retrieve the sort for.
|
|
342
|
-
*
|
|
343
|
-
* @return {SortDescriptor<TableModel> | null} The sort descriptor or null.
|
|
344
|
-
*/
|
|
345
|
-
getSortUnsafe(property) {
|
|
346
|
-
return this._sorts.find(s => s.property === property) ?? null;
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* Removes the sort for a given property.
|
|
350
|
-
*
|
|
351
|
-
* @param {Sorts} property - The property to remove the sort for.
|
|
352
|
-
*/
|
|
353
|
-
removeSort(property) {
|
|
354
|
-
return this.removeSortUnsafe(property);
|
|
355
|
-
}
|
|
356
|
-
/**
|
|
357
|
-
* Removes the sort for a given property.
|
|
358
|
-
*
|
|
359
|
-
* This function is UNSAFE!
|
|
360
|
-
*
|
|
361
|
-
* @param {Sorts} property - The property to remove the sort for.
|
|
362
|
-
*/
|
|
363
|
-
removeSortUnsafe(property) {
|
|
364
|
-
const sortIdx = this._sorts.findIndex(c => c.property === property);
|
|
365
|
-
this._sorts.splice(sortIdx, 1);
|
|
366
|
-
}
|
|
367
|
-
/**
|
|
368
|
-
* Adds sort for the given property.
|
|
369
|
-
*
|
|
370
|
-
* @param property Property to add the sort for.
|
|
371
|
-
* @param isDefault If default sorting is enabled.
|
|
372
|
-
* @param ascending If default sort should be ascending.
|
|
373
|
-
*
|
|
374
|
-
* @return Created sort descriptor.
|
|
375
|
-
*/
|
|
376
|
-
addSort(property, isDefault = false, ascending) {
|
|
377
|
-
return this.addSortUnsafe(property, isDefault, ascending);
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* Adds sort for the given property.
|
|
381
|
-
*
|
|
382
|
-
* This function is UNSAFE!
|
|
383
|
-
*
|
|
384
|
-
* @param property Property to add the sort for.
|
|
385
|
-
* @param isDefault If default sorting is enabled.
|
|
386
|
-
* @param ascending If default sort should be ascending.
|
|
387
|
-
|
|
388
|
-
* @return Created sort descriptor.
|
|
389
|
-
*/
|
|
390
|
-
addSortUnsafe(property, isDefault = false, ascending) {
|
|
391
|
-
const sort = new SortDescriptor(property);
|
|
392
|
-
if (isDefault) {
|
|
393
|
-
const defaultOrderMax = this._sorts
|
|
394
|
-
.filter(s => s.defaultIsEnabled)
|
|
395
|
-
.reduce((acc, s) => (s.defaultOrder !== undefined && s.defaultOrder > acc ? s.defaultOrder : acc), -1);
|
|
396
|
-
sort.withDefaultSort(true, ascending, defaultOrderMax + 1);
|
|
397
|
-
}
|
|
398
|
-
this._sorts.push(sort);
|
|
399
|
-
return sort;
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Adds sort for the given property.
|
|
403
|
-
*
|
|
404
|
-
* @param property Property to add the sort for.
|
|
405
|
-
* @param isDefault If default sorting is enabled.
|
|
406
|
-
* @param ascending If default sort should be ascending.
|
|
407
|
-
*/
|
|
408
|
-
withSort(property, isDefault = false, ascending) {
|
|
409
|
-
return this.withSortUnsafe(property, isDefault, ascending);
|
|
410
|
-
}
|
|
411
|
-
/**
|
|
412
|
-
* Adds sort for the given property.
|
|
413
|
-
*
|
|
414
|
-
* This function is UNSAFE!
|
|
415
|
-
*
|
|
416
|
-
* @param property Property to add the sort for.
|
|
417
|
-
* @param isDefault If default sorting is enabled.
|
|
418
|
-
* @param ascending If default sort should be ascending.
|
|
419
|
-
*/
|
|
420
|
-
withSortUnsafe(property, isDefault = false, ascending) {
|
|
421
|
-
this.addSortUnsafe(property, isDefault, ascending);
|
|
422
|
-
return this;
|
|
423
|
-
}
|
|
424
|
-
/**
|
|
425
|
-
* Sets the default sorting for the property.
|
|
426
|
-
*
|
|
427
|
-
* @param property - The property to set default sort for.
|
|
428
|
-
* @param ascending - If the sorting should be ascending (default: true).
|
|
429
|
-
* @param enabled - Enables/disabled the default sort.
|
|
430
|
-
*/
|
|
431
|
-
withDefaultSort(property, ascending, enabled) {
|
|
432
|
-
return this.withDefaultSortUnsafe(property, ascending, enabled);
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* Sets the default sorting for the property.
|
|
436
|
-
*
|
|
437
|
-
* This function is UNSAFE!
|
|
438
|
-
*
|
|
439
|
-
* @param property - The property to set default sort for.
|
|
440
|
-
* @param ascending - If the sorting should be ascending (default: true).
|
|
441
|
-
* @param enabled - Enables/disabled the default sort.
|
|
442
|
-
*/
|
|
443
|
-
withDefaultSortUnsafe(property, ascending, enabled) {
|
|
444
|
-
let sort = this._sorts.find(s => s.property === property);
|
|
445
|
-
if (!sort) {
|
|
446
|
-
sort = new SortDescriptor(property);
|
|
447
|
-
this._sorts.push(sort);
|
|
448
|
-
}
|
|
449
|
-
const order = this._sorts.filter(s => s.defaultIsEnabled).reduce((acc, s) => (s.defaultOrder == null || s.defaultOrder < acc ? acc : s.defaultOrder + 1), 0);
|
|
450
|
-
sort.withDefaultSort(enabled ?? true, ascending, order);
|
|
451
|
-
return this;
|
|
452
|
-
}
|
|
453
|
-
/**
|
|
454
|
-
* Sets the default sorting for provided properties.
|
|
455
|
-
*
|
|
456
|
-
* @param properties - The properties to set default sort for.
|
|
457
|
-
*/
|
|
458
|
-
withDefaultSorts(...properties) {
|
|
459
|
-
properties.forEach(p => this.withDefaultSortUnsafe(p));
|
|
460
|
-
return this;
|
|
461
|
-
}
|
|
462
|
-
/**
|
|
463
|
-
* Unsets all default sorts.
|
|
464
|
-
*/
|
|
465
|
-
withoutDefaultSorts() {
|
|
466
|
-
this._sorts.forEach(s => s.withDefaultSort(false, undefined, undefined));
|
|
467
|
-
return this;
|
|
468
|
-
}
|
|
469
|
-
/**
|
|
470
|
-
* Add sorts for more properties.
|
|
471
|
-
*
|
|
472
|
-
* @param properties Properties to add the sorts for.
|
|
473
|
-
*/
|
|
474
|
-
withSorts(...properties) {
|
|
475
|
-
return this.withSortsUnsafe(...properties);
|
|
476
|
-
}
|
|
477
|
-
/**
|
|
478
|
-
* Add sorts for more properties.
|
|
479
|
-
*
|
|
480
|
-
* This function is UNSAFE!
|
|
481
|
-
*
|
|
482
|
-
* @param properties Properties to add the sorts for.
|
|
483
|
-
*/
|
|
484
|
-
withSortsUnsafe(...properties) {
|
|
485
|
-
properties.forEach(p => {
|
|
486
|
-
this._sorts.push(new SortDescriptor(p));
|
|
487
|
-
});
|
|
488
|
-
return this;
|
|
489
|
-
}
|
|
490
|
-
/**
|
|
491
|
-
* Gets filter descriptor for given property.
|
|
492
|
-
*
|
|
493
|
-
* @param property Filter property
|
|
494
|
-
*
|
|
495
|
-
* @return Filter descriptor for property or null if not exists.
|
|
496
|
-
*/
|
|
497
|
-
getFilter(property) {
|
|
498
|
-
return this.getFilterUnsafe(property);
|
|
499
|
-
}
|
|
500
|
-
/**
|
|
501
|
-
* Gets filter descriptor for given property.
|
|
502
|
-
*
|
|
503
|
-
* This function is UNSAFE!
|
|
504
|
-
*
|
|
505
|
-
* @param property Filter property
|
|
506
|
-
*
|
|
507
|
-
* @return Filter descriptor for property or null if not exists.
|
|
508
|
-
*/
|
|
509
|
-
getFilterUnsafe(property) {
|
|
510
|
-
return this._filters.find(s => s.property === property) ?? null;
|
|
511
|
-
}
|
|
512
|
-
/**
|
|
513
|
-
* Removes filter descriptor for given property.
|
|
514
|
-
*
|
|
515
|
-
* @param property Filter property
|
|
516
|
-
*/
|
|
517
|
-
removeFilter(property) {
|
|
518
|
-
return this.removeFilterUnsafe(property);
|
|
519
|
-
}
|
|
520
|
-
/**
|
|
521
|
-
* Removes filter descriptor for given property.
|
|
522
|
-
*
|
|
523
|
-
* This function is UNSAFE!
|
|
524
|
-
*
|
|
525
|
-
* @param property Filter property
|
|
526
|
-
*/
|
|
527
|
-
removeFilterUnsafe(property) {
|
|
528
|
-
const filterIdx = this._filters.findIndex(c => c.property === property);
|
|
529
|
-
this._filters.splice(filterIdx, 1);
|
|
530
|
-
}
|
|
531
|
-
/**
|
|
532
|
-
* Creates filter descriptor for the given property.
|
|
533
|
-
*
|
|
534
|
-
* @param property Filter property.
|
|
535
|
-
*
|
|
536
|
-
* @return Created filter descriptor.
|
|
537
|
-
*/
|
|
538
|
-
addFilter(property) {
|
|
539
|
-
return this.addFilterUnsafe(property);
|
|
540
|
-
}
|
|
541
|
-
/**
|
|
542
|
-
* Creates filter descriptor for the given property.
|
|
543
|
-
*
|
|
544
|
-
* This function is UNSAFE!
|
|
545
|
-
*
|
|
546
|
-
* @param property Filter property.
|
|
547
|
-
*
|
|
548
|
-
* @return Created filter descriptor.
|
|
549
|
-
*/
|
|
550
|
-
addFilterUnsafe(property) {
|
|
551
|
-
const filter = new FilterDescriptor(property);
|
|
552
|
-
this._filters.push(filter);
|
|
553
|
-
return filter;
|
|
554
|
-
}
|
|
555
|
-
/**
|
|
556
|
-
* Creates filter lookup descriptor for the given property.
|
|
557
|
-
*
|
|
558
|
-
* @param property Filter property.
|
|
559
|
-
* @param provider Lookup provider.
|
|
560
|
-
* @param optionsValueProperty Property on lookup provider's item (FilterModel) that will be used as filter value.
|
|
561
|
-
*
|
|
562
|
-
* @return Created filter lookup descriptor.
|
|
563
|
-
*/
|
|
564
|
-
addFilterLookup(property, provider, optionsValueProperty) {
|
|
565
|
-
return this.addFilterLookupUnsafe(property, provider, optionsValueProperty);
|
|
566
|
-
}
|
|
567
|
-
/**
|
|
568
|
-
* Creates filter lookup descriptor for the given property.
|
|
569
|
-
*
|
|
570
|
-
* This function is UNSAFE!
|
|
571
|
-
*
|
|
572
|
-
* @param property Filter property.
|
|
573
|
-
* @param provider Lookup provider.
|
|
574
|
-
* @param optionsValueProperty Property on lookup provider's item (FilterModel) that will be used as filter value.
|
|
575
|
-
*
|
|
576
|
-
* @return Created filter lookup descriptor.
|
|
577
|
-
*/
|
|
578
|
-
addFilterLookupUnsafe(property, provider, optionsValueProperty) {
|
|
579
|
-
const filter = new FilterLookupDescriptor(property, {
|
|
580
|
-
dataProvider: provider,
|
|
581
|
-
optionsValueProperty: optionsValueProperty
|
|
582
|
-
});
|
|
583
|
-
this._filters.push(filter);
|
|
584
|
-
return filter;
|
|
585
|
-
}
|
|
586
|
-
/**
|
|
587
|
-
* Creates filter lookup enum descriptor for the given property.
|
|
588
|
-
*
|
|
589
|
-
* @param property Filter property.
|
|
590
|
-
* @param enumDesc Descriptor for enum.
|
|
591
|
-
* @param options Optional options of enum values to be available to filter by.
|
|
592
|
-
*
|
|
593
|
-
* @return Created filter lookup enum descriptor.
|
|
594
|
-
*/
|
|
595
|
-
addFilterLookupEnum(property, enumDesc, options) {
|
|
596
|
-
return this.addFilterLookupEnumUnsafe(property, enumDesc, options);
|
|
597
|
-
}
|
|
598
|
-
/**
|
|
599
|
-
* Creates filter lookup enum descriptor for the given property.
|
|
600
|
-
*
|
|
601
|
-
* This function is UNSAFE!
|
|
602
|
-
*
|
|
603
|
-
* @param property Filter property.
|
|
604
|
-
* @param enumDesc Descriptor for enum.
|
|
605
|
-
* @param options Optional options of enum values to be available to filter by.
|
|
606
|
-
*
|
|
607
|
-
* @return Created filter lookup enum descriptor.
|
|
608
|
-
*/
|
|
609
|
-
addFilterLookupEnumUnsafe(property, enumDesc, options) {
|
|
610
|
-
const filter = new FilterLookupEnumDescriptor(property, enumDesc, options);
|
|
611
|
-
this._filters.push(filter);
|
|
612
|
-
return filter;
|
|
613
|
-
}
|
|
614
|
-
/**
|
|
615
|
-
* Creates filter descriptor from column. The column must exist on table descriptor.
|
|
616
|
-
*
|
|
617
|
-
* @param property Column property to add filter for.
|
|
618
|
-
* @param displayType Optional display type setting.
|
|
619
|
-
* @param forceSimple Forces simple creation of filter (no lookup or lookup enum filters).
|
|
620
|
-
*
|
|
621
|
-
* @throws {CommonsInternalError} If column for property doesn't exist.
|
|
622
|
-
*
|
|
623
|
-
* @return Created filter descriptor
|
|
624
|
-
*/
|
|
625
|
-
addFilterFromColumn(property, displayType, forceSimple = false) {
|
|
626
|
-
return this.addFilterFromColumnUnsafe(property, displayType, forceSimple);
|
|
627
|
-
}
|
|
628
|
-
addGenericFilter(propertyLookupDataProvider) {
|
|
629
|
-
this._genericFilter = new FilterGenericDescriptor(propertyLookupDataProvider);
|
|
630
|
-
return this._genericFilter;
|
|
631
|
-
}
|
|
632
|
-
withGenericFilter(propertyLookupDataProvider, valueLookupDataProvider) {
|
|
633
|
-
this._genericFilter = this.addGenericFilter(propertyLookupDataProvider);
|
|
634
|
-
if (valueLookupDataProvider) {
|
|
635
|
-
this._genericFilter.withValueLookup(valueLookupDataProvider);
|
|
636
|
-
}
|
|
637
|
-
return this;
|
|
638
|
-
}
|
|
639
|
-
/**
|
|
640
|
-
* Creates filter descriptors from columns. The columns must exist on table descriptor.
|
|
641
|
-
*
|
|
642
|
-
* @param properties Column properties to add filters for.
|
|
643
|
-
*
|
|
644
|
-
* @throws {CommonsInternalError} If column for property doesn't exist.
|
|
645
|
-
*/
|
|
646
|
-
withFiltersFromColumns(...properties) {
|
|
647
|
-
return this.withFiltersFromColumnsUnsafe(...properties);
|
|
648
|
-
}
|
|
649
|
-
/**
|
|
650
|
-
* Creates filter descriptors from columns. The columns must exist on table descriptor.
|
|
651
|
-
*
|
|
652
|
-
* This function is UNSAFE!
|
|
653
|
-
*
|
|
654
|
-
* @param properties Column properties to add filters for.
|
|
655
|
-
*
|
|
656
|
-
* @throws {CommonsInternalError} If column for property doesn't exist.
|
|
657
|
-
*/
|
|
658
|
-
withFiltersFromColumnsUnsafe(...properties) {
|
|
659
|
-
properties.forEach(p => {
|
|
660
|
-
this.addFilterFromColumnUnsafe(p);
|
|
661
|
-
});
|
|
662
|
-
return this;
|
|
663
|
-
}
|
|
664
|
-
/**
|
|
665
|
-
* Creates filter descriptor from column. The column must exist on table descriptor.
|
|
666
|
-
*
|
|
667
|
-
* This function is UNSAFE!
|
|
668
|
-
*
|
|
669
|
-
* @param property Column property to add filter for.
|
|
670
|
-
* @param displayType Optional display type setting.
|
|
671
|
-
* @param forceSimple Forces simple creation of filter (no lookup or lookup enum filters).
|
|
672
|
-
*
|
|
673
|
-
* @throws {CommonsInternalError} If column for property doesn't exist.
|
|
674
|
-
*
|
|
675
|
-
* @return Created filter descriptor
|
|
676
|
-
*/
|
|
677
|
-
addFilterFromColumnUnsafe(property, displayType, forceSimple = false) {
|
|
678
|
-
const column = this.getColumnUnsafe(property);
|
|
679
|
-
if (!column) {
|
|
680
|
-
throw new CommonsInternalError(`No column found for filter property "${property}"`);
|
|
681
|
-
}
|
|
682
|
-
const filter = this.addFilterFromColumnDescriptorUnsafe(column, forceSimple);
|
|
683
|
-
if (displayType != null)
|
|
684
|
-
filter.withDisplayType(displayType);
|
|
685
|
-
return filter;
|
|
686
|
-
}
|
|
687
|
-
/**
|
|
688
|
-
* Creates filter descriptor from provided column descriptor.
|
|
689
|
-
*
|
|
690
|
-
* This function is UNSAFE!
|
|
691
|
-
*
|
|
692
|
-
* @param column Column descriptor.
|
|
693
|
-
* @param forceSimple Forces simple creation of filter (no lookup or lookup enum filters).
|
|
694
|
-
*
|
|
695
|
-
* @throws {CommonsInternalError} If column for property doesn't exist.
|
|
696
|
-
*
|
|
697
|
-
* @return Created filter descriptor
|
|
698
|
-
*/
|
|
699
|
-
addFilterFromColumnDescriptorUnsafe(column, forceSimple = false) {
|
|
700
|
-
let filterDescriptor = new FilterDescriptor(column.property);
|
|
701
|
-
let filterType;
|
|
702
|
-
switch (column.columnType) {
|
|
703
|
-
case ColumnTypeEnum.Number:
|
|
704
|
-
filterType = FilterTypeEnum.Number;
|
|
705
|
-
break;
|
|
706
|
-
case ColumnTypeEnum.Boolean:
|
|
707
|
-
filterType = FilterTypeEnum.Boolean;
|
|
708
|
-
break;
|
|
709
|
-
case ColumnTypeEnum.Date:
|
|
710
|
-
filterType = FilterTypeEnum.Date;
|
|
711
|
-
break;
|
|
712
|
-
case ColumnTypeEnum.Enum:
|
|
713
|
-
if (!forceSimple && column.enum) {
|
|
714
|
-
filterDescriptor = new FilterLookupEnumDescriptor(column.property, column.enum);
|
|
715
|
-
filterType = FilterTypeEnum.LookupEnum;
|
|
716
|
-
}
|
|
717
|
-
else {
|
|
718
|
-
filterType = FilterTypeEnum.String;
|
|
719
|
-
}
|
|
720
|
-
break;
|
|
721
|
-
case ColumnTypeEnum.String:
|
|
722
|
-
case ColumnTypeEnum.Custom:
|
|
723
|
-
default:
|
|
724
|
-
filterType = FilterTypeEnum.String;
|
|
725
|
-
break;
|
|
726
|
-
}
|
|
727
|
-
filterDescriptor.asFilterType(filterType);
|
|
728
|
-
if ((filterType === FilterTypeEnum.Number || filterType === FilterTypeEnum.Date) && column.displayFormat) {
|
|
729
|
-
filterDescriptor.withDisplayFormat(column.displayFormat, true);
|
|
730
|
-
}
|
|
731
|
-
this._filters.push(filterDescriptor);
|
|
732
|
-
return filterDescriptor;
|
|
733
|
-
}
|
|
734
|
-
/**
|
|
735
|
-
* Adds filter descriptor for the given property.
|
|
736
|
-
*
|
|
737
|
-
* @param property Filter property.
|
|
738
|
-
* @param filter Descriptor for property.
|
|
739
|
-
*/
|
|
740
|
-
withFilter(property, filter) {
|
|
741
|
-
if (filter.property !== property) {
|
|
742
|
-
throw new CommonsInternalError(`Filter property "${property}" and Filter descriptor property "${filter.property}" do not match.`);
|
|
743
|
-
}
|
|
744
|
-
return this.withFilterUnsafe(filter);
|
|
745
|
-
}
|
|
746
|
-
/**
|
|
747
|
-
* Adds filter descriptor for the given property.
|
|
748
|
-
*
|
|
749
|
-
* This function is UNSAFE!
|
|
750
|
-
*
|
|
751
|
-
* @param filter Descriptor for property.
|
|
752
|
-
*/
|
|
753
|
-
withFilterUnsafe(filter) {
|
|
754
|
-
this._filters.push(filter);
|
|
755
|
-
return this;
|
|
756
|
-
}
|
|
757
|
-
/**
|
|
758
|
-
* Enables or disables the global search option for the table.
|
|
759
|
-
*
|
|
760
|
-
* @param {boolean} search - Indicates whether the global search should be enabled.
|
|
761
|
-
* @param opts - Additional options for search. limitMaxWords can limit max words as search input and fields can limit
|
|
762
|
-
* the filtering fields included in search when lazy load is not being used.
|
|
763
|
-
*/
|
|
764
|
-
withSearch(search = true, opts) {
|
|
765
|
-
return this.withSearchUnsafe(search, {
|
|
766
|
-
fields: opts?.fields,
|
|
767
|
-
limitMaxWords: opts?.limitMaxWords
|
|
768
|
-
});
|
|
769
|
-
}
|
|
770
|
-
/**
|
|
771
|
-
* Enables or disables the global search option for the table.
|
|
772
|
-
*
|
|
773
|
-
* @param {boolean} search - Indicates whether the global search should be enabled.
|
|
774
|
-
* @param opts - Additional options for search. limitMaxWords can limit max words as search input and fields can limit
|
|
775
|
-
* the filtering fields included in search when lazy load is not being used.
|
|
776
|
-
*/
|
|
777
|
-
withSearchUnsafe(search = true, opts) {
|
|
778
|
-
this._search = search;
|
|
779
|
-
this._searchLimitMaxWords = opts?.limitMaxWords;
|
|
780
|
-
this._searchFields = opts?.fields;
|
|
781
|
-
return this;
|
|
782
|
-
}
|
|
783
|
-
/**
|
|
784
|
-
* Sets classes for table component.
|
|
785
|
-
*
|
|
786
|
-
* @param className Class names.
|
|
787
|
-
*/
|
|
788
|
-
withClassName(className) {
|
|
789
|
-
this._className = className;
|
|
790
|
-
return this;
|
|
791
|
-
}
|
|
792
|
-
/**
|
|
793
|
-
* Sets table sizing.
|
|
794
|
-
*
|
|
795
|
-
* @param size Table size.
|
|
796
|
-
*/
|
|
797
|
-
withSize(size = TableSizeEnum.Normal) {
|
|
798
|
-
this._size = size;
|
|
799
|
-
return this;
|
|
800
|
-
}
|
|
801
|
-
/**
|
|
802
|
-
* Enables hover effect on table rows.
|
|
803
|
-
*
|
|
804
|
-
* @param hover Enables/disables the hover.
|
|
805
|
-
*/
|
|
806
|
-
withHover(hover = true) {
|
|
807
|
-
this._hasHover = hover;
|
|
808
|
-
return this;
|
|
809
|
-
}
|
|
810
|
-
/**
|
|
811
|
-
* Enables gridlines on table.
|
|
812
|
-
*
|
|
813
|
-
* @param gridlines Enables/disables the gridlines.
|
|
814
|
-
*/
|
|
815
|
-
withGridlines(gridlines = true) {
|
|
816
|
-
this._hasGridlines = gridlines;
|
|
817
|
-
return this;
|
|
818
|
-
}
|
|
819
|
-
/**
|
|
820
|
-
* Enables/disables reorderable property on all columns currently in the descriptor.
|
|
821
|
-
*
|
|
822
|
-
* @param {boolean} [columnsReorderable] - Boolean flag to set reordering on columns to.
|
|
823
|
-
*/
|
|
824
|
-
withCurrentColumnsReorderable(columnsReorderable = true) {
|
|
825
|
-
for (const col of this.columns) {
|
|
826
|
-
col.withReorderable(columnsReorderable);
|
|
827
|
-
}
|
|
828
|
-
return this;
|
|
829
|
-
}
|
|
830
|
-
/**
|
|
831
|
-
* Enables/disables toggleable property on all columns currently in the descriptor.
|
|
832
|
-
*
|
|
833
|
-
* @param {boolean} [columnsToggleable] - Boolean flag to set toggleable on columns to.
|
|
834
|
-
*/
|
|
835
|
-
withCurrentColumnsToggleable(columnsToggleable = true) {
|
|
836
|
-
for (const col of this.columns) {
|
|
837
|
-
col.withToggleable(columnsToggleable);
|
|
838
|
-
}
|
|
839
|
-
return this;
|
|
840
|
-
}
|
|
841
|
-
/**
|
|
842
|
-
* Enables/disabled column resize feature with columnResizeMode on all columns.
|
|
843
|
-
*
|
|
844
|
-
* @param resizableColumns True if enabled
|
|
845
|
-
* @param columnResizeMode 'fit' or 'expand' mode
|
|
846
|
-
*/
|
|
847
|
-
withColumnsResizable(resizableColumns = true, columnResizeMode = 'fit') {
|
|
848
|
-
this._hasResizableColumns = resizableColumns;
|
|
849
|
-
this._columnResizeMode = columnResizeMode;
|
|
850
|
-
return this;
|
|
851
|
-
}
|
|
852
|
-
/**
|
|
853
|
-
* Sets column to (un)frozen.
|
|
854
|
-
*
|
|
855
|
-
* @param selectionColumnFrozen True to freeze selection column, false to unfreeze it.
|
|
856
|
-
* @param actionColumnFrozen True to freeze action column, false to unfreeze it.
|
|
857
|
-
*/
|
|
858
|
-
withColumnFrozen(selectionColumnFrozen, actionColumnFrozen) {
|
|
859
|
-
this._selectionColumnFrozen = selectionColumnFrozen;
|
|
860
|
-
this._actionColumnFrozen = actionColumnFrozen;
|
|
861
|
-
return this;
|
|
862
|
-
}
|
|
863
|
-
/**
|
|
864
|
-
* Sets the class name for rows in the table.
|
|
865
|
-
*
|
|
866
|
-
* @param {string} rowClassName - The CSS class name to be applied to each row.
|
|
867
|
-
* @param {function} [classNameMapFn] - Optional function to map the class name dynamically based on row's item and current class name.
|
|
868
|
-
*/
|
|
869
|
-
withRowClassName(rowClassName, classNameMapFn) {
|
|
870
|
-
this._rowClassName = rowClassName;
|
|
871
|
-
this._rowClassNameMapFn = classNameMapFn;
|
|
872
|
-
return this;
|
|
873
|
-
}
|
|
874
|
-
/**
|
|
875
|
-
* Sets header row class name.
|
|
876
|
-
*
|
|
877
|
-
* @param headerClassName Class name.
|
|
878
|
-
*/
|
|
879
|
-
withHeaderClassName(headerClassName) {
|
|
880
|
-
this._headerClassName = headerClassName;
|
|
881
|
-
return this;
|
|
882
|
-
}
|
|
883
|
-
/**
|
|
884
|
-
* Enables localization of the table.
|
|
885
|
-
*/
|
|
886
|
-
withLocalized() {
|
|
887
|
-
this._isLocalized = true;
|
|
888
|
-
return this;
|
|
889
|
-
}
|
|
890
|
-
/**
|
|
891
|
-
* Sets locale property for localization.
|
|
892
|
-
*
|
|
893
|
-
* @param property Locale property
|
|
894
|
-
*/
|
|
895
|
-
withLocalizationLocaleProperty(property) {
|
|
896
|
-
this._isLocalized = true;
|
|
897
|
-
this._localizationLocaleProperty = property;
|
|
898
|
-
return this;
|
|
899
|
-
}
|
|
900
|
-
/**
|
|
901
|
-
* Enables row expanding.
|
|
902
|
-
*
|
|
903
|
-
* @param property Property to check if row can be expanded.
|
|
904
|
-
* @param colSpan set custom row span for expanded row.
|
|
905
|
-
* @param componentType Component to be displayed on row expand.
|
|
906
|
-
* @param isRowExpanded Property or function that tells the table to expand the row by default.
|
|
907
|
-
*/
|
|
908
|
-
withRowExpandable(property, colSpan, componentType, isRowExpanded) {
|
|
909
|
-
this._rowExpandable = true;
|
|
910
|
-
if (property) {
|
|
911
|
-
this._rowExpandableProperty = property;
|
|
912
|
-
}
|
|
913
|
-
if (colSpan) {
|
|
914
|
-
this._rowExpandableColSpan = colSpan;
|
|
915
|
-
}
|
|
916
|
-
if (componentType) {
|
|
917
|
-
this._rowExpandableComponentType = componentType;
|
|
918
|
-
}
|
|
919
|
-
this._isRowExpanded = isRowExpanded;
|
|
920
|
-
return this;
|
|
921
|
-
}
|
|
922
|
-
/**
|
|
923
|
-
* Enables row reordering.
|
|
924
|
-
*
|
|
925
|
-
* @param reordable Enables/disables feature.
|
|
926
|
-
*/
|
|
927
|
-
withRowReorderable(reordable = true) {
|
|
928
|
-
this._rowReorderable = reordable;
|
|
929
|
-
return this;
|
|
930
|
-
}
|
|
931
|
-
copyFieldsTo(obj) {
|
|
932
|
-
obj._title = this._title;
|
|
933
|
-
obj._hideHeader = this._hideHeader;
|
|
934
|
-
obj._trackProperty = this._trackProperty;
|
|
935
|
-
obj._filters = this._filters.map(f => f.copy());
|
|
936
|
-
obj._sorts = this._sorts.map(s => s.copy());
|
|
937
|
-
obj._search = this._search;
|
|
938
|
-
obj._searchLimitMaxWords = this._searchLimitMaxWords;
|
|
939
|
-
obj._searchFields = this._searchFields ? [...this._searchFields] : undefined;
|
|
940
|
-
obj._className = this._className;
|
|
941
|
-
obj._size = this._size;
|
|
942
|
-
obj._hasHover = this._hasHover;
|
|
943
|
-
obj._hasGridlines = this._hasGridlines;
|
|
944
|
-
obj._hasResizableColumns = this._hasResizableColumns;
|
|
945
|
-
obj._columnResizeMode = this._columnResizeMode;
|
|
946
|
-
obj._actionColumnFrozen = this._actionColumnFrozen;
|
|
947
|
-
obj._selectionColumnFrozen = this._selectionColumnFrozen;
|
|
948
|
-
obj._isLocalized = this._isLocalized;
|
|
949
|
-
obj._localizationLocaleProperty = this._localizationLocaleProperty;
|
|
950
|
-
obj._paginationMode = this._paginationMode;
|
|
951
|
-
obj._rowsPerPageOptions = this._rowsPerPageOptions;
|
|
952
|
-
obj._rowExpandable = this._rowExpandable;
|
|
953
|
-
obj._rowExpandableColSpan = this._rowExpandableColSpan;
|
|
954
|
-
obj._rowExpandableProperty = this._rowExpandableProperty;
|
|
955
|
-
obj._isRowExpanded = this.isRowExpanded;
|
|
956
|
-
obj._rowExpandableComponentType = this._rowExpandableComponentType;
|
|
957
|
-
obj._rowReorderable = this._rowReorderable;
|
|
958
|
-
obj._genericFilter = this._genericFilter?.copy();
|
|
959
|
-
}
|
|
960
|
-
/**
|
|
961
|
-
* Copies current descriptor to a new instance.
|
|
962
|
-
*/
|
|
963
|
-
copy() {
|
|
964
|
-
const descriptor = new TableDescriptorInst(this.model.copy());
|
|
965
|
-
this.copyFieldsTo(descriptor);
|
|
966
|
-
descriptor._columns = this.columns.map(c => c.copy());
|
|
967
|
-
return descriptor;
|
|
968
|
-
}
|
|
969
|
-
}
|
|
970
|
-
export class TableDynamicDescriptorInst extends TableDescriptorInst {
|
|
971
|
-
constructor(model) {
|
|
972
|
-
super(model);
|
|
973
|
-
this._excludedColumns = [];
|
|
974
|
-
this._filterColumns = [];
|
|
975
|
-
this._sortColumns = [];
|
|
976
|
-
this._sortColumnMode = TableDynamicColumnsModeEnum.EXCLUDE;
|
|
977
|
-
this._filterColumnMode = TableDynamicColumnsModeEnum.EXCLUDE;
|
|
978
|
-
this._columns = [];
|
|
979
|
-
if (typeof model.titleProperty === 'string') {
|
|
980
|
-
this.withTitle(model.titleProperty);
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
get columns() {
|
|
984
|
-
return this._columns;
|
|
985
|
-
}
|
|
986
|
-
/**
|
|
987
|
-
* defines excluded columns when generating descriptor
|
|
988
|
-
* @param excludedColumn names of excluded columns
|
|
989
|
-
*/
|
|
990
|
-
withColumnsExcluded(excludedColumn) {
|
|
991
|
-
this._excludedColumns = excludedColumn;
|
|
992
|
-
return this;
|
|
993
|
-
}
|
|
994
|
-
/**
|
|
995
|
-
* defines column properties on which sort is defined or not depending on sortColumnMode
|
|
996
|
-
* @param sortOnColumns column names
|
|
997
|
-
* @param sortColumnMode INCLUDE_ONLY (default) only given columns will have sort, EXCLUDE given columns will NOT have sort
|
|
998
|
-
*/
|
|
999
|
-
withColumnsSort(sortOnColumns, sortColumnMode = TableDynamicColumnsModeEnum.INCLUDE_ONLY) {
|
|
1000
|
-
this._sortColumnMode = sortColumnMode;
|
|
1001
|
-
this._sortColumns = sortOnColumns;
|
|
1002
|
-
return this;
|
|
1003
|
-
}
|
|
1004
|
-
/**
|
|
1005
|
-
* defines column properties on which filter is defined or not depending on filterColumnMode
|
|
1006
|
-
* @param filterOnColumn column names
|
|
1007
|
-
* @param filterColumnMode INCLUDE_ONLY (default) only given columns will have filter, EXCLUDE given columns will NOT have filter
|
|
1008
|
-
*/
|
|
1009
|
-
withColumnsFilter(filterOnColumn, filterColumnMode = TableDynamicColumnsModeEnum.INCLUDE_ONLY) {
|
|
1010
|
-
this._filterColumnMode = filterColumnMode;
|
|
1011
|
-
this._filterColumns = filterOnColumn;
|
|
1012
|
-
return this;
|
|
1013
|
-
}
|
|
1014
|
-
/**
|
|
1015
|
-
* sets given type to column with given property and returns this table
|
|
1016
|
-
* @param property column's property
|
|
1017
|
-
* @param type custom type for column
|
|
1018
|
-
* @param displayType custom column value display type
|
|
1019
|
-
* @param args addition arguments for column
|
|
1020
|
-
*/
|
|
1021
|
-
withColumnPresetType(property, type, displayType, ...args) {
|
|
1022
|
-
const column = this._columns.find(col => property === col.property) ?? this.addColumn(property).withTitle(property);
|
|
1023
|
-
if (column) {
|
|
1024
|
-
column.asType(type, displayType, ...args);
|
|
1025
|
-
}
|
|
1026
|
-
return this;
|
|
1027
|
-
}
|
|
1028
|
-
/**
|
|
1029
|
-
* sets title to column with given property and returns this table
|
|
1030
|
-
* @param property column's property
|
|
1031
|
-
* @param title column's title
|
|
1032
|
-
*/
|
|
1033
|
-
withColumnTitle(property, title) {
|
|
1034
|
-
const column = this._columns.find(col => property === col.property) ?? this.addColumn(property);
|
|
1035
|
-
column.withTitle(title);
|
|
1036
|
-
return this;
|
|
1037
|
-
}
|
|
1038
|
-
/**
|
|
1039
|
-
* generates columns defined on table based on data fetched from api
|
|
1040
|
-
* @param data data from api
|
|
1041
|
-
*/
|
|
1042
|
-
toTableDescriptorFromData(data) {
|
|
1043
|
-
const tableDescriptor = this.toTableDescriptor();
|
|
1044
|
-
if (data.data == null || data.data.length == 0) {
|
|
1045
|
-
return tableDescriptor;
|
|
1046
|
-
}
|
|
1047
|
-
const objectModel = data.data[0];
|
|
1048
|
-
const entries = flattenObjectKeys(objectModel)
|
|
1049
|
-
.filter(([key]) => !this._excludedColumns.includes(key))
|
|
1050
|
-
.filter(([, value]) => !Array.isArray(value)); //exclude arrays and sets
|
|
1051
|
-
for (const [key, value] of entries) {
|
|
1052
|
-
const metaColumn = this._columns.find(col => col.property === key);
|
|
1053
|
-
let column;
|
|
1054
|
-
if (metaColumn) {
|
|
1055
|
-
if (!metaColumn.visibility) {
|
|
1056
|
-
continue;
|
|
1057
|
-
}
|
|
1058
|
-
column = metaColumn.toColumnDescriptor();
|
|
1059
|
-
tableDescriptor.withColumn(column);
|
|
1060
|
-
}
|
|
1061
|
-
else {
|
|
1062
|
-
column = tableDescriptor.addColumn(key).withTitle(key);
|
|
1063
|
-
columnToDateNumberOrBoolean(column, value);
|
|
1064
|
-
}
|
|
1065
|
-
if (this.model.i18nBaseKey && !column.property.includes('rev')) {
|
|
1066
|
-
column.withTitle([this.model.i18nBaseKey, 'properties', column.property].join('.').replace('state.', ''));
|
|
1067
|
-
}
|
|
1068
|
-
const elementOfSortColumns = this._sortColumns.includes(column.property);
|
|
1069
|
-
if ((this._sortColumnMode === TableDynamicColumnsModeEnum.EXCLUDE && !elementOfSortColumns) ||
|
|
1070
|
-
(this._sortColumnMode === TableDynamicColumnsModeEnum.INCLUDE_ONLY && elementOfSortColumns)) {
|
|
1071
|
-
tableDescriptor.withSortUnsafe(column.property);
|
|
1072
|
-
}
|
|
1073
|
-
const elementOfFilterColumns = this._filterColumns.includes(column.property);
|
|
1074
|
-
if (this._filterColumns.length > 0 &&
|
|
1075
|
-
((this._filterColumnMode === TableDynamicColumnsModeEnum.EXCLUDE && !elementOfFilterColumns) ||
|
|
1076
|
-
(this._filterColumnMode === TableDynamicColumnsModeEnum.INCLUDE_ONLY && elementOfFilterColumns))) {
|
|
1077
|
-
tableDescriptor.addFilterFromColumnDescriptorUnsafe(column, false);
|
|
1078
|
-
}
|
|
1079
|
-
}
|
|
1080
|
-
return tableDescriptor;
|
|
1081
|
-
}
|
|
1082
|
-
/**
|
|
1083
|
-
* adds ColumnDynamicDescriptor to this table
|
|
1084
|
-
* @param property column's property
|
|
1085
|
-
*/
|
|
1086
|
-
addColumn(property) {
|
|
1087
|
-
const column = new ColumnDynamicDescriptor(property);
|
|
1088
|
-
this._columns.push(column);
|
|
1089
|
-
return column;
|
|
1090
|
-
}
|
|
1091
|
-
removeColumn(property) {
|
|
1092
|
-
const column = this.columns.find(col => col.property === property) ?? this.addColumn(property);
|
|
1093
|
-
column.withVisibility(false);
|
|
1094
|
-
return this;
|
|
1095
|
-
}
|
|
1096
|
-
/**
|
|
1097
|
-
* creates deep copy of table dynamic descriptor
|
|
1098
|
-
*/
|
|
1099
|
-
copy() {
|
|
1100
|
-
const descriptor = new TableDynamicDescriptorInst(this.model.copy());
|
|
1101
|
-
this.copyFieldsTo(descriptor);
|
|
1102
|
-
descriptor._columns = this.columns.map(c => c.copy());
|
|
1103
|
-
descriptor._excludedColumns = [...this._excludedColumns];
|
|
1104
|
-
descriptor._filterColumns = [...this._filterColumns];
|
|
1105
|
-
descriptor._sortColumns = [...this._sortColumns];
|
|
1106
|
-
descriptor._filterColumnMode = this._filterColumnMode;
|
|
1107
|
-
descriptor._sortColumnMode = this._sortColumnMode;
|
|
1108
|
-
return descriptor;
|
|
1109
|
-
}
|
|
1110
|
-
toTableDescriptor() {
|
|
1111
|
-
const descriptor = new TableDescriptorInst(this.model);
|
|
1112
|
-
this.copyFieldsTo(descriptor);
|
|
1113
|
-
return descriptor;
|
|
1114
|
-
}
|
|
1115
|
-
}
|
|
1116
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RhYmxlL2FwaS9zcmMvZGVzY3JpcHRvcnMvdGFibGUuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUMsb0JBQW9CLEVBQTJFLGlCQUFpQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDN0osT0FBTyxFQUNILGdCQUFnQixFQUVoQix1QkFBdUIsRUFFdkIsc0JBQXNCLEVBQ3RCLDBCQUEwQixFQUMxQixjQUFjLEVBQ2pCLE1BQU0sK0JBQStCLENBQUM7QUFJdkMsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDeEUsT0FBTyxFQUF3QixjQUFjLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUc3RSxPQUFPLEVBQUMsMkJBQTJCLEVBQTJCLGFBQWEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFHLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzlFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRCxNQUFNLE9BQU8sbUJBQW1CO0lBeUQ1QixZQUFtQixLQUFrQyxFQUFFLGFBQWEsR0FBRyxLQUFLO1FBOUNsRSxhQUFRLEdBQTZDLEVBQUUsQ0FBQztRQUUxRCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQixpQkFBWSxHQUFrQixlQUFlLENBQUM7UUFFdEQsUUFBUTtRQUNBLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIseUJBQW9CLEdBQUcsS0FBSyxDQUFDO1FBT3JDLFVBQVU7UUFDRixVQUFLLEdBQWtCLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDM0MsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUt4QixnQkFBZ0I7UUFDUixhQUFRLEdBQXdDLEVBQUUsQ0FB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QUFVLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pELFVBQVUsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyRCxVQUFVLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakQsVUFBVSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN0RCxVQUFVLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDbEQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVNLGlCQUFpQjtRQUNwQixNQUFNLFVBQVUsR0FBRyxJQUFJLG1CQUFtQixDQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHlwZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7Q29tbW9uc0ludGVybmFsRXJyb3IsIERhdGFMaXN0UmVzdWx0LCBFbnVtQ29uc3RhbnRUeXBlLCBJTG9va3VwRGF0YVByb3ZpZGVyLCBJVGFibGVEZXNjcmlwdG9yLCBmbGF0dGVuT2JqZWN0S2V5c30gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9jb3JlJztcbmltcG9ydCB7XG4gICAgRmlsdGVyRGVzY3JpcHRvcixcbiAgICBGaWx0ZXJEaXNwbGF5VHlwZUVudW0sXG4gICAgRmlsdGVyR2VuZXJpY0Rlc2NyaXB0b3IsXG4gICAgRmlsdGVyR2VuZXJpY1Byb3BlcnR5LFxuICAgIEZpbHRlckxvb2t1cERlc2NyaXB0b3IsXG4gICAgRmlsdGVyTG9va3VwRW51bURlc2NyaXB0b3IsXG4gICAgRmlsdGVyVHlwZUVudW1cbn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9maWx0ZXInO1xuaW1wb3J0IHtMb29rdXBEYXRhUHJvdmlkZXJJbnN0fSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2Zvcm0vYXBpJztcbmltcG9ydCB7RW51bURlc2NyaXB0b3IsIE1vZGVsRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9tb2RlbCc7XG5cbmltcG9ydCB7Y29sdW1uVG9EYXRlTnVtYmVyT3JCb29sZWFufSBmcm9tICcuLi9oZWxwZXJzL2NvbHVtbi1jb252ZXJ0ZXInO1xuaW1wb3J0IHtDb2x1bW5EaXNwbGF5VHlwZUVudW0sIENvbHVtblR5cGVFbnVtfSBmcm9tICcuLi9tb2RlbHMvY29sdW1uLm1vZGVsJztcbmltcG9ydCB7SVJvd0V4cGFuZGFibGVDb21wb25lbnR9IGZyb20gJy4uL21vZGVscy9yb3ctZXhwYW5kYWJsZS1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHtJQ29sdW1uc01hbmFnZUludGVyZmFjZX0gZnJvbSAnLi4vbW9kZWxzL3RhYmxlLWNvbHVtbnMubW9kZWwnO1xuaW1wb3J0IHtUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0sIFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLCBUYWJsZVNpemVFbnVtfSBmcm9tICcuLi9tb2RlbHMvdGFibGUubW9kZWwnO1xuaW1wb3J0IHtDb2x1bW5EZXNjcmlwdG9yLCBDb2x1bW5EeW5hbWljRGVzY3JpcHRvcn0gZnJvbSAnLi9jb2x1bW4uZGVzY3JpcHRvcic7XG5pbXBvcnQge1NvcnREZXNjcmlwdG9yfSBmcm9tICcuL3NvcnQuZGVzY3JpcHRvcic7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZURlc2NyaXB0b3JJbnN0PFRhYmxlTW9kZWwsIFNvcnRzID0ga2V5b2YgVGFibGVNb2RlbCwgRmlsdGVycyA9IGtleW9mIFRhYmxlTW9kZWw+XG4gICAgaW1wbGVtZW50cyBJVGFibGVEZXNjcmlwdG9yPFRhYmxlTW9kZWwsIFNvcnRzLCBGaWx0ZXJzPiwgSUNvbHVtbnNNYW5hZ2VJbnRlcmZhY2U8VGFibGVNb2RlbCwgU29ydHMsIEZpbHRlcnM+XG57XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUYWJsZU1vZGVsPjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2F1dG9HZW5lcmF0ZWQ7XG5cbiAgICBwcml2YXRlIF9pZGVudGlmaWVyPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3RyYWNrUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcGFnaW5hdGlvbk1vZGU/OiBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bTtcbiAgICBwcml2YXRlIF9yb3dzUGVyUGFnZU9wdGlvbnM/OiBudW1iZXJbXTtcbiAgICBwcml2YXRlIF9kZWZhdWx0TnVtUm93cz86IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX2NvbHVtbnM6IEFycmF5PENvbHVtbkRlc2NyaXB0b3I8YW55LCBUYWJsZU1vZGVsPj4gPSBbXTtcbiAgICBwcml2YXRlIF90aXRsZT86IHN0cmluZztcbiAgICBwcml2YXRlIF9oaWRlSGVhZGVyID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbG9hZGluZ1RleHQ/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfbG9hZGluZ0ljb246IHN0cmluZyB8IG51bGwgPSAncGkgcGktc3Bpbm5lcic7XG5cbiAgICAvLyBleHRyYVxuICAgIHByaXZhdGUgX2hhc0hvdmVyID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9oYXNHcmlkbGluZXMgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9oYXNSZXNpemFibGVDb2x1bW5zID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY29sdW1uUmVzaXplTW9kZT86ICdmaXQnIHwgJ2V4cGFuZCc7XG5cbiAgICAvLyBzcGVjaWFsIGNvbHVtbnNcbiAgICBwcml2YXRlIF9zZWxlY3Rpb25Db2x1bW5Gcm96ZW4/OiBib29sZWFuO1xuICAgIHByaXZhdGUgX2FjdGlvbkNvbHVtbkZyb3plbj86IGJvb2xlYW47XG5cbiAgICAvLyBzdHlsaW5nXG4gICAgcHJpdmF0ZSBfc2l6ZTogVGFibGVTaXplRW51bSA9IFRhYmxlU2l6ZUVudW0uTGFyZ2U7XG4gICAgcHJpdmF0ZSBfY2xhc3NOYW1lID0gJyc7XG4gICAgcHJpdmF0ZSBfaGVhZGVyQ2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3Jvd0NsYXNzTmFtZT86IHN0cmluZztcbiAgICBwcml2YXRlIF9yb3dDbGFzc05hbWVNYXBGbj86IChjbGFzc05hbWU/OiBzdHJpbmcsIGl0ZW0/OiBUYWJsZU1vZGVsKSA9PiBzdHJpbmc7XG5cbiAgICAvLyBmaWx0ZXJzJnNvcnRzXG4gICAgcHJpdmF0ZSBfZmlsdGVyczogRmlsdGVyRGVzY3JpcHRvcjxhbnksIFRhYmxlTW9kZWw+W10gPSBbXTtcbiAgICBwcml2YXRlIF9nZW5lcmljRmlsdGVyPzogRmlsdGVyR2VuZXJpY0Rlc2NyaXB0b3I7XG4gICAgcHJpdmF0ZSBfc29ydHM6IFNvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+W10gPSBbXTtcblxuICAgIC8vIGxvY2FsaXphdGlvblxuICAgIHByaXZhdGUgX2lzTG9jYWxpemVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHk/OiBzdHJpbmc7XG5cbiAgICAvLyByb3cgZXhwYW5kXG4gICAgcHJpdmF0ZSBfcm93RXhwYW5kYWJsZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3Jvd0V4cGFuZGFibGVDb2xTcGFuID0gMTAwO1xuICAgIHByaXZhdGUgX3Jvd0V4cGFuZGFibGVQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcml2YXRlIF9pc1Jvd0V4cGFuZGVkPzogc3RyaW5nIHwgKChpdGVtOiBUYWJsZU1vZGVsKSA9PiBib29sZWFuKTtcbiAgICBwcml2YXRlIF9yb3dFeHBhbmRhYmxlQ29tcG9uZW50VHlwZT86IFR5cGU8SVJvd0V4cGFuZGFibGVDb21wb25lbnQ8VGFibGVNb2RlbD4+O1xuXG4gICAgLy8gcm93IHJlb3JkZXJcbiAgICBwcml2YXRlIF9yb3dSZW9yZGVyYWJsZSA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBfc2VhcmNoPzogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9zZWFyY2hMaW1pdE1heFdvcmRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICBwcml2YXRlIF9zZWFyY2hGaWVsZHM/OiBzdHJpbmdbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPFRhYmxlTW9kZWw+LCBhdXRvR2VuZXJhdGVkID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5fdHJhY2tQcm9wZXJ0eSA9IHRoaXMuX21vZGVsLmlkUHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2F1dG9HZW5lcmF0ZWQgPSBhdXRvR2VuZXJhdGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkZW50aWZpZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0cmFja1Byb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhY2tQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhZ2luYXRpb25Nb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgZ2V0IHJvd3NQZXJQYWdlT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd3NQZXJQYWdlT3B0aW9ucztcbiAgICB9XG5cbiAgICBnZXQgZGVmYXVsdE51bVJvd3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0TnVtUm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhpZGVIZWFkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRlSGVhZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9hZGluZ1RleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkaW5nVGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmdJY29uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZ0ljb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGdlbmVyaWNGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW5lcmljRmlsdGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc29ydHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWFyY2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2g7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWFyY2hMaW1pdE1heFdvcmRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoTGltaXRNYXhXb3JkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlYXJjaEZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaEZpZWxkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzSG92ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNIb3ZlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc0dyaWRsaW5lcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0dyaWRsaW5lcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc1Jlc2l6YWJsZUNvbHVtbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNSZXNpemFibGVDb2x1bW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sdW1uUmVzaXplTW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtblJlc2l6ZU1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dDbGFzc05hbWVNYXBGbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0NsYXNzTmFtZU1hcEZuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2VsZWN0aW9uQ29sdW1uRnJvemVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uQ29sdW1uRnJvemVuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9uQ29sdW1uRnJvemVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aW9uQ29sdW1uRnJvemVuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGVhZGVyQ2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyQ2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNMb2NhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xvY2FsaXplZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dSZW9yZGVyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd1Jlb3JkZXJhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93RXhwYW5kYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0V4cGFuZGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dFeHBhbmRhYmxlQ29sU3BhbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0V4cGFuZGFibGVDb2xTcGFuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgdGFibGUgbW9kZWwgcHJvcGVydHkgdGVsbHMgdXMgaWYgdGhlIHNwZWNpZmljIHJvdyBzaG91bGQgYmUgZXhwYW5kYWJsZSBvciBub3QgYmFzZWQgb24gcm93IGl0ZW0gdmFsdWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0V4cGFuZGFibGVQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0V4cGFuZGFibGVQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHRhYmxlIG1vZGVsIHByb3BlcnR5IHRlbGxzIHVzIHdoZW4gdGhlIHRhYmxlIHJvdyBzaG91bGQgYmUgZXhwYW5kZWQgYnkgZGVmYXVsdCwgd2l0aG91dCBjbGlja2luZyBvbiB0aGUgdG9nZ2xlIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUm93RXhwYW5kZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1Jvd0V4cGFuZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBkZWZpbmUgdGhlIHR5cGUgb2YgdGhlIGN1c3RvbSBjb21wb25lbnQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBleHBhbmRlZCByb3cuXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFeHBhbmRhYmxlQ29tcG9uZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0V4cGFuZGFibGVDb21wb25lbnRUeXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgaXMgdXNlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgY29tYmluZWQgc2F2aW5nIHVzZXIgcHJlZmVyZW5jZXMgaW4gbG9jYWxzdG9yYWdlIGlmIDIgdGFibGVzIGhhdmUgdGhlIHNhbWUgdHJhY2sgcHJvcGVydGllcyB0aGV5IHdpbGwgc2hhcmUgdGhlIHNhbWUgbG9jYWxzdG9yYWdlIGVudHJ5LlxuICAgICAqIFNpbWlsYXJseSwgdGhpcyBwcm9wZXJ0eSBjYW4gYWxzbyBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdHdvIHRhYmxlcyBvZiB0aGUgc2FtZSBtb2RlbCBvbiB0aGUgc2FtZSB1cmwgKHNvIHRoYXQgdGhleSBoYXZlIHNlcGFyYXRlIGVudHJpZXMgaW4gbG9jYWxzdG9yYWdlKS5cbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoSWRlbnRpZmllcihpZGVudGlmaWVyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHRyYWNrIHByb3BlcnR5IChpZGVudGlmaWVyIG9mIHRhYmxlIHJvdykgZm9yIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7a2V5b2YgVGFibGVNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gdHJhY2sgdGhlIHJvdyBpdGVtcyBieS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFRyYWNrUHJvcGVydHkocHJvcGVydHk/OiBrZXlvZiBUYWJsZU1vZGVsKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhUcmFja1Byb3BlcnR5VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdHJhY2sgcHJvcGVydHkgKGlkZW50aWZpZXIgb2YgdGFibGUgcm93KSBmb3IgdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gc2V0ICdfdHJhY2tQcm9wZXJ0eScgdG8uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhUcmFja1Byb3BlcnR5VW5zYWZlKHByb3BlcnR5Pzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RyYWNrUHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBjb2x1bW4gZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtrZXlvZiBUYWJsZU1vZGVsfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBmb3IgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29sdW1uPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgVGFibGVNb2RlbCwgQ29sdW1uTW9kZWwgPSBOb25OdWxsYWJsZTxUYWJsZU1vZGVsW1Byb3BlcnR5XT4sIENvbHVtblZhbHVlID0gVGFibGVNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHlcbiAgICApOiBDb2x1bW5EZXNjcmlwdG9yPENvbHVtbk1vZGVsLCBUYWJsZU1vZGVsLCBDb2x1bW5WYWx1ZT4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29sdW1uVW5zYWZlPENvbHVtbk1vZGVsLCBDb2x1bW5WYWx1ZT4ocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbHVtbiBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7a2V5b2YgVGFibGVNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgZm9yIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGdldENvbHVtblVuc2FmZTxDb2x1bW5Nb2RlbCA9IGFueSwgQ29sdW1uVmFsdWUgPSBDb2x1bW5Nb2RlbD4ocHJvcGVydHk6IHN0cmluZyk6IENvbHVtbkRlc2NyaXB0b3I8Q29sdW1uTW9kZWwsIFRhYmxlTW9kZWwsIENvbHVtblZhbHVlPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5maW5kKGNvbCA9PiBjb2wucHJvcGVydHkgPT09IHByb3BlcnR5KSA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGNvbHVtbiBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2tleW9mIFRhYmxlTW9kZWx9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGZvciBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlQ29sdW1uKHByb3BlcnR5OiBrZXlvZiBUYWJsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ29sdW1uVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY29sdW1uIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtrZXlvZiBUYWJsZU1vZGVsfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBmb3IgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUNvbHVtblVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbHVtbklkeCA9IHRoaXMuX2NvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnNwbGljZShjb2x1bW5JZHgsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgY29sdW1uIGRlc2NyaXB0b3IgdG8gdGFibGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Q29sdW1uRGVzY3JpcHRvcjxDb2x1bW5Nb2RlbCwgVGFibGVNb2RlbCwgQ29sdW1uVmFsdWU+fSBjb2x1bW4gLSBUaGUgcHJvcGVydHkgZm9yIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uPENvbHVtbk1vZGVsLCBDb2x1bW5WYWx1ZSA9IENvbHVtbk1vZGVsPihjb2x1bW46IENvbHVtbkRlc2NyaXB0b3I8Q29sdW1uTW9kZWwsIFRhYmxlTW9kZWwsIENvbHVtblZhbHVlPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5S2V5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIGNvbHVtbiBpbiB0aGUgdGFibGUgbW9kZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3bHkgYWRkZWQgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZENvbHVtbjxQcm9wZXJ0eUtleSBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWw+KHByb3BlcnR5OiBQcm9wZXJ0eUtleSkge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcjxOb25OdWxsYWJsZTxUYWJsZU1vZGVsW1Byb3BlcnR5S2V5XT4sIFRhYmxlTW9kZWwsIFRhYmxlTW9kZWxbUHJvcGVydHlLZXldPihwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29sdW1uIHdpdGggZW51bSBkaXNwbGF5IHRvIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHlLZXl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgdGFibGUgbW9kZWwuXG4gICAgICogQHBhcmFtIHtFbnVtRGVzY3JpcHRvcjxFbnVtPn0gZW51bURlc2MgLSBUaGUgZW51bSBkZXNjcmlwdG9yIGZvciBjb2x1bW4gZGlzcGxheS5cbiAgICAgKiBAcmV0dXJuIHtDb2x1bW5EZXNjcmlwdG9yPEVudW0sIFRhYmxlTW9kZWwsIFRhYmxlTW9kZWxbUHJvcGVydHlLZXldPn0gLSBUaGUgYWRkZWQgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZENvbHVtbkVudW08UHJvcGVydHlLZXkgZXh0ZW5kcyBrZXlvZiBUYWJsZU1vZGVsLCBFbnVtIGV4dGVuZHMgTm9uTnVsbGFibGU8VGFibGVNb2RlbFtQcm9wZXJ0eUtleV0+Pihwcm9wZXJ0eTogUHJvcGVydHlLZXksIGVudW1EZXNjOiBFbnVtRGVzY3JpcHRvcjxFbnVtPikge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcjxFbnVtLCBUYWJsZU1vZGVsLCBUYWJsZU1vZGVsW1Byb3BlcnR5S2V5XT4ocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICAgICAgY29sdW1uLmFzRW51bVVuc2FmZShlbnVtRGVzYyk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjb2x1bW4gdG8gdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBjb2x1bW4gaW4gdGhlIHRhYmxlIG1vZGVsLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5ld2x5IGFkZGVkIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRDb2x1bW5VbnNhZmU8Q29sdW1uTW9kZWwgPSB1bmtub3duPihwcm9wZXJ0eTogc3RyaW5nKTogQ29sdW1uRGVzY3JpcHRvcjxDb2x1bW5Nb2RlbCwgVGFibGVNb2RlbD4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcjxDb2x1bW5Nb2RlbCwgVGFibGVNb2RlbD4ocHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG9uZSBvciBtb3JlIGNvbHVtbnMgdG8gdGhlIHRhYmxlIG1vZGVsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgLSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0byBhZGQgYXMgY29sdW1ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENvbHVtbnMoLi4ucHJvcGVydGllczogKGtleW9mIFRhYmxlTW9kZWwpW10pOiB0aGlzIHtcbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHAgPT4gdGhpcy5hZGRDb2x1bW4ocCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBhZ2luYXRpb24gbW9kZSBmb3IgdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUYWJsZVBhZ2luYXRpb25Nb2RlRW51bX0gcGFnaW5hdGlvbk1vZGUgLSBUaGUgcGFnaW5hdGlvbiBtb2RlIHRvIHNldC4gTXVzdCBiZSBvbmUgb2YgdGhlIHZhbHVlcyBmcm9tIHRoZSBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFBhZ2luYXRpb25Nb2RlKHBhZ2luYXRpb25Nb2RlOiBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uTW9kZSA9IHBhZ2luYXRpb25Nb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFnZSBmb3IgYSBwYWdpbmF0ZWQgZGlzcGxheS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3dzIC0gVGhlIGRlZmF1bHQgbnVtYmVyIG9mIHJvd3MgdG8gZGlzcGxheSBwZXIgcGFnZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtvcHRpb25zXSAtIFJvd3MgcGVyIHBhZ2Ugb3B0aW9ucyB0byBiZSBhdmFpbGFibGUgaW4gdGFibGUgcGFnaW5hdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoUm93c1BlclBhZ2Uocm93czogbnVtYmVyLCBvcHRpb25zPzogQXJyYXk8bnVtYmVyPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kZWZhdWx0TnVtUm93cyA9IHJvd3M7XG4gICAgICAgIHRoaXMuX3Jvd3NQZXJQYWdlT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHRpdGxlIGZvciBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RpdGxlXSAtIFRoZSB0aXRsZSB2YWx1ZSB0byBiZSBzZXQuIEl0IHVuZGVmaW5lZCwgbm8gdGl0bGUgd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhUaXRsZSh0aXRsZT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl90aXRsZSA9IHRpdGxlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzL2hpZGVzIHRoZSBoZWFkZXIgcm93IHdpdGggY29sdW1uIHRpdGxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGlkZUhlYWRlciAtIEEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gaGlkZSB0aGUgaGVhZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoSGlkZUhlYWRlcihoaWRlSGVhZGVyID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLl9oaWRlSGVhZGVyID0gaGlkZUhlYWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRqdXN0cyBsb2FkaW5nIGRpc3BsYXkgd2l0aCBjdXN0b20gdGV4dCBhbmQvb3IgaWNvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGV4dF0gLSBUZXh0IHRvIGJlIGRpc3BsYXllZCB3aGVuIGxvYWRpbmcgaW5kaWNhdG9yIGlzIHNob3duLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gW2ljb25dIC0gSWNvbiB0byBiZSB1c2VkIHdoZW4gbG9hZGluZyBpbmRpY2F0b3IgaXMgc2hvd24uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhMb2FkaW5nKHRleHQ/OiBzdHJpbmcsIGljb24/OiBzdHJpbmcgfCBudWxsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdUZXh0ID0gdGV4dDtcbiAgICAgICAgdGhpcy5fbG9hZGluZ0ljb24gPSBpY29uID09PSB1bmRlZmluZWQgPyAncGkgcGktc3Bpbm5lcicgOiBpY29uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHNvcnQgZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U29ydHN9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHJldHJpZXZlIHRoZSBzb3J0IGZvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1NvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+IHwgbnVsbH0gVGhlIHNvcnQgZGVzY3JpcHRvciBvciBudWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTb3J0KHByb3BlcnR5OiBTb3J0cyk6IFNvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNvcnRVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHNvcnQgZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTb3J0c30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gcmV0cmlldmUgdGhlIHNvcnQgZm9yLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U29ydERlc2NyaXB0b3I8VGFibGVNb2RlbD4gfCBudWxsfSBUaGUgc29ydCBkZXNjcmlwdG9yIG9yIG51bGwuXG4gICAgICovXG4gICAgcHVibGljIGdldFNvcnRVbnNhZmUocHJvcGVydHk6IHN0cmluZyk6IFNvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0cy5maW5kKHMgPT4gcy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgc29ydCBmb3IgYSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U29ydHN9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHJlbW92ZSB0aGUgc29ydCBmb3IuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVNvcnQocHJvcGVydHk6IFNvcnRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZVNvcnRVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzb3J0IGZvciBhIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NvcnRzfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byByZW1vdmUgdGhlIHNvcnQgZm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc29ydElkeCA9IHRoaXMuX3NvcnRzLmZpbmRJbmRleChjID0+IGMucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fc29ydHMuc3BsaWNlKHNvcnRJZHgsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgc29ydCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IHRvIGFkZCB0aGUgc29ydCBmb3IuXG4gICAgICogQHBhcmFtIGlzRGVmYXVsdCBJZiBkZWZhdWx0IHNvcnRpbmcgaXMgZW5hYmxlZC5cbiAgICAgKiBAcGFyYW0gYXNjZW5kaW5nIElmIGRlZmF1bHQgc29ydCBzaG91bGQgYmUgYXNjZW5kaW5nLlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIHNvcnQgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkU29ydChwcm9wZXJ0eTogU29ydHMsIGlzRGVmYXVsdCA9IGZhbHNlLCBhc2NlbmRpbmc/OiBib29sZWFuKTogU29ydERlc2NyaXB0b3I8VGFibGVNb2RlbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRTb3J0VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgaXNEZWZhdWx0LCBhc2NlbmRpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgc29ydCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgdG8gYWRkIHRoZSBzb3J0IGZvci5cbiAgICAgKiBAcGFyYW0gaXNEZWZhdWx0IElmIGRlZmF1bHQgc29ydGluZyBpcyBlbmFibGVkLlxuICAgICAqIEBwYXJhbSBhc2NlbmRpbmcgSWYgZGVmYXVsdCBzb3J0IHNob3VsZCBiZSBhc2NlbmRpbmcuXG5cbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgc29ydCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcsIGlzRGVmYXVsdCA9IGZhbHNlLCBhc2NlbmRpbmc/OiBib29sZWFuKTogU29ydERlc2NyaXB0b3I8VGFibGVNb2RlbD4ge1xuICAgICAgICBjb25zdCBzb3J0ID0gbmV3IFNvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+KHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGlzRGVmYXVsdCkge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdE9yZGVyTWF4ID0gdGhpcy5fc29ydHNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHMgPT4gcy5kZWZhdWx0SXNFbmFibGVkKVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgcykgPT4gKHMuZGVmYXVsdE9yZGVyICE9PSB1bmRlZmluZWQgJiYgcy5kZWZhdWx0T3JkZXIgPiBhY2MgPyBzLmRlZmF1bHRPcmRlciA6IGFjYyksIC0xKTtcbiAgICAgICAgICAgIHNvcnQud2l0aERlZmF1bHRTb3J0KHRydWUsIGFzY2VuZGluZywgZGVmYXVsdE9yZGVyTWF4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc29ydHMucHVzaChzb3J0KTtcbiAgICAgICAgcmV0dXJuIHNvcnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBzb3J0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgdG8gYWRkIHRoZSBzb3J0IGZvci5cbiAgICAgKiBAcGFyYW0gaXNEZWZhdWx0IElmIGRlZmF1bHQgc29ydGluZyBpcyBlbmFibGVkLlxuICAgICAqIEBwYXJhbSBhc2NlbmRpbmcgSWYgZGVmYXVsdCBzb3J0IHNob3VsZCBiZSBhc2NlbmRpbmcuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhTb3J0KHByb3BlcnR5OiBTb3J0cywgaXNEZWZhdWx0ID0gZmFsc2UsIGFzY2VuZGluZz86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFNvcnRVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nLCBpc0RlZmF1bHQsIGFzY2VuZGluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBzb3J0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSB0byBhZGQgdGhlIHNvcnQgZm9yLlxuICAgICAqIEBwYXJhbSBpc0RlZmF1bHQgSWYgZGVmYXVsdCBzb3J0aW5nIGlzIGVuYWJsZWQuXG4gICAgICogQHBhcmFtIGFzY2VuZGluZyBJZiBkZWZhdWx0IHNvcnQgc2hvdWxkIGJlIGFzY2VuZGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFNvcnRVbnNhZmUocHJvcGVydHk6IHN0cmluZywgaXNEZWZhdWx0ID0gZmFsc2UsIGFzY2VuZGluZz86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hZGRTb3J0VW5zYWZlKHByb3BlcnR5LCBpc0RlZmF1bHQsIGFzY2VuZGluZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGRlZmF1bHQgc29ydGluZyBmb3IgdGhlIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHNldCBkZWZhdWx0IHNvcnQgZm9yLlxuICAgICAqIEBwYXJhbSBhc2NlbmRpbmcgLSBJZiB0aGUgc29ydGluZyBzaG91bGQgYmUgYXNjZW5kaW5nIChkZWZhdWx0OiB0cnVlKS5cbiAgICAgKiBAcGFyYW0gZW5hYmxlZCAtIEVuYWJsZXMvZGlzYWJsZWQgdGhlIGRlZmF1bHQgc29ydC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aERlZmF1bHRTb3J0KHByb3BlcnR5OiBTb3J0cywgYXNjZW5kaW5nPzogYm9vbGVhbiwgZW5hYmxlZD86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aERlZmF1bHRTb3J0VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgYXNjZW5kaW5nLCBlbmFibGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHNvcnRpbmcgZm9yIHRoZSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHNldCBkZWZhdWx0IHNvcnQgZm9yLlxuICAgICAqIEBwYXJhbSBhc2NlbmRpbmcgLSBJZiB0aGUgc29ydGluZyBzaG91bGQgYmUgYXNjZW5kaW5nIChkZWZhdWx0OiB0cnVlKS5cbiAgICAgKiBAcGFyYW0gZW5hYmxlZCAtIEVuYWJsZXMvZGlzYWJsZWQgdGhlIGRlZmF1bHQgc29ydC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aERlZmF1bHRTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcsIGFzY2VuZGluZz86IGJvb2xlYW4sIGVuYWJsZWQ/OiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIGxldCBzb3J0ID0gdGhpcy5fc29ydHMuZmluZChzID0+IHMucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgaWYgKCFzb3J0KSB7XG4gICAgICAgICAgICBzb3J0ID0gbmV3IFNvcnREZXNjcmlwdG9yKHByb3BlcnR5KTtcbiAgICAgICAgICAgIHRoaXMuX3NvcnRzLnB1c2goc29ydCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLl9zb3J0cy5maWx0ZXIocyA9PiBzLmRlZmF1bHRJc0VuYWJsZWQpLnJlZHVjZSgoYWNjLCBzKSA9PiAocy5kZWZhdWx0T3JkZXIgPT0gbnVsbCB8fCBzLmRlZmF1bHRPcmRlciA8IGFjYyA/IGFjYyA6IHMuZGVmYXVsdE9yZGVyICsgMSksIDApO1xuICAgICAgICBzb3J0LndpdGhEZWZhdWx0U29ydChlbmFibGVkID8/IHRydWUsIGFzY2VuZGluZywgb3JkZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHNvcnRpbmcgZm9yIHByb3ZpZGVkIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyAtIFRoZSBwcm9wZXJ0aWVzIHRvIHNldCBkZWZhdWx0IHNvcnQgZm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRGVmYXVsdFNvcnRzKC4uLnByb3BlcnRpZXM6IFNvcnRzW10pOiB0aGlzIHtcbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHAgPT4gdGhpcy53aXRoRGVmYXVsdFNvcnRVbnNhZmUocCBhcyBzdHJpbmcpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5zZXRzIGFsbCBkZWZhdWx0IHNvcnRzLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRob3V0RGVmYXVsdFNvcnRzKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zb3J0cy5mb3JFYWNoKHMgPT4gcy53aXRoRGVmYXVsdFNvcnQoZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBzb3J0cyBmb3IgbW9yZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgUHJvcGVydGllcyB0byBhZGQgdGhlIHNvcnRzIGZvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFNvcnRzKC4uLnByb3BlcnRpZXM6IFNvcnRzW10pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFNvcnRzVW5zYWZlKC4uLihwcm9wZXJ0aWVzIGFzIHN0cmluZ1tdKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHNvcnRzIGZvciBtb3JlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFByb3BlcnRpZXMgdG8gYWRkIHRoZSBzb3J0cyBmb3IuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhTb3J0c1Vuc2FmZSguLi5wcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zb3J0cy5wdXNoKG5ldyBTb3J0RGVzY3JpcHRvcihwKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGZpbHRlciBkZXNjcmlwdG9yIGZvciBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHlcbiAgICAgKlxuICAgICAqIEByZXR1cm4gRmlsdGVyIGRlc2NyaXB0b3IgZm9yIHByb3BlcnR5IG9yIG51bGwgaWYgbm90IGV4aXN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmlsdGVyPEZpbHRlck1vZGVsID0gRmlsdGVycyBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWwgPyBOb25OdWxsYWJsZTxUYWJsZU1vZGVsW0ZpbHRlcnNdPiA6IGFueT4ocHJvcGVydHk6IEZpbHRlcnMpOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBmaWx0ZXIgZGVzY3JpcHRvciBmb3IgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHlcbiAgICAgKlxuICAgICAqIEByZXR1cm4gRmlsdGVyIGRlc2NyaXB0b3IgZm9yIHByb3BlcnR5IG9yIG51bGwgaWYgbm90IGV4aXN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmlsdGVyVW5zYWZlPEZpbHRlck1vZGVsID0gYW55Pihwcm9wZXJ0eTogc3RyaW5nKTogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnMuZmluZChzID0+IHMucHJvcGVydHkgPT09IHByb3BlcnR5KSA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZmlsdGVyIGRlc2NyaXB0b3IgZm9yIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVGaWx0ZXIocHJvcGVydHk6IEZpbHRlcnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlRmlsdGVyVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBmaWx0ZXIgZGVzY3JpcHRvciBmb3IgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlRmlsdGVyVW5zYWZlKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmlsdGVySWR4ID0gdGhpcy5fZmlsdGVycy5maW5kSW5kZXgoYyA9PiBjLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMuc3BsaWNlKGZpbHRlcklkeCwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlsdGVyPEZpbHRlck1vZGVsID0gRmlsdGVycyBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWwgPyBUYWJsZU1vZGVsW0ZpbHRlcnNdIDogbmV2ZXI+KHByb3BlcnR5OiBGaWx0ZXJzKTogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIGZpbHRlciBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KHByb3BlcnR5OiBzdHJpbmcpOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IG5ldyBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPihwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gZmlsdGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGxvb2t1cCBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBwcm92aWRlciBMb29rdXAgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnNWYWx1ZVByb3BlcnR5IFByb3BlcnR5IG9uIGxvb2t1cCBwcm92aWRlcidzIGl0ZW0gKEZpbHRlck1vZGVsKSB0aGF0IHdpbGwgYmUgdXNlZCBhcyBmaWx0ZXIgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgZmlsdGVyIGxvb2t1cCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXJMb29rdXA8RmlsdGVyTW9kZWwgPSBGaWx0ZXJzIGV4dGVuZHMga2V5b2YgVGFibGVNb2RlbCA/IE5vbk51bGxhYmxlPFRhYmxlTW9kZWxbRmlsdGVyc10+IDogbmV2ZXIsIFNlcnZpY2UgPSB1bmRlZmluZWQ+KFxuICAgICAgICBwcm9wZXJ0eTogRmlsdGVycyxcbiAgICAgICAgcHJvdmlkZXI/OiBJTG9va3VwRGF0YVByb3ZpZGVyPEZpbHRlck1vZGVsLCBTZXJ2aWNlLCBhbnksIGFueT4sXG4gICAgICAgIG9wdGlvbnNWYWx1ZVByb3BlcnR5Pzoga2V5b2YgRmlsdGVyTW9kZWxcbiAgICApOiBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsLCBTZXJ2aWNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEZpbHRlckxvb2t1cFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcsIHByb3ZpZGVyLCBvcHRpb25zVmFsdWVQcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGxvb2t1cCBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIExvb2t1cCBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0gb3B0aW9uc1ZhbHVlUHJvcGVydHkgUHJvcGVydHkgb24gbG9va3VwIHByb3ZpZGVyJ3MgaXRlbSAoRmlsdGVyTW9kZWwpIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgbG9va3VwIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpbHRlckxvb2t1cFVuc2FmZTxGaWx0ZXJNb2RlbCwgU2VydmljZSA9IHVuZGVmaW5lZD4oXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIHByb3ZpZGVyPzogSUxvb2t1cERhdGFQcm92aWRlcjxGaWx0ZXJNb2RlbCwgU2VydmljZSwgYW55LCBhbnk+LFxuICAgICAgICBvcHRpb25zVmFsdWVQcm9wZXJ0eT86IHN0cmluZ1xuICAgICk6IEZpbHRlckxvb2t1cERlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWwsIFNlcnZpY2U+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gbmV3IEZpbHRlckxvb2t1cERlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWwsIFNlcnZpY2U+KHByb3BlcnR5LCB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXI6IHByb3ZpZGVyLFxuICAgICAgICAgICAgb3B0aW9uc1ZhbHVlUHJvcGVydHk6IG9wdGlvbnNWYWx1ZVByb3BlcnR5XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBsb29rdXAgZW51bSBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBlbnVtRGVzYyBEZXNjcmlwdG9yIGZvciBlbnVtLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIG9wdGlvbnMgb2YgZW51bSB2YWx1ZXMgdG8gYmUgYXZhaWxhYmxlIHRvIGZpbHRlciBieS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgbG9va3VwIGVudW0gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlsdGVyTG9va3VwRW51bTxFbnVtPihwcm9wZXJ0eTogRmlsdGVycywgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+LCBvcHRpb25zPzogQXJyYXk8RW51bT4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRmlsdGVyTG9va3VwRW51bVVuc2FmZTxFbnVtPihwcm9wZXJ0eSBhcyBzdHJpbmcsIGVudW1EZXNjLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBsb29rdXAgZW51bSBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIGVudW1EZXNjIERlc2NyaXB0b3IgZm9yIGVudW0uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgb3B0aW9ucyBvZiBlbnVtIHZhbHVlcyB0byBiZSBhdmFpbGFibGUgdG8gZmlsdGVyIGJ5LlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIGZpbHRlciBsb29rdXAgZW51bSBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXJMb29rdXBFbnVtVW5zYWZlPEVudW0gPSBFbnVtQ29uc3RhbnRUeXBlPihwcm9wZXJ0eTogc3RyaW5nLCBlbnVtRGVzYzogRW51bURlc2NyaXB0b3I8RW51bT4sIG9wdGlvbnM/OiBBcnJheTxFbnVtPikge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBuZXcgRmlsdGVyTG9va3VwRW51bURlc2NyaXB0b3IocHJvcGVydHksIGVudW1EZXNjLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgICAgIHJldHVybiBmaWx0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgZGVzY3JpcHRvciBmcm9tIGNvbHVtbi4gVGhlIGNvbHVtbiBtdXN0IGV4aXN0IG9uIHRhYmxlIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgQ29sdW1uIHByb3BlcnR5IHRvIGFkZCBmaWx0ZXIgZm9yLlxuICAgICAqIEBwYXJhbSBkaXNwbGF5VHlwZSBPcHRpb25hbCBkaXNwbGF5IHR5cGUgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0gZm9yY2VTaW1wbGUgRm9yY2VzIHNpbXBsZSBjcmVhdGlvbiBvZiBmaWx0ZXIgKG5vIGxvb2t1cCBvciBsb29rdXAgZW51bSBmaWx0ZXJzKS5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0NvbW1vbnNJbnRlcm5hbEVycm9yfSBJZiBjb2x1bW4gZm9yIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgZmlsdGVyIGRlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlsdGVyRnJvbUNvbHVtbjxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWwsIEZpbHRlck1vZGVsID0gTm9uTnVsbGFibGU8VGFibGVNb2RlbFtQcm9wZXJ0eV0+PihcbiAgICAgICAgcHJvcGVydHk6IEV4dHJhY3Q8RmlsdGVycywgUHJvcGVydHk+LFxuICAgICAgICBkaXNwbGF5VHlwZT86IEZpbHRlckRpc3BsYXlUeXBlRW51bSxcbiAgICAgICAgZm9yY2VTaW1wbGUgPSBmYWxzZVxuICAgICk6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRmlsdGVyRnJvbUNvbHVtblVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcsIGRpc3BsYXlUeXBlLCBmb3JjZVNpbXBsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEdlbmVyaWNGaWx0ZXIocHJvcGVydHlMb29rdXBEYXRhUHJvdmlkZXI6IExvb2t1cERhdGFQcm92aWRlckluc3Q8RmlsdGVyR2VuZXJpY1Byb3BlcnR5Pik6IEZpbHRlckdlbmVyaWNEZXNjcmlwdG9yIHtcbiAgICAgICAgdGhpcy5fZ2VuZXJpY0ZpbHRlciA9IG5ldyBGaWx0ZXJHZW5lcmljRGVzY3JpcHRvcihwcm9wZXJ0eUxvb2t1cERhdGFQcm92aWRlcik7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW5lcmljRmlsdGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoR2VuZXJpY0ZpbHRlcihcbiAgICAgICAgcHJvcGVydHlMb29rdXBEYXRhUHJvdmlkZXI6IExvb2t1cERhdGFQcm92aWRlckluc3Q8RmlsdGVyR2VuZXJpY1Byb3BlcnR5PixcbiAgICAgICAgdmFsdWVMb29rdXBEYXRhUHJvdmlkZXI/OiBMb29rdXBEYXRhUHJvdmlkZXJJbnN0PHN0cmluZywgYW55LCBhbnksICdmaWVsZCc+XG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2dlbmVyaWNGaWx0ZXIgPSB0aGlzLmFkZEdlbmVyaWNGaWx0ZXIocHJvcGVydHlMb29rdXBEYXRhUHJvdmlkZXIpO1xuXG4gICAgICAgIGlmICh2YWx1ZUxvb2t1cERhdGFQcm92aWRlcikge1xuICAgICAgICAgICAgdGhpcy5fZ2VuZXJpY0ZpbHRlci53aXRoVmFsdWVMb29rdXAodmFsdWVMb29rdXBEYXRhUHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGRlc2NyaXB0b3JzIGZyb20gY29sdW1ucy4gVGhlIGNvbHVtbnMgbXVzdCBleGlzdCBvbiB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgQ29sdW1uIHByb3BlcnRpZXMgdG8gYWRkIGZpbHRlcnMgZm9yLlxuICAgICAqXG4gICAgICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IElmIGNvbHVtbiBmb3IgcHJvcGVydHkgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEZpbHRlcnNGcm9tQ29sdW1ucyguLi5wcm9wZXJ0aWVzOiBFeHRyYWN0PEZpbHRlcnMsIGtleW9mIFRhYmxlTW9kZWw+W10pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aEZpbHRlcnNGcm9tQ29sdW1uc1Vuc2FmZSguLi4ocHJvcGVydGllcyBhcyBzdHJpbmdbXSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGRlc2NyaXB0b3JzIGZyb20gY29sdW1ucy4gVGhlIGNvbHVtbnMgbXVzdCBleGlzdCBvbiB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBDb2x1bW4gcHJvcGVydGllcyB0byBhZGQgZmlsdGVycyBmb3IuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtDb21tb25zSW50ZXJuYWxFcnJvcn0gSWYgY29sdW1uIGZvciBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRmlsdGVyc0Zyb21Db2x1bW5zVW5zYWZlKC4uLnByb3BlcnRpZXM6IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsdGVyRnJvbUNvbHVtblVuc2FmZShwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGRlc2NyaXB0b3IgZnJvbSBjb2x1bW4uIFRoZSBjb2x1bW4gbXVzdCBleGlzdCBvbiB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgQ29sdW1uIHByb3BlcnR5IHRvIGFkZCBmaWx0ZXIgZm9yLlxuICAgICAqIEBwYXJhbSBkaXNwbGF5VHlwZSBPcHRpb25hbCBkaXNwbGF5IHR5cGUgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0gZm9yY2VTaW1wbGUgRm9yY2VzIHNpbXBsZSBjcmVhdGlvbiBvZiBmaWx0ZXIgKG5vIGxvb2t1cCBvciBsb29rdXAgZW51bSBmaWx0ZXJzKS5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0NvbW1vbnNJbnRlcm5hbEVycm9yfSBJZiBjb2x1bW4gZm9yIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgZmlsdGVyIGRlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlsdGVyRnJvbUNvbHVtblVuc2FmZTxGaWx0ZXJNb2RlbCA9IGFueT4ocHJvcGVydHk6IHN0cmluZywgZGlzcGxheVR5cGU/OiBGaWx0ZXJEaXNwbGF5VHlwZUVudW0sIGZvcmNlU2ltcGxlID0gZmFsc2UpOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uVW5zYWZlPEZpbHRlck1vZGVsLCBhbnk+KHByb3BlcnR5KTtcbiAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgTm8gY29sdW1uIGZvdW5kIGZvciBmaWx0ZXIgcHJvcGVydHkgXCIke3Byb3BlcnR5fVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5hZGRGaWx0ZXJGcm9tQ29sdW1uRGVzY3JpcHRvclVuc2FmZTxGaWx0ZXJNb2RlbD4oY29sdW1uLCBmb3JjZVNpbXBsZSk7XG4gICAgICAgIGlmIChkaXNwbGF5VHlwZSAhPSBudWxsKSBmaWx0ZXIud2l0aERpc3BsYXlUeXBlKGRpc3BsYXlUeXBlKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBkZXNjcmlwdG9yIGZyb20gcHJvdmlkZWQgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2x1bW4gQ29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIGZvcmNlU2ltcGxlIEZvcmNlcyBzaW1wbGUgY3JlYXRpb24gb2YgZmlsdGVyIChubyBsb29rdXAgb3IgbG9va3VwIGVudW0gZmlsdGVycykuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtDb21tb25zSW50ZXJuYWxFcnJvcn0gSWYgY29sdW1uIGZvciBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIGZpbHRlciBkZXNjcmlwdG9yXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpbHRlckZyb21Db2x1bW5EZXNjcmlwdG9yVW5zYWZlPEZpbHRlck1vZGVsPihcbiAgICAgICAgY29sdW1uOiBDb2x1bW5EZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsLCBhbnk+LFxuICAgICAgICBmb3JjZVNpbXBsZSA9IGZhbHNlXG4gICAgKTogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4ge1xuICAgICAgICBsZXQgZmlsdGVyRGVzY3JpcHRvciA9IG5ldyBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPihjb2x1bW4ucHJvcGVydHkpO1xuICAgICAgICBsZXQgZmlsdGVyVHlwZTogRmlsdGVyVHlwZUVudW07XG5cbiAgICAgICAgc3dpdGNoIChjb2x1bW4uY29sdW1uVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlRW51bS5OdW1iZXI6XG4gICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZpbHRlclR5cGVFbnVtLk51bWJlcjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZUVudW0uQm9vbGVhbjpcbiAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlID0gRmlsdGVyVHlwZUVudW0uQm9vbGVhbjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZUVudW0uRGF0ZTpcbiAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlID0gRmlsdGVyVHlwZUVudW0uRGF0ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZUVudW0uRW51bTpcbiAgICAgICAgICAgICAgICBpZiAoIWZvcmNlU2ltcGxlICYmIGNvbHVtbi5lbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckRlc2NyaXB0b3IgPSBuZXcgRmlsdGVyTG9va3VwRW51bURlc2NyaXB0b3IoY29sdW1uLnByb3BlcnR5LCBjb2x1bW4uZW51bSkgYXMgRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD47XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlRW51bS5Mb29rdXBFbnVtO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlRW51bS5TdHJpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlRW51bS5TdHJpbmc6XG4gICAgICAgICAgICBjYXNlIENvbHVtblR5cGVFbnVtLkN1c3RvbTpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZpbHRlclR5cGVFbnVtLlN0cmluZztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbHRlckRlc2NyaXB0b3IuYXNGaWx0ZXJUeXBlKGZpbHRlclR5cGUpO1xuICAgICAgICBpZiAoKGZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLk51bWJlciB8fCBmaWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5EYXRlKSAmJiBjb2x1bW4uZGlzcGxheUZvcm1hdCkge1xuICAgICAgICAgICAgZmlsdGVyRGVzY3JpcHRvci53aXRoRGlzcGxheUZvcm1hdChjb2x1bW4uZGlzcGxheUZvcm1hdCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyRGVzY3JpcHRvcik7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlckRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBmaWx0ZXIgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gZmlsdGVyIERlc2NyaXB0b3IgZm9yIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRmlsdGVyPEZpbHRlck1vZGVsPihwcm9wZXJ0eTogRmlsdGVycywgZmlsdGVyOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPik6IHRoaXMge1xuICAgICAgICBpZiAoZmlsdGVyLnByb3BlcnR5ICE9PSBwcm9wZXJ0eSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGBGaWx0ZXIgcHJvcGVydHkgXCIke3Byb3BlcnR5fVwiIGFuZCBGaWx0ZXIgZGVzY3JpcHRvciBwcm9wZXJ0eSBcIiR7ZmlsdGVyLnByb3BlcnR5fVwiIGRvIG5vdCBtYXRjaC5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy53aXRoRmlsdGVyVW5zYWZlPEZpbHRlck1vZGVsPihmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgZmlsdGVyIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbHRlciBEZXNjcmlwdG9yIGZvciBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEZpbHRlclVuc2FmZTxGaWx0ZXJNb2RlbD4oZmlsdGVyOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZ2xvYmFsIHNlYXJjaCBvcHRpb24gZm9yIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VhcmNoIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdsb2JhbCBzZWFyY2ggc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAgICogQHBhcmFtIG9wdHMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHNlYXJjaC4gbGltaXRNYXhXb3JkcyBjYW4gbGltaXQgbWF4IHdvcmRzIGFzIHNlYXJjaCBpbnB1dCBhbmQgZmllbGRzIGNhbiBsaW1pdFxuICAgICAqIHRoZSBmaWx0ZXJpbmcgZmllbGRzIGluY2x1ZGVkIGluIHNlYXJjaCB3aGVuIGxhenkgbG9hZCBpcyBub3QgYmVpbmcgdXNlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFNlYXJjaChzZWFyY2ggPSB0cnVlLCBvcHRzPzoge2xpbWl0TWF4V29yZHM/OiBudW1iZXIgfCBudWxsOyBmaWVsZHM/OiAoa2V5b2YgVGFibGVNb2RlbClbXX0pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFNlYXJjaFVuc2FmZShzZWFyY2gsIHtcbiAgICAgICAgICAgIGZpZWxkczogb3B0cz8uZmllbGRzIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgbGltaXRNYXhXb3Jkczogb3B0cz8ubGltaXRNYXhXb3Jkc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBnbG9iYWwgc2VhcmNoIG9wdGlvbiBmb3IgdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzZWFyY2ggLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2xvYmFsIHNlYXJjaCBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKiBAcGFyYW0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3Igc2VhcmNoLiBsaW1pdE1heFdvcmRzIGNhbiBsaW1pdCBtYXggd29yZHMgYXMgc2VhcmNoIGlucHV0IGFuZCBmaWVsZHMgY2FuIGxpbWl0XG4gICAgICogdGhlIGZpbHRlcmluZyBmaWVsZHMgaW5jbHVkZWQgaW4gc2VhcmNoIHdoZW4gbGF6eSBsb2FkIGlzIG5vdCBiZWluZyB1c2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoU2VhcmNoVW5zYWZlKHNlYXJjaCA9IHRydWUsIG9wdHM/OiB7bGltaXRNYXhXb3Jkcz86IG51bWJlciB8IG51bGw7IGZpZWxkcz86IHN0cmluZ1tdfSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zZWFyY2ggPSBzZWFyY2g7XG4gICAgICAgIHRoaXMuX3NlYXJjaExpbWl0TWF4V29yZHMgPSBvcHRzPy5saW1pdE1heFdvcmRzO1xuICAgICAgICB0aGlzLl9zZWFyY2hGaWVsZHMgPSBvcHRzPy5maWVsZHMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgY2xhc3NlcyBmb3IgdGFibGUgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNsYXNzTmFtZSBDbGFzcyBuYW1lcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENsYXNzTmFtZShjbGFzc05hbWU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGFibGUgc2l6aW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNpemUgVGFibGUgc2l6ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFNpemUoc2l6ZTogVGFibGVTaXplRW51bSA9IFRhYmxlU2l6ZUVudW0uTm9ybWFsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3NpemUgPSBzaXplO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGhvdmVyIGVmZmVjdCBvbiB0YWJsZSByb3dzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGhvdmVyIEVuYWJsZXMvZGlzYWJsZXMgdGhlIGhvdmVyLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoSG92ZXIoaG92ZXIgPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hhc0hvdmVyID0gaG92ZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgZ3JpZGxpbmVzIG9uIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGdyaWRsaW5lcyBFbmFibGVzL2Rpc2FibGVzIHRoZSBncmlkbGluZXMuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhHcmlkbGluZXMoZ3JpZGxpbmVzID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNHcmlkbGluZXMgPSBncmlkbGluZXM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMvZGlzYWJsZXMgcmVvcmRlcmFibGUgcHJvcGVydHkgb24gYWxsIGNvbHVtbnMgY3VycmVudGx5IGluIHRoZSBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sdW1uc1Jlb3JkZXJhYmxlXSAtIEJvb2xlYW4gZmxhZyB0byBzZXQgcmVvcmRlcmluZyBvbiBjb2x1bW5zIHRvLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ3VycmVudENvbHVtbnNSZW9yZGVyYWJsZShjb2x1bW5zUmVvcmRlcmFibGUgPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuY29sdW1ucykge1xuICAgICAgICAgICAgY29sLndpdGhSZW9yZGVyYWJsZShjb2x1bW5zUmVvcmRlcmFibGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMvZGlzYWJsZXMgdG9nZ2xlYWJsZSBwcm9wZXJ0eSBvbiBhbGwgY29sdW1ucyBjdXJyZW50bHkgaW4gdGhlIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb2x1bW5zVG9nZ2xlYWJsZV0gLSBCb29sZWFuIGZsYWcgdG8gc2V0IHRvZ2dsZWFibGUgb24gY29sdW1ucyB0by5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEN1cnJlbnRDb2x1bW5zVG9nZ2xlYWJsZShjb2x1bW5zVG9nZ2xlYWJsZSA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5jb2x1bW5zKSB7XG4gICAgICAgICAgICBjb2wud2l0aFRvZ2dsZWFibGUoY29sdW1uc1RvZ2dsZWFibGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMvZGlzYWJsZWQgY29sdW1uIHJlc2l6ZSBmZWF0dXJlIHdpdGggY29sdW1uUmVzaXplTW9kZSBvbiBhbGwgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXNpemFibGVDb2x1bW5zIFRydWUgaWYgZW5hYmxlZFxuICAgICAqIEBwYXJhbSBjb2x1bW5SZXNpemVNb2RlICdmaXQnIG9yICdleHBhbmQnIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENvbHVtbnNSZXNpemFibGUocmVzaXphYmxlQ29sdW1ucyA9IHRydWUsIGNvbHVtblJlc2l6ZU1vZGU6ICdmaXQnIHwgJ2V4cGFuZCcgPSAnZml0Jyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNSZXNpemFibGVDb2x1bW5zID0gcmVzaXphYmxlQ29sdW1ucztcbiAgICAgICAgdGhpcy5fY29sdW1uUmVzaXplTW9kZSA9IGNvbHVtblJlc2l6ZU1vZGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgY29sdW1uIHRvICh1bilmcm96ZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9uQ29sdW1uRnJvemVuIFRydWUgdG8gZnJlZXplIHNlbGVjdGlvbiBjb2x1bW4sIGZhbHNlIHRvIHVuZnJlZXplIGl0LlxuICAgICAqIEBwYXJhbSBhY3Rpb25Db2x1bW5Gcm96ZW4gVHJ1ZSB0byBmcmVlemUgYWN0aW9uIGNvbHVtbiwgZmFsc2UgdG8gdW5mcmVlemUgaXQuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5Gcm96ZW4oc2VsZWN0aW9uQ29sdW1uRnJvemVuPzogYm9vbGVhbiwgYWN0aW9uQ29sdW1uRnJvemVuPzogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb25Db2x1bW5Gcm96ZW4gPSBzZWxlY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgICAgIHRoaXMuX2FjdGlvbkNvbHVtbkZyb3plbiA9IGFjdGlvbkNvbHVtbkZyb3plbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY2xhc3MgbmFtZSBmb3Igcm93cyBpbiB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcm93Q2xhc3NOYW1lIC0gVGhlIENTUyBjbGFzcyBuYW1lIHRvIGJlIGFwcGxpZWQgdG8gZWFjaCByb3cuXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NsYXNzTmFtZU1hcEZuXSAtIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIG1hcCB0aGUgY2xhc3MgbmFtZSBkeW5hbWljYWxseSBiYXNlZCBvbiByb3cncyBpdGVtIGFuZCBjdXJyZW50IGNsYXNzIG5hbWUuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhSb3dDbGFzc05hbWUocm93Q2xhc3NOYW1lPzogc3RyaW5nLCBjbGFzc05hbWVNYXBGbj86IChjbGFzc05hbWU/OiBzdHJpbmcsIGl0ZW0/OiBUYWJsZU1vZGVsKSA9PiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcm93Q2xhc3NOYW1lID0gcm93Q2xhc3NOYW1lO1xuICAgICAgICB0aGlzLl9yb3dDbGFzc05hbWVNYXBGbiA9IGNsYXNzTmFtZU1hcEZuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGhlYWRlciByb3cgY2xhc3MgbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBoZWFkZXJDbGFzc05hbWUgQ2xhc3MgbmFtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEhlYWRlckNsYXNzTmFtZShoZWFkZXJDbGFzc05hbWU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oZWFkZXJDbGFzc05hbWUgPSBoZWFkZXJDbGFzc05hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgbG9jYWxpemF0aW9uIG9mIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aExvY2FsaXplZCgpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNMb2NhbGl6ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGxvY2FsZSBwcm9wZXJ0eSBmb3IgbG9jYWxpemF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IExvY2FsZSBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoTG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHkocHJvcGVydHk6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9pc0xvY2FsaXplZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2xvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgcm93IGV4cGFuZGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSB0byBjaGVjayBpZiByb3cgY2FuIGJlIGV4cGFuZGVkLlxuICAgICAqIEBwYXJhbSBjb2xTcGFuIHNldCBjdXN0b20gcm93IHNwYW4gZm9yIGV4cGFuZGVkIHJvdy5cbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSBDb21wb25lbnQgdG8gYmUgZGlzcGxheWVkIG9uIHJvdyBleHBhbmQuXG4gICAgICogQHBhcmFtIGlzUm93RXhwYW5kZWQgUHJvcGVydHkgb3IgZnVuY3Rpb24gdGhhdCB0ZWxscyB0aGUgdGFibGUgdG8gZXhwYW5kIHRoZSByb3cgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFJvd0V4cGFuZGFibGUoXG4gICAgICAgIHByb3BlcnR5Pzoga2V5b2YgVGFibGVNb2RlbCxcbiAgICAgICAgY29sU3Bhbj86IG51bWJlcixcbiAgICAgICAgY29tcG9uZW50VHlwZT86IFR5cGU8SVJvd0V4cGFuZGFibGVDb21wb25lbnQ8VGFibGVNb2RlbD4+LFxuICAgICAgICBpc1Jvd0V4cGFuZGVkPzogc3RyaW5nIHwgKChpdGVtOiBUYWJsZU1vZGVsKSA9PiBib29sZWFuKVxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLl9yb3dFeHBhbmRhYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9yb3dFeHBhbmRhYmxlUHJvcGVydHkgPSBwcm9wZXJ0eSBhcyBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbFNwYW4pIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvd0V4cGFuZGFibGVDb2xTcGFuID0gY29sU3BhbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9uZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fcm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzUm93RXhwYW5kZWQgPSBpc1Jvd0V4cGFuZGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHJvdyByZW9yZGVyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlb3JkYWJsZSBFbmFibGVzL2Rpc2FibGVzIGZlYXR1cmUuXG4gICAgICovXG4gICAgd2l0aFJvd1Jlb3JkZXJhYmxlKHJlb3JkYWJsZSA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5fcm93UmVvcmRlcmFibGUgPSByZW9yZGFibGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjb3B5RmllbGRzVG8ob2JqOiBUYWJsZURlc2NyaXB0b3JJbnN0PGFueSwgYW55LCBhbnk+KSB7XG4gICAgICAgIG9iai5fdGl0bGUgPSB0aGlzLl90aXRsZTtcbiAgICAgICAgb2JqLl9oaWRlSGVhZGVyID0gdGhpcy5faGlkZUhlYWRlcjtcbiAgICAgICAgb2JqLl90cmFja1Byb3BlcnR5ID0gdGhpcy5fdHJhY2tQcm9wZXJ0eTtcbiAgICAgICAgb2JqLl9maWx0ZXJzID0gdGhpcy5fZmlsdGVycy5tYXAoZiA9PiBmLmNvcHkoKSk7XG4gICAgICAgIG9iai5fc29ydHMgPSB0aGlzLl9zb3J0cy5tYXAocyA9PiBzLmNvcHkoKSk7XG4gICAgICAgIG9iai5fc2VhcmNoID0gdGhpcy5fc2VhcmNoO1xuICAgICAgICBvYmouX3NlYXJjaExpbWl0TWF4V29yZHMgPSB0aGlzLl9zZWFyY2hMaW1pdE1heFdvcmRzO1xuICAgICAgICBvYmouX3NlYXJjaEZpZWxkcyA9IHRoaXMuX3NlYXJjaEZpZWxkcyA/IFsuLi50aGlzLl9zZWFyY2hGaWVsZHNdIDogdW5kZWZpbmVkO1xuICAgICAgICBvYmouX2NsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcbiAgICAgICAgb2JqLl9zaXplID0gdGhpcy5fc2l6ZTtcbiAgICAgICAgb2JqLl9oYXNIb3ZlciA9IHRoaXMuX2hhc0hvdmVyO1xuICAgICAgICBvYmouX2hhc0dyaWRsaW5lcyA9IHRoaXMuX2hhc0dyaWRsaW5lcztcbiAgICAgICAgb2JqLl9oYXNSZXNpemFibGVDb2x1bW5zID0gdGhpcy5faGFzUmVzaXphYmxlQ29sdW1ucztcbiAgICAgICAgb2JqLl9jb2x1bW5SZXNpemVNb2RlID0gdGhpcy5fY29sdW1uUmVzaXplTW9kZTtcbiAgICAgICAgb2JqLl9hY3Rpb25Db2x1bW5Gcm96ZW4gPSB0aGlzLl9hY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgICAgIG9iai5fc2VsZWN0aW9uQ29sdW1uRnJvemVuID0gdGhpcy5fc2VsZWN0aW9uQ29sdW1uRnJvemVuO1xuICAgICAgICBvYmouX2lzTG9jYWxpemVkID0gdGhpcy5faXNMb2NhbGl6ZWQ7XG4gICAgICAgIG9iai5fbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHkgPSB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eTtcbiAgICAgICAgb2JqLl9wYWdpbmF0aW9uTW9kZSA9IHRoaXMuX3BhZ2luYXRpb25Nb2RlO1xuICAgICAgICBvYmouX3Jvd3NQZXJQYWdlT3B0aW9ucyA9IHRoaXMuX3Jvd3NQZXJQYWdlT3B0aW9ucztcbiAgICAgICAgb2JqLl9yb3dFeHBhbmRhYmxlID0gdGhpcy5fcm93RXhwYW5kYWJsZTtcbiAgICAgICAgb2JqLl9yb3dFeHBhbmRhYmxlQ29sU3BhbiA9IHRoaXMuX3Jvd0V4cGFuZGFibGVDb2xTcGFuO1xuICAgICAgICBvYmouX3Jvd0V4cGFuZGFibGVQcm9wZXJ0eSA9IHRoaXMuX3Jvd0V4cGFuZGFibGVQcm9wZXJ0eTtcbiAgICAgICAgb2JqLl9pc1Jvd0V4cGFuZGVkID0gdGhpcy5pc1Jvd0V4cGFuZGVkO1xuICAgICAgICBvYmouX3Jvd0V4cGFuZGFibGVDb21wb25lbnRUeXBlID0gdGhpcy5fcm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGU7XG4gICAgICAgIG9iai5fcm93UmVvcmRlcmFibGUgPSB0aGlzLl9yb3dSZW9yZGVyYWJsZTtcbiAgICAgICAgb2JqLl9nZW5lcmljRmlsdGVyID0gdGhpcy5fZ2VuZXJpY0ZpbHRlcj8uY29weSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBjdXJyZW50IGRlc2NyaXB0b3IgdG8gYSBuZXcgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGNvcHkoKTogVGFibGVEZXNjcmlwdG9ySW5zdDxUYWJsZU1vZGVsLCBTb3J0cywgRmlsdGVycz4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbmV3IFRhYmxlRGVzY3JpcHRvckluc3Q8VGFibGVNb2RlbCwgU29ydHMsIEZpbHRlcnM+KHRoaXMubW9kZWwuY29weSgpKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZGVzY3JpcHRvcik7XG4gICAgICAgIGRlc2NyaXB0b3IuX2NvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGMgPT4gYy5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCBleHRlbmRzIFRhYmxlRGVzY3JpcHRvckluc3Q8YW55PiB7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZWRDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBfZmlsdGVyQ29sdW1uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHByaXZhdGUgX3NvcnRDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBfc29ydENvbHVtbk1vZGUgPSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERTtcbiAgICBwcml2YXRlIF9maWx0ZXJDb2x1bW5Nb2RlID0gVGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLkVYQ0xVREU7XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX2NvbHVtbnM6IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yW10gPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPGFueT4pIHtcbiAgICAgICAgc3VwZXIobW9kZWwpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwudGl0bGVQcm9wZXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMud2l0aFRpdGxlKG1vZGVsLnRpdGxlUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBjb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZWZpbmVzIGV4Y2x1ZGVkIGNvbHVtbnMgd2hlbiBnZW5lcmF0aW5nIGRlc2NyaXB0b3JcbiAgICAgKiBAcGFyYW0gZXhjbHVkZWRDb2x1bW4gbmFtZXMgb2YgZXhjbHVkZWQgY29sdW1uc1xuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc0V4Y2x1ZGVkKGV4Y2x1ZGVkQ29sdW1uOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9leGNsdWRlZENvbHVtbnMgPSBleGNsdWRlZENvbHVtbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGVmaW5lcyBjb2x1bW4gcHJvcGVydGllcyBvbiB3aGljaCBzb3J0IGlzIGRlZmluZWQgb3Igbm90IGRlcGVuZGluZyBvbiBzb3J0Q29sdW1uTW9kZVxuICAgICAqIEBwYXJhbSBzb3J0T25Db2x1bW5zIGNvbHVtbiBuYW1lc1xuICAgICAqIEBwYXJhbSBzb3J0Q29sdW1uTW9kZSBJTkNMVURFX09OTFkgKGRlZmF1bHQpIG9ubHkgZ2l2ZW4gY29sdW1ucyB3aWxsIGhhdmUgc29ydCwgRVhDTFVERSBnaXZlbiBjb2x1bW5zIHdpbGwgTk9UIGhhdmUgc29ydFxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc1NvcnQoc29ydE9uQ29sdW1uczogc3RyaW5nW10sIHNvcnRDb2x1bW5Nb2RlID0gVGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLklOQ0xVREVfT05MWSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zb3J0Q29sdW1uTW9kZSA9IHNvcnRDb2x1bW5Nb2RlO1xuICAgICAgICB0aGlzLl9zb3J0Q29sdW1ucyA9IHNvcnRPbkNvbHVtbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRlZmluZXMgY29sdW1uIHByb3BlcnRpZXMgb24gd2hpY2ggZmlsdGVyIGlzIGRlZmluZWQgb3Igbm90IGRlcGVuZGluZyBvbiBmaWx0ZXJDb2x1bW5Nb2RlXG4gICAgICogQHBhcmFtIGZpbHRlck9uQ29sdW1uIGNvbHVtbiBuYW1lc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJDb2x1bW5Nb2RlIElOQ0xVREVfT05MWSAoZGVmYXVsdCkgb25seSBnaXZlbiBjb2x1bW5zIHdpbGwgaGF2ZSBmaWx0ZXIsIEVYQ0xVREUgZ2l2ZW4gY29sdW1ucyB3aWxsIE5PVCBoYXZlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc0ZpbHRlcihmaWx0ZXJPbkNvbHVtbjogc3RyaW5nW10sIGZpbHRlckNvbHVtbk1vZGUgPSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uSU5DTFVERV9PTkxZKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpbHRlckNvbHVtbk1vZGUgPSBmaWx0ZXJDb2x1bW5Nb2RlO1xuICAgICAgICB0aGlzLl9maWx0ZXJDb2x1bW5zID0gZmlsdGVyT25Db2x1bW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNldHMgZ2l2ZW4gdHlwZSB0byBjb2x1bW4gd2l0aCBnaXZlbiBwcm9wZXJ0eSBhbmQgcmV0dXJucyB0aGlzIHRhYmxlXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbidzIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHR5cGUgY3VzdG9tIHR5cGUgZm9yIGNvbHVtblxuICAgICAqIEBwYXJhbSBkaXNwbGF5VHlwZSBjdXN0b20gY29sdW1uIHZhbHVlIGRpc3BsYXkgdHlwZVxuICAgICAqIEBwYXJhbSBhcmdzIGFkZGl0aW9uIGFyZ3VtZW50cyBmb3IgY29sdW1uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5QcmVzZXRUeXBlKHByb3BlcnR5OiBzdHJpbmcsIHR5cGU6IENvbHVtblR5cGVFbnVtLCBkaXNwbGF5VHlwZT86IENvbHVtbkRpc3BsYXlUeXBlRW51bSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5fY29sdW1ucy5maW5kKGNvbCA9PiBwcm9wZXJ0eSA9PT0gY29sLnByb3BlcnR5KSA/PyB0aGlzLmFkZENvbHVtbihwcm9wZXJ0eSkud2l0aFRpdGxlKHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgY29sdW1uLmFzVHlwZSh0eXBlLCBkaXNwbGF5VHlwZSwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2V0cyB0aXRsZSB0byBjb2x1bW4gd2l0aCBnaXZlbiBwcm9wZXJ0eSBhbmQgcmV0dXJucyB0aGlzIHRhYmxlXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbidzIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHRpdGxlIGNvbHVtbidzIHRpdGxlXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5UaXRsZShwcm9wZXJ0eTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gcHJvcGVydHkgPT09IGNvbC5wcm9wZXJ0eSkgPz8gdGhpcy5hZGRDb2x1bW4ocHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4ud2l0aFRpdGxlKHRpdGxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2VuZXJhdGVzIGNvbHVtbnMgZGVmaW5lZCBvbiB0YWJsZSBiYXNlZCBvbiBkYXRhIGZldGNoZWQgZnJvbSBhcGlcbiAgICAgKiBAcGFyYW0gZGF0YSBkYXRhIGZyb20gYXBpXG4gICAgICovXG4gICAgcHVibGljIHRvVGFibGVEZXNjcmlwdG9yRnJvbURhdGEoZGF0YTogRGF0YUxpc3RSZXN1bHQpOiBUYWJsZURlc2NyaXB0b3JJbnN0PGFueT4ge1xuICAgICAgICBjb25zdCB0YWJsZURlc2NyaXB0b3IgPSB0aGlzLnRvVGFibGVEZXNjcmlwdG9yKCk7XG5cbiAgICAgICAgaWYgKGRhdGEuZGF0YSA9PSBudWxsIHx8IGRhdGEuZGF0YS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9iamVjdE1vZGVsID0gZGF0YS5kYXRhWzBdO1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gZmxhdHRlbk9iamVjdEtleXMob2JqZWN0TW9kZWwpXG4gICAgICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4gIXRoaXMuX2V4Y2x1ZGVkQ29sdW1ucy5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpOyAvL2V4Y2x1ZGUgYXJyYXlzIGFuZCBzZXRzXG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgY29uc3QgbWV0YUNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBrZXkpO1xuICAgICAgICAgICAgbGV0IGNvbHVtbjogQ29sdW1uRGVzY3JpcHRvcjxhbnksIGFueT47XG4gICAgICAgICAgICBpZiAobWV0YUNvbHVtbikge1xuICAgICAgICAgICAgICAgIGlmICghbWV0YUNvbHVtbi52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBtZXRhQ29sdW1uLnRvQ29sdW1uRGVzY3JpcHRvcigpO1xuICAgICAgICAgICAgICAgIHRhYmxlRGVzY3JpcHRvci53aXRoQ29sdW1uKGNvbHVtbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IHRhYmxlRGVzY3JpcHRvci5hZGRDb2x1bW4oa2V5KS53aXRoVGl0bGUoa2V5KTtcbiAgICAgICAgICAgICAgICBjb2x1bW5Ub0RhdGVOdW1iZXJPckJvb2xlYW4oY29sdW1uLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmkxOG5CYXNlS2V5ICYmICFjb2x1bW4ucHJvcGVydHkuaW5jbHVkZXMoJ3JldicpKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLndpdGhUaXRsZShbdGhpcy5tb2RlbC5pMThuQmFzZUtleSwgJ3Byb3BlcnRpZXMnLCBjb2x1bW4ucHJvcGVydHldLmpvaW4oJy4nKS5yZXBsYWNlKCdzdGF0ZS4nLCAnJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50T2ZTb3J0Q29sdW1ucyA9IHRoaXMuX3NvcnRDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKHRoaXMuX3NvcnRDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERSAmJiAhZWxlbWVudE9mU29ydENvbHVtbnMpIHx8XG4gICAgICAgICAgICAgICAgKHRoaXMuX3NvcnRDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uSU5DTFVERV9PTkxZICYmIGVsZW1lbnRPZlNvcnRDb2x1bW5zKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGFibGVEZXNjcmlwdG9yLndpdGhTb3J0VW5zYWZlKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRPZkZpbHRlckNvbHVtbnMgPSB0aGlzLl9maWx0ZXJDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyQ29sdW1ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgKCh0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERSAmJiAhZWxlbWVudE9mRmlsdGVyQ29sdW1ucykgfHxcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuX2ZpbHRlckNvbHVtbk1vZGUgPT09IFRhYmxlRHluYW1pY0NvbHVtbnNNb2RlRW51bS5JTkNMVURFX09OTFkgJiYgZWxlbWVudE9mRmlsdGVyQ29sdW1ucykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0YWJsZURlc2NyaXB0b3IuYWRkRmlsdGVyRnJvbUNvbHVtbkRlc2NyaXB0b3JVbnNhZmUoY29sdW1uLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGFkZHMgQ29sdW1uRHluYW1pY0Rlc2NyaXB0b3IgdG8gdGhpcyB0YWJsZVxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBjb2x1bW4ncyBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBhZGRDb2x1bW4ocHJvcGVydHk6IGtleW9mIGFueSk6IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gbmV3IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSByZW1vdmVDb2x1bW4ocHJvcGVydHk6IGtleW9mIGFueSk6IHRoaXMge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gdGhpcy5hZGRDb2x1bW4ocHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4ud2l0aFZpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGVzIGRlZXAgY29weSBvZiB0YWJsZSBkeW5hbWljIGRlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29weSgpOiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgVGFibGVEeW5hbWljRGVzY3JpcHRvckluc3QodGhpcy5tb2RlbC5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhkZXNjcmlwdG9yKTtcbiAgICAgICAgZGVzY3JpcHRvci5fY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoYyA9PiBjLmNvcHkoKSk7XG4gICAgICAgIGRlc2NyaXB0b3IuX2V4Y2x1ZGVkQ29sdW1ucyA9IFsuLi50aGlzLl9leGNsdWRlZENvbHVtbnNdO1xuICAgICAgICBkZXNjcmlwdG9yLl9maWx0ZXJDb2x1bW5zID0gWy4uLnRoaXMuX2ZpbHRlckNvbHVtbnNdO1xuICAgICAgICBkZXNjcmlwdG9yLl9zb3J0Q29sdW1ucyA9IFsuLi50aGlzLl9zb3J0Q29sdW1uc107XG4gICAgICAgIGRlc2NyaXB0b3IuX2ZpbHRlckNvbHVtbk1vZGUgPSB0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlO1xuICAgICAgICBkZXNjcmlwdG9yLl9zb3J0Q29sdW1uTW9kZSA9IHRoaXMuX3NvcnRDb2x1bW5Nb2RlO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9UYWJsZURlc2NyaXB0b3IoKTogVGFibGVEZXNjcmlwdG9ySW5zdDxhbnk+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IG5ldyBUYWJsZURlc2NyaXB0b3JJbnN0PGFueT4odGhpcy5tb2RlbCk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGRlc2NyaXB0b3IpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG59XG4iXX0=
|