@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,772 +0,0 @@
|
|
|
1
|
-
import { HttpErrorResponse } from '@angular/common/http';
|
|
2
|
-
import { Injector, inject } from '@angular/core';
|
|
3
|
-
import { Router } from '@angular/router';
|
|
4
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
5
|
-
import { ConfirmationService, MessageService } from 'primeng/api';
|
|
6
|
-
import { DialogService } from 'primeng/dynamicdialog';
|
|
7
|
-
import { from, mergeMap, of, switchMap, take, timeout } from 'rxjs';
|
|
8
|
-
import { catchError, filter, first, map, startWith } from 'rxjs/operators';
|
|
9
|
-
import { CommonsHttpError, CommonsInternalError, CommonsService, LoggerService, ParametrizePipe, StyleLevelEnum, StyleSizeEnum, escapeHtmlAny, toObservable } from '@mediusinc/mng-commons/core';
|
|
10
|
-
import { ButtonStyleBuilder } from '@mediusinc/mng-commons/form/api';
|
|
11
|
-
import { ActionActivationTriggerEnum, ActionEditorDescriptorInst, ActionInstanceStateEnum, ActionTypeEnum, CommonsActionError, DataProviderExecutor, TableviewActionDefaultCategories } from '@mediusinc/mng-commons/tableview/api';
|
|
12
|
-
import { COMMONS_TABLEVIEW_FEATURE_CONFIG_IT } from '../../tableview/services/tableview-feature-config.token';
|
|
13
|
-
import { actionExecutionSelectDataProvider } from '../helpers/action-execution';
|
|
14
|
-
import { getI18nForAction } from '../helpers/i18n';
|
|
15
|
-
import { actionNotificationError, actionNotificationSuccess } from '../helpers/notification';
|
|
16
|
-
import { ActionContext, ActionDataProviderSource } from '../models/execution/action-context.model';
|
|
17
|
-
import { ActionInstance } from '../models/execution/action-instance.model';
|
|
18
|
-
import { ActionErrorMapperService } from './action-error-mapper.service';
|
|
19
|
-
import { NavigationService } from './navigation.service';
|
|
20
|
-
import { ACTION_EDITOR_COMPONENT_IT } from './tokens/action-editor.token';
|
|
21
|
-
import { ViewContainer } from './view-container.service';
|
|
22
|
-
export class ActionExecutorService {
|
|
23
|
-
constructor() {
|
|
24
|
-
this.injector = inject(Injector);
|
|
25
|
-
this.router = inject(Router);
|
|
26
|
-
this.dialogService = inject(DialogService);
|
|
27
|
-
this.translate = inject(TranslateService);
|
|
28
|
-
this.commons = inject(CommonsService);
|
|
29
|
-
this.dataProviderExecutor = inject(DataProviderExecutor);
|
|
30
|
-
this.navigationService = inject(NavigationService);
|
|
31
|
-
this.errorMapper = inject(ActionErrorMapperService);
|
|
32
|
-
this.config = inject(COMMONS_TABLEVIEW_FEATURE_CONFIG_IT, { optional: true });
|
|
33
|
-
this.defaultEditorDialogComponent = inject(ACTION_EDITOR_COMPONENT_IT);
|
|
34
|
-
this.messageService = inject(MessageService);
|
|
35
|
-
this.confirmationService = inject(ConfirmationService);
|
|
36
|
-
this.viewContainer = inject(ViewContainer, { optional: true });
|
|
37
|
-
this.parametrize = new ParametrizePipe();
|
|
38
|
-
this.instancesBufferMax = 100;
|
|
39
|
-
this.logger = inject(LoggerService).create(ActionExecutorService.className);
|
|
40
|
-
}
|
|
41
|
-
static { this.className = 'ActionExecutorService'; }
|
|
42
|
-
/**
|
|
43
|
-
* Prepares action context for usage in validation.
|
|
44
|
-
* @param action Action descriptor.
|
|
45
|
-
* @param parameters Action parameters.
|
|
46
|
-
* @param dataProvider Data provider.
|
|
47
|
-
*/
|
|
48
|
-
prepareActionContextValidation(action, parameters, dataProvider) {
|
|
49
|
-
const ctxDataProvider = actionExecutionSelectDataProvider(action, dataProvider, this.viewContainer);
|
|
50
|
-
return {
|
|
51
|
-
descriptor: action,
|
|
52
|
-
parameters: parameters,
|
|
53
|
-
serviceInstance: this.dataProviderExecutor.getDataProviderService(this.injector, ctxDataProvider.dataProvider) ?? undefined,
|
|
54
|
-
dataProvider: ctxDataProvider.dataProvider
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Runs action context by submitting execution results/errors to context, watching over instance results/errors, displaying notifications,
|
|
59
|
-
* running next/error action and triggering dismiss of action. Confirmation is also processed here.
|
|
60
|
-
*
|
|
61
|
-
* @param ctx Action context to run.
|
|
62
|
-
*/
|
|
63
|
-
run(ctx) {
|
|
64
|
-
const isMainRunFn = ctx.functionName === 'submit' || ctx.functionName === 'run';
|
|
65
|
-
if (isMainRunFn && ctx.instance.action.runConfirmation != null) {
|
|
66
|
-
// only direct action can be configured with run confirmation
|
|
67
|
-
// if editor, then run confirmation is mapped to submit action and ignored as editor run
|
|
68
|
-
const confirmationOpts = ctx.instance.action.runConfirmation;
|
|
69
|
-
const item = ctx.parameters.item;
|
|
70
|
-
const escapedItem = escapeHtmlAny(item);
|
|
71
|
-
const getTranslationOrUndefined = (label, defLabel, fallback, escapeItem = false) => label !== null
|
|
72
|
-
? (getI18nForAction(this.translate, ctx.instance.action, defLabel, {
|
|
73
|
-
customKey: label,
|
|
74
|
-
item: escapeItem ? escapedItem : item,
|
|
75
|
-
fallbackKey: fallback
|
|
76
|
-
}) ?? undefined)
|
|
77
|
-
: undefined;
|
|
78
|
-
const getButtonStyle = (style, def) => (style instanceof ButtonStyleBuilder ? style : ButtonStyleBuilder.from({ ...def, ...style } ?? def)).build();
|
|
79
|
-
let confirmParams = {
|
|
80
|
-
icon: confirmationOpts.icon !== null ? (confirmationOpts.icon ?? 'pi pi-exclamation-triangle') : undefined,
|
|
81
|
-
header: getTranslationOrUndefined(confirmationOpts.title, 'confirm.title', 'general.confirmation'),
|
|
82
|
-
message: getTranslationOrUndefined(confirmationOpts.message, 'confirm.message', 'general.confirmation'),
|
|
83
|
-
acceptVisible: true,
|
|
84
|
-
acceptLabel: getTranslationOrUndefined(confirmationOpts.acceptButton?.label, 'confirm.accept', 'general.yes'),
|
|
85
|
-
acceptIcon: confirmationOpts.acceptButton?.icon !== null ? (confirmationOpts.acceptButton?.icon ?? ctx.instance.action.button?.icon ?? 'pi pi-check') : undefined,
|
|
86
|
-
acceptButtonStyleClass: getButtonStyle(confirmationOpts.acceptButton?.style, { level: ctx.instance.action.button?.style?.level }),
|
|
87
|
-
rejectVisible: !(confirmationOpts.rejectButton === false || (confirmationOpts.rejectButton?.label === null && confirmationOpts.rejectButton?.icon === null)),
|
|
88
|
-
rejectLabel: confirmationOpts.rejectButton !== false ? getTranslationOrUndefined(confirmationOpts.rejectButton?.label, 'confirm.reject', 'general.no') : undefined,
|
|
89
|
-
rejectIcon: confirmationOpts.rejectButton !== false && confirmationOpts.rejectButton?.icon !== null ? (confirmationOpts.rejectButton?.icon ?? 'pi pi-times') : undefined,
|
|
90
|
-
rejectButtonStyleClass: confirmationOpts.rejectButton !== false ? getButtonStyle(confirmationOpts.rejectButton?.style, { level: StyleLevelEnum.Secondary }) : undefined,
|
|
91
|
-
closeOnEscape: confirmationOpts.closeOnEscape,
|
|
92
|
-
accept: () => {
|
|
93
|
-
ctx.instance.state = ActionInstanceStateEnum.RunConfirmationEndAccept;
|
|
94
|
-
this.runWithoutConfirmation(ctx);
|
|
95
|
-
},
|
|
96
|
-
reject: () => {
|
|
97
|
-
ctx.instance.state = ActionInstanceStateEnum.RunConfirmationEndReject;
|
|
98
|
-
if (ctx.instance.action.type !== ActionTypeEnum.Editor) {
|
|
99
|
-
// if not editor, the it can be closed
|
|
100
|
-
this.finishAction(ctx.instance);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
if (confirmationOpts.configMapFn) {
|
|
105
|
-
confirmParams = confirmationOpts.configMapFn(ctx, confirmParams);
|
|
106
|
-
}
|
|
107
|
-
ctx.confirmation = confirmParams;
|
|
108
|
-
ctx.instance.state = ActionInstanceStateEnum.RunConfirmationStart;
|
|
109
|
-
this.confirmationService.confirm(confirmParams);
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
this.runWithoutConfirmation(ctx);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Runs action context by submitting execution results/errors to context, watching over instance results/errors, displaying notifications,
|
|
117
|
-
* running next/error action and triggering dismiss of action. Confirmation
|
|
118
|
-
*
|
|
119
|
-
* @param ctx Action context to run.
|
|
120
|
-
*
|
|
121
|
-
* @returns Action context for submit (=run) function.
|
|
122
|
-
*/
|
|
123
|
-
runWithoutConfirmation(ctx) {
|
|
124
|
-
const isMainRunFn = ctx.functionName === 'submit' || ctx.functionName === 'run';
|
|
125
|
-
const isErrorCriticalRunFn = ctx.functionName === 'run';
|
|
126
|
-
let actionEditor;
|
|
127
|
-
let fnObs;
|
|
128
|
-
switch (ctx.functionName) {
|
|
129
|
-
case 'submit':
|
|
130
|
-
actionEditor = ctx.instance.action;
|
|
131
|
-
if (typeof actionEditor.submitFunction !== 'function') {
|
|
132
|
-
if (actionEditor.tableviewCategory === TableviewActionDefaultCategories.ADD) {
|
|
133
|
-
fnObs = this.dataProviderExecutor.runCreateOrFail.bind(this.dataProviderExecutor);
|
|
134
|
-
}
|
|
135
|
-
else if (actionEditor.tableviewCategory === TableviewActionDefaultCategories.EDIT) {
|
|
136
|
-
fnObs = this.dataProviderExecutor.runUpdateOrFail.bind(this.dataProviderExecutor);
|
|
137
|
-
}
|
|
138
|
-
else if (ctx.dataProviderSource > ActionDataProviderSource.ViewContainer) {
|
|
139
|
-
// if data provider is given directly on descriptor or as input, use it
|
|
140
|
-
const defaultSubmit = of(ctx.parameters?.item ?? undefined);
|
|
141
|
-
fnObs = ctx => {
|
|
142
|
-
if (ctx.parameters.itemId) {
|
|
143
|
-
return this.dataProviderExecutor.runUpdate(ctx, defaultSubmit);
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
return this.dataProviderExecutor.runCreate(ctx, defaultSubmit);
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
fnObs = ctx => ctx.parameters?.item ?? undefined;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
fnObs = actionEditor.submitFunction;
|
|
156
|
-
}
|
|
157
|
-
break;
|
|
158
|
-
case 'fetch':
|
|
159
|
-
actionEditor = ctx.instance.action;
|
|
160
|
-
if (typeof actionEditor.fetchFunction !== 'function') {
|
|
161
|
-
if (actionEditor.tableviewCategory === TableviewActionDefaultCategories.EDIT || actionEditor.tableviewCategory === TableviewActionDefaultCategories.DETAILS) {
|
|
162
|
-
const isEdit = actionEditor.tableviewCategory === TableviewActionDefaultCategories.EDIT;
|
|
163
|
-
fnObs = ctx => this.dataProviderExecutor.runFetchOrFail(ctx, isEdit ? 'update' : undefined);
|
|
164
|
-
}
|
|
165
|
-
else if (ctx.dataProviderSource > ActionDataProviderSource.ViewContainer) {
|
|
166
|
-
const defaultFetch = of(ctx.parameters?.item ?? undefined);
|
|
167
|
-
fnObs = ctx => {
|
|
168
|
-
if (ctx.parameters.itemId || typeof ctx.parameters.item === 'object') {
|
|
169
|
-
return this.dataProviderExecutor.runFetch(ctx, undefined, defaultFetch);
|
|
170
|
-
}
|
|
171
|
-
return defaultFetch;
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
fnObs = ctx => ctx.parameters?.item ?? undefined;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
fnObs = actionEditor.fetchFunction;
|
|
180
|
-
}
|
|
181
|
-
break;
|
|
182
|
-
case 'run':
|
|
183
|
-
default:
|
|
184
|
-
if (!ctx.instance.action.hasRunFunction && ctx.instance.action.tableviewCategory === TableviewActionDefaultCategories.DELETE) {
|
|
185
|
-
fnObs = this.dataProviderExecutor.runDeleteOrFail.bind(this.dataProviderExecutor);
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
fnObs = ctx.instance.action.runFunction;
|
|
189
|
-
}
|
|
190
|
-
break;
|
|
191
|
-
}
|
|
192
|
-
const retObs = of(void 0).pipe(take(1), switchMap(() => {
|
|
193
|
-
if (isMainRunFn) {
|
|
194
|
-
// if main run function, also set loading to true
|
|
195
|
-
ctx.instance.state = ActionInstanceStateEnum.RunStart;
|
|
196
|
-
ctx.instance.isRunLoadingSubject.next(true);
|
|
197
|
-
}
|
|
198
|
-
else {
|
|
199
|
-
ctx.instance.state = ActionInstanceStateEnum.FetchStart;
|
|
200
|
-
}
|
|
201
|
-
// start context execution to mark execution loading
|
|
202
|
-
ctx.executionStart();
|
|
203
|
-
return toObservable(fnObs(ctx));
|
|
204
|
-
}), mergeMap(runResult => {
|
|
205
|
-
// handle notifications
|
|
206
|
-
const notificationItem = {
|
|
207
|
-
...ctx.parameters?.item,
|
|
208
|
-
...ctx.parameters?.formItem,
|
|
209
|
-
...ctx.parameters?.submitResult,
|
|
210
|
-
...runResult
|
|
211
|
-
};
|
|
212
|
-
if (isMainRunFn && (ctx.instance.action.runNotificationOnSuccess ?? true)) {
|
|
213
|
-
ctx.notification = actionNotificationSuccess(this.translate, this.messageService, ctx.instance.action, {
|
|
214
|
-
functionName: ctx.functionName,
|
|
215
|
-
item: notificationItem,
|
|
216
|
-
...(typeof ctx.instance.action.runNotificationOnSuccess === 'object' ? ctx.instance.action.runNotificationOnSuccess : {})
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
else if (!isMainRunFn && (actionEditor.fetchNotificationOnSuccess ?? false)) {
|
|
220
|
-
ctx.notification = actionNotificationSuccess(this.translate, this.messageService, actionEditor, {
|
|
221
|
-
functionName: ctx.functionName,
|
|
222
|
-
item: notificationItem,
|
|
223
|
-
...(typeof actionEditor.fetchNotificationOnSuccess === 'object' ? actionEditor.fetchNotificationOnSuccess : {})
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
// set next state depending on run
|
|
227
|
-
ctx.instance.state = isMainRunFn ? ActionInstanceStateEnum.RunEnd : ActionInstanceStateEnum.FetchEnd;
|
|
228
|
-
// set execution result
|
|
229
|
-
ctx.executionNext(runResult, isMainRunFn);
|
|
230
|
-
if (isMainRunFn) {
|
|
231
|
-
// set instance final result on main run execution
|
|
232
|
-
ctx.instance.result = runResult;
|
|
233
|
-
ctx.instance.isRunLoadingSubject.next(false);
|
|
234
|
-
// handle possible after run action
|
|
235
|
-
if (ctx.instance.action.afterRunAction) {
|
|
236
|
-
// mark new state for next action start
|
|
237
|
-
const afterRunAction = typeof ctx.instance.action.afterRunAction === 'function' ? ctx.instance.action.afterRunAction(ctx) : ctx.instance.action.afterRunAction;
|
|
238
|
-
const nextActionInstance = this.activateAction(afterRunAction, {
|
|
239
|
-
itemId: ctx.parameters.itemId,
|
|
240
|
-
item: runResult,
|
|
241
|
-
actionData: ctx.parameters.actionData,
|
|
242
|
-
route: ctx.parameters.route,
|
|
243
|
-
sourceComponent: ctx.parameters.sourceComponent
|
|
244
|
-
}, undefined, ctx.instance, true);
|
|
245
|
-
ctx.instance.nextActionInstance = nextActionInstance;
|
|
246
|
-
ctx.instance.state = ActionInstanceStateEnum.NextActionStart;
|
|
247
|
-
// finish current action when next action finishes
|
|
248
|
-
return nextActionInstance.state$.pipe(startWith(nextActionInstance.state), // provide first state cause it might be finished already
|
|
249
|
-
filter(state => state >= ActionInstanceStateEnum.FinishSuccessFinal), take(1), map(() => {
|
|
250
|
-
ctx.instance.state = ActionInstanceStateEnum.NextActionEnd;
|
|
251
|
-
return runResult;
|
|
252
|
-
}));
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
return of(runResult);
|
|
256
|
-
}), map(runResult => {
|
|
257
|
-
if (isMainRunFn) {
|
|
258
|
-
// deactivate action
|
|
259
|
-
this.finishAction(ctx.instance);
|
|
260
|
-
}
|
|
261
|
-
return runResult;
|
|
262
|
-
}), catchError(err => {
|
|
263
|
-
// transform error to action error
|
|
264
|
-
const actionError = this.toActionError(err, ctx);
|
|
265
|
-
// set instance state to error
|
|
266
|
-
ctx.instance.state = isMainRunFn ? ActionInstanceStateEnum.RunError : ActionInstanceStateEnum.FetchError;
|
|
267
|
-
// mark execution error on context
|
|
268
|
-
ctx.executionError(actionError);
|
|
269
|
-
let errorObs = of(void 0);
|
|
270
|
-
if (isMainRunFn) {
|
|
271
|
-
ctx.instance.error = err;
|
|
272
|
-
ctx.instance.isRunLoadingSubject.next(false);
|
|
273
|
-
if (ctx.instance.action.runNotificationOnError ?? true) {
|
|
274
|
-
actionError.notification = actionNotificationError(this.translate, this.messageService, ctx.instance.action, actionError, undefined, {
|
|
275
|
-
functionName: ctx.functionName,
|
|
276
|
-
item: ctx.parameters.item,
|
|
277
|
-
...(typeof ctx.instance.action.runNotificationOnError === 'object' ? ctx.instance.action.runNotificationOnError : {})
|
|
278
|
-
});
|
|
279
|
-
actionError.notificationEmitSource = ActionExecutorService.className;
|
|
280
|
-
ctx.notification = actionError.notification;
|
|
281
|
-
}
|
|
282
|
-
// handle possible error action if run
|
|
283
|
-
if (isMainRunFn && ctx.instance.action.onRunErrorAction) {
|
|
284
|
-
const onRunErrorAction = typeof ctx.instance.action.onRunErrorAction === 'function' ? ctx.instance.action.onRunErrorAction(ctx) : ctx.instance.action.onRunErrorAction;
|
|
285
|
-
// cannot start with trigger, because routing might be problematic (lousing previous results etc.)
|
|
286
|
-
const errorActionInstance = this.activateAction(onRunErrorAction, {
|
|
287
|
-
itemId: ctx.parameters.itemId,
|
|
288
|
-
item: ctx.parameters.item,
|
|
289
|
-
actionData: ctx.parameters.actionData,
|
|
290
|
-
route: ctx.parameters.route,
|
|
291
|
-
sourceComponent: ctx.parameters.sourceComponent
|
|
292
|
-
}, undefined, undefined, true);
|
|
293
|
-
ctx.instance.errorActionInstance = errorActionInstance;
|
|
294
|
-
ctx.instance.state = ActionInstanceStateEnum.ErrorActionStart;
|
|
295
|
-
errorObs = errorActionInstance.state$.pipe(startWith(errorActionInstance.state), // provide first state cause it might be finished already
|
|
296
|
-
filter(state => state >= ActionInstanceStateEnum.FinishSuccessFinal), take(1), map(() => {
|
|
297
|
-
ctx.instance.state = ActionInstanceStateEnum.ErrorActionEnd;
|
|
298
|
-
return void 0;
|
|
299
|
-
}));
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
else if (actionEditor.fetchNotificationOnError ?? true) {
|
|
303
|
-
ctx.notification = actionNotificationError(this.translate, this.messageService, actionEditor, actionError, undefined, {
|
|
304
|
-
functionName: ctx.functionName,
|
|
305
|
-
item: {
|
|
306
|
-
...ctx.parameters.item
|
|
307
|
-
},
|
|
308
|
-
...(typeof actionEditor.fetchNotificationOnError === 'object' ? actionEditor.fetchNotificationOnError : {})
|
|
309
|
-
});
|
|
310
|
-
actionError.notificationEmitSource = ActionExecutorService.className;
|
|
311
|
-
ctx.notification = actionError.notification;
|
|
312
|
-
}
|
|
313
|
-
// list and map only to mark instance state as finished error state
|
|
314
|
-
return errorObs.pipe(map(() => {
|
|
315
|
-
// deactivate action only if critical (fetch on editor or run on button actions)
|
|
316
|
-
if (isErrorCriticalRunFn) {
|
|
317
|
-
this.finishAction(ctx.instance);
|
|
318
|
-
}
|
|
319
|
-
// rethrow error to propagate further
|
|
320
|
-
throw actionError;
|
|
321
|
-
}));
|
|
322
|
-
}));
|
|
323
|
-
ctx.runSubscription = retObs.subscribe({
|
|
324
|
-
next: res => {
|
|
325
|
-
this.logger.debug(`ActionContext ${ctx.contextLongName} execution next event`, res);
|
|
326
|
-
},
|
|
327
|
-
error: err => {
|
|
328
|
-
if (err?.type !== 'CommonsActionError') {
|
|
329
|
-
this.logger.error(`Non action error occurred`, err);
|
|
330
|
-
}
|
|
331
|
-
else {
|
|
332
|
-
this.logger.debug(`Action context ${ctx.contextLongName} execution error event`, err);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
});
|
|
336
|
-
return retObs;
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Prepares editor action's fetch function by creating new action context for action instance.
|
|
340
|
-
*
|
|
341
|
-
* @param action Action descriptor.
|
|
342
|
-
* @param parameters Action parameters for context.
|
|
343
|
-
* @param dataProvider Editor data provider for context.
|
|
344
|
-
* @param instance Optional existing action instance (if non provided, new will be created).
|
|
345
|
-
* @param previousActionInstance Optional previous action instance to link in next instance.
|
|
346
|
-
*
|
|
347
|
-
* @returns Action context for fetch function.
|
|
348
|
-
*/
|
|
349
|
-
prepareContextForEditorFetch(action, parameters, dataProvider, instance, previousActionInstance) {
|
|
350
|
-
instance = this.getOrCreateInstance(instance, action, parameters, ActionInstanceStateEnum.ActivationEnd);
|
|
351
|
-
return this.prepareContextForEditor(instance, parameters, 'fetch', dataProvider, previousActionInstance);
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Runs editor action's submit (=main run) function by creating new action context for action instance.
|
|
355
|
-
*
|
|
356
|
-
* @param action Action descriptor.
|
|
357
|
-
* @param parameters Action parameters for context.
|
|
358
|
-
* @param dataProvider Editor data provider for context.
|
|
359
|
-
* @param instance Optional existing action instance (if non provided, new will be created).
|
|
360
|
-
* @param previousActionInstance Optional previous action instance to link in next instance.
|
|
361
|
-
*
|
|
362
|
-
* @returns Action context for submit (=run) function.
|
|
363
|
-
*/
|
|
364
|
-
prepareContextForEditorSubmit(action, parameters, dataProvider, instance, previousActionInstance) {
|
|
365
|
-
instance = this.getOrCreateInstance(instance, action, parameters, ActionInstanceStateEnum.ActivationEnd);
|
|
366
|
-
return this.prepareContextForEditor(instance, parameters, 'submit', dataProvider, previousActionInstance);
|
|
367
|
-
}
|
|
368
|
-
/**
|
|
369
|
-
* Prepares action exec context for action of type editor.
|
|
370
|
-
*
|
|
371
|
-
* @param instance Action instance.
|
|
372
|
-
* @param parameters Action parameters for context.
|
|
373
|
-
* @param functionName Action function name parameter.
|
|
374
|
-
* @param dataProvider Optional data provider. If not provided data provider from either the action editor or view container will be used.
|
|
375
|
-
* @param previousActionInstance Optional previous action instance to link in next instance.
|
|
376
|
-
*/
|
|
377
|
-
prepareContextForEditor(instance, parameters, functionName, dataProvider, previousActionInstance) {
|
|
378
|
-
if (instance.action.type !== ActionTypeEnum.Editor) {
|
|
379
|
-
throw new CommonsInternalError(`Cannot create editor context for action ${instance.action.actionNameLong} of type ${instance.action.type}.`);
|
|
380
|
-
}
|
|
381
|
-
const editorAction = instance.action;
|
|
382
|
-
const ctxDataProvider = actionExecutionSelectDataProvider(editorAction, dataProvider, this.viewContainer);
|
|
383
|
-
const ctx = new ActionContext(this.injector, instance, parameters, functionName, (this.dataProviderExecutor.getDataProviderService(this.injector, ctxDataProvider.dataProvider) ?? undefined), ctxDataProvider.dataProvider, this.viewContainer ?? undefined);
|
|
384
|
-
ctx.dataProviderSource = ctxDataProvider.source;
|
|
385
|
-
ctx.previousActionInstance = previousActionInstance;
|
|
386
|
-
instance.newContext(ctx);
|
|
387
|
-
return ctx;
|
|
388
|
-
}
|
|
389
|
-
/**
|
|
390
|
-
* Runs action's main run function by creating new action context for action instance.
|
|
391
|
-
*
|
|
392
|
-
* @param action Action descriptor.
|
|
393
|
-
* @param parameters Action parameters for context run.
|
|
394
|
-
* @param instance Optional existing action instance (if non provided, new will be created).
|
|
395
|
-
* @param previousActionInstance Optional previous action instance to link in next instance.
|
|
396
|
-
*
|
|
397
|
-
* @returns Action context for run function.
|
|
398
|
-
*/
|
|
399
|
-
prepareContext(action, parameters, instance, previousActionInstance) {
|
|
400
|
-
instance = this.getOrCreateInstance(instance, action, parameters, ActionInstanceStateEnum.ActivationEnd);
|
|
401
|
-
const ctxDataProvider = actionExecutionSelectDataProvider(action, undefined, this.viewContainer);
|
|
402
|
-
const ctx = new ActionContext(this.injector, instance, parameters, 'run', (this.dataProviderExecutor.getDataProviderService(this.injector, ctxDataProvider.dataProvider) ?? undefined), ctxDataProvider.dataProvider, this.viewContainer ?? undefined);
|
|
403
|
-
ctx.dataProviderSource = ctxDataProvider.source;
|
|
404
|
-
ctx.previousActionInstance = previousActionInstance;
|
|
405
|
-
instance.newContext(ctx);
|
|
406
|
-
return ctx;
|
|
407
|
-
}
|
|
408
|
-
/**
|
|
409
|
-
* Activates action (in case of dialog, dialog will be opened).
|
|
410
|
-
*
|
|
411
|
-
* @param action Action descriptor.
|
|
412
|
-
* @param parameters Action parameters for activation of action instance.
|
|
413
|
-
* @param instance Optional existing action instance (if non provided, new will be created).
|
|
414
|
-
* @param previousActionInstance Optional previous action instance to link in next instance.
|
|
415
|
-
* @param runContext Marks if context should be run.
|
|
416
|
-
*
|
|
417
|
-
* @returns Action instance - if non provided in parameters, the newly created will be returned.
|
|
418
|
-
*/
|
|
419
|
-
activateAction(action, parameters, instance, previousActionInstance, runContext = false) {
|
|
420
|
-
instance = this.getOrCreateInstance(instance, action, parameters, ActionInstanceStateEnum.ActivationStart);
|
|
421
|
-
instance.state = ActionInstanceStateEnum.ActivationStart;
|
|
422
|
-
instance.activationParameters = parameters;
|
|
423
|
-
// start activation instance
|
|
424
|
-
if (action.type === ActionTypeEnum.Editor) {
|
|
425
|
-
let dialogComponent = this.defaultEditorDialogComponent;
|
|
426
|
-
const dialogClassNames = ['mng-dialog'];
|
|
427
|
-
const dialogConfig = {
|
|
428
|
-
duplicate: true
|
|
429
|
-
};
|
|
430
|
-
if (action instanceof ActionEditorDescriptorInst) {
|
|
431
|
-
dialogClassNames.push(action.dialogClassName ?? 'mng-action-editor-dialog');
|
|
432
|
-
switch (action.dialogSize) {
|
|
433
|
-
case StyleSizeEnum.ExtraSmall:
|
|
434
|
-
dialogClassNames.push('mng-dialog-xs');
|
|
435
|
-
break;
|
|
436
|
-
case StyleSizeEnum.Small:
|
|
437
|
-
dialogClassNames.push('mng-dialog-sm');
|
|
438
|
-
break;
|
|
439
|
-
case StyleSizeEnum.Large:
|
|
440
|
-
dialogClassNames.push('mng-dialog-lg');
|
|
441
|
-
break;
|
|
442
|
-
case StyleSizeEnum.ExtraLarge:
|
|
443
|
-
dialogClassNames.push('mng-dialog-xl');
|
|
444
|
-
break;
|
|
445
|
-
case StyleSizeEnum.Normal:
|
|
446
|
-
default:
|
|
447
|
-
break;
|
|
448
|
-
}
|
|
449
|
-
if (action.editorComponent) {
|
|
450
|
-
dialogComponent = action.editorComponent;
|
|
451
|
-
}
|
|
452
|
-
dialogConfig.data = {
|
|
453
|
-
action: {
|
|
454
|
-
descriptor: action,
|
|
455
|
-
instance: instance,
|
|
456
|
-
previousInstance: previousActionInstance
|
|
457
|
-
},
|
|
458
|
-
injector: this.injector
|
|
459
|
-
};
|
|
460
|
-
}
|
|
461
|
-
dialogConfig.styleClass = dialogClassNames.join(' ');
|
|
462
|
-
if (action.activationTrigger === ActionActivationTriggerEnum.OnRoute) {
|
|
463
|
-
dialogConfig.closable = false;
|
|
464
|
-
dialogConfig.closeOnEscape = false;
|
|
465
|
-
}
|
|
466
|
-
const dialogRef = this.dialogService.open(dialogComponent, dialogConfig);
|
|
467
|
-
dialogRef.onClose.pipe(take(1)).subscribe(() => {
|
|
468
|
-
// to close dialog on 'X' click or esc button
|
|
469
|
-
this.finishAction(instance);
|
|
470
|
-
});
|
|
471
|
-
instance.activationDialogRef = dialogRef;
|
|
472
|
-
return instance;
|
|
473
|
-
}
|
|
474
|
-
else {
|
|
475
|
-
// directly execute action
|
|
476
|
-
instance.state = ActionInstanceStateEnum.ActivationEnd;
|
|
477
|
-
const context = this.prepareContext(action, parameters, instance, previousActionInstance);
|
|
478
|
-
if (runContext) {
|
|
479
|
-
this.run(context);
|
|
480
|
-
}
|
|
481
|
-
return context.instance;
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
/**
|
|
485
|
-
* To be called when action editor is initialized to correctly activate action.
|
|
486
|
-
* @param action Action descriptor.
|
|
487
|
-
* @param instance Action instance (if available).
|
|
488
|
-
* @param componentRef Optional action editor component reference.
|
|
489
|
-
*/
|
|
490
|
-
onActionEditorInit(action, instance, componentRef) {
|
|
491
|
-
if (action.type !== ActionTypeEnum.Editor) {
|
|
492
|
-
throw new Error(`Action ${action.actionName} is not of type editor, cannot be activated through "onActionEditorOnInit"`);
|
|
493
|
-
}
|
|
494
|
-
if (instance && action.activationTrigger === ActionActivationTriggerEnum.OnRoute) {
|
|
495
|
-
const triggeredInstance = this.viewContainer?.routeTriggeredActionInstance();
|
|
496
|
-
if (triggeredInstance && triggeredInstance.instanceLongName !== instance.instanceLongName) {
|
|
497
|
-
this.logger.debug(`WARNING: Found triggered parameters view container instance ${triggeredInstance.instanceLongName} and it does not match instance ${instance.instanceLongName} retrieved on editor init.`);
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
instance = this.getOrCreateInstance(instance, action, undefined, ActionInstanceStateEnum.ActivationStart);
|
|
501
|
-
instance.state = ActionInstanceStateEnum.ActivationEnd;
|
|
502
|
-
instance.activationEditorComponentRef = componentRef;
|
|
503
|
-
return instance;
|
|
504
|
-
}
|
|
505
|
-
/**
|
|
506
|
-
* To be called when action editor cmp is being destroyed to correctly finish action.
|
|
507
|
-
* @param instance Action instance.
|
|
508
|
-
*/
|
|
509
|
-
onActionDestroy(instance) {
|
|
510
|
-
if (!instance) {
|
|
511
|
-
return;
|
|
512
|
-
}
|
|
513
|
-
instance = this.getOrCreateInstance(instance);
|
|
514
|
-
if (instance.action.activationTrigger !== ActionActivationTriggerEnum.OnClick) {
|
|
515
|
-
return;
|
|
516
|
-
}
|
|
517
|
-
this.finishAction(instance, true);
|
|
518
|
-
}
|
|
519
|
-
/**
|
|
520
|
-
* To be called when action editor cmp is being destroyed to correctly finish action.
|
|
521
|
-
* @param instance Action instance.
|
|
522
|
-
*/
|
|
523
|
-
onActionEditorDestroy(instance) {
|
|
524
|
-
if (!instance) {
|
|
525
|
-
return;
|
|
526
|
-
}
|
|
527
|
-
instance = this.getOrCreateInstance(instance);
|
|
528
|
-
if (instance.action.type !== ActionTypeEnum.Editor) {
|
|
529
|
-
throw new Error(`Action instance ${instance.instanceLongName} is not of type editor, cannot be deactivated through "onActionEditorOnDestroy"`);
|
|
530
|
-
}
|
|
531
|
-
if (instance.action.activationTrigger !== ActionActivationTriggerEnum.OnRoute) {
|
|
532
|
-
this.finishAction(instance, true);
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
/**
|
|
536
|
-
* To be called when action route cmp is being destroyed to correctly finish action.
|
|
537
|
-
* @param instance Action instance.
|
|
538
|
-
*/
|
|
539
|
-
onActionRouteDestroy(instance) {
|
|
540
|
-
if (!instance) {
|
|
541
|
-
return;
|
|
542
|
-
}
|
|
543
|
-
instance = this.getOrCreateInstance(instance);
|
|
544
|
-
if (instance.action.activationTrigger !== ActionActivationTriggerEnum.OnRoute) {
|
|
545
|
-
throw new Error(`Action instance ${instance.instanceLongName} is not triggered on route, cannot be deactivated through "onActionRouteOnDestroy"`);
|
|
546
|
-
}
|
|
547
|
-
this.finishAction(instance, true);
|
|
548
|
-
}
|
|
549
|
-
/**
|
|
550
|
-
* Deactivates action by choosing final state, closing dialog and completing all subjects in instance and contexts.
|
|
551
|
-
*
|
|
552
|
-
* @param instance Action instance.
|
|
553
|
-
* @param onDestroy Marks if finish is called on component destroy lifecycle hook.
|
|
554
|
-
*/
|
|
555
|
-
finishAction(instance, onDestroy = false) {
|
|
556
|
-
instance = this.getOrCreateInstance(instance);
|
|
557
|
-
if (instance.state >= ActionInstanceStateEnum.FinishSuccessFinal) {
|
|
558
|
-
this.logger.trace(`ActionInstance ${instance.instanceLongName} already finished`);
|
|
559
|
-
return;
|
|
560
|
-
}
|
|
561
|
-
let finalState;
|
|
562
|
-
if (typeof instance.result !== 'undefined') {
|
|
563
|
-
finalState = ActionInstanceStateEnum.FinishSuccessFinal;
|
|
564
|
-
}
|
|
565
|
-
else if (typeof instance.error !== 'undefined') {
|
|
566
|
-
finalState = ActionInstanceStateEnum.FinishErrorFinal;
|
|
567
|
-
}
|
|
568
|
-
else if (onDestroy) {
|
|
569
|
-
finalState = ActionInstanceStateEnum.FinishComponentDestroyFinal;
|
|
570
|
-
}
|
|
571
|
-
else {
|
|
572
|
-
finalState = ActionInstanceStateEnum.FinishDismissedFinal;
|
|
573
|
-
}
|
|
574
|
-
if (instance.action.type === ActionTypeEnum.Editor) {
|
|
575
|
-
const hasDialog = typeof instance.activationDialogRef !== 'undefined';
|
|
576
|
-
const resubmitEnabled = instance.action.resubmitEnabled;
|
|
577
|
-
if (finalState === ActionInstanceStateEnum.FinishSuccessFinal) {
|
|
578
|
-
if ((hasDialog && resubmitEnabled === true) || (!hasDialog && resubmitEnabled !== false)) {
|
|
579
|
-
finalState = ActionInstanceStateEnum.FinishSuccessReactivateFinal;
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
if (hasDialog && finalState !== ActionInstanceStateEnum.FinishSuccessReactivateFinal) {
|
|
583
|
-
// if state is finish and not called from dialog listener, close the dialog first which will retrigger this function, then finish it
|
|
584
|
-
instance.activationDialogRef.close(instance.result);
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
// unset instance in view container
|
|
588
|
-
if (this.viewContainer) {
|
|
589
|
-
this.viewContainer.routeTriggeredActionInstance.set(undefined);
|
|
590
|
-
}
|
|
591
|
-
// set final state on instance
|
|
592
|
-
instance.state = finalState;
|
|
593
|
-
if (finalState === ActionInstanceStateEnum.FinishSuccessReactivateFinal) {
|
|
594
|
-
// prepare reactivation instance
|
|
595
|
-
const newInstanceStatus = instance.action.resubmitRefetch
|
|
596
|
-
? ActionInstanceStateEnum.ActivationEnd
|
|
597
|
-
: ActionInstanceStateEnum.FetchEnd;
|
|
598
|
-
// must skip initialization from view container, because it would only get old instance.
|
|
599
|
-
// we need new instance before we can set new one on the view container.
|
|
600
|
-
const newInstance = this.getOrCreateInstance(undefined, instance.action, undefined, newInstanceStatus, true);
|
|
601
|
-
newInstance.reactivationPreviousInstance = instance;
|
|
602
|
-
// copy some additional settings
|
|
603
|
-
newInstance.activationDialogRef = instance.activationDialogRef;
|
|
604
|
-
newInstance.triggerParameters = instance.triggerParameters;
|
|
605
|
-
newInstance.activationParameters = instance.activationParameters;
|
|
606
|
-
if (this.viewContainer) {
|
|
607
|
-
this.viewContainer.routeTriggeredActionInstance.set(newInstance);
|
|
608
|
-
}
|
|
609
|
-
instance.reactivationInstance = newInstance;
|
|
610
|
-
}
|
|
611
|
-
// finish related actions
|
|
612
|
-
if (instance.nextActionInstance && instance.nextActionInstance instanceof ActionInstance) {
|
|
613
|
-
this.logger.debug(`Finishing instance ${instance.instanceLongName} related next action instance: ${instance.nextActionInstance.instanceLongName}`);
|
|
614
|
-
this.finishAction(instance.nextActionInstance, onDestroy);
|
|
615
|
-
}
|
|
616
|
-
if (instance.errorActionInstance && instance.errorActionInstance instanceof ActionInstance) {
|
|
617
|
-
this.logger.debug(`Finishing instance ${instance.instanceLongName} related error action instance: ${instance.errorActionInstance.instanceLongName}`);
|
|
618
|
-
this.finishAction(instance.errorActionInstance, onDestroy);
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
/**
|
|
622
|
-
* Triggers action with parameters.
|
|
623
|
-
*
|
|
624
|
-
* @param action Action descriptor.
|
|
625
|
-
* @param parameters Action parameters for action execution to construct new route.
|
|
626
|
-
* @param runContext Marks if context should be run.
|
|
627
|
-
*
|
|
628
|
-
* @returns Action instance - if non provided in parameters, the newly created will be returned.
|
|
629
|
-
*/
|
|
630
|
-
triggerAction(action, parameters, runContext = false) {
|
|
631
|
-
const instance = this.getOrCreateInstance(undefined, action, parameters);
|
|
632
|
-
instance.triggerParameters = parameters;
|
|
633
|
-
instance.state = ActionInstanceStateEnum.TriggerStart;
|
|
634
|
-
if (action.activationTrigger === ActionActivationTriggerEnum.OnRoute) {
|
|
635
|
-
const baseUrl = this.router.url.split('?')[0];
|
|
636
|
-
const parsedUrl = this.router.parseUrl(this.router.url);
|
|
637
|
-
let actionUrl = action.routeUrl ?? '';
|
|
638
|
-
if (actionUrl.startsWith('/')) {
|
|
639
|
-
actionUrl = actionUrl.substring(1);
|
|
640
|
-
}
|
|
641
|
-
const actionUrlSegments = this.parametrize.transform(actionUrl, parameters.itemId, parameters.item, parameters.actionData).split('/');
|
|
642
|
-
// set instance in view container
|
|
643
|
-
if (this.viewContainer) {
|
|
644
|
-
this.viewContainer.routeTriggeredActionInstance.set(instance);
|
|
645
|
-
}
|
|
646
|
-
from(this.router.navigate([baseUrl, ...actionUrlSegments], { relativeTo: parameters.route, queryParams: parsedUrl.queryParams }))
|
|
647
|
-
.pipe(take(1))
|
|
648
|
-
.subscribe(() => (instance.state = ActionInstanceStateEnum.TriggerEnd));
|
|
649
|
-
return instance;
|
|
650
|
-
}
|
|
651
|
-
else {
|
|
652
|
-
instance.state = ActionInstanceStateEnum.TriggerEnd;
|
|
653
|
-
this.activateAction(action, parameters, instance);
|
|
654
|
-
if (runContext) {
|
|
655
|
-
const context = instance.context;
|
|
656
|
-
if (context) {
|
|
657
|
-
this.run(context);
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
|
-
return instance;
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
/**
|
|
664
|
-
* Deactivates on route triggered action by trying to reroute back to location where action was triggered.
|
|
665
|
-
* @param instance Action instance.
|
|
666
|
-
*/
|
|
667
|
-
finishActionRouteUntrigger(instance) {
|
|
668
|
-
if (instance.action.activationTrigger !== ActionActivationTriggerEnum.OnRoute) {
|
|
669
|
-
return;
|
|
670
|
-
}
|
|
671
|
-
instance = this.getOrCreateInstance(instance);
|
|
672
|
-
instance.state = ActionInstanceStateEnum.FinishRouteUntriggerStart;
|
|
673
|
-
let url = this.navigationService.getCurrentLocationFromHistory() ?? this.navigationService.getCurrentLocationFromUrl();
|
|
674
|
-
if (!url) {
|
|
675
|
-
this.navigationService.back();
|
|
676
|
-
}
|
|
677
|
-
else {
|
|
678
|
-
if (url.startsWith('/')) {
|
|
679
|
-
url = url.substring(1);
|
|
680
|
-
}
|
|
681
|
-
const splitUrlQueryParam = url.split('?');
|
|
682
|
-
const urlPathSegments = splitUrlQueryParam[0].split('#')[0].split('/');
|
|
683
|
-
const queryParam = splitUrlQueryParam[1]?.split('#')[0];
|
|
684
|
-
let actionUrl = instance.action?.routeUrl ?? '';
|
|
685
|
-
if (actionUrl.startsWith('/')) {
|
|
686
|
-
actionUrl = actionUrl.substring(1);
|
|
687
|
-
}
|
|
688
|
-
const actionUrlSegments = actionUrl.split('/');
|
|
689
|
-
let redirectUrl = '/' + urlPathSegments.slice(0, urlPathSegments.length - actionUrlSegments.length).join('/');
|
|
690
|
-
if (typeof queryParam !== 'undefined') {
|
|
691
|
-
redirectUrl = `${redirectUrl}?${queryParam}`;
|
|
692
|
-
}
|
|
693
|
-
// No URL replaces, probably ok, to allow going back
|
|
694
|
-
from(this.router.navigateByUrl(redirectUrl))
|
|
695
|
-
.pipe(first(), timeout(1000))
|
|
696
|
-
.subscribe({
|
|
697
|
-
next: () => (instance.state = ActionInstanceStateEnum.FinishRouteUntriggerEndFinal),
|
|
698
|
-
error: () => (instance.state = ActionInstanceStateEnum.FinishRouteUntriggerTimeoutFinal)
|
|
699
|
-
});
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
/**
|
|
703
|
-
* Transform error of any type to error by using error mapper that could be provided by final project.
|
|
704
|
-
* @param error error of any type.
|
|
705
|
-
* @param context Action context.
|
|
706
|
-
*
|
|
707
|
-
* @returns mapped ICommonsError.
|
|
708
|
-
*/
|
|
709
|
-
toActionError(error, context) {
|
|
710
|
-
let commonsError;
|
|
711
|
-
if (context) {
|
|
712
|
-
const options = {
|
|
713
|
-
cause: error,
|
|
714
|
-
location: this.router.url
|
|
715
|
-
};
|
|
716
|
-
if (error instanceof HttpErrorResponse) {
|
|
717
|
-
options.httpError = error;
|
|
718
|
-
}
|
|
719
|
-
commonsError = new CommonsActionError(error?.message ?? 'Unknown error', context.contextLongName);
|
|
720
|
-
}
|
|
721
|
-
else if (error instanceof HttpErrorResponse) {
|
|
722
|
-
// should not really happen (should always be wrapped in MngActionError), just in case
|
|
723
|
-
commonsError = new CommonsHttpError(`Http Error occurred in action`, error, {
|
|
724
|
-
location: this.router.url
|
|
725
|
-
});
|
|
726
|
-
}
|
|
727
|
-
else {
|
|
728
|
-
// not from action, so unknown source of error
|
|
729
|
-
commonsError = new CommonsInternalError(error?.message ?? 'Unknown error', {
|
|
730
|
-
name: error?.name ?? 'UnknownError',
|
|
731
|
-
location: this.router.url,
|
|
732
|
-
cause: error
|
|
733
|
-
});
|
|
734
|
-
}
|
|
735
|
-
// just trace it, allow user to set if this is error or not
|
|
736
|
-
this.logger.trace(commonsError);
|
|
737
|
-
return this.errorMapper.toCommonsError(error, commonsError);
|
|
738
|
-
}
|
|
739
|
-
/**
|
|
740
|
-
* Creates or gets existing action instance.
|
|
741
|
-
* @param instance Action instance.
|
|
742
|
-
* @param action Action descriptor.
|
|
743
|
-
* @param parameters Action parameters.
|
|
744
|
-
* @param instanceInitialStatus Action instance initial status.
|
|
745
|
-
* @param skipInitializationFromViewContainer If initialization of instance from view container should be skipped.
|
|
746
|
-
* @private
|
|
747
|
-
*/
|
|
748
|
-
getOrCreateInstance(instance, action, parameters, instanceInitialStatus, skipInitializationFromViewContainer = false) {
|
|
749
|
-
if (!skipInitializationFromViewContainer && !instance && action?.activationTrigger === ActionActivationTriggerEnum.OnRoute && parameters) {
|
|
750
|
-
instance = this.viewContainer?.routeTriggeredActionInstance();
|
|
751
|
-
}
|
|
752
|
-
if (!instance) {
|
|
753
|
-
if (!action) {
|
|
754
|
-
throw new CommonsInternalError('Action descriptor is not provided, instance cannot be created.', { name: 'ActionExecutorServiceError' });
|
|
755
|
-
}
|
|
756
|
-
// create new instance if non provided
|
|
757
|
-
instance = new ActionInstance(action, instanceInitialStatus);
|
|
758
|
-
}
|
|
759
|
-
if (this.config?.actions?.debugInstances && !this.instances.some(i => i.instanceLongName === instance.instanceLongName)) {
|
|
760
|
-
if (this.instances.length >= this.instancesBufferMax) {
|
|
761
|
-
const lastInstance = this.instances.shift();
|
|
762
|
-
if (lastInstance.state < ActionInstanceStateEnum.FinishSuccessFinal) {
|
|
763
|
-
this.logger.debug(`ERROR: Not all instances are finished! Finishing instance ${instance.instanceLongName} with dismissal.`);
|
|
764
|
-
lastInstance.forceFinish();
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
this.instances.push(instance);
|
|
768
|
-
}
|
|
769
|
-
return instance;
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWV4ZWN1dG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90YWJsZXZpZXcvc3JjL2FjdGlvbi9zZXJ2aWNlcy9hY3Rpb24tZXhlY3V0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUMsUUFBUSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUMsTUFBTSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFFaEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFlLG1CQUFtQixFQUFFLGNBQWMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM5RSxPQUFPLEVBQUMsYUFBYSxFQUFzQixNQUFNLHVCQUF1QixDQUFDO0FBQ3pFLE9BQU8sRUFBYSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFFSCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGNBQWMsRUFHZCxhQUFhLEVBRWIsZUFBZSxFQUNmLGNBQWMsRUFDZCxhQUFhLEVBQ2IsYUFBYSxFQUNiLFlBQVksRUFDZixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBQyxrQkFBa0IsRUFBeUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRixPQUFPLEVBQ0gsMkJBQTJCLEVBRzNCLDBCQUEwQixFQUMxQix1QkFBdUIsRUFFdkIsY0FBYyxFQUNkLGtCQUFrQixFQUVsQixvQkFBb0IsRUFHcEIsZ0NBQWdD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QixFQUFFLENBQUM7Z0JBQ25ELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBRTVDLElBQUksWUFBYSxDQUFDLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw2REFBNkQsUUFBUSxDQUFDLGdCQUFnQixrQkFBa0IsQ0FBQyxDQUFDO29CQUM1SCxZQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2hDLENBQUM7WUFDTCxDQUFDO1lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0luamVjdG9yLCBpbmplY3R9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtSb3V0ZXIsIFVybFRyZWV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0NvbmZpcm1hdGlvbiwgQ29uZmlybWF0aW9uU2VydmljZSwgTWVzc2FnZVNlcnZpY2V9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7RGlhbG9nU2VydmljZSwgRHluYW1pY0RpYWxvZ0NvbmZpZ30gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgZnJvbSwgbWVyZ2VNYXAsIG9mLCBzd2l0Y2hNYXAsIHRha2UsIHRpbWVvdXR9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBmaWx0ZXIsIGZpcnN0LCBtYXAsIHN0YXJ0V2l0aH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICAgIEFjdGlvblBhcmFtZXRlcnMsXG4gICAgQ29tbW9uc0h0dHBFcnJvcixcbiAgICBDb21tb25zSW50ZXJuYWxFcnJvcixcbiAgICBDb21tb25zU2VydmljZSxcbiAgICBJQ29tbW9uc0Vycm9yLFxuICAgIElEYXRhUHJvdmlkZXIsXG4gICAgTG9nZ2VyU2VydmljZSxcbiAgICBOdWxsYWJsZSxcbiAgICBQYXJhbWV0cml6ZVBpcGUsXG4gICAgU3R5bGVMZXZlbEVudW0sXG4gICAgU3R5bGVTaXplRW51bSxcbiAgICBlc2NhcGVIdG1sQW55LFxuICAgIHRvT2JzZXJ2YWJsZVxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtCdXR0b25TdHlsZUJ1aWxkZXIsIElCdXR0b25TdHlsZURlc2NyaXB0b3J9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZm9ybS9hcGknO1xuaW1wb3J0IHtcbiAgICBBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0sXG4gICAgQWN0aW9uQ29udGV4dFZhbGlkYXRpb24sXG4gICAgQWN0aW9uRGVzY3JpcHRvckluc3QsXG4gICAgQWN0aW9uRWRpdG9yRGVzY3JpcHRvckluc3QsXG4gICAgQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0sXG4gICAgQWN0aW9uUnVuRm5UeXBlLFxuICAgIEFjdGlvblR5cGVFbnVtLFxuICAgIENvbW1vbnNBY3Rpb25FcnJvcixcbiAgICBDb21tb25zQWN0aW9uRXJyb3JPcHRpb25zLFxuICAgIERhdGFQcm92aWRlckV4ZWN1dG9yLFxuICAgIElBY3Rpb25FZGl0b3JDb21wb25lbnQsXG4gICAgSUFjdGlvbkluc3RhbmNlLFxuICAgIFRhYmxldmlld0FjdGlvbkRlZmF1bHRDYXRlZ29yaWVzXG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvdGFibGV2aWV3L2FwaSc7XG5cbmltcG9ydCB7Q09NTU9OU19UQUJMRVZJRVdfRkVBVFVSRV9DT05GSUdfSVR9IGZyb20gJy4uLy4uL3RhYmxldmlldy9zZXJ2aWNlcy90YWJsZXZpZXctZmVhdHVyZS1jb25maWcudG9rZW4nO1xuaW1wb3J0IHthY3Rpb25FeGVjdXRpb25TZWxlY3REYXRhUHJvdmlkZXJ9IGZyb20gJy4uL2hlbHBlcnMvYWN0aW9uLWV4ZWN1dGlvbic7XG5pbXBvcnQge2dldEkxOG5Gb3JBY3Rpb259IGZyb20gJy4uL2hlbHBlcnMvaTE4bic7XG5pbXBvcnQge2FjdGlvbk5vdGlmaWNhdGlvbkVycm9yLCBhY3Rpb25Ob3RpZmljYXRpb25TdWNjZXNzfSBmcm9tICcuLi9oZWxwZXJzL25vdGlmaWNhdGlvbic7XG5pbXBvcnQge0FjdGlvbkVkaXRvckRpYWxvZ0RhdGF9IGZyb20gJy4uL21vZGVscy9hY3Rpb24tZWRpdG9yLWRpYWxvZy1kYXRhLm1vZGVsJztcbmltcG9ydCB7QWN0aW9uQ29udGV4dCwgQWN0aW9uRGF0YVByb3ZpZGVyU291cmNlfSBmcm9tICcuLi9tb2RlbHMvZXhlY3V0aW9uL2FjdGlvbi1jb250ZXh0Lm1vZGVsJztcbmltcG9ydCB7QWN0aW9uSW5zdGFuY2V9IGZyb20gJy4uL21vZGVscy9leGVjdXRpb24vYWN0aW9uLWluc3RhbmNlLm1vZGVsJztcbmltcG9ydCB7QWN0aW9uRXJyb3JNYXBwZXJTZXJ2aWNlfSBmcm9tICcuL2FjdGlvbi1lcnJvci1tYXBwZXIuc2VydmljZSc7XG5pbXBvcnQge05hdmlnYXRpb25TZXJ2aWNlfSBmcm9tICcuL25hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQge0FDVElPTl9FRElUT1JfQ09NUE9ORU5UX0lUfSBmcm9tICcuL3Rva2Vucy9hY3Rpb24tZWRpdG9yLnRva2VuJztcbmltcG9ydCB7Vmlld0NvbnRhaW5lcn0gZnJvbSAnLi92aWV3LWNvbnRhaW5lci5zZXJ2aWNlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFjdGlvbkV4ZWN1dG9yU2VydmljZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ0FjdGlvbkV4ZWN1dG9yU2VydmljZSc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2UgPSBpbmplY3QoRGlhbG9nU2VydmljZSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29tbW9ucyA9IGluamVjdChDb21tb25zU2VydmljZSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGFQcm92aWRlckV4ZWN1dG9yID0gaW5qZWN0KERhdGFQcm92aWRlckV4ZWN1dG9yKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmF2aWdhdGlvblNlcnZpY2UgPSBpbmplY3QoTmF2aWdhdGlvblNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBlcnJvck1hcHBlciA9IGluamVjdChBY3Rpb25FcnJvck1hcHBlclNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjb25maWcgPSBpbmplY3QoQ09NTU9OU19UQUJMRVZJRVdfRkVBVFVSRV9DT05GSUdfSVQsIHtvcHRpb25hbDogdHJ1ZX0pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0RWRpdG9yRGlhbG9nQ29tcG9uZW50ID0gaW5qZWN0KEFDVElPTl9FRElUT1JfQ09NUE9ORU5UX0lUKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2UgPSBpbmplY3QoTWVzc2FnZVNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjb25maXJtYXRpb25TZXJ2aWNlID0gaW5qZWN0KENvbmZpcm1hdGlvblNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB2aWV3Q29udGFpbmVyID0gaW5qZWN0KFZpZXdDb250YWluZXIsIHtvcHRpb25hbDogdHJ1ZX0pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwYXJhbWV0cml6ZSA9IG5ldyBQYXJhbWV0cml6ZVBpcGUoKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBpbnN0YW5jZXNCdWZmZXJNYXggPSAxMDA7XG4gICAgcHJvdGVjdGVkIGxvZ2dlciA9IGluamVjdChMb2dnZXJTZXJ2aWNlKS5jcmVhdGUoQWN0aW9uRXhlY3V0b3JTZXJ2aWNlLmNsYXNzTmFtZSk7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGluc3RhbmNlcygpOiBBY3Rpb25JbnN0YW5jZTxhbnksIGFueT5bXTtcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGFjdGlvbiBjb250ZXh0IGZvciB1c2FnZSBpbiB2YWxpZGF0aW9uLlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGRhdGFQcm92aWRlciBEYXRhIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBwcmVwYXJlQWN0aW9uQ29udGV4dFZhbGlkYXRpb248SXRlbSwgUGFyYW1ldGVyc0l0ZW0sIFNlcnZpY2U+KFxuICAgICAgICBhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3JJbnN0PEl0ZW0+LFxuICAgICAgICBwYXJhbWV0ZXJzOiBBY3Rpb25QYXJhbWV0ZXJzPFBhcmFtZXRlcnNJdGVtPixcbiAgICAgICAgZGF0YVByb3ZpZGVyPzogSURhdGFQcm92aWRlcjxJdGVtLCBTZXJ2aWNlPlxuICAgICk6IEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPiB7XG4gICAgICAgIGNvbnN0IGN0eERhdGFQcm92aWRlciA9IGFjdGlvbkV4ZWN1dGlvblNlbGVjdERhdGFQcm92aWRlcihhY3Rpb24sIGRhdGFQcm92aWRlciwgdGhpcy52aWV3Q29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuIDxBY3Rpb25Db250ZXh0VmFsaWRhdGlvbjxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZT4+e1xuICAgICAgICAgICAgZGVzY3JpcHRvcjogYWN0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyxcbiAgICAgICAgICAgIHNlcnZpY2VJbnN0YW5jZTogdGhpcy5kYXRhUHJvdmlkZXJFeGVjdXRvci5nZXREYXRhUHJvdmlkZXJTZXJ2aWNlKHRoaXMuaW5qZWN0b3IsIGN0eERhdGFQcm92aWRlci5kYXRhUHJvdmlkZXIpID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRhdGFQcm92aWRlcjogY3R4RGF0YVByb3ZpZGVyLmRhdGFQcm92aWRlclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgYWN0aW9uIGNvbnRleHQgYnkgc3VibWl0dGluZyBleGVjdXRpb24gcmVzdWx0cy9lcnJvcnMgdG8gY29udGV4dCwgd2F0Y2hpbmcgb3ZlciBpbnN0YW5jZSByZXN1bHRzL2Vycm9ycywgZGlzcGxheWluZyBub3RpZmljYXRpb25zLFxuICAgICAqIHJ1bm5pbmcgbmV4dC9lcnJvciBhY3Rpb24gYW5kIHRyaWdnZXJpbmcgZGlzbWlzcyBvZiBhY3Rpb24uIENvbmZpcm1hdGlvbiBpcyBhbHNvIHByb2Nlc3NlZCBoZXJlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGN0eCBBY3Rpb24gY29udGV4dCB0byBydW4uXG4gICAgICovXG4gICAgcHVibGljIHJ1bjxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZSA9IHVuZGVmaW5lZD4oY3R4OiBBY3Rpb25Db250ZXh0PEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPikge1xuICAgICAgICBjb25zdCBpc01haW5SdW5GbiA9IGN0eC5mdW5jdGlvbk5hbWUgPT09ICdzdWJtaXQnIHx8IGN0eC5mdW5jdGlvbk5hbWUgPT09ICdydW4nO1xuXG4gICAgICAgIGlmIChpc01haW5SdW5GbiAmJiBjdHguaW5zdGFuY2UuYWN0aW9uLnJ1bkNvbmZpcm1hdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBvbmx5IGRpcmVjdCBhY3Rpb24gY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBydW4gY29uZmlybWF0aW9uXG4gICAgICAgICAgICAvLyBpZiBlZGl0b3IsIHRoZW4gcnVuIGNvbmZpcm1hdGlvbiBpcyBtYXBwZWQgdG8gc3VibWl0IGFjdGlvbiBhbmQgaWdub3JlZCBhcyBlZGl0b3IgcnVuXG4gICAgICAgICAgICBjb25zdCBjb25maXJtYXRpb25PcHRzID0gY3R4Lmluc3RhbmNlLmFjdGlvbi5ydW5Db25maXJtYXRpb247XG5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdHgucGFyYW1ldGVycy5pdGVtO1xuICAgICAgICAgICAgY29uc3QgZXNjYXBlZEl0ZW0gPSBlc2NhcGVIdG1sQW55KGl0ZW0pO1xuXG4gICAgICAgICAgICBjb25zdCBnZXRUcmFuc2xhdGlvbk9yVW5kZWZpbmVkID0gKGxhYmVsOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBkZWZMYWJlbDogc3RyaW5nLCBmYWxsYmFjazogc3RyaW5nLCBlc2NhcGVJdGVtID0gZmFsc2UpID0+XG4gICAgICAgICAgICAgICAgbGFiZWwgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgPyAoZ2V0STE4bkZvckFjdGlvbih0aGlzLnRyYW5zbGF0ZSwgY3R4Lmluc3RhbmNlLmFjdGlvbiwgZGVmTGFiZWwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tS2V5OiBsYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogZXNjYXBlSXRlbSA/IGVzY2FwZWRJdGVtIDogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tLZXk6IGZhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgICAgfSkgPz8gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGdldEJ1dHRvblN0eWxlID0gKHN0eWxlPzogSUJ1dHRvblN0eWxlRGVzY3JpcHRvciwgZGVmPzogSUJ1dHRvblN0eWxlRGVzY3JpcHRvcikgPT5cbiAgICAgICAgICAgICAgICAoc3R5bGUgaW5zdGFuY2VvZiBCdXR0b25TdHlsZUJ1aWxkZXIgPyBzdHlsZSA6IEJ1dHRvblN0eWxlQnVpbGRlci5mcm9tKHsuLi5kZWYsIC4uLnN0eWxlfSA/PyBkZWYpKS5idWlsZCgpO1xuXG4gICAgICAgICAgICBsZXQgY29uZmlybVBhcmFtczogQ29uZmlybWF0aW9uID0ge1xuICAgICAgICAgICAgICAgIGljb246IGNvbmZpcm1hdGlvbk9wdHMuaWNvbiAhPT0gbnVsbCA/IChjb25maXJtYXRpb25PcHRzLmljb24gPz8gJ3BpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJykgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBnZXRUcmFuc2xhdGlvbk9yVW5kZWZpbmVkKGNvbmZpcm1hdGlvbk9wdHMudGl0bGUsICdjb25maXJtLnRpdGxlJywgJ2dlbmVyYWwuY29uZmlybWF0aW9uJyksXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZ2V0VHJhbnNsYXRpb25PclVuZGVmaW5lZChjb25maXJtYXRpb25PcHRzLm1lc3NhZ2UsICdjb25maXJtLm1lc3NhZ2UnLCAnZ2VuZXJhbC5jb25maXJtYXRpb24nKSxcbiAgICAgICAgICAgICAgICBhY2NlcHRWaXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGFjY2VwdExhYmVsOiBnZXRUcmFuc2xhdGlvbk9yVW5kZWZpbmVkKGNvbmZpcm1hdGlvbk9wdHMuYWNjZXB0QnV0dG9uPy5sYWJlbCwgJ2NvbmZpcm0uYWNjZXB0JywgJ2dlbmVyYWwueWVzJyksXG4gICAgICAgICAgICAgICAgYWNjZXB0SWNvbjogY29uZmlybWF0aW9uT3B0cy5hY2NlcHRCdXR0b24/Lmljb24gIT09IG51bGwgPyAoY29uZmlybWF0aW9uT3B0cy5hY2NlcHRCdXR0b24/Lmljb24gPz8gY3R4Lmluc3RhbmNlLmFjdGlvbi5idXR0b24/Lmljb24gPz8gJ3BpIHBpLWNoZWNrJykgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYWNjZXB0QnV0dG9uU3R5bGVDbGFzczogZ2V0QnV0dG9uU3R5bGUoY29uZmlybWF0aW9uT3B0cy5hY2NlcHRCdXR0b24/LnN0eWxlLCB7bGV2ZWw6IGN0eC5pbnN0YW5jZS5hY3Rpb24uYnV0dG9uPy5zdHlsZT8ubGV2ZWx9KSxcbiAgICAgICAgICAgICAgICByZWplY3RWaXNpYmxlOiAhKGNvbmZpcm1hdGlvbk9wdHMucmVqZWN0QnV0dG9uID09PSBmYWxzZSB8fCAoY29uZmlybWF0aW9uT3B0cy5yZWplY3RCdXR0b24/LmxhYmVsID09PSBudWxsICYmIGNvbmZpcm1hdGlvbk9wdHMucmVqZWN0QnV0dG9uPy5pY29uID09PSBudWxsKSksXG4gICAgICAgICAgICAgICAgcmVqZWN0TGFiZWw6IGNvbmZpcm1hdGlvbk9wdHMucmVqZWN0QnV0dG9uICE9PSBmYWxzZSA/IGdldFRyYW5zbGF0aW9uT3JVbmRlZmluZWQoY29uZmlybWF0aW9uT3B0cy5yZWplY3RCdXR0b24/LmxhYmVsLCAnY29uZmlybS5yZWplY3QnLCAnZ2VuZXJhbC5ubycpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlamVjdEljb246XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbk9wdHMucmVqZWN0QnV0dG9uICE9PSBmYWxzZSAmJiBjb25maXJtYXRpb25PcHRzLnJlamVjdEJ1dHRvbj8uaWNvbiAhPT0gbnVsbCA/IChjb25maXJtYXRpb25PcHRzLnJlamVjdEJ1dHRvbj8uaWNvbiA/PyAncGkgcGktdGltZXMnKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWplY3RCdXR0b25TdHlsZUNsYXNzOlxuICAgICAgICAgICAgICAgICAgICBjb25maXJtYXRpb25PcHRzLnJlamVjdEJ1dHRvbiAhPT0gZmFsc2UgPyBnZXRCdXR0b25TdHlsZShjb25maXJtYXRpb25PcHRzLnJlamVjdEJ1dHRvbj8uc3R5bGUsIHtsZXZlbDogU3R5bGVMZXZlbEVudW0uU2Vjb25kYXJ5fSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY2xvc2VPbkVzY2FwZTogY29uZmlybWF0aW9uT3B0cy5jbG9zZU9uRXNjYXBlLFxuICAgICAgICAgICAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5SdW5Db25maXJtYXRpb25FbmRBY2NlcHQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVuV2l0aG91dENvbmZpcm1hdGlvbihjdHgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVqZWN0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1bkNvbmZpcm1hdGlvbkVuZFJlamVjdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC5pbnN0YW5jZS5hY3Rpb24udHlwZSAhPT0gQWN0aW9uVHlwZUVudW0uRWRpdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3QgZWRpdG9yLCB0aGUgaXQgY2FuIGJlIGNsb3NlZFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5pc2hBY3Rpb24oY3R4Lmluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChjb25maXJtYXRpb25PcHRzLmNvbmZpZ01hcEZuKSB7XG4gICAgICAgICAgICAgICAgY29uZmlybVBhcmFtcyA9IGNvbmZpcm1hdGlvbk9wdHMuY29uZmlnTWFwRm4oY3R4LCBjb25maXJtUGFyYW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3R4LmNvbmZpcm1hdGlvbiA9IGNvbmZpcm1QYXJhbXM7XG4gICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5SdW5Db25maXJtYXRpb25TdGFydDtcblxuICAgICAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oY29uZmlybVBhcmFtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJ1bldpdGhvdXRDb25maXJtYXRpb24oY3R4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgYWN0aW9uIGNvbnRleHQgYnkgc3VibWl0dGluZyBleGVjdXRpb24gcmVzdWx0cy9lcnJvcnMgdG8gY29udGV4dCwgd2F0Y2hpbmcgb3ZlciBpbnN0YW5jZSByZXN1bHRzL2Vycm9ycywgZGlzcGxheWluZyBub3RpZmljYXRpb25zLFxuICAgICAqIHJ1bm5pbmcgbmV4dC9lcnJvciBhY3Rpb24gYW5kIHRyaWdnZXJpbmcgZGlzbWlzcyBvZiBhY3Rpb24uIENvbmZpcm1hdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIGN0eCBBY3Rpb24gY29udGV4dCB0byBydW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBY3Rpb24gY29udGV4dCBmb3Igc3VibWl0ICg9cnVuKSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJ1bldpdGhvdXRDb25maXJtYXRpb248SXRlbSwgUGFyYW1ldGVyc0l0ZW0sIFNlcnZpY2UgPSB1bmRlZmluZWQ+KGN0eDogQWN0aW9uQ29udGV4dDxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZT4pOiBPYnNlcnZhYmxlPEl0ZW0gfCBudWxsIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IGlzTWFpblJ1bkZuID0gY3R4LmZ1bmN0aW9uTmFtZSA9PT0gJ3N1Ym1pdCcgfHwgY3R4LmZ1bmN0aW9uTmFtZSA9PT0gJ3J1bic7XG4gICAgICAgIGNvbnN0IGlzRXJyb3JDcml0aWNhbFJ1bkZuID0gY3R4LmZ1bmN0aW9uTmFtZSA9PT0gJ3J1bic7XG4gICAgICAgIGxldCBhY3Rpb25FZGl0b3I6IEFjdGlvbkVkaXRvckRlc2NyaXB0b3JJbnN0PEl0ZW0sIFNlcnZpY2UsIGFueSwgYW55LCBhbnksIGFueT47XG5cbiAgICAgICAgbGV0IGZuT2JzOiBBY3Rpb25SdW5GblR5cGU8SXRlbSwgU2VydmljZSwgUGFyYW1ldGVyc0l0ZW0+O1xuICAgICAgICBzd2l0Y2ggKGN0eC5mdW5jdGlvbk5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgICAgICAgICAgICAgYWN0aW9uRWRpdG9yID0gY3R4Lmluc3RhbmNlLmFjdGlvbiBhcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9ySW5zdDxJdGVtLCBTZXJ2aWNlLCBhbnksIGFueSwgYW55LCBhbnk+O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uRWRpdG9yLnN1Ym1pdEZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25FZGl0b3IudGFibGV2aWV3Q2F0ZWdvcnkgPT09IFRhYmxldmlld0FjdGlvbkRlZmF1bHRDYXRlZ29yaWVzLkFERCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm5PYnMgPSB0aGlzLmRhdGFQcm92aWRlckV4ZWN1dG9yLnJ1bkNyZWF0ZU9yRmFpbC5iaW5kKHRoaXMuZGF0YVByb3ZpZGVyRXhlY3V0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbkVkaXRvci50YWJsZXZpZXdDYXRlZ29yeSA9PT0gVGFibGV2aWV3QWN0aW9uRGVmYXVsdENhdGVnb3JpZXMuRURJVCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm5PYnMgPSB0aGlzLmRhdGFQcm92aWRlckV4ZWN1dG9yLnJ1blVwZGF0ZU9yRmFpbC5iaW5kKHRoaXMuZGF0YVByb3ZpZGVyRXhlY3V0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN0eC5kYXRhUHJvdmlkZXJTb3VyY2UgPiBBY3Rpb25EYXRhUHJvdmlkZXJTb3VyY2UuVmlld0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZGF0YSBwcm92aWRlciBpcyBnaXZlbiBkaXJlY3RseSBvbiBkZXNjcmlwdG9yIG9yIGFzIGlucHV0LCB1c2UgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTdWJtaXQgPSBvZigoY3R4LnBhcmFtZXRlcnM/Lml0ZW0gYXMgTnVsbGFibGU8SXRlbT4pID8/IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbk9icyA9IGN0eCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC5wYXJhbWV0ZXJzLml0ZW1JZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhUHJvdmlkZXJFeGVjdXRvci5ydW5VcGRhdGUoY3R4LCBkZWZhdWx0U3VibWl0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhUHJvdmlkZXJFeGVjdXRvci5ydW5DcmVhdGUoY3R4LCBkZWZhdWx0U3VibWl0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm5PYnMgPSBjdHggPT4gKGN0eC5wYXJhbWV0ZXJzPy5pdGVtIGFzIE51bGxhYmxlPEl0ZW0+KSA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbk9icyA9IGFjdGlvbkVkaXRvci5zdWJtaXRGdW5jdGlvbiBhcyB1bmtub3duIGFzIEFjdGlvblJ1bkZuVHlwZTxJdGVtLCBTZXJ2aWNlLCBQYXJhbWV0ZXJzSXRlbT47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmV0Y2gnOlxuICAgICAgICAgICAgICAgIGFjdGlvbkVkaXRvciA9IGN0eC5pbnN0YW5jZS5hY3Rpb24gYXMgQWN0aW9uRWRpdG9yRGVzY3JpcHRvckluc3Q8SXRlbSwgU2VydmljZSwgYW55LCBhbnksIGFueSwgYW55PjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbkVkaXRvci5mZXRjaEZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25FZGl0b3IudGFibGV2aWV3Q2F0ZWdvcnkgPT09IFRhYmxldmlld0FjdGlvbkRlZmF1bHRDYXRlZ29yaWVzLkVESVQgfHwgYWN0aW9uRWRpdG9yLnRhYmxldmlld0NhdGVnb3J5ID09PSBUYWJsZXZpZXdBY3Rpb25EZWZhdWx0Q2F0ZWdvcmllcy5ERVRBSUxTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0VkaXQgPSBhY3Rpb25FZGl0b3IudGFibGV2aWV3Q2F0ZWdvcnkgPT09IFRhYmxldmlld0FjdGlvbkRlZmF1bHRDYXRlZ29yaWVzLkVESVQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbk9icyA9IGN0eCA9PiB0aGlzLmRhdGFQcm92aWRlckV4ZWN1dG9yLnJ1bkZldGNoT3JGYWlsKGN0eCwgaXNFZGl0ID8gJ3VwZGF0ZScgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN0eC5kYXRhUHJvdmlkZXJTb3VyY2UgPiBBY3Rpb25EYXRhUHJvdmlkZXJTb3VyY2UuVmlld0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZldGNoID0gb2YoKGN0eC5wYXJhbWV0ZXJzPy5pdGVtIGFzIE51bGxhYmxlPEl0ZW0+KSA/PyB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm5PYnMgPSBjdHggPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdHgucGFyYW1ldGVycy5pdGVtSWQgfHwgdHlwZW9mIGN0eC5wYXJhbWV0ZXJzLml0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFQcm92aWRlckV4ZWN1dG9yLnJ1bkZldGNoKGN0eCwgdW5kZWZpbmVkLCBkZWZhdWx0RmV0Y2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdEZldGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuT2JzID0gY3R4ID0+IChjdHgucGFyYW1ldGVycz8uaXRlbSBhcyBOdWxsYWJsZTxJdGVtPikgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm5PYnMgPSBhY3Rpb25FZGl0b3IuZmV0Y2hGdW5jdGlvbiBhcyB1bmtub3duIGFzIEFjdGlvblJ1bkZuVHlwZTxJdGVtLCBTZXJ2aWNlLCBQYXJhbWV0ZXJzSXRlbT47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncnVuJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKCFjdHguaW5zdGFuY2UuYWN0aW9uLmhhc1J1bkZ1bmN0aW9uICYmIGN0eC5pbnN0YW5jZS5hY3Rpb24udGFibGV2aWV3Q2F0ZWdvcnkgPT09IFRhYmxldmlld0FjdGlvbkRlZmF1bHRDYXRlZ29yaWVzLkRFTEVURSkge1xuICAgICAgICAgICAgICAgICAgICBmbk9icyA9IHRoaXMuZGF0YVByb3ZpZGVyRXhlY3V0b3IucnVuRGVsZXRlT3JGYWlsLmJpbmQodGhpcy5kYXRhUHJvdmlkZXJFeGVjdXRvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm5PYnMgPSBjdHguaW5zdGFuY2UuYWN0aW9uLnJ1bkZ1bmN0aW9uIGFzIHVua25vd24gYXMgQWN0aW9uUnVuRm5UeXBlPEl0ZW0sIFNlcnZpY2UsIFBhcmFtZXRlcnNJdGVtPjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXRPYnMgPSBvZih2b2lkIDApLnBpcGUoXG4gICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNNYWluUnVuRm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbWFpbiBydW4gZnVuY3Rpb24sIGFsc28gc2V0IGxvYWRpbmcgdG8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5SdW5TdGFydDtcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmlzUnVuTG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GZXRjaFN0YXJ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBzdGFydCBjb250ZXh0IGV4ZWN1dGlvbiB0byBtYXJrIGV4ZWN1dGlvbiBsb2FkaW5nXG4gICAgICAgICAgICAgICAgY3R4LmV4ZWN1dGlvblN0YXJ0KCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdG9PYnNlcnZhYmxlKGZuT2JzKGN0eCkpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtZXJnZU1hcChydW5SZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBub3RpZmljYXRpb25zXG4gICAgICAgICAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9uSXRlbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LnBhcmFtZXRlcnM/Lml0ZW0sXG4gICAgICAgICAgICAgICAgICAgIC4uLmN0eC5wYXJhbWV0ZXJzPy5mb3JtSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LnBhcmFtZXRlcnM/LnN1Ym1pdFJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgLi4ucnVuUmVzdWx0XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoaXNNYWluUnVuRm4gJiYgKGN0eC5pbnN0YW5jZS5hY3Rpb24ucnVuTm90aWZpY2F0aW9uT25TdWNjZXNzID8/IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5ub3RpZmljYXRpb24gPSBhY3Rpb25Ob3RpZmljYXRpb25TdWNjZXNzKHRoaXMudHJhbnNsYXRlLCB0aGlzLm1lc3NhZ2VTZXJ2aWNlLCBjdHguaW5zdGFuY2UuYWN0aW9uLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGN0eC5mdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBub3RpZmljYXRpb25JdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHR5cGVvZiBjdHguaW5zdGFuY2UuYWN0aW9uLnJ1bk5vdGlmaWNhdGlvbk9uU3VjY2VzcyA9PT0gJ29iamVjdCcgPyBjdHguaW5zdGFuY2UuYWN0aW9uLnJ1bk5vdGlmaWNhdGlvbk9uU3VjY2VzcyA6IHt9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc01haW5SdW5GbiAmJiAoYWN0aW9uRWRpdG9yLmZldGNoTm90aWZpY2F0aW9uT25TdWNjZXNzID8/IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHgubm90aWZpY2F0aW9uID0gYWN0aW9uTm90aWZpY2F0aW9uU3VjY2Vzcyh0aGlzLnRyYW5zbGF0ZSwgdGhpcy5tZXNzYWdlU2VydmljZSwgYWN0aW9uRWRpdG9yLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGN0eC5mdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBub3RpZmljYXRpb25JdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHR5cGVvZiBhY3Rpb25FZGl0b3IuZmV0Y2hOb3RpZmljYXRpb25PblN1Y2Nlc3MgPT09ICdvYmplY3QnID8gYWN0aW9uRWRpdG9yLmZldGNoTm90aWZpY2F0aW9uT25TdWNjZXNzIDoge30pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHNldCBuZXh0IHN0YXRlIGRlcGVuZGluZyBvbiBydW5cbiAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBpc01haW5SdW5GbiA/IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1bkVuZCA6IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZldGNoRW5kO1xuICAgICAgICAgICAgICAgIC8vIHNldCBleGVjdXRpb24gcmVzdWx0XG4gICAgICAgICAgICAgICAgY3R4LmV4ZWN1dGlvbk5leHQocnVuUmVzdWx0LCBpc01haW5SdW5Gbik7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNNYWluUnVuRm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGluc3RhbmNlIGZpbmFsIHJlc3VsdCBvbiBtYWluIHJ1biBleGVjdXRpb25cbiAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLnJlc3VsdCA9IHJ1blJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmlzUnVuTG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHBvc3NpYmxlIGFmdGVyIHJ1biBhY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC5pbnN0YW5jZS5hY3Rpb24uYWZ0ZXJSdW5BY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgbmV3IHN0YXRlIGZvciBuZXh0IGFjdGlvbiBzdGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWZ0ZXJSdW5BY3Rpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjdHguaW5zdGFuY2UuYWN0aW9uLmFmdGVyUnVuQWN0aW9uID09PSAnZnVuY3Rpb24nID8gY3R4Lmluc3RhbmNlLmFjdGlvbi5hZnRlclJ1bkFjdGlvbihjdHgpIDogY3R4Lmluc3RhbmNlLmFjdGlvbi5hZnRlclJ1bkFjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRBY3Rpb25JbnN0YW5jZSA9IHRoaXMuYWN0aXZhdGVBY3Rpb248YW55LCBJdGVtLCBhbnk+KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUnVuQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBY3Rpb25QYXJhbWV0ZXJzPEl0ZW0+PntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiBjdHgucGFyYW1ldGVycy5pdGVtSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IHJ1blJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGF0YTogY3R4LnBhcmFtZXRlcnMuYWN0aW9uRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGU6IGN0eC5wYXJhbWV0ZXJzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb21wb25lbnQ6IGN0eC5wYXJhbWV0ZXJzLnNvdXJjZUNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZSBhcyBBY3Rpb25JbnN0YW5jZTx1bmtub3duLCB1bmtub3duPixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLm5leHRBY3Rpb25JbnN0YW5jZSA9IG5leHRBY3Rpb25JbnN0YW5jZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLnN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uTmV4dEFjdGlvblN0YXJ0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5pc2ggY3VycmVudCBhY3Rpb24gd2hlbiBuZXh0IGFjdGlvbiBmaW5pc2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRBY3Rpb25JbnN0YW5jZS5zdGF0ZSQucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFdpdGgobmV4dEFjdGlvbkluc3RhbmNlLnN0YXRlKSwgLy8gcHJvdmlkZSBmaXJzdCBzdGF0ZSBjYXVzZSBpdCBtaWdodCBiZSBmaW5pc2hlZCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHN0YXRlID0+IHN0YXRlID49IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaFN1Y2Nlc3NGaW5hbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5OZXh0QWN0aW9uRW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnVuUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHJ1blJlc3VsdCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcChydW5SZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc01haW5SdW5Gbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWFjdGl2YXRlIGFjdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaEFjdGlvbihjdHguaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcnVuUmVzdWx0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdHJhbnNmb3JtIGVycm9yIHRvIGFjdGlvbiBlcnJvclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbkVycm9yID0gdGhpcy50b0FjdGlvbkVycm9yKGVyciwgY3R4KTtcblxuICAgICAgICAgICAgICAgIC8vIHNldCBpbnN0YW5jZSBzdGF0ZSB0byBlcnJvclxuICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IGlzTWFpblJ1bkZuID8gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uUnVuRXJyb3IgOiBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GZXRjaEVycm9yO1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgZXhlY3V0aW9uIGVycm9yIG9uIGNvbnRleHRcbiAgICAgICAgICAgICAgICBjdHguZXhlY3V0aW9uRXJyb3IoYWN0aW9uRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGVycm9yT2JzID0gb2Yodm9pZCAwKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNNYWluUnVuRm4pIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuaXNSdW5Mb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3R4Lmluc3RhbmNlLmFjdGlvbi5ydW5Ob3RpZmljYXRpb25PbkVycm9yID8/IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkVycm9yLm5vdGlmaWNhdGlvbiA9IGFjdGlvbk5vdGlmaWNhdGlvbkVycm9yKHRoaXMudHJhbnNsYXRlLCB0aGlzLm1lc3NhZ2VTZXJ2aWNlLCBjdHguaW5zdGFuY2UuYWN0aW9uLCBhY3Rpb25FcnJvciwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBjdHguZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IGN0eC5wYXJhbWV0ZXJzLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHR5cGVvZiBjdHguaW5zdGFuY2UuYWN0aW9uLnJ1bk5vdGlmaWNhdGlvbk9uRXJyb3IgPT09ICdvYmplY3QnID8gY3R4Lmluc3RhbmNlLmFjdGlvbi5ydW5Ob3RpZmljYXRpb25PbkVycm9yIDoge30pXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkVycm9yLm5vdGlmaWNhdGlvbkVtaXRTb3VyY2UgPSBBY3Rpb25FeGVjdXRvclNlcnZpY2UuY2xhc3NOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lm5vdGlmaWNhdGlvbiA9IGFjdGlvbkVycm9yLm5vdGlmaWNhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBwb3NzaWJsZSBlcnJvciBhY3Rpb24gaWYgcnVuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc01haW5SdW5GbiAmJiBjdHguaW5zdGFuY2UuYWN0aW9uLm9uUnVuRXJyb3JBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uUnVuRXJyb3JBY3Rpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjdHguaW5zdGFuY2UuYWN0aW9uLm9uUnVuRXJyb3JBY3Rpb24gPT09ICdmdW5jdGlvbicgPyBjdHguaW5zdGFuY2UuYWN0aW9uLm9uUnVuRXJyb3JBY3Rpb24oY3R4KSA6IGN0eC5pbnN0YW5jZS5hY3Rpb24ub25SdW5FcnJvckFjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBzdGFydCB3aXRoIHRyaWdnZXIsIGJlY2F1c2Ugcm91dGluZyBtaWdodCBiZSBwcm9ibGVtYXRpYyAobG91c2luZyBwcmV2aW91cyByZXN1bHRzIGV0Yy4pXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckFjdGlvbkluc3RhbmNlID0gdGhpcy5hY3RpdmF0ZUFjdGlvbjxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZT4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SdW5FcnJvckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QWN0aW9uUGFyYW1ldGVyczxQYXJhbWV0ZXJzSXRlbT4+e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IGN0eC5wYXJhbWV0ZXJzLml0ZW1JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogY3R4LnBhcmFtZXRlcnMuaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGF0YTogY3R4LnBhcmFtZXRlcnMuYWN0aW9uRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGU6IGN0eC5wYXJhbWV0ZXJzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb21wb25lbnQ6IGN0eC5wYXJhbWV0ZXJzLnNvdXJjZUNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmVycm9yQWN0aW9uSW5zdGFuY2UgPSBlcnJvckFjdGlvbkluc3RhbmNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5FcnJvckFjdGlvblN0YXJ0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck9icyA9IGVycm9yQWN0aW9uSW5zdGFuY2Uuc3RhdGUkLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRXaXRoKGVycm9yQWN0aW9uSW5zdGFuY2Uuc3RhdGUpLCAvLyBwcm92aWRlIGZpcnN0IHN0YXRlIGNhdXNlIGl0IG1pZ2h0IGJlIGZpbmlzaGVkIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc3RhdGUgPT4gc3RhdGUgPj0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoU3VjY2Vzc0ZpbmFsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkVycm9yQWN0aW9uRW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25FZGl0b3IuZmV0Y2hOb3RpZmljYXRpb25PbkVycm9yID8/IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4Lm5vdGlmaWNhdGlvbiA9IGFjdGlvbk5vdGlmaWNhdGlvbkVycm9yKHRoaXMudHJhbnNsYXRlLCB0aGlzLm1lc3NhZ2VTZXJ2aWNlLCBhY3Rpb25FZGl0b3IsIGFjdGlvbkVycm9yLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogY3R4LmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdHgucGFyYW1ldGVycy5pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHR5cGVvZiBhY3Rpb25FZGl0b3IuZmV0Y2hOb3RpZmljYXRpb25PbkVycm9yID09PSAnb2JqZWN0JyA/IGFjdGlvbkVkaXRvci5mZXRjaE5vdGlmaWNhdGlvbk9uRXJyb3IgOiB7fSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbkVycm9yLm5vdGlmaWNhdGlvbkVtaXRTb3VyY2UgPSBBY3Rpb25FeGVjdXRvclNlcnZpY2UuY2xhc3NOYW1lO1xuICAgICAgICAgICAgICAgICAgICBjdHgubm90aWZpY2F0aW9uID0gYWN0aW9uRXJyb3Iubm90aWZpY2F0aW9uO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGxpc3QgYW5kIG1hcCBvbmx5IHRvIG1hcmsgaW5zdGFuY2Ugc3RhdGUgYXMgZmluaXNoZWQgZXJyb3Igc3RhdGVcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JPYnMucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYWN0aXZhdGUgYWN0aW9uIG9ubHkgaWYgY3JpdGljYWwgKGZldGNoIG9uIGVkaXRvciBvciBydW4gb24gYnV0dG9uIGFjdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFcnJvckNyaXRpY2FsUnVuRm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaEFjdGlvbihjdHguaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0aHJvdyBlcnJvciB0byBwcm9wYWdhdGUgZnVydGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYWN0aW9uRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgY3R4LnJ1blN1YnNjcmlwdGlvbiA9IHJldE9icy5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQWN0aW9uQ29udGV4dCAke2N0eC5jb250ZXh0TG9uZ05hbWV9IGV4ZWN1dGlvbiBuZXh0IGV2ZW50YCwgcmVzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoKGVyciBhcyBJQ29tbW9uc0Vycm9yIHwgdW5kZWZpbmVkKT8udHlwZSAhPT0gJ0NvbW1vbnNBY3Rpb25FcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYE5vbiBhY3Rpb24gZXJyb3Igb2NjdXJyZWRgLCBlcnIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBBY3Rpb24gY29udGV4dCAke2N0eC5jb250ZXh0TG9uZ05hbWV9IGV4ZWN1dGlvbiBlcnJvciBldmVudGAsIGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmV0T2JzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGVkaXRvciBhY3Rpb24ncyBmZXRjaCBmdW5jdGlvbiBieSBjcmVhdGluZyBuZXcgYWN0aW9uIGNvbnRleHQgZm9yIGFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMgZm9yIGNvbnRleHQuXG4gICAgICogQHBhcmFtIGRhdGFQcm92aWRlciBFZGl0b3IgZGF0YSBwcm92aWRlciBmb3IgY29udGV4dC5cbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgT3B0aW9uYWwgZXhpc3RpbmcgYWN0aW9uIGluc3RhbmNlIChpZiBub24gcHJvdmlkZWQsIG5ldyB3aWxsIGJlIGNyZWF0ZWQpLlxuICAgICAqIEBwYXJhbSBwcmV2aW91c0FjdGlvbkluc3RhbmNlIE9wdGlvbmFsIHByZXZpb3VzIGFjdGlvbiBpbnN0YW5jZSB0byBsaW5rIGluIG5leHQgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBY3Rpb24gY29udGV4dCBmb3IgZmV0Y2ggZnVuY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIHByZXBhcmVDb250ZXh0Rm9yRWRpdG9yRmV0Y2g8SXRlbSwgUGFyYW1ldGVyc0l0ZW0sIFNlcnZpY2U+KFxuICAgICAgICBhY3Rpb246IEFjdGlvbkVkaXRvckRlc2NyaXB0b3JJbnN0PEl0ZW0sIGFueSwgYW55LCBQYXJhbWV0ZXJzSXRlbSwgYW55LCBhbnk+LFxuICAgICAgICBwYXJhbWV0ZXJzOiBBY3Rpb25QYXJhbWV0ZXJzPFBhcmFtZXRlcnNJdGVtPixcbiAgICAgICAgZGF0YVByb3ZpZGVyPzogSURhdGFQcm92aWRlcjxJdGVtLCBTZXJ2aWNlPixcbiAgICAgICAgaW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTxJdGVtLCBTZXJ2aWNlPixcbiAgICAgICAgcHJldmlvdXNBY3Rpb25JbnN0YW5jZT86IElBY3Rpb25JbnN0YW5jZTxhbnksIGFueT5cbiAgICApOiBBY3Rpb25Db250ZXh0PEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPiB7XG4gICAgICAgIGluc3RhbmNlID0gdGhpcy5nZXRPckNyZWF0ZUluc3RhbmNlKGluc3RhbmNlLCBhY3Rpb24sIHBhcmFtZXRlcnMsIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkFjdGl2YXRpb25FbmQpO1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlQ29udGV4dEZvckVkaXRvcihpbnN0YW5jZSwgcGFyYW1ldGVycywgJ2ZldGNoJywgZGF0YVByb3ZpZGVyLCBwcmV2aW91c0FjdGlvbkluc3RhbmNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIGVkaXRvciBhY3Rpb24ncyBzdWJtaXQgKD1tYWluIHJ1bikgZnVuY3Rpb24gYnkgY3JlYXRpbmcgbmV3IGFjdGlvbiBjb250ZXh0IGZvciBhY3Rpb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFjdGlvbiBwYXJhbWV0ZXJzIGZvciBjb250ZXh0LlxuICAgICAqIEBwYXJhbSBkYXRhUHJvdmlkZXIgRWRpdG9yIGRhdGEgcHJvdmlkZXIgZm9yIGNvbnRleHQuXG4gICAgICogQHBhcmFtIGluc3RhbmNlIE9wdGlvbmFsIGV4aXN0aW5nIGFjdGlvbiBpbnN0YW5jZSAoaWYgbm9uIHByb3ZpZGVkLCBuZXcgd2lsbCBiZSBjcmVhdGVkKS5cbiAgICAgKiBAcGFyYW0gcHJldmlvdXNBY3Rpb25JbnN0YW5jZSBPcHRpb25hbCBwcmV2aW91cyBhY3Rpb24gaW5zdGFuY2UgdG8gbGluayBpbiBuZXh0IGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQWN0aW9uIGNvbnRleHQgZm9yIHN1Ym1pdCAoPXJ1bikgZnVuY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIHByZXBhcmVDb250ZXh0Rm9yRWRpdG9yU3VibWl0PEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPihcbiAgICAgICAgYWN0aW9uOiBBY3Rpb25FZGl0b3JEZXNjcmlwdG9ySW5zdDxJdGVtLCBhbnksIFBhcmFtZXRlcnNJdGVtLCBhbnksIGFueSwgYW55PixcbiAgICAgICAgcGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyczxQYXJhbWV0ZXJzSXRlbT4sXG4gICAgICAgIGRhdGFQcm92aWRlcj86IElEYXRhUHJvdmlkZXI8SXRlbSwgU2VydmljZT4sXG4gICAgICAgIGluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8SXRlbSwgU2VydmljZT4sXG4gICAgICAgIHByZXZpb3VzQWN0aW9uSW5zdGFuY2U/OiBJQWN0aW9uSW5zdGFuY2U8YW55LCBhbnk+XG4gICAgKTogQWN0aW9uQ29udGV4dDxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZT4ge1xuICAgICAgICBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JDcmVhdGVJbnN0YW5jZShpbnN0YW5jZSwgYWN0aW9uLCBwYXJhbWV0ZXJzLCBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5BY3RpdmF0aW9uRW5kKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUNvbnRleHRGb3JFZGl0b3IoaW5zdGFuY2UsIHBhcmFtZXRlcnMsICdzdWJtaXQnLCBkYXRhUHJvdmlkZXIsIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGFjdGlvbiBleGVjIGNvbnRleHQgZm9yIGFjdGlvbiBvZiB0eXBlIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBBY3Rpb24gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMgZm9yIGNvbnRleHQuXG4gICAgICogQHBhcmFtIGZ1bmN0aW9uTmFtZSBBY3Rpb24gZnVuY3Rpb24gbmFtZSBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIGRhdGFQcm92aWRlciBPcHRpb25hbCBkYXRhIHByb3ZpZGVyLiBJZiBub3QgcHJvdmlkZWQgZGF0YSBwcm92aWRlciBmcm9tIGVpdGhlciB0aGUgYWN0aW9uIGVkaXRvciBvciB2aWV3IGNvbnRhaW5lciB3aWxsIGJlIHVzZWQuXG4gICAgICogQHBhcmFtIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UgT3B0aW9uYWwgcHJldmlvdXMgYWN0aW9uIGluc3RhbmNlIHRvIGxpbmsgaW4gbmV4dCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVDb250ZXh0Rm9yRWRpdG9yPEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPihcbiAgICAgICAgaW5zdGFuY2U6IEFjdGlvbkluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+LFxuICAgICAgICBwYXJhbWV0ZXJzOiBBY3Rpb25QYXJhbWV0ZXJzPFBhcmFtZXRlcnNJdGVtPixcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAnc3VibWl0JyB8ICdmZXRjaCcsXG4gICAgICAgIGRhdGFQcm92aWRlcj86IElEYXRhUHJvdmlkZXIsXG4gICAgICAgIHByZXZpb3VzQWN0aW9uSW5zdGFuY2U/OiBJQWN0aW9uSW5zdGFuY2U8YW55LCBhbnk+XG4gICAgKTogQWN0aW9uQ29udGV4dDxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZT4ge1xuICAgICAgICBpZiAoaW5zdGFuY2UuYWN0aW9uLnR5cGUgIT09IEFjdGlvblR5cGVFbnVtLkVkaXRvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGBDYW5ub3QgY3JlYXRlIGVkaXRvciBjb250ZXh0IGZvciBhY3Rpb24gJHtpbnN0YW5jZS5hY3Rpb24uYWN0aW9uTmFtZUxvbmd9IG9mIHR5cGUgJHtpbnN0YW5jZS5hY3Rpb24udHlwZX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWRpdG9yQWN0aW9uID0gaW5zdGFuY2UuYWN0aW9uIGFzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3JJbnN0PEl0ZW0sIFNlcnZpY2UsIGFueSwgYW55LCBhbnksIGFueT47XG4gICAgICAgIGNvbnN0IGN0eERhdGFQcm92aWRlciA9IGFjdGlvbkV4ZWN1dGlvblNlbGVjdERhdGFQcm92aWRlcjxJdGVtLCBTZXJ2aWNlPihlZGl0b3JBY3Rpb24sIGRhdGFQcm92aWRlciwgdGhpcy52aWV3Q29udGFpbmVyKTtcbiAgICAgICAgY29uc3QgY3R4ID0gbmV3IEFjdGlvbkNvbnRleHQ8SXRlbSwgUGFyYW1ldGVyc0l0ZW0sIFNlcnZpY2U+KFxuICAgICAgICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICh0aGlzLmRhdGFQcm92aWRlckV4ZWN1dG9yLmdldERhdGFQcm92aWRlclNlcnZpY2UodGhpcy5pbmplY3RvciwgY3R4RGF0YVByb3ZpZGVyLmRhdGFQcm92aWRlcikgPz8gdW5kZWZpbmVkKSBhcyBTZXJ2aWNlLFxuICAgICAgICAgICAgY3R4RGF0YVByb3ZpZGVyLmRhdGFQcm92aWRlcixcbiAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lciA/PyB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgY3R4LmRhdGFQcm92aWRlclNvdXJjZSA9IGN0eERhdGFQcm92aWRlci5zb3VyY2U7XG4gICAgICAgIGN0eC5wcmV2aW91c0FjdGlvbkluc3RhbmNlID0gcHJldmlvdXNBY3Rpb25JbnN0YW5jZTtcbiAgICAgICAgaW5zdGFuY2UubmV3Q29udGV4dChjdHgpO1xuICAgICAgICByZXR1cm4gY3R4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgYWN0aW9uJ3MgbWFpbiBydW4gZnVuY3Rpb24gYnkgY3JlYXRpbmcgbmV3IGFjdGlvbiBjb250ZXh0IGZvciBhY3Rpb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFjdGlvbiBwYXJhbWV0ZXJzIGZvciBjb250ZXh0IHJ1bi5cbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgT3B0aW9uYWwgZXhpc3RpbmcgYWN0aW9uIGluc3RhbmNlIChpZiBub24gcHJvdmlkZWQsIG5ldyB3aWxsIGJlIGNyZWF0ZWQpLlxuICAgICAqIEBwYXJhbSBwcmV2aW91c0FjdGlvbkluc3RhbmNlIE9wdGlvbmFsIHByZXZpb3VzIGFjdGlvbiBpbnN0YW5jZSB0byBsaW5rIGluIG5leHQgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBY3Rpb24gY29udGV4dCBmb3IgcnVuIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgcHJlcGFyZUNvbnRleHQ8SXRlbSwgUGFyYW1ldGVyc0l0ZW0sIFNlcnZpY2U+KFxuICAgICAgICBhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3JJbnN0PEl0ZW0sIFNlcnZpY2UsIFBhcmFtZXRlcnNJdGVtLCBhbnksIGFueT4sXG4gICAgICAgIHBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcnM8UGFyYW1ldGVyc0l0ZW0+LFxuICAgICAgICBpbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+LFxuICAgICAgICBwcmV2aW91c0FjdGlvbkluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8YW55LCBhbnk+XG4gICAgKTogQWN0aW9uQ29udGV4dDxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZT4ge1xuICAgICAgICBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JDcmVhdGVJbnN0YW5jZTxJdGVtLCBTZXJ2aWNlPihpbnN0YW5jZSwgYWN0aW9uLCBwYXJhbWV0ZXJzLCBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5BY3RpdmF0aW9uRW5kKTtcblxuICAgICAgICBjb25zdCBjdHhEYXRhUHJvdmlkZXIgPSBhY3Rpb25FeGVjdXRpb25TZWxlY3REYXRhUHJvdmlkZXI8SXRlbSwgU2VydmljZT4oYWN0aW9uLCB1bmRlZmluZWQsIHRoaXMudmlld0NvbnRhaW5lcik7XG4gICAgICAgIGNvbnN0IGN0eCA9IG5ldyBBY3Rpb25Db250ZXh0PEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPihcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IsXG4gICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgICAncnVuJyxcbiAgICAgICAgICAgICh0aGlzLmRhdGFQcm92aWRlckV4ZWN1dG9yLmdldERhdGFQcm92aWRlclNlcnZpY2UodGhpcy5pbmplY3RvciwgY3R4RGF0YVByb3ZpZGVyLmRhdGFQcm92aWRlcikgPz8gdW5kZWZpbmVkKSBhcyBTZXJ2aWNlLFxuICAgICAgICAgICAgY3R4RGF0YVByb3ZpZGVyLmRhdGFQcm92aWRlcixcbiAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lciA/PyB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgY3R4LmRhdGFQcm92aWRlclNvdXJjZSA9IGN0eERhdGFQcm92aWRlci5zb3VyY2U7XG4gICAgICAgIGN0eC5wcmV2aW91c0FjdGlvbkluc3RhbmNlID0gcHJldmlvdXNBY3Rpb25JbnN0YW5jZTtcbiAgICAgICAgaW5zdGFuY2UubmV3Q29udGV4dChjdHgpO1xuXG4gICAgICAgIHJldHVybiBjdHg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIGFjdGlvbiAoaW4gY2FzZSBvZiBkaWFsb2csIGRpYWxvZyB3aWxsIGJlIG9wZW5lZCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFjdGlvbiBwYXJhbWV0ZXJzIGZvciBhY3RpdmF0aW9uIG9mIGFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgT3B0aW9uYWwgZXhpc3RpbmcgYWN0aW9uIGluc3RhbmNlIChpZiBub24gcHJvdmlkZWQsIG5ldyB3aWxsIGJlIGNyZWF0ZWQpLlxuICAgICAqIEBwYXJhbSBwcmV2aW91c0FjdGlvbkluc3RhbmNlIE9wdGlvbmFsIHByZXZpb3VzIGFjdGlvbiBpbnN0YW5jZSB0byBsaW5rIGluIG5leHQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHJ1bkNvbnRleHQgTWFya3MgaWYgY29udGV4dCBzaG91bGQgYmUgcnVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQWN0aW9uIGluc3RhbmNlIC0gaWYgbm9uIHByb3ZpZGVkIGluIHBhcmFtZXRlcnMsIHRoZSBuZXdseSBjcmVhdGVkIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICovXG4gICAgcHVibGljIGFjdGl2YXRlQWN0aW9uPEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlID0gdW5kZWZpbmVkPihcbiAgICAgICAgYWN0aW9uOiBBY3Rpb25EZXNjcmlwdG9ySW5zdDxJdGVtLCBhbnksIFBhcmFtZXRlcnNJdGVtLCBhbnksIGFueT4sXG4gICAgICAgIHBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcnM8UGFyYW1ldGVyc0l0ZW0+LFxuICAgICAgICBpbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+LFxuICAgICAgICBwcmV2aW91c0FjdGlvbkluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8YW55LCBhbnk+LFxuICAgICAgICBydW5Db250ZXh0ID0gZmFsc2VcbiAgICApOiBBY3Rpb25JbnN0YW5jZTxJdGVtLCBTZXJ2aWNlPiB7XG4gICAgICAgIGluc3RhbmNlID0gdGhpcy5nZXRPckNyZWF0ZUluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+KGluc3RhbmNlLCBhY3Rpb24sIHBhcmFtZXRlcnMsIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkFjdGl2YXRpb25TdGFydCk7XG4gICAgICAgIGluc3RhbmNlLnN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uQWN0aXZhdGlvblN0YXJ0O1xuICAgICAgICBpbnN0YW5jZS5hY3RpdmF0aW9uUGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIC8vIHN0YXJ0IGFjdGl2YXRpb24gaW5zdGFuY2VcbiAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlRW51bS5FZGl0b3IpIHtcbiAgICAgICAgICAgIGxldCBkaWFsb2dDb21wb25lbnQgPSB0aGlzLmRlZmF1bHRFZGl0b3JEaWFsb2dDb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCBkaWFsb2dDbGFzc05hbWVzID0gWydtbmctZGlhbG9nJ107XG4gICAgICAgICAgICBjb25zdCBkaWFsb2dDb25maWc6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgZHVwbGljYXRlOiB0cnVlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoYWN0aW9uIGluc3RhbmNlb2YgQWN0aW9uRWRpdG9yRGVzY3JpcHRvckluc3QpIHtcbiAgICAgICAgICAgICAgICBkaWFsb2dDbGFzc05hbWVzLnB1c2goYWN0aW9uLmRpYWxvZ0NsYXNzTmFtZSA/PyAnbW5nLWFjdGlvbi1lZGl0b3ItZGlhbG9nJyk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24uZGlhbG9nU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFN0eWxlU2l6ZUVudW0uRXh0cmFTbWFsbDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZ0NsYXNzTmFtZXMucHVzaCgnbW5nLWRpYWxvZy14cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU3R5bGVTaXplRW51bS5TbWFsbDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZ0NsYXNzTmFtZXMucHVzaCgnbW5nLWRpYWxvZy1zbScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU3R5bGVTaXplRW51bS5MYXJnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZ0NsYXNzTmFtZXMucHVzaCgnbW5nLWRpYWxvZy1sZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU3R5bGVTaXplRW51bS5FeHRyYUxhcmdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nQ2xhc3NOYW1lcy5wdXNoKCdtbmctZGlhbG9nLXhsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHlsZVNpemVFbnVtLk5vcm1hbDpcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmVkaXRvckNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBkaWFsb2dDb21wb25lbnQgPSBhY3Rpb24uZWRpdG9yQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkaWFsb2dDb25maWcuZGF0YSA9IDxBY3Rpb25FZGl0b3JEaWFsb2dEYXRhPEl0ZW0sIFNlcnZpY2U+PntcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yOiBhY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0luc3RhbmNlOiBwcmV2aW91c0FjdGlvbkluc3RhbmNlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGluamVjdG9yOiB0aGlzLmluamVjdG9yXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGlhbG9nQ29uZmlnLnN0eWxlQ2xhc3MgPSBkaWFsb2dDbGFzc05hbWVzLmpvaW4oJyAnKTtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbi5hY3RpdmF0aW9uVHJpZ2dlciA9PT0gQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtLk9uUm91dGUpIHtcbiAgICAgICAgICAgICAgICBkaWFsb2dDb25maWcuY2xvc2FibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBkaWFsb2dDb25maWcuY2xvc2VPbkVzY2FwZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihkaWFsb2dDb21wb25lbnQsIGRpYWxvZ0NvbmZpZyk7XG4gICAgICAgICAgICBkaWFsb2dSZWYub25DbG9zZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdG8gY2xvc2UgZGlhbG9nIG9uICdYJyBjbGljayBvciBlc2MgYnV0dG9uXG4gICAgICAgICAgICAgICAgdGhpcy5maW5pc2hBY3Rpb24oaW5zdGFuY2UhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5zdGFuY2UuYWN0aXZhdGlvbkRpYWxvZ1JlZiA9IGRpYWxvZ1JlZjtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRpcmVjdGx5IGV4ZWN1dGUgYWN0aW9uXG4gICAgICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkFjdGl2YXRpb25FbmQ7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wcmVwYXJlQ29udGV4dDxJdGVtLCBhbnksIFNlcnZpY2U+KGFjdGlvbiwgcGFyYW1ldGVycywgaW5zdGFuY2UsIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICBpZiAocnVuQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIHRoaXMucnVuKGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5pbnN0YW5jZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvIGJlIGNhbGxlZCB3aGVuIGFjdGlvbiBlZGl0b3IgaXMgaW5pdGlhbGl6ZWQgdG8gY29ycmVjdGx5IGFjdGl2YXRlIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBBY3Rpb24gaW5zdGFuY2UgKGlmIGF2YWlsYWJsZSkuXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFJlZiBPcHRpb25hbCBhY3Rpb24gZWRpdG9yIGNvbXBvbmVudCByZWZlcmVuY2UuXG4gICAgICovXG4gICAgcHVibGljIG9uQWN0aW9uRWRpdG9ySW5pdDxULCBTPihhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3JJbnN0PFQ+LCBpbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPFQsIFM+LCBjb21wb25lbnRSZWY/OiBJQWN0aW9uRWRpdG9yQ29tcG9uZW50KTogQWN0aW9uSW5zdGFuY2U8VCwgUz4ge1xuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgIT09IEFjdGlvblR5cGVFbnVtLkVkaXRvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBY3Rpb24gJHthY3Rpb24uYWN0aW9uTmFtZX0gaXMgbm90IG9mIHR5cGUgZWRpdG9yLCBjYW5ub3QgYmUgYWN0aXZhdGVkIHRocm91Z2ggXCJvbkFjdGlvbkVkaXRvck9uSW5pdFwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluc3RhbmNlICYmIGFjdGlvbi5hY3RpdmF0aW9uVHJpZ2dlciA9PT0gQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtLk9uUm91dGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJlZEluc3RhbmNlID0gdGhpcy52aWV3Q29udGFpbmVyPy5yb3V0ZVRyaWdnZXJlZEFjdGlvbkluc3RhbmNlKCk7XG4gICAgICAgICAgICBpZiAodHJpZ2dlcmVkSW5zdGFuY2UgJiYgdHJpZ2dlcmVkSW5zdGFuY2UuaW5zdGFuY2VMb25nTmFtZSAhPT0gaW5zdGFuY2UuaW5zdGFuY2VMb25nTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICBgV0FSTklORzogRm91bmQgdHJpZ2dlcmVkIHBhcmFtZXRlcnMgdmlldyBjb250YWluZXIgaW5zdGFuY2UgJHt0cmlnZ2VyZWRJbnN0YW5jZS5pbnN0YW5jZUxvbmdOYW1lfSBhbmQgaXQgZG9lcyBub3QgbWF0Y2ggaW5zdGFuY2UgJHtpbnN0YW5jZS5pbnN0YW5jZUxvbmdOYW1lfSByZXRyaWV2ZWQgb24gZWRpdG9yIGluaXQuYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UgPSB0aGlzLmdldE9yQ3JlYXRlSW5zdGFuY2UoaW5zdGFuY2UsIGFjdGlvbiwgdW5kZWZpbmVkLCBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5BY3RpdmF0aW9uU3RhcnQpO1xuICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkFjdGl2YXRpb25FbmQ7XG4gICAgICAgIGluc3RhbmNlLmFjdGl2YXRpb25FZGl0b3JDb21wb25lbnRSZWYgPSBjb21wb25lbnRSZWY7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvIGJlIGNhbGxlZCB3aGVuIGFjdGlvbiBlZGl0b3IgY21wIGlzIGJlaW5nIGRlc3Ryb3llZCB0byBjb3JyZWN0bHkgZmluaXNoIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgQWN0aW9uIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkFjdGlvbkRlc3Ryb3k8VCwgUz4oaW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTxULCBTPik6IHZvaWQge1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UgPSB0aGlzLmdldE9yQ3JlYXRlSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICBpZiAoaW5zdGFuY2UuYWN0aW9uLmFjdGl2YXRpb25UcmlnZ2VyICE9PSBBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0uT25DbGljaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluaXNoQWN0aW9uKGluc3RhbmNlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUbyBiZSBjYWxsZWQgd2hlbiBhY3Rpb24gZWRpdG9yIGNtcCBpcyBiZWluZyBkZXN0cm95ZWQgdG8gY29ycmVjdGx5IGZpbmlzaCBhY3Rpb24uXG4gICAgICogQHBhcmFtIGluc3RhbmNlIEFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25BY3Rpb25FZGl0b3JEZXN0cm95PFQsIFM+KGluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8VCwgUz4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlID0gdGhpcy5nZXRPckNyZWF0ZUluc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgaWYgKGluc3RhbmNlLmFjdGlvbi50eXBlICE9PSBBY3Rpb25UeXBlRW51bS5FZGl0b3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQWN0aW9uIGluc3RhbmNlICR7aW5zdGFuY2UuaW5zdGFuY2VMb25nTmFtZX0gaXMgbm90IG9mIHR5cGUgZWRpdG9yLCBjYW5ub3QgYmUgZGVhY3RpdmF0ZWQgdGhyb3VnaCBcIm9uQWN0aW9uRWRpdG9yT25EZXN0cm95XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5zdGFuY2UuYWN0aW9uLmFjdGl2YXRpb25UcmlnZ2VyICE9PSBBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0uT25Sb3V0ZSkge1xuICAgICAgICAgICAgdGhpcy5maW5pc2hBY3Rpb24oaW5zdGFuY2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG8gYmUgY2FsbGVkIHdoZW4gYWN0aW9uIHJvdXRlIGNtcCBpcyBiZWluZyBkZXN0cm95ZWQgdG8gY29ycmVjdGx5IGZpbmlzaCBhY3Rpb24uXG4gICAgICogQHBhcmFtIGluc3RhbmNlIEFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25BY3Rpb25Sb3V0ZURlc3Ryb3k8VCwgUz4oaW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTxULCBTPik6IHZvaWQge1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UgPSB0aGlzLmdldE9yQ3JlYXRlSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICBpZiAoaW5zdGFuY2UuYWN0aW9uLmFjdGl2YXRpb25UcmlnZ2VyICE9PSBBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0uT25Sb3V0ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBY3Rpb24gaW5zdGFuY2UgJHtpbnN0YW5jZS5pbnN0YW5jZUxvbmdOYW1lfSBpcyBub3QgdHJpZ2dlcmVkIG9uIHJvdXRlLCBjYW5ub3QgYmUgZGVhY3RpdmF0ZWQgdGhyb3VnaCBcIm9uQWN0aW9uUm91dGVPbkRlc3Ryb3lcImApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluaXNoQWN0aW9uKGluc3RhbmNlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWFjdGl2YXRlcyBhY3Rpb24gYnkgY2hvb3NpbmcgZmluYWwgc3RhdGUsIGNsb3NpbmcgZGlhbG9nIGFuZCBjb21wbGV0aW5nIGFsbCBzdWJqZWN0cyBpbiBpbnN0YW5jZSBhbmQgY29udGV4dHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgQWN0aW9uIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBvbkRlc3Ryb3kgTWFya3MgaWYgZmluaXNoIGlzIGNhbGxlZCBvbiBjb21wb25lbnQgZGVzdHJveSBsaWZlY3ljbGUgaG9vay5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmluaXNoQWN0aW9uPEl0ZW0sIFNlcnZpY2UgPSB1bmRlZmluZWQ+KGluc3RhbmNlOiBBY3Rpb25JbnN0YW5jZTxJdGVtLCBTZXJ2aWNlPiwgb25EZXN0cm95ID0gZmFsc2UpIHtcbiAgICAgICAgaW5zdGFuY2UgPSB0aGlzLmdldE9yQ3JlYXRlSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgPj0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoU3VjY2Vzc0ZpbmFsKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShgQWN0aW9uSW5zdGFuY2UgJHtpbnN0YW5jZS5pbnN0YW5jZUxvbmdOYW1lfSBhbHJlYWR5IGZpbmlzaGVkYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmluYWxTdGF0ZTogQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW07XG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UucmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZmluYWxTdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaFN1Y2Nlc3NGaW5hbDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuZXJyb3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBmaW5hbFN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoRXJyb3JGaW5hbDtcbiAgICAgICAgfSBlbHNlIGlmIChvbkRlc3Ryb3kpIHtcbiAgICAgICAgICAgIGZpbmFsU3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hDb21wb25lbnREZXN0cm95RmluYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW5hbFN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoRGlzbWlzc2VkRmluYWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5zdGFuY2UuYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVFbnVtLkVkaXRvcikge1xuICAgICAgICAgICAgY29uc3QgaGFzRGlhbG9nID0gdHlwZW9mIGluc3RhbmNlLmFjdGl2YXRpb25EaWFsb2dSZWYgIT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgY29uc3QgcmVzdWJtaXRFbmFibGVkID0gKGluc3RhbmNlLmFjdGlvbiBhcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9ySW5zdDxJdGVtPikucmVzdWJtaXRFbmFibGVkO1xuXG4gICAgICAgICAgICBpZiAoZmluYWxTdGF0ZSA9PT0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoU3VjY2Vzc0ZpbmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKChoYXNEaWFsb2cgJiYgcmVzdWJtaXRFbmFibGVkID09PSB0cnVlKSB8fCAoIWhhc0RpYWxvZyAmJiByZXN1Ym1pdEVuYWJsZWQgIT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbFN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoU3VjY2Vzc1JlYWN0aXZhdGVGaW5hbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChoYXNEaWFsb2cgJiYgZmluYWxTdGF0ZSAhPT0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoU3VjY2Vzc1JlYWN0aXZhdGVGaW5hbCkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHN0YXRlIGlzIGZpbmlzaCBhbmQgbm90IGNhbGxlZCBmcm9tIGRpYWxvZyBsaXN0ZW5lciwgY2xvc2UgdGhlIGRpYWxvZyBmaXJzdCB3aGljaCB3aWxsIHJldHJpZ2dlciB0aGlzIGZ1bmN0aW9uLCB0aGVuIGZpbmlzaCBpdFxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmFjdGl2YXRpb25EaWFsb2dSZWYhLmNsb3NlKGluc3RhbmNlLnJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1bnNldCBpbnN0YW5jZSBpbiB2aWV3IGNvbnRhaW5lclxuICAgICAgICBpZiAodGhpcy52aWV3Q29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXIucm91dGVUcmlnZ2VyZWRBY3Rpb25JbnN0YW5jZS5zZXQodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCBmaW5hbCBzdGF0ZSBvbiBpbnN0YW5jZVxuICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IGZpbmFsU3RhdGU7XG5cbiAgICAgICAgaWYgKGZpbmFsU3RhdGUgPT09IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaFN1Y2Nlc3NSZWFjdGl2YXRlRmluYWwpIHtcbiAgICAgICAgICAgIC8vIHByZXBhcmUgcmVhY3RpdmF0aW9uIGluc3RhbmNlXG4gICAgICAgICAgICBjb25zdCBuZXdJbnN0YW5jZVN0YXR1cyA9IChpbnN0YW5jZS5hY3Rpb24gYXMgQWN0aW9uRWRpdG9yRGVzY3JpcHRvckluc3Q8SXRlbT4pLnJlc3VibWl0UmVmZXRjaFxuICAgICAgICAgICAgICAgID8gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uQWN0aXZhdGlvbkVuZFxuICAgICAgICAgICAgICAgIDogQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmV0Y2hFbmQ7XG4gICAgICAgICAgICAvLyBtdXN0IHNraXAgaW5pdGlhbGl6YXRpb24gZnJvbSB2aWV3IGNvbnRhaW5lciwgYmVjYXVzZSBpdCB3b3VsZCBvbmx5IGdldCBvbGQgaW5zdGFuY2UuXG4gICAgICAgICAgICAvLyB3ZSBuZWVkIG5ldyBpbnN0YW5jZSBiZWZvcmUgd2UgY2FuIHNldCBuZXcgb25lIG9uIHRoZSB2aWV3IGNvbnRhaW5lci5cbiAgICAgICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gdGhpcy5nZXRPckNyZWF0ZUluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+KHVuZGVmaW5lZCwgaW5zdGFuY2UuYWN0aW9uLCB1bmRlZmluZWQsIG5ld0luc3RhbmNlU3RhdHVzLCB0cnVlKTtcbiAgICAgICAgICAgIG5ld0luc3RhbmNlLnJlYWN0aXZhdGlvblByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgIC8vIGNvcHkgc29tZSBhZGRpdGlvbmFsIHNldHRpbmdzXG4gICAgICAgICAgICBuZXdJbnN0YW5jZS5hY3RpdmF0aW9uRGlhbG9nUmVmID0gaW5zdGFuY2UuYWN0aXZhdGlvbkRpYWxvZ1JlZjtcbiAgICAgICAgICAgIG5ld0luc3RhbmNlLnRyaWdnZXJQYXJhbWV0ZXJzID0gaW5zdGFuY2UudHJpZ2dlclBhcmFtZXRlcnM7XG4gICAgICAgICAgICBuZXdJbnN0YW5jZS5hY3RpdmF0aW9uUGFyYW1ldGVycyA9IGluc3RhbmNlLmFjdGl2YXRpb25QYXJhbWV0ZXJzO1xuXG4gICAgICAgICAgICBpZiAodGhpcy52aWV3Q29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLnJvdXRlVHJpZ2dlcmVkQWN0aW9uSW5zdGFuY2Uuc2V0KG5ld0luc3RhbmNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2UucmVhY3RpdmF0aW9uSW5zdGFuY2UgPSBuZXdJbnN0YW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpbmlzaCByZWxhdGVkIGFjdGlvbnNcbiAgICAgICAgaWYgKGluc3RhbmNlLm5leHRBY3Rpb25JbnN0YW5jZSAmJiBpbnN0YW5jZS5uZXh0QWN0aW9uSW5zdGFuY2UgaW5zdGFuY2VvZiBBY3Rpb25JbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEZpbmlzaGluZyBpbnN0YW5jZSAke2luc3RhbmNlLmluc3RhbmNlTG9uZ05hbWV9IHJlbGF0ZWQgbmV4dCBhY3Rpb24gaW5zdGFuY2U6ICR7aW5zdGFuY2UubmV4dEFjdGlvbkluc3RhbmNlLmluc3RhbmNlTG9uZ05hbWV9YCk7XG4gICAgICAgICAgICB0aGlzLmZpbmlzaEFjdGlvbihpbnN0YW5jZS5uZXh0QWN0aW9uSW5zdGFuY2UsIG9uRGVzdHJveSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluc3RhbmNlLmVycm9yQWN0aW9uSW5zdGFuY2UgJiYgaW5zdGFuY2UuZXJyb3JBY3Rpb25JbnN0YW5jZSBpbnN0YW5jZW9mIEFjdGlvbkluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRmluaXNoaW5nIGluc3RhbmNlICR7aW5zdGFuY2UuaW5zdGFuY2VMb25nTmFtZX0gcmVsYXRlZCBlcnJvciBhY3Rpb24gaW5zdGFuY2U6ICR7aW5zdGFuY2UuZXJyb3JBY3Rpb25JbnN0YW5jZS5pbnN0YW5jZUxvbmdOYW1lfWApO1xuICAgICAgICAgICAgdGhpcy5maW5pc2hBY3Rpb24oaW5zdGFuY2UuZXJyb3JBY3Rpb25JbnN0YW5jZSwgb25EZXN0cm95KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJzIGFjdGlvbiB3aXRoIHBhcmFtZXRlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFjdGlvbiBwYXJhbWV0ZXJzIGZvciBhY3Rpb24gZXhlY3V0aW9uIHRvIGNvbnN0cnVjdCBuZXcgcm91dGUuXG4gICAgICogQHBhcmFtIHJ1bkNvbnRleHQgTWFya3MgaWYgY29udGV4dCBzaG91bGQgYmUgcnVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQWN0aW9uIGluc3RhbmNlIC0gaWYgbm9uIHByb3ZpZGVkIGluIHBhcmFtZXRlcnMsIHRoZSBuZXdseSBjcmVhdGVkIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICovXG4gICAgcHVibGljIHRyaWdnZXJBY3Rpb248SXRlbSwgU2VydmljZSA9IHVuZGVmaW5lZD4oYWN0aW9uOiBBY3Rpb25EZXNjcmlwdG9ySW5zdDxJdGVtPiwgcGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyczxJdGVtPiwgcnVuQ29udGV4dCA9IGZhbHNlKTogQWN0aW9uSW5zdGFuY2U8SXRlbSwgU2VydmljZT4ge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JDcmVhdGVJbnN0YW5jZTxJdGVtLCBTZXJ2aWNlPih1bmRlZmluZWQsIGFjdGlvbiwgcGFyYW1ldGVycyk7XG4gICAgICAgIGluc3RhbmNlLnRyaWdnZXJQYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5UcmlnZ2VyU3RhcnQ7XG4gICAgICAgIGlmIChhY3Rpb24uYWN0aXZhdGlvblRyaWdnZXIgPT09IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PblJvdXRlKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCc/JylbMF07XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmw6IFVybFRyZWUgPSB0aGlzLnJvdXRlci5wYXJzZVVybCh0aGlzLnJvdXRlci51cmwpO1xuICAgICAgICAgICAgbGV0IGFjdGlvblVybCA9IGFjdGlvbi5yb3V0ZVVybCA/PyAnJztcbiAgICAgICAgICAgIGlmIChhY3Rpb25Vcmwuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uVXJsID0gYWN0aW9uVXJsLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYWN0aW9uVXJsU2VnbWVudHMgPSB0aGlzLnBhcmFtZXRyaXplLnRyYW5zZm9ybShhY3Rpb25VcmwsIHBhcmFtZXRlcnMuaXRlbUlkLCBwYXJhbWV0ZXJzLml0ZW0sIHBhcmFtZXRlcnMuYWN0aW9uRGF0YSkuc3BsaXQoJy8nKTtcblxuICAgICAgICAgICAgLy8gc2V0IGluc3RhbmNlIGluIHZpZXcgY29udGFpbmVyXG4gICAgICAgICAgICBpZiAodGhpcy52aWV3Q29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLnJvdXRlVHJpZ2dlcmVkQWN0aW9uSW5zdGFuY2Uuc2V0KGluc3RhbmNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnJvbSh0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYmFzZVVybCwgLi4uYWN0aW9uVXJsU2VnbWVudHNdLCB7cmVsYXRpdmVUbzogcGFyYW1ldGVycy5yb3V0ZSwgcXVlcnlQYXJhbXM6IHBhcnNlZFVybC5xdWVyeVBhcmFtc30pKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiAoaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5UcmlnZ2VyRW5kKSk7XG5cbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluc3RhbmNlLnN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uVHJpZ2dlckVuZDtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVBY3Rpb24oYWN0aW9uLCBwYXJhbWV0ZXJzLCBpbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIGlmIChydW5Db250ZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW4oY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWFjdGl2YXRlcyBvbiByb3V0ZSB0cmlnZ2VyZWQgYWN0aW9uIGJ5IHRyeWluZyB0byByZXJvdXRlIGJhY2sgdG8gbG9jYXRpb24gd2hlcmUgYWN0aW9uIHdhcyB0cmlnZ2VyZWQuXG4gICAgICogQHBhcmFtIGluc3RhbmNlIEFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmluaXNoQWN0aW9uUm91dGVVbnRyaWdnZXI8SXRlbSwgU2VydmljZSA9IHVuZGVmaW5lZD4oaW5zdGFuY2U6IEFjdGlvbkluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+KSB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5hY3Rpb24uYWN0aXZhdGlvblRyaWdnZXIgIT09IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PblJvdXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JDcmVhdGVJbnN0YW5jZTxJdGVtLCBTZXJ2aWNlPihpbnN0YW5jZSk7XG5cbiAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hSb3V0ZVVudHJpZ2dlclN0YXJ0O1xuXG4gICAgICAgIGxldCB1cmwgPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRMb2NhdGlvbkZyb21IaXN0b3J5KCkgPz8gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRDdXJyZW50TG9jYXRpb25Gcm9tVXJsKCk7XG4gICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmJhY2soKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3BsaXRVcmxRdWVyeVBhcmFtID0gdXJsLnNwbGl0KCc/Jyk7XG4gICAgICAgICAgICBjb25zdCB1cmxQYXRoU2VnbWVudHMgPSBzcGxpdFVybFF1ZXJ5UGFyYW1bMF0uc3BsaXQoJyMnKVswXS5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbSA9IHNwbGl0VXJsUXVlcnlQYXJhbVsxXT8uc3BsaXQoJyMnKVswXTtcblxuICAgICAgICAgICAgbGV0IGFjdGlvblVybCA9IGluc3RhbmNlLmFjdGlvbj8ucm91dGVVcmwgPz8gJyc7XG4gICAgICAgICAgICBpZiAoYWN0aW9uVXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgIGFjdGlvblVybCA9IGFjdGlvblVybC5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25VcmxTZWdtZW50cyA9IGFjdGlvblVybC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgbGV0IHJlZGlyZWN0VXJsID0gJy8nICsgdXJsUGF0aFNlZ21lbnRzLnNsaWNlKDAsIHVybFBhdGhTZWdtZW50cy5sZW5ndGggLSBhY3Rpb25VcmxTZWdtZW50cy5sZW5ndGgpLmpvaW4oJy8nKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcXVlcnlQYXJhbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVybCA9IGAke3JlZGlyZWN0VXJsfT8ke3F1ZXJ5UGFyYW19YDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTm8gVVJMIHJlcGxhY2VzLCBwcm9iYWJseSBvaywgdG8gYWxsb3cgZ29pbmcgYmFja1xuICAgICAgICAgICAgZnJvbSh0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHJlZGlyZWN0VXJsKSlcbiAgICAgICAgICAgICAgICAucGlwZShmaXJzdCgpLCB0aW1lb3V0KDEwMDApKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiAoKSA9PiAoaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hSb3V0ZVVudHJpZ2dlckVuZEZpbmFsKSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IChpbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaFJvdXRlVW50cmlnZ2VyVGltZW91dEZpbmFsKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGVycm9yIG9mIGFueSB0eXBlIHRvIGVycm9yIGJ5IHVzaW5nIGVycm9yIG1hcHBlciB0aGF0IGNvdWxkIGJlIHByb3ZpZGVkIGJ5IGZpbmFsIHByb2plY3QuXG4gICAgICogQHBhcmFtIGVycm9yIGVycm9yIG9mIGFueSB0eXBlLlxuICAgICAqIEBwYXJhbSBjb250ZXh0IEFjdGlvbiBjb250ZXh0LlxuICAgICAqXG4gICAgICogQHJldHVybnMgbWFwcGVkIElDb21tb25zRXJyb3IuXG4gICAgICovXG4gICAgcHVibGljIHRvQWN0aW9uRXJyb3IoZXJyb3I/OiBhbnksIGNvbnRleHQ/OiBBY3Rpb25Db250ZXh0PGFueSwgYW55LCBhbnk+KTogSUNvbW1vbnNFcnJvciB7XG4gICAgICAgIGxldCBjb21tb25zRXJyb3I6IElDb21tb25zRXJyb3I7XG4gICAgICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zOiBDb21tb25zQWN0aW9uRXJyb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogdGhpcy5yb3V0ZXIudXJsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmh0dHBFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21tb25zRXJyb3IgPSBuZXcgQ29tbW9uc0FjdGlvbkVycm9yKGVycm9yPy5tZXNzYWdlID8/ICdVbmtub3duIGVycm9yJywgY29udGV4dC5jb250ZXh0TG9uZ05hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIC8vIHNob3VsZCBub3QgcmVhbGx5IGhhcHBlbiAoc2hvdWxkIGFsd2F5cyBiZSB3cmFwcGVkIGluIE1uZ0FjdGlvbkVycm9yKSwganVzdCBpbiBjYXNlXG4gICAgICAgICAgICBjb21tb25zRXJyb3IgPSBuZXcgQ29tbW9uc0h0dHBFcnJvcihgSHR0cCBFcnJvciBvY2N1cnJlZCBpbiBhY3Rpb25gLCBlcnJvciwge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiB0aGlzLnJvdXRlci51cmxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm90IGZyb20gYWN0aW9uLCBzbyB1bmtub3duIHNvdXJjZSBvZiBlcnJvclxuICAgICAgICAgICAgY29tbW9uc0Vycm9yID0gbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGVycm9yPy5tZXNzYWdlID8/ICdVbmtub3duIGVycm9yJywge1xuICAgICAgICAgICAgICAgIG5hbWU6IGVycm9yPy5uYW1lID8/ICdVbmtub3duRXJyb3InLFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiB0aGlzLnJvdXRlci51cmwsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGp1c3QgdHJhY2UgaXQsIGFsbG93IHVzZXIgdG8gc2V0IGlmIHRoaXMgaXMgZXJyb3Igb3Igbm90XG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKGNvbW1vbnNFcnJvcik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JNYXBwZXIudG9Db21tb25zRXJyb3IoZXJyb3IsIGNvbW1vbnNFcnJvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIGV4aXN0aW5nIGFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgQWN0aW9uIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGluc3RhbmNlSW5pdGlhbFN0YXR1cyBBY3Rpb24gaW5zdGFuY2UgaW5pdGlhbCBzdGF0dXMuXG4gICAgICogQHBhcmFtIHNraXBJbml0aWFsaXphdGlvbkZyb21WaWV3Q29udGFpbmVyIElmIGluaXRpYWxpemF0aW9uIG9mIGluc3RhbmNlIGZyb20gdmlldyBjb250YWluZXIgc2hvdWxkIGJlIHNraXBwZWQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0T3JDcmVhdGVJbnN0YW5jZTxJdGVtLCBTZXJ2aWNlID0gdW5kZWZpbmVkPihcbiAgICAgICAgaW5zdGFuY2U6IEFjdGlvbkluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+IHwgdW5kZWZpbmVkLFxuICAgICAgICBhY3Rpb24/OiBBY3Rpb25EZXNjcmlwdG9ySW5zdDxJdGVtLCBTZXJ2aWNlLCBhbnksIGFueSwgYW55PixcbiAgICAgICAgcGFyYW1ldGVycz86IEFjdGlvblBhcmFtZXRlcnM8YW55PixcbiAgICAgICAgaW5zdGFuY2VJbml0aWFsU3RhdHVzPzogQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0sXG4gICAgICAgIHNraXBJbml0aWFsaXphdGlvbkZyb21WaWV3Q29udGFpbmVyID0gZmFsc2VcbiAgICApOiBBY3Rpb25JbnN0YW5jZTxJdGVtLCBTZXJ2aWNlPiB7XG4gICAgICAgIGlmICghc2tpcEluaXRpYWxpemF0aW9uRnJvbVZpZXdDb250YWluZXIgJiYgIWluc3RhbmNlICYmIGFjdGlvbj8uYWN0aXZhdGlvblRyaWdnZXIgPT09IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PblJvdXRlICYmIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGluc3RhbmNlID0gdGhpcy52aWV3Q29udGFpbmVyPy5yb3V0ZVRyaWdnZXJlZEFjdGlvbkluc3RhbmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgaWYgKCFhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoJ0FjdGlvbiBkZXNjcmlwdG9yIGlzIG5vdCBwcm92aWRlZCwgaW5zdGFuY2UgY2Fubm90IGJlIGNyZWF0ZWQuJywge25hbWU6ICdBY3Rpb25FeGVjdXRvclNlcnZpY2VFcnJvcid9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgaW5zdGFuY2UgaWYgbm9uIHByb3ZpZGVkXG4gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBBY3Rpb25JbnN0YW5jZTxJdGVtLCBTZXJ2aWNlPihhY3Rpb24sIGluc3RhbmNlSW5pdGlhbFN0YXR1cyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWc/LmFjdGlvbnM/LmRlYnVnSW5zdGFuY2VzICYmICF0aGlzLmluc3RhbmNlcy5zb21lKGkgPT4gaS5pbnN0YW5jZUxvbmdOYW1lID09PSBpbnN0YW5jZSEuaW5zdGFuY2VMb25nTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlcy5sZW5ndGggPj0gdGhpcy5pbnN0YW5jZXNCdWZmZXJNYXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0SW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlcy5zaGlmdCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RJbnN0YW5jZSEuc3RhdGUgPCBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hTdWNjZXNzRmluYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEVSUk9SOiBOb3QgYWxsIGluc3RhbmNlcyBhcmUgZmluaXNoZWQhIEZpbmlzaGluZyBpbnN0YW5jZSAke2luc3RhbmNlLmluc3RhbmNlTG9uZ05hbWV9IHdpdGggZGlzbWlzc2FsLmApO1xuICAgICAgICAgICAgICAgICAgICBsYXN0SW5zdGFuY2UhLmZvcmNlRmluaXNoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlcy5wdXNoKGluc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG59XG4iXX0=
|