@mediusinc/mng-commons 4.1.0-rc.0 → 5.0.0-rc.0-c31d5206
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/assets/i18n/en.json +13 -66
- package/assets/i18n/sl.json +12 -67
- package/data-api/README.md +3 -0
- package/data-api/class-dto/README.md +3 -0
- package/data-api/class-dto/helpers/tableview-crud-create.d.ts +40 -0
- package/data-api/class-dto/index.d.ts +7 -0
- package/data-api/class-dto/models/query-result.model.d.ts +13 -0
- package/data-api/class-dto/obsolete/README.md +3 -0
- package/data-api/class-dto/obsolete/helpers/query-param-convert.d.ts +23 -0
- package/data-api/class-dto/obsolete/helpers/tableview-crud-create.d.ts +22 -0
- package/data-api/class-dto/obsolete/index.d.ts +14 -0
- package/data-api/class-dto/obsolete/models/builders/query-param.builder.d.ts +36 -0
- package/{lib/api → data-api/class-dto/obsolete}/models/filter-param.model.d.ts +1 -1
- package/{lib/api → data-api/class-dto/obsolete}/models/query-param.model.d.ts +1 -1
- package/{lib/api → data-api/class-dto/obsolete}/models/query-result.model.d.ts +1 -1
- package/data-api/class-dto/obsolete/provide.d.ts +9 -0
- package/data-api/class-dto/obsolete/services/api.abstract.service.d.ts +36 -0
- package/{lib/api → data-api/class-dto/obsolete}/services/crud-api.abstract.service.d.ts +20 -5
- package/data-api/class-dto/obsolete/services/get-all-api.abstract.service.d.ts +30 -0
- package/data-api/class-dto/obsolete/tableview/tableview-crud.data-provider.d.ts +28 -0
- package/data-api/class-dto/obsolete/utils/query-param-map.util.d.ts +22 -0
- package/{lib/api/utils/object-serializer.util.d.ts → data-api/class-dto/serder/object-serializer.d.ts} +1 -1
- package/{lib/api → data-api/class-dto}/services/api.abstract.service.d.ts +2 -4
- package/data-api/class-dto/services/crud-api.abstract.service.d.ts +25 -0
- package/data-api/class-dto/services/get-all-api.abstract.service.d.ts +14 -0
- package/data-api/class-dto/tableview/tableview-crud.data-provider.d.ts +17 -0
- package/data-api/helpers/get-all-params.d.ts +69 -0
- package/data-api/helpers/tableview-get-all-params-create.d.ts +14 -0
- package/data-api/index.d.ts +5 -0
- package/data-api/models/request-params.model.d.ts +61 -0
- package/data-api/rxjs/map-to-data-list.operator.d.ts +9 -0
- package/data-api/types/extract-get-all-params.type.d.ts +14 -0
- package/esm2022/data-api/class-dto/helpers/tableview-crud-create.mjs +40 -0
- package/esm2022/data-api/class-dto/index.mjs +13 -0
- package/esm2022/data-api/class-dto/mediusinc-mng-commons-data-api-class-dto.mjs +5 -0
- package/esm2022/data-api/class-dto/models/query-result.model.mjs +24 -0
- package/esm2022/data-api/class-dto/obsolete/helpers/query-param-convert.mjs +103 -0
- package/esm2022/data-api/class-dto/obsolete/helpers/tableview-crud-create.mjs +21 -0
- package/esm2022/data-api/class-dto/obsolete/index.mjs +21 -0
- package/esm2022/data-api/class-dto/obsolete/mediusinc-mng-commons-data-api-class-dto-obsolete.mjs +5 -0
- package/esm2022/data-api/class-dto/obsolete/models/builders/query-param.builder.mjs +83 -0
- package/esm2022/data-api/class-dto/obsolete/models/filter-match-type.model.mjs +27 -0
- package/esm2022/data-api/class-dto/obsolete/models/filter-param.model.mjs +33 -0
- package/esm2022/data-api/class-dto/obsolete/models/query-mode.model.mjs +18 -0
- package/esm2022/data-api/class-dto/obsolete/models/query-param.model.mjs +68 -0
- package/esm2022/data-api/class-dto/obsolete/models/query-result.model.mjs +24 -0
- package/esm2022/data-api/class-dto/obsolete/provide.mjs +40 -0
- package/esm2022/data-api/class-dto/obsolete/services/api.abstract.service.mjs +70 -0
- package/esm2022/data-api/class-dto/obsolete/services/crud-api.abstract.service.mjs +83 -0
- package/esm2022/data-api/class-dto/obsolete/services/get-all-api.abstract.service.mjs +38 -0
- package/esm2022/data-api/class-dto/obsolete/tableview/tableview-crud.data-provider.mjs +51 -0
- package/esm2022/data-api/class-dto/obsolete/utils/query-param-map.util.mjs +57 -0
- package/esm2022/data-api/class-dto/serder/object-serializer.mjs +184 -0
- package/esm2022/data-api/class-dto/services/api.abstract.service.mjs +55 -0
- package/esm2022/data-api/class-dto/services/crud-api.abstract.service.mjs +82 -0
- package/esm2022/data-api/class-dto/services/get-all-api.abstract.service.mjs +49 -0
- package/esm2022/data-api/class-dto/tableview/tableview-crud.data-provider.mjs +49 -0
- package/esm2022/data-api/helpers/get-all-params.mjs +180 -0
- package/esm2022/data-api/helpers/tableview-get-all-params-create.mjs +18 -0
- package/esm2022/data-api/index.mjs +10 -0
- package/esm2022/data-api/mediusinc-mng-commons-data-api.mjs +5 -0
- package/esm2022/data-api/models/request-params.model.mjs +2 -0
- package/esm2022/data-api/rxjs/map-to-data-list.operator.mjs +19 -0
- package/esm2022/data-api/types/extract-get-all-params.type.mjs +2 -0
- package/esm2022/index.mjs +3 -6
- package/esm2022/lib/components/action/action.component.mjs +4 -5
- package/esm2022/lib/components/action/editor/injector-context/action-editor-injector-context.component.mjs +2 -2
- package/esm2022/lib/components/action/models/action-execution.model.mjs +5 -4
- package/esm2022/lib/components/action/route/action-route.component.mjs +1 -2
- package/esm2022/lib/components/action/table/action-table.component.mjs +4 -6
- package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +29 -17
- package/esm2022/lib/components/form/dropdown/dropdown.component.mjs +3 -7
- package/esm2022/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +20 -18
- package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +2 -2
- package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +23 -12
- package/esm2022/lib/components/table/column-filter-full/column-filter-full.component.mjs +162 -33
- package/esm2022/lib/components/table/column-value/column-value.component.mjs +3 -3
- package/esm2022/lib/components/table/models/table.event.mjs +1 -1
- package/esm2022/lib/components/table/models/table.interface.mjs +1 -1
- package/esm2022/lib/components/table/table-column-filter-class/table-column-filter-class.pipe.mjs +4 -4
- package/esm2022/lib/components/table/table.component.mjs +117 -191
- package/esm2022/lib/components/tableview/actions/tableview-default-actions.mjs +215 -0
- package/esm2022/lib/components/tableview/builders/tableview-builder.mjs +162 -0
- package/esm2022/lib/components/tableview/helpers/tableview-create.mjs +24 -0
- package/esm2022/lib/components/tableview/index.mjs +5 -2
- package/esm2022/lib/components/tableview/models/tableview.model.mjs +2 -0
- package/esm2022/lib/components/tableview/route/tableview-route.component.mjs +7 -39
- package/esm2022/lib/components/tableview/tableview.component.mjs +4 -4
- package/esm2022/lib/data-providers/editor.data-provider.mjs +13 -13
- package/esm2022/lib/data-providers/index.mjs +1 -2
- package/esm2022/lib/data-providers/lookup.data-provider.mjs +1 -1
- package/esm2022/lib/data-providers/table.data-provider.mjs +4 -5
- package/esm2022/lib/data-providers/tableview.data-provider.mjs +1 -1
- package/esm2022/lib/descriptors/action/action-confirmation.descriptor.mjs +1 -1
- package/esm2022/lib/descriptors/action/action-editor.descriptor.mjs +10 -6
- package/esm2022/lib/descriptors/action/action.descriptor.mjs +2 -3
- package/esm2022/lib/descriptors/editor/editor.descriptor.mjs +13 -17
- package/esm2022/lib/descriptors/editor/field-lookup.descriptor.mjs +12 -17
- package/esm2022/lib/descriptors/editor/field.descriptor.mjs +5 -8
- package/esm2022/lib/descriptors/editor/internal/editor-fields.model.mjs +1 -1
- package/esm2022/lib/descriptors/filter/filter-lookup.descriptor.mjs +28 -52
- package/esm2022/lib/descriptors/filter/filter.descriptor.mjs +40 -23
- package/esm2022/lib/descriptors/model/enum.descriptor.mjs +31 -0
- package/esm2022/lib/descriptors/model/index.mjs +3 -1
- package/esm2022/lib/descriptors/model/model.descriptor.mjs +10 -1
- package/esm2022/lib/descriptors/model/type.descriptor.mjs +11 -0
- package/esm2022/lib/descriptors/table/column.descriptor.mjs +12 -107
- package/esm2022/lib/descriptors/table/index.mjs +2 -1
- package/esm2022/lib/descriptors/table/internal/table-columns.model.mjs +1 -1
- package/esm2022/lib/descriptors/table/internal/table.model.mjs +1 -1
- package/esm2022/lib/descriptors/table/sort.descriptor.mjs +45 -0
- package/esm2022/lib/descriptors/table/table.descriptor.mjs +208 -57
- package/esm2022/lib/descriptors/tableview/internal/tableview.model.mjs +1 -1
- package/esm2022/lib/descriptors/tableview/tableview.descriptor.mjs +114 -17
- package/esm2022/lib/descriptors/types/filter.type.mjs +1 -19
- package/esm2022/lib/descriptors/types/table.type.mjs +1 -5
- package/esm2022/lib/error/error.handler.mjs +1 -1
- package/esm2022/lib/helpers/data-provider-executors.mjs +80 -0
- package/esm2022/lib/models/data-list.model.mjs +2 -0
- package/esm2022/lib/models/filter-match.model.mjs +105 -0
- package/esm2022/lib/models/index.mjs +3 -1
- package/esm2022/lib/models/view-container.model.mjs +1 -1
- package/esm2022/lib/pipes/enum.pipe.mjs +6 -6
- package/esm2022/lib/provide.mjs +101 -0
- package/esm2022/lib/registry/type.registry.mjs +3 -10
- package/esm2022/lib/router/models/router.model.mjs +1 -1
- package/esm2022/lib/router/tableview-route-builder.mjs +1 -1
- package/esm2022/lib/services/action/action-executor.service.mjs +54 -32
- package/esm2022/lib/services/commons.service.mjs +1 -37
- package/esm2022/lib/services/data-provider-executor.service.mjs +52 -0
- package/esm2022/lib/services/index.mjs +2 -1
- package/esm2022/lib/services/view/view-container.service.mjs +1 -1
- package/esm2022/lib/types/action-descriptor.types.mjs +1 -1
- package/esm2022/lib/types/type.model.mjs +1 -1
- package/esm2022/lib/utils/data-list-params.util.mjs +416 -0
- package/esm2022/lib/utils/date.util.mjs +8 -2
- package/esm2022/lib/utils/enum.util.mjs +2 -1
- package/esm2022/lib/utils/error.util.mjs +3 -3
- package/esm2022/lib/utils/export.util.mjs +1 -1
- package/esm2022/lib/utils/index.mjs +2 -2
- package/esm2022/lib/utils/route.util.mjs +1 -2
- package/fesm2022/mediusinc-mng-commons-data-api-class-dto-obsolete.mjs +698 -0
- package/fesm2022/mediusinc-mng-commons-data-api-class-dto-obsolete.mjs.map +1 -0
- package/fesm2022/mediusinc-mng-commons-data-api-class-dto.mjs +480 -0
- package/fesm2022/mediusinc-mng-commons-data-api-class-dto.mjs.map +1 -0
- package/fesm2022/mediusinc-mng-commons-data-api.mjs +224 -0
- package/fesm2022/mediusinc-mng-commons-data-api.mjs.map +1 -0
- package/fesm2022/mediusinc-mng-commons.mjs +2634 -2549
- package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
- package/index.d.ts +2 -4
- package/lib/components/action/action.component.d.ts +13 -13
- package/lib/components/action/models/action-execution.model.d.ts +47 -46
- package/lib/components/action/table/action-table.component.d.ts +15 -16
- package/lib/components/form/autocomplete/autocomplete.component.d.ts +1 -1
- package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +3 -5
- package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +10 -10
- package/lib/components/table/column-filter-full/column-filter-full.component.d.ts +25 -9
- package/lib/components/table/models/table.event.d.ts +2 -2
- package/lib/components/table/models/table.interface.d.ts +4 -1
- package/lib/components/table/table-column-filter-class/table-column-filter-class.pipe.d.ts +2 -2
- package/lib/components/table/table.component.d.ts +19 -18
- package/lib/components/tableview/actions/tableview-default-actions.d.ts +36 -0
- package/lib/components/tableview/builders/tableview-builder.d.ts +115 -0
- package/lib/components/tableview/helpers/tableview-create.d.ts +16 -0
- package/lib/components/tableview/index.d.ts +4 -1
- package/lib/components/tableview/models/tableview.model.d.ts +8 -0
- package/lib/components/tableview/route/tableview-route.component.d.ts +5 -14
- package/lib/components/tableview/tableview.component.d.ts +12 -12
- package/lib/data-providers/editor.data-provider.d.ts +12 -12
- package/lib/data-providers/index.d.ts +0 -1
- package/lib/data-providers/lookup.data-provider.d.ts +2 -2
- package/lib/data-providers/table.data-provider.d.ts +25 -25
- package/lib/data-providers/tableview.data-provider.d.ts +18 -18
- package/lib/descriptors/action/action-confirmation.descriptor.d.ts +1 -1
- package/lib/descriptors/action/action-editor.descriptor.d.ts +20 -17
- package/lib/descriptors/editor/editor.descriptor.d.ts +8 -12
- package/lib/descriptors/editor/field-base.descriptor.d.ts +3 -3
- package/lib/descriptors/editor/field-lookup.descriptor.d.ts +11 -11
- package/lib/descriptors/editor/field-many.descriptor.d.ts +4 -4
- package/lib/descriptors/editor/field.descriptor.d.ts +2 -2
- package/lib/descriptors/editor/internal/editor-fields.model.d.ts +6 -5
- package/lib/descriptors/filter/filter-lookup.descriptor.d.ts +15 -14
- package/lib/descriptors/filter/filter.descriptor.d.ts +17 -18
- package/lib/descriptors/model/enum.descriptor.d.ts +14 -0
- package/lib/descriptors/model/index.d.ts +2 -0
- package/lib/descriptors/model/model.descriptor.d.ts +9 -0
- package/lib/descriptors/model/type.descriptor.d.ts +5 -0
- package/lib/descriptors/table/column.descriptor.d.ts +10 -24
- package/lib/descriptors/table/index.d.ts +1 -0
- package/lib/descriptors/table/internal/table-columns.model.d.ts +36 -5
- package/lib/descriptors/table/internal/table.model.d.ts +5 -2
- package/lib/descriptors/table/sort.descriptor.d.ts +17 -0
- package/lib/descriptors/table/table.descriptor.d.ts +57 -33
- package/lib/descriptors/tableview/internal/tableview.model.d.ts +3 -3
- package/lib/descriptors/tableview/tableview.descriptor.d.ts +49 -19
- package/lib/descriptors/types/filter.type.d.ts +0 -17
- package/lib/descriptors/types/table.type.d.ts +0 -3
- package/lib/error/error.handler.d.ts +1 -1
- package/lib/helpers/data-provider-executors.d.ts +19 -0
- package/lib/models/data-list.model.d.ts +27 -0
- package/lib/models/filter-match.model.d.ts +36 -0
- package/lib/models/index.d.ts +2 -0
- package/lib/models/view-container.model.d.ts +2 -2
- package/lib/pipes/enum.pipe.d.ts +2 -2
- package/lib/provide.d.ts +10 -0
- package/lib/router/models/router.model.d.ts +1 -1
- package/lib/router/tableview-route-builder.d.ts +1 -2
- package/lib/services/action/action-executor.service.d.ts +18 -16
- package/lib/services/data-provider-executor.service.d.ts +60 -0
- package/lib/services/index.d.ts +1 -0
- package/lib/services/view/view-container.service.d.ts +11 -11
- package/lib/types/action-descriptor.types.d.ts +2 -2
- package/lib/types/type.model.d.ts +1 -3
- package/lib/utils/data-list-params.util.d.ts +84 -0
- package/lib/utils/date.util.d.ts +3 -1
- package/lib/utils/enum.util.d.ts +4 -3
- package/lib/utils/export.util.d.ts +1 -1
- package/lib/utils/index.d.ts +1 -1
- package/openapi/angular/modelEnum.mustache +0 -3
- package/package.json +20 -2
- package/esm2022/lib/api/models/builders/query-param.builder.mjs +0 -59
- package/esm2022/lib/api/models/filter-match-type.model.mjs +0 -27
- package/esm2022/lib/api/models/filter-param.model.mjs +0 -33
- package/esm2022/lib/api/models/index.mjs +0 -7
- package/esm2022/lib/api/models/query-mode.model.mjs +0 -18
- package/esm2022/lib/api/models/query-param.model.mjs +0 -68
- package/esm2022/lib/api/models/query-result.model.mjs +0 -35
- package/esm2022/lib/api/services/api.abstract.service.mjs +0 -58
- package/esm2022/lib/api/services/crud-api.abstract.service.mjs +0 -75
- package/esm2022/lib/api/services/get-all-api.abstract.service.mjs +0 -30
- package/esm2022/lib/api/services/index.mjs +0 -4
- package/esm2022/lib/api/utils/index.mjs +0 -3
- package/esm2022/lib/api/utils/medius-rest.util.mjs +0 -293
- package/esm2022/lib/api/utils/object-serializer.util.mjs +0 -185
- package/esm2022/lib/components/tableview/route/tableview-route.abstract.component.mjs +0 -158
- package/esm2022/lib/data-providers/tableview-crud.data-provider.mjs +0 -32
- package/esm2022/lib/provide-commons.mjs +0 -88
- package/esm2022/lib/utils/action-data-provider.util.mjs +0 -171
- package/lib/api/models/builders/query-param.builder.d.ts +0 -13
- package/lib/api/models/index.d.ts +0 -6
- package/lib/api/services/get-all-api.abstract.service.d.ts +0 -14
- package/lib/api/services/index.d.ts +0 -3
- package/lib/api/utils/index.d.ts +0 -2
- package/lib/api/utils/medius-rest.util.d.ts +0 -32
- package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +0 -35
- package/lib/data-providers/tableview-crud.data-provider.d.ts +0 -12
- package/lib/provide-commons.d.ts +0 -3
- package/lib/utils/action-data-provider.util.d.ts +0 -35
- package/templates/tableview-route.component.html +0 -5
- /package/{lib/api → data-api/class-dto/obsolete}/models/filter-match-type.model.d.ts +0 -0
- /package/{lib/api → data-api/class-dto/obsolete}/models/query-mode.model.d.ts +0 -0
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
import { FilterMatchMode, MngInternalError } from '../models';
|
|
2
|
+
import { DateUtil } from './date.util';
|
|
3
|
+
export class DataListParamsUtil {
|
|
4
|
+
/**
|
|
5
|
+
* Converts a TableLazyLoadEvent to DataListParams.
|
|
6
|
+
*
|
|
7
|
+
* @param {TableLazyLoadEvent} event - The event containing the data to convert.
|
|
8
|
+
* @return {DataListParams} - The converted DataListParams object.
|
|
9
|
+
*/
|
|
10
|
+
static fromPrimeTableLoad(event) {
|
|
11
|
+
const params = {};
|
|
12
|
+
if (event.first != null) {
|
|
13
|
+
params.offset = event.first;
|
|
14
|
+
}
|
|
15
|
+
if (event.rows != null) {
|
|
16
|
+
params.limit = event.rows;
|
|
17
|
+
}
|
|
18
|
+
if (typeof event.globalFilter === 'string') {
|
|
19
|
+
params.search = event.globalFilter;
|
|
20
|
+
}
|
|
21
|
+
else if (Array.isArray(event.globalFilter) && event.globalFilter.length > 0) {
|
|
22
|
+
params.search = event.globalFilter.join(',');
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(event.multiSortMeta) && event.multiSortMeta.length > 0) {
|
|
25
|
+
params.sort = event.multiSortMeta.map(m => ({ property: m.field, ascending: m.order >= 0 }));
|
|
26
|
+
}
|
|
27
|
+
if (event.filters) {
|
|
28
|
+
params.filters = Object.keys(event.filters).reduce((acc, key) => {
|
|
29
|
+
const filter = {};
|
|
30
|
+
const eventFilter = event.filters?.[key];
|
|
31
|
+
if (Array.isArray(eventFilter)) {
|
|
32
|
+
filter.value = eventFilter[0].value;
|
|
33
|
+
filter.matchMode = eventFilter[0].matchMode;
|
|
34
|
+
}
|
|
35
|
+
else if (eventFilter !== undefined) {
|
|
36
|
+
filter.value = eventFilter.value;
|
|
37
|
+
filter.matchMode = eventFilter.matchMode;
|
|
38
|
+
}
|
|
39
|
+
return { ...acc, [key]: filter };
|
|
40
|
+
}, {});
|
|
41
|
+
}
|
|
42
|
+
return params;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Converts the given parameters to URL query parameters.
|
|
46
|
+
* Sorts are formatted in Medius data API sort query language: `asc:prop1,desc:prop2`, ...
|
|
47
|
+
* Filter keys are "flattened" in the new object, values are formatted in Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
|
|
48
|
+
*
|
|
49
|
+
* @param {DataListParams} params - The parameters to convert.
|
|
50
|
+
* @param {DataListParams|null} defaults - The default parameters used if no matching property in params is available. Defaults to { limit: 25, offset: 0 } if not provided.
|
|
51
|
+
* @returns {Params} - The URL query parameters object.
|
|
52
|
+
*/
|
|
53
|
+
static toUrlQueryParams(params, defaults = {
|
|
54
|
+
limit: 25,
|
|
55
|
+
offset: 0
|
|
56
|
+
}) {
|
|
57
|
+
const urlParams = {};
|
|
58
|
+
if (params.limit && params.limit !== defaults?.limit) {
|
|
59
|
+
urlParams['limit'] = params.limit;
|
|
60
|
+
}
|
|
61
|
+
if (params.offset && params.offset !== defaults?.offset) {
|
|
62
|
+
urlParams['offset'] = params.offset;
|
|
63
|
+
}
|
|
64
|
+
if (params.search && params.search !== defaults?.search) {
|
|
65
|
+
urlParams['q'] = params.search;
|
|
66
|
+
}
|
|
67
|
+
if (params.sort && Array.isArray(params.sort) && params.sort.length > 0) {
|
|
68
|
+
if (defaults?.sort == null ||
|
|
69
|
+
!Array.isArray(defaults.sort) ||
|
|
70
|
+
defaults.sort.length === 0 ||
|
|
71
|
+
params.sort.length !== defaults.sort.length ||
|
|
72
|
+
defaults.sort.some((ds, idx) => ds.property !== params.sort[idx].property || (ds.ascending ?? true) !== (params.sort[idx].ascending ?? true))) {
|
|
73
|
+
urlParams['sort'] = DataListParamsUtil.sortToUrlQuery(params);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (params.filters) {
|
|
77
|
+
Object.keys(params.filters).forEach(k => {
|
|
78
|
+
const paramFilter = params.filters[k];
|
|
79
|
+
const defaultFilter = defaults?.filters?.[k];
|
|
80
|
+
if (defaultFilter &&
|
|
81
|
+
((Array.isArray(defaultFilter.value) &&
|
|
82
|
+
Array.isArray(paramFilter.value) &&
|
|
83
|
+
defaultFilter.value.length === paramFilter.value.length &&
|
|
84
|
+
defaultFilter.value.every((v, idx) => {
|
|
85
|
+
const value = paramFilter.value[idx];
|
|
86
|
+
if (value instanceof Date && v instanceof Date)
|
|
87
|
+
return value.getTime() === v.getTime();
|
|
88
|
+
else
|
|
89
|
+
return value === v;
|
|
90
|
+
})) || // handle arrays
|
|
91
|
+
defaultFilter.value === paramFilter.value) &&
|
|
92
|
+
defaultFilter.matchMode === paramFilter.matchMode &&
|
|
93
|
+
(defaultFilter.caseSensitive ?? false) === (paramFilter.caseSensitive ?? false)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (paramFilter.value == null && defaultFilter?.value == null) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
urlParams[k] = DataListParamsUtil.paramsFilterToUrlQuery(params, k, true);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (defaults?.filters) {
|
|
103
|
+
// add other defaults
|
|
104
|
+
const paramFilterKeys = params.filters ? Object.keys(params.filters) : [];
|
|
105
|
+
Object.keys(defaults.filters)
|
|
106
|
+
.filter(k => paramFilterKeys.indexOf(k) < 0)
|
|
107
|
+
.forEach(k => {
|
|
108
|
+
urlParams[k] = DataListParamsUtil.paramsFilterToUrlQuery(defaults, k);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return urlParams;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Merges the provided parameters with default values and returns the merged object.
|
|
115
|
+
*
|
|
116
|
+
* @param {DataListParams} params - The parameters to merge with defaults.
|
|
117
|
+
* @param {DataListParams} defaults - The default values to merge with params (optional, default is { limit: 25, offset: 0 }).
|
|
118
|
+
* @returns {DataListParams} - The merged parameters object.
|
|
119
|
+
*/
|
|
120
|
+
static mergeWithDefaults(params, defaults = {
|
|
121
|
+
limit: 25,
|
|
122
|
+
offset: 0
|
|
123
|
+
}) {
|
|
124
|
+
const merged = {
|
|
125
|
+
limit: params.limit ?? defaults.limit,
|
|
126
|
+
offset: params.offset ?? defaults.offset,
|
|
127
|
+
search: params.search ?? defaults.search,
|
|
128
|
+
sort: (params.sort ?? defaults.sort)?.map(s => ({ ...s }))
|
|
129
|
+
};
|
|
130
|
+
if (params.filters) {
|
|
131
|
+
merged.filters = {};
|
|
132
|
+
Object.entries(params.filters).forEach(([key, value]) => (merged.filters[key] = { ...value }));
|
|
133
|
+
}
|
|
134
|
+
if (defaults.filters) {
|
|
135
|
+
if (!merged.filters)
|
|
136
|
+
merged.filters = {};
|
|
137
|
+
Object.entries(defaults.filters).forEach(([key, value]) => {
|
|
138
|
+
if (merged.filters[key] === undefined) {
|
|
139
|
+
merged.filters[key] = { ...value };
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return merged;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Converts an object of parameters to a URL query string for sorting.
|
|
147
|
+
* Sorts are formatted in Medius data API sort query language: `asc:prop1,desc:prop2`, ...
|
|
148
|
+
*
|
|
149
|
+
* @param {DataListParams} params - An optional object containing sort parameters.
|
|
150
|
+
* @returns A string representing the URL query or undefined if no sort parameters are provided.
|
|
151
|
+
*/
|
|
152
|
+
static sortToUrlQuery(params) {
|
|
153
|
+
return params && Array.isArray(params.sort)
|
|
154
|
+
? params.sort.map(s => `${s.ascending === true || s.ascending === undefined ? 'asc' : 'desc'}:${String(s.property)}`).join(',')
|
|
155
|
+
: undefined;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Converts a specific filter parameter (by key) from DataListParams object to a URL query string.
|
|
159
|
+
* Filter keys are "flattened" in the new object, values are formatted in Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
|
|
160
|
+
*
|
|
161
|
+
* @param {DataListParams<any, Filters> | undefined} params - The DataListParams object containing the filters.
|
|
162
|
+
* @param {Filters} key - The key of the filter to convert.
|
|
163
|
+
* @param {boolean} [allowNull=false] - Indicates whether to allow null values in the query string.
|
|
164
|
+
* @return {string | undefined} - The URL query string representing the specified filter, or undefined if the filter is not found.
|
|
165
|
+
*/
|
|
166
|
+
static paramsFilterToUrlQuery(params, key, allowNull = false) {
|
|
167
|
+
const paramFilter = params?.filters?.[key];
|
|
168
|
+
return DataListParamsUtil.filterToUrlQuery(paramFilter, allowNull);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Converts a filter to a URL query string.
|
|
172
|
+
* Filter keys are "flattened" in the new object, values are formatted in Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
|
|
173
|
+
*
|
|
174
|
+
* @param {DataListFilter} paramFilter - The filter object to be converted.
|
|
175
|
+
* @param {boolean} [allowNull=false] - Indicates whether to allow null values in the filter.
|
|
176
|
+
* @returns {string|undefined} - The filter converted to a URL query string, or undefined if no filter is provided or the filter has empty or invalid values.
|
|
177
|
+
* @throws {MngInternalError} - If the filter has invalid values.
|
|
178
|
+
*/
|
|
179
|
+
static filterToUrlQuery(paramFilter, allowNull = false) {
|
|
180
|
+
const filterValueAsArray = Array.isArray(paramFilter?.value) ? paramFilter.value.filter(v => v !== undefined && (allowNull || v !== null)) : undefined;
|
|
181
|
+
if (paramFilter === undefined ||
|
|
182
|
+
(!allowNull && paramFilter.value == null) ||
|
|
183
|
+
(typeof paramFilter.value === 'string' && paramFilter.value.length === 0) ||
|
|
184
|
+
(Array.isArray(filterValueAsArray) && filterValueAsArray.length === 0)) {
|
|
185
|
+
// no need to include filters for empty values
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
const matchMode = paramFilter.matchMode ?? FilterMatchMode.Equals;
|
|
189
|
+
if (matchMode === FilterMatchMode.Between && !(Array.isArray(filterValueAsArray) && filterValueAsArray.length === 2)) {
|
|
190
|
+
throw new MngInternalError(`Filter match mode between requires exactly 2 values: ${paramFilter.value}`);
|
|
191
|
+
}
|
|
192
|
+
if ((matchMode === FilterMatchMode.In || matchMode === FilterMatchMode.NotIn) && (!Array.isArray(filterValueAsArray) || filterValueAsArray.length === 0)) {
|
|
193
|
+
throw new MngInternalError(`Filter match mode ${matchMode} requires non-empty array: ${paramFilter.value}`);
|
|
194
|
+
}
|
|
195
|
+
if ([FilterMatchMode.In, FilterMatchMode.NotIn, FilterMatchMode.Between].indexOf(matchMode) === -1 && Array.isArray(filterValueAsArray)) {
|
|
196
|
+
throw new MngInternalError(`Filter match mode ${matchMode} must not be array: ${paramFilter.value}`);
|
|
197
|
+
}
|
|
198
|
+
const noVal = paramFilter.matchMode === FilterMatchMode.Exists || paramFilter.matchMode === FilterMatchMode.DoesNotExist;
|
|
199
|
+
const urlValuePart = noVal ? '' : `:${DataListParamsUtil.filterValueToUrlParam(filterValueAsArray ?? paramFilter.value, allowNull)}`;
|
|
200
|
+
return `${paramFilter.caseSensitive ? 'cs:' : paramFilter.caseSensitive === false ? 'ci:' : ''}${FilterMatchMode.getAbbreviation(matchMode) ?? matchMode}${urlValuePart}`;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Converts URL query parameters to a DataListParams object.
|
|
204
|
+
* Sorts are formatted from Medius data API sort query language: `asc:prop1,desc:prop2`, ...
|
|
205
|
+
* Filter keys are all keys in Params object that are not matched elsewhere, values are formatted from Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
|
|
206
|
+
*
|
|
207
|
+
* @param {Params} urlParams - The URL query parameters.
|
|
208
|
+
* @return {DataListParams} - The converted DataListParams object.
|
|
209
|
+
*/
|
|
210
|
+
static fromUrlQueryParams(urlParams) {
|
|
211
|
+
const params = {};
|
|
212
|
+
Object.entries(urlParams).forEach(([urlParamKey, urlParamValue]) => {
|
|
213
|
+
if (urlParamKey === 'limit') {
|
|
214
|
+
params.limit = +urlParamValue;
|
|
215
|
+
if (isNaN(params.limit) || params.limit < 0) {
|
|
216
|
+
delete params.limit;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
else if (urlParamKey === 'offset') {
|
|
220
|
+
params.offset = +urlParamValue;
|
|
221
|
+
if (isNaN(params.offset) || params.offset < 0) {
|
|
222
|
+
delete params.offset;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else if (urlParamKey === 'q') {
|
|
226
|
+
params.search = urlParamValue;
|
|
227
|
+
}
|
|
228
|
+
else if (urlParamKey === 'sort') {
|
|
229
|
+
if (typeof urlParamValue === 'string') {
|
|
230
|
+
params.sort = urlParamValue.split(',').map(s => {
|
|
231
|
+
const [direction, property] = s.split(':');
|
|
232
|
+
return { property: (property ?? direction), ascending: direction !== 'desc' };
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
throw new MngInternalError(`String is expected as value for '${urlParamKey}' when converting from urlParams`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else if (typeof urlParamValue === 'string') {
|
|
240
|
+
if (urlParamValue.length === 0) {
|
|
241
|
+
// empty string should be ignored
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const filterParts = urlParamValue.split(':');
|
|
245
|
+
let partIdx = 0;
|
|
246
|
+
// case sensitive
|
|
247
|
+
let caseSensitive = undefined;
|
|
248
|
+
if (filterParts[partIdx] === 'cs' || filterParts[partIdx] === 'ci') {
|
|
249
|
+
caseSensitive = filterParts[partIdx++] === 'cs';
|
|
250
|
+
}
|
|
251
|
+
// match mode
|
|
252
|
+
const matchMode = filterParts[partIdx] ? FilterMatchMode.fromAbbreviation(filterParts[partIdx]) ?? filterParts[partIdx] : FilterMatchMode.Equals;
|
|
253
|
+
partIdx++;
|
|
254
|
+
const noVal = matchMode === FilterMatchMode.Exists || matchMode === FilterMatchMode.DoesNotExist;
|
|
255
|
+
// value
|
|
256
|
+
let value = undefined;
|
|
257
|
+
if (!noVal) {
|
|
258
|
+
if (filterParts.length < 2) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (partIdx === filterParts.length - 1) {
|
|
262
|
+
value = filterParts[partIdx];
|
|
263
|
+
}
|
|
264
|
+
else if (partIdx < filterParts.length) {
|
|
265
|
+
// array that should not be array, so join back together
|
|
266
|
+
value = filterParts.slice(partIdx, filterParts.length).join(':');
|
|
267
|
+
}
|
|
268
|
+
if (value === undefined && matchMode !== FilterMatchMode.Exists && matchMode !== FilterMatchMode.DoesNotExist) {
|
|
269
|
+
// if value undefined and match mode expects value, then skip
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (value === 'null') {
|
|
273
|
+
value = null;
|
|
274
|
+
}
|
|
275
|
+
if ((matchMode === FilterMatchMode.In || matchMode === FilterMatchMode.NotIn || matchMode === FilterMatchMode.Between) && typeof value === 'string') {
|
|
276
|
+
let arrayVal = [];
|
|
277
|
+
// these match modes expect array
|
|
278
|
+
if (value.indexOf('"') >= 0) {
|
|
279
|
+
const tokens = [];
|
|
280
|
+
let currentToken = '';
|
|
281
|
+
let explicitQuotes = false; //token is quoted, e.g. in:1,2,"22""",",123"""
|
|
282
|
+
let quotesOpened = false; //token has started processing
|
|
283
|
+
let quotesExplicitlyClosed = false; //token processing has finished, after single " in quoted mode, or before , in not quoted
|
|
284
|
+
for (let i = 0; i < value.length; i++) {
|
|
285
|
+
const c = value[i];
|
|
286
|
+
// reset the tokenizer when seeing the token separator
|
|
287
|
+
// only if either:
|
|
288
|
+
// the quotes have not been opened yet (when there are no characters between separators),
|
|
289
|
+
// the token has been explicitly closed (when we actually have explicit opening i.e., quotes as the first character)
|
|
290
|
+
// or we have implicit quotes (i.e., quotes are not the first character)
|
|
291
|
+
if (c === ',' && (!quotesOpened || quotesExplicitlyClosed || !explicitQuotes)) {
|
|
292
|
+
tokens.push(currentToken);
|
|
293
|
+
currentToken = '';
|
|
294
|
+
quotesOpened = false;
|
|
295
|
+
quotesExplicitlyClosed = false;
|
|
296
|
+
explicitQuotes = false;
|
|
297
|
+
}
|
|
298
|
+
else if (c == '"') {
|
|
299
|
+
// escaped double-quotes
|
|
300
|
+
if (explicitQuotes && i + 1 < value.length && value[i + 1] === '"') {
|
|
301
|
+
currentToken += c; // Append one double-quote to the current token
|
|
302
|
+
i++; // Skip the next double-quote
|
|
303
|
+
}
|
|
304
|
+
// we encounter quotes again after they were the first character => we close the token
|
|
305
|
+
else if (explicitQuotes) {
|
|
306
|
+
quotesExplicitlyClosed = true;
|
|
307
|
+
}
|
|
308
|
+
// implicit quotes
|
|
309
|
+
else if (quotesOpened) {
|
|
310
|
+
currentToken += c;
|
|
311
|
+
}
|
|
312
|
+
// quotes are the first character => explicitly open the token
|
|
313
|
+
else {
|
|
314
|
+
currentToken = '';
|
|
315
|
+
quotesOpened = true;
|
|
316
|
+
explicitQuotes = true;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
if (quotesExplicitlyClosed) {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
quotesOpened = true;
|
|
324
|
+
currentToken += c;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (quotesOpened && !quotesExplicitlyClosed && explicitQuotes) {
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
// Append the last token after the loop ends
|
|
331
|
+
tokens.push(currentToken.toString());
|
|
332
|
+
arrayVal = tokens;
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
arrayVal = value.split(',');
|
|
336
|
+
}
|
|
337
|
+
if (matchMode === FilterMatchMode.Between && arrayVal.length !== 2) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
value = arrayVal;
|
|
341
|
+
}
|
|
342
|
+
if ((typeof value === 'string' && value.length === 0) || (Array.isArray(value) && value.length === 0)) {
|
|
343
|
+
// filter with empty value is to be ignored
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
caseSensitive = undefined;
|
|
349
|
+
}
|
|
350
|
+
if (!params.filters) {
|
|
351
|
+
params.filters = {};
|
|
352
|
+
}
|
|
353
|
+
params.filters[urlParamKey] = { value: value, matchMode: matchMode, caseSensitive: caseSensitive };
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
return params;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Makes a copy of the given DataListParams object.
|
|
360
|
+
*
|
|
361
|
+
* @param {DataListParams<Sorts, Filters>} params - The DataListParams object to be copied.
|
|
362
|
+
* @returns {DataListParams<Sorts, Filters>} - Returns a new copy of the DataListParams object.
|
|
363
|
+
*/
|
|
364
|
+
static copy(params) {
|
|
365
|
+
const copy = {
|
|
366
|
+
offset: params.offset,
|
|
367
|
+
limit: params.limit,
|
|
368
|
+
search: params.search
|
|
369
|
+
};
|
|
370
|
+
if (params.sort) {
|
|
371
|
+
copy.sort = params.sort?.map(s => ({ ...s }));
|
|
372
|
+
}
|
|
373
|
+
if (params.filters) {
|
|
374
|
+
copy.filters = Object.entries(params.filters).reduce((acc, [key, value]) => {
|
|
375
|
+
const filterValue = value;
|
|
376
|
+
return {
|
|
377
|
+
...acc,
|
|
378
|
+
[key]: {
|
|
379
|
+
...filterValue,
|
|
380
|
+
value: Array.isArray(filterValue.value) ? [...filterValue.value] : filterValue.value
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
}, {});
|
|
384
|
+
}
|
|
385
|
+
return copy;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Converts a value to a URL query param string representation.
|
|
389
|
+
*
|
|
390
|
+
* @param {unknown} value - The value to be converted.
|
|
391
|
+
* @param {boolean} [allowNull=false] - Indicates whether null values are allowed.
|
|
392
|
+
* @returns {string} The URL parameter representation of the value.
|
|
393
|
+
* @throws {MngInternalError} If an undefined value is passed without allowNull set to true.
|
|
394
|
+
* @throws {MngInternalError} If the value is an object (excluding Date).
|
|
395
|
+
*/
|
|
396
|
+
static filterValueToUrlParam(value, allowNull = false) {
|
|
397
|
+
if (value === null && allowNull)
|
|
398
|
+
return 'null';
|
|
399
|
+
if (value == null)
|
|
400
|
+
throw new MngInternalError('Undefined value cannot be converted to url param.'); // this should not happen, should be filtered out earlier
|
|
401
|
+
if (Array.isArray(value))
|
|
402
|
+
return value
|
|
403
|
+
.map(v => DataListParamsUtil.filterValueToUrlParam(v, allowNull))
|
|
404
|
+
.map(v => (v.indexOf(',') >= 0 || v.indexOf('"') >= 0 ? `"${v.replaceAll('"', '""')}"` : v))
|
|
405
|
+
.join(',');
|
|
406
|
+
if (typeof value === 'object') {
|
|
407
|
+
if (value instanceof Date)
|
|
408
|
+
return DateUtil.toIsoString(value, 'dateTime', { utc: true });
|
|
409
|
+
else {
|
|
410
|
+
throw new MngInternalError('Filter value cannot be object');
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return String(value);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LXBhcmFtcy51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi91dGlscy9kYXRhLWxpc3QtcGFyYW1zLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUErRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDMUksT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVyQyxNQUFNLE9BQU8sa0JBQWtCO0lBQzNCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQXlCO1FBQ3RELE1BQU0sTUFBTSxHQUFtQixFQUFFLENBQUM7UUFFbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUNyQixNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7U0FDL0I7UUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ3BCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztTQUM3QjtRQUVELElBQUksT0FBTyxLQUFLLENBQUMsWUFBWSxLQUFLLFFBQVEsRUFBRTtZQUN4QyxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7U0FDdEM7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzRSxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFD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QUFtRCxDQUFDLENBQUMsQ0FBQyx5REFBeUQ7UUFDN0osSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNwQixPQUFPLEtBQUs7aUJBQ1AsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2lCQUNoRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzRixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDM0IsSUFBSSxLQUFLLFlBQVksSUFBSTtnQkFBRSxPQUFPLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO2lCQUNsRjtnQkFDRCxNQUFNLElBQUksZ0JBQWdCLENBQUMsK0JBQStCLENBQUMsQ0FBQzthQUMvRDtTQUNKO1FBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7VGFibGVMYXp5TG9hZEV2ZW50fSBmcm9tICdwcmltZW5nL3RhYmxlJztcblxuaW1wb3J0IHtEYXRhTGlzdEZpbHRlciwgRGF0YUxpc3RGaWx0ZXJWYWx1ZVR5cGUsIERhdGFMaXN0RmlsdGVyc1R5cGUsIERhdGFMaXN0UGFyYW1zLCBGaWx0ZXJNYXRjaE1vZGUsIE1uZ0ludGVybmFsRXJyb3J9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge0RhdGVVdGlsfSBmcm9tICcuL2RhdGUudXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhTGlzdFBhcmFtc1V0aWwge1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgVGFibGVMYXp5TG9hZEV2ZW50IHRvIERhdGFMaXN0UGFyYW1zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUYWJsZUxhenlMb2FkRXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJuIHtEYXRhTGlzdFBhcmFtc30gLSBUaGUgY29udmVydGVkIERhdGFMaXN0UGFyYW1zIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21QcmltZVRhYmxlTG9hZChldmVudDogVGFibGVMYXp5TG9hZEV2ZW50KTogRGF0YUxpc3RQYXJhbXMge1xuICAgICAgICBjb25zdCBwYXJhbXM6IERhdGFMaXN0UGFyYW1zID0ge307XG5cbiAgICAgICAgaWYgKGV2ZW50LmZpcnN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHBhcmFtcy5vZmZzZXQgPSBldmVudC5maXJzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQucm93cyAhPSBudWxsKSB7XG4gICAgICAgICAgICBwYXJhbXMubGltaXQgPSBldmVudC5yb3dzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBldmVudC5nbG9iYWxGaWx0ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwYXJhbXMuc2VhcmNoID0gZXZlbnQuZ2xvYmFsRmlsdGVyO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQuZ2xvYmFsRmlsdGVyKSAmJiBldmVudC5nbG9iYWxGaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcGFyYW1zLnNlYXJjaCA9IGV2ZW50Lmdsb2JhbEZpbHRlci5qb2luKCcsJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudC5tdWx0aVNvcnRNZXRhKSAmJiBldmVudC5tdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBhcmFtcy5zb3J0ID0gZXZlbnQubXVsdGlTb3J0TWV0YS5tYXAobSA9PiAoe3Byb3BlcnR5OiBtLmZpZWxkLCBhc2NlbmRpbmc6IG0ub3JkZXIgPj0gMH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5maWx0ZXJzKSB7XG4gICAgICAgICAgICBwYXJhbXMuZmlsdGVycyA9IE9iamVjdC5rZXlzKGV2ZW50LmZpbHRlcnMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXI6IERhdGFMaXN0RmlsdGVyID0ge307XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRGaWx0ZXIgPSBldmVudC5maWx0ZXJzPy5ba2V5IGFzIGtleW9mIG9iamVjdF07XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnRGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZSA9IGV2ZW50RmlsdGVyWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIubWF0Y2hNb2RlID0gZXZlbnRGaWx0ZXJbMF0ubWF0Y2hNb2RlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRGaWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIudmFsdWUgPSBldmVudEZpbHRlci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm1hdGNoTW9kZSA9IGV2ZW50RmlsdGVyLm1hdGNoTW9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5hY2MsIFtrZXldOiBmaWx0ZXJ9O1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcGFyYW1ldGVycyB0byBVUkwgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBTb3J0cyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBzb3J0IHF1ZXJ5IGxhbmd1YWdlOiBgYXNjOnByb3AxLGRlc2M6cHJvcDJgLCAuLi5cbiAgICAgKiBGaWx0ZXIga2V5cyBhcmUgXCJmbGF0dGVuZWRcIiBpbiB0aGUgbmV3IG9iamVjdCwgdmFsdWVzIGFyZSBmb3JtYXR0ZWQgaW4gTWVkaXVzIGRhdGEgQVBJIGZpbHRlciBxdWVyeSBsYW5ndWFnZTogYGNzOmVxOmFzZGAsIGBpbjphc2QscXdlYCwgYGV4YCwgLi4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RhdGFMaXN0UGFyYW1zfSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXN8bnVsbH0gZGVmYXVsdHMgLSBUaGUgZGVmYXVsdCBwYXJhbWV0ZXJzIHVzZWQgaWYgbm8gbWF0Y2hpbmcgcHJvcGVydHkgaW4gcGFyYW1zIGlzIGF2YWlsYWJsZS4gRGVmYXVsdHMgdG8geyBsaW1pdDogMjUsIG9mZnNldDogMCB9IGlmIG5vdCBwcm92aWRlZC5cbiAgICAgKiBAcmV0dXJucyB7UGFyYW1zfSAtIFRoZSBVUkwgcXVlcnkgcGFyYW1ldGVycyBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyB0b1VybFF1ZXJ5UGFyYW1zKFxuICAgICAgICBwYXJhbXM6IERhdGFMaXN0UGFyYW1zPGFueSwgYW55PixcbiAgICAgICAgZGVmYXVsdHM6IERhdGFMaXN0UGFyYW1zPGFueSwgYW55PiB8IG51bGwgPSB7XG4gICAgICAgICAgICBsaW1pdDogMjUsXG4gICAgICAgICAgICBvZmZzZXQ6IDBcbiAgICAgICAgfVxuICAgICk6IFBhcmFtcyB7XG4gICAgICAgIGNvbnN0IHVybFBhcmFtczogUGFyYW1zID0ge307XG5cbiAgICAgICAgaWYgKHBhcmFtcy5saW1pdCAmJiBwYXJhbXMubGltaXQgIT09IGRlZmF1bHRzPy5saW1pdCkge1xuICAgICAgICAgICAgdXJsUGFyYW1zWydsaW1pdCddID0gcGFyYW1zLmxpbWl0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMub2Zmc2V0ICYmIHBhcmFtcy5vZmZzZXQgIT09IGRlZmF1bHRzPy5vZmZzZXQpIHtcbiAgICAgICAgICAgIHVybFBhcmFtc1snb2Zmc2V0J10gPSBwYXJhbXMub2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMuc2VhcmNoICYmIHBhcmFtcy5zZWFyY2ggIT09IGRlZmF1bHRzPy5zZWFyY2gpIHtcbiAgICAgICAgICAgIHVybFBhcmFtc1sncSddID0gcGFyYW1zLnNlYXJjaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLnNvcnQgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMuc29ydCkgJiYgcGFyYW1zLnNvcnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGRlZmF1bHRzPy5zb3J0ID09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheShkZWZhdWx0cy5zb3J0KSB8fFxuICAgICAgICAgICAgICAgIGRlZmF1bHRzLnNvcnQubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgcGFyYW1zLnNvcnQubGVuZ3RoICE9PSBkZWZhdWx0cy5zb3J0Lmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIGRlZmF1bHRzLnNvcnQuc29tZSgoZHMsIGlkeCkgPT4gZHMucHJvcGVydHkgIT09IHBhcmFtcy5zb3J0IVtpZHhdLnByb3BlcnR5IHx8IChkcy5hc2NlbmRpbmcgPz8gdHJ1ZSkgIT09IChwYXJhbXMuc29ydCFbaWR4XS5hc2NlbmRpbmcgPz8gdHJ1ZSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB1cmxQYXJhbXNbJ3NvcnQnXSA9IERhdGFMaXN0UGFyYW1zVXRpbC5zb3J0VG9VcmxRdWVyeShwYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMuZmlsdGVycykge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocGFyYW1zLmZpbHRlcnMpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1GaWx0ZXIgPSBwYXJhbXMuZmlsdGVycyFbayBhcyBrZXlvZiBvYmplY3RdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSBkZWZhdWx0cz8uZmlsdGVycz8uW2sgYXMga2V5b2Ygb2JqZWN0XTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgKChBcnJheS5pc0FycmF5KGRlZmF1bHRGaWx0ZXIudmFsdWUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHBhcmFtRmlsdGVyLnZhbHVlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlci52YWx1ZS5sZW5ndGggPT09IHBhcmFtRmlsdGVyLnZhbHVlLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlci52YWx1ZS5ldmVyeSgodiwgaWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAocGFyYW1GaWx0ZXIudmFsdWUgYXMgQXJyYXk8RGF0YUxpc3RGaWx0ZXJWYWx1ZVR5cGU+KVtpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgdiBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB2YWx1ZS5nZXRUaW1lKCkgPT09IHYuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHZhbHVlID09PSB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpIHx8IC8vIGhhbmRsZSBhcnJheXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIudmFsdWUgPT09IHBhcmFtRmlsdGVyLnZhbHVlKSAmJlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyLm1hdGNoTW9kZSA9PT0gcGFyYW1GaWx0ZXIubWF0Y2hNb2RlICYmXG4gICAgICAgICAgICAgICAgICAgIChkZWZhdWx0RmlsdGVyLmNhc2VTZW5zaXRpdmUgPz8gZmFsc2UpID09PSAocGFyYW1GaWx0ZXIuY2FzZVNlbnNpdGl2ZSA/PyBmYWxzZSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwYXJhbUZpbHRlci52YWx1ZSA9PSBudWxsICYmIGRlZmF1bHRGaWx0ZXI/LnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHVybFBhcmFtc1trXSA9IERhdGFMaXN0UGFyYW1zVXRpbC5wYXJhbXNGaWx0ZXJUb1VybFF1ZXJ5KHBhcmFtcywgaywgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdHM/LmZpbHRlcnMpIHtcbiAgICAgICAgICAgIC8vIGFkZCBvdGhlciBkZWZhdWx0c1xuICAgICAgICAgICAgY29uc3QgcGFyYW1GaWx0ZXJLZXlzID0gcGFyYW1zLmZpbHRlcnMgPyBPYmplY3Qua2V5cyhwYXJhbXMuZmlsdGVycykgOiBbXTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzLmZpbHRlcnMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihrID0+IHBhcmFtRmlsdGVyS2V5cy5pbmRleE9mKGspIDwgMClcbiAgICAgICAgICAgICAgICAuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsUGFyYW1zW2tdID0gRGF0YUxpc3RQYXJhbXNVdGlsLnBhcmFtc0ZpbHRlclRvVXJsUXVlcnkoZGVmYXVsdHMsIGspO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVybFBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgcmV0dXJucyB0aGUgbWVyZ2VkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXN9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIG1lcmdlIHdpdGggZGVmYXVsdHMuXG4gICAgICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtc30gZGVmYXVsdHMgLSBUaGUgZGVmYXVsdCB2YWx1ZXMgdG8gbWVyZ2Ugd2l0aCBwYXJhbXMgKG9wdGlvbmFsLCBkZWZhdWx0IGlzIHsgbGltaXQ6IDI1LCBvZmZzZXQ6IDAgfSkuXG4gICAgICogQHJldHVybnMge0RhdGFMaXN0UGFyYW1zfSAtIFRoZSBtZXJnZWQgcGFyYW1ldGVycyBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBtZXJnZVdpdGhEZWZhdWx0czxTb3J0cyA9IGFueSwgRmlsdGVycyBleHRlbmRzIGtleW9mIGFueSA9IGFueT4oXG4gICAgICAgIHBhcmFtczogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+LFxuICAgICAgICBkZWZhdWx0czogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+ID0ge1xuICAgICAgICAgICAgbGltaXQ6IDI1LFxuICAgICAgICAgICAgb2Zmc2V0OiAwXG4gICAgICAgIH1cbiAgICApOiBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4ge1xuICAgICAgICBjb25zdCBtZXJnZWQ6IERhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPiA9IHtcbiAgICAgICAgICAgIGxpbWl0OiBwYXJhbXMubGltaXQgPz8gZGVmYXVsdHMubGltaXQsXG4gICAgICAgICAgICBvZmZzZXQ6IHBhcmFtcy5vZmZzZXQgPz8gZGVmYXVsdHMub2Zmc2V0LFxuICAgICAgICAgICAgc2VhcmNoOiBwYXJhbXMuc2VhcmNoID8/IGRlZmF1bHRzLnNlYXJjaCxcbiAgICAgICAgICAgIHNvcnQ6IChwYXJhbXMuc29ydCA/PyBkZWZhdWx0cy5zb3J0KT8ubWFwKHMgPT4gKHsuLi5zfSkpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHBhcmFtcy5maWx0ZXJzKSB7XG4gICAgICAgICAgICBtZXJnZWQuZmlsdGVycyA9IHt9IGFzIERhdGFMaXN0RmlsdGVyc1R5cGU8RmlsdGVycz47XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhwYXJhbXMuZmlsdGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiAobWVyZ2VkLmZpbHRlcnMhW2tleSBhcyBGaWx0ZXJzXSA9IHsuLi4odmFsdWUgYXMgRGF0YUxpc3RGaWx0ZXIpfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZhdWx0cy5maWx0ZXJzKSB7XG4gICAgICAgICAgICBpZiAoIW1lcmdlZC5maWx0ZXJzKSBtZXJnZWQuZmlsdGVycyA9IHt9IGFzIERhdGFMaXN0RmlsdGVyc1R5cGU8RmlsdGVycz47XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkZWZhdWx0cy5maWx0ZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobWVyZ2VkLmZpbHRlcnMhW2tleSBhcyBGaWx0ZXJzXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lcmdlZC5maWx0ZXJzIVtrZXkgYXMgRmlsdGVyc10gPSB7Li4uKHZhbHVlIGFzIERhdGFMaXN0RmlsdGVyKX07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiBwYXJhbWV0ZXJzIHRvIGEgVVJMIHF1ZXJ5IHN0cmluZyBmb3Igc29ydGluZy5cbiAgICAgKiBTb3J0cyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBzb3J0IHF1ZXJ5IGxhbmd1YWdlOiBgYXNjOnByb3AxLGRlc2M6cHJvcDJgLCAuLi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXN9IHBhcmFtcyAtIEFuIG9wdGlvbmFsIG9iamVjdCBjb250YWluaW5nIHNvcnQgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFVSTCBxdWVyeSBvciB1bmRlZmluZWQgaWYgbm8gc29ydCBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHNvcnRUb1VybFF1ZXJ5KHBhcmFtcz86IERhdGFMaXN0UGFyYW1zPGFueSwgYW55Pik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBwYXJhbXMgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMuc29ydClcbiAgICAgICAgICAgID8gcGFyYW1zLnNvcnQubWFwKHMgPT4gYCR7cy5hc2NlbmRpbmcgPT09IHRydWUgfHwgcy5hc2NlbmRpbmcgPT09IHVuZGVmaW5lZCA/ICdhc2MnIDogJ2Rlc2MnfToke1N0cmluZyhzLnByb3BlcnR5KX1gKS5qb2luKCcsJylcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgc3BlY2lmaWMgZmlsdGVyIHBhcmFtZXRlciAoYnkga2V5KSBmcm9tIERhdGFMaXN0UGFyYW1zIG9iamVjdCB0byBhIFVSTCBxdWVyeSBzdHJpbmcuXG4gICAgICogRmlsdGVyIGtleXMgYXJlIFwiZmxhdHRlbmVkXCIgaW4gdGhlIG5ldyBvYmplY3QsIHZhbHVlcyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBmaWx0ZXIgcXVlcnkgbGFuZ3VhZ2U6IGBjczplcTphc2RgLCBgaW46YXNkLHF3ZWAsIGBleGAsIC4uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtczxhbnksIEZpbHRlcnM+IHwgdW5kZWZpbmVkfSBwYXJhbXMgLSBUaGUgRGF0YUxpc3RQYXJhbXMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpbHRlcnMuXG4gICAgICogQHBhcmFtIHtGaWx0ZXJzfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBmaWx0ZXIgdG8gY29udmVydC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthbGxvd051bGw9ZmFsc2VdIC0gSW5kaWNhdGVzIHdoZXRoZXIgdG8gYWxsb3cgbnVsbCB2YWx1ZXMgaW4gdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIFVSTCBxdWVyeSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzcGVjaWZpZWQgZmlsdGVyLCBvciB1bmRlZmluZWQgaWYgdGhlIGZpbHRlciBpcyBub3QgZm91bmQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBwYXJhbXNGaWx0ZXJUb1VybFF1ZXJ5PEZpbHRlcnMgZXh0ZW5kcyBrZXlvZiBhbnkgPSBzdHJpbmc+KFxuICAgICAgICBwYXJhbXM6IERhdGFMaXN0UGFyYW1zPGFueSwgRmlsdGVycz4gfCB1bmRlZmluZWQsXG4gICAgICAgIGtleTogRmlsdGVycyxcbiAgICAgICAgYWxsb3dOdWxsID0gZmFsc2VcbiAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBwYXJhbUZpbHRlciA9IHBhcmFtcz8uZmlsdGVycz8uW2tleV07XG4gICAgICAgIHJldHVybiBEYXRhTGlzdFBhcmFtc1V0aWwuZmlsdGVyVG9VcmxRdWVyeShwYXJhbUZpbHRlciwgYWxsb3dOdWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIGZpbHRlciB0byBhIFVSTCBxdWVyeSBzdHJpbmcuXG4gICAgICogRmlsdGVyIGtleXMgYXJlIFwiZmxhdHRlbmVkXCIgaW4gdGhlIG5ldyBvYmplY3QsIHZhbHVlcyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBmaWx0ZXIgcXVlcnkgbGFuZ3VhZ2U6IGBjczplcTphc2RgLCBgaW46YXNkLHF3ZWAsIGBleGAsIC4uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRhTGlzdEZpbHRlcn0gcGFyYW1GaWx0ZXIgLSBUaGUgZmlsdGVyIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dOdWxsPWZhbHNlXSAtIEluZGljYXRlcyB3aGV0aGVyIHRvIGFsbG93IG51bGwgdmFsdWVzIGluIHRoZSBmaWx0ZXIuXG4gICAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IC0gVGhlIGZpbHRlciBjb252ZXJ0ZWQgdG8gYSBVUkwgcXVlcnkgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm8gZmlsdGVyIGlzIHByb3ZpZGVkIG9yIHRoZSBmaWx0ZXIgaGFzIGVtcHR5IG9yIGludmFsaWQgdmFsdWVzLlxuICAgICAqIEB0aHJvd3Mge01uZ0ludGVybmFsRXJyb3J9IC0gSWYgdGhlIGZpbHRlciBoYXMgaW52YWxpZCB2YWx1ZXMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmaWx0ZXJUb1VybFF1ZXJ5KHBhcmFtRmlsdGVyPzogRGF0YUxpc3RGaWx0ZXIsIGFsbG93TnVsbCA9IGZhbHNlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWVBc0FycmF5ID0gQXJyYXkuaXNBcnJheShwYXJhbUZpbHRlcj8udmFsdWUpID8gcGFyYW1GaWx0ZXIhLnZhbHVlLmZpbHRlcih2ID0+IHYgIT09IHVuZGVmaW5lZCAmJiAoYWxsb3dOdWxsIHx8IHYgIT09IG51bGwpKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyYW1GaWx0ZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKCFhbGxvd051bGwgJiYgcGFyYW1GaWx0ZXIudmFsdWUgPT0gbnVsbCkgfHxcbiAgICAgICAgICAgICh0eXBlb2YgcGFyYW1GaWx0ZXIudmFsdWUgPT09ICdzdHJpbmcnICYmIHBhcmFtRmlsdGVyLnZhbHVlLmxlbmd0aCA9PT0gMCkgfHxcbiAgICAgICAgICAgIChBcnJheS5pc0FycmF5KGZpbHRlclZhbHVlQXNBcnJheSkgJiYgZmlsdGVyVmFsdWVBc0FycmF5Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBubyBuZWVkIHRvIGluY2x1ZGUgZmlsdGVycyBmb3IgZW1wdHkgdmFsdWVzXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF0Y2hNb2RlID0gcGFyYW1GaWx0ZXIubWF0Y2hNb2RlID8/IEZpbHRlck1hdGNoTW9kZS5FcXVhbHM7XG5cbiAgICAgICAgaWYgKG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkJldHdlZW4gJiYgIShBcnJheS5pc0FycmF5KGZpbHRlclZhbHVlQXNBcnJheSkgJiYgZmlsdGVyVmFsdWVBc0FycmF5Lmxlbmd0aCA9PT0gMikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNbmdJbnRlcm5hbEVycm9yKGBGaWx0ZXIgbWF0Y2ggbW9kZSBiZXR3ZWVuIHJlcXVpcmVzIGV4YWN0bHkgMiB2YWx1ZXM6ICR7cGFyYW1GaWx0ZXIudmFsdWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkluIHx8IG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLk5vdEluKSAmJiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWVBc0FycmF5KSB8fCBmaWx0ZXJWYWx1ZUFzQXJyYXkubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1uZ0ludGVybmFsRXJyb3IoYEZpbHRlciBtYXRjaCBtb2RlICR7bWF0Y2hNb2RlfSByZXF1aXJlcyBub24tZW1wdHkgYXJyYXk6ICR7cGFyYW1GaWx0ZXIudmFsdWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKFtGaWx0ZXJNYXRjaE1vZGUuSW4sIEZpbHRlck1hdGNoTW9kZS5Ob3RJbiwgRmlsdGVyTWF0Y2hNb2RlLkJldHdlZW5dIGFzIHN0cmluZ1tdKS5pbmRleE9mKG1hdGNoTW9kZSkgPT09IC0xICYmIEFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWVBc0FycmF5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1uZ0ludGVybmFsRXJyb3IoYEZpbHRlciBtYXRjaCBtb2RlICR7bWF0Y2hNb2RlfSBtdXN0IG5vdCBiZSBhcnJheTogJHtwYXJhbUZpbHRlci52YWx1ZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vVmFsID0gcGFyYW1GaWx0ZXIubWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuRXhpc3RzIHx8IHBhcmFtRmlsdGVyLm1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdDtcbiAgICAgICAgY29uc3QgdXJsVmFsdWVQYXJ0ID0gbm9WYWwgPyAnJyA6IGA6JHtEYXRhTGlzdFBhcmFtc1V0aWwuZmlsdGVyVmFsdWVUb1VybFBhcmFtKGZpbHRlclZhbHVlQXNBcnJheSA/PyBwYXJhbUZpbHRlci52YWx1ZSwgYWxsb3dOdWxsKX1gO1xuXG4gICAgICAgIHJldHVybiBgJHtwYXJhbUZpbHRlci5jYXNlU2Vuc2l0aXZlID8gJ2NzOicgOiBwYXJhbUZpbHRlci5jYXNlU2Vuc2l0aXZlID09PSBmYWxzZSA/ICdjaTonIDogJyd9JHtGaWx0ZXJNYXRjaE1vZGUuZ2V0QWJicmV2aWF0aW9uKG1hdGNoTW9kZSkgPz8gbWF0Y2hNb2RlfSR7dXJsVmFsdWVQYXJ0fWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgVVJMIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gYSBEYXRhTGlzdFBhcmFtcyBvYmplY3QuXG4gICAgICogU29ydHMgYXJlIGZvcm1hdHRlZCBmcm9tIE1lZGl1cyBkYXRhIEFQSSBzb3J0IHF1ZXJ5IGxhbmd1YWdlOiBgYXNjOnByb3AxLGRlc2M6cHJvcDJgLCAuLi5cbiAgICAgKiBGaWx0ZXIga2V5cyBhcmUgYWxsIGtleXMgaW4gUGFyYW1zIG9iamVjdCB0aGF0IGFyZSBub3QgbWF0Y2hlZCBlbHNld2hlcmUsIHZhbHVlcyBhcmUgZm9ybWF0dGVkIGZyb20gTWVkaXVzIGRhdGEgQVBJIGZpbHRlciBxdWVyeSBsYW5ndWFnZTogYGNzOmVxOmFzZGAsIGBpbjphc2QscXdlYCwgYGV4YCwgLi4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BhcmFtc30gdXJsUGFyYW1zIC0gVGhlIFVSTCBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4ge0RhdGFMaXN0UGFyYW1zfSAtIFRoZSBjb252ZXJ0ZWQgRGF0YUxpc3RQYXJhbXMgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVybFF1ZXJ5UGFyYW1zKHVybFBhcmFtczogUGFyYW1zKTogRGF0YUxpc3RQYXJhbXMge1xuICAgICAgICBjb25zdCBwYXJhbXM6IERhdGFMaXN0UGFyYW1zID0ge307XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXModXJsUGFyYW1zKS5mb3JFYWNoKChbdXJsUGFyYW1LZXksIHVybFBhcmFtVmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBpZiAodXJsUGFyYW1LZXkgPT09ICdsaW1pdCcpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubGltaXQgPSArdXJsUGFyYW1WYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4ocGFyYW1zLmxpbWl0KSB8fCBwYXJhbXMubGltaXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXMubGltaXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh1cmxQYXJhbUtleSA9PT0gJ29mZnNldCcpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMub2Zmc2V0ID0gK3VybFBhcmFtVmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHBhcmFtcy5vZmZzZXQpIHx8IHBhcmFtcy5vZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXMub2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsUGFyYW1LZXkgPT09ICdxJykge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5zZWFyY2ggPSB1cmxQYXJhbVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh1cmxQYXJhbUtleSA9PT0gJ3NvcnQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxQYXJhbVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc29ydCA9IHVybFBhcmFtVmFsdWUuc3BsaXQoJywnKS5tYXAocyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbZGlyZWN0aW9uLCBwcm9wZXJ0eV0gPSBzLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3Byb3BlcnR5OiAocHJvcGVydHkgPz8gZGlyZWN0aW9uKSBhcyBrZXlvZiBvYmplY3QsIGFzY2VuZGluZzogZGlyZWN0aW9uICE9PSAnZGVzYyd9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW5nSW50ZXJuYWxFcnJvcihgU3RyaW5nIGlzIGV4cGVjdGVkIGFzIHZhbHVlIGZvciAnJHt1cmxQYXJhbUtleX0nIHdoZW4gY29udmVydGluZyBmcm9tIHVybFBhcmFtc2ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHVybFBhcmFtVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVybFBhcmFtVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IHN0cmluZyBzaG91bGQgYmUgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyUGFydHMgPSB1cmxQYXJhbVZhbHVlLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICAgICAgbGV0IHBhcnRJZHggPSAwO1xuXG4gICAgICAgICAgICAgICAgLy8gY2FzZSBzZW5zaXRpdmVcbiAgICAgICAgICAgICAgICBsZXQgY2FzZVNlbnNpdGl2ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyUGFydHNbcGFydElkeF0gPT09ICdjcycgfHwgZmlsdGVyUGFydHNbcGFydElkeF0gPT09ICdjaScpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZSA9IGZpbHRlclBhcnRzW3BhcnRJZHgrK10gPT09ICdjcyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gbWF0Y2ggbW9kZVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoTW9kZSA9IGZpbHRlclBhcnRzW3BhcnRJZHhdID8gRmlsdGVyTWF0Y2hNb2RlLmZyb21BYmJyZXZpYXRpb24oZmlsdGVyUGFydHNbcGFydElkeF0pID8/IGZpbHRlclBhcnRzW3BhcnRJZHhdIDogRmlsdGVyTWF0Y2hNb2RlLkVxdWFscztcbiAgICAgICAgICAgICAgICBwYXJ0SWR4Kys7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub1ZhbCA9IG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkV4aXN0cyB8fCBtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5Eb2VzTm90RXhpc3Q7XG5cbiAgICAgICAgICAgICAgICAvLyB2YWx1ZVxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBudWxsID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICghbm9WYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlclBhcnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0SWR4ID09PSBmaWx0ZXJQYXJ0cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpbHRlclBhcnRzW3BhcnRJZHhdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnRJZHggPCBmaWx0ZXJQYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IHRoYXQgc2hvdWxkIG5vdCBiZSBhcnJheSwgc28gam9pbiBiYWNrIHRvZ2V0aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpbHRlclBhcnRzLnNsaWNlKHBhcnRJZHgsIGZpbHRlclBhcnRzLmxlbmd0aCkuam9pbignOicpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWF0Y2hNb2RlICE9PSBGaWx0ZXJNYXRjaE1vZGUuRXhpc3RzICYmIG1hdGNoTW9kZSAhPT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgdW5kZWZpbmVkIGFuZCBtYXRjaCBtb2RlIGV4cGVjdHMgdmFsdWUsIHRoZW4gc2tpcFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICgobWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuSW4gfHwgbWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuTm90SW4gfHwgbWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuQmV0d2VlbikgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFycmF5VmFsOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgbWF0Y2ggbW9kZXMgZXhwZWN0IGFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignXCInKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50VG9rZW4gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXhwbGljaXRRdW90ZXMgPSBmYWxzZTsgLy90b2tlbiBpcyBxdW90ZWQsIGUuZy4gaW46MSwyLFwiMjJcIlwiXCIsXCIsMTIzXCJcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1b3Rlc09wZW5lZCA9IGZhbHNlOyAvL3Rva2VuIGhhcyBzdGFydGVkIHByb2Nlc3NpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcXVvdGVzRXhwbGljaXRseUNsb3NlZCA9IGZhbHNlOyAvL3Rva2VuIHByb2Nlc3NpbmcgaGFzIGZpbmlzaGVkLCBhZnRlciBzaW5nbGUgXCIgaW4gcXVvdGVkIG1vZGUsIG9yIGJlZm9yZSAsIGluIG5vdCBxdW90ZWRcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IHZhbHVlW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSB0b2tlbml6ZXIgd2hlbiBzZWVpbmcgdGhlIHRva2VuIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGlmIGVpdGhlcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHF1b3RlcyBoYXZlIG5vdCBiZWVuIG9wZW5lZCB5ZXQgKHdoZW4gdGhlcmUgYXJlIG5vIGNoYXJhY3RlcnMgYmV0d2VlbiBzZXBhcmF0b3JzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRva2VuIGhhcyBiZWVuIGV4cGxpY2l0bHkgY2xvc2VkICh3aGVuIHdlIGFjdHVhbGx5IGhhdmUgZXhwbGljaXQgb3BlbmluZyBpLmUuLCBxdW90ZXMgYXMgdGhlIGZpcnN0IGNoYXJhY3RlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igd2UgaGF2ZSBpbXBsaWNpdCBxdW90ZXMgKGkuZS4sIHF1b3RlcyBhcmUgbm90IHRoZSBmaXJzdCBjaGFyYWN0ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnLCcgJiYgKCFxdW90ZXNPcGVuZWQgfHwgcXVvdGVzRXhwbGljaXRseUNsb3NlZCB8fCAhZXhwbGljaXRRdW90ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZXNPcGVuZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rlc0V4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0UXVvdGVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGVkIGRvdWJsZS1xdW90ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBsaWNpdFF1b3RlcyAmJiBpICsgMSA8IHZhbHVlLmxlbmd0aCAmJiB2YWx1ZVtpICsgMV0gPT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4gKz0gYzsgLy8gQXBwZW5kIG9uZSBkb3VibGUtcXVvdGUgdG8gdGhlIGN1cnJlbnQgdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7IC8vIFNraXAgdGhlIG5leHQgZG91YmxlLXF1b3RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBlbmNvdW50ZXIgcXVvdGVzIGFnYWluIGFmdGVyIHRoZXkgd2VyZSB0aGUgZmlyc3QgY2hhcmFjdGVyID0+IHdlIGNsb3NlIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwbGljaXRRdW90ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZXNFeHBsaWNpdGx5Q2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcGxpY2l0IHF1b3Rlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocXVvdGVzT3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuICs9IGM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdW90ZXMgYXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgPT4gZXhwbGljaXRseSBvcGVuIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVzT3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdFF1b3RlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVvdGVzRXhwbGljaXRseUNsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVzT3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbiArPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1b3Rlc09wZW5lZCAmJiAhcXVvdGVzRXhwbGljaXRseUNsb3NlZCAmJiBleHBsaWNpdFF1b3Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBsYXN0IHRva2VuIGFmdGVyIHRoZSBsb29wIGVuZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50VG9rZW4udG9TdHJpbmcoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVZhbCA9IHRva2VucztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWwgPSB2YWx1ZS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuQmV0d2VlbiAmJiBhcnJheVZhbC5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJyYXlWYWw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUhLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlciB3aXRoIGVtcHR5IHZhbHVlIGlzIHRvIGJlIGlnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuZmlsdGVycykge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZmlsdGVycyA9IHt9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcmFtcy5maWx0ZXJzW3VybFBhcmFtS2V5IGFzIGtleW9mIG9iamVjdF0gPSB7dmFsdWU6IHZhbHVlLCBtYXRjaE1vZGU6IG1hdGNoTW9kZSwgY2FzZVNlbnNpdGl2ZTogY2FzZVNlbnNpdGl2ZX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBjb3B5IG9mIHRoZSBnaXZlbiBEYXRhTGlzdFBhcmFtcyBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPn0gcGFyYW1zIC0gVGhlIERhdGFMaXN0UGFyYW1zIG9iamVjdCB0byBiZSBjb3BpZWQuXG4gICAgICogQHJldHVybnMge0RhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPn0gLSBSZXR1cm5zIGEgbmV3IGNvcHkgb2YgdGhlIERhdGFMaXN0UGFyYW1zIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvcHk8U29ydHMgPSBzdHJpbmcsIEZpbHRlcnMgZXh0ZW5kcyBrZXlvZiBhbnkgPSBzdHJpbmc+KHBhcmFtczogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+KTogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+IHtcbiAgICAgICAgY29uc3QgY29weTogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+ID0ge1xuICAgICAgICAgICAgb2Zmc2V0OiBwYXJhbXMub2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQ6IHBhcmFtcy5saW1pdCxcbiAgICAgICAgICAgIHNlYXJjaDogcGFyYW1zLnNlYXJjaFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwYXJhbXMuc29ydCkge1xuICAgICAgICAgICAgY29weS5zb3J0ID0gcGFyYW1zLnNvcnQ/Lm1hcChzID0+ICh7Li4uc30pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLmZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvcHkuZmlsdGVycyA9IE9iamVjdC5lbnRyaWVzKHBhcmFtcy5maWx0ZXJzKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZSBhcyBEYXRhTGlzdEZpbHRlcjtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5maWx0ZXJWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBBcnJheS5pc0FycmF5KGZpbHRlclZhbHVlLnZhbHVlKSA/IFsuLi5maWx0ZXJWYWx1ZS52YWx1ZV0gOiBmaWx0ZXJWYWx1ZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9IGFzIERhdGFMaXN0RmlsdGVyXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sIHt9IGFzIERhdGFMaXN0RmlsdGVyc1R5cGU8RmlsdGVycz4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSB2YWx1ZSB0byBhIFVSTCBxdWVyeSBwYXJhbSBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthbGxvd051bGw9ZmFsc2VdIC0gSW5kaWNhdGVzIHdoZXRoZXIgbnVsbCB2YWx1ZXMgYXJlIGFsbG93ZWQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIFVSTCBwYXJhbWV0ZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLlxuICAgICAqIEB0aHJvd3Mge01uZ0ludGVybmFsRXJyb3J9IElmIGFuIHVuZGVmaW5lZCB2YWx1ZSBpcyBwYXNzZWQgd2l0aG91dCBhbGxvd051bGwgc2V0IHRvIHRydWUuXG4gICAgICogQHRocm93cyB7TW5nSW50ZXJuYWxFcnJvcn0gSWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCAoZXhjbHVkaW5nIERhdGUpLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZmlsdGVyVmFsdWVUb1VybFBhcmFtKHZhbHVlOiB1bmtub3duLCBhbGxvd051bGwgPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiBhbGxvd051bGwpIHJldHVybiAnbnVsbCc7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTW5nSW50ZXJuYWxFcnJvcignVW5kZWZpbmVkIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdXJsIHBhcmFtLicpOyAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0IGVhcmxpZXJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICAgICAgLm1hcCh2ID0+IERhdGFMaXN0UGFyYW1zVXRpbC5maWx0ZXJWYWx1ZVRvVXJsUGFyYW0odiwgYWxsb3dOdWxsKSlcbiAgICAgICAgICAgICAgICAubWFwKHYgPT4gKHYuaW5kZXhPZignLCcpID49IDAgfHwgdi5pbmRleE9mKCdcIicpID49IDAgPyBgXCIke3YucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiYCA6IHYpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gRGF0ZVV0aWwudG9Jc29TdHJpbmcodmFsdWUsICdkYXRlVGltZScsIHt1dGM6IHRydWV9KTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBNbmdJbnRlcm5hbEVycm9yKCdGaWx0ZXIgdmFsdWUgY2Fubm90IGJlIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -107,7 +107,7 @@ export class DateUtil {
|
|
|
107
107
|
return base;
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
|
-
static
|
|
110
|
+
static fromAngularToPrimeDateFormat(ngDateFormat) {
|
|
111
111
|
let primeDateFormat = ngDateFormat;
|
|
112
112
|
for (const regex of DateUtil.NG_PRIME_FORMAT_OTHER) {
|
|
113
113
|
primeDateFormat = primeDateFormat.replace(regex, ' ');
|
|
@@ -126,5 +126,11 @@ export class DateUtil {
|
|
|
126
126
|
primeDateFormat = primeDateFormat.replace(/\s\s+/g, ' ');
|
|
127
127
|
return primeDateFormat.trim();
|
|
128
128
|
}
|
|
129
|
+
static fromAngularDateFormatHasTime(ngDateFormat) {
|
|
130
|
+
return /[hHmsS]/.test(ngDateFormat);
|
|
131
|
+
}
|
|
132
|
+
static fromAngularDateFormatHasSeconds(ngDateFormat) {
|
|
133
|
+
return /[sS]/.test(ngDateFormat);
|
|
134
|
+
}
|
|
129
135
|
}
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi91dGlscy9kYXRlLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLFFBQVE7YUFDTyw4QkFBeUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQzFHLDBCQUFxQixHQUFHO1FBQzVDLFNBQVM7UUFDVCxTQUFTO1FBQ1QsSUFBSTtRQUNKLFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO0tBQ1osQ0FBQzthQUNzQix3QkFBbUIsR0FBRztRQUMxQyxPQUFPO1FBQ1AsQ0FBQyxFQUFFLEdBQUc7UUFDTixFQUFFLEVBQUUsSUFBSTtRQUNSLENBQUMsRUFBRSxHQUFHO1FBQ04sRUFBRSxFQUFFLEdBQUc7UUFDUCxHQUFHLEVBQUUsR0FBRztRQUNSLElBQUksRUFBRSxJQUFJO1FBQ1YsS0FBSyxFQUFFLEdBQUc7UUFDVixNQUFNLEVBQUUsR0FBRztRQUNYLENBQUMsRUFBRSxHQUFHO1FBQ04sRUFBRSxFQUFFLElBQUk7UUFDUixHQUFHLEVBQUUsR0FBRztRQUNSLElBQUksRUFBRSxJQUFJO1FBQ1YsS0FBSyxFQUFFLEdBQUc7UUFDVixNQUFNLEVBQUUsR0FBRztRQUNYLFNBQVM7UUFDVCxDQUFDLEVBQUUsR0FBRztRQUNOLEVBQUUsRUFBRSxJQUFJO1FBQ1IsR0FBRyxFQUFFLEdBQUc7UUFDUixJQUFJLEVBQUUsSUFBSTtRQUNWLEtBQUssRUFBRSxHQUFHO1FBQ1YsQ0FBQyxFQUFFLEdBQUc7UUFDTixFQUFFLEVBQUUsSUFBSTtRQUNSLEdBQUcsRUFBRSxHQUFHO1FBQ1IsSUFBSSxFQUFFLElBQUk7UUFDVixLQUFLLEVBQUUsR0FBRztRQUNWLE9BQU87UUFDUCxDQUFDLEVBQUUsR0FBRztRQUNOLEVBQUUsRUFBRSxHQUFHO1FBQ1AsR0FBRyxFQUFFLElBQUk7UUFDVCxJQUFJLEVBQUUsSUFBSTtRQUNWLENBQUMsRUFBRSxHQUFHO1FBQ04sRUFBRSxFQUFFLEdBQUc7UUFDUCxHQUFHLEVBQUUsSUFBSTtRQUNULElBQUksRUFBRSxJQUFJO0tBQ2IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBVyxFQUFFLElBQUksR0FBRyxDQUFDO1FBQzFDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixPQUFPLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFO1lBQ3RCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1NBQ25CO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBT00sTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFjLEVBQUUsT0FBK0IsV0FBVyxFQUFFLGVBQTRDLEVBQUU7UUFDaEksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDM0IsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDM0IsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxFQUFFO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDakIsMEVBQTBFO1lBQzFFLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUMzSDtRQUNELElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRTtZQUNsQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDOUIsSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFO2dCQUN2QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQyxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMxRTtZQUNELElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRTtnQkFDekIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDMUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztTQUNkO2FBQU07WUFDSCxJQUFJLElBQUksR0FDSixLQUFLLENBQUMsV0FBVyxFQUFFO2dCQUNuQixHQUFHO2dCQUNILFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDeEMsR0FBRztnQkFDSCxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsR0FBRztnQkFDSCxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDcEMsR0FBRztnQkFDSCxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDdEMsR0FBRztnQkFDSCxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBRTNDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFO2dCQUN4QixJQUFJLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7YUFDN0Q7WUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRTtnQkFDMUIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsRUFDbEMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUUvQixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzNIO1lBRUQsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNMLENBQUM7SUFFTSxNQUFNLENBQUMsNEJBQTRCLENBQUMsWUFBb0I7UUFDM0QsSUFBSSxlQUFlLEdBQUcsWUFBWSxDQUFDO1FBQ25DLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxDQUFDLHFCQUFxQixFQUFFO1lBQ2hELGVBQWUsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztTQUN6RDtRQUNELEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxDQUFDLHlCQUF5QixFQUFFO1lBQ3BELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0QsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUU7Z0JBQ3pCLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRTtvQkFDYixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUF3QixDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2RixlQUFlLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLFdBQVcsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN4STthQUNKO1NBQ0o7UUFDRCxlQUFlLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUQsZUFBZSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXpELE9BQU8sZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB0b0lzb1N0cmluZ1R5cGVPcHRUeXBlID0gJ2RhdGUnIHwgJ2RhdGUtdGltZScgfCAnZGF0ZVRpbWUnO1xuZXhwb3J0IHR5cGUgdG9Jc29TdHJpbmdEYXRlVGltZU9wdHNUeXBlID0ge3V0Yz86IGJvb2xlYW47IG5vVGltZXpvbmU/OiBib29sZWFuOyBub01pbGxpcz86IGJvb2xlYW59O1xuXG5leHBvcnQgY2xhc3MgRGF0ZVV0aWwge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE5HX1BSSU1FX0ZPUk1BVF9TVVBQT1JURUQgPSBbL2R7MSwyfS9nLCAvRXsxLDV9L2csIC9jezEsNX0vZywgL017MSw1fS9nLCAvTHsxLDV9L2csIC95ezEsNH0vZywgL1l7MSw0fS9nXTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBOR19QUklNRV9GT1JNQVRfT1RIRVIgPSBbXG4gICAgICAgIC9HezEsNX0vZyxcbiAgICAgICAgL3d7MSwyfS9nLFxuICAgICAgICAvVy9nLFxuICAgICAgICAvYXsxLDV9L2csXG4gICAgICAgIC9CezEsNX0vZyxcbiAgICAgICAgL2J7MSw1fS9nLFxuICAgICAgICAvaHsxLDJ9L2csXG4gICAgICAgIC9IezEsMn0vZyxcbiAgICAgICAgL217MSwyfS9nLFxuICAgICAgICAvc3sxLDJ9L2csXG4gICAgICAgIC9TezEsM30vZyxcbiAgICAgICAgL3p7MSw0fS9nLFxuICAgICAgICAvWnsxLDV9L2csXG4gICAgICAgIC9PezEsNH0vZ1xuICAgIF07XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTkdfUFJJTUVfRk9STUFUX01BUCA9IHtcbiAgICAgICAgLy8gZGF5c1xuICAgICAgICBkOiAnZCcsXG4gICAgICAgIGRkOiAnZGQnLFxuICAgICAgICBFOiAnRCcsXG4gICAgICAgIEVFOiAnRCcsXG4gICAgICAgIEVFRTogJ0QnLFxuICAgICAgICBFRUVFOiAnREQnLFxuICAgICAgICBFRUVFRTogJ0QnLFxuICAgICAgICBFRUVFRUU6ICdEJyxcbiAgICAgICAgYzogJ2QnLFxuICAgICAgICBjYzogJ2RkJyxcbiAgICAgICAgY2NjOiAnRCcsXG4gICAgICAgIGNjY2M6ICdERCcsXG4gICAgICAgIGNjY2NjOiAnRCcsXG4gICAgICAgIGNjY2NjYzogJ0QnLFxuICAgICAgICAvLyBtb250aHNcbiAgICAgICAgTTogJ20nLFxuICAgICAgICBNTTogJ21tJyxcbiAgICAgICAgTU1NOiAnTScsXG4gICAgICAgIE1NTU06ICdNTScsXG4gICAgICAgIE1NTU1NOiAnTScsXG4gICAgICAgIEw6ICdtJyxcbiAgICAgICAgTEw6ICdtbScsXG4gICAgICAgIExMTDogJ00nLFxuICAgICAgICBMTExMOiAnTU0nLFxuICAgICAgICBMTExMTDogJ00nLFxuICAgICAgICAvLyB5ZWFyXG4gICAgICAgIHk6ICd5JyxcbiAgICAgICAgeXk6ICd5JyxcbiAgICAgICAgeXl5OiAneXknLFxuICAgICAgICB5eXl5OiAneXknLFxuICAgICAgICBZOiAneScsXG4gICAgICAgIFlZOiAneScsXG4gICAgICAgIFlZWTogJ3l5JyxcbiAgICAgICAgWVlZWTogJ3l5J1xuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBwYWROdW1iZXIobnVtOiBudW1iZXIsIHNpemUgPSAyKSB7XG4gICAgICAgIGxldCBzdHIgPSBTdHJpbmcobnVtKTtcbiAgICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPCBzaXplKSB7XG4gICAgICAgICAgICBzdHIgPSAnMCcgKyBzdHI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRvSXNvU3RyaW5nKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCB0eXBlPzogJ2RhdGUnKTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IERhdGUsIHR5cGU6ICdkYXRlLXRpbWUnIHwgJ2RhdGVUaW1lJywgZGF0ZVRpbWVPcHRzPzogdG9Jc29TdHJpbmdEYXRlVGltZU9wdHNUeXBlKTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHVuZGVmaW5lZCB8IG51bGwgfCB1bmtub3duLCB0eXBlPzogJ2RhdGUnKTogbnVsbDtcbiAgICBwdWJsaWMgc3RhdGljIHRvSXNvU3RyaW5nKHZhbHVlOiB1bmRlZmluZWQgfCBudWxsIHwgdW5rbm93biwgdHlwZTogJ2RhdGUtdGltZScgfCAnZGF0ZVRpbWUnLCBkYXRlVGltZU9wdHM/OiB0b0lzb1N0cmluZ0RhdGVUaW1lT3B0c1R5cGUpOiBudWxsO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHVua25vd24sIHR5cGU/OiB0b0lzb1N0cmluZ1R5cGVPcHRUeXBlLCBkYXRlVGltZU9wdHM/OiB0b0lzb1N0cmluZ0RhdGVUaW1lT3B0c1R5cGUpOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHVua25vd24sIHR5cGU6IHRvSXNvU3RyaW5nVHlwZU9wdFR5cGUgPSAnZGF0ZS10aW1lJywgZGF0ZVRpbWVPcHRzOiB0b0lzb1N0cmluZ0RhdGVUaW1lT3B0c1R5cGUgPSB7fSk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgIC8vIGRhdGUgb25seSwgbm8gdGltZSBwYXJ0IChhbmQgdGltZXpvbmUsIG1pbGxpcywgdXRjIGRvZXMgbm90IG1hdHRlciAuLi4pXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuZ2V0RnVsbFllYXIoKSArICctJyArIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNb250aCgpICsgMSkgKyAnLScgKyBEYXRlVXRpbC5wYWROdW1iZXIodmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVRpbWVPcHRzLnV0Yykge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoZGF0ZVRpbWVPcHRzLm5vTWlsbGlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZG90SWR4ID0gc3RyLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygwLCBkb3RJZHgpICsgc3RyLnN1YnN0cmluZyhkb3RJZHggKyA0LCBzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRlVGltZU9wdHMubm9UaW1lem9uZSkge1xuICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgc3RyLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBiYXNlID1cbiAgICAgICAgICAgICAgICB2YWx1ZS5nZXRGdWxsWWVhcigpICtcbiAgICAgICAgICAgICAgICAnLScgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNb250aCgpICsgMSkgK1xuICAgICAgICAgICAgICAgICctJyArXG4gICAgICAgICAgICAgICAgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldERhdGUoKSkgK1xuICAgICAgICAgICAgICAgICdUJyArXG4gICAgICAgICAgICAgICAgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldEhvdXJzKCkpICtcbiAgICAgICAgICAgICAgICAnOicgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgICAgICAgICAgICAnOicgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRTZWNvbmRzKCkpO1xuXG4gICAgICAgICAgICBpZiAoIWRhdGVUaW1lT3B0cy5ub01pbGxpcykge1xuICAgICAgICAgICAgICAgIGJhc2UgKz0gJy4nICsgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldE1pbGxpc2Vjb25kcygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGF0ZVRpbWVPcHRzLm5vVGltZXpvbmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0em8gPSAtdmFsdWUuZ2V0VGltZXpvbmVPZmZzZXQoKSxcbiAgICAgICAgICAgICAgICAgICAgZGlmID0gdHpvID49IDAgPyAnKycgOiAnLSc7XG5cbiAgICAgICAgICAgICAgICBiYXNlID0gYmFzZSArIChkaWYgKyBEYXRlVXRpbC5wYWROdW1iZXIoTWF0aC5mbG9vcihNYXRoLmFicyh0em8pIC8gNjApKSArICc6JyArIERhdGVVdGlsLnBhZE51bWJlcihNYXRoLmFicyh0em8pICUgNjApKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21QcmltZVRvQW5ndWxhckRhdGVGb3JtYXQobmdEYXRlRm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcHJpbWVEYXRlRm9ybWF0ID0gbmdEYXRlRm9ybWF0O1xuICAgICAgICBmb3IgKGNvbnN0IHJlZ2V4IG9mIERhdGVVdGlsLk5HX1BSSU1FX0ZPUk1BVF9PVEhFUikge1xuICAgICAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnJlcGxhY2UocmVnZXgsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByZWdleCBvZiBEYXRlVXRpbC5OR19QUklNRV9GT1JNQVRfU1VQUE9SVEVEKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gWy4uLnByaW1lRGF0ZUZvcm1hdC5tYXRjaEFsbChyZWdleCldLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaC5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaFN0ciA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9IERhdGVVdGlsLk5HX1BSSU1FX0ZPUk1BVF9NQVBbbWF0Y2hTdHIgYXMga2V5b2Ygb2JqZWN0XSA/PyBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyByZXBsYWNlbWVudCArIHByaW1lRGF0ZUZvcm1hdC5zdWJzdHJpbmcobWF0Y2guaW5kZXggKyBtYXRjaFN0ci5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcmltZURhdGVGb3JtYXQgPSBwcmltZURhdGVGb3JtYXQucmVwbGFjZSgvXFxzK1xcV1xccysvZywgJyAnKTtcbiAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnJlcGxhY2UoL1xcc1xccysvZywgJyAnKTtcblxuICAgICAgICByZXR1cm4gcHJpbWVEYXRlRm9ybWF0LnRyaW0oKTtcbiAgICB9XG59XG4iXX0=
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi91dGlscy9kYXRlLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLFFBQVE7YUFDTyw4QkFBeUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQzFHLDBCQUFxQixHQUFHO1FBQzVDLFNBQVM7UUFDVCxTQUFTO1FBQ1QsSUFBSTtRQUNKLFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO0tBQ1osQ0FBQzthQUNzQix3QkFBbUIsR0FBRztRQUMxQyxPQUFPO1FBQ1AsQ0FBQyxFQUFFLEdBQUc7UUFDTixFQUFFLEVBQUUsSUFBSTtRQUNSLENBQUMsRUFBRSxHQUFHO1FBQ04sRUFBRSxFQUFFLEdBQUc7UUFDUCxHQUFHLEVBQUUsR0FBRztRQUNSLElBQUksRUFBRSxJQUFJO1FBQ1YsS0FBSyxFQUFFLEdBQUc7UUFDVixNQUFNLEVBQUUsR0FBRztRQUNYLENBQUMsRUFBRSxHQUFHO1FBQ04sRUFBRSxFQUFFLElBQUk7UUFDUixHQUFHLEVBQUUsR0FBRztRQUNSLElBQUksRUFBRSxJQUFJO1FBQ1YsS0FBSyxFQUFFLEdBQUc7UUFDVixNQUFNLEVBQUUsR0FBRztRQUNYLFNBQVM7UUFDVCxDQUFDLEVBQUUsR0FBRztRQUNOLEVBQUUsRUFBRSxJQUFJO1FBQ1IsR0FBRyxFQUFFLEdBQUc7UUFDUixJQUFJLEVBQUUsSUFBSTtRQUNWLEtBQUssRUFBRSxHQUFHO1FBQ1YsQ0FBQyxFQUFFLEdBQUc7UUFDTixFQUFFLEVBQUUsSUFBSTtRQUNSLEdBQUcsRUFBRSxHQUFHO1FBQ1IsSUFB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RyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUF3QixDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2RixlQUFlLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLFdBQVcsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN4STthQUNKO1NBQ0o7UUFDRCxlQUFlLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUQsZUFBZSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXpELE9BQU8sZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxNQUFNLENBQUMsNEJBQTRCLENBQUMsWUFBb0I7UUFDM0QsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxNQUFNLENBQUMsK0JBQStCLENBQUMsWUFBb0I7UUFDOUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB0b0lzb1N0cmluZ1R5cGVPcHRUeXBlID0gJ2RhdGUnIHwgJ2RhdGUtdGltZScgfCAnZGF0ZVRpbWUnO1xuZXhwb3J0IHR5cGUgdG9Jc29TdHJpbmdEYXRlVGltZU9wdHNUeXBlID0ge3V0Yz86IGJvb2xlYW47IG5vVGltZXpvbmU/OiBib29sZWFuOyBub01pbGxpcz86IGJvb2xlYW59O1xuXG5leHBvcnQgY2xhc3MgRGF0ZVV0aWwge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE5HX1BSSU1FX0ZPUk1BVF9TVVBQT1JURUQgPSBbL2R7MSwyfS9nLCAvRXsxLDV9L2csIC9jezEsNX0vZywgL017MSw1fS9nLCAvTHsxLDV9L2csIC95ezEsNH0vZywgL1l7MSw0fS9nXTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBOR19QUklNRV9GT1JNQVRfT1RIRVIgPSBbXG4gICAgICAgIC9HezEsNX0vZyxcbiAgICAgICAgL3d7MSwyfS9nLFxuICAgICAgICAvVy9nLFxuICAgICAgICAvYXsxLDV9L2csXG4gICAgICAgIC9CezEsNX0vZyxcbiAgICAgICAgL2J7MSw1fS9nLFxuICAgICAgICAvaHsxLDJ9L2csXG4gICAgICAgIC9IezEsMn0vZyxcbiAgICAgICAgL217MSwyfS9nLFxuICAgICAgICAvc3sxLDJ9L2csXG4gICAgICAgIC9TezEsM30vZyxcbiAgICAgICAgL3p7MSw0fS9nLFxuICAgICAgICAvWnsxLDV9L2csXG4gICAgICAgIC9PezEsNH0vZ1xuICAgIF07XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTkdfUFJJTUVfRk9STUFUX01BUCA9IHtcbiAgICAgICAgLy8gZGF5c1xuICAgICAgICBkOiAnZCcsXG4gICAgICAgIGRkOiAnZGQnLFxuICAgICAgICBFOiAnRCcsXG4gICAgICAgIEVFOiAnRCcsXG4gICAgICAgIEVFRTogJ0QnLFxuICAgICAgICBFRUVFOiAnREQnLFxuICAgICAgICBFRUVFRTogJ0QnLFxuICAgICAgICBFRUVFRUU6ICdEJyxcbiAgICAgICAgYzogJ2QnLFxuICAgICAgICBjYzogJ2RkJyxcbiAgICAgICAgY2NjOiAnRCcsXG4gICAgICAgIGNjY2M6ICdERCcsXG4gICAgICAgIGNjY2NjOiAnRCcsXG4gICAgICAgIGNjY2NjYzogJ0QnLFxuICAgICAgICAvLyBtb250aHNcbiAgICAgICAgTTogJ20nLFxuICAgICAgICBNTTogJ21tJyxcbiAgICAgICAgTU1NOiAnTScsXG4gICAgICAgIE1NTU06ICdNTScsXG4gICAgICAgIE1NTU1NOiAnTScsXG4gICAgICAgIEw6ICdtJyxcbiAgICAgICAgTEw6ICdtbScsXG4gICAgICAgIExMTDogJ00nLFxuICAgICAgICBMTExMOiAnTU0nLFxuICAgICAgICBMTExMTDogJ00nLFxuICAgICAgICAvLyB5ZWFyXG4gICAgICAgIHk6ICd5JyxcbiAgICAgICAgeXk6ICd5JyxcbiAgICAgICAgeXl5OiAneXknLFxuICAgICAgICB5eXl5OiAneXknLFxuICAgICAgICBZOiAneScsXG4gICAgICAgIFlZOiAneScsXG4gICAgICAgIFlZWTogJ3l5JyxcbiAgICAgICAgWVlZWTogJ3l5J1xuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBwYWROdW1iZXIobnVtOiBudW1iZXIsIHNpemUgPSAyKSB7XG4gICAgICAgIGxldCBzdHIgPSBTdHJpbmcobnVtKTtcbiAgICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPCBzaXplKSB7XG4gICAgICAgICAgICBzdHIgPSAnMCcgKyBzdHI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRvSXNvU3RyaW5nKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCB0eXBlPzogJ2RhdGUnKTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IERhdGUsIHR5cGU6ICdkYXRlLXRpbWUnIHwgJ2RhdGVUaW1lJywgZGF0ZVRpbWVPcHRzPzogdG9Jc29TdHJpbmdEYXRlVGltZU9wdHNUeXBlKTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHVuZGVmaW5lZCB8IG51bGwgfCB1bmtub3duLCB0eXBlPzogJ2RhdGUnKTogbnVsbDtcbiAgICBwdWJsaWMgc3RhdGljIHRvSXNvU3RyaW5nKHZhbHVlOiB1bmRlZmluZWQgfCBudWxsIHwgdW5rbm93biwgdHlwZTogJ2RhdGUtdGltZScgfCAnZGF0ZVRpbWUnLCBkYXRlVGltZU9wdHM/OiB0b0lzb1N0cmluZ0RhdGVUaW1lT3B0c1R5cGUpOiBudWxsO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHVua25vd24sIHR5cGU/OiB0b0lzb1N0cmluZ1R5cGVPcHRUeXBlLCBkYXRlVGltZU9wdHM/OiB0b0lzb1N0cmluZ0RhdGVUaW1lT3B0c1R5cGUpOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHVua25vd24sIHR5cGU6IHRvSXNvU3RyaW5nVHlwZU9wdFR5cGUgPSAnZGF0ZS10aW1lJywgZGF0ZVRpbWVPcHRzOiB0b0lzb1N0cmluZ0RhdGVUaW1lT3B0c1R5cGUgPSB7fSk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgIC8vIGRhdGUgb25seSwgbm8gdGltZSBwYXJ0IChhbmQgdGltZXpvbmUsIG1pbGxpcywgdXRjIGRvZXMgbm90IG1hdHRlciAuLi4pXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuZ2V0RnVsbFllYXIoKSArICctJyArIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNb250aCgpICsgMSkgKyAnLScgKyBEYXRlVXRpbC5wYWROdW1iZXIodmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVRpbWVPcHRzLnV0Yykge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoZGF0ZVRpbWVPcHRzLm5vTWlsbGlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZG90SWR4ID0gc3RyLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygwLCBkb3RJZHgpICsgc3RyLnN1YnN0cmluZyhkb3RJZHggKyA0LCBzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRlVGltZU9wdHMubm9UaW1lem9uZSkge1xuICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgc3RyLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBiYXNlID1cbiAgICAgICAgICAgICAgICB2YWx1ZS5nZXRGdWxsWWVhcigpICtcbiAgICAgICAgICAgICAgICAnLScgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNb250aCgpICsgMSkgK1xuICAgICAgICAgICAgICAgICctJyArXG4gICAgICAgICAgICAgICAgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldERhdGUoKSkgK1xuICAgICAgICAgICAgICAgICdUJyArXG4gICAgICAgICAgICAgICAgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldEhvdXJzKCkpICtcbiAgICAgICAgICAgICAgICAnOicgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgICAgICAgICAgICAnOicgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRTZWNvbmRzKCkpO1xuXG4gICAgICAgICAgICBpZiAoIWRhdGVUaW1lT3B0cy5ub01pbGxpcykge1xuICAgICAgICAgICAgICAgIGJhc2UgKz0gJy4nICsgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldE1pbGxpc2Vjb25kcygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGF0ZVRpbWVPcHRzLm5vVGltZXpvbmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0em8gPSAtdmFsdWUuZ2V0VGltZXpvbmVPZmZzZXQoKSxcbiAgICAgICAgICAgICAgICAgICAgZGlmID0gdHpvID49IDAgPyAnKycgOiAnLSc7XG5cbiAgICAgICAgICAgICAgICBiYXNlID0gYmFzZSArIChkaWYgKyBEYXRlVXRpbC5wYWROdW1iZXIoTWF0aC5mbG9vcihNYXRoLmFicyh0em8pIC8gNjApKSArICc6JyArIERhdGVVdGlsLnBhZE51bWJlcihNYXRoLmFicyh0em8pICUgNjApKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21Bbmd1bGFyVG9QcmltZURhdGVGb3JtYXQobmdEYXRlRm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcHJpbWVEYXRlRm9ybWF0ID0gbmdEYXRlRm9ybWF0O1xuICAgICAgICBmb3IgKGNvbnN0IHJlZ2V4IG9mIERhdGVVdGlsLk5HX1BSSU1FX0ZPUk1BVF9PVEhFUikge1xuICAgICAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnJlcGxhY2UocmVnZXgsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByZWdleCBvZiBEYXRlVXRpbC5OR19QUklNRV9GT1JNQVRfU1VQUE9SVEVEKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gWy4uLnByaW1lRGF0ZUZvcm1hdC5tYXRjaEFsbChyZWdleCldLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaC5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaFN0ciA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9IERhdGVVdGlsLk5HX1BSSU1FX0ZPUk1BVF9NQVBbbWF0Y2hTdHIgYXMga2V5b2Ygb2JqZWN0XSA/PyBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyByZXBsYWNlbWVudCArIHByaW1lRGF0ZUZvcm1hdC5zdWJzdHJpbmcobWF0Y2guaW5kZXggKyBtYXRjaFN0ci5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcmltZURhdGVGb3JtYXQgPSBwcmltZURhdGVGb3JtYXQucmVwbGFjZSgvXFxzK1xcV1xccysvZywgJyAnKTtcbiAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnJlcGxhY2UoL1xcc1xccysvZywgJyAnKTtcblxuICAgICAgICByZXR1cm4gcHJpbWVEYXRlRm9ybWF0LnRyaW0oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21Bbmd1bGFyRGF0ZUZvcm1hdEhhc1RpbWUobmdEYXRlRm9ybWF0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIC9baEhtc1NdLy50ZXN0KG5nRGF0ZUZvcm1hdCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQW5ndWxhckRhdGVGb3JtYXRIYXNTZWNvbmRzKG5nRGF0ZUZvcm1hdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAvW3NTXS8udGVzdChuZ0RhdGVGb3JtYXQpO1xuICAgIH1cbn1cbiJdfQ==
|