geonetwork-ui 2.4.0-dev.fdf8f64b → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -7
- package/esm2022/libs/api/metadata-converter/src/lib/common/distribution.mapper.mjs +3 -1
- package/esm2022/libs/api/metadata-converter/src/lib/common/license.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/common/resource-types.mjs +38 -0
- package/esm2022/libs/api/metadata-converter/src/lib/common/url.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/convert-utils.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.mjs +51 -35
- package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.mjs +71 -40
- package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/utils/graph-utils.mjs +37 -26
- package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/utils/serialize-to-xml.mjs +30 -8
- package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/write-parts.mjs +32 -12
- package/esm2022/libs/api/metadata-converter/src/lib/find-converter.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/function-utils.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.converter.mjs +7 -6
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +31 -18
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/metadata-url.service.mjs +5 -5
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/elasticsearch.model.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.mjs +11 -5
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +36 -12
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +45 -18
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +150 -87
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +114 -28
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +116 -63
- package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +77 -22
- package/esm2022/libs/api/repository/src/lib/gn4/auth/auth.service.mjs +36 -9
- package/esm2022/libs/api/repository/src/lib/gn4/auth/gravatar.service.mjs +5 -5
- package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/date-range.utils.mjs +12 -0
- package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +50 -25
- package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/index.mjs +2 -1
- package/esm2022/libs/api/repository/src/lib/gn4/favorites/favorites.service.mjs +4 -4
- package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +61 -15
- package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.mjs +4 -4
- package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +5 -5
- package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +5 -5
- package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +59 -31
- package/esm2022/libs/api/repository/src/lib/gn4/selection/selection.service.mjs +4 -4
- package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +4 -4
- package/esm2022/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/model/error/index.mjs +2 -0
- package/esm2022/libs/common/domain/src/lib/model/error/publication-version.error.mjs +8 -0
- package/esm2022/libs/common/domain/src/lib/model/record/contact.model.mjs +19 -19
- package/esm2022/libs/common/domain/src/lib/model/record/index.mjs +2 -1
- package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/model/record/organization.model.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/model/record/translation.model.mjs +2 -0
- package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/model/search/sort-by.model.mjs +2 -1
- package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
- package/esm2022/libs/data-access/gn4/src/openapi/api/atom.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/customstyle.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/formatters.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/groups.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/harvesters.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/identifiers.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/languages.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/links.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/logos.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/mapservers.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/mapservices.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/me.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/operations.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/pages.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/processes.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/regions.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/registries.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/related.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/search.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/selections.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/site.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/sources.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/standards.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/status.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/tags.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/tools.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/ui.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/userfeedback.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/users.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/usersearches.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api/userselections.api.service.mjs +6 -6
- package/esm2022/libs/data-access/gn4/src/openapi/api.module.mjs +7 -7
- package/esm2022/libs/data-access/gn4/src/openapi/configuration.mjs +1 -1
- package/esm2022/libs/feature/auth/src/lib/feature-auth.module.mjs +4 -4
- package/esm2022/libs/feature/catalog/src/lib/feature-catalog.module.mjs +14 -21
- package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -4
- package/esm2022/libs/feature/catalog/src/lib/organisations/organisations.component.mjs +41 -16
- package/esm2022/libs/feature/catalog/src/lib/records/records.service.mjs +4 -4
- package/esm2022/libs/feature/catalog/src/lib/site-title/site-title.component.mjs +6 -6
- package/esm2022/libs/feature/catalog/src/lib/source-label/source-label.component.mjs +5 -5
- package/esm2022/libs/feature/catalog/src/lib/sources/sources.service.mjs +4 -4
- package/esm2022/libs/feature/dataviz/src/index.mjs +1 -2
- package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +18 -11
- package/esm2022/libs/feature/dataviz/src/lib/figure/figure-container/figure-container.component.mjs +7 -6
- package/esm2022/libs/feature/dataviz/src/lib/figure/figure.service.mjs +4 -4
- package/esm2022/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.mjs +7 -10
- package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +20 -9
- package/esm2022/libs/feature/dataviz/src/lib/table-view/table-view.component.mjs +16 -10
- package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +4 -1
- package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +23 -6
- package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +12 -4
- package/esm2022/libs/feature/editor/src/lib/+state/editor.models.mjs +1 -1
- package/esm2022/libs/feature/editor/src/lib/+state/editor.reducer.mjs +25 -1
- package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +2 -1
- package/esm2022/libs/feature/editor/src/lib/components/constraint-card/constraint-card.component.mjs +68 -0
- package/esm2022/libs/feature/editor/src/lib/components/contact-card/contact-card.component.mjs +5 -6
- package/esm2022/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.mjs +18 -10
- package/esm2022/libs/feature/editor/src/lib/components/import-record/import-record.component.mjs +36 -18
- package/esm2022/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.mjs +23 -9
- package/esm2022/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.mjs +8 -7
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-array/form-field-array.component.mjs +3 -3
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints/form-field-constraints.component.mjs +76 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints-shortcuts/constraints.utils.mjs +35 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints-shortcuts/form-field-constraints-shortcuts.component.mjs +130 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts/form-field-contacts.component.mjs +6 -6
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.mjs +19 -9
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-date/form-field-date.component.mjs +19 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-file/form-field-file.component.mjs +5 -5
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.mjs +5 -5
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +31 -50
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.mjs +4 -4
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-object/form-field-object.component.mjs +3 -3
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.mjs +18 -11
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-resources/form-field-online-resources.component.mjs +17 -12
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.mjs +17 -17
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.mjs +19 -12
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.mjs +5 -5
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.mjs +7 -26
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +6 -30
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-toggle/form-field-spatial-toggle.component.mjs +44 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.mjs +19 -9
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +6 -6
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +29 -12
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +2 -2
- package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +6 -6
- package/esm2022/libs/feature/editor/src/lib/components/wizard/wizard.component.mjs +5 -5
- package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +7 -7
- package/esm2022/libs/feature/editor/src/lib/components/wizard-summarize/wizard-summarize.component.mjs +5 -5
- package/esm2022/libs/feature/editor/src/lib/expressions.mjs +1 -1
- package/esm2022/libs/feature/editor/src/lib/feature-editor.module.mjs +4 -4
- package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +77 -13
- package/esm2022/libs/feature/editor/src/lib/models/editor-config.model.mjs +1 -1
- package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +9 -5
- package/esm2022/libs/feature/editor/src/lib/services/wizard.service.mjs +5 -5
- package/esm2022/libs/feature/map/src/lib/+state/map.facade.mjs +4 -4
- package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.mjs +4 -4
- package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +5 -5
- package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +5 -5
- package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +5 -5
- package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +5 -5
- package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +6 -6
- package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +5 -9
- package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +5 -5
- package/esm2022/libs/feature/map/src/lib/geocoding.service.mjs +6 -6
- package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +33 -15
- package/esm2022/libs/feature/map/src/lib/map-state-container/map-state-container.component.mjs +5 -5
- package/esm2022/libs/feature/map/src/lib/style/map-style.service.mjs +4 -4
- package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +4 -4
- package/esm2022/libs/feature/notifications/src/lib/feature-notifications.module.mjs +4 -4
- package/esm2022/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.mjs +4 -4
- package/esm2022/libs/feature/notifications/src/lib/notifications.service.mjs +6 -5
- package/esm2022/libs/feature/record/src/index.mjs +4 -1
- package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +17 -10
- package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +12 -10
- package/esm2022/libs/feature/record/src/lib/data-view-share/data-view-share.component.mjs +18 -10
- package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +13 -11
- package/esm2022/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.mjs +12 -10
- package/esm2022/libs/feature/record/src/lib/feature-record.module.mjs +25 -58
- package/esm2022/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.mjs +169 -0
- package/esm2022/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.mjs +45 -0
- package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +56 -20
- package/esm2022/libs/feature/record/src/lib/record-meta/record-meta.component.mjs +45 -0
- package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +5 -5
- package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +14 -6
- package/esm2022/libs/feature/router/src/lib/default/constants.mjs +1 -1
- package/esm2022/libs/feature/router/src/lib/default/container/search-router.container.directive.mjs +6 -6
- package/esm2022/libs/feature/router/src/lib/default/router.module.mjs +5 -5
- package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +5 -5
- package/esm2022/libs/feature/router/src/lib/default/services/router-search.service.mjs +4 -4
- package/esm2022/libs/feature/router/src/lib/default/state/query-params.utils.mjs +50 -0
- package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +8 -8
- package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +9 -8
- package/esm2022/libs/feature/search/src/index.mjs +3 -1
- package/esm2022/libs/feature/search/src/lib/constants.mjs +2 -2
- package/esm2022/libs/feature/search/src/lib/facets/facets-container/facets-container.component.mjs +4 -4
- package/esm2022/libs/feature/search/src/lib/facets/facets.module.mjs +4 -4
- package/esm2022/libs/feature/search/src/lib/facets/facets.service.mjs +5 -5
- package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +7 -7
- package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +22 -19
- package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +30 -8
- package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +5 -5
- package/esm2022/libs/feature/search/src/lib/records-metrics/records-metrics.component.mjs +5 -5
- package/esm2022/libs/feature/search/src/lib/results-hits-number/results-hits.container.component.mjs +4 -4
- package/esm2022/libs/feature/search/src/lib/results-layout/results-layout.component.mjs +5 -5
- package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +15 -10
- package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +6 -6
- package/esm2022/libs/feature/search/src/lib/search-filters-summary/search-filters-summary.component.mjs +67 -0
- package/esm2022/libs/feature/search/src/lib/search-filters-summary-item/search-filters-summary-item.component.mjs +84 -0
- package/esm2022/libs/feature/search/src/lib/sort-by/sort-by.component.mjs +9 -5
- package/esm2022/libs/feature/search/src/lib/state/actions.mjs +1 -1
- package/esm2022/libs/feature/search/src/lib/state/container/search-state.container.directive.mjs +6 -6
- package/esm2022/libs/feature/search/src/lib/state/effects.mjs +6 -6
- package/esm2022/libs/feature/search/src/lib/state/reducer.mjs +1 -1
- package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +7 -9
- package/esm2022/libs/feature/search/src/lib/state/selectors.mjs +1 -9
- package/esm2022/libs/feature/search/src/lib/utils/operators/search.operator.mjs +1 -1
- package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +63 -8
- package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +13 -6
- package/esm2022/libs/feature/search/src/lib/utils/service/search.service.mjs +4 -4
- package/esm2022/libs/ui/catalog/src/index.mjs +1 -2
- package/esm2022/libs/ui/catalog/src/lib/catalog-title/catalog-title.component.mjs +6 -5
- package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +15 -19
- package/esm2022/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.mjs +17 -7
- package/esm2022/libs/ui/catalog/src/lib/organisations-filter/organisations-filter.component.mjs +3 -3
- package/esm2022/libs/ui/catalog/src/lib/organisations-result/organisations-result.component.mjs +6 -5
- package/esm2022/libs/ui/dataviz/src/lib/chart/chart.component.mjs +6 -6
- package/esm2022/libs/ui/dataviz/src/lib/figure/figure.component.mjs +7 -7
- package/esm2022/libs/ui/dataviz/src/lib/table/table.component.mjs +6 -6
- package/esm2022/libs/ui/dataviz/src/lib/ui-dataviz.module.mjs +33 -7
- package/esm2022/libs/ui/elements/src/index.mjs +1 -3
- package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +28 -9
- package/esm2022/libs/ui/elements/src/lib/avatar/avatar.component.mjs +3 -3
- package/esm2022/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.mjs +5 -5
- package/esm2022/libs/ui/elements/src/lib/content-ghost/content-ghost.component.mjs +6 -5
- package/esm2022/libs/ui/elements/src/lib/download-item/download-item.component.mjs +19 -8
- package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +40 -12
- package/esm2022/libs/ui/elements/src/lib/error/error.component.mjs +25 -7
- package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +17 -9
- package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +17 -7
- package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +4 -6
- package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +7 -5
- package/esm2022/libs/ui/elements/src/lib/metadata-catalog/metadata-catalog.component.mjs +7 -6
- package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +28 -8
- package/esm2022/libs/ui/elements/src/lib/metadata-info/linkify.directive.mjs +7 -6
- package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +43 -16
- package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +16 -9
- package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +10 -8
- package/esm2022/libs/ui/elements/src/lib/notification/notification.component.mjs +38 -7
- package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +40 -35
- package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +20 -11
- package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +6 -6
- package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +17 -98
- package/esm2022/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.mjs +6 -6
- package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +29 -11
- package/esm2022/libs/ui/elements/src/lib/user-preview/user-preview.component.mjs +5 -5
- package/esm2022/libs/ui/inputs/src/index.mjs +2 -2
- package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +32 -14
- package/esm2022/libs/ui/inputs/src/lib/badge/badge.component.mjs +21 -7
- package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +4 -4
- package/esm2022/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.mjs +7 -7
- package/esm2022/libs/ui/inputs/src/lib/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/libs/ui/inputs/src/lib/chips-input/chips-input.component.mjs +5 -5
- package/esm2022/libs/ui/inputs/src/lib/copy-text-button/copy-text-button.component.mjs +10 -7
- package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +19 -9
- package/esm2022/libs/ui/inputs/src/lib/date-range-dropdown/date-range-dropdown.component.mjs +65 -0
- package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +19 -9
- package/esm2022/libs/ui/inputs/src/lib/drag-and-drop-file-input/drag-and-drop-file-input.component.mjs +3 -3
- package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +8 -8
- package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +25 -9
- package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +5 -5
- package/esm2022/libs/ui/inputs/src/lib/file-input/file-input.component.mjs +32 -11
- package/esm2022/libs/ui/inputs/src/lib/files-drop/files-drop.directive.mjs +4 -4
- package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +38 -11
- package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +7 -7
- package/esm2022/libs/ui/inputs/src/lib/search-input/search-input.component.mjs +17 -7
- package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +8 -6
- package/esm2022/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.mjs +8 -5
- package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +3 -3
- package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +3 -3
- package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +31 -26
- package/esm2022/libs/ui/inputs/src/lib/url-input/url-input.component.mjs +52 -23
- package/esm2022/libs/ui/inputs/src/lib/viewport-intersector/viewport-intersector.component.mjs +5 -5
- package/esm2022/libs/ui/layout/src/index.mjs +6 -1
- package/esm2022/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.mjs +5 -5
- package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +20 -15
- package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +27 -22
- package/esm2022/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.mjs +9 -7
- package/esm2022/libs/ui/layout/src/lib/expandable-panel-button/expandable-panel-button.component.mjs +8 -6
- package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +7 -6
- package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +6 -4
- package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +12 -8
- package/esm2022/libs/ui/layout/src/lib/max-lines/max-lines.component.mjs +6 -6
- package/esm2022/libs/ui/layout/src/lib/modal-dialog/modal-dialog.component.mjs +5 -5
- package/esm2022/libs/ui/layout/src/lib/paginable.interface.mjs +2 -0
- package/esm2022/libs/ui/layout/src/lib/pagination/pagination.component.mjs +52 -0
- package/esm2022/libs/ui/layout/src/lib/pagination-buttons/pagination-buttons.component.mjs +52 -0
- package/esm2022/libs/ui/layout/src/lib/pagination-dots/pagination-dots.component.mjs +36 -0
- package/esm2022/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +26 -0
- package/esm2022/libs/ui/layout/src/lib/sortable-list/sortable-list.component.mjs +5 -13
- package/esm2022/libs/ui/layout/src/lib/sticky-header/sticky-header.component.mjs +6 -6
- package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +17 -26
- package/esm2022/libs/ui/map/src/index.mjs +2 -1
- package/esm2022/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.mjs +3 -3
- package/esm2022/libs/ui/map/src/lib/components/map-container/map-container.component.mjs +20 -10
- package/esm2022/libs/ui/map/src/lib/components/map-legend/map-legend.component.mjs +32 -0
- package/esm2022/libs/ui/map/src/lib/map-utils.mjs +1 -1
- package/esm2022/libs/ui/search/src/lib/facets/facet-block/facet-block.component.mjs +7 -7
- package/esm2022/libs/ui/search/src/lib/facets/facet-item/facet-item.component.mjs +6 -6
- package/esm2022/libs/ui/search/src/lib/facets/facet-list/facet-list.component.mjs +3 -3
- package/esm2022/libs/ui/search/src/lib/facets/facets.module.mjs +4 -4
- package/esm2022/libs/ui/search/src/lib/record-metric/record-metric.component.mjs +3 -3
- package/esm2022/libs/ui/search/src/lib/record-preview/record-preview.component.mjs +5 -5
- package/esm2022/libs/ui/search/src/lib/record-preview-card/record-preview-card.component.mjs +3 -3
- package/esm2022/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.mjs +8 -7
- package/esm2022/libs/ui/search/src/lib/record-preview-list/record-preview-list.component.mjs +3 -3
- package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +10 -9
- package/esm2022/libs/ui/search/src/lib/record-preview-text/record-preview-text.component.mjs +3 -3
- package/esm2022/libs/ui/search/src/lib/record-preview-title/record-preview-title.component.mjs +3 -3
- package/esm2022/libs/ui/search/src/lib/results-hits-number/results-hits-number.component.mjs +3 -3
- package/esm2022/libs/ui/search/src/lib/results-list/results-layout.config.mjs +1 -1
- package/esm2022/libs/ui/search/src/lib/results-list/results-list.component.mjs +3 -3
- package/esm2022/libs/ui/search/src/lib/results-list-item/results-list-item.component.mjs +5 -5
- package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +25 -33
- package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +74 -32
- package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +34 -12
- package/esm2022/libs/ui/widgets/src/lib/color-scale/color-scale.component.mjs +3 -3
- package/esm2022/libs/ui/widgets/src/lib/loading-mask/loading-mask.component.mjs +7 -6
- package/esm2022/libs/ui/widgets/src/lib/popover/popover.component.mjs +5 -5
- package/esm2022/libs/ui/widgets/src/lib/popup-alert/popup-alert.component.mjs +8 -8
- package/esm2022/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.mjs +5 -5
- package/esm2022/libs/ui/widgets/src/lib/spinning-loader/spinning-loader.component.mjs +5 -5
- package/esm2022/libs/ui/widgets/src/lib/step-bar/step-bar.component.mjs +5 -5
- package/esm2022/libs/ui/widgets/src/lib/ui-widgets.module.mjs +9 -34
- package/esm2022/libs/util/app-config/src/lib/app-config.mjs +9 -2
- package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -1
- package/esm2022/libs/util/app-config/src/lib/map-layers.mjs +7 -1
- package/esm2022/libs/util/app-config/src/lib/model.mjs +1 -1
- package/esm2022/libs/util/app-config/src/lib/parse-utils.mjs +1 -1
- package/esm2022/libs/util/data-fetcher/src/lib/data-fetcher.mjs +1 -1
- package/esm2022/libs/util/data-fetcher/src/lib/headers.mjs +1 -1
- package/esm2022/libs/util/data-fetcher/src/lib/model.mjs +3 -3
- package/esm2022/libs/util/data-fetcher/src/lib/readers/base-file.mjs +1 -1
- package/esm2022/libs/util/data-fetcher/src/lib/readers/csv.mjs +1 -1
- package/esm2022/libs/util/data-fetcher/src/lib/readers/excel.mjs +1 -1
- package/esm2022/libs/util/data-fetcher/src/lib/readers/geojson.mjs +1 -1
- package/esm2022/libs/util/data-fetcher/src/lib/readers/gml.mjs +1 -1
- package/esm2022/libs/util/data-fetcher/src/lib/readers/json.mjs +1 -1
- package/esm2022/libs/util/data-fetcher/src/lib/sql-utils.mjs +1 -1
- package/esm2022/libs/util/data-fetcher/src/lib/utils.mjs +13 -11
- package/esm2022/libs/util/i18n/src/index.mjs +2 -1
- package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +1 -38
- package/esm2022/libs/util/i18n/src/lib/i18n.interceptor.mjs +4 -4
- package/esm2022/libs/util/i18n/src/lib/lang.service.mjs +6 -6
- package/esm2022/libs/util/i18n/src/lib/language-codes.mjs +40 -0
- package/esm2022/libs/util/i18n/src/lib/util-i18n.module.mjs +6 -6
- package/esm2022/libs/util/shared/src/lib/image-fallback.directive.mjs +5 -5
- package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +6 -4
- package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +17 -17
- package/esm2022/libs/util/shared/src/lib/services/log.service.mjs +3 -3
- package/esm2022/libs/util/shared/src/lib/services/proxy.service.mjs +12 -9
- package/esm2022/libs/util/shared/src/lib/services/theme.service.mjs +4 -4
- package/esm2022/libs/util/shared/src/lib/util-shared.module.mjs +4 -4
- package/esm2022/libs/util/shared/src/lib/utils/format-fields.mjs +9 -0
- package/esm2022/libs/util/shared/src/lib/utils/geojson.mjs +1 -1
- package/esm2022/libs/util/shared/src/lib/utils/image-resize.mjs +1 -1
- package/esm2022/libs/util/shared/src/lib/utils/index.mjs +3 -1
- package/esm2022/libs/util/shared/src/lib/utils/no-duplicate-file-name.mjs +19 -0
- package/esm2022/libs/util/shared/src/lib/utils/parse.mjs +1 -1
- package/esm2022/libs/util/shared/src/lib/utils/temporal-extent-union.mjs +1 -1
- package/esm2022/libs/util/shared/src/lib/utils/url.mjs +1 -1
- package/esm2022/translations/de.json +49 -24
- package/esm2022/translations/en.json +113 -69
- package/esm2022/translations/es.json +38 -13
- package/esm2022/translations/fr.json +109 -65
- package/esm2022/translations/it.json +41 -16
- package/esm2022/translations/nl.json +38 -13
- package/esm2022/translations/pt.json +38 -13
- package/fesm2022/geonetwork-ui.mjs +7323 -5096
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/libs/api/metadata-converter/src/lib/common/distribution.mapper.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/common/resource-types.d.ts +5 -0
- package/libs/api/metadata-converter/src/lib/common/resource-types.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.d.ts +2 -2
- package/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.d.ts +6 -5
- package/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/dcat-ap/utils/graph-utils.d.ts +11 -5
- package/libs/api/metadata-converter/src/lib/dcat-ap/utils/graph-utils.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/dcat-ap/utils/serialize-to-xml.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/dcat-ap/write-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/function-utils.d.ts +1 -1
- package/libs/api/metadata-converter/src/lib/function-utils.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +4 -4
- package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/gn4.converter.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/types/elasticsearch.model.d.ts +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/types/elasticsearch.model.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +11 -10
- package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +6 -3
- package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts +5 -2
- package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts +4 -2
- package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +14 -4
- package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +16 -9
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +47 -4
- package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/auth/auth.service.d.ts +14 -2
- package/libs/api/repository/src/lib/gn4/auth/auth.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/elasticsearch/date-range.utils.d.ts +4 -0
- package/libs/api/repository/src/lib/gn4/elasticsearch/date-range.utils.d.ts.map +1 -0
- package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts +5 -1
- package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/elasticsearch/index.d.ts +1 -0
- package/libs/api/repository/src/lib/gn4/elasticsearch/index.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +15 -8
- package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +5 -17
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.d.ts +1 -1
- package/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/error/index.d.ts +2 -0
- package/libs/common/domain/src/lib/model/error/index.d.ts.map +1 -0
- package/libs/common/domain/src/lib/model/error/publication-version.error.d.ts +5 -0
- package/libs/common/domain/src/lib/model/error/publication-version.error.d.ts.map +1 -0
- package/libs/common/domain/src/lib/model/record/contact.model.d.ts +1 -1
- package/libs/common/domain/src/lib/model/record/contact.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/index.d.ts +1 -0
- package/libs/common/domain/src/lib/model/record/index.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +27 -7
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/organization.model.d.ts +2 -0
- package/libs/common/domain/src/lib/model/record/organization.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/translation.model.d.ts +26 -0
- package/libs/common/domain/src/lib/model/record/translation.model.d.ts.map +1 -0
- package/libs/common/domain/src/lib/model/search/filter.model.d.ts +16 -1
- package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/search/sort-by.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/platform.service.interface.d.ts +4 -4
- package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
- package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +5 -0
- package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/groupPrivilege.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/jsonNode.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/link.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/metadataResource.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/metadataResourceExternalManagementProperties.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/metadataStatusParameter.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/operation.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/pageProperties.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/publicationOption.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/setting.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/status.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/statusValue.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/user.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/userGroup.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/userGroupId.api.model.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/userSecurity.api.model.d.ts.map +1 -1
- package/libs/feature/catalog/src/lib/feature-catalog.module.d.ts +8 -9
- package/libs/feature/catalog/src/lib/feature-catalog.module.d.ts.map +1 -1
- package/libs/feature/catalog/src/lib/organisations/organisations.component.d.ts +10 -3
- package/libs/feature/catalog/src/lib/organisations/organisations.component.d.ts.map +1 -1
- package/libs/feature/dataviz/src/index.d.ts +0 -1
- package/libs/feature/dataviz/src/index.d.ts.map +1 -1
- package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts +1 -1
- package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
- package/libs/feature/dataviz/src/lib/figure/figure-container/figure-container.component.d.ts +1 -1
- package/libs/feature/dataviz/src/lib/figure/figure-container/figure-container.component.d.ts.map +1 -1
- package/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.d.ts +1 -1
- package/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.d.ts.map +1 -1
- package/libs/feature/dataviz/src/lib/service/data.service.d.ts +3 -1
- package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
- package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts +1 -1
- package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +33 -9
- package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/+state/editor.effects.d.ts +18 -10
- package/libs/feature/editor/src/lib/+state/editor.effects.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +11 -4
- package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/+state/editor.models.d.ts +1 -1
- package/libs/feature/editor/src/lib/+state/editor.models.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +4 -0
- package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +8 -1
- package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/constraint-card/constraint-card.component.d.ts +16 -0
- package/libs/feature/editor/src/lib/components/constraint-card/constraint-card.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/contact-card/contact-card.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/import-record/import-record.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts +2 -1
- package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints/form-field-constraints.component.d.ts +18 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints/form-field-constraints.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints-shortcuts/constraints.utils.d.ts +6 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints-shortcuts/constraints.utils.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints-shortcuts/form-field-constraints-shortcuts.component.d.ts +32 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints-shortcuts/form-field-constraints-shortcuts.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-date/form-field-date.component.d.ts +9 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-date/form-field-date.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +14 -35
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.d.ts +5 -2
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-resources/form-field-online-resources.component.d.ts +4 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-resources/form-field-online-resources.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.d.ts +1 -2
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts +5 -2
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.d.ts +2 -8
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts +3 -7
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-toggle/form-field-spatial-toggle.component.d.ts +14 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-toggle/form-field-spatial-toggle.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +11 -9
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/fields.config.d.ts +11 -3
- package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/models/editor-config.model.d.ts +6 -3
- package/libs/feature/editor/src/lib/models/editor-config.model.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/services/editor.service.d.ts +4 -0
- package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
- package/libs/feature/map/src/lib/+state/map.actions.d.ts +3 -3
- package/libs/feature/map/src/lib/+state/map.actions.d.ts.map +1 -1
- package/libs/feature/map/src/lib/feature-map.module.d.ts +9 -10
- package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
- package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts.map +1 -1
- package/libs/feature/notifications/src/lib/notifications.service.d.ts +1 -1
- package/libs/feature/notifications/src/lib/notifications.service.d.ts.map +1 -1
- package/libs/feature/record/src/index.d.ts +3 -0
- package/libs/feature/record/src/index.d.ts.map +1 -1
- package/libs/feature/record/src/lib/data-view/data-view.component.d.ts +1 -1
- package/libs/feature/record/src/lib/data-view/data-view.component.d.ts.map +1 -1
- package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +1 -1
- package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
- package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts +1 -1
- package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts.map +1 -1
- package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +1 -1
- package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
- package/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.d.ts +1 -1
- package/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.d.ts.map +1 -1
- package/libs/feature/record/src/lib/feature-record.module.d.ts +15 -25
- package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
- package/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.d.ts +74 -0
- package/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.d.ts.map +1 -0
- package/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.d.ts +19 -0
- package/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.d.ts.map +1 -0
- package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +7 -1
- package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
- package/libs/feature/record/src/lib/record-meta/record-meta.component.d.ts +14 -0
- package/libs/feature/record/src/lib/record-meta/record-meta.component.d.ts.map +1 -0
- package/libs/feature/record/src/lib/state/mdview.actions.d.ts +13 -13
- package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.effects.d.ts +9 -9
- package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
- package/libs/feature/router/src/lib/default/constants.d.ts +3 -2
- package/libs/feature/router/src/lib/default/constants.d.ts.map +1 -1
- package/libs/feature/router/src/lib/default/state/query-params.utils.d.ts +4 -0
- package/libs/feature/router/src/lib/default/state/query-params.utils.d.ts.map +1 -0
- package/libs/feature/router/src/lib/default/state/router.actions.d.ts +3 -3
- package/libs/feature/router/src/lib/default/state/router.actions.d.ts.map +1 -1
- package/libs/feature/router/src/lib/default/state/router.effects.d.ts +5 -5
- package/libs/feature/router/src/lib/default/state/router.effects.d.ts.map +1 -1
- package/libs/feature/router/src/lib/default/state/router.facade.d.ts +1 -1
- package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
- package/libs/feature/router/src/lib/default/state/router.selectors.d.ts +1 -1
- package/libs/feature/router/src/lib/default/state/router.selectors.d.ts.map +1 -1
- package/libs/feature/search/src/index.d.ts +2 -0
- package/libs/feature/search/src/index.d.ts.map +1 -1
- package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +1 -1
- package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
- package/libs/feature/search/src/lib/feature-search.module.d.ts +17 -15
- package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
- package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +7 -1
- package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
- package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +1 -0
- package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
- package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
- package/libs/feature/search/src/lib/search-filters-summary/search-filters-summary.component.d.ts +22 -0
- package/libs/feature/search/src/lib/search-filters-summary/search-filters-summary.component.d.ts.map +1 -0
- package/libs/feature/search/src/lib/search-filters-summary-item/search-filters-summary-item.component.d.ts +34 -0
- package/libs/feature/search/src/lib/search-filters-summary-item/search-filters-summary-item.component.d.ts.map +1 -0
- package/libs/feature/search/src/lib/sort-by/sort-by.component.d.ts.map +1 -1
- package/libs/feature/search/src/lib/state/actions.d.ts.map +1 -1
- package/libs/feature/search/src/lib/state/search.facade.d.ts +0 -2
- package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
- package/libs/feature/search/src/lib/state/selectors.d.ts +0 -2
- package/libs/feature/search/src/lib/state/selectors.d.ts.map +1 -1
- package/libs/feature/search/src/lib/utils/operators/search.operator.d.ts.map +1 -1
- package/libs/feature/search/src/lib/utils/service/fields.d.ts +24 -6
- package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
- package/libs/feature/search/src/lib/utils/service/fields.service.d.ts +4 -2
- package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
- package/libs/ui/catalog/src/index.d.ts +0 -1
- package/libs/ui/catalog/src/index.d.ts.map +1 -1
- package/libs/ui/catalog/src/lib/catalog-title/catalog-title.component.d.ts +1 -1
- package/libs/ui/catalog/src/lib/catalog-title/catalog-title.component.d.ts.map +1 -1
- package/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.d.ts +10 -8
- package/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.d.ts.map +1 -1
- package/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.d.ts +1 -1
- package/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.d.ts.map +1 -1
- package/libs/ui/catalog/src/lib/organisations-result/organisations-result.component.d.ts +1 -1
- package/libs/ui/catalog/src/lib/organisations-result/organisations-result.component.d.ts.map +1 -1
- package/libs/ui/dataviz/src/lib/ui-dataviz.module.d.ts +3 -3
- package/libs/ui/dataviz/src/lib/ui-dataviz.module.d.ts.map +1 -1
- package/libs/ui/elements/src/index.d.ts +0 -2
- package/libs/ui/elements/src/index.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/content-ghost/content-ghost.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/content-ghost/content-ghost.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts +2 -2
- package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +10 -9
- package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/error/error.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/error/error.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +2 -1
- package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/metadata-catalog/metadata-catalog.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/metadata-catalog/metadata-catalog.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/metadata-info/linkify.directive.d.ts +2 -2
- package/libs/ui/elements/src/lib/metadata-info/linkify.directive.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.d.ts +2 -2
- package/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/notification/notification.component.d.ts +1 -0
- package/libs/ui/elements/src/lib/notification/notification.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +6 -17
- package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/ui-elements.module.d.ts +19 -37
- package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/index.d.ts +1 -1
- package/libs/ui/inputs/src/index.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/badge/badge.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts +2 -2
- package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/chips-input/chips-input.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/copy-text-button/copy-text-button.component.d.ts +1 -1
- package/libs/ui/inputs/src/lib/copy-text-button/copy-text-button.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/date-range-dropdown/date-range-dropdown.component.d.ts +20 -0
- package/libs/ui/inputs/src/lib/date-range-dropdown/date-range-dropdown.component.d.ts.map +1 -0
- package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/file-input/file-input.component.d.ts +3 -2
- package/libs/ui/inputs/src/lib/file-input/file-input.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +2 -1
- package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts +1 -1
- package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/search-input/search-input.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.d.ts +1 -1
- package/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.d.ts +2 -1
- package/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +28 -31
- package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/url-input/url-input.component.d.ts +14 -12
- package/libs/ui/inputs/src/lib/url-input/url-input.component.d.ts.map +1 -1
- package/libs/ui/layout/src/index.d.ts +5 -0
- package/libs/ui/layout/src/index.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +7 -5
- package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +9 -7
- package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.d.ts +1 -1
- package/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/expandable-panel-button/expandable-panel-button.component.d.ts +1 -1
- package/libs/ui/layout/src/lib/expandable-panel-button/expandable-panel-button.component.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +2 -1
- package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/paginable.interface.d.ts +15 -0
- package/libs/ui/layout/src/lib/paginable.interface.d.ts.map +1 -0
- package/libs/ui/layout/src/lib/pagination/pagination.component.d.ts +11 -0
- package/libs/ui/layout/src/lib/pagination/pagination.component.d.ts.map +1 -0
- package/libs/ui/layout/src/lib/pagination-buttons/pagination-buttons.component.d.ts +9 -0
- package/libs/ui/layout/src/lib/pagination-buttons/pagination-buttons.component.d.ts.map +1 -0
- package/libs/ui/layout/src/lib/pagination-dots/pagination-dots.component.d.ts +10 -0
- package/libs/ui/layout/src/lib/pagination-dots/pagination-dots.component.d.ts.map +1 -0
- package/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +8 -0
- package/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
- package/libs/ui/layout/src/lib/sortable-list/sortable-list.component.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/ui-layout.module.d.ts +6 -8
- package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
- package/libs/ui/map/src/index.d.ts +1 -0
- package/libs/ui/map/src/index.d.ts.map +1 -1
- package/libs/ui/map/src/lib/components/map-container/map-container.component.d.ts.map +1 -1
- package/libs/ui/map/src/lib/components/map-container/map-settings.token.d.ts.map +1 -1
- package/libs/ui/map/src/lib/components/map-legend/map-legend.component.d.ts +12 -0
- package/libs/ui/map/src/lib/components/map-legend/map-legend.component.d.ts.map +1 -0
- package/libs/ui/search/src/lib/results-list/results-layout.config.d.ts.map +1 -1
- package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +10 -6
- package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
- package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +11 -4
- package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
- package/libs/ui/search/src/lib/ui-search.module.d.ts +6 -5
- package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
- package/libs/ui/widgets/src/lib/loading-mask/loading-mask.component.d.ts +1 -1
- package/libs/ui/widgets/src/lib/loading-mask/loading-mask.component.d.ts.map +1 -1
- package/libs/ui/widgets/src/lib/popup-alert/popup-alert.component.d.ts.map +1 -1
- package/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.d.ts +1 -1
- package/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.d.ts.map +1 -1
- package/libs/ui/widgets/src/lib/spinning-loader/spinning-loader.component.d.ts +1 -1
- package/libs/ui/widgets/src/lib/spinning-loader/spinning-loader.component.d.ts.map +1 -1
- package/libs/ui/widgets/src/lib/ui-widgets.module.d.ts +9 -13
- package/libs/ui/widgets/src/lib/ui-widgets.module.d.ts.map +1 -1
- package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
- package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
- package/libs/util/app-config/src/lib/map-layers.d.ts.map +1 -1
- package/libs/util/app-config/src/lib/model.d.ts +6 -1
- package/libs/util/app-config/src/lib/model.d.ts.map +1 -1
- package/libs/util/data-fetcher/src/lib/model.d.ts +2 -2
- package/libs/util/data-fetcher/src/lib/model.d.ts.map +1 -1
- package/libs/util/data-fetcher/src/lib/readers/csv.d.ts.map +1 -1
- package/libs/util/data-fetcher/src/lib/readers/excel.d.ts.map +1 -1
- package/libs/util/data-fetcher/src/lib/readers/geojson.d.ts.map +1 -1
- package/libs/util/data-fetcher/src/lib/readers/gml.d.ts.map +1 -1
- package/libs/util/data-fetcher/src/lib/readers/json.d.ts.map +1 -1
- package/libs/util/data-fetcher/src/lib/utils.d.ts +1 -1
- package/libs/util/data-fetcher/src/lib/utils.d.ts.map +1 -1
- package/libs/util/i18n/src/index.d.ts +1 -0
- package/libs/util/i18n/src/index.d.ts.map +1 -1
- package/libs/util/i18n/src/lib/i18n.constants.d.ts +0 -35
- package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
- package/libs/util/i18n/src/lib/language-codes.d.ts +38 -0
- package/libs/util/i18n/src/lib/language-codes.d.ts.map +1 -0
- package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
- package/libs/util/shared/src/lib/links/link-utils.d.ts +16 -16
- package/libs/util/shared/src/lib/services/proxy.service.d.ts +4 -2
- package/libs/util/shared/src/lib/services/proxy.service.d.ts.map +1 -1
- package/libs/util/shared/src/lib/utils/format-fields.d.ts +2 -0
- package/libs/util/shared/src/lib/utils/format-fields.d.ts.map +1 -0
- package/libs/util/shared/src/lib/utils/index.d.ts +2 -0
- package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
- package/libs/util/shared/src/lib/utils/no-duplicate-file-name.d.ts +2 -0
- package/libs/util/shared/src/lib/utils/no-duplicate-file-name.d.ts.map +1 -0
- package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts +4 -1
- package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts.map +1 -1
- package/package.json +50 -43
- package/src/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts +1 -0
- package/src/libs/api/metadata-converter/src/lib/common/resource-types.ts +50 -0
- package/src/libs/api/metadata-converter/src/lib/convert-utils.ts +1 -1
- package/src/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.ts +160 -34
- package/src/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.ts +140 -47
- package/src/libs/api/metadata-converter/src/lib/dcat-ap/utils/graph-utils.ts +62 -47
- package/src/libs/api/metadata-converter/src/lib/dcat-ap/utils/serialize-to-xml.ts +37 -7
- package/src/libs/api/metadata-converter/src/lib/dcat-ap/write-parts.ts +51 -18
- package/src/libs/api/metadata-converter/src/lib/fixtures/eu.dcat-ap.records.ts +473 -2
- package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +36 -3
- package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.reuse+ongules.ts +246 -0
- package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.reuse+roilaye.ts +101 -0
- package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.service+eaux-usees.ts +187 -0
- package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +20 -3
- package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +336 -5
- package/src/libs/api/metadata-converter/src/lib/fixtures/georhena.records.ts +216 -0
- package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +84 -2
- package/src/libs/api/metadata-converter/src/lib/fixtures/opendataswiss.records.ts +336 -9
- package/src/libs/api/metadata-converter/src/lib/fixtures/sextant.records.ts +404 -2
- package/src/libs/api/metadata-converter/src/lib/fixtures/vlaanderen.dcat-ap.records.ts +4 -1
- package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.reuse.ts +451 -0
- package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.service+napitswallonia.ts +289 -0
- package/src/libs/api/metadata-converter/src/lib/function-utils.ts +1 -1
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.converter.ts +2 -1
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +29 -23
- package/src/libs/api/metadata-converter/src/lib/gn4/types/elasticsearch.model.ts +1 -1
- package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +11 -10
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +15 -3
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +69 -20
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +100 -25
- package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +165 -81
- package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +279 -49
- package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +428 -172
- package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +97 -24
- package/src/libs/api/repository/src/lib/gn4/auth/auth.service.ts +35 -6
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/date-range.utils.ts +13 -0
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +58 -23
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/index.ts +1 -0
- package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +111 -52
- package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +1 -1
- package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +113 -31
- package/src/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.ts +1 -1
- package/src/libs/common/domain/src/lib/model/error/index.ts +1 -0
- package/src/libs/common/domain/src/lib/model/error/publication-version.error.ts +9 -0
- package/src/libs/common/domain/src/lib/model/record/contact.model.ts +1 -1
- package/src/libs/common/domain/src/lib/model/record/index.ts +1 -0
- package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +44 -7
- package/src/libs/common/domain/src/lib/model/record/organization.model.ts +4 -0
- package/src/libs/common/domain/src/lib/model/record/translation.model.ts +49 -0
- package/src/libs/common/domain/src/lib/model/search/filter.model.ts +17 -1
- package/src/libs/common/domain/src/lib/model/search/sort-by.model.ts +1 -0
- package/src/libs/common/domain/src/lib/platform.service.interface.ts +4 -3
- package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +4 -0
- package/src/libs/common/fixtures/src/lib/editor/editor.fixtures.ts +10 -3
- package/src/libs/common/fixtures/src/lib/elasticsearch/full-response.fixtures.ts +1673 -0
- package/src/libs/common/fixtures/src/lib/elasticsearch/search-responses.fixtures.ts +12931 -0
- package/src/libs/common/fixtures/src/lib/link.fixtures.ts +37 -28
- package/src/libs/common/fixtures/src/lib/records.fixtures.ts +117 -15
- package/src/libs/feature/catalog/src/lib/feature-catalog.module.ts +4 -9
- package/src/libs/feature/catalog/src/lib/organisations/organisations.component.html +1 -5
- package/src/libs/feature/catalog/src/lib/organisations/organisations.component.ts +41 -5
- package/src/libs/feature/dataviz/src/index.ts +0 -1
- package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.html +1 -1
- package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +20 -2
- package/src/libs/feature/dataviz/src/lib/figure/figure-container/figure-container.component.ts +3 -1
- package/src/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.ts +6 -1
- package/src/libs/feature/dataviz/src/lib/service/data.service.ts +30 -7
- package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.html +1 -1
- package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.ts +15 -2
- package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +16 -0
- package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +41 -2
- package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +13 -0
- package/src/libs/feature/editor/src/lib/+state/editor.models.ts +1 -1
- package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +27 -0
- package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +5 -0
- package/src/libs/feature/editor/src/lib/components/constraint-card/constraint-card.component.css +4 -0
- package/src/libs/feature/editor/src/lib/components/constraint-card/constraint-card.component.html +28 -0
- package/src/libs/feature/editor/src/lib/components/constraint-card/constraint-card.component.ts +71 -0
- package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.ts +1 -2
- package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.css +3 -0
- package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.html +7 -6
- package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.ts +12 -2
- package/src/libs/feature/editor/src/lib/components/import-record/import-record.component.html +3 -4
- package/src/libs/feature/editor/src/lib/components/import-record/import-record.component.ts +32 -11
- package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.html +1 -1
- package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.ts +15 -2
- package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.html +2 -0
- package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.ts +1 -2
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints/form-field-constraints.component.css +4 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints/form-field-constraints.component.html +24 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints/form-field-constraints.component.ts +85 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints-shortcuts/constraints.utils.ts +42 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints-shortcuts/form-field-constraints-shortcuts.component.css +4 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints-shortcuts/form-field-constraints-shortcuts.component.html +34 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints-shortcuts/form-field-constraints-shortcuts.component.ts +210 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts/form-field-contacts.component.html +1 -1
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.html +1 -1
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.ts +13 -2
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/{form-field-date-updated/form-field-date-updated.component.ts → form-field-date/form-field-date.component.ts} +4 -4
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-file/form-field-file.component.html +1 -1
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +11 -8
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +33 -45
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.html +55 -40
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.ts +29 -18
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-resources/form-field-online-resources.component.html +83 -66
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-resources/form-field-online-resources.component.ts +27 -17
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.html +1 -1
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.ts +15 -12
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.html +22 -11
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.ts +30 -17
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.html +2 -2
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.html +4 -25
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.ts +3 -23
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +0 -5
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +2 -42
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-toggle/form-field-spatial-toggle.component.html +5 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-toggle/form-field-spatial-toggle.component.ts +60 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.html +3 -2
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.ts +13 -2
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.html +1 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +55 -21
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +33 -8
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/index.ts +1 -1
- package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +6 -1
- package/src/libs/feature/editor/src/lib/fields.config.ts +83 -12
- package/src/libs/feature/editor/src/lib/models/editor-config.model.ts +12 -4
- package/src/libs/feature/editor/src/lib/services/editor.service.ts +7 -0
- package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.html +2 -2
- package/src/libs/feature/map/src/lib/feature-map.module.ts +0 -2
- package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +3 -5
- package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.ts +23 -4
- package/src/libs/feature/notifications/src/lib/notifications.service.ts +6 -1
- package/src/libs/feature/record/src/index.ts +3 -0
- package/src/libs/feature/record/src/lib/data-view/data-view.component.html +1 -1
- package/src/libs/feature/record/src/lib/data-view/data-view.component.ts +15 -0
- package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +5 -0
- package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.ts +16 -1
- package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +5 -0
- package/src/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.html +1 -1
- package/src/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.ts +8 -1
- package/src/libs/feature/record/src/lib/feature-record.module.ts +11 -38
- package/src/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.css +22 -0
- package/src/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html +132 -0
- package/src/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.ts +253 -0
- package/src/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.html +37 -0
- package/src/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.ts +43 -0
- package/src/libs/feature/record/src/lib/map-view/map-view.component.html +50 -12
- package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +62 -4
- package/src/libs/feature/record/src/lib/record-meta/record-meta.component.ts +45 -0
- package/src/libs/feature/record/src/lib/state/mdview.facade.ts +10 -1
- package/src/libs/feature/router/src/lib/default/constants.ts +6 -1
- package/src/libs/feature/router/src/lib/default/state/query-params.utils.ts +61 -0
- package/src/libs/feature/router/src/lib/default/state/router.effects.ts +2 -2
- package/src/libs/feature/router/src/lib/default/state/router.facade.ts +5 -3
- package/src/libs/feature/search/src/index.ts +2 -0
- package/src/libs/feature/search/src/lib/constants.ts +1 -1
- package/src/libs/feature/search/src/lib/facets/facets.service.ts +4 -4
- package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +3 -0
- package/src/libs/feature/search/src/lib/feature-search.module.ts +15 -8
- package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.html +20 -10
- package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +32 -1
- package/src/libs/feature/search/src/lib/results-list/results-list.container.component.html +1 -6
- package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +12 -1
- package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +16 -12
- package/src/libs/feature/search/src/lib/search-filters-summary/search-filters-summary.component.css +0 -0
- package/src/libs/feature/search/src/lib/search-filters-summary/search-filters-summary.component.html +17 -0
- package/src/libs/feature/search/src/lib/search-filters-summary/search-filters-summary.component.ts +78 -0
- package/src/libs/feature/search/src/lib/search-filters-summary-item/search-filters-summary-item.component.css +0 -0
- package/src/libs/feature/search/src/lib/search-filters-summary-item/search-filters-summary-item.component.html +20 -0
- package/src/libs/feature/search/src/lib/search-filters-summary-item/search-filters-summary-item.component.ts +118 -0
- package/src/libs/feature/search/src/lib/sort-by/sort-by.component.ts +4 -0
- package/src/libs/feature/search/src/lib/state/actions.ts +69 -17
- package/src/libs/feature/search/src/lib/state/effects.ts +1 -1
- package/src/libs/feature/search/src/lib/state/search.facade.ts +0 -8
- package/src/libs/feature/search/src/lib/state/selectors.ts +0 -18
- package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +20 -3
- package/src/libs/feature/search/src/lib/utils/service/fields.ts +91 -12
- package/src/libs/ui/catalog/src/index.ts +0 -1
- package/src/libs/ui/catalog/src/lib/catalog-title/catalog-title.component.ts +3 -0
- package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
- package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.ts +15 -21
- package/src/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.html +2 -3
- package/src/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.ts +11 -0
- package/src/libs/ui/catalog/src/lib/organisations-result/organisations-result.component.ts +3 -0
- package/src/libs/ui/dataviz/src/lib/chart/chart.component.ts +1 -1
- package/src/libs/ui/dataviz/src/lib/figure/figure.component.html +6 -5
- package/src/libs/ui/dataviz/src/lib/ui-dataviz.module.ts +17 -2
- package/src/libs/ui/elements/src/index.ts +0 -2
- package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +18 -8
- package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +21 -1
- package/src/libs/ui/elements/src/lib/content-ghost/content-ghost.component.ts +3 -0
- package/src/libs/ui/elements/src/lib/download-item/download-item.component.html +7 -5
- package/src/libs/ui/elements/src/lib/download-item/download-item.component.ts +12 -1
- package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +1 -1
- package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +57 -11
- package/src/libs/ui/elements/src/lib/error/error.component.css +24 -19
- package/src/libs/ui/elements/src/lib/error/error.component.html +11 -21
- package/src/libs/ui/elements/src/lib/error/error.component.ts +19 -0
- package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +3 -6
- package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.ts +15 -0
- package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +2 -6
- package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +13 -2
- package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +0 -2
- package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.html +4 -1
- package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +1 -0
- package/src/libs/ui/elements/src/lib/metadata-catalog/metadata-catalog.component.ts +4 -1
- package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +20 -22
- package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.ts +24 -0
- package/src/libs/ui/elements/src/lib/metadata-info/linkify.directive.ts +7 -3
- package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +1 -1
- package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +47 -26
- package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +43 -1
- package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +18 -1
- package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.html +1 -1
- package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.ts +7 -1
- package/src/libs/ui/elements/src/lib/notification/notification.component.html +10 -14
- package/src/libs/ui/elements/src/lib/notification/notification.component.ts +33 -2
- package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.css +2 -2
- package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +44 -35
- package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +4 -4
- package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.ts +15 -0
- package/src/libs/ui/elements/src/lib/ui-elements.module.ts +6 -55
- package/src/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.ts +2 -2
- package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +2 -6
- package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +22 -0
- package/src/libs/ui/elements/src/lib/user-preview/user-preview.component.html +1 -4
- package/src/libs/ui/inputs/src/index.ts +1 -1
- package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.css +3 -10
- package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +5 -5
- package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.ts +18 -2
- package/src/libs/ui/inputs/src/lib/badge/badge.component.html +2 -2
- package/src/libs/ui/inputs/src/lib/badge/badge.component.ts +15 -2
- package/src/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.html +4 -1
- package/src/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.ts +3 -3
- package/src/libs/ui/inputs/src/lib/chips-input/chips-input.component.ts +4 -1
- package/src/libs/ui/inputs/src/lib/copy-text-button/copy-text-button.component.html +5 -6
- package/src/libs/ui/inputs/src/lib/copy-text-button/copy-text-button.component.ts +7 -0
- package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +1 -3
- package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +13 -2
- package/src/libs/ui/inputs/src/lib/date-range-dropdown/date-range-dropdown.component.css +5 -0
- package/src/libs/ui/inputs/src/lib/date-range-dropdown/date-range-dropdown.component.html +30 -0
- package/src/libs/ui/inputs/src/lib/date-range-dropdown/date-range-dropdown.component.ts +63 -0
- package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.html +1 -3
- package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +13 -2
- package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +16 -20
- package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +7 -7
- package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +16 -2
- package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +4 -1
- package/src/libs/ui/inputs/src/lib/file-input/file-input.component.html +14 -13
- package/src/libs/ui/inputs/src/lib/file-input/file-input.component.ts +19 -3
- package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +32 -28
- package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +32 -3
- package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +1 -3
- package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.ts +4 -1
- package/src/libs/ui/inputs/src/lib/search-input/search-input.component.html +2 -2
- package/src/libs/ui/inputs/src/lib/search-input/search-input.component.ts +13 -2
- package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.css +0 -9
- package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +2 -6
- package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.ts +6 -0
- package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.html +1 -0
- package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.ts +1 -0
- package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +21 -11
- package/src/libs/ui/inputs/src/lib/url-input/url-input.component.css +1 -1
- package/src/libs/ui/inputs/src/lib/url-input/url-input.component.html +12 -21
- package/src/libs/ui/inputs/src/lib/url-input/url-input.component.ts +49 -20
- package/src/libs/ui/layout/src/index.ts +5 -0
- package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +0 -16
- package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +4 -12
- package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +20 -11
- package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +0 -16
- package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -12
- package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +22 -19
- package/src/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.html +2 -4
- package/src/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.ts +8 -2
- package/src/libs/ui/layout/src/lib/expandable-panel-button/expandable-panel-button.component.html +2 -6
- package/src/libs/ui/layout/src/lib/expandable-panel-button/expandable-panel-button.component.ts +6 -0
- package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +1 -1
- package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.ts +2 -2
- package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +1 -0
- package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +4 -8
- package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +9 -9
- package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -3
- package/src/libs/ui/layout/src/lib/max-lines/max-lines.component.html +1 -1
- package/src/libs/ui/layout/src/lib/paginable.interface.ts +14 -0
- package/src/libs/ui/layout/src/lib/pagination/pagination.component.css +0 -0
- package/src/libs/ui/{elements → layout}/src/lib/pagination/pagination.component.html +12 -13
- package/src/libs/ui/layout/src/lib/pagination/pagination.component.ts +45 -0
- package/src/libs/ui/layout/src/lib/pagination-buttons/pagination-buttons.component.css +0 -0
- package/src/libs/ui/layout/src/lib/pagination-buttons/pagination-buttons.component.html +51 -0
- package/src/libs/ui/layout/src/lib/pagination-buttons/pagination-buttons.component.ts +50 -0
- package/src/libs/ui/layout/src/lib/pagination-dots/pagination-dots.component.css +16 -0
- package/src/libs/ui/layout/src/lib/pagination-dots/pagination-dots.component.html +15 -0
- package/src/libs/ui/layout/src/lib/pagination-dots/pagination-dots.component.ts +31 -0
- package/src/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.html +18 -0
- package/src/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.ts +29 -0
- package/src/libs/ui/layout/src/lib/sortable-list/sortable-list.component.css +4 -2
- package/src/libs/ui/layout/src/lib/sortable-list/sortable-list.component.ts +1 -9
- package/src/libs/ui/layout/src/lib/ui-layout.module.ts +8 -15
- package/src/libs/ui/map/src/index.ts +1 -0
- package/src/libs/ui/map/src/lib/components/map-container/map-container.component.html +4 -3
- package/src/libs/ui/map/src/lib/components/map-container/map-container.component.ts +13 -2
- package/src/libs/ui/map/src/lib/components/map-legend/map-legend.component.css +5 -0
- package/src/libs/ui/map/src/lib/components/map-legend/map-legend.component.html +1 -0
- package/src/libs/ui/map/src/lib/components/map-legend/map-legend.component.ts +39 -0
- package/src/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.html +17 -13
- package/src/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.html +16 -10
- package/src/libs/ui/search/src/lib/results-list/results-layout.config.ts +1 -1
- package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +59 -26
- package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +17 -30
- package/src/libs/ui/search/src/lib/results-table/results-table.component.html +35 -27
- package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +89 -28
- package/src/libs/ui/search/src/lib/ui-search.module.ts +22 -3
- package/src/libs/ui/widgets/src/lib/loading-mask/loading-mask.component.ts +4 -6
- package/src/libs/ui/widgets/src/lib/popup-alert/popup-alert.component.html +2 -4
- package/src/libs/ui/widgets/src/lib/popup-alert/popup-alert.component.ts +8 -2
- package/src/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.ts +1 -0
- package/src/libs/ui/widgets/src/lib/spinning-loader/spinning-loader.component.ts +1 -0
- package/src/libs/ui/widgets/src/lib/step-bar/step-bar.component.ts +2 -2
- package/src/libs/ui/widgets/src/lib/ui-widgets.module.ts +2 -18
- package/src/libs/util/app-config/src/lib/app-config.ts +9 -2
- package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
- package/src/libs/util/app-config/src/lib/map-layers.ts +6 -0
- package/src/libs/util/app-config/src/lib/model.ts +6 -1
- package/src/libs/util/data-fetcher/src/lib/model.ts +6 -6
- package/src/libs/util/data-fetcher/src/lib/readers/base-file.ts +1 -1
- package/src/libs/util/data-fetcher/src/lib/utils.ts +13 -11
- package/src/libs/util/i18n/src/index.ts +1 -0
- package/src/libs/util/i18n/src/lib/i18n.constants.ts +0 -43
- package/src/libs/util/i18n/src/lib/lang.service.ts +1 -1
- package/src/libs/util/i18n/src/lib/language-codes.ts +44 -0
- package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +2 -0
- package/src/libs/util/shared/src/lib/links/link-utils.ts +17 -17
- package/src/libs/util/shared/src/lib/services/proxy.service.ts +7 -3
- package/src/libs/util/shared/src/lib/utils/format-fields.ts +11 -0
- package/src/libs/util/shared/src/lib/utils/index.ts +2 -0
- package/src/libs/util/shared/src/lib/utils/no-duplicate-file-name.ts +23 -0
- package/src/libs/util/shared/src/lib/utils/temporal-extent-union.ts +6 -1
- package/tailwind.base.css +17 -6
- package/translations/de.json +49 -24
- package/translations/en.json +113 -69
- package/translations/es.json +38 -13
- package/translations/fr.json +109 -65
- package/translations/it.json +41 -16
- package/translations/nl.json +38 -13
- package/translations/pt.json +38 -13
- package/translations/sk.json +39 -14
- package/esm2022/libs/feature/dataviz/src/lib/feature-dataviz.module.mjs +0 -74
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-date-updated/form-field-date-updated.component.mjs +0 -19
- package/esm2022/libs/ui/catalog/src/lib/ui-catalog.module.mjs +0 -57
- package/esm2022/libs/ui/elements/src/lib/pagination/pagination.component.mjs +0 -54
- package/esm2022/libs/ui/elements/src/lib/pagination-buttons/pagination-buttons.component.mjs +0 -66
- package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +0 -29
- package/libs/feature/dataviz/src/lib/feature-dataviz.module.d.ts +0 -22
- package/libs/feature/dataviz/src/lib/feature-dataviz.module.d.ts.map +0 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-date-updated/form-field-date-updated.component.d.ts +0 -9
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-date-updated/form-field-date-updated.component.d.ts.map +0 -1
- package/libs/ui/catalog/src/lib/ui-catalog.module.d.ts +0 -17
- package/libs/ui/catalog/src/lib/ui-catalog.module.d.ts.map +0 -1
- package/libs/ui/elements/src/lib/pagination/pagination.component.d.ts +0 -16
- package/libs/ui/elements/src/lib/pagination/pagination.component.d.ts.map +0 -1
- package/libs/ui/elements/src/lib/pagination-buttons/pagination-buttons.component.d.ts +0 -17
- package/libs/ui/elements/src/lib/pagination-buttons/pagination-buttons.component.d.ts.map +0 -1
- package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +0 -12
- package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +0 -1
- package/src/libs/feature/dataviz/src/lib/feature-dataviz.module.ts +0 -48
- package/src/libs/ui/catalog/src/lib/ui-catalog.module.ts +0 -35
- package/src/libs/ui/elements/src/lib/pagination/pagination.component.ts +0 -50
- package/src/libs/ui/elements/src/lib/pagination-buttons/pagination-buttons.component.html +0 -33
- package/src/libs/ui/elements/src/lib/pagination-buttons/pagination-buttons.component.ts +0 -68
- package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +0 -26
- package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +0 -32
- /package/src/libs/feature/editor/src/lib/components/record-form/form-field/{form-field-date-updated/form-field-date-updated.component.css → form-field-date/form-field-date.component.css} +0 -0
- /package/src/libs/feature/editor/src/lib/components/record-form/form-field/{form-field-date-updated/form-field-date-updated.component.html → form-field-date/form-field-date.component.html} +0 -0
- /package/src/libs/{ui/elements/src/lib/pagination-buttons/pagination-buttons.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-spatial-toggle/form-field-spatial-toggle.component.css} +0 -0
- /package/src/libs/{ui/elements/src/lib/pagination/pagination.component.css → feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.css} +0 -0
- /package/src/libs/ui/{inputs → layout}/src/lib/previous-next-buttons/previous-next-buttons.component.css +0 -0
|
@@ -1,17 +1,33 @@
|
|
|
1
|
-
import format from 'date-fns/format';
|
|
1
|
+
import { format } from 'date-fns/format';
|
|
2
2
|
import { filterArray, map, mapArray, noop, pipe, tap, } from '../function-utils';
|
|
3
|
-
import {
|
|
3
|
+
import { allChildrenElement, appendChildren, createChild, createElement, createNestedChild, createNestedElement, findChildOrCreate, findChildrenElement, findNestedChildOrCreate, findNestedElement, findNestedElements, readAttribute, removeAllChildren, removeChildren, removeChildrenByName, setTextContent, writeAttribute, } from '../xml-utils';
|
|
4
4
|
import { readKind } from './read-parts';
|
|
5
5
|
import { writeGeometry } from './utils/geometry';
|
|
6
6
|
import { namePartsToFull } from './utils/individual-name';
|
|
7
|
+
import { LANG_2_TO_3_MAPPER } from '../../../../../../libs/util/i18n/src/lib/language-codes';
|
|
8
|
+
import { kindToCodeListValue } from '../common/resource-types';
|
|
9
|
+
function writeLocalizedElement(writeFn, text, translations, defaultLanguage) {
|
|
10
|
+
if (!translations)
|
|
11
|
+
return writeFn;
|
|
12
|
+
function createLocalized(lang, translation) {
|
|
13
|
+
return pipe(createNestedElement('gmd:textGroup', 'gmd:LocalisedCharacterString'), writeAttribute('locale', `#${lang.toUpperCase()}`), setTextContent(translation));
|
|
14
|
+
}
|
|
15
|
+
return pipe(writeFn, removeChildrenByName('gmd:PT_FreeText'), createChild('gmd:PT_FreeText'), appendChildren(createLocalized(defaultLanguage, text), ...Object.entries(translations).map(([lang, translation]) => createLocalized(lang, translation))));
|
|
16
|
+
}
|
|
7
17
|
export function writeCharacterString(text) {
|
|
8
18
|
return tap(pipe(findChildOrCreate('gco:CharacterString'), setTextContent(text)));
|
|
9
19
|
}
|
|
20
|
+
export function writeLocalizedCharacterString(text, translations, defaultLanguage) {
|
|
21
|
+
return writeLocalizedElement(writeCharacterString(text), text, translations, defaultLanguage);
|
|
22
|
+
}
|
|
10
23
|
export function writeLinkage(url) {
|
|
11
24
|
return tap(pipe(findNestedChildOrCreate('gmd:linkage', 'gmd:URL'), setTextContent(url.toString())));
|
|
12
25
|
}
|
|
13
26
|
export function writeAnchor(url, text) {
|
|
14
|
-
return tap(pipe(findChildOrCreate('gmx:Anchor'),
|
|
27
|
+
return tap(pipe(findChildOrCreate('gmx:Anchor'), writeAttribute('xlink:href', url.toString()), text ? setTextContent(text) : noop));
|
|
28
|
+
}
|
|
29
|
+
export function writeLocalizedAnchor(url, text, translations, defaultLanguage) {
|
|
30
|
+
return writeLocalizedElement(writeAnchor(url, text), text, translations, defaultLanguage);
|
|
15
31
|
}
|
|
16
32
|
export function writeDateTime(date) {
|
|
17
33
|
return pipe(findChildOrCreate('gco:DateTime'), setTextContent(format(date, "yyyy-MM-dd'T'HH:mm:ss")));
|
|
@@ -148,15 +164,15 @@ export function getISODuration(updateFrequency) {
|
|
|
148
164
|
const hours = duration.hours > 0 ? `T${duration.hours}H` : '';
|
|
149
165
|
return `P${duration.years}Y${duration.months}M${duration.days}D${hours}`;
|
|
150
166
|
}
|
|
151
|
-
function appendResponsibleParty(contact) {
|
|
167
|
+
function appendResponsibleParty(contact, translations, defaultLanguage) {
|
|
152
168
|
const fullName = namePartsToFull(contact.firstName, contact.lastName);
|
|
153
|
-
const createAddress = pipe(
|
|
169
|
+
const createAddress = pipe(createNestedElement('gmd:address', 'gmd:CI_Address'), appendChildren(pipe(createElement('gmd:electronicMailAddress'), writeCharacterString(contact.email))), contact.address
|
|
154
170
|
? appendChildren(pipe(createElement('gmd:deliveryPoint'), writeCharacterString(contact.address)))
|
|
155
171
|
: noop);
|
|
156
|
-
const createContact = pipe(
|
|
157
|
-
? appendChildren(pipe(
|
|
172
|
+
const createContact = pipe(createNestedElement('gmd:contactInfo', 'gmd:CI_Contact'), contact.phone
|
|
173
|
+
? appendChildren(pipe(createNestedElement('gmd:phone', 'gmd:CI_Telephone', 'gmd:voice'), writeCharacterString(contact.phone)))
|
|
158
174
|
: noop, appendChildren(createAddress), contact.organization?.website
|
|
159
|
-
? appendChildren(pipe(
|
|
175
|
+
? appendChildren(pipe(createNestedElement('gmd:onlineResource', 'gmd:CI_OnlineResource'), writeLinkage(contact.organization.website)))
|
|
160
176
|
: noop);
|
|
161
177
|
return appendChildren(pipe(createElement('gmd:CI_ResponsibleParty'), fullName
|
|
162
178
|
? appendChildren(pipe(createElement('gmd:individualName'), writeCharacterString(fullName)))
|
|
@@ -164,18 +180,18 @@ function appendResponsibleParty(contact) {
|
|
|
164
180
|
? appendChildren(pipe(createElement('gmd:positionName'), writeCharacterString(contact.position)))
|
|
165
181
|
: noop, contact.organization?.name
|
|
166
182
|
? appendChildren(pipe(createElement('gmd:organisationName'), writeCharacterString(contact.organization.name)))
|
|
167
|
-
: noop, appendChildren(createContact, pipe(
|
|
183
|
+
: noop, appendChildren(createContact, pipe(createNestedElement('gmd:role', 'gmd:CI_RoleCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_RoleCode'), writeAttribute('codeListValue', getRoleCode(contact.role))))));
|
|
168
184
|
}
|
|
169
185
|
export function removeKeywords() {
|
|
170
186
|
return removeChildren(pipe(findNestedElements('gmd:descriptiveKeywords')));
|
|
171
187
|
}
|
|
172
188
|
// returns a <gmd:thesaurusName> element
|
|
173
189
|
export function createThesaurus(thesaurus) {
|
|
174
|
-
return pipe(
|
|
190
|
+
return pipe(createNestedElement('gmd:thesaurusName', 'gmd:CI_Citation'), appendChildren(pipe(createElement('gmd:title'), writeCharacterString(thesaurus.name || thesaurus.id)), pipe(createNestedElement('gmd:identifier', 'gmd:MD_Identifier'), appendChildren(pipe(createElement('gmd:code'), thesaurus.url
|
|
175
191
|
? writeAnchor(thesaurus.url, thesaurus.id)
|
|
176
192
|
: writeCharacterString(thesaurus.id))))));
|
|
177
193
|
}
|
|
178
|
-
export function appendKeywords(keywords) {
|
|
194
|
+
export function appendKeywords(keywords, defaultLanguage) {
|
|
179
195
|
// keywords are grouped by thesaurus if they have one, otherwise by type
|
|
180
196
|
const keywordsByThesaurus = keywords.reduce((acc, keyword) => {
|
|
181
197
|
const thesaurusId = keyword.thesaurus?.id;
|
|
@@ -190,48 +206,58 @@ export function appendKeywords(keywords) {
|
|
|
190
206
|
existingGroup.push(keyword);
|
|
191
207
|
return acc;
|
|
192
208
|
}, []);
|
|
193
|
-
return appendChildren(...keywordsByThesaurus.map((keywords) => pipe(
|
|
209
|
+
return appendChildren(...keywordsByThesaurus.map((keywords) => pipe(createNestedElement('gmd:descriptiveKeywords', 'gmd:MD_Keywords'), appendChildren(pipe(createNestedElement('gmd:type', 'gmd:MD_KeywordTypeCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_KeywordTypeCode'), writeAttribute('codeListValue', keywords[0].type))), keywords[0].thesaurus
|
|
194
210
|
? appendChildren(createThesaurus(keywords[0].thesaurus))
|
|
195
|
-
: noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'),
|
|
211
|
+
: noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeLocalizedCharacterString(keyword.label, keyword.translations?.label, defaultLanguage)))))));
|
|
196
212
|
}
|
|
197
|
-
export function createConstraint(constraint, type) {
|
|
213
|
+
export function createConstraint(constraint, type, defaultLanguage) {
|
|
198
214
|
if (type === 'security') {
|
|
199
|
-
return pipe(
|
|
215
|
+
return pipe(createNestedElement('gmd:resourceConstraints', 'gmd:MD_SecurityConstraints'), appendChildren(pipe(createNestedElement('gmd:classification', 'gmd:MD_ClassificationCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ClassificationCode'), writeAttribute('codeListValue', 'restricted')), pipe(createElement('gmd:useLimitation'), 'url' in constraint
|
|
216
|
+
? writeLocalizedAnchor(constraint.url, constraint.text, constraint.translations?.text, defaultLanguage)
|
|
217
|
+
: writeLocalizedCharacterString(constraint.text, constraint.translations?.text, defaultLanguage))));
|
|
200
218
|
}
|
|
201
219
|
else if (type === 'legal') {
|
|
202
|
-
return pipe(
|
|
220
|
+
return pipe(createNestedElement('gmd:resourceConstraints', 'gmd:MD_LegalConstraints'), appendChildren(pipe(createNestedElement('gmd:accessConstraints', 'gmd:MD_RestrictionCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), writeAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), 'url' in constraint
|
|
221
|
+
? writeLocalizedAnchor(constraint.url, constraint.text, constraint.translations?.text, defaultLanguage)
|
|
222
|
+
: writeLocalizedCharacterString(constraint.text, constraint.translations?.text, defaultLanguage))));
|
|
203
223
|
}
|
|
204
|
-
|
|
224
|
+
// other
|
|
225
|
+
return pipe(createNestedElement('gmd:resourceConstraints', 'gmd:MD_Constraints', 'gmd:useLimitation'), 'url' in constraint
|
|
226
|
+
? writeLocalizedAnchor(constraint.url, constraint.text, constraint.translations?.text, defaultLanguage)
|
|
227
|
+
: writeLocalizedCharacterString(constraint.text, constraint.translations?.text, defaultLanguage));
|
|
205
228
|
}
|
|
206
229
|
export function removeOtherConstraints() {
|
|
207
|
-
return
|
|
230
|
+
return tap(pipe(findChildrenElement('gmd:resourceConstraints'), mapArray(removeChildren(pipe(findChildrenElement('gmd:MD_Constraints'), filterArray(pipe(findNestedElements('gmd:useLimitation'), (array) => array.length > 0)))))));
|
|
208
231
|
}
|
|
209
232
|
export function removeSecurityConstraints() {
|
|
210
|
-
return
|
|
233
|
+
return tap(pipe(findChildrenElement('gmd:resourceConstraints'), mapArray(removeChildren(pipe(findChildrenElement('gmd:MD_SecurityConstraints'), filterArray(pipe(findNestedElements('gmd:useLimitation'), (array) => array.length > 0)))))));
|
|
211
234
|
}
|
|
212
235
|
export function removeLegalConstraints() {
|
|
213
|
-
return
|
|
236
|
+
return tap(pipe(findChildrenElement('gmd:resourceConstraints'), mapArray(removeChildren(pipe(findChildrenElement('gmd:MD_LegalConstraints'), filterArray(pipe(findNestedElements('gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code !== 'license'))))))));
|
|
237
|
+
}
|
|
238
|
+
export function removeEmptyResourceConstraints() {
|
|
239
|
+
return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(allChildrenElement, (array) => array.length === 0))));
|
|
214
240
|
}
|
|
215
241
|
export function removeLicenses() {
|
|
216
242
|
return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.some((code) => code === 'license')))));
|
|
217
243
|
}
|
|
218
|
-
export function createLicense(license) {
|
|
219
|
-
return pipe(
|
|
244
|
+
export function createLicense(license, defaultLanguage) {
|
|
245
|
+
return pipe(createNestedElement('gmd:resourceConstraints', 'gmd:MD_LegalConstraints'), appendChildren(pipe(createNestedElement('gmd:accessConstraints', 'gmd:MD_RestrictionCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), writeAttribute('codeListValue', 'license')), pipe(createNestedElement('gmd:accessConstraints', 'gmd:MD_RestrictionCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), writeAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), 'url' in license
|
|
220
246
|
? writeAnchor(license.url, license.text)
|
|
221
|
-
:
|
|
247
|
+
: writeLocalizedCharacterString(license.text, license.translations?.text, defaultLanguage))));
|
|
222
248
|
}
|
|
223
249
|
export function removeOnlineResources() {
|
|
224
|
-
return
|
|
250
|
+
return removeChildrenByName('gmd:distributionInfo');
|
|
225
251
|
}
|
|
226
252
|
function appendOnlineResourceFormat(mimeType) {
|
|
227
|
-
return appendChildren(pipe(
|
|
253
|
+
return appendChildren(pipe(createNestedElement('gmd:distributionFormat', 'gmd:MD_Format'), appendChildren(pipe(createElement('gmd:name'), writeCharacterString(mimeType)), pipe(createElement('gmd:version'), writeCharacterString('1.0') // hardcoding this as it most likely won't be used but is mandatory
|
|
228
254
|
))));
|
|
229
255
|
}
|
|
230
256
|
export function createDistributionInfo() {
|
|
231
|
-
return
|
|
257
|
+
return createNestedElement('gmd:distributionInfo', 'gmd:MD_Distribution');
|
|
232
258
|
}
|
|
233
259
|
// apply to MD_Distribution
|
|
234
|
-
export function appendOnlineResource(onlineResource, appendFormatFn) {
|
|
260
|
+
export function appendOnlineResource(onlineResource, appendFormatFn, translations, defaultLanguage) {
|
|
235
261
|
let name;
|
|
236
262
|
let functionCode;
|
|
237
263
|
let protocol;
|
|
@@ -250,11 +276,11 @@ export function appendOnlineResource(onlineResource, appendFormatFn) {
|
|
|
250
276
|
functionCode = 'information';
|
|
251
277
|
protocol = 'WWW:LINK';
|
|
252
278
|
}
|
|
253
|
-
const appendTransferOptions = appendChildren(pipe(
|
|
254
|
-
? appendChildren(pipe(createElement('gmd:description'),
|
|
279
|
+
const appendTransferOptions = appendChildren(pipe(createNestedElement('gmd:transferOptions', 'gmd:MD_DigitalTransferOptions', 'gmd:onLine', 'gmd:CI_OnlineResource'), writeLinkage(onlineResource.url), 'description' in onlineResource
|
|
280
|
+
? appendChildren(pipe(createElement('gmd:description'), writeLocalizedCharacterString(onlineResource.description, onlineResource.translations?.description, defaultLanguage)))
|
|
255
281
|
: noop, name !== undefined
|
|
256
|
-
? appendChildren(pipe(createElement('gmd:name'),
|
|
257
|
-
: noop, appendChildren(pipe(createElement('gmd:protocol'), writeCharacterString(protocol)), pipe(
|
|
282
|
+
? appendChildren(pipe(createElement('gmd:name'), writeLocalizedCharacterString(name, onlineResource.translations?.name, defaultLanguage)))
|
|
283
|
+
: noop, appendChildren(pipe(createElement('gmd:protocol'), writeCharacterString(protocol)), pipe(createNestedElement('gmd:function', 'gmd:CI_OnLineFunctionCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_OnLineFunctionCode'), writeAttribute('codeListValue', functionCode)))));
|
|
258
284
|
return pipe('mimeType' in onlineResource
|
|
259
285
|
? appendFormatFn(onlineResource.mimeType)
|
|
260
286
|
: noop, appendTransferOptions);
|
|
@@ -281,45 +307,45 @@ export function writeUniqueIdentifier(record, rootEl) {
|
|
|
281
307
|
pipe(findChildOrCreate('gmd:fileIdentifier'), writeCharacterString(record.uniqueIdentifier))(rootEl);
|
|
282
308
|
}
|
|
283
309
|
export function writeKind(record, rootEl) {
|
|
284
|
-
pipe(findNestedChildOrCreate('gmd:hierarchyLevel', 'gmd:MD_ScopeCode'),
|
|
310
|
+
pipe(findNestedChildOrCreate('gmd:hierarchyLevel', 'gmd:MD_ScopeCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ScopeCode'), writeAttribute('codeListValue', kindToCodeListValue(record)))(rootEl);
|
|
285
311
|
}
|
|
286
312
|
export function writeTitle(record, rootEl) {
|
|
287
|
-
pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:citation', 'gmd:CI_Citation', 'gmd:title'),
|
|
313
|
+
pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:citation', 'gmd:CI_Citation', 'gmd:title'), writeLocalizedCharacterString(record.title, record.translations?.title, record.defaultLanguage))(rootEl);
|
|
288
314
|
}
|
|
289
315
|
export function writeAbstract(record, rootEl) {
|
|
290
|
-
pipe(findOrCreateIdentification(), findChildOrCreate('gmd:abstract'),
|
|
316
|
+
pipe(findOrCreateIdentification(), findChildOrCreate('gmd:abstract'), writeLocalizedCharacterString(record.abstract, record.translations?.abstract, record.defaultLanguage))(rootEl);
|
|
291
317
|
}
|
|
292
318
|
export function writeStatus(record, rootEl) {
|
|
293
|
-
pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:status', 'gmd:MD_ProgressCode'),
|
|
319
|
+
pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:status', 'gmd:MD_ProgressCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ProgressCode'), writeAttribute('codeListValue', getProgressCode(record.status)))(rootEl);
|
|
294
320
|
}
|
|
295
321
|
export function writeContacts(record, rootEl) {
|
|
296
|
-
pipe(removeChildrenByName('gmd:contact'), appendChildren(...record.contacts.map((contact) => pipe(createElement('gmd:contact'), appendResponsibleParty(contact)))))(rootEl);
|
|
322
|
+
pipe(removeChildrenByName('gmd:contact'), appendChildren(...record.contacts.map((contact) => pipe(createElement('gmd:contact'), appendResponsibleParty(contact, record.translations, record.defaultLanguage)))))(rootEl);
|
|
297
323
|
}
|
|
298
324
|
export function writeContactsForResource(record, rootEl) {
|
|
299
|
-
pipe(findOrCreateIdentification(), removeChildrenByName('gmd:pointOfContact'), removeChildrenByName('gmd:contact'), appendChildren(...record.contactsForResource.map((contact) => pipe(createElement('gmd:pointOfContact'), appendResponsibleParty(contact)))))(rootEl);
|
|
325
|
+
pipe(findOrCreateIdentification(), removeChildrenByName('gmd:pointOfContact'), removeChildrenByName('gmd:contact'), appendChildren(...record.contactsForResource.map((contact) => pipe(createElement('gmd:pointOfContact'), appendResponsibleParty(contact, record.translations, record.defaultLanguage)))))(rootEl);
|
|
300
326
|
}
|
|
301
327
|
export function writeKeywords(record, rootEl) {
|
|
302
|
-
pipe(findOrCreateIdentification(), removeKeywords(), appendKeywords(record.keywords))(rootEl);
|
|
328
|
+
pipe(findOrCreateIdentification(), removeKeywords(), appendKeywords(record.keywords, record.defaultLanguage))(rootEl);
|
|
303
329
|
}
|
|
304
330
|
export function writeTopics(record, rootEl) {
|
|
305
|
-
pipe(findOrCreateIdentification(), removeChildrenByName('gmd:topicCategory'), appendChildren(...record.topics.map((topic) => pipe(
|
|
331
|
+
pipe(findOrCreateIdentification(), removeChildrenByName('gmd:topicCategory'), appendChildren(...record.topics.map((topic) => pipe(createNestedElement('gmd:topicCategory', 'gmd:MD_TopicCategoryCode'), setTextContent(topic)))))(rootEl);
|
|
306
332
|
}
|
|
307
333
|
export function writeLicenses(record, rootEl) {
|
|
308
|
-
pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
|
|
334
|
+
pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map((license) => createLicense(license, record.defaultLanguage))))(rootEl);
|
|
309
335
|
}
|
|
310
336
|
export function writeLegalConstraints(record, rootEl) {
|
|
311
|
-
pipe(findOrCreateIdentification(), removeLegalConstraints(), appendChildren(...record.legalConstraints.map((c) => createConstraint(c, 'legal'))))(rootEl);
|
|
337
|
+
pipe(findOrCreateIdentification(), removeLegalConstraints(), removeEmptyResourceConstraints(), appendChildren(...record.legalConstraints.map((c) => createConstraint(c, 'legal', record.defaultLanguage))))(rootEl);
|
|
312
338
|
}
|
|
313
339
|
export function writeSecurityConstraints(record, rootEl) {
|
|
314
|
-
pipe(findOrCreateIdentification(), removeSecurityConstraints(), appendChildren(...record.securityConstraints.map((c) => createConstraint(c, 'security'))))(rootEl);
|
|
340
|
+
pipe(findOrCreateIdentification(), removeSecurityConstraints(), removeEmptyResourceConstraints(), appendChildren(...record.securityConstraints.map((c) => createConstraint(c, 'security', record.defaultLanguage))))(rootEl);
|
|
315
341
|
}
|
|
316
342
|
export function writeOtherConstraints(record, rootEl) {
|
|
317
|
-
pipe(findOrCreateIdentification(), removeOtherConstraints(), appendChildren(...record.otherConstraints.map((c) => createConstraint(c, 'other'))))(rootEl);
|
|
343
|
+
pipe(findOrCreateIdentification(), removeOtherConstraints(), removeEmptyResourceConstraints(), appendChildren(...record.otherConstraints.map((c) => createConstraint(c, 'other', record.defaultLanguage))))(rootEl);
|
|
318
344
|
}
|
|
319
345
|
export function writeUpdateFrequency(record, rootEl) {
|
|
320
346
|
pipe(findOrCreateIdentification(), findChildOrCreate('gmd:resourceMaintenance'), removeAllChildren(), findChildOrCreate('gmd:MD_MaintenanceInformation'), typeof record.updateFrequency === 'object'
|
|
321
|
-
? pipe(
|
|
322
|
-
: pipe(
|
|
347
|
+
? pipe(createNestedChild('gmd:userDefinedMaintenanceFrequency', 'gts:TM_PeriodDuration'), setTextContent(getISODuration(record.updateFrequency)))
|
|
348
|
+
: pipe(createNestedChild('gmd:maintenanceAndUpdateFrequency', 'gmd:MD_MaintenanceFrequencyCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_MaintenanceFrequencyCode'), writeAttribute('codeListValue', getMaintenanceFrequencyCode(record.updateFrequency))))(rootEl);
|
|
323
349
|
}
|
|
324
350
|
export function writeRecordUpdated(record, rootEl) {
|
|
325
351
|
pipe(findChildOrCreate('gmd:dateStamp'), removeAllChildren(), writeDateTime(record.recordUpdated))(rootEl);
|
|
@@ -328,7 +354,7 @@ export function removeResourceDate(type) {
|
|
|
328
354
|
return pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:citation', 'gmd:CI_Citation'), removeChildren(pipe(findNestedElements('gmd:date'), filterArray(pipe(findNestedElement('gmd:CI_Date', 'gmd:dateType', 'gmd:CI_DateTypeCode'), readAttribute('codeListValue'), map((value) => value === type))))));
|
|
329
355
|
}
|
|
330
356
|
export function appendResourceDate(date, type) {
|
|
331
|
-
return pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:citation', 'gmd:CI_Citation'), appendChildren(pipe(
|
|
357
|
+
return pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:citation', 'gmd:CI_Citation'), appendChildren(pipe(createNestedElement('gmd:date', 'gmd:CI_Date'), appendChildren(pipe(createElement('gmd:date'), writeDateTime(date)), pipe(createNestedElement('gmd:dateType', 'gmd:CI_DateTypeCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode'), writeAttribute('codeListValue', type))))));
|
|
332
358
|
}
|
|
333
359
|
export function writeResourceCreated(record, rootEl) {
|
|
334
360
|
removeResourceDate('creation')(rootEl);
|
|
@@ -348,16 +374,23 @@ export function writeResourcePublished(record, rootEl) {
|
|
|
348
374
|
return;
|
|
349
375
|
appendResourceDate(record.resourcePublished, 'publication')(rootEl);
|
|
350
376
|
}
|
|
377
|
+
export function writeReuseType(record, rootEl) {
|
|
378
|
+
writeKind(record, rootEl);
|
|
379
|
+
}
|
|
351
380
|
export function writeSpatialRepresentation(record, rootEl) {
|
|
352
|
-
|
|
381
|
+
if (!record.spatialRepresentation) {
|
|
382
|
+
pipe(findOrCreateIdentification(), removeChildrenByName('gmd:spatialRepresentationType'))(rootEl);
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:spatialRepresentationType', 'gmd:MD_SpatialRepresentationTypeCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_SpatialRepresentationTypeCode'), writeAttribute('codeListValue', record.spatialRepresentation))(rootEl);
|
|
353
386
|
}
|
|
354
387
|
export function writeGraphicOverviews(record, rootEl) {
|
|
355
|
-
pipe(findOrCreateIdentification(), removeChildrenByName('gmd:graphicOverview'), appendChildren(...record.overviews.map((overview) => pipe(
|
|
388
|
+
pipe(findOrCreateIdentification(), removeChildrenByName('gmd:graphicOverview'), appendChildren(...record.overviews.map((overview) => pipe(createNestedElement('gmd:graphicOverview', 'gmd:MD_BrowseGraphic'), appendChildren(pipe(createElement('gmd:fileName'), writeCharacterString(overview.url.toString()))), 'description' in overview
|
|
356
389
|
? appendChildren(pipe(createElement('gmd:fileDescription'), writeCharacterString(overview.description)))
|
|
357
390
|
: noop))))(rootEl);
|
|
358
391
|
}
|
|
359
392
|
export function writeLineage(record, rootEl) {
|
|
360
|
-
pipe(findNestedChildOrCreate('gmd:dataQualityInfo', 'gmd:DQ_DataQuality', 'gmd:lineage', 'gmd:LI_Lineage', 'gmd:statement'),
|
|
393
|
+
pipe(findNestedChildOrCreate('gmd:dataQualityInfo', 'gmd:DQ_DataQuality', 'gmd:lineage', 'gmd:LI_Lineage', 'gmd:statement'), writeLocalizedCharacterString(record.lineage, record.translations?.lineage, record.defaultLanguage))(rootEl);
|
|
361
394
|
}
|
|
362
395
|
export function getServiceEndpointProtocol(endpoint) {
|
|
363
396
|
switch (endpoint.protocol.toLowerCase()) {
|
|
@@ -383,15 +416,15 @@ export function createOnlineResource(onlineResource) {
|
|
|
383
416
|
functionCode = 'information';
|
|
384
417
|
protocol = 'WWW:LINK';
|
|
385
418
|
}
|
|
386
|
-
const appendTransferOptions = appendChildren(pipe(createElement('gmd:transferOptions'),
|
|
419
|
+
const appendTransferOptions = appendChildren(pipe(createElement('gmd:transferOptions'), createNestedChild('gmd:MD_DigitalTransferOptions', 'gmd:onLine', 'gmd:CI_OnlineResource'), writeLinkage(linkageUrl), 'description' in onlineResource
|
|
387
420
|
? appendChildren(pipe(createElement('gmd:description'), writeCharacterString(onlineResource.description)))
|
|
388
421
|
: noop, 'name' in onlineResource
|
|
389
422
|
? appendChildren(pipe(createElement('gmd:name'), writeCharacterString(onlineResource.name)))
|
|
390
|
-
: noop, appendChildren(pipe(createElement('gmd:protocol'), writeCharacterString(protocol)), pipe(
|
|
391
|
-
return pipe(
|
|
423
|
+
: noop, appendChildren(pipe(createElement('gmd:protocol'), writeCharacterString(protocol)), pipe(createNestedElement('gmd:function', 'gmd:CI_OnLineFunctionCode'), writeAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_OnLineFunctionCode'), writeAttribute('codeListValue', functionCode)))));
|
|
424
|
+
return pipe(createNestedElement('gmd:distributionInfo', 'gmd:MD_Distribution'), appendTransferOptions);
|
|
392
425
|
}
|
|
393
426
|
export function appendDatasetOnlineResources(record, rootEl) {
|
|
394
|
-
appendChildren(...record.onlineResources.map((d) => pipe(createDistributionInfo(), appendOnlineResource(d, appendOnlineResourceFormat))))(rootEl);
|
|
427
|
+
appendChildren(...record.onlineResources.map((d) => pipe(createDistributionInfo(), appendOnlineResource(d, appendOnlineResourceFormat, record.translations, record.defaultLanguage))))(rootEl);
|
|
395
428
|
}
|
|
396
429
|
export function appendServiceOnlineResources(record, rootEl) {
|
|
397
430
|
appendChildren(...record.onlineResources.map(createOnlineResource))(rootEl);
|
|
@@ -405,15 +438,15 @@ export function writeOnlineResources(record, rootEl) {
|
|
|
405
438
|
appendServiceOnlineResources(record, rootEl);
|
|
406
439
|
}
|
|
407
440
|
export function writeTemporalExtents(record, rootEl) {
|
|
408
|
-
pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:extent', 'gmd:EX_Extent'), removeChildrenByName('gmd:temporalElement'), appendChildren(...record.temporalExtents.map((extent) => pipe(
|
|
409
|
-
? pipe(
|
|
441
|
+
pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:extent', 'gmd:EX_Extent'), removeChildrenByName('gmd:temporalElement'), appendChildren(...record.temporalExtents.map((extent) => pipe(createNestedElement('gmd:temporalElement', 'gmd:EX_TemporalExtent'), appendChildren('start' in extent && 'end' in extent
|
|
442
|
+
? pipe(createNestedElement('gmd:extent', 'gml:TimePeriod'), appendChildren(pipe(createElement('gml:beginPosition'), pipe(extent.start
|
|
410
443
|
? setTextContent(format(extent.start, 'yyyy-MM-dd'))
|
|
411
|
-
:
|
|
444
|
+
: writeAttribute('indeterminatePosition', 'unknown'))), pipe(createElement('gml:endPosition'), pipe(extent.end
|
|
412
445
|
? setTextContent(format(extent.end, 'yyyy-MM-dd'))
|
|
413
|
-
:
|
|
414
|
-
: pipe(
|
|
446
|
+
: writeAttribute('indeterminatePosition', 'unknown')))))
|
|
447
|
+
: pipe(createNestedElement('gmd:extent', 'gml:TimeInstant', 'gml:timePosition'), extent.start
|
|
415
448
|
? setTextContent(format(extent.start, 'yyyy-MM-dd'))
|
|
416
|
-
:
|
|
449
|
+
: writeAttribute('indeterminatePosition', 'unknown')))))))(rootEl);
|
|
417
450
|
}
|
|
418
451
|
export function writeSpatialExtents(record, rootEl) {
|
|
419
452
|
const appendBoundingPolygon = (geometry) => {
|
|
@@ -426,11 +459,31 @@ export function writeSpatialExtents(record, rootEl) {
|
|
|
426
459
|
return null;
|
|
427
460
|
return pipe(createElement('gmd:EX_GeographicBoundingBox'), appendChildren(pipe(createElement('gmd:westBoundLongitude'), writeDecimal(bbox[0])), pipe(createElement('gmd:eastBoundLongitude'), writeDecimal(bbox[2])), pipe(createElement('gmd:southBoundLatitude'), writeDecimal(bbox[1])), pipe(createElement('gmd:northBoundLatitude'), writeDecimal(bbox[3]))));
|
|
428
461
|
};
|
|
429
|
-
const appendGeographicDescription = (description) => {
|
|
462
|
+
const appendGeographicDescription = (description, translations) => {
|
|
430
463
|
if (!description)
|
|
431
464
|
return null;
|
|
432
|
-
return pipe(
|
|
465
|
+
return pipe(createNestedElement('gmd:EX_GeographicDescription', 'gmd:geographicIdentifier', 'gmd:MD_Identifier', 'gmd:code'), writeLocalizedCharacterString(description, translations, record.defaultLanguage));
|
|
433
466
|
};
|
|
434
|
-
pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:extent', 'gmd:EX_Extent'), removeChildrenByName('gmd:geographicElement'), appendChildren(...record.spatialExtents.map((extent) => pipe(createElement('gmd:geographicElement'), appendChildren(appendBoundingPolygon(extent.geometry), appendGeographicBoundingBox(extent.bbox), appendGeographicDescription(extent.description))))))(rootEl);
|
|
467
|
+
pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:extent', 'gmd:EX_Extent'), removeChildrenByName('gmd:geographicElement'), appendChildren(...record.spatialExtents.map((extent) => pipe(createElement('gmd:geographicElement'), appendChildren(appendBoundingPolygon(extent.geometry), appendGeographicBoundingBox(extent.bbox), appendGeographicDescription(extent.description, extent.translations?.description))))))(rootEl);
|
|
468
|
+
}
|
|
469
|
+
export function writeLanguages(record, rootEl) {
|
|
470
|
+
// clear existing
|
|
471
|
+
removeChildrenByName('gmd:locale')(rootEl);
|
|
472
|
+
// do not write down languages if there is nothing else than the default one
|
|
473
|
+
if (!record.otherLanguages?.length) {
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
const createLanguageEl = (lang) => pipe(createNestedElement('gmd:locale', 'gmd:PT_Locale'), writeAttribute('id', lang.toUpperCase()), createNestedChild('gmd:languageCode', 'gmd:LanguageCode'), writeAttribute('codeList', 'http://www.loc.gov/standards/iso639-2/'), writeAttribute('codeListValue', LANG_2_TO_3_MAPPER[lang]));
|
|
477
|
+
// add new languages (only if other than default one)
|
|
478
|
+
appendChildren(createLanguageEl(record.defaultLanguage), ...record.otherLanguages.map(createLanguageEl))(rootEl);
|
|
479
|
+
}
|
|
480
|
+
export function writeDefaultLanguage(record, rootEl) {
|
|
481
|
+
const lang3 = LANG_2_TO_3_MAPPER[record.defaultLanguage.toLowerCase()];
|
|
482
|
+
return pipe(findNestedChildOrCreate('gmd:language', 'gmd:LanguageCode'), writeAttribute('codeList', 'http://www.loc.gov/standards/iso639-2/'), writeAttribute('codeListValue', lang3))(rootEl);
|
|
483
|
+
}
|
|
484
|
+
export function writeResourceIdentifier(record, rootEl) {
|
|
485
|
+
pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:citation', 'gmd:CI_Citation'), removeChildrenByName('gmd:identifier'), record.resourceIdentifier
|
|
486
|
+
? pipe(createNestedChild('gmd:identifier', 'gmd:MD_Identifier', 'gmd:code'), writeCharacterString(record.resourceIdentifier))
|
|
487
|
+
: noop)(rootEl);
|
|
435
488
|
}
|
|
436
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUtcGFydHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FwaS9tZXRhZGF0YS1jb252ZXJ0ZXIvc3JjL2xpYi9pc28xOTEzOS93cml0ZS1wYXJ0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFFcEMsT0FBTyxFQUVMLFdBQVcsRUFDWCxHQUFHLEVBQ0gsUUFBUSxFQUNSLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxHQUNKLE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUNMLFlBQVksRUFDWixjQUFjLEVBQ2QsV0FBVyxFQUNYLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixjQUFjLEdBRWYsTUFBTSxjQUFjLENBQUE7QUFDckIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBRXpELE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsSUFBWTtJQUVaLE9BQU8sR0FBRyxDQUNSLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNyRSxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQzFCLEdBQVE7SUFFUixPQUFPLEdBQUcsQ0FDUixJQUFJLENBQ0YsdUJBQXVCLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUNqRCxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQy9CLENB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QUMsRUFDdEQsb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsRUFDN0MsY0FBYyxDQUNaLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUN0QyxJQUFJLENBQ0YsYUFBYSxDQUFDLHVCQUF1QixDQUFDLEVBQ3RDLGNBQWMsQ0FDWixxQkFBcUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ3RDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDeEMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUNoRCxDQUNGLENBQ0YsQ0FDRixDQUNGLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2F0YWxvZ1JlY29yZCxcbiAgQ29uc3RyYWludCxcbiAgRGF0YXNldE9ubGluZVJlc291cmNlLFxuICBEYXRhc2V0UmVjb3JkLFxuICBEYXRhc2V0U2VydmljZURpc3RyaWJ1dGlvbixcbiAgSW5kaXZpZHVhbCxcbiAgS2V5d29yZCxcbiAgUmVjb3JkU3RhdHVzLFxuICBSb2xlLFxuICBTZXJ2aWNlRW5kcG9pbnQsXG4gIFNlcnZpY2VPbmxpbmVSZXNvdXJjZSxcbiAgU2VydmljZVJlY29yZCxcbiAgVXBkYXRlRnJlcXVlbmN5Q29kZSxcbiAgVXBkYXRlRnJlcXVlbmN5Q3VzdG9tLFxufSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9kb21haW4vc3JjL2xpYi9tb2RlbC9yZWNvcmQnXG5pbXBvcnQgeyBUaGVzYXVydXNNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL2RvbWFpbi9zcmMvbGliL21vZGVsL3RoZXNhdXJ1cydcbmltcG9ydCBmb3JtYXQgZnJvbSAnZGF0ZS1mbnMvZm9ybWF0J1xuaW1wb3J0IHsgR2VvbWV0cnkgfSBmcm9tICdnZW9qc29uJ1xuaW1wb3J0IHtcbiAgQ2hhaW5hYmxlRnVuY3Rpb24sXG4gIGZpbHRlckFycmF5LFxuICBtYXAsXG4gIG1hcEFycmF5LFxuICBub29wLFxuICBwaXBlLFxuICB0YXAsXG59IGZyb20gJy4uL2Z1bmN0aW9uLXV0aWxzJ1xuaW1wb3J0IHtcbiAgYWRkQXR0cmlidXRlLFxuICBhcHBlbmRDaGlsZHJlbixcbiAgY3JlYXRlQ2hpbGQsXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIGZpbmRDaGlsZE9yQ3JlYXRlLFxuICBmaW5kQ2hpbGRyZW5FbGVtZW50LFxuICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZSxcbiAgZmluZE5lc3RlZEVsZW1lbnQsXG4gIGZpbmROZXN0ZWRFbGVtZW50cyxcbiAgcmVhZEF0dHJpYnV0ZSxcbiAgcmVtb3ZlQWxsQ2hpbGRyZW4sXG4gIHJlbW92ZUNoaWxkcmVuLFxuICByZW1vdmVDaGlsZHJlbkJ5TmFtZSxcbiAgc2V0VGV4dENvbnRlbnQsXG4gIFhtbEVsZW1lbnQsXG59IGZyb20gJy4uL3htbC11dGlscydcbmltcG9ydCB7IHJlYWRLaW5kIH0gZnJvbSAnLi9yZWFkLXBhcnRzJ1xuaW1wb3J0IHsgd3JpdGVHZW9tZXRyeSB9IGZyb20gJy4vdXRpbHMvZ2VvbWV0cnknXG5pbXBvcnQgeyBuYW1lUGFydHNUb0Z1bGwgfSBmcm9tICcuL3V0aWxzL2luZGl2aWR1YWwtbmFtZSdcblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKFxuICB0ZXh0OiBzdHJpbmdcbik6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIFhtbEVsZW1lbnQ+IHtcbiAgcmV0dXJuIHRhcChcbiAgICBwaXBlKGZpbmRDaGlsZE9yQ3JlYXRlKCdnY286Q2hhcmFjdGVyU3RyaW5nJyksIHNldFRleHRDb250ZW50KHRleHQpKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUxpbmthZ2UoXG4gIHVybDogVVJMXG4pOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBYbWxFbGVtZW50PiB7XG4gIHJldHVybiB0YXAoXG4gICAgcGlwZShcbiAgICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6bGlua2FnZScsICdnbWQ6VVJMJyksXG4gICAgICBzZXRUZXh0Q29udGVudCh1cmwudG9TdHJpbmcoKSlcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQW5jaG9yKFxuICB1cmw6IFVSTCxcbiAgdGV4dD86IHN0cmluZ1xuKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD4ge1xuICByZXR1cm4gdGFwKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRPckNyZWF0ZSgnZ214OkFuY2hvcicpLFxuICAgICAgYWRkQXR0cmlidXRlKCd4bGluazpocmVmJywgdXJsLnRvU3RyaW5nKCkpLFxuICAgICAgdGV4dCA/IHNldFRleHRDb250ZW50KHRleHQpIDogbm9vcFxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEYXRlVGltZShcbiAgZGF0ZTogRGF0ZVxuKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD4ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kQ2hpbGRPckNyZWF0ZSgnZ2NvOkRhdGVUaW1lJyksXG4gICAgc2V0VGV4dENvbnRlbnQoZm9ybWF0KGRhdGUsIFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzXCIpKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURhdGUoXG4gIGRhdGU6IERhdGVcbik6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIFhtbEVsZW1lbnQ+IHtcbiAgcmV0dXJuIHRhcChcbiAgICBwaXBlKFxuICAgICAgZmluZENoaWxkT3JDcmVhdGUoJ2djbzpEYXRlJyksXG4gICAgICBzZXRUZXh0Q29udGVudChmb3JtYXQoZGF0ZSwgJ3l5eXktTU0tZGQnKSlcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRGVjaW1hbChcbiAgZGVjaW1hbDogbnVtYmVyXG4pOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBYbWxFbGVtZW50PiB7XG4gIHJldHVybiB0YXAoXG4gICAgcGlwZShmaW5kQ2hpbGRPckNyZWF0ZSgnZ2NvOkRlY2ltYWwnKSwgc2V0VGV4dENvbnRlbnQoZGVjaW1hbC50b1N0cmluZygpKSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NDb2RlKHN0YXR1czogUmVjb3JkU3RhdHVzKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlICdjb21wbGV0ZWQnOlxuICAgICAgcmV0dXJuICdjb21wbGV0ZWQnXG4gICAgY2FzZSAnZGVwcmVjYXRlZCc6XG4gICAgICByZXR1cm4gJ2RlcHJlY2F0ZWQnXG4gICAgY2FzZSAnb25nb2luZyc6XG4gICAgICByZXR1cm4gJ29uR29pbmcnXG4gICAgY2FzZSAncmVtb3ZlZCc6XG4gICAgICByZXR1cm4gJ3JlbW92ZWQnXG4gICAgY2FzZSAndW5kZXJfZGV2ZWxvcG1lbnQnOlxuICAgICAgcmV0dXJuICd1bmRlckRldmVsb3BtZW50J1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIHByb2dyZXNzIGNvZGUgZnJvbSBzdGF0dXM6ICR7c3RhdHVzfWBcbiAgICAgIClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9sZUNvZGUocm9sZTogUm9sZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAocm9sZSkge1xuICAgIGNhc2UgJ2F1dGhvcic6XG4gICAgICByZXR1cm4gJ2F1dGhvcidcbiAgICBjYXNlICdjb2xsYWJvcmF0b3InOlxuICAgICAgcmV0dXJuICdjb2xsYWJvcmF0b3InXG4gICAgY2FzZSAnY29udHJpYnV0b3InOlxuICAgICAgcmV0dXJuICdjb250cmlidXRvcidcbiAgICBjYXNlICdjdXN0b2RpYW4nOlxuICAgICAgcmV0dXJuICdjdXN0b2RpYW4nXG4gICAgY2FzZSAnZGlzdHJpYnV0b3InOlxuICAgICAgcmV0dXJuICdkaXN0cmlidXRvcidcbiAgICBjYXNlICdlZGl0b3InOlxuICAgICAgcmV0dXJuICdlZGl0b3InXG4gICAgY2FzZSAnZnVuZGVyJzpcbiAgICAgIHJldHVybiAnZnVuZGVyJ1xuICAgIGNhc2UgJ21lZGlhdG9yJzpcbiAgICAgIHJldHVybiAnbWVkaWF0b3InXG4gICAgY2FzZSAnb3JpZ2luYXRvcic6XG4gICAgICByZXR1cm4gJ29yaWdpbmF0b3InXG4gICAgY2FzZSAnb3RoZXInOlxuICAgICAgcmV0dXJuICdvdGhlcidcbiAgICBjYXNlICdvd25lcic6XG4gICAgICByZXR1cm4gJ293bmVyJ1xuICAgIGNhc2UgJ3BvaW50X29mX2NvbnRhY3QnOlxuICAgICAgcmV0dXJuICdwb2ludE9mQ29udGFjdCdcbiAgICBjYXNlICdwcmluY2lwYWxfaW52ZXN0aWdhdG9yJzpcbiAgICAgIHJldHVybiAncHJpbmNpcGFsSW52ZXN0aWdhdG9yJ1xuICAgIGNhc2UgJ3Byb2Nlc3Nvcic6XG4gICAgICByZXR1cm4gJ3Byb2Nlc3NvcidcbiAgICBjYXNlICdwdWJsaXNoZXInOlxuICAgICAgcmV0dXJuICdwdWJsaXNoZXInXG4gICAgY2FzZSAncmVzb3VyY2VfcHJvdmlkZXInOlxuICAgICAgcmV0dXJuICdyZXNvdXJjZVByb3ZpZGVyJ1xuICAgIGNhc2UgJ3JpZ2h0c19ob2xkZXInOlxuICAgICAgcmV0dXJuICdyaWdodHNIb2xkZXInXG4gICAgY2FzZSAnc3BvbnNvcic6XG4gICAgICByZXR1cm4gJ3Nwb25zb3InXG4gICAgY2FzZSAnc3Rha2Vob2xkZXInOlxuICAgICAgcmV0dXJuICdzdGFrZWhvbGRlcidcbiAgICBjYXNlICd1bnNwZWNpZmllZCc6XG4gICAgICByZXR1cm4gJ3Vuc3BlY2lmaWVkJ1xuICAgIGNhc2UgJ3VzZXInOlxuICAgICAgcmV0dXJuICd1c2VyJ1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcm9sZSBjb2RlIGZyb20gcm9sZTogJHtyb2xlfWApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcnZpY2VEaXN0cmlidXRpb25Qcm90b2NvbChcbiAgZGlzdHJpYnV0aW9uOiBEYXRhc2V0U2VydmljZURpc3RyaWJ1dGlvblxuKTogc3RyaW5nIHtcbiAgc3dpdGNoIChkaXN0cmlidXRpb24uYWNjZXNzU2VydmljZVByb3RvY29sLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICd3ZnMnOlxuICAgICAgcmV0dXJuICdPR0M6V0ZTJ1xuICAgIGNhc2UgJ3dtcyc6XG4gICAgICByZXR1cm4gJ09HQzpXTVMnXG4gICAgY2FzZSAnd3BzJzpcbiAgICAgIHJldHVybiAnT0dDOldQUydcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRpc3RyaWJ1dGlvbi5hY2Nlc3NTZXJ2aWNlUHJvdG9jb2xcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpbnRlbmFuY2VGcmVxdWVuY3lDb2RlKFxuICB1cGRhdGVGcmVxdWVuY3k6IFVwZGF0ZUZyZXF1ZW5jeUNvZGVcbik6IHN0cmluZyB8IG51bGwge1xuICBzd2l0Y2ggKHVwZGF0ZUZyZXF1ZW5jeSkge1xuICAgIGNhc2UgJ2FzTmVlZGVkJzpcbiAgICAgIHJldHVybiAnYXNOZWVkZWQnXG4gICAgY2FzZSAndW5rbm93bic6XG4gICAgICByZXR1cm4gJ3Vua25vd24nXG4gICAgY2FzZSAnaXJyZWd1bGFyJzpcbiAgICAgIHJldHVybiAnaXJyZWd1bGFyJ1xuICAgIGNhc2UgJ25vdFBsYW5uZWQnOlxuICAgICAgcmV0dXJuICdub3RQbGFubmVkJ1xuICAgIGNhc2UgJ2NvbnRpbnVhbCc6XG4gICAgICByZXR1cm4gJ2NvbnRpbnVhbCdcbiAgICBjYXNlICdwZXJpb2RpYyc6XG4gICAgICByZXR1cm4gJ3BlcmlvZGljJ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJU09EdXJhdGlvbih1cGRhdGVGcmVxdWVuY3k6IFVwZGF0ZUZyZXF1ZW5jeUN1c3RvbSk6IHN0cmluZyB7XG4gIGNvbnN0IGR1cmF0aW9uID0ge1xuICAgIHllYXJzOiAwLFxuICAgIG1vbnRoczogMCxcbiAgICB3ZWVrczogMCxcbiAgICBkYXlzOiAwLFxuICAgIGhvdXJzOiAwLFxuICB9XG4gIHN3aXRjaCAodXBkYXRlRnJlcXVlbmN5LnBlcikge1xuICAgIGNhc2UgJ2RheSc6XG4gICAgICBpZiAodXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcyA8PSAxKSBkdXJhdGlvbi5kYXlzID0gMVxuICAgICAgZWxzZSBkdXJhdGlvbi5ob3VycyA9IE1hdGgucm91bmQoMjQgLyB1cGRhdGVGcmVxdWVuY3kudXBkYXRlZFRpbWVzKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICd3ZWVrJzpcbiAgICAgIGR1cmF0aW9uLmRheXMgPSBNYXRoLnJvdW5kKDcgLyB1cGRhdGVGcmVxdWVuY3kudXBkYXRlZFRpbWVzIC0gMC4wMDAxKSAvLyB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGF0ICcyIHRpbWVzIHBlciB3ZWVrJyA9ICdldmVyeSAzIGRheXMnXG4gICAgICBicmVha1xuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIGlmICh1cGRhdGVGcmVxdWVuY3kudXBkYXRlZFRpbWVzIDw9IDEpIGR1cmF0aW9uLm1vbnRocyA9IDFcbiAgICAgIGVsc2UgZHVyYXRpb24uZGF5cyA9IE1hdGgucm91bmQoMzAgLyB1cGRhdGVGcmVxdWVuY3kudXBkYXRlZFRpbWVzKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIGlmICh1cGRhdGVGcmVxdWVuY3kudXBkYXRlZFRpbWVzIDw9IDEpIGR1cmF0aW9uLnllYXJzID0gMVxuICAgICAgZWxzZSBkdXJhdGlvbi5tb250aHMgPSBNYXRoLnJvdW5kKDEyIC8gdXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcylcbiAgICAgIGJyZWFrXG4gIH1cbiAgY29uc3QgaG91cnMgPSBkdXJhdGlvbi5ob3VycyA+IDAgPyBgVCR7ZHVyYXRpb24uaG91cnN9SGAgOiAnJ1xuICByZXR1cm4gYFAke2R1cmF0aW9uLnllYXJzfVkke2R1cmF0aW9uLm1vbnRoc31NJHtkdXJhdGlvbi5kYXlzfUQke2hvdXJzfWBcbn1cblxuZnVuY3Rpb24gYXBwZW5kUmVzcG9uc2libGVQYXJ0eShjb250YWN0OiBJbmRpdmlkdWFsKSB7XG4gIGNvbnN0IGZ1bGxOYW1lID0gbmFtZVBhcnRzVG9GdWxsKGNvbnRhY3QuZmlyc3ROYW1lLCBjb250YWN0Lmxhc3ROYW1lKVxuXG4gIGNvbnN0IGNyZWF0ZUFkZHJlc3MgPSBwaXBlKFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDphZGRyZXNzJyksXG4gICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9BZGRyZXNzJyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICBwaXBlKFxuICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZWxlY3Ryb25pY01haWxBZGRyZXNzJyksXG4gICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnRhY3QuZW1haWwpXG4gICAgICApXG4gICAgKSxcbiAgICBjb250YWN0LmFkZHJlc3NcbiAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpkZWxpdmVyeVBvaW50JyksXG4gICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhjb250YWN0LmFkZHJlc3MpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICA6IG5vb3BcbiAgKVxuXG4gIGNvbnN0IGNyZWF0ZUNvbnRhY3QgPSBwaXBlKFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpjb250YWN0SW5mbycpLFxuICAgIGNyZWF0ZUNoaWxkKCdnbWQ6Q0lfQ29udGFjdCcpLFxuICAgIGNvbnRhY3QucGhvbmVcbiAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpwaG9uZScpLFxuICAgICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9UZWxlcGhvbmUnKSxcbiAgICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6dm9pY2UnKSxcbiAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnRhY3QucGhvbmUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICA6IG5vb3AsXG4gICAgYXBwZW5kQ2hpbGRyZW4oY3JlYXRlQWRkcmVzcyksXG4gICAgY29udGFjdC5vcmdhbml6YXRpb24/LndlYnNpdGVcbiAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpvbmxpbmVSZXNvdXJjZScpLFxuICAgICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9PbmxpbmVSZXNvdXJjZScpLFxuICAgICAgICAgICAgd3JpdGVMaW5rYWdlKGNvbnRhY3Qub3JnYW5pemF0aW9uLndlYnNpdGUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICA6IG5vb3BcbiAgKVxuXG4gIHJldHVybiBhcHBlbmRDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOkNJX1Jlc3BvbnNpYmxlUGFydHknKSxcbiAgICAgIGZ1bGxOYW1lXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6aW5kaXZpZHVhbE5hbWUnKSxcbiAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcoZnVsbE5hbWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBjb250YWN0LnBvc2l0aW9uXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6cG9zaXRpb25OYW1lJyksXG4gICAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnRhY3QucG9zaXRpb24pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG5cbiAgICAgIGNvbnRhY3Qub3JnYW5pemF0aW9uPy5uYW1lXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6b3JnYW5pc2F0aW9uTmFtZScpLFxuICAgICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhjb250YWN0Lm9yZ2FuaXphdGlvbi5uYW1lKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgOiBub29wLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIGNyZWF0ZUNvbnRhY3QsXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnJvbGUnKSxcbiAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOkNJX1JvbGVDb2RlJyksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI0NJX1JvbGVDb2RlJ1xuICAgICAgICAgICksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgZ2V0Um9sZUNvZGUoY29udGFjdC5yb2xlKSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlS2V5d29yZHMoKSB7XG4gIHJldHVybiByZW1vdmVDaGlsZHJlbihwaXBlKGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOmRlc2NyaXB0aXZlS2V5d29yZHMnKSkpXG59XG5cbi8vIHJldHVybnMgYSA8Z21kOnRoZXNhdXJ1c05hbWU+IGVsZW1lbnRcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUaGVzYXVydXModGhlc2F1cnVzOiBUaGVzYXVydXNNb2RlbCkge1xuICByZXR1cm4gcGlwZShcbiAgICBjcmVhdGVFbGVtZW50KCdnbWQ6dGhlc2F1cnVzTmFtZScpLFxuICAgIGNyZWF0ZUNoaWxkKCdnbWQ6Q0lfQ2l0YXRpb24nKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIHBpcGUoXG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDp0aXRsZScpLFxuICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyh0aGVzYXVydXMubmFtZSB8fCB0aGVzYXVydXMuaWQpXG4gICAgICApLFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmlkZW50aWZpZXInKSxcbiAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9JZGVudGlmaWVyJyksXG4gICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6Y29kZScpLFxuICAgICAgICAgICAgdGhlc2F1cnVzLnVybFxuICAgICAgICAgICAgICA/IHdyaXRlQW5jaG9yKHRoZXNhdXJ1cy51cmwsIHRoZXNhdXJ1cy5pZClcbiAgICAgICAgICAgICAgOiB3cml0ZUNoYXJhY3RlclN0cmluZyh0aGVzYXVydXMuaWQpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRLZXl3b3JkcyhrZXl3b3JkczogS2V5d29yZFtdKSB7XG4gIC8vIGtleXdvcmRzIGFyZSBncm91cGVkIGJ5IHRoZXNhdXJ1cyBpZiB0aGV5IGhhdmUgb25lLCBvdGhlcndpc2UgYnkgdHlwZVxuICBjb25zdCBrZXl3b3Jkc0J5VGhlc2F1cnVzOiBLZXl3b3JkW11bXSA9IGtleXdvcmRzLnJlZHVjZSgoYWNjLCBrZXl3b3JkKSA9PiB7XG4gICAgY29uc3QgdGhlc2F1cnVzSWQgPSBrZXl3b3JkLnRoZXNhdXJ1cz8uaWRcbiAgICBjb25zdCB0eXBlID0ga2V5d29yZC50eXBlXG4gICAgbGV0IGV4aXN0aW5nR3JvdXAgPSBhY2MuZmluZCgoZ3JvdXApID0+XG4gICAgICB0aGVzYXVydXNJZFxuICAgICAgICA/IGdyb3VwWzBdLnRoZXNhdXJ1cz8uaWQgPT09IHRoZXNhdXJ1c0lkXG4gICAgICAgIDogZ3JvdXBbMF0udHlwZSA9PT0gdHlwZSAmJiAhZ3JvdXBbMF0udGhlc2F1cnVzXG4gICAgKVxuICAgIGlmICghZXhpc3RpbmdHcm91cCkge1xuICAgICAgZXhpc3RpbmdHcm91cCA9IFtdXG4gICAgICBhY2MucHVzaChleGlzdGluZ0dyb3VwKVxuICAgIH1cbiAgICBleGlzdGluZ0dyb3VwLnB1c2goa2V5d29yZClcbiAgICByZXR1cm4gYWNjXG4gIH0sIFtdKVxuICByZXR1cm4gYXBwZW5kQ2hpbGRyZW4oXG4gICAgLi4ua2V5d29yZHNCeVRoZXNhdXJ1cy5tYXAoKGtleXdvcmRzKSA9PlxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmRlc2NyaXB0aXZlS2V5d29yZHMnKSxcbiAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9LZXl3b3JkcycpLFxuICAgICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnR5cGUnKSxcbiAgICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfS2V5d29yZFR5cGVDb2RlJyksXG4gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICdjb2RlTGlzdCcsXG4gICAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI01EX0tleXdvcmRUeXBlQ29kZSdcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCBrZXl3b3Jkc1swXS50eXBlKVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAga2V5d29yZHNbMF0udGhlc2F1cnVzXG4gICAgICAgICAgPyBhcHBlbmRDaGlsZHJlbihjcmVhdGVUaGVzYXVydXMoa2V5d29yZHNbMF0udGhlc2F1cnVzKSlcbiAgICAgICAgICA6IG5vb3AsXG4gICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgIC4uLmtleXdvcmRzLm1hcCgoa2V5d29yZCkgPT5cbiAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDprZXl3b3JkJyksXG4gICAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGtleXdvcmQubGFiZWwpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25zdHJhaW50KFxuICBjb25zdHJhaW50OiBDb25zdHJhaW50LFxuICB0eXBlOiAnbGVnYWwnIHwgJ3NlY3VyaXR5JyB8ICdvdGhlcidcbikge1xuICBpZiAodHlwZSA9PT0gJ3NlY3VyaXR5Jykge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnJlc291cmNlQ29uc3RyYWludHMnKSxcbiAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfU2VjdXJpdHlDb25zdHJhaW50cycpLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmNsYXNzaWZpY2F0aW9uJyksXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9DbGFzc2lmaWNhdGlvbkNvZGUnKSxcbiAgICAgICAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAnY29kZUxpc3QnLFxuICAgICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfQ2xhc3NpZmljYXRpb25Db2RlJ1xuICAgICAgICAgICksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgJ3Jlc3RyaWN0ZWQnKVxuICAgICAgICApLFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDp1c2VMaW1pdGF0aW9uJyksXG4gICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcoY29uc3RyYWludC50ZXh0KVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdsZWdhbCcpIHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpyZXNvdXJjZUNvbnN0cmFpbnRzJyksXG4gICAgICBjcmVhdGVDaGlsZCgnZ21kOk1EX0xlZ2FsQ29uc3RyYWludHMnKSxcbiAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDphY2Nlc3NDb25zdHJhaW50cycpLFxuICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfUmVzdHJpY3Rpb25Db2RlJyksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI01EX1Jlc3RyaWN0aW9uQ29kZSdcbiAgICAgICAgICApLFxuICAgICAgICAgIGFkZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsICdvdGhlclJlc3RyaWN0aW9ucycpXG4gICAgICAgICksXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOm90aGVyQ29uc3RyYWludHMnKSxcbiAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhjb25zdHJhaW50LnRleHQpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGlwZShcbiAgICBjcmVhdGVFbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfQ29uc3RyYWludHMnKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIHBpcGUoXG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDp1c2VMaW1pdGF0aW9uJyksXG4gICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnN0cmFpbnQudGV4dClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU90aGVyQ29uc3RyYWludHMoKSB7XG4gIHJldHVybiByZW1vdmVDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnJlc291cmNlQ29uc3RyYWludHMnKSxcbiAgICAgIGZpbHRlckFycmF5KFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOk1EX0NvbnN0cmFpbnRzJywgJ2dtZDp1c2VMaW1pdGF0aW9uJyksXG4gICAgICAgICAgKGFycmF5KSA9PiBhcnJheS5sZW5ndGggPiAwXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVNlY3VyaXR5Q29uc3RyYWludHMoKSB7XG4gIHJldHVybiByZW1vdmVDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnJlc291cmNlQ29uc3RyYWludHMnKSxcbiAgICAgIGZpbHRlckFycmF5KFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOk1EX1NlY3VyaXR5Q29uc3RyYWludHMnLCAnZ21kOnVzZUxpbWl0YXRpb24nKSxcbiAgICAgICAgICAoYXJyYXkpID0+IGFycmF5Lmxlbmd0aCA+IDBcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTGVnYWxDb25zdHJhaW50cygpIHtcbiAgcmV0dXJuIHJlbW92ZUNoaWxkcmVuKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgICAgZmlsdGVyQXJyYXkoXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgZmluZE5lc3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgJ2dtZDpNRF9MZWdhbENvbnN0cmFpbnRzJyxcbiAgICAgICAgICAgICdnbWQ6YWNjZXNzQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgJ2dtZDpNRF9SZXN0cmljdGlvbkNvZGUnXG4gICAgICAgICAgKSxcbiAgICAgICAgICBtYXBBcnJheShyZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJykpLFxuICAgICAgICAgIChyZXN0cmljdGlvbkNvZGVzKSA9PlxuICAgICAgICAgICAgcmVzdHJpY3Rpb25Db2Rlcy5ldmVyeSgoY29kZSkgPT4gY29kZSAhPT0gJ2xpY2Vuc2UnKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVMaWNlbnNlcygpIHtcbiAgcmV0dXJuIHJlbW92ZUNoaWxkcmVuKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgICAgZmlsdGVyQXJyYXkoXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgZmluZE5lc3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgJ2dtZDpNRF9MZWdhbENvbnN0cmFpbnRzJyxcbiAgICAgICAgICAgICdnbWQ6YWNjZXNzQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgJ2dtZDpNRF9SZXN0cmljdGlvbkNvZGUnXG4gICAgICAgICAgKSxcbiAgICAgICAgICBtYXBBcnJheShyZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJykpLFxuICAgICAgICAgIChyZXN0cmljdGlvbkNvZGVzKSA9PlxuICAgICAgICAgICAgcmVzdHJpY3Rpb25Db2Rlcy5zb21lKChjb2RlKSA9PiBjb2RlID09PSAnbGljZW5zZScpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpY2Vuc2UobGljZW5zZTogQ29uc3RyYWludCkge1xuICByZXR1cm4gcGlwZShcbiAgICBjcmVhdGVFbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfTGVnYWxDb25zdHJhaW50cycpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmFjY2Vzc0NvbnN0cmFpbnRzJyksXG4gICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfUmVzdHJpY3Rpb25Db2RlJyksXG4gICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAnY29kZUxpc3QnLFxuICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI01EX1Jlc3RyaWN0aW9uQ29kZSdcbiAgICAgICAgKSxcbiAgICAgICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgJ2xpY2Vuc2UnKVxuICAgICAgKSxcbiAgICAgIHBpcGUoXG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDphY2Nlc3NDb25zdHJhaW50cycpLFxuICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOk1EX1Jlc3RyaWN0aW9uQ29kZScpLFxuICAgICAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAnaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTEzOS9yZXNvdXJjZXMvZ214Q29kZWxpc3RzLnhtbCNNRF9SZXN0cmljdGlvbkNvZGUnXG4gICAgICAgICksXG4gICAgICAgIGFkZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsICdvdGhlclJlc3RyaWN0aW9ucycpXG4gICAgICApLFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOm90aGVyQ29uc3RyYWludHMnKSxcbiAgICAgICAgJ3VybCcgaW4gbGljZW5zZVxuICAgICAgICAgID8gd3JpdGVBbmNob3IobGljZW5zZS51cmwsIGxpY2Vuc2UudGV4dClcbiAgICAgICAgICA6IHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGxpY2Vuc2UudGV4dClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU9ubGluZVJlc291cmNlcygpIHtcbiAgcmV0dXJuIHBpcGUocmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDpkaXN0cmlidXRpb25JbmZvJykpXG59XG5cbmZ1bmN0aW9uIGFwcGVuZE9ubGluZVJlc291cmNlRm9ybWF0KG1pbWVUeXBlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGFwcGVuZENoaWxkcmVuKFxuICAgIHBpcGUoXG4gICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZGlzdHJpYnV0aW9uRm9ybWF0JyksXG4gICAgICBjcmVhdGVDaGlsZCgnZ21kOk1EX0Zvcm1hdCcpLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOm5hbWUnKSwgd3JpdGVDaGFyYWN0ZXJTdHJpbmcobWltZVR5cGUpKSxcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6dmVyc2lvbicpLFxuICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKCcxLjAnKSAvLyBoYXJkY29kaW5nIHRoaXMgYXMgaXQgbW9zdCBsaWtlbHkgd29uJ3QgYmUgdXNlZCBidXQgaXMgbWFuZGF0b3J5XG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpc3RyaWJ1dGlvbkluZm8oKSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpkaXN0cmlidXRpb25JbmZvJyksXG4gICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9EaXN0cmlidXRpb24nKVxuICApXG59XG5cbi8vIGFwcGx5IHRvIE1EX0Rpc3RyaWJ1dGlvblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZE9ubGluZVJlc291cmNlKFxuICBvbmxpbmVSZXNvdXJjZTogRGF0YXNldE9ubGluZVJlc291cmNlLFxuICBhcHBlbmRGb3JtYXRGbjogKFxuICAgIG1pbWVUeXBlOiBzdHJpbmdcbiAgKSA9PiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBYbWxFbGVtZW50PlxuKSB7XG4gIGxldCBuYW1lOiBzdHJpbmdcbiAgbGV0IGZ1bmN0aW9uQ29kZTogc3RyaW5nXG4gIGxldCBwcm90b2NvbDogc3RyaW5nXG4gIGlmIChvbmxpbmVSZXNvdXJjZS50eXBlID09PSAnc2VydmljZScpIHtcbiAgICBuYW1lID0gb25saW5lUmVzb3VyY2UuaWRlbnRpZmllckluU2VydmljZSAvLyB0aGlzIGlzIGZvciBHZW9OZXR3b3JrIHRvIGtub3cgdGhlIGxheWVyIG5hbWVcbiAgICBmdW5jdGlvbkNvZGUgPSAnZG93bmxvYWQnXG4gICAgcHJvdG9jb2wgPSBnZXRTZXJ2aWNlRGlzdHJpYnV0aW9uUHJvdG9jb2wob25saW5lUmVzb3VyY2UpXG4gIH0gZWxzZSBpZiAob25saW5lUmVzb3VyY2UudHlwZSA9PT0gJ2Rvd25sb2FkJykge1xuICAgIG5hbWUgPSBvbmxpbmVSZXNvdXJjZS5uYW1lXG4gICAgZnVuY3Rpb25Db2RlID0gJ2Rvd25sb2FkJ1xuICAgIHByb3RvY29sID0gJ1dXVzpET1dOTE9BRCdcbiAgfSBlbHNlIHtcbiAgICBuYW1lID0gb25saW5lUmVzb3VyY2UubmFtZVxuICAgIGZ1bmN0aW9uQ29kZSA9ICdpbmZvcm1hdGlvbidcbiAgICBwcm90b2NvbCA9ICdXV1c6TElOSydcbiAgfVxuICBjb25zdCBhcHBlbmRUcmFuc2Zlck9wdGlvbnMgPSBhcHBlbmRDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnRyYW5zZmVyT3B0aW9ucycpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9EaWdpdGFsVHJhbnNmZXJPcHRpb25zJyksXG4gICAgICBjcmVhdGVDaGlsZCgnZ21kOm9uTGluZScpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9PbmxpbmVSZXNvdXJjZScpLFxuICAgICAgd3JpdGVMaW5rYWdlKG9ubGluZVJlc291cmNlLnVybCksXG4gICAgICAnZGVzY3JpcHRpb24nIGluIG9ubGluZVJlc291cmNlXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZGVzY3JpcHRpb24nKSxcbiAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcob25saW5lUmVzb3VyY2UuZGVzY3JpcHRpb24pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBuYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOm5hbWUnKSwgd3JpdGVDaGFyYWN0ZXJTdHJpbmcobmFtZSkpXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgcGlwZShjcmVhdGVFbGVtZW50KCdnbWQ6cHJvdG9jb2wnKSwgd3JpdGVDaGFyYWN0ZXJTdHJpbmcocHJvdG9jb2wpKSxcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZnVuY3Rpb24nKSxcbiAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOkNJX09uTGluZUZ1bmN0aW9uQ29kZScpLFxuICAgICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdjb2RlTGlzdCcsXG4gICAgICAgICAgICAnaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTEzOS9yZXNvdXJjZXMvZ214Q29kZWxpc3RzLnhtbCNDSV9PbkxpbmVGdW5jdGlvbkNvZGUnXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhZGRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCBmdW5jdGlvbkNvZGUpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgJ21pbWVUeXBlJyBpbiBvbmxpbmVSZXNvdXJjZVxuICAgICAgPyBhcHBlbmRGb3JtYXRGbihvbmxpbmVSZXNvdXJjZS5taW1lVHlwZSlcbiAgICAgIDogbm9vcCxcbiAgICBhcHBlbmRUcmFuc2Zlck9wdGlvbnNcbiAgKVxufVxuXG4vKipcbiAqIExvb2tzIGZvciBzcnY6U1ZfU2VydmljZUlkZW50aWZpY2F0aW9uIG9yIGdtZDpNRF9EYXRhSWRlbnRpZmljYXRpb24gZWxlbWVudFxuICogZGVwZW5kaW5nIG9uIHJlY29yZCB0eXBlLCBjcmVhdGUgaWYgbWlzc2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSB7XG4gIHJldHVybiAocm9vdEVsOiBYbWxFbGVtZW50KSA9PiB7XG4gICAgY29uc3Qga2luZCA9IHJlYWRLaW5kKHJvb3RFbClcbiAgICBsZXQgZWx0TmFtZSA9ICdnbWQ6TURfRGF0YUlkZW50aWZpY2F0aW9uJ1xuICAgIGlmIChraW5kID09PSAnc2VydmljZScpIGVsdE5hbWUgPSAnc3J2OlNWX1NlcnZpY2VJZGVudGlmaWNhdGlvbidcbiAgICByZXR1cm4gZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDppZGVudGlmaWNhdGlvbkluZm8nLCBlbHROYW1lKShyb290RWwpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPckNyZWF0ZURpc3RyaWJ1dGlvbigpIHtcbiAgcmV0dXJuIChyb290RWw6IFhtbEVsZW1lbnQpID0+IHtcbiAgICByZXR1cm4gZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoXG4gICAgICAnZ21kOmRpc3RyaWJ1dGlvbkluZm8nLFxuICAgICAgJ2dtZDpNRF9EaXN0cmlidXRpb24nXG4gICAgKShyb290RWwpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlVW5pcXVlSWRlbnRpZmllcihcbiAgcmVjb3JkOiBDYXRhbG9nUmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBwaXBlKFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6ZmlsZUlkZW50aWZpZXInKSxcbiAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhyZWNvcmQudW5pcXVlSWRlbnRpZmllcilcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUtpbmQocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZSgnZ21kOmhpZXJhcmNoeUxldmVsJywgJ2dtZDpNRF9TY29wZUNvZGUnKSxcbiAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAnY29kZUxpc3QnLFxuICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfU2NvcGVDb2RlJ1xuICAgICksXG4gICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgcmVjb3JkLmtpbmQpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVUaXRsZShyZWNvcmQ6IENhdGFsb2dSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpjaXRhdGlvbicsICdnbWQ6Q0lfQ2l0YXRpb24nLCAnZ21kOnRpdGxlJyksXG4gICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcocmVjb3JkLnRpdGxlKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQWJzdHJhY3QocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6YWJzdHJhY3QnKSxcbiAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhyZWNvcmQuYWJzdHJhY3QpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVTdGF0dXMocmVjb3JkOiBEYXRhc2V0UmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6c3RhdHVzJywgJ2dtZDpNRF9Qcm9ncmVzc0NvZGUnKSxcbiAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAnY29kZUxpc3QnLFxuICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfUHJvZ3Jlc3NDb2RlJ1xuICAgICksXG4gICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgZ2V0UHJvZ3Jlc3NDb2RlKHJlY29yZC5zdGF0dXMpKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ29udGFjdHMocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOmNvbnRhY3QnKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5jb250YWN0cy5tYXAoKGNvbnRhY3QpID0+XG4gICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOmNvbnRhY3QnKSwgYXBwZW5kUmVzcG9uc2libGVQYXJ0eShjb250YWN0KSlcbiAgICAgIClcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb250YWN0c0ZvclJlc291cmNlKFxuICByZWNvcmQ6IENhdGFsb2dSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOnBvaW50T2ZDb250YWN0JyksXG4gICAgcmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDpjb250YWN0JyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQuY29udGFjdHNGb3JSZXNvdXJjZS5tYXAoKGNvbnRhY3QpID0+XG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnBvaW50T2ZDb250YWN0JyksXG4gICAgICAgICAgYXBwZW5kUmVzcG9uc2libGVQYXJ0eShjb250YWN0KVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlS2V5d29yZHMocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIHJlbW92ZUtleXdvcmRzKCksXG4gICAgYXBwZW5kS2V5d29yZHMocmVjb3JkLmtleXdvcmRzKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlVG9waWNzKHJlY29yZDogQ2F0YWxvZ1JlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOnRvcGljQ2F0ZWdvcnknKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC50b3BpY3MubWFwKCh0b3BpYykgPT5cbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6dG9waWNDYXRlZ29yeScpLFxuICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfVG9waWNDYXRlZ29yeUNvZGUnKSxcbiAgICAgICAgICBzZXRUZXh0Q29udGVudCh0b3BpYylcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUxpY2Vuc2VzKHJlY29yZDogQ2F0YWxvZ1JlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVMaWNlbnNlcygpLFxuICAgIGFwcGVuZENoaWxkcmVuKC4uLnJlY29yZC5saWNlbnNlcy5tYXAoY3JlYXRlTGljZW5zZSkpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVMZWdhbENvbnN0cmFpbnRzKFxuICByZWNvcmQ6IENhdGFsb2dSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVMZWdhbENvbnN0cmFpbnRzKCksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQubGVnYWxDb25zdHJhaW50cy5tYXAoKGMpID0+IGNyZWF0ZUNvbnN0cmFpbnQoYywgJ2xlZ2FsJykpXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlU2VjdXJpdHlDb25zdHJhaW50cyhcbiAgcmVjb3JkOiBDYXRhbG9nUmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgcmVtb3ZlU2VjdXJpdHlDb25zdHJhaW50cygpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgLi4ucmVjb3JkLnNlY3VyaXR5Q29uc3RyYWludHMubWFwKChjKSA9PiBjcmVhdGVDb25zdHJhaW50KGMsICdzZWN1cml0eScpKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZU90aGVyQ29uc3RyYWludHMoXG4gIHJlY29yZDogQ2F0YWxvZ1JlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIHJlbW92ZU90aGVyQ29uc3RyYWludHMoKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5vdGhlckNvbnN0cmFpbnRzLm1hcCgoYykgPT4gY3JlYXRlQ29uc3RyYWludChjLCAnb3RoZXInKSlcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVVcGRhdGVGcmVxdWVuY3koXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6cmVzb3VyY2VNYWludGVuYW5jZScpLFxuICAgIHJlbW92ZUFsbENoaWxkcmVuKCksXG4gICAgZmluZENoaWxkT3JDcmVhdGUoJ2dtZDpNRF9NYWludGVuYW5jZUluZm9ybWF0aW9uJyksXG4gICAgdHlwZW9mIHJlY29yZC51cGRhdGVGcmVxdWVuY3kgPT09ICdvYmplY3QnXG4gICAgICA/IHBpcGUoXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDp1c2VyRGVmaW5lZE1haW50ZW5hbmNlRnJlcXVlbmN5JyksXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2d0czpUTV9QZXJpb2REdXJhdGlvbicpLFxuICAgICAgICAgIHNldFRleHRDb250ZW50KGdldElTT0R1cmF0aW9uKHJlY29yZC51cGRhdGVGcmVxdWVuY3kpKVxuICAgICAgICApXG4gICAgICA6IHBpcGUoXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDptYWludGVuYW5jZUFuZFVwZGF0ZUZyZXF1ZW5jeScpLFxuICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfTWFpbnRlbmFuY2VGcmVxdWVuY3lDb2RlJyksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI01EX01haW50ZW5hbmNlRnJlcXVlbmN5Q29kZSdcbiAgICAgICAgICApLFxuICAgICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdjb2RlTGlzdFZhbHVlJyxcbiAgICAgICAgICAgIGdldE1haW50ZW5hbmNlRnJlcXVlbmN5Q29kZShyZWNvcmQudXBkYXRlRnJlcXVlbmN5KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUmVjb3JkVXBkYXRlZChyZWNvcmQ6IENhdGFsb2dSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICBwaXBlKFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6ZGF0ZVN0YW1wJyksXG4gICAgcmVtb3ZlQWxsQ2hpbGRyZW4oKSxcbiAgICB3cml0ZURhdGVUaW1lKHJlY29yZC5yZWNvcmRVcGRhdGVkKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVJlc291cmNlRGF0ZShcbiAgdHlwZTogJ3JldmlzaW9uJyB8ICdjcmVhdGlvbicgfCAncHVibGljYXRpb24nXG4pIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZSgnZ21kOmNpdGF0aW9uJywgJ2dtZDpDSV9DaXRhdGlvbicpLFxuICAgIHJlbW92ZUNoaWxkcmVuKFxuICAgICAgcGlwZShcbiAgICAgICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6ZGF0ZScpLFxuICAgICAgICBmaWx0ZXJBcnJheShcbiAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgZmluZE5lc3RlZEVsZW1lbnQoXG4gICAgICAgICAgICAgICdnbWQ6Q0lfRGF0ZScsXG4gICAgICAgICAgICAgICdnbWQ6ZGF0ZVR5cGUnLFxuICAgICAgICAgICAgICAnZ21kOkNJX0RhdGVUeXBlQ29kZSdcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICByZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJyksXG4gICAgICAgICAgICBtYXAoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gdHlwZSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFJlc291cmNlRGF0ZShcbiAgZGF0ZTogRGF0ZSxcbiAgdHlwZTogJ3JldmlzaW9uJyB8ICdjcmVhdGlvbicgfCAncHVibGljYXRpb24nXG4pIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZSgnZ21kOmNpdGF0aW9uJywgJ2dtZDpDSV9DaXRhdGlvbicpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmRhdGUnKSxcbiAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9EYXRlJyksXG4gICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOmRhdGUnKSwgd3JpdGVEYXRlVGltZShkYXRlKSksXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpkYXRlVHlwZScpLFxuICAgICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9EYXRlVHlwZUNvZGUnKSxcbiAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjQ0lfRGF0ZVR5cGVDb2RlJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsIHR5cGUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVJlc291cmNlQ3JlYXRlZChcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICByZW1vdmVSZXNvdXJjZURhdGUoJ2NyZWF0aW9uJykocm9vdEVsKVxuICBpZiAoIXJlY29yZC5yZXNvdXJjZUNyZWF0ZWQpIHJldHVyblxuICBhcHBlbmRSZXNvdXJjZURhdGUocmVjb3JkLnJlc291cmNlQ3JlYXRlZCwgJ2NyZWF0aW9uJykocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVSZXNvdXJjZVVwZGF0ZWQoXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcmVtb3ZlUmVzb3VyY2VEYXRlKCdyZXZpc2lvbicpKHJvb3RFbClcbiAgaWYgKCFyZWNvcmQucmVzb3VyY2VVcGRhdGVkKSByZXR1cm5cbiAgYXBwZW5kUmVzb3VyY2VEYXRlKHJlY29yZC5yZXNvdXJjZVVwZGF0ZWQsICdyZXZpc2lvbicpKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUmVzb3VyY2VQdWJsaXNoZWQoXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcmVtb3ZlUmVzb3VyY2VEYXRlKCdwdWJsaWNhdGlvbicpKHJvb3RFbClcbiAgaWYgKCFyZWNvcmQucmVzb3VyY2VQdWJsaXNoZWQpIHJldHVyblxuICBhcHBlbmRSZXNvdXJjZURhdGUocmVjb3JkLnJlc291cmNlUHVibGlzaGVkLCAncHVibGljYXRpb24nKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVNwYXRpYWxSZXByZXNlbnRhdGlvbihcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoXG4gICAgICAnZ21kOnNwYXRpYWxSZXByZXNlbnRhdGlvblR5cGUnLFxuICAgICAgJ2dtZDpNRF9TcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlQ29kZSdcbiAgICApLFxuICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICdjb2RlTGlzdCcsXG4gICAgICAnaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTEzOS9yZXNvdXJjZXMvZ214Q29kZWxpc3RzLnhtbCNNRF9TcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlQ29kZSdcbiAgICApLFxuICAgIGFkZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsIHJlY29yZC5zcGF0aWFsUmVwcmVzZW50YXRpb24pXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVHcmFwaGljT3ZlcnZpZXdzKFxuICByZWNvcmQ6IERhdGFzZXRSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOmdyYXBoaWNPdmVydmlldycpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgLi4ucmVjb3JkLm92ZXJ2aWV3cy5tYXAoKG92ZXJ2aWV3KSA9PlxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpncmFwaGljT3ZlcnZpZXcnKSxcbiAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOk1EX0Jyb3dzZUdyYXBoaWMnKSxcbiAgICAgICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpmaWxlTmFtZScpLFxuICAgICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhvdmVydmlldy51cmwudG9TdHJpbmcoKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgICdkZXNjcmlwdGlvbicgaW4gb3ZlcnZpZXdcbiAgICAgICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpmaWxlRGVzY3JpcHRpb24nKSxcbiAgICAgICAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKG92ZXJ2aWV3LmRlc2NyaXB0aW9uKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBub29wXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVMaW5lYWdlKHJlY29yZDogRGF0YXNldFJlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHBpcGUoXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoXG4gICAgICAnZ21kOmRhdGFRdWFsaXR5SW5mbycsXG4gICAgICAnZ21kOkRRX0RhdGFRdWFsaXR5JyxcbiAgICAgICdnbWQ6bGluZWFnZScsXG4gICAgICAnZ21kOkxJX0xpbmVhZ2UnLFxuICAgICAgJ2dtZDpzdGF0ZW1lbnQnXG4gICAgKSxcbiAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhyZWNvcmQubGluZWFnZSlcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlRW5kcG9pbnRQcm90b2NvbChlbmRwb2ludDogU2VydmljZUVuZHBvaW50KTogc3RyaW5nIHtcbiAgc3dpdGNoIChlbmRwb2ludC5wcm90b2NvbC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnd2ZzJzpcbiAgICAgIHJldHVybiAnT0dDOldGUydcbiAgICBjYXNlICd3bXMnOlxuICAgICAgcmV0dXJuICdPR0M6V01TJ1xuICAgIGNhc2UgJ3dwcyc6XG4gICAgICByZXR1cm4gJ09HQzpXUFMnXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBlbmRwb2ludC5wcm90b2NvbFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPbmxpbmVSZXNvdXJjZShvbmxpbmVSZXNvdXJjZTogU2VydmljZU9ubGluZVJlc291cmNlKSB7XG4gIGxldCBsaW5rYWdlVXJsLCBmdW5jdGlvbkNvZGUsIHByb3RvY29sXG4gIGlmIChvbmxpbmVSZXNvdXJjZS50eXBlID09PSAnZW5kcG9pbnQnKSB7XG4gICAgbGlua2FnZVVybCA9IG9ubGluZVJlc291cmNlLmVuZHBvaW50VXJsLnRvU3RyaW5nKClcbiAgICBwcm90b2NvbCA9IGdldFNlcnZpY2VFbmRwb2ludFByb3RvY29sKG9ubGluZVJlc291cmNlKVxuICAgIGZ1bmN0aW9uQ29kZSA9ICdkb3dubG9hZCdcbiAgfSBlbHNlIHtcbiAgICBsaW5rYWdlVXJsID0gb25saW5lUmVzb3VyY2UudXJsLnRvU3RyaW5nKClcbiAgICBmdW5jdGlvbkNvZGUgPSAnaW5mb3JtYXRpb24nXG4gICAgcHJvdG9jb2wgPSAnV1dXOkxJTksnXG4gIH1cbiAgY29uc3QgYXBwZW5kVHJhbnNmZXJPcHRpb25zID0gYXBwZW5kQ2hpbGRyZW4oXG4gICAgcGlwZShcbiAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDp0cmFuc2Zlck9wdGlvbnMnKSxcbiAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfRGlnaXRhbFRyYW5zZmVyT3B0aW9ucycpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpvbkxpbmUnKSxcbiAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6Q0lfT25saW5lUmVzb3VyY2UnKSxcbiAgICAgIHdyaXRlTGlua2FnZShsaW5rYWdlVXJsKSxcbiAgICAgICdkZXNjcmlwdGlvbicgaW4gb25saW5lUmVzb3VyY2VcbiAgICAgICAgPyBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpkZXNjcmlwdGlvbicpLFxuICAgICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhvbmxpbmVSZXNvdXJjZS5kZXNjcmlwdGlvbilcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIDogbm9vcCxcbiAgICAgICduYW1lJyBpbiBvbmxpbmVSZXNvdXJjZVxuICAgICAgICA/IGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOm5hbWUnKSxcbiAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcob25saW5lUmVzb3VyY2UubmFtZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIDogbm9vcCxcbiAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICBwaXBlKGNyZWF0ZUVsZW1lbnQoJ2dtZDpwcm90b2NvbCcpLCB3cml0ZUNoYXJhY3RlclN0cmluZyhwcm90b2NvbCkpLFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpmdW5jdGlvbicpLFxuICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6Q0lfT25MaW5lRnVuY3Rpb25Db2RlJyksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI0NJX09uTGluZUZ1bmN0aW9uQ29kZSdcbiAgICAgICAgICApLFxuICAgICAgICAgIGFkZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsIGZ1bmN0aW9uQ29kZSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKVxuICByZXR1cm4gcGlwZShcbiAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZGlzdHJpYnV0aW9uSW5mbycpLFxuICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfRGlzdHJpYnV0aW9uJyksXG4gICAgYXBwZW5kVHJhbnNmZXJPcHRpb25zXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZERhdGFzZXRPbmxpbmVSZXNvdXJjZXMoXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgLi4ucmVjb3JkLm9ubGluZVJlc291cmNlcy5tYXAoKGQpID0+XG4gICAgICBwaXBlKFxuICAgICAgICBjcmVhdGVEaXN0cmlidXRpb25JbmZvKCksXG4gICAgICAgIGFwcGVuZE9ubGluZVJlc291cmNlKGQsIGFwcGVuZE9ubGluZVJlc291cmNlRm9ybWF0KVxuICAgICAgKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRTZXJ2aWNlT25saW5lUmVzb3VyY2VzKFxuICByZWNvcmQ6IFNlcnZpY2VSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIGFwcGVuZENoaWxkcmVuKC4uLnJlY29yZC5vbmxpbmVSZXNvdXJjZXMubWFwKGNyZWF0ZU9ubGluZVJlc291cmNlKSkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVPbmxpbmVSZXNvdXJjZXMoXG4gIHJlY29yZDogQ2F0YWxvZ1JlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcmVtb3ZlT25saW5lUmVzb3VyY2VzKCkocm9vdEVsKVxuXG4gIGlmIChyZWNvcmQua2luZCA9PT0gJ2RhdGFzZXQnKSB7XG4gICAgYXBwZW5kRGF0YXNldE9ubGluZVJlc291cmNlcyhyZWNvcmQsIHJvb3RFbClcbiAgICByZXR1cm5cbiAgfVxuICBhcHBlbmRTZXJ2aWNlT25saW5lUmVzb3VyY2VzKHJlY29yZCwgcm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVUZW1wb3JhbEV4dGVudHMoXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6ZXh0ZW50JywgJ2dtZDpFWF9FeHRlbnQnKSxcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOnRlbXBvcmFsRWxlbWVudCcpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgLi4ucmVjb3JkLnRlbXBvcmFsRXh0ZW50cy5tYXAoKGV4dGVudCkgPT5cbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6dGVtcG9yYWxFbGVtZW50JyksXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpFWF9UZW1wb3JhbEV4dGVudCcpLFxuICAgICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgICAgJ3N0YXJ0JyBpbiBleHRlbnQgJiYgJ2VuZCcgaW4gZXh0ZW50XG4gICAgICAgICAgICAgID8gcGlwZShcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpleHRlbnQnKSxcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWw6VGltZVBlcmlvZCcpLFxuICAgICAgICAgICAgICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21sOmJlZ2luUG9zaXRpb24nKSxcbiAgICAgICAgICAgICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50LnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gc2V0VGV4dENvbnRlbnQoZm9ybWF0KGV4dGVudC5zdGFydCwgJ3l5eXktTU0tZGQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhZGRBdHRyaWJ1dGUoJ2luZGV0ZXJtaW5hdGVQb3NpdGlvbicsICd1bmtub3duJylcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21sOmVuZFBvc2l0aW9uJyksXG4gICAgICAgICAgICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVudC5lbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZXRUZXh0Q29udGVudChmb3JtYXQoZXh0ZW50LmVuZCwgJ3l5eXktTU0tZGQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhZGRBdHRyaWJ1dGUoJ2luZGV0ZXJtaW5hdGVQb3NpdGlvbicsICd1bmtub3duJylcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogcGlwZShcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpleHRlbnQnKSxcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWw6VGltZUluc3RhbnQnKSxcbiAgICAgICAgICAgICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtbDp0aW1lUG9zaXRpb24nKSxcbiAgICAgICAgICAgICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50LnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gc2V0VGV4dENvbnRlbnQoZm9ybWF0KGV4dGVudC5zdGFydCwgJ3l5eXktTU0tZGQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhZGRBdHRyaWJ1dGUoJ2luZGV0ZXJtaW5hdGVQb3NpdGlvbicsICd1bmtub3duJylcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlU3BhdGlhbEV4dGVudHMocmVjb3JkOiBEYXRhc2V0UmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgY29uc3QgYXBwZW5kQm91bmRpbmdQb2x5Z29uID0gKGdlb21ldHJ5PzogR2VvbWV0cnkpID0+IHtcbiAgICBpZiAoIWdlb21ldHJ5KSByZXR1cm4gbnVsbFxuICAgIHJldHVybiBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOkVYX0JvdW5kaW5nUG9seWdvbicpLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnBvbHlnb24nKSxcbiAgICAgICAgICBhcHBlbmRDaGlsZHJlbigoKSA9PiB3cml0ZUdlb21ldHJ5KGdlb21ldHJ5KSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGFwcGVuZEdlb2dyYXBoaWNCb3VuZGluZ0JveCA9IChcbiAgICBiYm94PzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl1cbiAgKSA9PiB7XG4gICAgaWYgKCFiYm94KSByZXR1cm4gbnVsbFxuICAgIHJldHVybiBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOkVYX0dlb2dyYXBoaWNCb3VuZGluZ0JveCcpLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOndlc3RCb3VuZExvbmdpdHVkZScpLCB3cml0ZURlY2ltYWwoYmJveFswXSkpLFxuICAgICAgICBwaXBlKGNyZWF0ZUVsZW1lbnQoJ2dtZDplYXN0Qm91bmRMb25naXR1ZGUnKSwgd3JpdGVEZWNpbWFsKGJib3hbMl0pKSxcbiAgICAgICAgcGlwZShjcmVhdGVFbGVtZW50KCdnbWQ6c291dGhCb3VuZExhdGl0dWRlJyksIHdyaXRlRGVjaW1hbChiYm94WzFdKSksXG4gICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOm5vcnRoQm91bmRMYXRpdHVkZScpLCB3cml0ZURlY2ltYWwoYmJveFszXSkpXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgY29uc3QgYXBwZW5kR2VvZ3JhcGhpY0Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFkZXNjcmlwdGlvbikgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpFWF9HZW9ncmFwaGljRGVzY3JpcHRpb24nKSxcbiAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6Z2VvZ3JhcGhpY0lkZW50aWZpZXInKSxcbiAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfSWRlbnRpZmllcicpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpjb2RlJyksXG4gICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhkZXNjcmlwdGlvbilcbiAgICApXG4gIH1cblxuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpleHRlbnQnLCAnZ21kOkVYX0V4dGVudCcpLFxuICAgIHJlbW92ZUNoaWxkcmVuQnlOYW1lKCdnbWQ6Z2VvZ3JhcGhpY0VsZW1lbnQnKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5zcGF0aWFsRXh0ZW50cy5tYXAoKGV4dGVudCkgPT5cbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6Z2VvZ3JhcGhpY0VsZW1lbnQnKSxcbiAgICAgICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIGFwcGVuZEJvdW5kaW5nUG9seWdvbihleHRlbnQuZ2VvbWV0cnkpLFxuICAgICAgICAgICAgYXBwZW5kR2VvZ3JhcGhpY0JvdW5kaW5nQm94KGV4dGVudC5iYm94KSxcbiAgICAgICAgICAgIGFwcGVuZEdlb2dyYXBoaWNEZXNjcmlwdGlvbihleHRlbnQuZGVzY3JpcHRpb24pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApKHJvb3RFbClcbn1cbiJdfQ==
|
|
489
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUtcGFydHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FwaS9tZXRhZGF0YS1jb252ZXJ0ZXIvc3JjL2xpYi9pc28xOTEzOS93cml0ZS1wYXJ0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFxQkEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBRXhDLE9BQU8sRUFFTCxXQUFXLEVBQ1gsR0FBRyxFQUNILFFBQVEsRUFDUixJQUFJLEVBQ0osSUFBSSxFQUNKLEdBQUcsR0FDSixNQUFNLG1CQUFtQixDQUFBO0FBQzFCLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLFdBQVcsRUFDWCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsY0FBYyxHQUVmLE1BQU0sY0FBYyxDQUFBO0FBQ3JCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQTtBQUM1RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUU5RCxTQUFTLHFCQUFxQixDQUM1QixPQUFrRCxFQUNsRCxJQUFZLEVBQ1osWUFBOEIsRUFDOUIsZUFBNkI7SUFFN0IsSUFBSSxDQUFDLFlBQVk7UUFBRSxPQUFPLE9BQU8sQ0FBQTtJQUNqQyxTQUFTLGVBQWUsQ0FBQyxJQUFrQixFQUFFLFdBQW1CO1FBQzlELE9BQU8sSUFBSSxDQUNULG1CQUFtQixDQUFDLGVBQWUsRUFBRSw4QkFBOEIsQ0FBQyxFQUNwRSxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFDbEQsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUM1QixDQUFBO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUNULE9BQU8sRUFDUCxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxFQUN2QyxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFDOUIsY0FBYyxDQUNaLGVBQWUsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLEVBQ3RDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQzFELGVBQWUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQ25DLENBQ0YsQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsSUFBWTtJQUVaLE9BQU8sR0FBRyxDQUNSLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNyRSxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSw2QkFBNkIsQ0FDM0MsSUFBWSxFQUNaLFlBQThCLEVBQzlCLGVBQTZCO0lBRTdCLE9BQU8scUJBQXFCLENBQzFCLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUMxQixJQUFJLEVBQ0osWUFBWSxFQUNaLGVBQWUsQ0FDaEIsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUMxQixHQUFRO0lBRVIsT0FBTyxHQUFHLENBQ1IsSUFBSSxDQUNGLHVCQUF1QixDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsRUFDakQsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUMvQixDQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FDekIsR0FBUSxFQUNSLElBQWE7SUFFYixPQUFPLEdBQUcsQ0FDUixJQUFJLENBQ0YsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEVBQy9CLGNBQWMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzVDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ25DLENBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEdBQVEsRUFDUixJQUFZLEVBQ1osWUFBOEIsRUFDOUIsZUFBNkI7SUFFN0IsT0FBTyxxQkFBcUIsQ0FDMUIsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFDdEIsSUFBSSxFQUNKLFlBQVksRUFDWixlQUFlLENBQ2hCLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsSUFBVTtJQUVWLE9BQU8sSUFBSSxDQUNULGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxFQUNqQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQ3RELENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsSUFBVTtJQUVWLE9BQU8sR0FBRyxDQUNSLElBQUksQ0FDRixpQkFBaUIsQ0FBQyxVQUFVLENBQUMsRUFDN0IsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FDM0MsQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQzFCLE9BQWU7SUFFZixPQUFPLEdBQUcsQ0FDUixJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQzNFLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFvQjtJQUNsRCxRQUFRLE1BQU0sRUFBRSxDQUFDO1FBQ2YsS0FBSyxXQUFXO1lBQ2QsT0FBTyxXQUFXLENBQUE7UUFDcEIsS0FBSyxZQUFZO1lBQ2YsT0FBTyxZQUFZLENBQUE7UUFDckIsS0FBSyxTQUFTO1lBQ1osT0FBTyxTQUFTLENBQUE7UUFDbEIsS0FBSyxTQUFTO1lBQ1osT0FBTyxTQUFTLENBQUE7UUFDbEIsS0FBSyxtQkFBbUI7WUFDdEIsT0FBTyxrQkFBa0IsQ0FBQTtRQUMzQjtZQUNFLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0RBQWtELE1BQU0sRUFBRSxDQUMzRCxDQUFBO0lBQ0wsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQVU7SUFDcEMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssUUFBUTtZQUNYLE9BQU8sUUFBUSxDQUFBO1FBQ2pCLEtBQUssY0FBYztZQUNqQixPQUFPLGNBQWMsQ0FBQTtRQUN2QixLQUFLLGFBQWE7WUFDaEIsT0FBTyxhQUFhLENBQUE7UUFDdEIsS0FBSyxXQUFXO1lBQ2QsT0FBTyxXQUFXLENBQUE7UUFDcEIsS0FBSyxhQUFhO1lBQ2hCLE9BQU8sYUFBYSxDQUFBO1FBQ3RCLEtBQUssUUFBUTtZQUNYLE9BQU8sUUFBUSxDQUFBO1FBQ2pCLEtBQUssUUFBUTtZQUNYLE9BQU8sUUFBUSxDQUFBO1FBQ2pCLEtBQUssVUFBVTtZQUNiLE9BQU8sVUFBVSxDQUFBO1FBQ25CLEtBQUssWUFBWTtZQUNmLE9BQU8sWUFBWSxDQUFBO1FBQ3JCLEtBQUssT0FBTztZQUNWLE9BQU8sT0FBTyxDQUFBO1FBQ2hCLEtBQUssT0FBTztZQUNWLE9BQU8sT0FBTyxDQUFBO1FBQ2hCLEtBQUssa0JBQWtCO1lBQ3JCLE9BQU8sZ0JBQWdCLENBQUE7UUFDekIsS0FBSyx3QkFBd0I7WUFDM0IsT0FBTyx1QkFBdUIsQ0FBQTtRQUNoQyxLQUFLLFdBQVc7WUFDZCxPQUFPLFdBQVcsQ0FBQTtRQUNwQixLQUFLLFdBQVc7WUFDZCxPQUFPLFdBQVcsQ0FBQTtRQUNwQixLQUFLLG1CQUFtQjtZQUN0QixPQUFPLGtCQUFrQixDQUFBO1FBQzNCLEtBQUssZUFBZTtZQUNsQixPQUFPLGNBQWMsQ0FBQTtRQUN2QixLQUFLLFNBQVM7WUFDWixPQUFPLFNBQVMsQ0FBQTtRQUNsQixLQUFLLGFBQWE7WUFDaEIsT0FBTyxhQUFhLENBQUE7UUFDdEIsS0FBSyxhQUFhO1lBQ2hCLE9BQU8sYUFBYSxDQUFBO1FBQ3RCLEtBQUssTUFBTTtZQUNULE9BQU8sTUFBTSxDQUFBO1FBQ2Y7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZFLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLDhCQUE4QixDQUM1QyxZQUF3QztJQUV4QyxRQUFRLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ3pELEtBQUssS0FBSztZQUNSLE9BQU8sU0FBUyxDQUFBO1FBQ2xCLEtBQUssS0FBSztZQUNSLE9BQU8sU0FBUyxDQUFBO1FBQ2xCLEtBQUssS0FBSztZQUNSLE9BQU8sU0FBUyxDQUFBO1FBQ2xCO1lBQ0UsT0FBTyxZQUFZLENBQUMscUJBQXFCLENBQUE7SUFDN0MsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCLENBQ3pDLGVBQW9DO0lBRXBDLFFBQVEsZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxVQUFVO1lBQ2IsT0FBTyxVQUFVLENBQUE7UUFDbkIsS0FBSyxTQUFTO1lBQ1osT0FBTyxTQUFTLENBQUE7UUFDbEIsS0FBSyxXQUFXO1lBQ2QsT0FBTyxXQUFXLENBQUE7UUFDcEIsS0FBSyxZQUFZO1lBQ2YsT0FBTyxZQUFZLENBQUE7UUFDckIsS0FBSyxXQUFXO1lBQ2QsT0FBTyxXQUFXLENBQUE7UUFDcEIsS0FBSyxVQUFVO1lBQ2IsT0FBTyxVQUFVLENBQUE7SUFDckIsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLGVBQXNDO0lBQ25FLE1BQU0sUUFBUSxHQUFHO1FBQ2YsS0FBSyxFQUFFLENBQUM7UUFDUixNQUFNLEVBQUUsQ0FBQztRQUNULEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxFQUFFLENBQUM7UUFDUCxLQUFLLEVBQUUsQ0FBQztLQUNULENBQUE7SUFDRCxRQUFRLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM1QixLQUFLLEtBQUs7WUFDUixJQUFJLGVBQWUsQ0FBQyxZQUFZLElBQUksQ0FBQztnQkFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTs7Z0JBQ25ELFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ25FLE1BQUs7UUFDUCxLQUFLLE1BQU07WUFDVCxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUEsQ0FBQyxnRUFBZ0U7WUFDdEksTUFBSztRQUNQLEtBQUssT0FBTztZQUNWLElBQUksZUFBZSxDQUFDLFlBQVksSUFBSSxDQUFDO2dCQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBOztnQkFDckQsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDbEUsTUFBSztRQUNQLEtBQUssTUFBTTtZQUNULElBQUksZUFBZSxDQUFDLFlBQVksSUFBSSxDQUFDO2dCQUFFLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBOztnQkFDcEQsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDcEUsTUFBSztJQUNULENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENB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T0FBTyxJQUFJLENBQ1QsdUJBQXVCLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLEVBQzNELGNBQWMsQ0FBQyxVQUFVLEVBQUUsd0NBQXdDLENBQUMsRUFDcEUsY0FBYyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FDdkMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNYLENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLE1BQXFCLEVBQ3JCLE1BQWtCO0lBRWxCLElBQUksQ0FDRiwwQkFBMEIsRUFBRSxFQUM1Qix1QkFBdUIsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsRUFDMUQsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsRUFDdEMsTUFBTSxDQUFDLGtCQUFrQjtRQUN2QixDQUFDLENBQUMsSUFBSSxDQUNGLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxFQUNwRSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FDaEQ7UUFDSCxDQUFDLENBQUMsSUFBSSxDQUNULENBQUMsTUFBTSxDQUFDLENBQUE7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2F0YWxvZ1JlY29yZCxcbiAgQ29uc3RyYWludCxcbiAgRGF0YXNldE9ubGluZVJlc291cmNlLFxuICBEYXRhc2V0UmVjb3JkLFxuICBEYXRhc2V0U2VydmljZURpc3RyaWJ1dGlvbixcbiAgRmllbGRUcmFuc2xhdGlvbixcbiAgSW5kaXZpZHVhbCxcbiAgS2V5d29yZCxcbiAgTGFuZ3VhZ2VDb2RlLFxuICBSZWNvcmRTdGF0dXMsXG4gIFJlY29yZFRyYW5zbGF0aW9ucyxcbiAgUmV1c2VSZWNvcmQsXG4gIFJvbGUsXG4gIFNlcnZpY2VFbmRwb2ludCxcbiAgU2VydmljZU9ubGluZVJlc291cmNlLFxuICBTZXJ2aWNlUmVjb3JkLFxuICBVcGRhdGVGcmVxdWVuY3lDb2RlLFxuICBVcGRhdGVGcmVxdWVuY3lDdXN0b20sXG59IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL2RvbWFpbi9zcmMvbGliL21vZGVsL3JlY29yZCdcbmltcG9ydCB7IFRoZXNhdXJ1c01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vZG9tYWluL3NyYy9saWIvbW9kZWwvdGhlc2F1cnVzJ1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMvZm9ybWF0J1xuaW1wb3J0IHsgR2VvbWV0cnkgfSBmcm9tICdnZW9qc29uJ1xuaW1wb3J0IHtcbiAgQ2hhaW5hYmxlRnVuY3Rpb24sXG4gIGZpbHRlckFycmF5LFxuICBtYXAsXG4gIG1hcEFycmF5LFxuICBub29wLFxuICBwaXBlLFxuICB0YXAsXG59IGZyb20gJy4uL2Z1bmN0aW9uLXV0aWxzJ1xuaW1wb3J0IHtcbiAgYWxsQ2hpbGRyZW5FbGVtZW50LFxuICBhcHBlbmRDaGlsZHJlbixcbiAgY3JlYXRlQ2hpbGQsXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIGNyZWF0ZU5lc3RlZENoaWxkLFxuICBjcmVhdGVOZXN0ZWRFbGVtZW50LFxuICBmaW5kQ2hpbGRPckNyZWF0ZSxcbiAgZmluZENoaWxkcmVuRWxlbWVudCxcbiAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUsXG4gIGZpbmROZXN0ZWRFbGVtZW50LFxuICBmaW5kTmVzdGVkRWxlbWVudHMsXG4gIHJlYWRBdHRyaWJ1dGUsXG4gIHJlbW92ZUFsbENoaWxkcmVuLFxuICByZW1vdmVDaGlsZHJlbixcbiAgcmVtb3ZlQ2hpbGRyZW5CeU5hbWUsXG4gIHNldFRleHRDb250ZW50LFxuICB3cml0ZUF0dHJpYnV0ZSxcbiAgWG1sRWxlbWVudCxcbn0gZnJvbSAnLi4veG1sLXV0aWxzJ1xuaW1wb3J0IHsgcmVhZEtpbmQgfSBmcm9tICcuL3JlYWQtcGFydHMnXG5pbXBvcnQgeyB3cml0ZUdlb21ldHJ5IH0gZnJvbSAnLi91dGlscy9nZW9tZXRyeSdcbmltcG9ydCB7IG5hbWVQYXJ0c1RvRnVsbCB9IGZyb20gJy4vdXRpbHMvaW5kaXZpZHVhbC1uYW1lJ1xuaW1wb3J0IHsgTEFOR18yX1RPXzNfTUFQUEVSIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vbGlicy91dGlsL2kxOG4vc3JjL2xpYi9sYW5ndWFnZS1jb2RlcydcbmltcG9ydCB7IGtpbmRUb0NvZGVMaXN0VmFsdWUgfSBmcm9tICcuLi9jb21tb24vcmVzb3VyY2UtdHlwZXMnXG5cbmZ1bmN0aW9uIHdyaXRlTG9jYWxpemVkRWxlbWVudChcbiAgd3JpdGVGbjogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD4sXG4gIHRleHQ6IHN0cmluZyxcbiAgdHJhbnNsYXRpb25zOiBGaWVsZFRyYW5zbGF0aW9uLFxuICBkZWZhdWx0TGFuZ3VhZ2U6IExhbmd1YWdlQ29kZVxuKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD4ge1xuICBpZiAoIXRyYW5zbGF0aW9ucykgcmV0dXJuIHdyaXRlRm5cbiAgZnVuY3Rpb24gY3JlYXRlTG9jYWxpemVkKGxhbmc6IExhbmd1YWdlQ29kZSwgdHJhbnNsYXRpb246IHN0cmluZykge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgY3JlYXRlTmVzdGVkRWxlbWVudCgnZ21kOnRleHRHcm91cCcsICdnbWQ6TG9jYWxpc2VkQ2hhcmFjdGVyU3RyaW5nJyksXG4gICAgICB3cml0ZUF0dHJpYnV0ZSgnbG9jYWxlJywgYCMke2xhbmcudG9VcHBlckNhc2UoKX1gKSxcbiAgICAgIHNldFRleHRDb250ZW50KHRyYW5zbGF0aW9uKVxuICAgIClcbiAgfVxuICByZXR1cm4gcGlwZShcbiAgICB3cml0ZUZuLFxuICAgIHJlbW92ZUNoaWxkcmVuQnlOYW1lKCdnbWQ6UFRfRnJlZVRleHQnKSxcbiAgICBjcmVhdGVDaGlsZCgnZ21kOlBUX0ZyZWVUZXh0JyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICBjcmVhdGVMb2NhbGl6ZWQoZGVmYXVsdExhbmd1YWdlLCB0ZXh0KSxcbiAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHRyYW5zbGF0aW9ucykubWFwKChbbGFuZywgdHJhbnNsYXRpb25dKSA9PlxuICAgICAgICBjcmVhdGVMb2NhbGl6ZWQobGFuZywgdHJhbnNsYXRpb24pXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNoYXJhY3RlclN0cmluZyhcbiAgdGV4dDogc3RyaW5nXG4pOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBYbWxFbGVtZW50PiB7XG4gIHJldHVybiB0YXAoXG4gICAgcGlwZShmaW5kQ2hpbGRPckNyZWF0ZSgnZ2NvOkNoYXJhY3RlclN0cmluZycpLCBzZXRUZXh0Q29udGVudCh0ZXh0KSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVMb2NhbGl6ZWRDaGFyYWN0ZXJTdHJpbmcoXG4gIHRleHQ6IHN0cmluZyxcbiAgdHJhbnNsYXRpb25zOiBGaWVsZFRyYW5zbGF0aW9uLFxuICBkZWZhdWx0TGFuZ3VhZ2U6IExhbmd1YWdlQ29kZVxuKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD4ge1xuICByZXR1cm4gd3JpdGVMb2NhbGl6ZWRFbGVtZW50KFxuICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKHRleHQpLFxuICAgIHRleHQsXG4gICAgdHJhbnNsYXRpb25zLFxuICAgIGRlZmF1bHRMYW5ndWFnZVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUxpbmthZ2UoXG4gIHVybDogVVJMXG4pOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBYbWxFbGVtZW50PiB7XG4gIHJldHVybiB0YXAoXG4gICAgcGlwZShcbiAgICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6bGlua2FnZScsICdnbWQ6VVJMJyksXG4gICAgICBzZXRUZXh0Q29udGVudCh1cmwudG9TdHJpbmcoKSlcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQW5jaG9yKFxuICB1cmw6IFVSTCxcbiAgdGV4dD86IHN0cmluZ1xuKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD4ge1xuICByZXR1cm4gdGFwKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRPckNyZWF0ZSgnZ214OkFuY2hvcicpLFxuICAgICAgd3JpdGVBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCB1cmwudG9TdHJpbmcoKSksXG4gICAgICB0ZXh0ID8gc2V0VGV4dENvbnRlbnQodGV4dCkgOiBub29wXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUxvY2FsaXplZEFuY2hvcihcbiAgdXJsOiBVUkwsXG4gIHRleHQ6IHN0cmluZyxcbiAgdHJhbnNsYXRpb25zOiBGaWVsZFRyYW5zbGF0aW9uLFxuICBkZWZhdWx0TGFuZ3VhZ2U6IExhbmd1YWdlQ29kZVxuKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD4ge1xuICByZXR1cm4gd3JpdGVMb2NhbGl6ZWRFbGVtZW50KFxuICAgIHdyaXRlQW5jaG9yKHVybCwgdGV4dCksXG4gICAgdGV4dCxcbiAgICB0cmFuc2xhdGlvbnMsXG4gICAgZGVmYXVsdExhbmd1YWdlXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRGF0ZVRpbWUoXG4gIGRhdGU6IERhdGVcbik6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIFhtbEVsZW1lbnQ+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkT3JDcmVhdGUoJ2djbzpEYXRlVGltZScpLFxuICAgIHNldFRleHRDb250ZW50KGZvcm1hdChkYXRlLCBcInl5eXktTU0tZGQnVCdISDptbTpzc1wiKSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEYXRlKFxuICBkYXRlOiBEYXRlXG4pOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBYbWxFbGVtZW50PiB7XG4gIHJldHVybiB0YXAoXG4gICAgcGlwZShcbiAgICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnY286RGF0ZScpLFxuICAgICAgc2V0VGV4dENvbnRlbnQoZm9ybWF0KGRhdGUsICd5eXl5LU1NLWRkJykpXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURlY2ltYWwoXG4gIGRlY2ltYWw6IG51bWJlclxuKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD4ge1xuICByZXR1cm4gdGFwKFxuICAgIHBpcGUoZmluZENoaWxkT3JDcmVhdGUoJ2djbzpEZWNpbWFsJyksIHNldFRleHRDb250ZW50KGRlY2ltYWwudG9TdHJpbmcoKSkpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb2dyZXNzQ29kZShzdGF0dXM6IFJlY29yZFN0YXR1cyk6IHN0cmluZyB7XG4gIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgIHJldHVybiAnY29tcGxldGVkJ1xuICAgIGNhc2UgJ2RlcHJlY2F0ZWQnOlxuICAgICAgcmV0dXJuICdkZXByZWNhdGVkJ1xuICAgIGNhc2UgJ29uZ29pbmcnOlxuICAgICAgcmV0dXJuICdvbkdvaW5nJ1xuICAgIGNhc2UgJ3JlbW92ZWQnOlxuICAgICAgcmV0dXJuICdyZW1vdmVkJ1xuICAgIGNhc2UgJ3VuZGVyX2RldmVsb3BtZW50JzpcbiAgICAgIHJldHVybiAndW5kZXJEZXZlbG9wbWVudCdcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGRldGVybWluZSBwcm9ncmVzcyBjb2RlIGZyb20gc3RhdHVzOiAke3N0YXR1c31gXG4gICAgICApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvbGVDb2RlKHJvbGU6IFJvbGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHJvbGUpIHtcbiAgICBjYXNlICdhdXRob3InOlxuICAgICAgcmV0dXJuICdhdXRob3InXG4gICAgY2FzZSAnY29sbGFib3JhdG9yJzpcbiAgICAgIHJldHVybiAnY29sbGFib3JhdG9yJ1xuICAgIGNhc2UgJ2NvbnRyaWJ1dG9yJzpcbiAgICAgIHJldHVybiAnY29udHJpYnV0b3InXG4gICAgY2FzZSAnY3VzdG9kaWFuJzpcbiAgICAgIHJldHVybiAnY3VzdG9kaWFuJ1xuICAgIGNhc2UgJ2Rpc3RyaWJ1dG9yJzpcbiAgICAgIHJldHVybiAnZGlzdHJpYnV0b3InXG4gICAgY2FzZSAnZWRpdG9yJzpcbiAgICAgIHJldHVybiAnZWRpdG9yJ1xuICAgIGNhc2UgJ2Z1bmRlcic6XG4gICAgICByZXR1cm4gJ2Z1bmRlcidcbiAgICBjYXNlICdtZWRpYXRvcic6XG4gICAgICByZXR1cm4gJ21lZGlhdG9yJ1xuICAgIGNhc2UgJ29yaWdpbmF0b3InOlxuICAgICAgcmV0dXJuICdvcmlnaW5hdG9yJ1xuICAgIGNhc2UgJ290aGVyJzpcbiAgICAgIHJldHVybiAnb3RoZXInXG4gICAgY2FzZSAnb3duZXInOlxuICAgICAgcmV0dXJuICdvd25lcidcbiAgICBjYXNlICdwb2ludF9vZl9jb250YWN0JzpcbiAgICAgIHJldHVybiAncG9pbnRPZkNvbnRhY3QnXG4gICAgY2FzZSAncHJpbmNpcGFsX2ludmVzdGlnYXRvcic6XG4gICAgICByZXR1cm4gJ3ByaW5jaXBhbEludmVzdGlnYXRvcidcbiAgICBjYXNlICdwcm9jZXNzb3InOlxuICAgICAgcmV0dXJuICdwcm9jZXNzb3InXG4gICAgY2FzZSAncHVibGlzaGVyJzpcbiAgICAgIHJldHVybiAncHVibGlzaGVyJ1xuICAgIGNhc2UgJ3Jlc291cmNlX3Byb3ZpZGVyJzpcbiAgICAgIHJldHVybiAncmVzb3VyY2VQcm92aWRlcidcbiAgICBjYXNlICdyaWdodHNfaG9sZGVyJzpcbiAgICAgIHJldHVybiAncmlnaHRzSG9sZGVyJ1xuICAgIGNhc2UgJ3Nwb25zb3InOlxuICAgICAgcmV0dXJuICdzcG9uc29yJ1xuICAgIGNhc2UgJ3N0YWtlaG9sZGVyJzpcbiAgICAgIHJldHVybiAnc3Rha2Vob2xkZXInXG4gICAgY2FzZSAndW5zcGVjaWZpZWQnOlxuICAgICAgcmV0dXJuICd1bnNwZWNpZmllZCdcbiAgICBjYXNlICd1c2VyJzpcbiAgICAgIHJldHVybiAndXNlcidcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZGV0ZXJtaW5lIHJvbGUgY29kZSBmcm9tIHJvbGU6ICR7cm9sZX1gKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlRGlzdHJpYnV0aW9uUHJvdG9jb2woXG4gIGRpc3RyaWJ1dGlvbjogRGF0YXNldFNlcnZpY2VEaXN0cmlidXRpb25cbik6IHN0cmluZyB7XG4gIHN3aXRjaCAoZGlzdHJpYnV0aW9uLmFjY2Vzc1NlcnZpY2VQcm90b2NvbC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnd2ZzJzpcbiAgICAgIHJldHVybiAnT0dDOldGUydcbiAgICBjYXNlICd3bXMnOlxuICAgICAgcmV0dXJuICdPR0M6V01TJ1xuICAgIGNhc2UgJ3dwcyc6XG4gICAgICByZXR1cm4gJ09HQzpXUFMnXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBkaXN0cmlidXRpb24uYWNjZXNzU2VydmljZVByb3RvY29sXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW50ZW5hbmNlRnJlcXVlbmN5Q29kZShcbiAgdXBkYXRlRnJlcXVlbmN5OiBVcGRhdGVGcmVxdWVuY3lDb2RlXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgc3dpdGNoICh1cGRhdGVGcmVxdWVuY3kpIHtcbiAgICBjYXNlICdhc05lZWRlZCc6XG4gICAgICByZXR1cm4gJ2FzTmVlZGVkJ1xuICAgIGNhc2UgJ3Vua25vd24nOlxuICAgICAgcmV0dXJuICd1bmtub3duJ1xuICAgIGNhc2UgJ2lycmVndWxhcic6XG4gICAgICByZXR1cm4gJ2lycmVndWxhcidcbiAgICBjYXNlICdub3RQbGFubmVkJzpcbiAgICAgIHJldHVybiAnbm90UGxhbm5lZCdcbiAgICBjYXNlICdjb250aW51YWwnOlxuICAgICAgcmV0dXJuICdjb250aW51YWwnXG4gICAgY2FzZSAncGVyaW9kaWMnOlxuICAgICAgcmV0dXJuICdwZXJpb2RpYydcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SVNPRHVyYXRpb24odXBkYXRlRnJlcXVlbmN5OiBVcGRhdGVGcmVxdWVuY3lDdXN0b20pOiBzdHJpbmcge1xuICBjb25zdCBkdXJhdGlvbiA9IHtcbiAgICB5ZWFyczogMCxcbiAgICBtb250aHM6IDAsXG4gICAgd2Vla3M6IDAsXG4gICAgZGF5czogMCxcbiAgICBob3VyczogMCxcbiAgfVxuICBzd2l0Y2ggKHVwZGF0ZUZyZXF1ZW5jeS5wZXIpIHtcbiAgICBjYXNlICdkYXknOlxuICAgICAgaWYgKHVwZGF0ZUZyZXF1ZW5jeS51cGRhdGVkVGltZXMgPD0gMSkgZHVyYXRpb24uZGF5cyA9IDFcbiAgICAgIGVsc2UgZHVyYXRpb24uaG91cnMgPSBNYXRoLnJvdW5kKDI0IC8gdXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcylcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnd2Vlayc6XG4gICAgICBkdXJhdGlvbi5kYXlzID0gTWF0aC5yb3VuZCg3IC8gdXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcyAtIDAuMDAwMSkgLy8gdGhpcyBpcyB0byBtYWtlIHN1cmUgdGhhdCAnMiB0aW1lcyBwZXIgd2VlaycgPSAnZXZlcnkgMyBkYXlzJ1xuICAgICAgYnJlYWtcbiAgICBjYXNlICdtb250aCc6XG4gICAgICBpZiAodXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcyA8PSAxKSBkdXJhdGlvbi5tb250aHMgPSAxXG4gICAgICBlbHNlIGR1cmF0aW9uLmRheXMgPSBNYXRoLnJvdW5kKDMwIC8gdXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcylcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAneWVhcic6XG4gICAgICBpZiAodXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcyA8PSAxKSBkdXJhdGlvbi55ZWFycyA9IDFcbiAgICAgIGVsc2UgZHVyYXRpb24ubW9udGhzID0gTWF0aC5yb3VuZCgxMiAvIHVwZGF0ZUZyZXF1ZW5jeS51cGRhdGVkVGltZXMpXG4gICAgICBicmVha1xuICB9XG4gIGNvbnN0IGhvdXJzID0gZHVyYXRpb24uaG91cnMgPiAwID8gYFQke2R1cmF0aW9uLmhvdXJzfUhgIDogJydcbiAgcmV0dXJuIGBQJHtkdXJhdGlvbi55ZWFyc31ZJHtkdXJhdGlvbi5tb250aHN9TSR7ZHVyYXRpb24uZGF5c31EJHtob3Vyc31gXG59XG5cbmZ1bmN0aW9uIGFwcGVuZFJlc3BvbnNpYmxlUGFydHkoXG4gIGNvbnRhY3Q6IEluZGl2aWR1YWwsXG4gIHRyYW5zbGF0aW9uczogUmVjb3JkVHJhbnNsYXRpb25zLFxuICBkZWZhdWx0TGFuZ3VhZ2U6IExhbmd1YWdlQ29kZVxuKSB7XG4gIGNvbnN0IGZ1bGxOYW1lID0gbmFtZVBhcnRzVG9GdWxsKGNvbnRhY3QuZmlyc3ROYW1lLCBjb250YWN0Lmxhc3ROYW1lKVxuXG4gIGNvbnN0IGNyZWF0ZUFkZHJlc3MgPSBwaXBlKFxuICAgIGNyZWF0ZU5lc3RlZEVsZW1lbnQoJ2dtZDphZGRyZXNzJywgJ2dtZDpDSV9BZGRyZXNzJyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICBwaXBlKFxuICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZWxlY3Ryb25pY01haWxBZGRyZXNzJyksXG4gICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnRhY3QuZW1haWwpXG4gICAgICApXG4gICAgKSxcbiAgICBjb250YWN0LmFkZHJlc3NcbiAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpkZWxpdmVyeVBvaW50JyksXG4gICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhjb250YWN0LmFkZHJlc3MpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICA6IG5vb3BcbiAgKVxuXG4gIGNvbnN0IGNyZWF0ZUNvbnRhY3QgPSBwaXBlKFxuICAgIGNyZWF0ZU5lc3RlZEVsZW1lbnQoJ2dtZDpjb250YWN0SW5mbycsICdnbWQ6Q0lfQ29udGFjdCcpLFxuICAgIGNvbnRhY3QucGhvbmVcbiAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZU5lc3RlZEVsZW1lbnQoJ2dtZDpwaG9uZScsICdnbWQ6Q0lfVGVsZXBob25lJywgJ2dtZDp2b2ljZScpLFxuICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcoY29udGFjdC5waG9uZSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIDogbm9vcCxcbiAgICBhcHBlbmRDaGlsZHJlbihjcmVhdGVBZGRyZXNzKSxcbiAgICBjb250YWN0Lm9yZ2FuaXphdGlvbj8ud2Vic2l0ZVxuICAgICAgPyBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgY3JlYXRlTmVzdGVkRWxlbWVudCgnZ21kOm9ubGluZVJlc291cmNlJywgJ2dtZDpDSV9PbmxpbmVSZXNvdXJjZScpLFxuICAgICAgICAgICAgd3JpdGVMaW5rYWdlKGNvbnRhY3Qub3JnYW5pemF0aW9uLndlYnNpdGUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICA6IG5vb3BcbiAgKVxuXG4gIHJldHVybiBhcHBlbmRDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOkNJX1Jlc3BvbnNpYmxlUGFydHknKSxcbiAgICAgIGZ1bGxOYW1lXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6aW5kaXZpZHVhbE5hbWUnKSxcbiAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcoZnVsbE5hbWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBjb250YWN0LnBvc2l0aW9uXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6cG9zaXRpb25OYW1lJyksXG4gICAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnRhY3QucG9zaXRpb24pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG5cbiAgICAgIGNvbnRhY3Qub3JnYW5pemF0aW9uPy5uYW1lXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6b3JnYW5pc2F0aW9uTmFtZScpLFxuICAgICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhjb250YWN0Lm9yZ2FuaXphdGlvbi5uYW1lKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgOiBub29wLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIGNyZWF0ZUNvbnRhY3QsXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlTmVzdGVkRWxlbWVudCgnZ21kOnJvbGUnLCAnZ21kOkNJX1JvbGVDb2RlJyksXG4gICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoXG4gICAgICAgICAgICAnY29kZUxpc3QnLFxuICAgICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjQ0lfUm9sZUNvZGUnXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsIGdldFJvbGVDb2RlKGNvbnRhY3Qucm9sZSkpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUtleXdvcmRzKCkge1xuICByZXR1cm4gcmVtb3ZlQ2hpbGRyZW4ocGlwZShmaW5kTmVzdGVkRWxlbWVudHMoJ2dtZDpkZXNjcmlwdGl2ZUtleXdvcmRzJykpKVxufVxuXG4vLyByZXR1cm5zIGEgPGdtZDp0aGVzYXVydXNOYW1lPiBlbGVtZW50XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGhlc2F1cnVzKHRoZXNhdXJ1czogVGhlc2F1cnVzTW9kZWwpIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgY3JlYXRlTmVzdGVkRWxlbWVudCgnZ21kOnRoZXNhdXJ1c05hbWUnLCAnZ21kOkNJX0NpdGF0aW9uJyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICBwaXBlKFxuICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6dGl0bGUnKSxcbiAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcodGhlc2F1cnVzLm5hbWUgfHwgdGhlc2F1cnVzLmlkKVxuICAgICAgKSxcbiAgICAgIHBpcGUoXG4gICAgICAgIGNyZWF0ZU5lc3RlZEVsZW1lbnQoJ2dtZDppZGVudGlmaWVyJywgJ2dtZDpNRF9JZGVudGlmaWVyJyksXG4gICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6Y29kZScpLFxuICAgICAgICAgICAgdGhlc2F1cnVzLnVybFxuICAgICAgICAgICAgICA/IHdyaXRlQW5jaG9yKHRoZXNhdXJ1cy51cmwsIHRoZXNhdXJ1cy5pZClcbiAgICAgICAgICAgICAgOiB3cml0ZUNoYXJhY3RlclN0cmluZyh0aGVzYXVydXMuaWQpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRLZXl3b3JkcyhcbiAga2V5d29yZHM6IEtleXdvcmRbXSxcbiAgZGVmYXVsdExhbmd1YWdlOiBMYW5ndWFnZUNvZGVcbikge1xuICAvLyBrZXl3b3JkcyBhcmUgZ3JvdXBlZCBieSB0aGVzYXVydXMgaWYgdGhleSBoYXZlIG9uZSwgb3RoZXJ3aXNlIGJ5IHR5cGVcbiAgY29uc3Qga2V5d29yZHNCeVRoZXNhdXJ1czogS2V5d29yZFtdW10gPSBrZXl3b3Jkcy5yZWR1Y2UoKGFjYywga2V5d29yZCkgPT4ge1xuICAgIGNvbnN0IHRoZXNhdXJ1c0lkID0ga2V5d29yZC50aGVzYXVydXM/LmlkXG4gICAgY29uc3QgdHlwZSA9IGtleXdvcmQudHlwZVxuICAgIGxldCBleGlzdGluZ0dyb3VwID0gYWNjLmZpbmQoKGdyb3VwKSA9PlxuICAgICAgdGhlc2F1cnVzSWRcbiAgICAgICAgPyBncm91cFswXS50aGVzYXVydXM/LmlkID09PSB0aGVzYXVydXNJZFxuICAgICAgICA6IGdyb3VwWzBdLnR5cGUgPT09IHR5cGUgJiYgIWdyb3VwWzBdLnRoZXNhdXJ1c1xuICAgIClcbiAgICBpZiAoIWV4aXN0aW5nR3JvdXApIHtcbiAgICAgIGV4aXN0aW5nR3JvdXAgPSBbXVxuICAgICAgYWNjLnB1c2goZXhpc3RpbmdHcm91cClcbiAgICB9XG4gICAgZXhpc3RpbmdHcm91cC5wdXNoKGtleXdvcmQpXG4gICAgcmV0dXJuIGFjY1xuICB9LCBbXSlcbiAgcmV0dXJuIGFwcGVuZENoaWxkcmVuKFxuICAgIC4uLmtleXdvcmRzQnlUaGVzYXVydXMubWFwKChrZXl3b3JkcykgPT5cbiAgICAgIHBpcGUoXG4gICAgICAgIGNyZWF0ZU5lc3RlZEVsZW1lbnQoJ2dtZDpkZXNjcmlwdGl2ZUtleXdvcmRzJywgJ2dtZDpNRF9LZXl3b3JkcycpLFxuICAgICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgY3JlYXRlTmVzdGVkRWxlbWVudCgnZ21kOnR5cGUnLCAnZ21kOk1EX0tleXdvcmRUeXBlQ29kZScpLFxuICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICdjb2RlTGlzdCcsXG4gICAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI01EX0tleXdvcmRUeXBlQ29kZSdcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsIGtleXdvcmRzWzBdLnR5cGUpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBrZXl3b3Jkc1swXS50aGVzYXVydXNcbiAgICAgICAgICA/IGFwcGVuZENoaWxkcmVuKGNyZWF0ZVRoZXNhdXJ1cyhrZXl3b3Jkc1swXS50aGVzYXVydXMpKVxuICAgICAgICAgIDogbm9vcCxcbiAgICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgLi4ua2V5d29yZHMubWFwKChrZXl3b3JkKSA9PlxuICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmtleXdvcmQnKSxcbiAgICAgICAgICAgICAgd3JpdGVMb2NhbGl6ZWRDaGFyYWN0ZXJTdHJpbmcoXG4gICAgICAgICAgICAgICAga2V5d29yZC5sYWJlbCxcbiAgICAgICAgICAgICAgICBrZXl3b3JkLnRyYW5zbGF0aW9ucz8ubGFiZWwsXG4gICAgICAgICAgICAgICAgZGVmYXVsdExhbmd1YWdlXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnN0cmFpbnQoXG4gIGNvbnN0cmFpbnQ6IENvbnN0cmFpbnQsXG4gIHR5cGU6ICdsZWdhbCcgfCAnc2VjdXJpdHknIHwgJ290aGVyJyxcbiAgZGVmYXVsdExhbmd1YWdlOiBMYW5ndWFnZUNvZGVcbikge1xuICBpZiAodHlwZSA9PT0gJ3NlY3VyaXR5Jykge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgY3JlYXRlTmVzdGVkRWxlbWVudChcbiAgICAgICAgJ2dtZDpyZXNvdXJjZUNvbnN0cmFpbnRzJyxcbiAgICAgICAgJ2dtZDpNRF9TZWN1cml0eUNvbnN0cmFpbnRzJ1xuICAgICAgKSxcbiAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGNyZWF0ZU5lc3RlZEVsZW1lbnQoXG4gICAgICAgICAgICAnZ21kOmNsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgICAgICdnbWQ6TURfQ2xhc3NpZmljYXRpb25Db2RlJ1xuICAgICAgICAgICksXG4gICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoXG4gICAgICAgICAgICAnY29kZUxpc3QnLFxuICAgICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfQ2xhc3NpZmljYXRpb25Db2RlJ1xuICAgICAgICAgICksXG4gICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCAncmVzdHJpY3RlZCcpXG4gICAgICAgICksXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnVzZUxpbWl0YXRpb24nKSxcbiAgICAgICAgICAndXJsJyBpbiBjb25zdHJhaW50XG4gICAgICAgICAgICA/IHdyaXRlTG9jYWxpemVkQW5jaG9yKFxuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQudXJsLFxuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQudGV4dCxcbiAgICAgICAgICAgICAgICBjb25zdHJhaW50LnRyYW5zbGF0aW9ucz8udGV4dCxcbiAgICAgICAgICAgICAgICBkZWZhdWx0TGFuZ3VhZ2VcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB3cml0ZUxvY2FsaXplZENoYXJhY3RlclN0cmluZyhcbiAgICAgICAgICAgICAgICBjb25zdHJhaW50LnRleHQsXG4gICAgICAgICAgICAgICAgY29uc3RyYWludC50cmFuc2xhdGlvbnM/LnRleHQsXG4gICAgICAgICAgICAgICAgZGVmYXVsdExhbmd1YWdlXG4gICAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbGVnYWwnKSB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICBjcmVhdGVOZXN0ZWRFbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycsICdnbWQ6TURfTGVnYWxDb25zdHJhaW50cycpLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlTmVzdGVkRWxlbWVudChcbiAgICAgICAgICAgICdnbWQ6YWNjZXNzQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgJ2dtZDpNRF9SZXN0cmljdGlvbkNvZGUnXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3cml0ZUF0dHJpYnV0ZShcbiAgICAgICAgICAgICdjb2RlTGlzdCcsXG4gICAgICAgICAgICAnaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTEzOS9yZXNvdXJjZXMvZ214Q29kZWxpc3RzLnhtbCNNRF9SZXN0cmljdGlvbkNvZGUnXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsICdvdGhlclJlc3RyaWN0aW9ucycpXG4gICAgICAgICksXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOm90aGVyQ29uc3RyYWludHMnKSxcbiAgICAgICAgICAndXJsJyBpbiBjb25zdHJhaW50XG4gICAgICAgICAgICA/IHdyaXRlTG9jYWxpemVkQW5jaG9yKFxuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQudXJsLFxuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQudGV4dCxcbiAgICAgICAgICAgICAgICBjb25zdHJhaW50LnRyYW5zbGF0aW9ucz8udGV4dCxcbiAgICAgICAgICAgICAgICBkZWZhdWx0TGFuZ3VhZ2VcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB3cml0ZUxvY2FsaXplZENoYXJhY3RlclN0cmluZyhcbiAgICAgICAgICAgICAgICBjb25zdHJhaW50LnRleHQsXG4gICAgICAgICAgICAgICAgY29uc3RyYWludC50cmFuc2xhdGlvbnM/LnRleHQsXG4gICAgICAgICAgICAgICAgZGVmYXVsdExhbmd1YWdlXG4gICAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgfVxuICAvLyBvdGhlclxuICByZXR1cm4gcGlwZShcbiAgICBjcmVhdGVOZXN0ZWRFbGVtZW50KFxuICAgICAgJ2dtZDpyZXNvdXJjZUNvbnN0cmFpbnRzJyxcbiAgICAgICdnbWQ6TURfQ29uc3RyYWludHMnLFxuICAgICAgJ2dtZDp1c2VMaW1pdGF0aW9uJ1xuICAgICksXG4gICAgJ3VybCcgaW4gY29uc3RyYWludFxuICAgICAgPyB3cml0ZUxvY2FsaXplZEFuY2hvcihcbiAgICAgICAgICBjb25zdHJhaW50LnVybCxcbiAgICAgICAgICBjb25zdHJhaW50LnRleHQsXG4gICAgICAgICAgY29uc3RyYWludC50cmFuc2xhdGlvbnM/LnRleHQsXG4gICAgICAgICAgZGVmYXVsdExhbmd1YWdlXG4gICAgICAgIClcbiAgICAgIDogd3JpdGVMb2NhbGl6ZWRDaGFyYWN0ZXJTdHJpbmcoXG4gICAgICAgICAgY29uc3RyYWludC50ZXh0LFxuICAgICAgICAgIGNvbnN0cmFpbnQudHJhbnNsYXRpb25zPy50ZXh0LFxuICAgICAgICAgIGRlZmF1bHRMYW5ndWFnZVxuICAgICAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU90aGVyQ29uc3RyYWludHMoKSB7XG4gIHJldHVybiB0YXAoXG4gICAgcGlwZShcbiAgICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpyZXNvdXJjZUNvbnN0cmFpbnRzJyksXG4gICAgICBtYXBBcnJheShcbiAgICAgICAgcmVtb3ZlQ2hpbGRyZW4oXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpNRF9Db25zdHJhaW50cycpLFxuICAgICAgICAgICAgZmlsdGVyQXJyYXkoXG4gICAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6dXNlTGltaXRhdGlvbicpLFxuICAgICAgICAgICAgICAgIChhcnJheSkgPT4gYXJyYXkubGVuZ3RoID4gMFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTZWN1cml0eUNvbnN0cmFpbnRzKCkge1xuICByZXR1cm4gdGFwKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgICAgbWFwQXJyYXkoXG4gICAgICAgIHJlbW92ZUNoaWxkcmVuKFxuICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6TURfU2VjdXJpdHlDb25zdHJhaW50cycpLFxuICAgICAgICAgICAgZmlsdGVyQXJyYXkoXG4gICAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6dXNlTGltaXRhdGlvbicpLFxuICAgICAgICAgICAgICAgIChhcnJheSkgPT4gYXJyYXkubGVuZ3RoID4gMFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVMZWdhbENvbnN0cmFpbnRzKCkge1xuICByZXR1cm4gdGFwKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgICAgbWFwQXJyYXkoXG4gICAgICAgIHJlbW92ZUNoaWxkcmVuKFxuICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6TURfTGVnYWxDb25zdHJhaW50cycpLFxuICAgICAgICAgICAgZmlsdGVyQXJyYXkoXG4gICAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgICAgZmluZE5lc3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgICAgJ2dtZDphY2Nlc3NDb25zdHJhaW50cycsXG4gICAgICAgICAgICAgICAgICAnZ21kOk1EX1Jlc3RyaWN0aW9uQ29kZSdcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIG1hcEFycmF5KHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSksXG4gICAgICAgICAgICAgICAgKHJlc3RyaWN0aW9uQ29kZXMpID0+XG4gICAgICAgICAgICAgICAgICByZXN0cmljdGlvbkNvZGVzLmV2ZXJ5KChjb2RlKSA9PiBjb2RlICE9PSAnbGljZW5zZScpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUVtcHR5UmVzb3VyY2VDb25zdHJhaW50cygpIHtcbiAgcmV0dXJuIHJlbW92ZUNoaWxkcmVuKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgICAgZmlsdGVyQXJyYXkocGlwZShhbGxDaGlsZHJlbkVsZW1lbnQsIChhcnJheSkgPT4gYXJyYXkubGVuZ3RoID09PSAwKSlcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUxpY2Vuc2VzKCkge1xuICByZXR1cm4gcmVtb3ZlQ2hpbGRyZW4oXG4gICAgcGlwZShcbiAgICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpyZXNvdXJjZUNvbnN0cmFpbnRzJyksXG4gICAgICBmaWx0ZXJBcnJheShcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBmaW5kTmVzdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAnZ21kOk1EX0xlZ2FsQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgJ2dtZDphY2Nlc3NDb25zdHJhaW50cycsXG4gICAgICAgICAgICAnZ21kOk1EX1Jlc3RyaWN0aW9uQ29kZSdcbiAgICAgICAgICApLFxuICAgICAgICAgIG1hcEFycmF5KHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSksXG4gICAgICAgICAgKHJlc3RyaWN0aW9uQ29kZXMpID0+XG4gICAgICAgICAgICByZXN0cmljdGlvbkNvZGVzLnNvbWUoKGNvZGUpID0+IGNvZGUgPT09ICdsaWNlbnNlJylcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGljZW5zZShcbiAgbGljZW5zZTogQ29uc3RyYWludCxcbiAgZGVmYXVsdExhbmd1YWdlOiBMYW5ndWFnZUNvZGVcbikge1xuICByZXR1cm4gcGlwZShcbiAgICBjcmVhdGVOZXN0ZWRFbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycsICdnbWQ6TURfTGVnYWxDb25zdHJhaW50cycpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlTmVzdGVkRWxlbWVudCgnZ21kOmFjY2Vzc0NvbnN0cmFpbnRzJywgJ2dtZDpNRF9SZXN0cmljdGlvbkNvZGUnKSxcbiAgICAgICAgd3JpdGVBdHRyaWJ1dGUoXG4gICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAnaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTEzOS9yZXNvdXJjZXMvZ214Q29kZWxpc3RzLnhtbCNNRF9SZXN0cmljdGlvbkNvZGUnXG4gICAgICAgICksXG4gICAgICAgIHdyaXRlQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgJ2xpY2Vuc2UnKVxuICAgICAgKSxcbiAgICAgIHBpcGUoXG4gICAgICAgIGNyZWF0ZU5lc3RlZEVsZW1lbnQoJ2dtZDphY2Nlc3NDb25zdHJhaW50cycsICdnbWQ6TURfUmVzdHJpY3Rpb25Db2RlJyksXG4gICAgICAgIHdyaXRlQXR0cmlidXRlKFxuICAgICAgICAgICdjb2RlTGlzdCcsXG4gICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfUmVzdHJpY3Rpb25Db2RlJ1xuICAgICAgICApLFxuICAgICAgICB3cml0ZUF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsICdvdGhlclJlc3RyaWN0aW9ucycpXG4gICAgICApLFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOm90aGVyQ29uc3RyYWludHMnKSxcbiAgICAgICAgJ3VybCcgaW4gbGljZW5zZVxuICAgICAgICAgID8gd3JpdGVBbmNob3IobGljZW5zZS51cmwsIGxpY2Vuc2UudGV4dClcbiAgICAgICAgICA6IHdyaXRlTG9jYWxpemVkQ2hhcmFjdGVyU3RyaW5nKFxuICAgICAgICAgICAgICBsaWNlbnNlLnRleHQsXG4gICAgICAgICAgICAgIGxpY2Vuc2UudHJhbnNsYXRpb25zPy50ZXh0LFxuICAgICAgICAgICAgICBkZWZhdWx0TGFuZ3VhZ2VcbiAgICAgICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU9ubGluZVJlc291cmNlcygpIHtcbiAgcmV0dXJuIHJlbW92ZUNoaWxkcmVuQnlOYW1lKCdnbWQ6ZGlzdHJpYnV0aW9uSW5mbycpXG59XG5cbmZ1bmN0aW9uIGFwcGVuZE9ubGluZVJlc291cmNlRm9ybWF0KG1pbWVUeXBlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGFwcGVuZENoaWxkcmVuKFxuICAgIHBpcGUoXG4gICAgICBjcmVhdGVOZXN0ZWRFbGVtZW50KCdnbWQ6ZGlzdHJpYnV0aW9uRm9ybWF0JywgJ2dtZDpNRF9Gb3JtYXQnKSxcbiAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICBwaXBlKGNyZWF0ZUVsZW1lbnQoJ2dtZDpuYW1lJyksIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKG1pbWVUeXBlKSksXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnZlcnNpb24nKSxcbiAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZygnMS4wJykgLy8gaGFyZGNvZGluZyB0aGlzIGFzIGl0IG1vc3QgbGlrZWx5IHdvbid0IGJlIHVzZWQgYnV0IGlzIG1hbmRhdG9yeVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXN0cmlidXRpb25JbmZvKCkge1xuICByZXR1cm4gY3JlYXRlTmVzdGVkRWxlbWVudCgnZ21kOmRpc3RyaWJ1dGlvbkluZm8nLCAnZ21kOk1EX0Rpc3RyaWJ1dGlvbicpXG59XG5cbi8vIGFwcGx5IHRvIE1EX0Rpc3RyaWJ1dGlvblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZE9ubGluZVJlc291cmNlKFxuICBvbmxpbmVSZXNvdXJjZTogRGF0YXNldE9ubGluZVJlc291cmNlLFxuICBhcHBlbmRGb3JtYXRGbjogKFxuICAgIG1pbWVUeXBlOiBzdHJpbmdcbiAgKSA9PiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBYbWxFbGVtZW50PixcbiAgdHJhbnNsYXRpb25zOiBSZWNvcmRUcmFuc2xhdGlvbnMsXG4gIGRlZmF1bHRMYW5ndWFnZTogTGFuZ3VhZ2VDb2RlXG4pIHtcbiAgbGV0IG5hbWU6IHN0cmluZ1xuICBsZXQgZnVuY3Rpb25Db2RlOiBzdHJpbmdcbiAgbGV0IHByb3RvY29sOiBzdHJpbmdcbiAgaWYgKG9ubGluZVJlc291cmNlLnR5cGUgPT09ICdzZXJ2aWNlJykge1xuICAgIG5hbWUgPSBvbmxpbmVSZXNvdXJjZS5pZGVudGlmaWVySW5TZXJ2aWNlIC8vIHRoaXMgaXMgZm9yIEdlb05ldHdvcmsgdG8ga25vdyB0aGUgbGF5ZXIgbmFtZVxuICAgIGZ1bmN0aW9uQ29kZSA9ICdkb3dubG9hZCdcbiAgICBwcm90b2NvbCA9IGdldFNlcnZpY2VEaXN0cmlidXRpb25Qcm90b2NvbChvbmxpbmVSZXNvdXJjZSlcbiAgfSBlbHNlIGlmIChvbmxpbmVSZXNvdXJjZS50eXBlID09PSAnZG93bmxvYWQnKSB7XG4gICAgbmFtZSA9IG9ubGluZVJlc291cmNlLm5hbWVcbiAgICBmdW5jdGlvbkNvZGUgPSAnZG93bmxvYWQnXG4gICAgcHJvdG9jb2wgPSAnV1dXOkRPV05MT0FEJ1xuICB9IGVsc2Uge1xuICAgIG5hbWUgPSBvbmxpbmVSZXNvdXJjZS5uYW1lXG4gICAgZnVuY3Rpb25Db2RlID0gJ2luZm9ybWF0aW9uJ1xuICAgIHByb3RvY29sID0gJ1dXVzpMSU5LJ1xuICB9XG4gIGNvbnN0IGFwcGVuZFRyYW5zZmVyT3B0aW9ucyA9IGFwcGVuZENoaWxkcmVuKFxuICAgIHBpcGUoXG4gICAgICBjcmVhdGVOZXN0ZWRFbGVtZW50KFxuICAgICAgICAnZ21kOnRyYW5zZmVyT3B0aW9ucycsXG4gICAgICAgICdnbWQ6TURfRGlnaXRhbFRyYW5zZmVyT3B0aW9ucycsXG4gICAgICAgICdnbWQ6b25MaW5lJyxcbiAgICAgICAgJ2dtZDpDSV9PbmxpbmVSZXNvdXJjZSdcbiAgICAgICksXG4gICAgICB3cml0ZUxpbmthZ2Uob25saW5lUmVzb3VyY2UudXJsKSxcbiAgICAgICdkZXNjcmlwdGlvbicgaW4gb25saW5lUmVzb3VyY2VcbiAgICAgICAgPyBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpkZXNjcmlwdGlvbicpLFxuICAgICAgICAgICAgICB3cml0ZUxvY2FsaXplZENoYXJhY3RlclN0cmluZyhcbiAgICAgICAgICAgICAgICBvbmxpbmVSZXNvdXJjZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBvbmxpbmVSZXNvdXJjZS50cmFuc2xhdGlvbnM/LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRMYW5ndWFnZVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBuYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpuYW1lJyksXG4gICAgICAgICAgICAgIHdyaXRlTG9jYWxpemVkQ2hhcmFjdGVyU3RyaW5nKFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgb25saW5lUmVzb3VyY2UudHJhbnNsYXRpb25zPy5uYW1lLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRMYW5ndWFnZVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgcGlwZShjcmVhdGVFbGVtZW50KCdnbWQ6cHJvdG9jb2wnKSwgd3JpdGVDaGFyYWN0ZXJTdHJpbmcocHJvdG9jb2wpKSxcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVOZXN0ZWRFbGVtZW50KCdnbWQ6ZnVuY3Rpb24nLCAnZ21kOkNJX09uTGluZUZ1bmN0aW9uQ29kZScpLFxuICAgICAgICAgIHdyaXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI0NJX09uTGluZUZ1bmN0aW9uQ29kZSdcbiAgICAgICAgICApLFxuICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgZnVuY3Rpb25Db2RlKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG4gIHJldHVybiBwaXBlKFxuICAgICdtaW1lVHlwZScgaW4gb25saW5lUmVzb3VyY2VcbiAgICAgID8gYXBwZW5kRm9ybWF0Rm4ob25saW5lUmVzb3VyY2UubWltZVR5cGUpXG4gICAgICA6IG5vb3AsXG4gICAgYXBwZW5kVHJhbnNmZXJPcHRpb25zXG4gIClcbn1cblxuLyoqXG4gKiBMb29rcyBmb3Igc3J2OlNWX1NlcnZpY2VJZGVudGlmaWNhdGlvbiBvciBnbWQ6TURfRGF0YUlkZW50aWZpY2F0aW9uIGVsZW1lbnRcbiAqIGRlcGVuZGluZyBvbiByZWNvcmQgdHlwZSwgY3JlYXRlIGlmIG1pc3NpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCkge1xuICByZXR1cm4gKHJvb3RFbDogWG1sRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGtpbmQgPSByZWFkS2luZChyb290RWwpXG4gICAgbGV0IGVsdE5hbWUgPSAnZ21kOk1EX0RhdGFJZGVudGlmaWNhdGlvbidcbiAgICBpZiAoa2luZCA9PT0gJ3NlcnZpY2UnKSBlbHROYW1lID0gJ3NydjpTVl9TZXJ2aWNlSWRlbnRpZmljYXRpb24nXG4gICAgcmV0dXJuIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6aWRlbnRpZmljYXRpb25JbmZvJywgZWx0TmFtZSkocm9vdEVsKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3JDcmVhdGVEaXN0cmlidXRpb24oKSB7XG4gIHJldHVybiAocm9vdEVsOiBYbWxFbGVtZW50KSA9PiB7XG4gICAgcmV0dXJuIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKFxuICAgICAgJ2dtZDpkaXN0cmlidXRpb25JbmZvJyxcbiAgICAgICdnbWQ6TURfRGlzdHJpYnV0aW9uJ1xuICAgICkocm9vdEVsKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVVuaXF1ZUlkZW50aWZpZXIoXG4gIHJlY29yZDogQ2F0YWxvZ1JlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICBmaW5kQ2hpbGRPckNyZWF0ZSgnZ21kOmZpbGVJZGVudGlmaWVyJyksXG4gICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcocmVjb3JkLnVuaXF1ZUlkZW50aWZpZXIpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVLaW5kKHJlY29yZDogQ2F0YWxvZ1JlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHBpcGUoXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpoaWVyYXJjaHlMZXZlbCcsICdnbWQ6TURfU2NvcGVDb2RlJyksXG4gICAgd3JpdGVBdHRyaWJ1dGUoXG4gICAgICAnY29kZUxpc3QnLFxuICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfU2NvcGVDb2RlJ1xuICAgICksXG4gICAgd3JpdGVBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCBraW5kVG9Db2RlTGlzdFZhbHVlKHJlY29yZCkpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVUaXRsZShyZWNvcmQ6IENhdGFsb2dSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpjaXRhdGlvbicsICdnbWQ6Q0lfQ2l0YXRpb24nLCAnZ21kOnRpdGxlJyksXG4gICAgd3JpdGVMb2NhbGl6ZWRDaGFyYWN0ZXJTdHJpbmcoXG4gICAgICByZWNvcmQudGl0bGUsXG4gICAgICByZWNvcmQudHJhbnNsYXRpb25zPy50aXRsZSxcbiAgICAgIHJlY29yZC5kZWZhdWx0TGFuZ3VhZ2VcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVBYnN0cmFjdChyZWNvcmQ6IENhdGFsb2dSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZENoaWxkT3JDcmVhdGUoJ2dtZDphYnN0cmFjdCcpLFxuICAgIHdyaXRlTG9jYWxpemVkQ2hhcmFjdGVyU3RyaW5nKFxuICAgICAgcmVjb3JkLmFic3RyYWN0LFxuICAgICAgcmVjb3JkLnRyYW5zbGF0aW9ucz8uYWJzdHJhY3QsXG4gICAgICByZWNvcmQuZGVmYXVsdExhbmd1YWdlXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlU3RhdHVzKHJlY29yZDogRGF0YXNldFJlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZSgnZ21kOnN0YXR1cycsICdnbWQ6TURfUHJvZ3Jlc3NDb2RlJyksXG4gICAgd3JpdGVBdHRyaWJ1dGUoXG4gICAgICAnY29kZUxpc3QnLFxuICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfUHJvZ3Jlc3NDb2RlJ1xuICAgICksXG4gICAgd3JpdGVBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCBnZXRQcm9ncmVzc0NvZGUocmVjb3JkLnN0YXR1cykpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb250YWN0cyhyZWNvcmQ6IENhdGFsb2dSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICBwaXBlKFxuICAgIHJlbW92ZUNoaWxkcmVuQnlOYW1lKCdnbWQ6Y29udGFjdCcpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgLi4ucmVjb3JkLmNvbnRhY3RzLm1hcCgoY29udGFjdCkgPT5cbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6Y29udGFjdCcpLFxuICAgICAgICAgIGFwcGVuZFJlc3BvbnNpYmxlUGFydHkoXG4gICAgICAgICAgICBjb250YWN0LFxuICAgICAgICAgICAgcmVjb3JkLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgIHJlY29yZC5kZWZhdWx0TGFuZ3VhZ2VcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb250YWN0c0ZvclJlc291cmNlKFxuICByZWNvcmQ6IENhdGFsb2dSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOnBvaW50T2ZDb250YWN0JyksXG4gICAgcmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDpjb250YWN0JyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQuY29udGFjdHNGb3JSZXNvdXJjZS5tYXAoKGNvbnRhY3QpID0+XG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnBvaW50T2ZDb250YWN0JyksXG4gICAgICAgICAgYXBwZW5kUmVzcG9uc2libGVQYXJ0eShcbiAgICAgICAgICAgIGNvbnRhY3QsXG4gICAgICAgICAgICByZWNvcmQudHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgcmVjb3JkLmRlZmF1bHRMYW5ndWFnZVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUtleXdvcmRzKHJlY29yZDogQ2F0YWxvZ1JlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVLZXl3b3JkcygpLFxuICAgIGFwcGVuZEtleXdvcmRzKHJlY29yZC5rZXl3b3JkcywgcmVjb3JkLmRlZmF1bHRMYW5ndWFnZSlcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVRvcGljcyhyZWNvcmQ6IENhdGFsb2dSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgcmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDp0b3BpY0NhdGVnb3J5JyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQudG9waWNzLm1hcCgodG9waWMpID0+XG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlTmVzdGVkRWxlbWVudCgnZ21kOnRvcGljQ2F0ZWdvcnknLCAnZ21kOk1EX1RvcGljQ2F0ZWdvcnlDb2RlJyksXG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQodG9waWMpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVMaWNlbnNlcyhyZWNvcmQ6IENhdGFsb2dSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgcmVtb3ZlTGljZW5zZXMoKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5saWNlbnNlcy5tYXAoKGxpY2Vuc2UpID0+XG4gICAgICAgIGNyZWF0ZUxpY2Vuc2UobGljZW5zZSwgcmVjb3JkLmRlZmF1bHRMYW5ndWFnZSlcbiAgICAgIClcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVMZWdhbENvbnN0cmFpbnRzKFxuICByZWNvcmQ6IENhdGFsb2dSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVMZWdhbENvbnN0cmFpbnRzKCksXG4gICAgcmVtb3ZlRW1wdHlSZXNvdXJjZUNvbnN0cmFpbnRzKCksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQubGVnYWxDb25zdHJhaW50cy5tYXAoKGMpID0+XG4gICAgICAgIGNyZWF0ZUNvbnN0cmFpbnQoYywgJ2xlZ2FsJywgcmVjb3JkLmRlZmF1bHRMYW5ndWFnZSlcbiAgICAgIClcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVTZWN1cml0eUNvbnN0cmFpbnRzKFxuICByZWNvcmQ6IENhdGFsb2dSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVTZWN1cml0eUNvbnN0cmFpbnRzKCksXG4gICAgcmVtb3ZlRW1wdHlSZXNvdXJjZUNvbnN0cmFpbnRzKCksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQuc2VjdXJpdHlDb25zdHJhaW50cy5tYXAoKGMpID0+XG4gICAgICAgIGNyZWF0ZUNvbnN0cmFpbnQoYywgJ3NlY3VyaXR5JywgcmVjb3JkLmRlZmF1bHRMYW5ndWFnZSlcbiAgICAgIClcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVPdGhlckNvbnN0cmFpbnRzKFxuICByZWNvcmQ6IENhdGFsb2dSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVPdGhlckNvbnN0cmFpbnRzKCksXG4gICAgcmVtb3ZlRW1wdHlSZXNvdXJjZUNvbnN0cmFpbnRzKCksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQub3RoZXJDb25zdHJhaW50cy5tYXAoKGMpID0+XG4gICAgICAgIGNyZWF0ZUNvbnN0cmFpbnQoYywgJ290aGVyJywgcmVjb3JkLmRlZmF1bHRMYW5ndWFnZSlcbiAgICAgIClcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVVcGRhdGVGcmVxdWVuY3koXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6cmVzb3VyY2VNYWludGVuYW5jZScpLFxuICAgIHJlbW92ZUFsbENoaWxkcmVuKCksXG4gICAgZmluZENoaWxkT3JDcmVhdGUoJ2dtZDpNRF9NYWludGVuYW5jZUluZm9ybWF0aW9uJyksXG4gICAgdHlwZW9mIHJlY29yZC51cGRhdGVGcmVxdWVuY3kgPT09ICdvYmplY3QnXG4gICAgICA/IHBpcGUoXG4gICAgICAgICAgY3JlYXRlTmVzdGVkQ2hpbGQoXG4gICAgICAgICAgICAnZ21kOnVzZXJEZWZpbmVkTWFpbnRlbmFuY2VGcmVxdWVuY3knLFxuICAgICAgICAgICAgJ2d0czpUTV9QZXJpb2REdXJhdGlvbidcbiAgICAgICAgICApLFxuICAgICAgICAgIHNldFRleHRDb250ZW50KGdldElTT0R1cmF0aW9uKHJlY29yZC51cGRhdGVGcmVxdWVuY3kpKVxuICAgICAgICApXG4gICAgICA6IHBpcGUoXG4gICAgICAgICAgY3JlYXRlTmVzdGVkQ2hpbGQoXG4gICAgICAgICAgICAnZ21kOm1haW50ZW5hbmNlQW5kVXBkYXRlRnJlcXVlbmN5JyxcbiAgICAgICAgICAgICdnbWQ6TURfTWFpbnRlbmFuY2VGcmVxdWVuY3lDb2RlJ1xuICAgICAgICAgICksXG4gICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoXG4gICAgICAgICAgICAnY29kZUxpc3QnLFxuICAgICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfTWFpbnRlbmFuY2VGcmVxdWVuY3lDb2RlJ1xuICAgICAgICAgICksXG4gICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoXG4gICAgICAgICAgICAnY29kZUxpc3RWYWx1ZScsXG4gICAgICAgICAgICBnZXRNYWludGVuYW5jZUZyZXF1ZW5jeUNvZGUocmVjb3JkLnVwZGF0ZUZyZXF1ZW5jeSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVJlY29yZFVwZGF0ZWQocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kQ2hpbGRPckNyZWF0ZSgnZ21kOmRhdGVTdGFtcCcpLFxuICAgIHJlbW92ZUFsbENoaWxkcmVuKCksXG4gICAgd3JpdGVEYXRlVGltZShyZWNvcmQucmVjb3JkVXBkYXRlZClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVSZXNvdXJjZURhdGUoXG4gIHR5cGU6ICdyZXZpc2lvbicgfCAnY3JlYXRpb24nIHwgJ3B1YmxpY2F0aW9uJ1xuKSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpjaXRhdGlvbicsICdnbWQ6Q0lfQ2l0YXRpb24nKSxcbiAgICByZW1vdmVDaGlsZHJlbihcbiAgICAgIHBpcGUoXG4gICAgICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOmRhdGUnKSxcbiAgICAgICAgZmlsdGVyQXJyYXkoXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGZpbmROZXN0ZWRFbGVtZW50KFxuICAgICAgICAgICAgICAnZ21kOkNJX0RhdGUnLFxuICAgICAgICAgICAgICAnZ21kOmRhdGVUeXBlJyxcbiAgICAgICAgICAgICAgJ2dtZDpDSV9EYXRlVHlwZUNvZGUnXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgICAgICAgICAgbWFwKCh2YWx1ZSkgPT4gdmFsdWUgPT09IHR5cGUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRSZXNvdXJjZURhdGUoXG4gIGRhdGU6IERhdGUsXG4gIHR5cGU6ICdyZXZpc2lvbicgfCAnY3JlYXRpb24nIHwgJ3B1YmxpY2F0aW9uJ1xuKSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpjaXRhdGlvbicsICdnbWQ6Q0lfQ2l0YXRpb24nKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIHBpcGUoXG4gICAgICAgIGNyZWF0ZU5lc3RlZEVsZW1lbnQoJ2dtZDpkYXRlJywgJ2dtZDpDSV9EYXRlJyksXG4gICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOmRhdGUnKSwgd3JpdGVEYXRlVGltZShkYXRlKSksXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZU5lc3RlZEVsZW1lbnQoJ2dtZDpkYXRlVHlwZScsICdnbWQ6Q0lfRGF0ZVR5cGVDb2RlJyksXG4gICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjQ0lfRGF0ZVR5cGVDb2RlJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgdHlwZSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUmVzb3VyY2VDcmVhdGVkKFxuICByZWNvcmQ6IERhdGFzZXRSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHJlbW92ZVJlc291cmNlRGF0ZSgnY3JlYXRpb24nKShyb290RWwpXG4gIGlmICghcmVjb3JkLnJlc291cmNlQ3JlYXRlZCkgcmV0dXJuXG4gIGFwcGVuZFJlc291cmNlRGF0ZShyZWNvcmQucmVzb3VyY2VDcmVhdGVkLCAnY3JlYXRpb24nKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVJlc291cmNlVXBkYXRlZChcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICByZW1vdmVSZXNvdXJjZURhdGUoJ3JldmlzaW9uJykocm9vdEVsKVxuICBpZiAoIXJlY29yZC5yZXNvdXJjZVVwZGF0ZWQpIHJldHVyblxuICBhcHBlbmRSZXNvdXJjZURhdGUocmVjb3JkLnJlc291cmNlVXBkYXRlZCwgJ3JldmlzaW9uJykocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVSZXNvdXJjZVB1Ymxpc2hlZChcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICByZW1vdmVSZXNvdXJjZURhdGUoJ3B1YmxpY2F0aW9uJykocm9vdEVsKVxuICBpZiAoIXJlY29yZC5yZXNvdXJjZVB1Ymxpc2hlZCkgcmV0dXJuXG4gIGFwcGVuZFJlc291cmNlRGF0ZShyZWNvcmQucmVzb3VyY2VQdWJsaXNoZWQsICdwdWJsaWNhdGlvbicpKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUmV1c2VUeXBlKHJlY29yZDogQ2F0YWxvZ1JlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHdyaXRlS2luZChyZWNvcmQsIHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlU3BhdGlhbFJlcHJlc2VudGF0aW9uKFxuICByZWNvcmQ6IERhdGFzZXRSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIGlmICghcmVjb3JkLnNwYXRpYWxSZXByZXNlbnRhdGlvbikge1xuICAgIHBpcGUoXG4gICAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgICAgcmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDpzcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlJylcbiAgICApKHJvb3RFbClcbiAgICByZXR1cm5cbiAgfVxuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoXG4gICAgICAnZ21kOnNwYXRpYWxSZXByZXNlbnRhdGlvblR5cGUnLFxuICAgICAgJ2dtZDpNRF9TcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlQ29kZSdcbiAgICApLFxuICAgIHdyaXRlQXR0cmlidXRlKFxuICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI01EX1NwYXRpYWxSZXByZXNlbnRhdGlvblR5cGVDb2RlJ1xuICAgICksXG4gICAgd3JpdGVBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCByZWNvcmQuc3BhdGlhbFJlcHJlc2VudGF0aW9uKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlR3JhcGhpY092ZXJ2aWV3cyhcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgcmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDpncmFwaGljT3ZlcnZpZXcnKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5vdmVydmlld3MubWFwKChvdmVydmlldykgPT5cbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVOZXN0ZWRFbGVtZW50KCdnbWQ6Z3JhcGhpY092ZXJ2aWV3JywgJ2dtZDpNRF9Ccm93c2VHcmFwaGljJyksXG4gICAgICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZmlsZU5hbWUnKSxcbiAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcob3ZlcnZpZXcudXJsLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICAnZGVzY3JpcHRpb24nIGluIG92ZXJ2aWV3XG4gICAgICAgICAgICA/IGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZmlsZURlc2NyaXB0aW9uJyksXG4gICAgICAgICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhvdmVydmlldy5kZXNjcmlwdGlvbilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogbm9vcFxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlTGluZWFnZShyZWNvcmQ6IERhdGFzZXRSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICBwaXBlKFxuICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKFxuICAgICAgJ2dtZDpkYXRhUXVhbGl0eUluZm8nLFxuICAgICAgJ2dtZDpEUV9EYXRhUXVhbGl0eScsXG4gICAgICAnZ21kOmxpbmVhZ2UnLFxuICAgICAgJ2dtZDpMSV9MaW5lYWdlJyxcbiAgICAgICdnbWQ6c3RhdGVtZW50J1xuICAgICksXG4gICAgd3JpdGVMb2NhbGl6ZWRDaGFyYWN0ZXJTdHJpbmcoXG4gICAgICByZWNvcmQubGluZWFnZSxcbiAgICAgIHJlY29yZC50cmFuc2xhdGlvbnM/LmxpbmVhZ2UsXG4gICAgICByZWNvcmQuZGVmYXVsdExhbmd1YWdlXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcnZpY2VFbmRwb2ludFByb3RvY29sKGVuZHBvaW50OiBTZXJ2aWNlRW5kcG9pbnQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKGVuZHBvaW50LnByb3RvY29sLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICd3ZnMnOlxuICAgICAgcmV0dXJuICdPR0M6V0ZTJ1xuICAgIGNhc2UgJ3dtcyc6XG4gICAgICByZXR1cm4gJ09HQzpXTVMnXG4gICAgY2FzZSAnd3BzJzpcbiAgICAgIHJldHVybiAnT0dDOldQUydcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGVuZHBvaW50LnByb3RvY29sXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9ubGluZVJlc291cmNlKG9ubGluZVJlc291cmNlOiBTZXJ2aWNlT25saW5lUmVzb3VyY2UpIHtcbiAgbGV0IGxpbmthZ2VVcmwsIGZ1bmN0aW9uQ29kZSwgcHJvdG9jb2xcbiAgaWYgKG9ubGluZVJlc291cmNlLnR5cGUgPT09ICdlbmRwb2ludCcpIHtcbiAgICBsaW5rYWdlVXJsID0gb25saW5lUmVzb3VyY2UuZW5kcG9pbnRVcmwudG9TdHJpbmcoKVxuICAgIHByb3RvY29sID0gZ2V0U2VydmljZUVuZHBvaW50UHJvdG9jb2wob25saW5lUmVzb3VyY2UpXG4gICAgZnVuY3Rpb25Db2RlID0gJ2Rvd25sb2FkJ1xuICB9IGVsc2Uge1xuICAgIGxpbmthZ2VVcmwgPSBvbmxpbmVSZXNvdXJjZS51cmwudG9TdHJpbmcoKVxuICAgIGZ1bmN0aW9uQ29kZSA9ICdpbmZvcm1hdGlvbidcbiAgICBwcm90b2NvbCA9ICdXV1c6TElOSydcbiAgfVxuICBjb25zdCBhcHBlbmRUcmFuc2Zlck9wdGlvbnMgPSBhcHBlbmRDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnRyYW5zZmVyT3B0aW9ucycpLFxuICAgICAgY3JlYXRlTmVzdGVkQ2hpbGQoXG4gICAgICAgICdnbWQ6TURfRGlnaXRhbFRyYW5zZmVyT3B0aW9ucycsXG4gICAgICAgICdnbWQ6b25MaW5lJyxcbiAgICAgICAgJ2dtZDpDSV9PbmxpbmVSZXNvdXJjZSdcbiAgICAgICksXG4gICAgICB3cml0ZUxpbmthZ2UobGlua2FnZVVybCksXG4gICAgICAnZGVzY3JpcHRpb24nIGluIG9ubGluZVJlc291cmNlXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZGVzY3JpcHRpb24nKSxcbiAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcob25saW5lUmVzb3VyY2UuZGVzY3JpcHRpb24pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICAnbmFtZScgaW4gb25saW5lUmVzb3VyY2VcbiAgICAgICAgPyBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpuYW1lJyksXG4gICAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKG9ubGluZVJlc291cmNlLm5hbWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgcGlwZShjcmVhdGVFbGVtZW50KCdnbWQ6cHJvdG9jb2wnKSwgd3JpdGVDaGFyYWN0ZXJTdHJpbmcocHJvdG9jb2wpKSxcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVOZXN0ZWRFbGVtZW50KCdnbWQ6ZnVuY3Rpb24nLCAnZ21kOkNJX09uTGluZUZ1bmN0aW9uQ29kZScpLFxuICAgICAgICAgIHdyaXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI0NJX09uTGluZUZ1bmN0aW9uQ29kZSdcbiAgICAgICAgICApLFxuICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgZnVuY3Rpb25Db2RlKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG4gIHJldHVybiBwaXBlKFxuICAgIGNyZWF0ZU5lc3RlZEVsZW1lbnQoJ2dtZDpkaXN0cmlidXRpb25JbmZvJywgJ2dtZDpNRF9EaXN0cmlidXRpb24nKSxcbiAgICBhcHBlbmRUcmFuc2Zlck9wdGlvbnNcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kRGF0YXNldE9ubGluZVJlc291cmNlcyhcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBhcHBlbmRDaGlsZHJlbihcbiAgICAuLi5yZWNvcmQub25saW5lUmVzb3VyY2VzLm1hcCgoZCkgPT5cbiAgICAgIHBpcGUoXG4gICAgICAgIGNyZWF0ZURpc3RyaWJ1dGlvbkluZm8oKSxcbiAgICAgICAgYXBwZW5kT25saW5lUmVzb3VyY2UoXG4gICAgICAgICAgZCxcbiAgICAgICAgICBhcHBlbmRPbmxpbmVSZXNvdXJjZUZvcm1hdCxcbiAgICAgICAgICByZWNvcmQudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHJlY29yZC5kZWZhdWx0TGFuZ3VhZ2VcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRTZXJ2aWNlT25saW5lUmVzb3VyY2VzKFxuICByZWNvcmQ6IFNlcnZpY2VSZWNvcmQgfCBSZXVzZVJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgYXBwZW5kQ2hpbGRyZW4oLi4ucmVjb3JkLm9ubGluZVJlc291cmNlcy5tYXAoY3JlYXRlT25saW5lUmVzb3VyY2UpKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZU9ubGluZVJlc291cmNlcyhcbiAgcmVjb3JkOiBDYXRhbG9nUmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICByZW1vdmVPbmxpbmVSZXNvdXJjZXMoKShyb290RWwpXG5cbiAgaWYgKHJlY29yZC5raW5kID09PSAnZGF0YXNldCcpIHtcbiAgICBhcHBlbmREYXRhc2V0T25saW5lUmVzb3VyY2VzKHJlY29yZCwgcm9vdEVsKVxuICAgIHJldHVyblxuICB9XG4gIGFwcGVuZFNlcnZpY2VPbmxpbmVSZXNvdXJjZXMocmVjb3JkLCByb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVRlbXBvcmFsRXh0ZW50cyhcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpleHRlbnQnLCAnZ21kOkVYX0V4dGVudCcpLFxuICAgIHJlbW92ZUNoaWxkcmVuQnlOYW1lKCdnbWQ6dGVtcG9yYWxFbGVtZW50JyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQudGVtcG9yYWxFeHRlbnRzLm1hcCgoZXh0ZW50KSA9PlxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGNyZWF0ZU5lc3RlZEVsZW1lbnQoJ2dtZDp0ZW1wb3JhbEVsZW1lbnQnLCAnZ21kOkVYX1RlbXBvcmFsRXh0ZW50JyksXG4gICAgICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICAnc3RhcnQnIGluIGV4dGVudCAmJiAnZW5kJyBpbiBleHRlbnRcbiAgICAgICAgICAgICAgPyBwaXBlKFxuICAgICAgICAgICAgICAgICAgY3JlYXRlTmVzdGVkRWxlbWVudCgnZ21kOmV4dGVudCcsICdnbWw6VGltZVBlcmlvZCcpLFxuICAgICAgICAgICAgICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21sOmJlZ2luUG9zaXRpb24nKSxcbiAgICAgICAgICAgICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50LnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gc2V0VGV4dENvbnRlbnQoZm9ybWF0KGV4dGVudC5zdGFydCwgJ3l5eXktTU0tZGQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB3cml0ZUF0dHJpYnV0ZSgnaW5kZXRlcm1pbmF0ZVBvc2l0aW9uJywgJ3Vua25vd24nKVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWw6ZW5kUG9zaXRpb24nKSxcbiAgICAgICAgICAgICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50LmVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNldFRleHRDb250ZW50KGZvcm1hdChleHRlbnQuZW5kLCAneXl5eS1NTS1kZCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHdyaXRlQXR0cmlidXRlKCdpbmRldGVybWluYXRlUG9zaXRpb24nLCAndW5rbm93bicpXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IHBpcGUoXG4gICAgICAgICAgICAgICAgICBjcmVhdGVOZXN0ZWRFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAnZ21kOmV4dGVudCcsXG4gICAgICAgICAgICAgICAgICAgICdnbWw6VGltZUluc3RhbnQnLFxuICAgICAgICAgICAgICAgICAgICAnZ21sOnRpbWVQb3NpdGlvbidcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBleHRlbnQuc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgPyBzZXRUZXh0Q29udGVudChmb3JtYXQoZXh0ZW50LnN0YXJ0LCAneXl5eS1NTS1kZCcpKVxuICAgICAgICAgICAgICAgICAgICA6IHdyaXRlQXR0cmlidXRlKCdpbmRldGVybWluYXRlUG9zaXRpb24nLCAndW5rbm93bicpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVNwYXRpYWxFeHRlbnRzKHJlY29yZDogRGF0YXNldFJlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIGNvbnN0IGFwcGVuZEJvdW5kaW5nUG9seWdvbiA9IChnZW9tZXRyeT86IEdlb21ldHJ5KSA9PiB7XG4gICAgaWYgKCFnZW9tZXRyeSkgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpFWF9Cb3VuZGluZ1BvbHlnb24nKSxcbiAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpwb2x5Z29uJyksXG4gICAgICAgICAgYXBwZW5kQ2hpbGRyZW4oKCkgPT4gd3JpdGVHZW9tZXRyeShnZW9tZXRyeSkpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIH1cblxuICBjb25zdCBhcHBlbmRHZW9ncmFwaGljQm91bmRpbmdCb3ggPSAoXG4gICAgYmJveD86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdXG4gICkgPT4ge1xuICAgIGlmICghYmJveCkgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpFWF9HZW9ncmFwaGljQm91bmRpbmdCb3gnKSxcbiAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICBwaXBlKGNyZWF0ZUVsZW1lbnQoJ2dtZDp3ZXN0Qm91bmRMb25naXR1ZGUnKSwgd3JpdGVEZWNpbWFsKGJib3hbMF0pKSxcbiAgICAgICAgcGlwZShjcmVhdGVFbGVtZW50KCdnbWQ6ZWFzdEJvdW5kTG9uZ2l0dWRlJyksIHdyaXRlRGVjaW1hbChiYm94WzJdKSksXG4gICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOnNvdXRoQm91bmRMYXRpdHVkZScpLCB3cml0ZURlY2ltYWwoYmJveFsxXSkpLFxuICAgICAgICBwaXBlKGNyZWF0ZUVsZW1lbnQoJ2dtZDpub3J0aEJvdW5kTGF0aXR1ZGUnKSwgd3JpdGVEZWNpbWFsKGJib3hbM10pKVxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGFwcGVuZEdlb2dyYXBoaWNEZXNjcmlwdGlvbiA9IChcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICB0cmFuc2xhdGlvbnM/OiBGaWVsZFRyYW5zbGF0aW9uXG4gICkgPT4ge1xuICAgIGlmICghZGVzY3JpcHRpb24pIHJldHVybiBudWxsXG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICBjcmVhdGVOZXN0ZWRFbGVtZW50KFxuICAgICAgICAnZ21kOkVYX0dlb2dyYXBoaWNEZXNjcmlwdGlvbicsXG4gICAgICAgICdnbWQ6Z2VvZ3JhcGhpY0lkZW50aWZpZXInLFxuICAgICAgICAnZ21kOk1EX0lkZW50aWZpZXInLFxuICAgICAgICAnZ21kOmNvZGUnXG4gICAgICApLFxuICAgICAgd3JpdGVMb2NhbGl6ZWRDaGFyYWN0ZXJTdHJpbmcoXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICB0cmFuc2xhdGlvbnMsXG4gICAgICAgIHJlY29yZC5kZWZhdWx0TGFuZ3VhZ2VcbiAgICAgIClcbiAgICApXG4gIH1cblxuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpleHRlbnQnLCAnZ21kOkVYX0V4dGVudCcpLFxuICAgIHJlbW92ZUNoaWxkcmVuQnlOYW1lKCdnbWQ6Z2VvZ3JhcGhpY0VsZW1lbnQnKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5zcGF0aWFsRXh0ZW50cy5tYXAoKGV4dGVudCkgPT5cbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6Z2VvZ3JhcGhpY0VsZW1lbnQnKSxcbiAgICAgICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIGFwcGVuZEJvdW5kaW5nUG9seWdvbihleHRlbnQuZ2VvbWV0cnkpLFxuICAgICAgICAgICAgYXBwZW5kR2VvZ3JhcGhpY0JvdW5kaW5nQm94KGV4dGVudC5iYm94KSxcbiAgICAgICAgICAgIGFwcGVuZEdlb2dyYXBoaWNEZXNjcmlwdGlvbihcbiAgICAgICAgICAgICAgZXh0ZW50LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBleHRlbnQudHJhbnNsYXRpb25zPy5kZXNjcmlwdGlvblxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUxhbmd1YWdlcyhyZWNvcmQ6IERhdGFzZXRSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICAvLyBjbGVhciBleGlzdGluZ1xuICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOmxvY2FsZScpKHJvb3RFbClcblxuICAvLyBkbyBub3Qgd3JpdGUgZG93biBsYW5ndWFnZXMgaWYgdGhlcmUgaXMgbm90aGluZyBlbHNlIHRoYW4gdGhlIGRlZmF1bHQgb25lXG4gIGlmICghcmVjb3JkLm90aGVyTGFuZ3VhZ2VzPy5sZW5ndGgpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZUxhbmd1YWdlRWwgPSAobGFuZzogTGFuZ3VhZ2VDb2RlKSA9PlxuICAgIHBpcGUoXG4gICAgICBjcmVhdGVOZXN0ZWRFbGVtZW50KCdnbWQ6bG9jYWxlJywgJ2dtZDpQVF9Mb2NhbGUnKSxcbiAgICAgIHdyaXRlQXR0cmlidXRlKCdpZCcsIGxhbmcudG9VcHBlckNhc2UoKSksXG4gICAgICBjcmVhdGVOZXN0ZWRDaGlsZCgnZ21kOmxhbmd1YWdlQ29kZScsICdnbWQ6TGFuZ3VhZ2VDb2RlJyksXG4gICAgICB3cml0ZUF0dHJpYnV0ZSgnY29kZUxpc3QnLCAnaHR0cDovL3d3dy5sb2MuZ292L3N0YW5kYXJkcy9pc282MzktMi8nKSxcbiAgICAgIHdyaXRlQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgTEFOR18yX1RPXzNfTUFQUEVSW2xhbmddKVxuICAgIClcblxuICAvLyBhZGQgbmV3IGxhbmd1YWdlcyAob25seSBpZiBvdGhlciB0aGFuIGRlZmF1bHQgb25lKVxuICBhcHBlbmRDaGlsZHJlbihcbiAgICBjcmVhdGVMYW5ndWFnZUVsKHJlY29yZC5kZWZhdWx0TGFuZ3VhZ2UpLFxuICAgIC4uLnJlY29yZC5vdGhlckxhbmd1YWdlcy5tYXAoY3JlYXRlTGFuZ3VhZ2VFbClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURlZmF1bHRMYW5ndWFnZShcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBjb25zdCBsYW5nMyA9IExBTkdfMl9UT18zX01BUFBFUltyZWNvcmQuZGVmYXVsdExhbmd1YWdlLnRvTG93ZXJDYXNlKCldXG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6bGFuZ3VhZ2UnLCAnZ21kOkxhbmd1YWdlQ29kZScpLFxuICAgIHdyaXRlQXR0cmlidXRlKCdjb2RlTGlzdCcsICdodHRwOi8vd3d3LmxvYy5nb3Yvc3RhbmRhcmRzL2lzbzYzOS0yLycpLFxuICAgIHdyaXRlQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgbGFuZzMpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVSZXNvdXJjZUlkZW50aWZpZXIoXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6Y2l0YXRpb24nLCAnZ21kOkNJX0NpdGF0aW9uJyksXG4gICAgcmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDppZGVudGlmaWVyJyksXG4gICAgcmVjb3JkLnJlc291cmNlSWRlbnRpZmllclxuICAgICAgPyBwaXBlKFxuICAgICAgICAgIGNyZWF0ZU5lc3RlZENoaWxkKCdnbWQ6aWRlbnRpZmllcicsICdnbWQ6TURfSWRlbnRpZmllcicsICdnbWQ6Y29kZScpLFxuICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKHJlY29yZC5yZXNvdXJjZUlkZW50aWZpZXIpXG4gICAgICAgIClcbiAgICAgIDogbm9vcFxuICApKHJvb3RFbClcbn1cbiJdfQ==
|