@mediusinc/mng-commons 5.0.0-rc.0 → 5.0.0-rc.2
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/data-list/data-list-params-helpers.d.ts +82 -0
- package/core/descriptors/action.descriptor.d.ts +3 -3
- package/core/descriptors/column.descriptor.d.ts +1 -1
- package/core/descriptors/editor.descriptor.d.ts +6 -6
- package/core/descriptors/enum.descriptor.d.ts +6 -0
- package/core/descriptors/filter.descriptor.d.ts +1 -1
- package/core/descriptors/model.descriptor.d.ts +1 -1
- package/core/descriptors/table.descriptor.d.ts +6 -6
- package/core/descriptors/tableview.descriptor.d.ts +10 -10
- package/core/enum/enum-helpers.d.ts +49 -0
- package/core/error/error-helpers.d.ts +114 -0
- package/core/helpers/date.d.ts +14 -0
- package/core/helpers/object.d.ts +27 -0
- package/core/helpers/route.d.ts +35 -0
- package/core/helpers/string.d.ts +7 -0
- package/core/helpers/templates.d.ts +3 -0
- package/core/i18n/i18n-common.d.ts +6 -0
- package/core/i18n/i18n-error.d.ts +4 -0
- package/core/i18n/i18n-type.d.ts +20 -0
- package/core/index.d.ts +15 -9
- package/{model → core}/pipes/enum.pipe.d.ts +2 -2
- package/core/pipes/enumerate.pipe.d.ts +3 -3
- package/{model → core}/pipes/i18n-property.pipe.d.ts +2 -2
- package/core/pipes/template.pipe.d.ts +0 -2
- package/core/router/route-builder.d.ts +151 -30
- package/core/router/routes-builder.d.ts +29 -15
- package/core/security/permission-helpers.d.ts +3 -0
- package/core/security/permissions.model.d.ts +2 -2
- package/esm2022/core/components/notification/notification-wrapper.component.mjs +4 -4
- package/esm2022/core/components/pages/error/error.page.component.mjs +3 -3
- package/esm2022/core/components/pages/not-found/not-found.page.component.mjs +3 -3
- package/esm2022/core/data-list/data-list-params-helpers.mjs +415 -0
- package/esm2022/core/data-list/filter-match.model.mjs +1 -1
- package/esm2022/core/data-providers/base.data-provider.mjs +1 -1
- package/esm2022/core/descriptors/action.descriptor.mjs +1 -1
- package/esm2022/core/descriptors/column.descriptor.mjs +1 -1
- package/esm2022/core/descriptors/editor.descriptor.mjs +1 -1
- package/esm2022/core/descriptors/enum.descriptor.mjs +2 -0
- package/esm2022/core/descriptors/filter.descriptor.mjs +1 -1
- package/esm2022/core/descriptors/model.descriptor.mjs +1 -1
- package/esm2022/core/descriptors/table.descriptor.mjs +1 -1
- package/esm2022/core/descriptors/tableview.descriptor.mjs +1 -1
- package/esm2022/core/directives/component.directive.mjs +4 -4
- package/esm2022/core/directives/dialog-keydown-handler.directive.mjs +4 -4
- package/esm2022/core/directives/template.directive.mjs +3 -3
- package/esm2022/core/enum/enum-helpers.mjs +81 -0
- package/esm2022/core/error/error-handler.mjs +3 -3
- package/esm2022/core/error/error-helpers.mjs +247 -0
- package/esm2022/core/helpers/coercion.mjs +1 -1
- package/esm2022/core/helpers/date.mjs +119 -0
- package/esm2022/core/helpers/object.mjs +145 -0
- package/esm2022/core/helpers/route.mjs +58 -0
- package/esm2022/core/helpers/string.mjs +57 -0
- package/esm2022/core/helpers/templates.mjs +4 -0
- package/esm2022/core/i18n/i18n-common.mjs +24 -0
- package/esm2022/core/i18n/i18n-error.mjs +27 -0
- package/esm2022/core/i18n/i18n-type.mjs +79 -0
- package/esm2022/core/index.mjs +17 -11
- package/esm2022/core/log/log-publisher-console.service.mjs +3 -3
- package/esm2022/core/log/logger.service.mjs +3 -3
- package/esm2022/core/pipes/boolean.pipe.mjs +4 -4
- package/esm2022/core/pipes/class-map.pipe.mjs +4 -4
- package/esm2022/core/pipes/enum.pipe.mjs +27 -0
- package/esm2022/core/pipes/enumerate-async.pipe.mjs +8 -8
- package/esm2022/core/pipes/enumerate.pipe.mjs +10 -10
- package/esm2022/core/pipes/getter.pipe.mjs +4 -4
- package/esm2022/core/pipes/i18n-property.pipe.mjs +19 -0
- package/esm2022/core/pipes/json-path.pipe.mjs +6 -6
- package/esm2022/core/pipes/parametrize.pipe.mjs +6 -6
- package/esm2022/core/pipes/template.pipe.mjs +7 -8
- package/esm2022/core/provide.mjs +1 -21
- package/esm2022/core/reflect/type-enum-metadata.mjs +1 -1
- package/esm2022/core/registry/type-registry.mjs +1 -1
- package/esm2022/core/router/route-builder.mjs +218 -107
- package/esm2022/core/router/routes-builder.mjs +42 -43
- package/esm2022/core/security/permission-helpers.mjs +14 -0
- package/esm2022/core/security/permission.guard.mjs +1 -1
- package/esm2022/core/security/permission.service.mjs +6 -6
- package/esm2022/core/security/permissions.model.mjs +1 -1
- package/esm2022/core/services/commons-configuration.service.mjs +6 -6
- package/esm2022/core/services/commons-init.service.mjs +4 -4
- package/esm2022/core/services/commons-router.service.mjs +4 -4
- package/esm2022/core/services/commons.service.mjs +4 -4
- package/esm2022/core/services/local-storage-config.service.mjs +4 -4
- package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +9 -10
- package/esm2022/filter/descriptors/filter.descriptor.mjs +1 -1
- package/esm2022/form/api/data-providers/lookup.data-provider.mjs +1 -1
- package/esm2022/form/api/descriptors/button-style.builder.mjs +1 -1
- package/esm2022/form/components/autocomplete/autocomplete.component.mjs +39 -45
- package/esm2022/form/components/date-range/date-range.component.mjs +4 -4
- package/esm2022/form/components/dropdown/dropdown.component.mjs +7 -7
- package/esm2022/form/directives/input-trim.directive.mjs +4 -4
- package/esm2022/model/descriptors/enum.descriptor.mjs +1 -1
- package/esm2022/model/descriptors/model.descriptor.mjs +4 -4
- package/esm2022/model/helpers/i18n.mjs +45 -0
- package/esm2022/model/helpers/model.mjs +71 -0
- package/esm2022/model/index.mjs +4 -7
- package/esm2022/table/api/data-providers/table.data-provider.mjs +1 -1
- package/esm2022/table/api/descriptors/column.descriptor.mjs +1 -1
- package/esm2022/table/api/descriptors/table.descriptor.mjs +36 -8
- package/esm2022/table/api/helpers/class-attribute-converter.mjs +1 -1
- package/esm2022/table/components/column-filter-full/column-filter-full.component.mjs +9 -9
- package/esm2022/table/components/column-value/column-value.component.mjs +12 -14
- package/esm2022/table/components/table/table.component.mjs +20 -37
- package/esm2022/table/helpers/notification.mjs +4 -4
- package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +4 -4
- package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +4 -4
- package/esm2022/table/services/data-list.service.mjs +3 -3
- package/esm2022/tableview/action/components/action/action.component.mjs +9 -9
- package/esm2022/tableview/action/components/editor/action-editor.component.mjs +4 -4
- package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +22 -21
- package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +3 -3
- package/esm2022/tableview/action/components/route/action-route.component.mjs +6 -5
- package/esm2022/tableview/action/components/table/action-table.component.mjs +12 -24
- package/esm2022/tableview/action/helpers/i18n.mjs +82 -0
- package/esm2022/tableview/action/helpers/notification.mjs +8 -8
- package/esm2022/tableview/action/helpers/styles.mjs +1 -1
- package/esm2022/tableview/action/models/execution/action-context.model.mjs +1 -1
- package/esm2022/tableview/action/models/execution/action-instance.model.mjs +1 -1
- package/esm2022/tableview/action/services/action-error-mapper.service.mjs +1 -1
- package/esm2022/tableview/action/services/action-executor.service.mjs +10 -9
- package/esm2022/tableview/action/services/component-action-executor.service.mjs +3 -3
- package/esm2022/tableview/action/services/data-provider-executor.service.mjs +3 -3
- package/esm2022/tableview/action/services/navigation.service.mjs +4 -4
- package/esm2022/tableview/action/services/providers/provide-view-container.mjs +1 -1
- package/esm2022/tableview/action/services/root-action-executor.service.mjs +3 -3
- package/esm2022/tableview/action/services/view-container.service.mjs +3 -3
- package/esm2022/tableview/api/action/descriptors/action-confirmation.descriptor.mjs +1 -1
- package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +9 -1
- package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +1 -1
- package/esm2022/tableview/api/action/helpers/data-provider-executors.mjs +1 -1
- package/esm2022/tableview/api/action/models/execution/action-instance.model.mjs +1 -1
- package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +1 -1
- package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +21 -32
- package/esm2022/tableview/api/editor/descriptors/field-action.descriptor.mjs +1 -1
- package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +3 -3
- package/esm2022/tableview/api/editor/descriptors/field-group.descriptor.mjs +3 -3
- package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +8 -8
- package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +1 -1
- package/esm2022/tableview/api/editor/descriptors/field-validation.descriptor.mjs +1 -1
- package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +39 -10
- package/esm2022/tableview/api/editor/helpers/class-attribute-converter.mjs +1 -1
- package/esm2022/tableview/api/editor/helpers/field-validators.mjs +15 -25
- package/esm2022/tableview/api/editor/models/editor-fields.model.mjs +1 -1
- package/esm2022/tableview/api/editor/models/field.model.mjs +1 -1
- package/esm2022/tableview/api/editor/models/form-editor.event.mjs +1 -1
- package/esm2022/tableview/api/editor/models/form-editor.interface.mjs +1 -1
- package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +3 -3
- package/esm2022/tableview/api/editor/models/formly-field.model.mjs +1 -1
- package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +1 -1
- package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +15 -22
- package/esm2022/tableview/api/tableview/helpers/class-attribute-converter.mjs +1 -1
- package/esm2022/tableview/api/tableview/helpers/files-export.mjs +1 -1
- package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +4 -4
- package/esm2022/tableview/api/tableview/helpers/tableview-input-builder.mjs +1 -1
- package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +158 -138
- package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +5 -7
- package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +3 -3
- package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +103 -0
- package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +5 -7
- package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +3 -3
- package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +33 -50
- package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +3 -3
- package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +8 -10
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +6 -8
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +19 -18
- package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +3 -3
- package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +4 -4
- package/esm2022/tableview/editor/helpers/editor-formly.mjs +343 -0
- package/esm2022/tableview/editor/helpers/formly-config.mjs +5 -3
- package/esm2022/tableview/editor/models/formly-config.model.mjs +1 -1
- package/esm2022/tableview/editor/services/formly-config.provider.mjs +1 -1
- package/esm2022/tableview/index.mjs +3 -5
- package/esm2022/tableview/provide.mjs +2 -1
- package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +10 -10
- package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +30 -56
- package/esm2022/tableview/tableview/router/tableview-route-builder.mjs +17 -43
- package/fesm2022/mediusinc-mng-commons-core.mjs +1599 -1496
- package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-filter.mjs +8 -9
- package/fesm2022/mediusinc-mng-commons-filter.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form.mjs +51 -56
- package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-model.mjs +99 -148
- package/fesm2022/mediusinc-mng-commons-model.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table-api.mjs +35 -7
- package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table.mjs +48 -65
- package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +105 -96
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview.mjs +865 -868
- package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
- package/filter/descriptors/filter.descriptor.d.ts +2 -2
- package/form/components/autocomplete/autocomplete.component.d.ts +8 -7
- package/model/descriptors/model.descriptor.d.ts +2 -2
- package/model/helpers/i18n.d.ts +10 -0
- package/model/helpers/model.d.ts +5 -0
- package/model/index.d.ts +2 -4
- package/package.json +7 -7
- package/table/api/descriptors/table.descriptor.d.ts +10 -0
- package/table/components/column-value/column-value.component.d.ts +3 -4
- package/table/components/table/table.component.d.ts +13 -13
- package/tableview/action/components/editor/injector-context/action-editor-injector-context.component.d.ts +1 -3
- package/tableview/action/components/route/action-route.component.d.ts +1 -1
- package/tableview/action/components/table/action-table.component.d.ts +6 -6
- package/tableview/action/helpers/i18n.d.ts +22 -0
- package/tableview/action/models/execution/action-instance-state.model.d.ts +21 -21
- package/tableview/action/models/execution/action-instance.model.d.ts +2 -1
- package/tableview/action/services/action-executor.service.d.ts +1 -1
- package/tableview/api/action/descriptors/action-editor.descriptor.d.ts +9 -1
- package/tableview/api/action/descriptors/action.descriptor.d.ts +3 -3
- package/tableview/api/action/models/action.type.d.ts +2 -2
- package/tableview/api/action/models/execution/action-instance-state.model.d.ts +21 -21
- package/tableview/api/action/models/execution/action-instance.model.d.ts +2 -1
- package/tableview/api/editor/descriptors/editor.descriptor.d.ts +16 -21
- package/tableview/api/editor/descriptors/field-action.descriptor.d.ts +2 -2
- package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +29 -29
- package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +9 -9
- package/tableview/api/editor/descriptors/field-lookup.descriptor.d.ts +4 -4
- package/tableview/api/editor/descriptors/field-many.descriptor.d.ts +4 -4
- package/tableview/api/editor/descriptors/field-validation.descriptor.d.ts +10 -13
- package/tableview/api/editor/descriptors/field.descriptor.d.ts +17 -2
- package/tableview/api/editor/helpers/field-validators.d.ts +6 -2
- package/tableview/api/editor/models/editor-fields.model.d.ts +9 -7
- package/tableview/api/editor/models/field.model.d.ts +16 -7
- package/tableview/api/editor/models/form-editor.event.d.ts +6 -4
- package/tableview/api/editor/models/form-editor.interface.d.ts +37 -8
- package/tableview/api/editor/models/formly-custom-field.model.d.ts +1 -1
- package/tableview/api/editor/models/formly-field.model.d.ts +9 -7
- package/tableview/api/tableview/descriptors/tableview.descriptor.d.ts +8 -9
- package/tableview/editor/components/editor/form-editor.component.d.ts +51 -35
- package/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.d.ts +22 -0
- package/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.d.ts +5 -7
- package/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +0 -1
- package/tableview/editor/helpers/editor-formly.d.ts +11 -0
- package/tableview/editor/models/formly-config.model.d.ts +1 -1
- package/tableview/index.d.ts +2 -2
- package/tableview/tableview/components/route/tableview-route.component.d.ts +2 -2
- package/tableview/tableview/components/tableview/tableview.component.d.ts +16 -15
- package/tableview/tableview/router/tableview-route-builder.d.ts +7 -13
- package/version-info.json +11 -0
- package/core/data-list/data-list-params.util.d.ts +0 -84
- package/core/enum/enum.util.d.ts +0 -51
- package/core/error/error.util.d.ts +0 -116
- package/core/security/permission.util.d.ts +0 -5
- package/core/utils/date.util.d.ts +0 -20
- package/core/utils/i18n.util.d.ts +0 -36
- package/core/utils/object.util.d.ts +0 -31
- package/core/utils/route.util.d.ts +0 -37
- package/core/utils/string.util.d.ts +0 -9
- package/esm2022/core/data-list/data-list-params.util.mjs +0 -417
- package/esm2022/core/enum/enum.util.mjs +0 -83
- package/esm2022/core/error/error.util.mjs +0 -249
- package/esm2022/core/security/permission.util.mjs +0 -16
- package/esm2022/core/utils/date.util.mjs +0 -136
- package/esm2022/core/utils/i18n.util.mjs +0 -137
- package/esm2022/core/utils/object.util.mjs +0 -147
- package/esm2022/core/utils/route.util.mjs +0 -60
- package/esm2022/core/utils/string.util.mjs +0 -59
- package/esm2022/model/pipes/enum.pipe.mjs +0 -26
- package/esm2022/model/pipes/i18n-property.pipe.mjs +0 -19
- package/esm2022/model/utils/i18n.util.mjs +0 -51
- package/esm2022/model/utils/model.util.mjs +0 -73
- package/esm2022/tableview/action/utils/i18n.util.mjs +0 -126
- package/esm2022/tableview/editor/utils/editor-formly.util.mjs +0 -337
- package/model/utils/i18n.util.d.ts +0 -15
- package/model/utils/model.util.d.ts +0 -8
- package/tableview/action/utils/i18n.util.d.ts +0 -48
- package/tableview/editor/utils/editor-formly.util.d.ts +0 -12
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import { HttpErrorResponse } from '@angular/common/http';
|
|
2
|
-
import { LogLevelEnum } from '../log/log.model';
|
|
3
|
-
import { StringUtil } from '../utils/string.util';
|
|
4
|
-
import { ACommonsErrorBase, CommonsHttpError, CommonsInternalError } from './error.model';
|
|
5
|
-
export class ErrorUtil {
|
|
6
|
-
/**
|
|
7
|
-
* Converts RxJS subscription error to CommonsError.
|
|
8
|
-
* @param error Error.
|
|
9
|
-
* @param name Optional name to write in commons error.
|
|
10
|
-
* @param details Optional details of error.
|
|
11
|
-
*/
|
|
12
|
-
static fromSubscribeError(error, name, details) {
|
|
13
|
-
const opts = {
|
|
14
|
-
name,
|
|
15
|
-
details,
|
|
16
|
-
location: window?.location?.href
|
|
17
|
-
};
|
|
18
|
-
if (error instanceof HttpErrorResponse) {
|
|
19
|
-
return new CommonsHttpError(error.message ?? 'Http Error occurred', error, opts);
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
opts.cause = error;
|
|
23
|
-
return new CommonsInternalError(error.message ?? 'Internal Error occurred', opts);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Checks if error is Http error (Angular or Commons).
|
|
28
|
-
* @param error
|
|
29
|
-
*/
|
|
30
|
-
static isHttpErrorResponse(error) {
|
|
31
|
-
return error instanceof HttpErrorResponse || error instanceof CommonsHttpError || error?.httpError instanceof HttpErrorResponse;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Gets HttpErrorResponse from error (Angular or Commons).
|
|
35
|
-
* @param error Error.
|
|
36
|
-
*/
|
|
37
|
-
static getHttpErrorResponse(error) {
|
|
38
|
-
if (error instanceof HttpErrorResponse) {
|
|
39
|
-
return error;
|
|
40
|
-
}
|
|
41
|
-
else if (error instanceof CommonsHttpError) {
|
|
42
|
-
return error.httpError;
|
|
43
|
-
}
|
|
44
|
-
else if (error?.httpError instanceof HttpErrorResponse) {
|
|
45
|
-
return error.httpError;
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Gets HttpErrorResponse status from error (Angular or Commons).
|
|
53
|
-
* @param error Error.
|
|
54
|
-
*/
|
|
55
|
-
static getHttpErrorResponseStatus(error) {
|
|
56
|
-
return ErrorUtil.getHttpErrorResponse(error)?.status ?? null;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Get error log level. All is error, except if error is http error with status >=400 and <500.
|
|
60
|
-
* @param error Error.
|
|
61
|
-
*/
|
|
62
|
-
static getErrorLogLevel(error) {
|
|
63
|
-
if (ErrorUtil.isHttpErrorResponse(error)) {
|
|
64
|
-
const status = ErrorUtil.getHttpErrorResponseStatus(error);
|
|
65
|
-
if (status && status >= 400 && status < 500) {
|
|
66
|
-
return LogLevelEnum.Warning;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return LogLevelEnum.Error;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Get error name (prototype name or type from commons error if name is not provided).
|
|
73
|
-
* @param error Error.
|
|
74
|
-
*/
|
|
75
|
-
static getErrorName(error) {
|
|
76
|
-
if (error instanceof ACommonsErrorBase) {
|
|
77
|
-
return error.name ?? error.type;
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
return error.name;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Writes http error to string with all headers and body.
|
|
85
|
-
* @param error Http response error.
|
|
86
|
-
* @param opts Options for hiding parts of error:
|
|
87
|
-
* - hideMessage Hides message of error (message include url, status and status text!).
|
|
88
|
-
* - hideHeaders Hides headers.
|
|
89
|
-
* - hideBody Hides JSON representation of body.
|
|
90
|
-
*/
|
|
91
|
-
static httpErrorResponseToString(error, opts) {
|
|
92
|
-
let str = opts?.hideMessage ? '' : `${error.message}\n`; // message should already include url, status, etc.
|
|
93
|
-
if (!opts?.hideHeaders) {
|
|
94
|
-
str += `Http Response Headers: ${error.headers.keys().reduce((acc, key) => `${acc}[${key}: ${error.headers.get(key)}]`, '')}`;
|
|
95
|
-
}
|
|
96
|
-
if (!opts?.hideBody) {
|
|
97
|
-
str += `\nHttp Response Body: ${StringUtil.stringify(error.error)}`;
|
|
98
|
-
}
|
|
99
|
-
return str;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Error to string.
|
|
103
|
-
* @param error Error.
|
|
104
|
-
* @param opts Options for hiding parts of error:
|
|
105
|
-
* - hideMessage Hides message of error.
|
|
106
|
-
* - hideName Hides error name.
|
|
107
|
-
* - hideCause Hides cause of an error (if present, see @link(errorCauseToString) for other options).
|
|
108
|
-
* - hideStack Hides stack of an error (if present).
|
|
109
|
-
* - hideDetails Hides JSON detail's representation of error (if present).
|
|
110
|
-
* - hideLocation Hides location (URL) where error was thrown.
|
|
111
|
-
* - hideHttp Hides http error portion of error if http error response (see @link(httpErrorResponseToString) for other options).
|
|
112
|
-
*/
|
|
113
|
-
static errorToString(error, opts) {
|
|
114
|
-
if (error instanceof ACommonsErrorBase) {
|
|
115
|
-
return ErrorUtil.commonsErrorToString(error, opts);
|
|
116
|
-
}
|
|
117
|
-
else if (error instanceof HttpErrorResponse) {
|
|
118
|
-
return ErrorUtil.httpErrorResponseToString(error, opts);
|
|
119
|
-
}
|
|
120
|
-
const strBlocks = [];
|
|
121
|
-
if (!opts?.hideMessage) {
|
|
122
|
-
strBlocks.push(error.message);
|
|
123
|
-
}
|
|
124
|
-
if (error.name) {
|
|
125
|
-
strBlocks.push(`Error name: ${error.name}`);
|
|
126
|
-
}
|
|
127
|
-
if (!opts?.hideCause) {
|
|
128
|
-
strBlocks.push(ErrorUtil.errorCauseToString(error, opts));
|
|
129
|
-
}
|
|
130
|
-
if (!opts?.hideStack && error.stack) {
|
|
131
|
-
strBlocks.push(`Stack trace:\n${error.stack}`);
|
|
132
|
-
}
|
|
133
|
-
return strBlocks.filter(s => s.trim().length > 0).join('\n');
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Commons error to string.
|
|
137
|
-
* @param error Commons error.
|
|
138
|
-
* @param opts Options for hiding parts of error:
|
|
139
|
-
* - hideMessage Hides message of error.
|
|
140
|
-
* - hideName Hides error name.
|
|
141
|
-
* - hideCause Hides cause of an error (if present, see @link(errorCauseToString) for other options).
|
|
142
|
-
* - hideStack Hides stack of an error (if present).
|
|
143
|
-
* - hideDetails Hides JSON detail's representation of error (if present).
|
|
144
|
-
* - hideLocation Hides location (URL) where error was thrown.
|
|
145
|
-
* - hideHttp Hides http error portion of error if http error response (see @link(httpErrorResponseToString) for other options).
|
|
146
|
-
* - hideItems Hides all item information (http body, action context data).
|
|
147
|
-
* - hideActionData See @link(commonsActionErrorContextToString) for additional info.
|
|
148
|
-
* - hideQueryParams See @link(commonsActionErrorContextToString) for additional info.
|
|
149
|
-
*/
|
|
150
|
-
static commonsErrorToString(error, opts) {
|
|
151
|
-
const strBlocks = [];
|
|
152
|
-
if (!opts?.hideMessage) {
|
|
153
|
-
strBlocks.push(`${error.message}${error.messageCode ? ` (code: ${error.messageCode})` : ''}`);
|
|
154
|
-
}
|
|
155
|
-
if (!opts?.hideName) {
|
|
156
|
-
strBlocks.push(`Error name: ${error.name ?? error.type} ${error.name ? `(${error.type})` : ''}`);
|
|
157
|
-
}
|
|
158
|
-
if (!opts?.hideLocation && error.location) {
|
|
159
|
-
strBlocks.push(`Location: ${error.location}`);
|
|
160
|
-
}
|
|
161
|
-
let isHttp = false;
|
|
162
|
-
if (!opts?.hideHttp && error instanceof CommonsHttpError) {
|
|
163
|
-
strBlocks.push(ErrorUtil.httpErrorResponseToString(error.httpError, {
|
|
164
|
-
hideBody: opts?.hideItems || opts?.hideBody,
|
|
165
|
-
hideHeaders: opts?.hideHeaders,
|
|
166
|
-
hideMessage: error.message.indexOf(error.httpError.message) >= 0
|
|
167
|
-
}));
|
|
168
|
-
isHttp = true;
|
|
169
|
-
}
|
|
170
|
-
if (error.type === 'CommonsActionError') {
|
|
171
|
-
const actionError = error;
|
|
172
|
-
if (actionError.actionContext) {
|
|
173
|
-
strBlocks.push(ErrorUtil.commonsActionErrorContextToString(actionError, opts));
|
|
174
|
-
}
|
|
175
|
-
if (!opts?.hideHttp && actionError.httpError instanceof HttpErrorResponse) {
|
|
176
|
-
strBlocks.push(ErrorUtil.httpErrorResponseToString(actionError.httpError, {
|
|
177
|
-
hideBody: opts?.hideItems || opts?.hideBody,
|
|
178
|
-
hideHeaders: opts?.hideHeaders,
|
|
179
|
-
hideMessage: error.message.indexOf(actionError.httpError.message) >= 0
|
|
180
|
-
}));
|
|
181
|
-
isHttp = true;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
if (!opts?.hideDetails && error.details) {
|
|
185
|
-
strBlocks.push(`Details: ${StringUtil.stringify(error.details)}`);
|
|
186
|
-
}
|
|
187
|
-
if (!opts?.hideCause && (!isHttp || !(error.cause instanceof HttpErrorResponse))) {
|
|
188
|
-
strBlocks.push(ErrorUtil.errorCauseToString(error, opts));
|
|
189
|
-
}
|
|
190
|
-
if (!opts?.hideStack && error.stack) {
|
|
191
|
-
strBlocks.push(`Stack trace:\n${error.stack}`);
|
|
192
|
-
}
|
|
193
|
-
return strBlocks.filter(s => s.trim().length > 0).join('\n');
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Writes commons action error info from context as string.
|
|
197
|
-
* @param error Commons action error.
|
|
198
|
-
* @param opts Options for hiding parts of error:
|
|
199
|
-
* - hideItems Hides all item related information (item, form item, submit item, ...).
|
|
200
|
-
* - hideActionData Hides action data.
|
|
201
|
-
* - hideQueryParams Hides query params.
|
|
202
|
-
*/
|
|
203
|
-
static commonsActionErrorContextToString(error, opts) {
|
|
204
|
-
let paramsMessage = '';
|
|
205
|
-
if (error.actionContext?.parameters) {
|
|
206
|
-
if (error.actionContext?.parameters.itemId) {
|
|
207
|
-
paramsMessage += `[itemId: ${error.actionContext.parameters.itemId}]`;
|
|
208
|
-
}
|
|
209
|
-
if (!opts?.hideItems && error.actionContext?.parameters.item) {
|
|
210
|
-
paramsMessage += `[item: ${StringUtil.stringify(error.actionContext.parameters.item)}]`;
|
|
211
|
-
}
|
|
212
|
-
if (!opts?.hideActionData && error.actionContext?.parameters.actionData) {
|
|
213
|
-
paramsMessage += Object.entries(error.actionContext?.parameters.actionData).reduce((acc, [key, value]) => `${acc}[actionData ${key}: ${StringUtil.stringify(value)}]`, '');
|
|
214
|
-
}
|
|
215
|
-
if (!opts?.hideQueryParams && error.actionContext?.parameters.dataListParams) {
|
|
216
|
-
paramsMessage += `[dataListParams: ${StringUtil.stringify(error.actionContext.parameters.dataListParams)}]`;
|
|
217
|
-
}
|
|
218
|
-
if (!opts?.hideItems && error.actionContext?.parameters.formItem) {
|
|
219
|
-
paramsMessage += `[formItem: ${StringUtil.stringify(error.actionContext.parameters.formItem)}]`;
|
|
220
|
-
}
|
|
221
|
-
if (!opts?.hideItems && error.actionContext?.parameters.submitResult) {
|
|
222
|
-
paramsMessage += `[formItem: ${StringUtil.stringify(error.actionContext.parameters.submitResult)}]`;
|
|
223
|
-
}
|
|
224
|
-
if (error.actionContext?.parameters.locale) {
|
|
225
|
-
paramsMessage += `[locale: ${StringUtil.stringify(error.actionContext.parameters.locale)}]`;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
return paramsMessage;
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Writes cause of an error as string.
|
|
232
|
-
* @param error Error.
|
|
233
|
-
* @param opts Options for hiding parts of error:
|
|
234
|
-
* - causeOnErrorOnly Prints only if cause is instance of error.
|
|
235
|
-
* - causeAsJson Print error cause as a JSON (by default, if error only message and name will be printed).
|
|
236
|
-
*/
|
|
237
|
-
static errorCauseToString(error, opts) {
|
|
238
|
-
// if already logged as http error, check that cause is not also http error (cause it is usually duplicated)
|
|
239
|
-
if (error.cause && (!opts?.causeOnErrorOnly || error.cause instanceof Error)) {
|
|
240
|
-
const stringify = opts?.causeAsJson || !(error.cause instanceof Error);
|
|
241
|
-
if (!opts?.causeOnErrorOnly || error.cause instanceof Error) {
|
|
242
|
-
return ('Caused by: ' +
|
|
243
|
-
(stringify ? StringUtil.stringify(error.cause) : `${error.cause.message}${error.cause.name ? ` (${error.cause.name})` : ''}`));
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
return '';
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvc3JjL2Vycm9yL2Vycm9yLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFdkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsaUJBQWlCLEVBQTJCLGdCQUFnQixFQUFFLG9CQUFvQixFQUFzQixNQUFNLGVBQWUsQ0FBQztBQUV0SSxNQUFNLE9BQU8sU0FBUztJQUNsQjs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFVLEVBQUUsSUFBYSxFQUFFLE9BQWE7UUFDckUsTUFBTSxJQUFJLEdBQTRCO1lBQ2xDLElBQUk7WUFDSixPQUFPO1lBQ1AsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSTtTQUNuQyxDQUFDO1FBRUYsSUFBSSxLQUFLLFlBQVksaUJBQWlCLEVBQUU7WUFDcEMsT0FBTyxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUkscUJBQXFCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3BGO2FBQU07WUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixPQUFPLElBQUksb0JBQW9CLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSx5QkFBeUIsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyRjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBVTtRQUN4QyxPQUFPLEtBQUssWUFBWSxpQkFBaUIsSUFBSSxLQUFLLFlBQVksZ0JBQWdCLElBQUssS0FBeUMsRUFBRSxTQUFTLFlBQVksaUJBQWlCLENBQUM7SUFD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QUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFJLEtBQUssQ0FBQyxLQUFlLENBQUMsT0FBTyxHQUFJLEtBQUssQ0FBQyxLQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFNLEtBQUssQ0FBQyxLQUFlLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ2pLLENBQUM7YUFDTDtTQUNKO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmltcG9ydCB7TG9nTGV2ZWxFbnVtfSBmcm9tICcuLi9sb2cvbG9nLm1vZGVsJztcbmltcG9ydCB7U3RyaW5nVXRpbH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nLnV0aWwnO1xuaW1wb3J0IHtBQ29tbW9uc0Vycm9yQmFzZSwgQ29tbW9uc0Vycm9yQmFzZU9wdGlvbnMsIENvbW1vbnNIdHRwRXJyb3IsIENvbW1vbnNJbnRlcm5hbEVycm9yLCBJQ29tbW9uc0FjdGlvbkVycm9yfSBmcm9tICcuL2Vycm9yLm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIEVycm9yVXRpbCB7XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgUnhKUyBzdWJzY3JpcHRpb24gZXJyb3IgdG8gQ29tbW9uc0Vycm9yLlxuICAgICAqIEBwYXJhbSBlcnJvciBFcnJvci5cbiAgICAgKiBAcGFyYW0gbmFtZSBPcHRpb25hbCBuYW1lIHRvIHdyaXRlIGluIGNvbW1vbnMgZXJyb3IuXG4gICAgICogQHBhcmFtIGRldGFpbHMgT3B0aW9uYWwgZGV0YWlscyBvZiBlcnJvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21TdWJzY3JpYmVFcnJvcihlcnJvcjogYW55LCBuYW1lPzogc3RyaW5nLCBkZXRhaWxzPzogYW55KTogQUNvbW1vbnNFcnJvckJhc2Uge1xuICAgICAgICBjb25zdCBvcHRzOiBDb21tb25zRXJyb3JCYXNlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXRhaWxzLFxuICAgICAgICAgICAgbG9jYXRpb246IHdpbmRvdz8ubG9jYXRpb24/LmhyZWZcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21tb25zSHR0cEVycm9yKGVycm9yLm1lc3NhZ2UgPz8gJ0h0dHAgRXJyb3Igb2NjdXJyZWQnLCBlcnJvciwgb3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRzLmNhdXNlID0gZXJyb3I7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGVycm9yLm1lc3NhZ2UgPz8gJ0ludGVybmFsIEVycm9yIG9jY3VycmVkJywgb3B0cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZXJyb3IgaXMgSHR0cCBlcnJvciAoQW5ndWxhciBvciBDb21tb25zKS5cbiAgICAgKiBAcGFyYW0gZXJyb3JcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzSHR0cEVycm9yUmVzcG9uc2UoZXJyb3I6IGFueSkge1xuICAgICAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSB8fCBlcnJvciBpbnN0YW5jZW9mIENvbW1vbnNIdHRwRXJyb3IgfHwgKGVycm9yIGFzIElDb21tb25zQWN0aW9uRXJyb3IgfCB1bmRlZmluZWQpPy5odHRwRXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIEh0dHBFcnJvclJlc3BvbnNlIGZyb20gZXJyb3IgKEFuZ3VsYXIgb3IgQ29tbW9ucykuXG4gICAgICogQHBhcmFtIGVycm9yIEVycm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SHR0cEVycm9yUmVzcG9uc2UoZXJyb3I6IGFueSk6IEh0dHBFcnJvclJlc3BvbnNlIHwgbnVsbCB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb21tb25zSHR0cEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3IuaHR0cEVycm9yO1xuICAgICAgICB9IGVsc2UgaWYgKChlcnJvciBhcyBJQ29tbW9uc0FjdGlvbkVycm9yIHwgdW5kZWZpbmVkKT8uaHR0cEVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvci5odHRwRXJyb3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgSHR0cEVycm9yUmVzcG9uc2Ugc3RhdHVzIGZyb20gZXJyb3IgKEFuZ3VsYXIgb3IgQ29tbW9ucykuXG4gICAgICogQHBhcmFtIGVycm9yIEVycm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SHR0cEVycm9yUmVzcG9uc2VTdGF0dXMoZXJyb3I6IGFueSk6IG51bWJlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gRXJyb3JVdGlsLmdldEh0dHBFcnJvclJlc3BvbnNlKGVycm9yKT8uc3RhdHVzID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGVycm9yIGxvZyBsZXZlbC4gQWxsIGlzIGVycm9yLCBleGNlcHQgaWYgZXJyb3IgaXMgaHR0cCBlcnJvciB3aXRoIHN0YXR1cyA+PTQwMCBhbmQgPDUwMC5cbiAgICAgKiBAcGFyYW0gZXJyb3IgRXJyb3IuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFcnJvckxvZ0xldmVsKGVycm9yOiBhbnkpOiBMb2dMZXZlbEVudW0ge1xuICAgICAgICBpZiAoRXJyb3JVdGlsLmlzSHR0cEVycm9yUmVzcG9uc2UoZXJyb3IpKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBFcnJvclV0aWwuZ2V0SHR0cEVycm9yUmVzcG9uc2VTdGF0dXMoZXJyb3IpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cyAmJiBzdGF0dXMgPj0gNDAwICYmIHN0YXR1cyA8IDUwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBMb2dMZXZlbEVudW0uV2FybmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTG9nTGV2ZWxFbnVtLkVycm9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBlcnJvciBuYW1lIChwcm90b3R5cGUgbmFtZSBvciB0eXBlIGZyb20gY29tbW9ucyBlcnJvciBpZiBuYW1lIGlzIG5vdCBwcm92aWRlZCkuXG4gICAgICogQHBhcmFtIGVycm9yIEVycm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RXJyb3JOYW1lKGVycm9yOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBQ29tbW9uc0Vycm9yQmFzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yLm5hbWUgPz8gZXJyb3IudHlwZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvci5uYW1lO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGVzIGh0dHAgZXJyb3IgdG8gc3RyaW5nIHdpdGggYWxsIGhlYWRlcnMgYW5kIGJvZHkuXG4gICAgICogQHBhcmFtIGVycm9yIEh0dHAgcmVzcG9uc2UgZXJyb3IuXG4gICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyBmb3IgaGlkaW5nIHBhcnRzIG9mIGVycm9yOlxuICAgICAqICAtIGhpZGVNZXNzYWdlIEhpZGVzIG1lc3NhZ2Ugb2YgZXJyb3IgKG1lc3NhZ2UgaW5jbHVkZSB1cmwsIHN0YXR1cyBhbmQgc3RhdHVzIHRleHQhKS5cbiAgICAgKiAgLSBoaWRlSGVhZGVycyBIaWRlcyBoZWFkZXJzLlxuICAgICAqICAtIGhpZGVCb2R5IEhpZGVzIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYm9keS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGh0dHBFcnJvclJlc3BvbnNlVG9TdHJpbmcoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlLCBvcHRzPzogSHR0cEVycm9yUmVzcG9uc2VUb1N0cmluZ09wdGlvbnNUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHN0ciA9IG9wdHM/LmhpZGVNZXNzYWdlID8gJycgOiBgJHtlcnJvci5tZXNzYWdlfVxcbmA7IC8vIG1lc3NhZ2Ugc2hvdWxkIGFscmVhZHkgaW5jbHVkZSB1cmwsIHN0YXR1cywgZXRjLlxuICAgICAgICBpZiAoIW9wdHM/LmhpZGVIZWFkZXJzKSB7XG4gICAgICAgICAgICBzdHIgKz0gYEh0dHAgUmVzcG9uc2UgSGVhZGVyczogJHtlcnJvci5oZWFkZXJzLmtleXMoKS5yZWR1Y2UoKGFjYywga2V5KSA9PiBgJHthY2N9WyR7a2V5fTogJHtlcnJvci5oZWFkZXJzLmdldChrZXkpfV1gLCAnJyl9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdHM/LmhpZGVCb2R5KSB7XG4gICAgICAgICAgICBzdHIgKz0gYFxcbkh0dHAgUmVzcG9uc2UgQm9keTogJHtTdHJpbmdVdGlsLnN0cmluZ2lmeShlcnJvci5lcnJvcil9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVycm9yIHRvIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZXJyb3IgRXJyb3IuXG4gICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyBmb3IgaGlkaW5nIHBhcnRzIG9mIGVycm9yOlxuICAgICAqIC0gaGlkZU1lc3NhZ2UgSGlkZXMgbWVzc2FnZSBvZiBlcnJvci5cbiAgICAgKiAtIGhpZGVOYW1lIEhpZGVzIGVycm9yIG5hbWUuXG4gICAgICogLSBoaWRlQ2F1c2UgSGlkZXMgY2F1c2Ugb2YgYW4gZXJyb3IgKGlmIHByZXNlbnQsIHNlZSBAbGluayhlcnJvckNhdXNlVG9TdHJpbmcpIGZvciBvdGhlciBvcHRpb25zKS5cbiAgICAgKiAtIGhpZGVTdGFjayBIaWRlcyBzdGFjayBvZiBhbiBlcnJvciAoaWYgcHJlc2VudCkuXG4gICAgICogLSBoaWRlRGV0YWlscyBIaWRlcyBKU09OIGRldGFpbCdzIHJlcHJlc2VudGF0aW9uIG9mIGVycm9yIChpZiBwcmVzZW50KS5cbiAgICAgKiAtIGhpZGVMb2NhdGlvbiBIaWRlcyBsb2NhdGlvbiAoVVJMKSB3aGVyZSBlcnJvciB3YXMgdGhyb3duLlxuICAgICAqIC0gaGlkZUh0dHAgSGlkZXMgaHR0cCBlcnJvciBwb3J0aW9uIG9mIGVycm9yIGlmIGh0dHAgZXJyb3IgcmVzcG9uc2UgKHNlZSBAbGluayhodHRwRXJyb3JSZXNwb25zZVRvU3RyaW5nKSBmb3Igb3RoZXIgb3B0aW9ucykuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBlcnJvclRvU3RyaW5nKGVycm9yOiBFcnJvciwgb3B0cz86IEVycm9yVG9TdHJpbmdPcHRpb25zVHlwZSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFDb21tb25zRXJyb3JCYXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gRXJyb3JVdGlsLmNvbW1vbnNFcnJvclRvU3RyaW5nKGVycm9yLCBvcHRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4gRXJyb3JVdGlsLmh0dHBFcnJvclJlc3BvbnNlVG9TdHJpbmcoZXJyb3IsIG9wdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RyQmxvY2tzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoIW9wdHM/LmhpZGVNZXNzYWdlKSB7XG4gICAgICAgICAgICBzdHJCbG9ja3MucHVzaChlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IubmFtZSkge1xuICAgICAgICAgICAgc3RyQmxvY2tzLnB1c2goYEVycm9yIG5hbWU6ICR7ZXJyb3IubmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdHM/LmhpZGVDYXVzZSkge1xuICAgICAgICAgICAgc3RyQmxvY2tzLnB1c2goRXJyb3JVdGlsLmVycm9yQ2F1c2VUb1N0cmluZyhlcnJvciwgb3B0cykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0cz8uaGlkZVN0YWNrICYmIGVycm9yLnN0YWNrKSB7XG4gICAgICAgICAgICBzdHJCbG9ja3MucHVzaChgU3RhY2sgdHJhY2U6XFxuJHtlcnJvci5zdGFja31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHJCbG9ja3MuZmlsdGVyKHMgPT4gcy50cmltKCkubGVuZ3RoID4gMCkuam9pbignXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tbW9ucyBlcnJvciB0byBzdHJpbmcuXG4gICAgICogQHBhcmFtIGVycm9yIENvbW1vbnMgZXJyb3IuXG4gICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyBmb3IgaGlkaW5nIHBhcnRzIG9mIGVycm9yOlxuICAgICAqIC0gaGlkZU1lc3NhZ2UgSGlkZXMgbWVzc2FnZSBvZiBlcnJvci5cbiAgICAgKiAtIGhpZGVOYW1lIEhpZGVzIGVycm9yIG5hbWUuXG4gICAgICogLSBoaWRlQ2F1c2UgSGlkZXMgY2F1c2Ugb2YgYW4gZXJyb3IgKGlmIHByZXNlbnQsIHNlZSBAbGluayhlcnJvckNhdXNlVG9TdHJpbmcpIGZvciBvdGhlciBvcHRpb25zKS5cbiAgICAgKiAtIGhpZGVTdGFjayBIaWRlcyBzdGFjayBvZiBhbiBlcnJvciAoaWYgcHJlc2VudCkuXG4gICAgICogLSBoaWRlRGV0YWlscyBIaWRlcyBKU09OIGRldGFpbCdzIHJlcHJlc2VudGF0aW9uIG9mIGVycm9yIChpZiBwcmVzZW50KS5cbiAgICAgKiAtIGhpZGVMb2NhdGlvbiBIaWRlcyBsb2NhdGlvbiAoVVJMKSB3aGVyZSBlcnJvciB3YXMgdGhyb3duLlxuICAgICAqIC0gaGlkZUh0dHAgSGlkZXMgaHR0cCBlcnJvciBwb3J0aW9uIG9mIGVycm9yIGlmIGh0dHAgZXJyb3IgcmVzcG9uc2UgKHNlZSBAbGluayhodHRwRXJyb3JSZXNwb25zZVRvU3RyaW5nKSBmb3Igb3RoZXIgb3B0aW9ucykuXG4gICAgICogLSBoaWRlSXRlbXMgSGlkZXMgYWxsIGl0ZW0gaW5mb3JtYXRpb24gKGh0dHAgYm9keSwgYWN0aW9uIGNvbnRleHQgZGF0YSkuXG4gICAgICogLSBoaWRlQWN0aW9uRGF0YSBTZWUgQGxpbmsoY29tbW9uc0FjdGlvbkVycm9yQ29udGV4dFRvU3RyaW5nKSBmb3IgYWRkaXRpb25hbCBpbmZvLlxuICAgICAqIC0gaGlkZVF1ZXJ5UGFyYW1zIFNlZSBAbGluayhjb21tb25zQWN0aW9uRXJyb3JDb250ZXh0VG9TdHJpbmcpIGZvciBhZGRpdGlvbmFsIGluZm8uXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb21tb25zRXJyb3JUb1N0cmluZyhlcnJvcjogQUNvbW1vbnNFcnJvckJhc2UsIG9wdHM/OiBFcnJvclRvU3RyaW5nT3B0aW9uc1R5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzdHJCbG9ja3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICghb3B0cz8uaGlkZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHN0ckJsb2Nrcy5wdXNoKGAke2Vycm9yLm1lc3NhZ2V9JHtlcnJvci5tZXNzYWdlQ29kZSA/IGAgKGNvZGU6ICR7ZXJyb3IubWVzc2FnZUNvZGV9KWAgOiAnJ31gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdHM/LmhpZGVOYW1lKSB7XG4gICAgICAgICAgICBzdHJCbG9ja3MucHVzaChgRXJyb3IgbmFtZTogJHtlcnJvci5uYW1lID8/IGVycm9yLnR5cGV9ICR7ZXJyb3IubmFtZSA/IGAoJHtlcnJvci50eXBlfSlgIDogJyd9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRzPy5oaWRlTG9jYXRpb24gJiYgZXJyb3IubG9jYXRpb24pIHtcbiAgICAgICAgICAgIHN0ckJsb2Nrcy5wdXNoKGBMb2NhdGlvbjogJHtlcnJvci5sb2NhdGlvbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc0h0dHAgPSBmYWxzZTtcbiAgICAgICAgaWYgKCFvcHRzPy5oaWRlSHR0cCAmJiBlcnJvciBpbnN0YW5jZW9mIENvbW1vbnNIdHRwRXJyb3IpIHtcbiAgICAgICAgICAgIHN0ckJsb2Nrcy5wdXNoKFxuICAgICAgICAgICAgICAgIEVycm9yVXRpbC5odHRwRXJyb3JSZXNwb25zZVRvU3RyaW5nKGVycm9yLmh0dHBFcnJvciwge1xuICAgICAgICAgICAgICAgICAgICBoaWRlQm9keTogb3B0cz8uaGlkZUl0ZW1zIHx8IG9wdHM/LmhpZGVCb2R5LFxuICAgICAgICAgICAgICAgICAgICBoaWRlSGVhZGVyczogb3B0cz8uaGlkZUhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGhpZGVNZXNzYWdlOiBlcnJvci5tZXNzYWdlLmluZGV4T2YoZXJyb3IuaHR0cEVycm9yLm1lc3NhZ2UpID49IDBcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlzSHR0cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yLnR5cGUgPT09ICdDb21tb25zQWN0aW9uRXJyb3InKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25FcnJvciA9IGVycm9yIGFzIHVua25vd24gYXMgSUNvbW1vbnNBY3Rpb25FcnJvcjtcbiAgICAgICAgICAgIGlmIChhY3Rpb25FcnJvci5hY3Rpb25Db250ZXh0KSB7XG4gICAgICAgICAgICAgICAgc3RyQmxvY2tzLnB1c2goRXJyb3JVdGlsLmNvbW1vbnNBY3Rpb25FcnJvckNvbnRleHRUb1N0cmluZyhhY3Rpb25FcnJvciwgb3B0cykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRzPy5oaWRlSHR0cCAmJiBhY3Rpb25FcnJvci5odHRwRXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHN0ckJsb2Nrcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBFcnJvclV0aWwuaHR0cEVycm9yUmVzcG9uc2VUb1N0cmluZyhhY3Rpb25FcnJvci5odHRwRXJyb3IsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVCb2R5OiBvcHRzPy5oaWRlSXRlbXMgfHwgb3B0cz8uaGlkZUJvZHksXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRlSGVhZGVyczogb3B0cz8uaGlkZUhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRlTWVzc2FnZTogZXJyb3IubWVzc2FnZS5pbmRleE9mKGFjdGlvbkVycm9yLmh0dHBFcnJvci5tZXNzYWdlKSA+PSAwXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpc0h0dHAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvcHRzPy5oaWRlRGV0YWlscyAmJiBlcnJvci5kZXRhaWxzKSB7XG4gICAgICAgICAgICBzdHJCbG9ja3MucHVzaChgRGV0YWlsczogJHtTdHJpbmdVdGlsLnN0cmluZ2lmeShlcnJvci5kZXRhaWxzKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdHM/LmhpZGVDYXVzZSAmJiAoIWlzSHR0cCB8fCAhKGVycm9yLmNhdXNlIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpKSkge1xuICAgICAgICAgICAgc3RyQmxvY2tzLnB1c2goRXJyb3JVdGlsLmVycm9yQ2F1c2VUb1N0cmluZyhlcnJvciwgb3B0cykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0cz8uaGlkZVN0YWNrICYmIGVycm9yLnN0YWNrKSB7XG4gICAgICAgICAgICBzdHJCbG9ja3MucHVzaChgU3RhY2sgdHJhY2U6XFxuJHtlcnJvci5zdGFja31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHJCbG9ja3MuZmlsdGVyKHMgPT4gcy50cmltKCkubGVuZ3RoID4gMCkuam9pbignXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGVzIGNvbW1vbnMgYWN0aW9uIGVycm9yIGluZm8gZnJvbSBjb250ZXh0IGFzIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZXJyb3IgQ29tbW9ucyBhY3Rpb24gZXJyb3IuXG4gICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyBmb3IgaGlkaW5nIHBhcnRzIG9mIGVycm9yOlxuICAgICAqIC0gaGlkZUl0ZW1zIEhpZGVzIGFsbCBpdGVtIHJlbGF0ZWQgaW5mb3JtYXRpb24gKGl0ZW0sIGZvcm0gaXRlbSwgc3VibWl0IGl0ZW0sIC4uLikuXG4gICAgICogLSBoaWRlQWN0aW9uRGF0YSBIaWRlcyBhY3Rpb24gZGF0YS5cbiAgICAgKiAtIGhpZGVRdWVyeVBhcmFtcyBIaWRlcyBxdWVyeSBwYXJhbXMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb21tb25zQWN0aW9uRXJyb3JDb250ZXh0VG9TdHJpbmcoZXJyb3I6IElDb21tb25zQWN0aW9uRXJyb3IsIG9wdHM/OiBBY3Rpb25FcnJvckNvbnRleHRUb1N0cmluZ09wdGlvbnNUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHBhcmFtc01lc3NhZ2UgPSAnJztcbiAgICAgICAgaWYgKGVycm9yLmFjdGlvbkNvbnRleHQ/LnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5hY3Rpb25Db250ZXh0Py5wYXJhbWV0ZXJzLml0ZW1JZCkge1xuICAgICAgICAgICAgICAgIHBhcmFtc01lc3NhZ2UgKz0gYFtpdGVtSWQ6ICR7ZXJyb3IuYWN0aW9uQ29udGV4dC5wYXJhbWV0ZXJzLml0ZW1JZH1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0cz8uaGlkZUl0ZW1zICYmIGVycm9yLmFjdGlvbkNvbnRleHQ/LnBhcmFtZXRlcnMuaXRlbSkge1xuICAgICAgICAgICAgICAgIHBhcmFtc01lc3NhZ2UgKz0gYFtpdGVtOiAke1N0cmluZ1V0aWwuc3RyaW5naWZ5KGVycm9yLmFjdGlvbkNvbnRleHQucGFyYW1ldGVycy5pdGVtKX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0cz8uaGlkZUFjdGlvbkRhdGEgJiYgZXJyb3IuYWN0aW9uQ29udGV4dD8ucGFyYW1ldGVycy5hY3Rpb25EYXRhKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zTWVzc2FnZSArPSBPYmplY3QuZW50cmllcyhlcnJvci5hY3Rpb25Db250ZXh0Py5wYXJhbWV0ZXJzLmFjdGlvbkRhdGEpLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgKGFjYywgW2tleSwgdmFsdWVdKSA9PiBgJHthY2N9W2FjdGlvbkRhdGEgJHtrZXl9OiAke1N0cmluZ1V0aWwuc3RyaW5naWZ5KHZhbHVlKX1dYCxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRzPy5oaWRlUXVlcnlQYXJhbXMgJiYgZXJyb3IuYWN0aW9uQ29udGV4dD8ucGFyYW1ldGVycy5kYXRhTGlzdFBhcmFtcykge1xuICAgICAgICAgICAgICAgIHBhcmFtc01lc3NhZ2UgKz0gYFtkYXRhTGlzdFBhcmFtczogJHtTdHJpbmdVdGlsLnN0cmluZ2lmeShlcnJvci5hY3Rpb25Db250ZXh0LnBhcmFtZXRlcnMuZGF0YUxpc3RQYXJhbXMpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRzPy5oaWRlSXRlbXMgJiYgZXJyb3IuYWN0aW9uQ29udGV4dD8ucGFyYW1ldGVycy5mb3JtSXRlbSkge1xuICAgICAgICAgICAgICAgIHBhcmFtc01lc3NhZ2UgKz0gYFtmb3JtSXRlbTogJHtTdHJpbmdVdGlsLnN0cmluZ2lmeShlcnJvci5hY3Rpb25Db250ZXh0LnBhcmFtZXRlcnMuZm9ybUl0ZW0pfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRzPy5oaWRlSXRlbXMgJiYgZXJyb3IuYWN0aW9uQ29udGV4dD8ucGFyYW1ldGVycy5zdWJtaXRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXNNZXNzYWdlICs9IGBbZm9ybUl0ZW06ICR7U3RyaW5nVXRpbC5zdHJpbmdpZnkoZXJyb3IuYWN0aW9uQ29udGV4dC5wYXJhbWV0ZXJzLnN1Ym1pdFJlc3VsdCl9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3IuYWN0aW9uQ29udGV4dD8ucGFyYW1ldGVycy5sb2NhbGUpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXNNZXNzYWdlICs9IGBbbG9jYWxlOiAke1N0cmluZ1V0aWwuc3RyaW5naWZ5KGVycm9yLmFjdGlvbkNvbnRleHQucGFyYW1ldGVycy5sb2NhbGUpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtc01lc3NhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGVzIGNhdXNlIG9mIGFuIGVycm9yIGFzIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZXJyb3IgRXJyb3IuXG4gICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyBmb3IgaGlkaW5nIHBhcnRzIG9mIGVycm9yOlxuICAgICAqIC0gY2F1c2VPbkVycm9yT25seSBQcmludHMgb25seSBpZiBjYXVzZSBpcyBpbnN0YW5jZSBvZiBlcnJvci5cbiAgICAgKiAtIGNhdXNlQXNKc29uIFByaW50IGVycm9yIGNhdXNlIGFzIGEgSlNPTiAoYnkgZGVmYXVsdCwgaWYgZXJyb3Igb25seSBtZXNzYWdlIGFuZCBuYW1lIHdpbGwgYmUgcHJpbnRlZCkuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBlcnJvckNhdXNlVG9TdHJpbmcoZXJyb3I6IEVycm9yLCBvcHRzPzogRXJyb3JDYXVzZVRvU3RyaW5nT3B0aW9uc1R5cGUpOiBzdHJpbmcge1xuICAgICAgICAvLyBpZiBhbHJlYWR5IGxvZ2dlZCBhcyBodHRwIGVycm9yLCBjaGVjayB0aGF0IGNhdXNlIGlzIG5vdCBhbHNvIGh0dHAgZXJyb3IgKGNhdXNlIGl0IGlzIHVzdWFsbHkgZHVwbGljYXRlZClcbiAgICAgICAgaWYgKGVycm9yLmNhdXNlICYmICghb3B0cz8uY2F1c2VPbkVycm9yT25seSB8fCBlcnJvci5jYXVzZSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RyaW5naWZ5ID0gb3B0cz8uY2F1c2VBc0pzb24gfHwgIShlcnJvci5jYXVzZSBpbnN0YW5jZW9mIEVycm9yKTtcbiAgICAgICAgICAgIGlmICghb3B0cz8uY2F1c2VPbkVycm9yT25seSB8fCBlcnJvci5jYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ0NhdXNlZCBieTogJyArXG4gICAgICAgICAgICAgICAgICAgIChzdHJpbmdpZnkgPyBTdHJpbmdVdGlsLnN0cmluZ2lmeShlcnJvci5jYXVzZSkgOiBgJHsoZXJyb3IuY2F1c2UgYXMgRXJyb3IpLm1lc3NhZ2V9JHsoZXJyb3IuY2F1c2UgYXMgRXJyb3IpLm5hbWUgPyBgICgkeyhlcnJvci5jYXVzZSBhcyBFcnJvcikubmFtZX0pYCA6ICcnfWApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBFcnJvclRvU3RyaW5nT3B0aW9uc1R5cGUgPSBFcnJvclRvU3RyaW5nT3B0aW9uc0Jhc2VUeXBlICZcbiAgICBIdHRwRXJyb3JSZXNwb25zZVRvU3RyaW5nT3B0aW9uc1R5cGUgJlxuICAgIEFjdGlvbkVycm9yQ29udGV4dFRvU3RyaW5nT3B0aW9uc1R5cGUgJlxuICAgIEVycm9yQ2F1c2VUb1N0cmluZ09wdGlvbnNUeXBlICYge1xuICAgICAgICBoaWRlRGV0YWlscz86IGJvb2xlYW47XG4gICAgICAgIGhpZGVMb2NhdGlvbj86IGJvb2xlYW47XG4gICAgfTtcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvclRvU3RyaW5nT3B0aW9uc0Jhc2VUeXBlIHtcbiAgICBoaWRlTmFtZT86IGJvb2xlYW47XG4gICAgaGlkZVN0YWNrPzogYm9vbGVhbjtcbiAgICBoaWRlQ2F1c2U/OiBib29sZWFuO1xuICAgIGhpZGVIdHRwPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIdHRwRXJyb3JSZXNwb25zZVRvU3RyaW5nT3B0aW9uc1R5cGUge1xuICAgIGhpZGVNZXNzYWdlPzogYm9vbGVhbjtcbiAgICBoaWRlSGVhZGVycz86IGJvb2xlYW47XG4gICAgaGlkZUJvZHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbkVycm9yQ29udGV4dFRvU3RyaW5nT3B0aW9uc1R5cGUge1xuICAgIGhpZGVJdGVtcz86IGJvb2xlYW47XG4gICAgaGlkZUFjdGlvbkRhdGE/OiBib29sZWFuO1xuICAgIGhpZGVRdWVyeVBhcmFtcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JDYXVzZVRvU3RyaW5nT3B0aW9uc1R5cGUge1xuICAgIGNhdXNlT25FcnJvck9ubHk/OiBib29sZWFuO1xuICAgIGNhdXNlQXNKc29uPzogYm9vbGVhbjtcbn1cbiJdfQ==
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { CommonsInternalError } from '../error/error.model';
|
|
2
|
-
import { PermissionTypeEnum } from './permissions.model';
|
|
3
|
-
export class PermissionUtil {
|
|
4
|
-
static isPermitted(permissions, userRoles) {
|
|
5
|
-
switch (permissions.authorizationType) {
|
|
6
|
-
case PermissionTypeEnum.Rbac:
|
|
7
|
-
return PermissionUtil.isRbacPermitted(permissions, userRoles);
|
|
8
|
-
default:
|
|
9
|
-
throw new CommonsInternalError(`Permission type "${permissions.authorizationType}" not implemented`);
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
static isRbacPermitted(permissions, userRoles) {
|
|
13
|
-
return permissions.roles.some(prg => prg.every(pr => userRoles.indexOf(pr) > -1));
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9zcmMvc2VjdXJpdHkvcGVybWlzc2lvbi51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBZSxrQkFBa0IsRUFBYyxNQUFNLHFCQUFxQixDQUFDO0FBRWxGLE1BQU0sT0FBTyxjQUFjO0lBQ2hCLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBeUIsRUFBRSxTQUF3QjtRQUN6RSxRQUFRLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRTtZQUNuQyxLQUFLLGtCQUFrQixDQUFDLElBQUk7Z0JBQ3hCLE9BQU8sY0FBYyxDQUFDLGVBQWUsQ0FBQyxXQUFnQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZGO2dCQUNJLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxvQkFBb0IsV0FBVyxDQUFDLGlCQUFpQixtQkFBbUIsQ0FBQyxDQUFDO1NBQzVHO0lBQ0wsQ0FBQztJQUVNLE1BQU0sQ0FBQyxlQUFlLENBQUMsV0FBOEIsRUFBRSxTQUF3QjtRQUNsRixPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tbW9uc0ludGVybmFsRXJyb3J9IGZyb20gJy4uL2Vycm9yL2Vycm9yLm1vZGVsJztcbmltcG9ydCB7QVBlcm1pc3Npb25zLCBQZXJtaXNzaW9uVHlwZUVudW0sIFBlcm1pc3Npb25zfSBmcm9tICcuL3Blcm1pc3Npb25zLm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25VdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIGlzUGVybWl0dGVkKHBlcm1pc3Npb25zOiBBUGVybWlzc2lvbnMsIHVzZXJSb2xlczogQXJyYXk8c3RyaW5nPik6IGJvb2xlYW4ge1xuICAgICAgICBzd2l0Y2ggKHBlcm1pc3Npb25zLmF1dGhvcml6YXRpb25UeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFBlcm1pc3Npb25UeXBlRW51bS5SYmFjOlxuICAgICAgICAgICAgICAgIHJldHVybiBQZXJtaXNzaW9uVXRpbC5pc1JiYWNQZXJtaXR0ZWQocGVybWlzc2lvbnMgYXMgUGVybWlzc2lvbnMuUm9sZXMsIHVzZXJSb2xlcyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgUGVybWlzc2lvbiB0eXBlIFwiJHtwZXJtaXNzaW9ucy5hdXRob3JpemF0aW9uVHlwZX1cIiBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNSYmFjUGVybWl0dGVkKHBlcm1pc3Npb25zOiBQZXJtaXNzaW9ucy5Sb2xlcywgdXNlclJvbGVzOiBBcnJheTxzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBwZXJtaXNzaW9ucy5yb2xlcy5zb21lKHByZyA9PiBwcmcuZXZlcnkocHIgPT4gdXNlclJvbGVzLmluZGV4T2YocHIpID4gLTEpKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
export class DateUtil {
|
|
2
|
-
static { this.NG_PRIME_FORMAT_SUPPORTED = [/d{1,2}/g, /E{1,5}/g, /c{1,5}/g, /M{1,5}/g, /L{1,5}/g, /y{1,4}/g, /Y{1,4}/g]; }
|
|
3
|
-
static { this.NG_PRIME_FORMAT_OTHER = [
|
|
4
|
-
/G{1,5}/g,
|
|
5
|
-
/w{1,2}/g,
|
|
6
|
-
/W/g,
|
|
7
|
-
/a{1,5}/g,
|
|
8
|
-
/B{1,5}/g,
|
|
9
|
-
/b{1,5}/g,
|
|
10
|
-
/h{1,2}/g,
|
|
11
|
-
/H{1,2}/g,
|
|
12
|
-
/m{1,2}/g,
|
|
13
|
-
/s{1,2}/g,
|
|
14
|
-
/S{1,3}/g,
|
|
15
|
-
/z{1,4}/g,
|
|
16
|
-
/Z{1,5}/g,
|
|
17
|
-
/O{1,4}/g
|
|
18
|
-
]; }
|
|
19
|
-
static { this.NG_PRIME_FORMAT_MAP = {
|
|
20
|
-
// days
|
|
21
|
-
d: 'd',
|
|
22
|
-
dd: 'dd',
|
|
23
|
-
E: 'D',
|
|
24
|
-
EE: 'D',
|
|
25
|
-
EEE: 'D',
|
|
26
|
-
EEEE: 'DD',
|
|
27
|
-
EEEEE: 'D',
|
|
28
|
-
EEEEEE: 'D',
|
|
29
|
-
c: 'd',
|
|
30
|
-
cc: 'dd',
|
|
31
|
-
ccc: 'D',
|
|
32
|
-
cccc: 'DD',
|
|
33
|
-
ccccc: 'D',
|
|
34
|
-
cccccc: 'D',
|
|
35
|
-
// months
|
|
36
|
-
M: 'm',
|
|
37
|
-
MM: 'mm',
|
|
38
|
-
MMM: 'M',
|
|
39
|
-
MMMM: 'MM',
|
|
40
|
-
MMMMM: 'M',
|
|
41
|
-
L: 'm',
|
|
42
|
-
LL: 'mm',
|
|
43
|
-
LLL: 'M',
|
|
44
|
-
LLLL: 'MM',
|
|
45
|
-
LLLLL: 'M',
|
|
46
|
-
// year
|
|
47
|
-
y: 'y',
|
|
48
|
-
yy: 'y',
|
|
49
|
-
yyy: 'yy',
|
|
50
|
-
yyyy: 'yy',
|
|
51
|
-
Y: 'y',
|
|
52
|
-
YY: 'y',
|
|
53
|
-
YYY: 'yy',
|
|
54
|
-
YYYY: 'yy'
|
|
55
|
-
}; }
|
|
56
|
-
static padNumber(num, size = 2) {
|
|
57
|
-
let str = String(num);
|
|
58
|
-
while (str.length < size) {
|
|
59
|
-
str = '0' + str;
|
|
60
|
-
}
|
|
61
|
-
return str;
|
|
62
|
-
}
|
|
63
|
-
static toIsoString(value, type = 'date-time', dateTimeOpts = {}) {
|
|
64
|
-
if (typeof value === 'string') {
|
|
65
|
-
value = new Date(value);
|
|
66
|
-
}
|
|
67
|
-
if (typeof value === 'number') {
|
|
68
|
-
value = new Date(value);
|
|
69
|
-
}
|
|
70
|
-
if (!(value instanceof Date)) {
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
if (type === 'date') {
|
|
74
|
-
// date only, no time part (and timezone, millis, utc does not matter ...)
|
|
75
|
-
return value.getFullYear() + '-' + DateUtil.padNumber(value.getMonth() + 1) + '-' + DateUtil.padNumber(value.getDate());
|
|
76
|
-
}
|
|
77
|
-
if (dateTimeOpts.utc) {
|
|
78
|
-
let str = value.toISOString();
|
|
79
|
-
if (dateTimeOpts.noMillis) {
|
|
80
|
-
const dotIdx = str.lastIndexOf('.');
|
|
81
|
-
str = str.substring(0, dotIdx) + str.substring(dotIdx + 4, str.length);
|
|
82
|
-
}
|
|
83
|
-
if (dateTimeOpts.noTimezone) {
|
|
84
|
-
str = str.substring(0, str.length - 1);
|
|
85
|
-
}
|
|
86
|
-
return str;
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
let base = value.getFullYear() +
|
|
90
|
-
'-' +
|
|
91
|
-
DateUtil.padNumber(value.getMonth() + 1) +
|
|
92
|
-
'-' +
|
|
93
|
-
DateUtil.padNumber(value.getDate()) +
|
|
94
|
-
'T' +
|
|
95
|
-
DateUtil.padNumber(value.getHours()) +
|
|
96
|
-
':' +
|
|
97
|
-
DateUtil.padNumber(value.getMinutes()) +
|
|
98
|
-
':' +
|
|
99
|
-
DateUtil.padNumber(value.getSeconds());
|
|
100
|
-
if (!dateTimeOpts.noMillis) {
|
|
101
|
-
base += '.' + DateUtil.padNumber(value.getMilliseconds());
|
|
102
|
-
}
|
|
103
|
-
if (!dateTimeOpts.noTimezone) {
|
|
104
|
-
const tzo = -value.getTimezoneOffset(), dif = tzo >= 0 ? '+' : '-';
|
|
105
|
-
base = base + (dif + DateUtil.padNumber(Math.floor(Math.abs(tzo) / 60)) + ':' + DateUtil.padNumber(Math.abs(tzo) % 60));
|
|
106
|
-
}
|
|
107
|
-
return base;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
static fromAngularToPrimeDateFormat(ngDateFormat) {
|
|
111
|
-
let primeDateFormat = ngDateFormat;
|
|
112
|
-
for (const regex of DateUtil.NG_PRIME_FORMAT_OTHER) {
|
|
113
|
-
primeDateFormat = primeDateFormat.replace(regex, ' ');
|
|
114
|
-
}
|
|
115
|
-
for (const regex of DateUtil.NG_PRIME_FORMAT_SUPPORTED) {
|
|
116
|
-
const matches = [...primeDateFormat.matchAll(regex)].reverse();
|
|
117
|
-
for (const match of matches) {
|
|
118
|
-
if (match.index) {
|
|
119
|
-
const matchStr = match[0];
|
|
120
|
-
const replacement = DateUtil.NG_PRIME_FORMAT_MAP[matchStr] ?? match[0];
|
|
121
|
-
primeDateFormat = primeDateFormat.substring(0, match.index) + replacement + primeDateFormat.substring(match.index + matchStr.length);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
primeDateFormat = primeDateFormat.replace(/\s+\W\s+/g, ' ');
|
|
126
|
-
primeDateFormat = primeDateFormat.replace(/\s\s+/g, ' ');
|
|
127
|
-
return primeDateFormat.trim();
|
|
128
|
-
}
|
|
129
|
-
static fromAngularDateFormatHasTime(ngDateFormat) {
|
|
130
|
-
return /[hHmsS]/.test(ngDateFormat);
|
|
131
|
-
}
|
|
132
|
-
static fromAngularDateFormatHasSeconds(ngDateFormat) {
|
|
133
|
-
return /[sS]/.test(ngDateFormat);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9zcmMvdXRpbHMvZGF0ZS51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBTyxRQUFRO2FBQ08sOEJBQXlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQzthQUMxRywwQkFBcUIsR0FBRztRQUM1QyxTQUFTO1FBQ1QsU0FBUztRQUNULElBQUk7UUFDSixTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNaLENBQUM7YUFDc0Isd0JBQW1CLEdBQUc7UUFDMUMsT0FBTztRQUNQLENBQUMsRUFBRSxHQUFHO1FBQ04sRUFBRSxFQUFFLElBQUk7UUFDUixDQUFDLEVBQUUsR0FBRztRQUNOLEVBQUUsRUFBRSxHQUFHO1FBQ1AsR0FBRyxFQUFFLEdBQUc7UUFDUixJQUFJLEVBQUUsSUFBSTtRQUNWLEtBQUssRUFBRSxHQUFHO1FBQ1YsTUFBTSxFQUFFLEdBQUc7UUFDWCxDQUFDLEVBQUUsR0FBRztRQUNOLEVBQUUsRUFBRSxJQUFJO1FBQ1IsR0FBRyxFQUFFLEdBQUc7UUFDUixJQUFJLEVBQUUsSUFBSTtRQUNWLEtBQUssRUFBRSxHQUFHO1FBQ1YsTUFBTSxFQUFFLEdBQUc7UUFDWCxTQUFTO1FBQ1QsQ0FBQyxFQUFFLEdBQUc7UUFDTixFQUFFLEVBQUUsSUFBSTtRQUNSLEdBQUcsRUFBRSxHQUFHO1FBQ1IsSUFBSSxFQUFFLElBQUk7UUFDVixLQUFLLEVBQUUsR0FBRztRQUNWLENBQUMsRUFBRSxHQUFHO1FBQ04sRUFBRSxFQUFFLElBQUk7UUFDUixHQUFHLEVBQUUsR0FBRztRQUNSLElB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QUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxQixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUMsUUFBd0IsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdkYsZUFBZSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxXQUFXLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDeEk7YUFDSjtTQUNKO1FBQ0QsZUFBZSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVELGVBQWUsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUV6RCxPQUFPLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU0sTUFBTSxDQUFDLDRCQUE0QixDQUFDLFlBQW9CO1FBQzNELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sTUFBTSxDQUFDLCtCQUErQixDQUFDLFlBQW9CO1FBQzlELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgdG9Jc29TdHJpbmdUeXBlT3B0VHlwZSA9ICdkYXRlJyB8ICdkYXRlLXRpbWUnIHwgJ2RhdGVUaW1lJztcbmV4cG9ydCB0eXBlIHRvSXNvU3RyaW5nRGF0ZVRpbWVPcHRzVHlwZSA9IHt1dGM/OiBib29sZWFuOyBub1RpbWV6b25lPzogYm9vbGVhbjsgbm9NaWxsaXM/OiBib29sZWFufTtcblxuZXhwb3J0IGNsYXNzIERhdGVVdGlsIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBOR19QUklNRV9GT1JNQVRfU1VQUE9SVEVEID0gWy9kezEsMn0vZywgL0V7MSw1fS9nLCAvY3sxLDV9L2csIC9NezEsNX0vZywgL0x7MSw1fS9nLCAveXsxLDR9L2csIC9ZezEsNH0vZ107XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTkdfUFJJTUVfRk9STUFUX09USEVSID0gW1xuICAgICAgICAvR3sxLDV9L2csXG4gICAgICAgIC93ezEsMn0vZyxcbiAgICAgICAgL1cvZyxcbiAgICAgICAgL2F7MSw1fS9nLFxuICAgICAgICAvQnsxLDV9L2csXG4gICAgICAgIC9iezEsNX0vZyxcbiAgICAgICAgL2h7MSwyfS9nLFxuICAgICAgICAvSHsxLDJ9L2csXG4gICAgICAgIC9tezEsMn0vZyxcbiAgICAgICAgL3N7MSwyfS9nLFxuICAgICAgICAvU3sxLDN9L2csXG4gICAgICAgIC96ezEsNH0vZyxcbiAgICAgICAgL1p7MSw1fS9nLFxuICAgICAgICAvT3sxLDR9L2dcbiAgICBdO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE5HX1BSSU1FX0ZPUk1BVF9NQVAgPSB7XG4gICAgICAgIC8vIGRheXNcbiAgICAgICAgZDogJ2QnLFxuICAgICAgICBkZDogJ2RkJyxcbiAgICAgICAgRTogJ0QnLFxuICAgICAgICBFRTogJ0QnLFxuICAgICAgICBFRUU6ICdEJyxcbiAgICAgICAgRUVFRTogJ0REJyxcbiAgICAgICAgRUVFRUU6ICdEJyxcbiAgICAgICAgRUVFRUVFOiAnRCcsXG4gICAgICAgIGM6ICdkJyxcbiAgICAgICAgY2M6ICdkZCcsXG4gICAgICAgIGNjYzogJ0QnLFxuICAgICAgICBjY2NjOiAnREQnLFxuICAgICAgICBjY2NjYzogJ0QnLFxuICAgICAgICBjY2NjY2M6ICdEJyxcbiAgICAgICAgLy8gbW9udGhzXG4gICAgICAgIE06ICdtJyxcbiAgICAgICAgTU06ICdtbScsXG4gICAgICAgIE1NTTogJ00nLFxuICAgICAgICBNTU1NOiAnTU0nLFxuICAgICAgICBNTU1NTTogJ00nLFxuICAgICAgICBMOiAnbScsXG4gICAgICAgIExMOiAnbW0nLFxuICAgICAgICBMTEw6ICdNJyxcbiAgICAgICAgTExMTDogJ01NJyxcbiAgICAgICAgTExMTEw6ICdNJyxcbiAgICAgICAgLy8geWVhclxuICAgICAgICB5OiAneScsXG4gICAgICAgIHl5OiAneScsXG4gICAgICAgIHl5eTogJ3l5JyxcbiAgICAgICAgeXl5eTogJ3l5JyxcbiAgICAgICAgWTogJ3knLFxuICAgICAgICBZWTogJ3knLFxuICAgICAgICBZWVk6ICd5eScsXG4gICAgICAgIFlZWVk6ICd5eSdcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcGFkTnVtYmVyKG51bTogbnVtYmVyLCBzaXplID0gMikge1xuICAgICAgICBsZXQgc3RyID0gU3RyaW5nKG51bSk7XG4gICAgICAgIHdoaWxlIChzdHIubGVuZ3RoIDwgc2l6ZSkge1xuICAgICAgICAgICAgc3RyID0gJzAnICsgc3RyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0b0lzb1N0cmluZyh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgdHlwZT86ICdkYXRlJyk6IHN0cmluZztcbiAgICBwdWJsaWMgc3RhdGljIHRvSXNvU3RyaW5nKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCB0eXBlOiAnZGF0ZS10aW1lJyB8ICdkYXRlVGltZScsIGRhdGVUaW1lT3B0cz86IHRvSXNvU3RyaW5nRGF0ZVRpbWVPcHRzVHlwZSk6IHN0cmluZztcbiAgICBwdWJsaWMgc3RhdGljIHRvSXNvU3RyaW5nKHZhbHVlOiB1bmRlZmluZWQgfCBudWxsIHwgdW5rbm93biwgdHlwZT86ICdkYXRlJyk6IG51bGw7XG4gICAgcHVibGljIHN0YXRpYyB0b0lzb1N0cmluZyh2YWx1ZTogdW5kZWZpbmVkIHwgbnVsbCB8IHVua25vd24sIHR5cGU6ICdkYXRlLXRpbWUnIHwgJ2RhdGVUaW1lJywgZGF0ZVRpbWVPcHRzPzogdG9Jc29TdHJpbmdEYXRlVGltZU9wdHNUeXBlKTogbnVsbDtcbiAgICBwdWJsaWMgc3RhdGljIHRvSXNvU3RyaW5nKHZhbHVlOiB1bmtub3duLCB0eXBlPzogdG9Jc29TdHJpbmdUeXBlT3B0VHlwZSwgZGF0ZVRpbWVPcHRzPzogdG9Jc29TdHJpbmdEYXRlVGltZU9wdHNUeXBlKTogc3RyaW5nIHwgbnVsbDtcbiAgICBwdWJsaWMgc3RhdGljIHRvSXNvU3RyaW5nKHZhbHVlOiB1bmtub3duLCB0eXBlOiB0b0lzb1N0cmluZ1R5cGVPcHRUeXBlID0gJ2RhdGUtdGltZScsIGRhdGVUaW1lT3B0czogdG9Jc29TdHJpbmdEYXRlVGltZU9wdHNUeXBlID0ge30pOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICAvLyBkYXRlIG9ubHksIG5vIHRpbWUgcGFydCAoYW5kIHRpbWV6b25lLCBtaWxsaXMsIHV0YyBkb2VzIG5vdCBtYXR0ZXIgLi4uKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmdldEZ1bGxZZWFyKCkgKyAnLScgKyBEYXRlVXRpbC5wYWROdW1iZXIodmFsdWUuZ2V0TW9udGgoKSArIDEpICsgJy0nICsgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldERhdGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGVUaW1lT3B0cy51dGMpIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSB2YWx1ZS50b0lTT1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKGRhdGVUaW1lT3B0cy5ub01pbGxpcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvdElkeCA9IHN0ci5sYXN0SW5kZXhPZignLicpO1xuICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgZG90SWR4KSArIHN0ci5zdWJzdHJpbmcoZG90SWR4ICsgNCwgc3RyLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0ZVRpbWVPcHRzLm5vVGltZXpvbmUpIHtcbiAgICAgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIHN0ci5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYmFzZSA9XG4gICAgICAgICAgICAgICAgdmFsdWUuZ2V0RnVsbFllYXIoKSArXG4gICAgICAgICAgICAgICAgJy0nICtcbiAgICAgICAgICAgICAgICBEYXRlVXRpbC5wYWROdW1iZXIodmFsdWUuZ2V0TW9udGgoKSArIDEpICtcbiAgICAgICAgICAgICAgICAnLScgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXREYXRlKCkpICtcbiAgICAgICAgICAgICAgICAnVCcgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRIb3VycygpKSArXG4gICAgICAgICAgICAgICAgJzonICtcbiAgICAgICAgICAgICAgICBEYXRlVXRpbC5wYWROdW1iZXIodmFsdWUuZ2V0TWludXRlcygpKSArXG4gICAgICAgICAgICAgICAgJzonICtcbiAgICAgICAgICAgICAgICBEYXRlVXRpbC5wYWROdW1iZXIodmFsdWUuZ2V0U2Vjb25kcygpKTtcblxuICAgICAgICAgICAgaWYgKCFkYXRlVGltZU9wdHMubm9NaWxsaXMpIHtcbiAgICAgICAgICAgICAgICBiYXNlICs9ICcuJyArIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNaWxsaXNlY29uZHMoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRhdGVUaW1lT3B0cy5ub1RpbWV6b25lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHpvID0gLXZhbHVlLmdldFRpbWV6b25lT2Zmc2V0KCksXG4gICAgICAgICAgICAgICAgICAgIGRpZiA9IHR6byA+PSAwID8gJysnIDogJy0nO1xuXG4gICAgICAgICAgICAgICAgYmFzZSA9IGJhc2UgKyAoZGlmICsgRGF0ZVV0aWwucGFkTnVtYmVyKE1hdGguZmxvb3IoTWF0aC5hYnModHpvKSAvIDYwKSkgKyAnOicgKyBEYXRlVXRpbC5wYWROdW1iZXIoTWF0aC5hYnModHpvKSAlIDYwKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQW5ndWxhclRvUHJpbWVEYXRlRm9ybWF0KG5nRGF0ZUZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHByaW1lRGF0ZUZvcm1hdCA9IG5nRGF0ZUZvcm1hdDtcbiAgICAgICAgZm9yIChjb25zdCByZWdleCBvZiBEYXRlVXRpbC5OR19QUklNRV9GT1JNQVRfT1RIRVIpIHtcbiAgICAgICAgICAgIHByaW1lRGF0ZUZvcm1hdCA9IHByaW1lRGF0ZUZvcm1hdC5yZXBsYWNlKHJlZ2V4LCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcmVnZXggb2YgRGF0ZVV0aWwuTkdfUFJJTUVfRk9STUFUX1NVUFBPUlRFRCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IFsuLi5wcmltZURhdGVGb3JtYXQubWF0Y2hBbGwocmVnZXgpXS5yZXZlcnNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2guaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hTdHIgPSBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSBEYXRlVXRpbC5OR19QUklNRV9GT1JNQVRfTUFQW21hdGNoU3RyIGFzIGtleW9mIG9iamVjdF0gPz8gbWF0Y2hbMF07XG4gICAgICAgICAgICAgICAgICAgIHByaW1lRGF0ZUZvcm1hdCA9IHByaW1lRGF0ZUZvcm1hdC5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXgpICsgcmVwbGFjZW1lbnQgKyBwcmltZURhdGVGb3JtYXQuc3Vic3RyaW5nKG1hdGNoLmluZGV4ICsgbWF0Y2hTdHIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnJlcGxhY2UoL1xccytcXFdcXHMrL2csICcgJyk7XG4gICAgICAgIHByaW1lRGF0ZUZvcm1hdCA9IHByaW1lRGF0ZUZvcm1hdC5yZXBsYWNlKC9cXHNcXHMrL2csICcgJyk7XG5cbiAgICAgICAgcmV0dXJuIHByaW1lRGF0ZUZvcm1hdC50cmltKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQW5ndWxhckRhdGVGb3JtYXRIYXNUaW1lKG5nRGF0ZUZvcm1hdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAvW2hIbXNTXS8udGVzdChuZ0RhdGVGb3JtYXQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUFuZ3VsYXJEYXRlRm9ybWF0SGFzU2Vjb25kcyhuZ0RhdGVGb3JtYXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gL1tzU10vLnRlc3QobmdEYXRlRm9ybWF0KTtcbiAgICB9XG59XG4iXX0=
|