@igo2/geo 18.0.0-next.8 → 18.0.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/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +4 -6
- package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +13 -10
- package/esm2022/lib/datasource/shared/capabilities.service.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +9 -1
- package/esm2022/lib/datasource/shared/datasources/carto-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +4 -1
- package/esm2022/lib/datasource/shared/datasources/osm-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +1 -1
- package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +151 -102
- package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +177 -83
- package/esm2022/lib/directions/directions-results/directions-results.component.mjs +93 -44
- package/esm2022/lib/directions/directions-sources/directions-source.mjs +1 -1
- package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +1 -1
- package/esm2022/lib/directions/directions.component.mjs +55 -31
- package/esm2022/lib/directions/shared/directions.enum.mjs +51 -7
- package/esm2022/lib/directions/shared/directions.interface.mjs +1 -1
- package/esm2022/lib/directions/shared/directions.service.mjs +122 -96
- package/esm2022/lib/directions/shared/directions.utils.mjs +281 -318
- package/esm2022/lib/directions/shared/store.mjs +2 -2
- package/esm2022/lib/download/download-button/download-button.component.mjs +8 -20
- package/esm2022/lib/download/shared/download.service.mjs +1 -1
- package/esm2022/lib/draw/draw/draw-popup.component.mjs +1 -1
- package/esm2022/lib/draw/draw/draw.component.mjs +5 -12
- package/esm2022/lib/draw/shared/draw.utils.mjs +1 -1
- package/esm2022/lib/environment/environment.interface.mjs +1 -1
- package/esm2022/lib/feature/feature-details/feature-details.component.mjs +2 -2
- package/esm2022/lib/feature/shared/feature-store.utils.mjs +7 -6
- package/esm2022/lib/feature/shared/feature.interfaces.mjs +1 -1
- package/esm2022/lib/feature/shared/store.mjs +1 -1
- package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +3 -3
- package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +7 -4
- package/esm2022/lib/feature/shared/strategies/selection.mjs +5 -4
- package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +3 -3
- package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +2 -2
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +5 -3
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +1 -1
- package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +8 -1
- package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +1 -1
- package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +2 -8
- package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +2 -8
- package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +2 -2
- package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +13 -10
- package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +2 -2
- package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +4 -2
- package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +5 -16
- package/esm2022/lib/import-export/export-button/export-button.component.mjs +4 -17
- package/esm2022/lib/import-export/import-export/import-export.component.mjs +23 -12
- package/esm2022/lib/import-export/shared/export.service.mjs +7 -4
- package/esm2022/lib/import-export/shared/import.utils.mjs +3 -3
- package/esm2022/lib/layer/index.mjs +10 -5
- package/esm2022/lib/layer/layer-group/index.mjs +2 -0
- package/esm2022/lib/layer/layer-group/layer-group.component.mjs +103 -0
- package/esm2022/lib/layer/layer-item/layer-item.component.mjs +61 -128
- package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +5 -8
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +5 -6
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +14 -21
- package/esm2022/lib/layer/layer-list/index.mjs +1 -3
- package/esm2022/lib/layer/layer-list/layer-list.component.mjs +176 -775
- package/esm2022/lib/layer/layer-list-tool/index.mjs +1 -2
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +51 -84
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +7 -2
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +56 -16
- package/esm2022/lib/layer/layer-search/index.mjs +2 -0
- package/esm2022/lib/layer/layer-search/layer-search.component.mjs +65 -0
- package/esm2022/lib/layer/layer-unavailable/index.mjs +3 -0
- package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +25 -0
- package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +35 -0
- package/esm2022/lib/layer/layer-viewer/index.mjs +3 -0
- package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +226 -0
- package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +2 -0
- package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +2 -0
- package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +207 -0
- package/esm2022/lib/layer/layer-visibility-button/index.mjs +2 -0
- package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +83 -0
- package/esm2022/lib/layer/layer.module.mjs +51 -33
- package/esm2022/lib/layer/shared/index.mjs +2 -1
- package/esm2022/lib/layer/shared/layer-controller.mjs +316 -0
- package/esm2022/lib/layer/shared/layer-selection.mjs +38 -0
- package/esm2022/lib/layer/shared/layer.service.mjs +56 -14
- package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
- package/esm2022/lib/layer/shared/layers/any-layer.mjs +1 -1
- package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +1 -1
- package/esm2022/lib/layer/shared/layers/image-layer.mjs +8 -3
- package/esm2022/lib/layer/shared/layers/index.mjs +6 -1
- package/esm2022/lib/layer/shared/layers/layer-base.mjs +199 -0
- package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/layer-group.mjs +120 -0
- package/esm2022/lib/layer/shared/layers/layer.interface.mjs +1 -11
- package/esm2022/lib/layer/shared/layers/layer.mjs +113 -113
- package/esm2022/lib/layer/shared/layers/linked/index.mjs +4 -0
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +12 -0
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +242 -0
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +70 -0
- package/esm2022/lib/layer/shared/layers/tile-layer.mjs +8 -3
- package/esm2022/lib/layer/shared/layers/vector-layer.mjs +9 -3
- package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +8 -3
- package/esm2022/lib/layer/utils/layer.utils.mjs +47 -1
- package/esm2022/lib/layer/utils/outputLegend.mjs +5 -1
- package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +3 -3
- package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +8 -6
- package/esm2022/lib/map/map-center/map-center.component.mjs +1 -2
- package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +1 -1
- package/esm2022/lib/map/shared/controllers/view.mjs +1 -1
- package/esm2022/lib/map/shared/hover-feature.directive.mjs +1 -9
- package/esm2022/lib/map/shared/linkedLayers.utils.mjs +113 -123
- package/esm2022/lib/map/shared/map.abstract.mjs +4 -3
- package/esm2022/lib/map/shared/map.mjs +7 -243
- package/esm2022/lib/map/shared/map.service.mjs +1 -1
- package/esm2022/lib/map/shared/map.utils.mjs +3 -3
- package/esm2022/lib/map/shared/mapOffline.directive.mjs +9 -5
- package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +1 -3
- package/esm2022/lib/map/utils/index.mjs +2 -0
- package/esm2022/lib/map/utils/layer-watcher.mjs +45 -13
- package/esm2022/lib/measure/measurer/measurer.component.mjs +7 -25
- package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +6 -18
- package/esm2022/lib/offline/offline.provider.mjs +10 -11
- package/esm2022/lib/print/shared/print.service.mjs +3 -3
- package/esm2022/lib/query/shared/query.directive.mjs +9 -5
- package/esm2022/lib/query/shared/query.service.mjs +7 -7
- package/esm2022/lib/query/shared/query.utils.mjs +5 -1
- package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +15 -9
- package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +1 -10
- package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +1 -1
- package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +1 -1
- package/esm2022/lib/search/shared/sources/workspace.mjs +1 -1
- package/esm2022/lib/workspace/shared/edition-workspace.mjs +6 -4
- package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +19 -17
- package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +17 -2
- package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +22 -4
- package/esm2022/lib/workspace/shared/workspace.utils.mjs +6 -3
- package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +2 -2
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +6 -2
- package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +4 -3
- package/fesm2022/igo2-geo.mjs +22502 -21440
- package/fesm2022/igo2-geo.mjs.map +1 -1
- package/lib/datasource/shared/capabilities.service.d.ts +7 -2
- package/lib/datasource/shared/datasources/any-datasource.interface.d.ts +1 -0
- package/lib/datasource/shared/datasources/arcgisrest-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/carto-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/carto-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/cluster-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/cluster-datasource.interface.d.ts +0 -1
- package/lib/datasource/shared/datasources/datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/datasource.interface.d.ts +1 -2
- package/lib/datasource/shared/datasources/feature-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/feature-datasource.interface.d.ts +0 -3
- package/lib/datasource/shared/datasources/imagearcgisrest-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/mvt-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/mvt-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/osm-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/tilearcgisrest-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/tiledebug-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/wfs-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/wfs-datasource.interface.d.ts +3 -4
- package/lib/datasource/shared/datasources/wms-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +6 -6
- package/lib/datasource/shared/datasources/wmts-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/xyz-datasource.interface.d.ts +0 -2
- package/lib/directions/directions-buttons/directions-buttons.component.d.ts +57 -20
- package/lib/directions/directions-inputs/directions-inputs.component.d.ts +115 -13
- package/lib/directions/directions-results/directions-results.component.d.ts +50 -16
- package/lib/directions/directions-sources/directions-source.d.ts +2 -2
- package/lib/directions/directions-sources/osrm-directions-source.d.ts +2 -2
- package/lib/directions/directions.component.d.ts +5 -5
- package/lib/directions/shared/directions.enum.d.ts +42 -1
- package/lib/directions/shared/directions.interface.d.ts +50 -25
- package/lib/directions/shared/directions.service.d.ts +46 -8
- package/lib/directions/shared/directions.utils.d.ts +102 -23
- package/lib/directions/shared/store.d.ts +3 -3
- package/lib/download/download-button/download-button.component.d.ts +4 -8
- package/lib/download/shared/download.service.d.ts +1 -1
- package/lib/draw/draw/draw.component.d.ts +2 -2
- package/lib/draw/shared/draw.utils.d.ts +2 -1
- package/lib/environment/environment.interface.d.ts +2 -0
- package/lib/feature/shared/feature-store.utils.d.ts +1 -1
- package/lib/feature/shared/feature.interfaces.d.ts +1 -1
- package/lib/feature/shared/store.d.ts +1 -1
- package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +1 -1
- package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +1 -1
- package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +1 -1
- package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +2 -2
- package/lib/filter/shared/filterable-datasource.pipe.d.ts +2 -2
- package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +3 -3
- package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +3 -5
- package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +3 -5
- package/lib/filter/time-filter-button/time-filter-button.component.d.ts +1 -1
- package/lib/filter/time-filter-form/time-filter-form.component.d.ts +5 -5
- package/lib/filter/time-filter-item/time-filter-item.component.d.ts +1 -1
- package/lib/filter/time-filter-list/time-filter-list.component.d.ts +2 -7
- package/lib/import-export/export-button/export-button.component.d.ts +3 -7
- package/lib/import-export/import-export/import-export.component.d.ts +1 -2
- package/lib/import-export/shared/export.service.d.ts +2 -2
- package/lib/layer/index.d.ts +9 -4
- package/lib/layer/layer-group/index.d.ts +1 -0
- package/lib/layer/layer-group/layer-group.component.d.ts +30 -0
- package/lib/layer/layer-item/layer-item.component.d.ts +19 -38
- package/lib/layer/layer-legend/layer-legend.component.d.ts +2 -5
- package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +6 -7
- package/lib/layer/layer-list/index.d.ts +0 -2
- package/lib/layer/layer-list/layer-list.component.d.ts +51 -123
- package/lib/layer/layer-list-tool/index.d.ts +0 -1
- package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +19 -26
- package/lib/layer/layer-list-tool/layer-list-tool.interface.d.ts +5 -1
- package/lib/layer/layer-list-tool/layer-list-tool.service.d.ts +9 -8
- package/lib/layer/layer-search/index.d.ts +1 -0
- package/lib/layer/layer-search/layer-search.component.d.ts +16 -0
- package/lib/layer/layer-unavailable/index.d.ts +2 -0
- package/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.d.ts +10 -0
- package/lib/layer/layer-unavailable/layer-unavailable.component.d.ts +11 -0
- package/lib/layer/layer-viewer/index.d.ts +2 -0
- package/lib/layer/layer-viewer/layer-viewer.component.d.ts +52 -0
- package/lib/layer/layer-viewer/layer-viewer.interface.d.ts +22 -0
- package/lib/layer/layer-viewer-bottom-actions/index.d.ts +1 -0
- package/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.d.ts +44 -0
- package/lib/layer/layer-visibility-button/index.d.ts +1 -0
- package/lib/layer/layer-visibility-button/layer-visibility-button.component.d.ts +22 -0
- package/lib/layer/layer.module.d.ts +18 -6
- package/lib/layer/shared/index.d.ts +1 -0
- package/lib/layer/shared/layer-controller.d.ts +81 -0
- package/lib/layer/shared/layer-selection.d.ts +14 -0
- package/lib/layer/shared/layer.service.d.ts +12 -3
- package/lib/layer/shared/layers/any-layer.d.ts +3 -6
- package/lib/layer/shared/layers/any-layer.interface.d.ts +8 -6
- package/lib/layer/shared/layers/image-layer.d.ts +5 -2
- package/lib/layer/shared/layers/image-layer.interface.d.ts +1 -4
- package/lib/layer/shared/layers/index.d.ts +5 -0
- package/lib/layer/shared/layers/layer-base.d.ts +75 -0
- package/lib/layer/shared/layers/layer-group.d.ts +32 -0
- package/lib/layer/shared/layers/layer-group.interface.d.ts +8 -0
- package/lib/layer/shared/layers/layer.d.ts +27 -44
- package/lib/layer/shared/layers/layer.interface.d.ts +23 -41
- package/lib/layer/shared/layers/linked/index.d.ts +3 -0
- package/lib/layer/shared/layers/linked/linked-layer.d.ts +35 -0
- package/lib/layer/shared/layers/linked/linked-layer.interface.d.ts +32 -0
- package/lib/layer/shared/layers/linked/linked-layer.utils.d.ts +9 -0
- package/lib/layer/shared/layers/tile-layer.d.ts +5 -2
- package/lib/layer/shared/layers/vector-layer.d.ts +7 -3
- package/lib/layer/shared/layers/vectortile-layer.d.ts +5 -2
- package/lib/layer/utils/layer.utils.d.ts +12 -2
- package/lib/layer/utils/outputLegend.d.ts +2 -2
- package/lib/map/shared/controllers/geolocation.interface.d.ts +2 -1
- package/lib/map/shared/hover-feature.directive.d.ts +0 -1
- package/lib/map/shared/linkedLayers.utils.d.ts +13 -17
- package/lib/map/shared/map.abstract.d.ts +12 -29
- package/lib/map/shared/map.d.ts +10 -85
- package/lib/map/shared/map.service.d.ts +1 -1
- package/lib/map/shared/map.utils.d.ts +5 -3
- package/lib/map/utils/index.d.ts +1 -0
- package/lib/map/utils/layer-watcher.d.ts +18 -8
- package/lib/measure/measurer/measurer.component.d.ts +0 -8
- package/lib/metadata/metadata-button/metadata-button.component.d.ts +3 -7
- package/lib/offline/offline.provider.d.ts +1 -1
- package/lib/query/shared/query.service.d.ts +1 -1
- package/lib/query/shared/query.utils.d.ts +2 -1
- package/lib/search/search-results/search-results-add-button.component.d.ts +1 -1
- package/lib/search/shared/search-pointer-summary.directive.d.ts +0 -1
- package/lib/search/shared/sources/cadastre.providers.d.ts +1 -1
- package/lib/search/shared/sources/coordinates.providers.d.ts +1 -1
- package/lib/search/shared/sources/icherche.providers.d.ts +1 -1
- package/lib/search/shared/sources/ilayer.interfaces.d.ts +1 -1
- package/lib/search/shared/sources/ilayer.providers.d.ts +1 -1
- package/lib/search/shared/sources/nominatim.providers.d.ts +1 -1
- package/lib/search/shared/sources/storedqueries.providers.d.ts +2 -2
- package/lib/search/shared/sources/workspace.interfaces.d.ts +1 -1
- package/lib/search/shared/sources/workspace.providers.d.ts +1 -1
- package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +1 -1
- package/locale/en.geo.json +106 -89
- package/locale/fr.geo.json +105 -89
- package/package.json +5 -5
- package/src/geo-theme.scss +1 -1
- package/src/lib/directions/directions-inputs/directions-inputs.theming.scss +21 -0
- package/src/lib/directions/directions.theming.scss +2 -0
- package/src/lib/layer/layer-group/layer-group.theme.scss +28 -0
- package/src/lib/layer/layer-item/layer-item.theme.scss +12 -9
- package/src/lib/layer/layer-legend/layer-legend.theme.scss +30 -0
- package/src/lib/layer/layer-list/layer-list.theme.scss +50 -0
- package/src/lib/layer/layer-unavailable/layer-unavailable.theme.scss +19 -0
- package/src/lib/layer/layer-viewer/_layer-viewer.theme.scss +16 -0
- package/src/lib/layer/layer-visibility-button/layer-visibility-button.theme.scss +27 -0
- package/src/lib/layer/layer.theming.scss +14 -3
- package/esm2022/lib/layer/layer-list/layer-list-binding.directive.mjs +0 -70
- package/esm2022/lib/layer/layer-list/layer-list.enum.mjs +0 -19
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +0 -7
- package/lib/layer/layer-list/layer-list-binding.directive.d.ts +0 -19
- package/lib/layer/layer-list/layer-list.enum.d.ts +0 -15
- package/lib/layer/layer-list-tool/layer-list-tool.enum.d.ts +0 -5
- package/src/lib/layer/layer-legend/layer-legend.theming.scss +0 -10
|
@@ -14,10 +14,10 @@ import { IgoLanguageModule } from '@igo2/core/language';
|
|
|
14
14
|
import * as olObservable from 'ol/Observable';
|
|
15
15
|
import * as olProj from 'ol/proj';
|
|
16
16
|
import pointOnFeature from '@turf/point-on-feature';
|
|
17
|
-
import { roundCoordTo } from '../../map/shared/map.utils';
|
|
18
|
-
import {
|
|
19
|
-
import { computeRelativePosition, removeStopFromStore, updateStoreSorting } from '../shared/directions.utils';
|
|
17
|
+
import { roundCoordTo, roundCoordToString } from '../../map/shared/map.utils';
|
|
18
|
+
import { addStopToStore, computeRelativePosition, removeStopFromStore, updateStoreSorting } from '../shared/directions.utils';
|
|
20
19
|
import { StopsFeatureStore, StopsStore } from '../shared/store';
|
|
20
|
+
import { DirectionRelativePositionType } from './../shared/directions.enum';
|
|
21
21
|
import * as i0 from "@angular/core";
|
|
22
22
|
import * as i1 from "@igo2/core/language";
|
|
23
23
|
import * as i2 from "@angular/material/form-field";
|
|
@@ -31,10 +31,6 @@ import * as i9 from "@angular/material/icon";
|
|
|
31
31
|
import * as i10 from "@ngx-translate/core";
|
|
32
32
|
export class DirectionsInputsComponent {
|
|
33
33
|
languageService;
|
|
34
|
-
invalidKeys = ['Control', 'Shift', 'Alt'];
|
|
35
|
-
onMapClickEventKeys = [];
|
|
36
|
-
stopWithHover;
|
|
37
|
-
stopIsDragged = false;
|
|
38
34
|
stopsStore;
|
|
39
35
|
stopsFeatureStore;
|
|
40
36
|
projection;
|
|
@@ -42,143 +38,238 @@ export class DirectionsInputsComponent {
|
|
|
42
38
|
debounce = 200;
|
|
43
39
|
length = 2;
|
|
44
40
|
stopInputHasFocus = new EventEmitter(false);
|
|
41
|
+
invalidKeys = ['Control', 'Shift', 'Alt'];
|
|
42
|
+
onMapClickEventKeys = [];
|
|
43
|
+
stopWithHover;
|
|
44
|
+
stopIsDragged = false;
|
|
45
45
|
constructor(languageService) {
|
|
46
46
|
this.languageService = languageService;
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Returns the position property of the geolocationController.
|
|
50
|
+
*
|
|
51
|
+
* @return {BehaviorSubject<boolean> | undefined} The position property of
|
|
52
|
+
* the geolocationController.
|
|
53
|
+
*/
|
|
54
|
+
get currentPosition() {
|
|
55
|
+
return (this.stopsFeatureStore?.map?.geolocationController?.position$?.value
|
|
56
|
+
?.position &&
|
|
57
|
+
this.stopsFeatureStore?.map?.geolocationController?.tracking);
|
|
58
|
+
}
|
|
48
59
|
ngOnDestroy() {
|
|
49
60
|
this.unlistenMapSingleClick();
|
|
50
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Sets the stop with hover to the given stop.
|
|
64
|
+
*
|
|
65
|
+
* @param {Stop} stop - The stop to set as the stop with hover.
|
|
66
|
+
*/
|
|
51
67
|
onStopEnter(stop) {
|
|
52
68
|
this.stopWithHover = stop;
|
|
53
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Sets the stop with hover to undefined.
|
|
72
|
+
*
|
|
73
|
+
*/
|
|
54
74
|
onStopLeave() {
|
|
55
75
|
this.stopWithHover = undefined;
|
|
56
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Adds a stop to the stops store.
|
|
79
|
+
*
|
|
80
|
+
*/
|
|
81
|
+
addStop() {
|
|
82
|
+
addStopToStore(this.stopsStore);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Returns the title of the option if it is an object and has a meta property with a title,
|
|
86
|
+
* otherwise returns the option itself.
|
|
87
|
+
*
|
|
88
|
+
* @param {any} option - The option to get the text from.
|
|
89
|
+
* @return {string} The title of the option if it is an object and has a meta property with a title,
|
|
90
|
+
* otherwise returns the option itself.
|
|
91
|
+
*/
|
|
57
92
|
getOptionText(option) {
|
|
58
93
|
if (option instanceof Object) {
|
|
59
|
-
|
|
94
|
+
const { meta } = option;
|
|
95
|
+
return meta?.title || '';
|
|
60
96
|
}
|
|
61
97
|
return option;
|
|
62
98
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
99
|
+
/**
|
|
100
|
+
* Chooses an option from a MatAutocomplete and updates the stop coordinates and text
|
|
101
|
+
* based on the selected feature.
|
|
102
|
+
*
|
|
103
|
+
* @param {Object} event - The event object containing the MatAutocomplete and MatOption.
|
|
104
|
+
* @param {MatAutocomplete} event.source - The MatAutocomplete component.
|
|
105
|
+
* @param {MatOption} event.option - The selected MatOption.
|
|
106
|
+
* @param {Stop} stop - The stop object to update.
|
|
107
|
+
*/
|
|
108
|
+
chooseOption(event, stop) {
|
|
109
|
+
const feature = event.option.value;
|
|
110
|
+
if (feature) {
|
|
111
|
+
let coords;
|
|
112
|
+
const geometry = feature.geometry;
|
|
113
|
+
if (geometry.type === 'Point') {
|
|
114
|
+
coords = geometry.coordinates;
|
|
70
115
|
}
|
|
71
116
|
else {
|
|
72
|
-
const point = pointOnFeature(
|
|
73
|
-
|
|
74
|
-
point.geometry.coordinates[0],
|
|
75
|
-
point.geometry.coordinates[1]
|
|
76
|
-
];
|
|
117
|
+
const point = pointOnFeature(feature.geometry);
|
|
118
|
+
coords = [point.geometry.coordinates[0], point.geometry.coordinates[1]];
|
|
77
119
|
}
|
|
78
|
-
if (
|
|
79
|
-
stop.coordinates =
|
|
80
|
-
stop.text =
|
|
120
|
+
if (coords) {
|
|
121
|
+
stop.coordinates = coords;
|
|
122
|
+
stop.text = feature.meta.title;
|
|
81
123
|
this.stopsStore.update(stop);
|
|
82
124
|
}
|
|
83
125
|
}
|
|
84
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Sets the text of a stop based on the value of an input field.
|
|
129
|
+
*
|
|
130
|
+
* @param {KeyboardEvent} event - The keyboard event triggered by the input field.
|
|
131
|
+
* @param {Stop} stop - The stop object to update.
|
|
132
|
+
*/
|
|
85
133
|
setStopText(event, stop) {
|
|
86
134
|
this.unlistenMapSingleClick();
|
|
87
|
-
const
|
|
88
|
-
if (
|
|
89
|
-
this.
|
|
135
|
+
const searchTerm = event.target.value;
|
|
136
|
+
if (searchTerm.length === 0) {
|
|
137
|
+
this.clearStopInput(stop);
|
|
90
138
|
}
|
|
91
|
-
else if (this.
|
|
92
|
-
stop.text =
|
|
139
|
+
else if (this.validateSearchTerm(searchTerm)) {
|
|
140
|
+
stop.text = searchTerm;
|
|
93
141
|
this.stopsStore.update(stop);
|
|
94
142
|
}
|
|
95
143
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
144
|
+
/**
|
|
145
|
+
* Validates a search term by checking if it contains any invalid characters and if its length is valid.
|
|
146
|
+
*
|
|
147
|
+
* @param {string} searchTerm - The search term to be validated.
|
|
148
|
+
* @return {boolean} Returns true if the search term is valid, false otherwise.
|
|
149
|
+
*/
|
|
150
|
+
validateSearchTerm(searchTerm) {
|
|
151
|
+
const charactersAreValid = this.invalidKeys.indexOf(searchTerm) === -1;
|
|
152
|
+
const lengthIsValid = searchTerm.length >= this.length || searchTerm.length === 0;
|
|
153
|
+
return charactersAreValid && lengthIsValid;
|
|
102
154
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
getPlaceholder(stop) {
|
|
118
|
-
let extra = '';
|
|
119
|
-
if (stop.relativePosition) {
|
|
120
|
-
if (stop.relativePosition === DirectionRelativePositionType.Intermediate) {
|
|
121
|
-
extra = ' #' + stop.position;
|
|
122
|
-
}
|
|
123
|
-
return (this.languageService.translate.instant('igo.geo.directionsForm.' + stop.relativePosition) + extra);
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
return '';
|
|
127
|
-
}
|
|
155
|
+
/**
|
|
156
|
+
* Returns the label for the given stop input.
|
|
157
|
+
*
|
|
158
|
+
* @param {Stop} stop - The stop containing relativePosition and position.
|
|
159
|
+
* @return {string} The label for the stop input.
|
|
160
|
+
*/
|
|
161
|
+
getInputLabel(stop) {
|
|
162
|
+
const { relativePosition, position } = stop;
|
|
163
|
+
const label = relativePosition
|
|
164
|
+
? this.languageService.translate.instant(`igo.geo.directions.input.${relativePosition}`)
|
|
165
|
+
: '';
|
|
166
|
+
return relativePosition === DirectionRelativePositionType.Intermediate
|
|
167
|
+
? `${label} #${position}`
|
|
168
|
+
: label;
|
|
128
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* Removes a stop from the stops store.
|
|
172
|
+
*
|
|
173
|
+
* @param {Stop} stop - The stop object to be removed.
|
|
174
|
+
*/
|
|
129
175
|
removeStop(stop) {
|
|
130
176
|
removeStopFromStore(this.stopsStore, stop);
|
|
131
177
|
}
|
|
132
|
-
|
|
178
|
+
/**
|
|
179
|
+
* Clears the specified stop in the stops store.
|
|
180
|
+
*
|
|
181
|
+
* @param {Stop} stop - The stop to be cleared.
|
|
182
|
+
*/
|
|
183
|
+
clearStopInput(stop) {
|
|
133
184
|
this.stopsStore.update({
|
|
134
185
|
id: stop.id,
|
|
135
186
|
relativePosition: stop.relativePosition,
|
|
136
187
|
position: stop.position
|
|
137
188
|
});
|
|
138
189
|
}
|
|
139
|
-
|
|
190
|
+
/**
|
|
191
|
+
* Use the current position as a stop.
|
|
192
|
+
*
|
|
193
|
+
* @param {Stop} stop - The stop to update with the current position.
|
|
194
|
+
*/
|
|
195
|
+
useCurrentPosition(stop) {
|
|
196
|
+
this.useCoordinatesAsStop(this.stopsFeatureStore.map.geolocationController.position$.value.position, stop);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Moves a stop in the list of stops..
|
|
200
|
+
*
|
|
201
|
+
* @param {CdkDragDrop<string[]>} event - The event containing the previous and current index of the dropped stop.
|
|
202
|
+
*/
|
|
203
|
+
dropStop(event) {
|
|
140
204
|
this.moveStops(event.previousIndex, event.currentIndex);
|
|
141
205
|
}
|
|
206
|
+
/**
|
|
207
|
+
* Moves a stop in the list of stops from one index to another.
|
|
208
|
+
*
|
|
209
|
+
* @param {number} fromIndex - The index to move the stop from.
|
|
210
|
+
* @param {number} toIndex - The index to move the stop to.
|
|
211
|
+
*/
|
|
142
212
|
moveStops(fromIndex, toIndex) {
|
|
143
213
|
if (fromIndex !== toIndex) {
|
|
144
214
|
const stops = [...this.stopsStore.view.all()];
|
|
145
215
|
moveItemInArray(stops, fromIndex, toIndex);
|
|
146
|
-
stops.map((stop,
|
|
147
|
-
stop.relativePosition = computeRelativePosition(
|
|
148
|
-
stop.position =
|
|
216
|
+
stops.map((stop, stopIndex) => {
|
|
217
|
+
stop.relativePosition = computeRelativePosition(stopIndex, stops.length - 1);
|
|
218
|
+
stop.position = stopIndex;
|
|
149
219
|
});
|
|
150
220
|
this.stopsStore.updateMany(stops);
|
|
151
221
|
updateStoreSorting(this.stopsStore);
|
|
152
222
|
}
|
|
153
223
|
}
|
|
224
|
+
/**
|
|
225
|
+
* Handles the focus event on an input field for a stop.
|
|
226
|
+
*
|
|
227
|
+
* @param {Stop} stop - The stop that the input field is associated with.
|
|
228
|
+
*/
|
|
154
229
|
onInputFocus(stop) {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
this.listenMapSingleClick(stop);
|
|
159
|
-
}
|
|
230
|
+
this.unlistenMapSingleClick();
|
|
231
|
+
this.stopInputHasFocus.emit(true);
|
|
232
|
+
this.listenMapSingleClick(stop);
|
|
160
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* Listens for a single click event on the map and uses the coordinates of the click
|
|
236
|
+
* to set the given stop's coordinates.
|
|
237
|
+
*
|
|
238
|
+
* @param {Stop} stop - The stop to update with the clicked coordinates.
|
|
239
|
+
*/
|
|
161
240
|
listenMapSingleClick(stop) {
|
|
162
241
|
const key = this.stopsFeatureStore.layer.map.ol.once('singleclick', (event) => {
|
|
163
|
-
|
|
164
|
-
const roundedCoord = roundCoordTo(clickCoordinates, this.coordRoundedDecimals);
|
|
165
|
-
stop.text = roundedCoord.join(',');
|
|
166
|
-
stop.coordinates = roundedCoord;
|
|
167
|
-
this.stopsStore.update(stop);
|
|
168
|
-
setTimeout(() => {
|
|
169
|
-
this.stopInputHasFocus.emit(false);
|
|
170
|
-
}, 500);
|
|
242
|
+
this.useCoordinatesAsStop(event.coordinate, stop);
|
|
171
243
|
});
|
|
172
244
|
this.onMapClickEventKeys.push(key);
|
|
173
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Unlistens for map single click events and clears the list of event keys.
|
|
248
|
+
*/
|
|
174
249
|
unlistenMapSingleClick() {
|
|
175
250
|
this.onMapClickEventKeys.map((key) => {
|
|
176
251
|
olObservable.unByKey(key);
|
|
177
252
|
});
|
|
178
253
|
this.onMapClickEventKeys = [];
|
|
179
254
|
}
|
|
255
|
+
/**
|
|
256
|
+
* Uses the given coordinates to update the given stop.
|
|
257
|
+
*
|
|
258
|
+
* @param {Coordinate} coordinates - The coordinates to transform and round.
|
|
259
|
+
* @param {Stop} stop - The stop to update with the new coordinates and text.
|
|
260
|
+
*/
|
|
261
|
+
useCoordinatesAsStop(coordinates, stop) {
|
|
262
|
+
const projectedCoordinates = olProj.transform(coordinates, this.stopsFeatureStore.layer.map.projection, this.projection);
|
|
263
|
+
const roundedCoordinates = roundCoordTo(projectedCoordinates, this.coordRoundedDecimals);
|
|
264
|
+
stop.text = roundCoordToString(projectedCoordinates, this.coordRoundedDecimals).join(', ');
|
|
265
|
+
stop.coordinates = roundedCoordinates;
|
|
266
|
+
this.stopsStore.update(stop);
|
|
267
|
+
setTimeout(() => {
|
|
268
|
+
this.stopInputHasFocus.emit(false);
|
|
269
|
+
}, 500);
|
|
270
|
+
}
|
|
180
271
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DirectionsInputsComponent, deps: [{ token: i1.LanguageService }], target: i0.ɵɵFactoryTarget.Component });
|
|
181
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DirectionsInputsComponent, isStandalone: true, selector: "igo-directions-inputs", inputs: { stopsStore: "stopsStore", stopsFeatureStore: "stopsFeatureStore", projection: "projection", coordRoundedDecimals: "coordRoundedDecimals", debounce: "debounce", length: "length" }, outputs: { stopInputHasFocus: "stopInputHasFocus" }, ngImport: i0, template: "<div cdkDropList class=\"stops-list\" (cdkDropListDropped)=\"
|
|
272
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DirectionsInputsComponent, isStandalone: true, selector: "igo-directions-inputs", inputs: { stopsStore: "stopsStore", stopsFeatureStore: "stopsFeatureStore", projection: "projection", coordRoundedDecimals: "coordRoundedDecimals", debounce: "debounce", length: "length" }, outputs: { stopInputHasFocus: "stopInputHasFocus" }, ngImport: i0, template: "<div cdkDropList class=\"stops-list\" (cdkDropListDropped)=\"dropStop($event)\">\n <div\n *ngFor=\"let stop of stopsStore.view.all$() | async; let stopIndex = index\"\n class=\"stop\"\n >\n <div\n (touchenter)=\"onStopEnter(stop)\"\n (touchleave)=\"onStopLeave()\"\n (mouseover)=\"onStopEnter(stop)\"\n (mouseleave)=\"onStopLeave()\"\n (cdkDragStarted)=\"stopIsDragged = true\"\n (cdkDragEnded)=\"stopIsDragged = false\"\n cdkDragLockAxis=\"y\"\n class=\"stop-box\"\n cdkDrag\n >\n <div class=\"prefix-actions\">\n <button\n class=\"swipe-vertical\"\n cdkDragHandle\n mat-icon-button\n [matTooltip]=\"'igo.geo.directions.input.moveStop' | translate\"\n color=\"primary\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </button>\n </div>\n\n <div class=\"igo-input-container\">\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-label>{{ getInputLabel(stop) }}</mat-label>\n <input\n [id]=\"stop.id\"\n type=\"text\"\n [placeholder]=\"'igo.geo.directions.input.placeholder' | translate\"\n matInput\n (focus)=\"onInputFocus(stop)\"\n [(ngModel)]=\"stop.text\"\n (keyup)=\"setStopText($event, stop)\"\n (keydown.enter)=\"$event.preventDefault()\"\n [matAutocomplete]=\"auto\"\n />\n <button\n *ngIf=\"currentPosition\"\n mat-icon-button\n matPrefix\n [matTooltip]=\"\n 'igo.geo.directions.input.currentPosition' | translate\n \"\n color=\"accent\"\n (click)=\"useCurrentPosition(stop); $event.stopPropagation()\"\n >\n <mat-icon>my_location</mat-icon>\n </button>\n <button\n *ngIf=\"stop.text || stop.coordinates\"\n mat-icon-button\n matSuffix\n [matTooltip]=\"'igo.geo.directions.input.clearStop' | translate\"\n color=\"warn\"\n (click)=\"clearStopInput(stop)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-autocomplete\n [displayWith]=\"getOptionText\"\n #auto=\"matAutocomplete\"\n (optionSelected)=\"chooseOption($event, stop)\"\n >\n <mat-optgroup\n *ngFor=\"let source of stop.searchProposals\"\n [label]=\"source.source.title\"\n [disabled]=\"!source.source.enabled\"\n >\n <mat-option\n *ngFor=\"let result of source.results\"\n [value]=\"result\"\n >\n {{ result.meta ? result.meta.title : '' }}\n </mat-option>\n </mat-optgroup>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n <button\n class=\"delete-button\"\n *ngIf=\"(stopsStore.count$ | async) > 2\"\n mat-icon-button\n [matTooltip]=\"'igo.geo.directions.input.removeStop' | translate\"\n color=\"warn\"\n (click)=\"removeStop(stop)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"prefix-actions\">\n <button\n mat-icon-button\n [disabled]=\"\n (stopsStore.count$ | async) !== (stopsFeatureStore.count$ | async) ||\n stopIsDragged\n \"\n [matTooltip]=\"'igo.geo.directions.input.addStop' | translate\"\n color=\"primary\"\n (click)=\"addStop()\"\n >\n <mat-icon>add_location_alt</mat-icon>\n </button>\n </div>\n</div>\n", styles: [":host .igo-input-container{display:flex;width:100%}:host .igo-input-container mat-form-field{flex:1}:host .stops-list{padding:12px 10px}:host .stops-list,:host .stop{display:flex;flex-flow:column;row-gap:12px}:host .stop:hover .swipe-vertical,:host .stop:hover .delete-button{visibility:visible;display:block}:host .swipe-vertical{visibility:hidden;cursor:move}:host .delete-button{display:none}:host .stop-box{display:flex;align-items:center;justify-content:space-between}:host .cdk-drag-placeholder{opacity:0}:host .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}:host .stops-list.cdk-drop-list-dragging .stop-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i5.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i6.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i5.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] });
|
|
182
273
|
}
|
|
183
274
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DirectionsInputsComponent, decorators: [{
|
|
184
275
|
type: Component,
|
|
@@ -199,13 +290,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
199
290
|
CdkDragHandle,
|
|
200
291
|
AsyncPipe,
|
|
201
292
|
IgoLanguageModule
|
|
202
|
-
], template: "<div cdkDropList class=\"stops-list\" (cdkDropListDropped)=\"
|
|
293
|
+
], template: "<div cdkDropList class=\"stops-list\" (cdkDropListDropped)=\"dropStop($event)\">\n <div\n *ngFor=\"let stop of stopsStore.view.all$() | async; let stopIndex = index\"\n class=\"stop\"\n >\n <div\n (touchenter)=\"onStopEnter(stop)\"\n (touchleave)=\"onStopLeave()\"\n (mouseover)=\"onStopEnter(stop)\"\n (mouseleave)=\"onStopLeave()\"\n (cdkDragStarted)=\"stopIsDragged = true\"\n (cdkDragEnded)=\"stopIsDragged = false\"\n cdkDragLockAxis=\"y\"\n class=\"stop-box\"\n cdkDrag\n >\n <div class=\"prefix-actions\">\n <button\n class=\"swipe-vertical\"\n cdkDragHandle\n mat-icon-button\n [matTooltip]=\"'igo.geo.directions.input.moveStop' | translate\"\n color=\"primary\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </button>\n </div>\n\n <div class=\"igo-input-container\">\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-label>{{ getInputLabel(stop) }}</mat-label>\n <input\n [id]=\"stop.id\"\n type=\"text\"\n [placeholder]=\"'igo.geo.directions.input.placeholder' | translate\"\n matInput\n (focus)=\"onInputFocus(stop)\"\n [(ngModel)]=\"stop.text\"\n (keyup)=\"setStopText($event, stop)\"\n (keydown.enter)=\"$event.preventDefault()\"\n [matAutocomplete]=\"auto\"\n />\n <button\n *ngIf=\"currentPosition\"\n mat-icon-button\n matPrefix\n [matTooltip]=\"\n 'igo.geo.directions.input.currentPosition' | translate\n \"\n color=\"accent\"\n (click)=\"useCurrentPosition(stop); $event.stopPropagation()\"\n >\n <mat-icon>my_location</mat-icon>\n </button>\n <button\n *ngIf=\"stop.text || stop.coordinates\"\n mat-icon-button\n matSuffix\n [matTooltip]=\"'igo.geo.directions.input.clearStop' | translate\"\n color=\"warn\"\n (click)=\"clearStopInput(stop)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-autocomplete\n [displayWith]=\"getOptionText\"\n #auto=\"matAutocomplete\"\n (optionSelected)=\"chooseOption($event, stop)\"\n >\n <mat-optgroup\n *ngFor=\"let source of stop.searchProposals\"\n [label]=\"source.source.title\"\n [disabled]=\"!source.source.enabled\"\n >\n <mat-option\n *ngFor=\"let result of source.results\"\n [value]=\"result\"\n >\n {{ result.meta ? result.meta.title : '' }}\n </mat-option>\n </mat-optgroup>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n <button\n class=\"delete-button\"\n *ngIf=\"(stopsStore.count$ | async) > 2\"\n mat-icon-button\n [matTooltip]=\"'igo.geo.directions.input.removeStop' | translate\"\n color=\"warn\"\n (click)=\"removeStop(stop)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"prefix-actions\">\n <button\n mat-icon-button\n [disabled]=\"\n (stopsStore.count$ | async) !== (stopsFeatureStore.count$ | async) ||\n stopIsDragged\n \"\n [matTooltip]=\"'igo.geo.directions.input.addStop' | translate\"\n color=\"primary\"\n (click)=\"addStop()\"\n >\n <mat-icon>add_location_alt</mat-icon>\n </button>\n </div>\n</div>\n", styles: [":host .igo-input-container{display:flex;width:100%}:host .igo-input-container mat-form-field{flex:1}:host .stops-list{padding:12px 10px}:host .stops-list,:host .stop{display:flex;flex-flow:column;row-gap:12px}:host .stop:hover .swipe-vertical,:host .stop:hover .delete-button{visibility:visible;display:block}:host .swipe-vertical{visibility:hidden;cursor:move}:host .delete-button{display:none}:host .stop-box{display:flex;align-items:center;justify-content:space-between}:host .cdk-drag-placeholder{opacity:0}:host .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}:host .stops-list.cdk-drop-list-dragging .stop-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }]
|
|
203
294
|
}], ctorParameters: () => [{ type: i1.LanguageService }], propDecorators: { stopsStore: [{
|
|
204
|
-
type: Input
|
|
295
|
+
type: Input,
|
|
296
|
+
args: [{ required: true }]
|
|
205
297
|
}], stopsFeatureStore: [{
|
|
206
|
-
type: Input
|
|
298
|
+
type: Input,
|
|
299
|
+
args: [{ required: true }]
|
|
207
300
|
}], projection: [{
|
|
208
|
-
type: Input
|
|
301
|
+
type: Input,
|
|
302
|
+
args: [{ required: true }]
|
|
209
303
|
}], coordRoundedDecimals: [{
|
|
210
304
|
type: Input
|
|
211
305
|
}], debounce: [{
|
|
@@ -215,4 +309,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
215
309
|
}], stopInputHasFocus: [{
|
|
216
310
|
type: Output
|
|
217
311
|
}] } });
|
|
218
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9ucy1pbnB1dHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvZGlyZWN0aW9ucy9kaXJlY3Rpb25zLWlucHV0cy9kaXJlY3Rpb25zLWlucHV0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kaXJlY3Rpb25zL2RpcmVjdGlvbnMtaW5wdXRzL2RpcmVjdGlvbnMtaW5wdXRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAsYUFBYSxFQUNiLFdBQVcsRUFDWCxlQUFlLEVBQ2hCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFFTCxxQkFBcUIsRUFDdEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFhLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFB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QUFTOytCQUNFLHVCQUF1QixjQUdyQixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxLQUFLO3dCQUNMLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsV0FBVzt3QkFDWCxxQkFBcUI7d0JBQ3JCLGdCQUFnQjt3QkFDaEIsSUFBSTt3QkFDSixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixhQUFhO3dCQUNiLFNBQVM7d0JBQ1QsaUJBQWlCO3FCQUNsQjtvRkFPUSxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFFSSxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDZGtEcmFnLFxuICBDZGtEcmFnRHJvcCxcbiAgQ2RrRHJhZ0hhbmRsZSxcbiAgQ2RrRHJvcExpc3QsXG4gIG1vdmVJdGVtSW5BcnJheVxufSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcywgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgTWF0QXV0b2NvbXBsZXRlLFxuICBNYXRBdXRvY29tcGxldGVNb2R1bGVcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRPcHRpb24sIE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5pbXBvcnQgeyBJZ29MYW5ndWFnZU1vZHVsZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuXG5pbXBvcnQgKiBhcyBvbE9ic2VydmFibGUgZnJvbSAnb2wvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgKiBhcyBvbFByb2ogZnJvbSAnb2wvcHJvaic7XG5cbmltcG9ydCBwb2ludE9uRmVhdHVyZSBmcm9tICdAdHVyZi9wb2ludC1vbi1mZWF0dXJlJztcblxuaW1wb3J0IHsgRmVhdHVyZSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL2ZlYXR1cmUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyByb3VuZENvb3JkVG8gfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcC51dGlscyc7XG5pbXBvcnQgeyBEaXJlY3Rpb25SZWxhdGl2ZVBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL3NoYXJlZC9kaXJlY3Rpb25zLmVudW0nO1xuaW1wb3J0IHsgU3RvcCB9IGZyb20gJy4uL3NoYXJlZC9kaXJlY3Rpb25zLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBjb21wdXRlUmVsYXRpdmVQb3NpdGlvbixcbiAgcmVtb3ZlU3RvcEZyb21TdG9yZSxcbiAgdXBkYXRlU3RvcmVTb3J0aW5nXG59IGZyb20gJy4uL3NoYXJlZC9kaXJlY3Rpb25zLnV0aWxzJztcbmltcG9ydCB7IFN0b3BzRmVhdHVyZVN0b3JlLCBTdG9wc1N0b3JlIH0gZnJvbSAnLi4vc2hhcmVkL3N0b3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWdvLWRpcmVjdGlvbnMtaW5wdXRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RpcmVjdGlvbnMtaW5wdXRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGlyZWN0aW9ucy1pbnB1dHMuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENka0Ryb3BMaXN0LFxuICAgIE5nRm9yLFxuICAgIENka0RyYWcsXG4gICAgTmdDbGFzcyxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTmdJZixcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRPcHRpb25Nb2R1bGUsXG4gICAgQ2RrRHJhZ0hhbmRsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgSWdvTGFuZ3VhZ2VNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEaXJlY3Rpb25zSW5wdXRzQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnZhbGlkS2V5cyA9IFsnQ29udHJvbCcsICdTaGlmdCcsICdBbHQnXTtcbiAgcHJpdmF0ZSBvbk1hcENsaWNrRXZlbnRLZXlzID0gW107XG4gIHB1YmxpYyBzdG9wV2l0aEhvdmVyOiBTdG9wO1xuICBwdWJsaWMgc3RvcElzRHJhZ2dlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBzdG9wc1N0b3JlOiBTdG9wc1N0b3JlO1xuICBASW5wdXQoKSBzdG9wc0ZlYXR1cmVTdG9yZTogU3RvcHNGZWF0dXJlU3RvcmU7XG4gIEBJbnB1dCgpIHByb2plY3Rpb246IHN0cmluZztcbiAgQElucHV0KCkgY29vcmRSb3VuZGVkRGVjaW1hbHMgPSA2O1xuXG4gIEBJbnB1dCgpIGRlYm91bmNlID0gMjAwO1xuICBASW5wdXQoKSBsZW5ndGggPSAyO1xuXG4gIEBPdXRwdXQoKSBzdG9wSW5wdXRIYXNGb2N1czogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSkge31cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVubGlzdGVuTWFwU2luZ2xlQ2xpY2soKTtcbiAgfVxuICBvblN0b3BFbnRlcihzdG9wOiBTdG9wKSB7XG4gICAgdGhpcy5zdG9wV2l0aEhvdmVyID0gc3RvcDtcbiAgfVxuICBvblN0b3BMZWF2ZSgpIHtcbiAgICB0aGlzLnN0b3BXaXRoSG92ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRPcHRpb25UZXh0KG9wdGlvbikge1xuICAgIGlmIChvcHRpb24gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIHJldHVybiBvcHRpb24/Lm1ldGEgPyBvcHRpb24ubWV0YS50aXRsZSA6ICcnO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9uO1xuICB9XG5cbiAgY2hvb3NlUHJvcG9zYWwoXG4gICAgZXZlbnQ6IHsgc291cmNlOiBNYXRBdXRvY29tcGxldGU7IG9wdGlvbjogTWF0T3B0aW9uIH0sXG4gICAgc3RvcDogU3RvcFxuICApIHtcbiAgICBjb25zdCByZXN1bHQ6IEZlYXR1cmUgPSBldmVudC5vcHRpb24udmFsdWU7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgbGV0IGdlb21Db29yZDtcbiAgICAgIGNvbnN0IGdlb20gPSByZXN1bHQuZ2VvbWV0cnk7XG4gICAgICBpZiAoZ2VvbS50eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGdlb21Db29yZCA9IGdlb20uY29vcmRpbmF0ZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50T25GZWF0dXJlKHJlc3VsdC5nZW9tZXRyeSk7XG4gICAgICAgIGdlb21Db29yZCA9IFtcbiAgICAgICAgICBwb2ludC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcbiAgICAgICAgICBwb2ludC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXVxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgaWYgKGdlb21Db29yZCkge1xuICAgICAgICBzdG9wLmNvb3JkaW5hdGVzID0gZ2VvbUNvb3JkO1xuICAgICAgICBzdG9wLnRleHQgPSByZXN1bHQubWV0YS50aXRsZTtcbiAgICAgICAgdGhpcy5zdG9wc1N0b3JlLnVwZGF0ZShzdG9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRTdG9wVGV4dChldmVudDogS2V5Ym9hcmRFdmVudCwgc3RvcDogU3RvcCkge1xuICAgIHRoaXMudW5saXN0ZW5NYXBTaW5nbGVDbGljaygpO1xuICAgIGNvbnN0IHRlcm0gPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIGlmICh0ZXJtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jbGVhclN0b3Aoc3RvcCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnZhbGlkYXRlVGVybSh0ZXJtKSkge1xuICAgICAgc3RvcC50ZXh0ID0gdGVybTtcbiAgICAgIHRoaXMuc3RvcHNTdG9yZS51cGRhdGUoc3RvcCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVUZXJtKHRlcm06IHN0cmluZykge1xuICAgIGlmIChcbiAgICAgIHRoaXMua2V5SXNWYWxpZCh0ZXJtKSAmJlxuICAgICAgKHRlcm0ubGVuZ3RoID49IHRoaXMubGVuZ3RoIHx8IHRlcm0ubGVuZ3RoID09PSAwKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUga2V5SXNWYWxpZChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmludmFsaWRLZXlzLmZpbmQoKHZhbHVlKSA9PiB2YWx1ZSA9PT0ga2V5KSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0TmdDbGFzcyhzdG9wOiBTdG9wKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc3RvcFdpdGhIb3Zlcikge1xuICAgICAgcmV0dXJuICdpZ28taW5wdXQtY29udGFpbmVyJztcbiAgICB9IGVsc2UgaWYgKHN0b3AuaWQgPT09IHRoaXMuc3RvcFdpdGhIb3Zlci5pZCkge1xuICAgICAgcmV0dXJuICdpZ28taW5wdXQtY29udGFpbmVyIHJlZHVjZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnaWdvLWlucHV0LWNvbnRhaW5lcic7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGxhY2Vob2xkZXIoc3RvcDogU3RvcCk6IHN0cmluZyB7XG4gICAgbGV0IGV4dHJhID0gJyc7XG4gICAgaWYgKHN0b3AucmVsYXRpdmVQb3NpdGlvbikge1xuICAgICAgaWYgKFxuICAgICAgICBzdG9wLnJlbGF0aXZlUG9zaXRpb24gPT09IERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLkludGVybWVkaWF0ZVxuICAgICAgKSB7XG4gICAgICAgIGV4dHJhID0gJyAjJyArIHN0b3AucG9zaXRpb247XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS4nICsgc3RvcC5yZWxhdGl2ZVBvc2l0aW9uXG4gICAgICAgICkgKyBleHRyYVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVN0b3Aoc3RvcDogU3RvcCkge1xuICAgIHJlbW92ZVN0b3BGcm9tU3RvcmUodGhpcy5zdG9wc1N0b3JlLCBzdG9wKTtcbiAgfVxuXG4gIGNsZWFyU3RvcChzdG9wOiBTdG9wKSB7XG4gICAgdGhpcy5zdG9wc1N0b3JlLnVwZGF0ZSh7XG4gICAgICBpZDogc3RvcC5pZCxcbiAgICAgIHJlbGF0aXZlUG9zaXRpb246IHN0b3AucmVsYXRpdmVQb3NpdGlvbixcbiAgICAgIHBvc2l0aW9uOiBzdG9wLnBvc2l0aW9uXG4gICAgfSk7XG4gIH1cblxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pIHtcbiAgICB0aGlzLm1vdmVTdG9wcyhldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlU3RvcHMoZnJvbUluZGV4LCB0b0luZGV4KSB7XG4gICAgaWYgKGZyb21JbmRleCAhPT0gdG9JbmRleCkge1xuICAgICAgY29uc3Qgc3RvcHMgPSBbLi4udGhpcy5zdG9wc1N0b3JlLnZpZXcuYWxsKCldO1xuICAgICAgbW92ZUl0ZW1JbkFycmF5KHN0b3BzLCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICAgICAgc3RvcHMubWFwKChzdG9wLCBpKSA9PiB7XG4gICAgICAgIHN0b3AucmVsYXRpdmVQb3NpdGlvbiA9IGNvbXB1dGVSZWxhdGl2ZVBvc2l0aW9uKGksIHN0b3BzLmxlbmd0aCk7XG4gICAgICAgIHN0b3AucG9zaXRpb24gPSBpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnN0b3BzU3RvcmUudXBkYXRlTWFueShzdG9wcyk7XG4gICAgICB1cGRhdGVTdG9yZVNvcnRpbmcodGhpcy5zdG9wc1N0b3JlKTtcbiAgICB9XG4gIH1cblxuICBvbklucHV0Rm9jdXMoc3RvcDogU3RvcCkge1xuICAgIGlmICghc3RvcC50ZXh0IHx8IHN0b3AudGV4dD8ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnVubGlzdGVuTWFwU2luZ2xlQ2xpY2soKTtcbiAgICAgIHRoaXMuc3RvcElucHV0SGFzRm9jdXMuZW1pdCh0cnVlKTtcbiAgICAgIHRoaXMubGlzdGVuTWFwU2luZ2xlQ2xpY2soc3RvcCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5NYXBTaW5nbGVDbGljayhzdG9wOiBTdG9wKSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5zdG9wc0ZlYXR1cmVTdG9yZS5sYXllci5tYXAub2wub25jZShcbiAgICAgICdzaW5nbGVjbGljaycsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY2xpY2tDb29yZGluYXRlcyA9IG9sUHJvai50cmFuc2Zvcm0oXG4gICAgICAgICAgZXZlbnQuY29vcmRpbmF0ZSxcbiAgICAgICAgICB0aGlzLnN0b3BzRmVhdHVyZVN0b3JlLmxheWVyLm1hcC5wcm9qZWN0aW9uLFxuICAgICAgICAgIHRoaXMucHJvamVjdGlvblxuICAgICAgICApO1xuICAgICAgICBjb25zdCByb3VuZGVkQ29vcmQgPSByb3VuZENvb3JkVG8oXG4gICAgICAgICAgY2xpY2tDb29yZGluYXRlcyBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgIHRoaXMuY29vcmRSb3VuZGVkRGVjaW1hbHNcbiAgICAgICAgKTtcbiAgICAgICAgc3RvcC50ZXh0ID0gcm91bmRlZENvb3JkLmpvaW4oJywnKTtcbiAgICAgICAgc3RvcC5jb29yZGluYXRlcyA9IHJvdW5kZWRDb29yZDtcbiAgICAgICAgdGhpcy5zdG9wc1N0b3JlLnVwZGF0ZShzdG9wKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdG9wSW5wdXRIYXNGb2N1cy5lbWl0KGZhbHNlKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMub25NYXBDbGlja0V2ZW50S2V5cy5wdXNoKGtleSk7XG4gIH1cblxuICBwcml2YXRlIHVubGlzdGVuTWFwU2luZ2xlQ2xpY2soKSB7XG4gICAgdGhpcy5vbk1hcENsaWNrRXZlbnRLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBvbE9ic2VydmFibGUudW5CeUtleShrZXkpO1xuICAgIH0pO1xuICAgIHRoaXMub25NYXBDbGlja0V2ZW50S2V5cyA9IFtdO1xuICB9XG59XG4iLCI8ZGl2IGNka0Ryb3BMaXN0IGNsYXNzPVwic3RvcHMtbGlzdFwiIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG4gIDxkaXZcbiAgICB0b3VjaGxlYXZlXG4gICAgKHRvdWNoZW50ZXIpPVwib25TdG9wRW50ZXIoc3RvcClcIlxuICAgICh0b3VjaGxlYXZlKT1cIm9uU3RvcExlYXZlKClcIlxuICAgIChtb3VzZW92ZXIpPVwib25TdG9wRW50ZXIoc3RvcClcIlxuICAgIChtb3VzZWxlYXZlKT1cIm9uU3RvcExlYXZlKClcIlxuICAgIChjZGtEcmFnU3RhcnRlZCk9XCJzdG9wSXNEcmFnZ2VkID0gdHJ1ZVwiXG4gICAgKGNka0RyYWdFbmRlZCk9XCJzdG9wSXNEcmFnZ2VkID0gZmFsc2VcIlxuICAgIGNka0RyYWdMb2NrQXhpcz1cInlcIlxuICAgIGNsYXNzPVwic3RvcC1ib3hcIlxuICAgICpuZ0Zvcj1cImxldCBzdG9wIG9mIHN0b3BzU3RvcmUudmlldy5hbGwkKCkgfCBhc3luYzsgbGV0IGkgPSBpbmRleFwiXG4gICAgY2RrRHJhZ1xuICA+XG4gICAgPGRpdiBbbmdDbGFzc109XCJnZXROZ0NsYXNzKHN0b3ApXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7IGdldFBsYWNlaG9sZGVyKHN0b3ApIH19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGlkPVwie3sgc3RvcC5pZCB9fVwiXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRQbGFjZWhvbGRlcihzdG9wKVwiXG4gICAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwic3RvcC50ZXh0XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiTnVtYmVyXCJcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoc3RvcClcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwic3RvcC50ZXh0XCJcbiAgICAgICAgICAoa2V5dXApPVwic2V0U3RvcFRleHQoJGV2ZW50LCBzdG9wKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgKHN0b3AudGV4dCB8fCBzdG9wLmNvb3JkaW5hdGVzKSAmJlxuICAgICAgICAgICAgc3RvcFdpdGhIb3ZlciAmJlxuICAgICAgICAgICAgc3RvcC5pZCA9PT0gc3RvcFdpdGhIb3Zlci5pZFxuICAgICAgICAgIFwiXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uY2xlYXJTdG9wJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXJcIlxuICAgICAgICAgIChjbGljayk9XCJjbGVhclN0b3Aoc3RvcClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPG1hdC1hdXRvY29tcGxldGVcbiAgICAgICAgICBbZGlzcGxheVdpdGhdPVwiZ2V0T3B0aW9uVGV4dFwiXG4gICAgICAgICAgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJjaG9vc2VQcm9wb3NhbCgkZXZlbnQsIHN0b3ApXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtb3B0Z3JvdXBcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzb3VyY2Ugb2Ygc3RvcC5zZWFyY2hQcm9wb3NhbHNcIlxuICAgICAgICAgICAgW2xhYmVsXT1cInNvdXJjZS5zb3VyY2UudGl0bGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNvdXJjZS5zb3VyY2UuZW5hYmxlZCA9PT0gZmFsc2VcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByZXN1bHQgb2Ygc291cmNlLnJlc3VsdHNcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwicmVzdWx0XCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInJlc3VsdC5tZXRhID8gcmVzdWx0Lm1ldGEudGl0bGUgOiAnJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHJlc3VsdC5tZXRhID8gcmVzdWx0Lm1ldGEudGl0bGUgOiAnJyB9fVxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxuICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCIhc3RvcElzRHJhZ2dlZCAmJiBzdG9wV2l0aEhvdmVyICYmIHN0b3AuaWQgPT09IHN0b3BXaXRoSG92ZXIuaWRcIlxuICAgICAgY2xhc3M9XCJpZ28tZm9ybS1idXR0b24tZ3JvdXBcIlxuICAgID5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJzd2lwZS12ZXJ0aWNhbFwiXG4gICAgICAgIGNka0RyYWdIYW5kbGVcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5tb3ZlU3RvcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCIoc3RvcHNTdG9yZS5jb3VudCQgfCBhc3luYykgPiAyXCJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5yZW1vdmVTdG9wJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgIChjbGljayk9XCJyZW1vdmVTdG9wKHN0b3ApXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
312
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9ucy1pbnB1dHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvZGlyZWN0aW9ucy9kaXJlY3Rpb25zLWlucHV0cy9kaXJlY3Rpb25zLWlucHV0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kaXJlY3Rpb25zL2RpcmVjdGlvbnMtaW5wdXRzL2RpcmVjdGlvbnMtaW5wdXRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAsYUFBYSxFQUNiLFdBQVcsRUFDWCxlQUFlLEVBQ2hCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFFTCxxQkFBcUIsRUFDdEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFhLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFB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QUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO3dHQTFSVSx5QkFBeUI7NEZBQXpCLHlCQUF5QixvVUM3RXRDLHluSEFnSEEscXdCRHJESSxXQUFXLDhmQUNYLEtBQUssbUhBQ0wsT0FBTyx1Y0FFUCxrQkFBa0IsNGlCQUNsQixjQUFjLDBXQUNkLFdBQVcsOG1CQUNYLHFCQUFxQix5OUJBQ3JCLGdCQUFnQiw2VEFDaEIsSUFBSSw0RkFDSixlQUFlLDJJQUNmLGFBQWEsbUxBQ2IsZUFBZSwrQkFDZixhQUFhLDBGQUNiLFNBQVMsNkNBQ1QsaUJBQWlCOzs0RkFHUix5QkFBeUI7a0JBeEJyQyxTQUFTOytCQUNFLHVCQUF1QixjQUdyQixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxLQUFLO3dCQUNMLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsV0FBVzt3QkFDWCxxQkFBcUI7d0JBQ3JCLGdCQUFnQjt3QkFDaEIsSUFBSTt3QkFDSixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixhQUFhO3dCQUNiLFNBQVM7d0JBQ1QsaUJBQWlCO3FCQUNsQjtvRkFHMEIsVUFBVTtzQkFBcEMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ0UsaUJBQWlCO3NCQUEzQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDRSxVQUFVO3NCQUFwQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDaEIsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNJLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENka0RyYWcsXG4gIENka0RyYWdEcm9wLFxuICBDZGtEcmFnSGFuZGxlLFxuICBDZGtEcm9wTGlzdCxcbiAgbW92ZUl0ZW1JbkFycmF5XG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBNYXRBdXRvY29tcGxldGUsXG4gIE1hdEF1dG9jb21wbGV0ZU1vZHVsZVxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdE9wdGlvbiwgTWF0T3B0aW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2xhbmd1YWdlJztcbmltcG9ydCB7IElnb0xhbmd1YWdlTW9kdWxlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5cbmltcG9ydCAqIGFzIG9sT2JzZXJ2YWJsZSBmcm9tICdvbC9PYnNlcnZhYmxlJztcbmltcG9ydCB7IENvb3JkaW5hdGUgfSBmcm9tICdvbC9jb29yZGluYXRlJztcbmltcG9ydCB7IEV2ZW50c0tleSB9IGZyb20gJ29sL2V2ZW50cyc7XG5pbXBvcnQgKiBhcyBvbFByb2ogZnJvbSAnb2wvcHJvaic7XG5cbmltcG9ydCBwb2ludE9uRmVhdHVyZSBmcm9tICdAdHVyZi9wb2ludC1vbi1mZWF0dXJlJztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnZ2VvanNvbic7XG5cbmltcG9ydCB7XG4gIEZlYXR1cmUsXG4gIEZlYXR1cmVHZW9tZXRyeVxufSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9mZWF0dXJlLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgcm91bmRDb29yZFRvLCByb3VuZENvb3JkVG9TdHJpbmcgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcC51dGlscyc7XG5pbXBvcnQgeyBTdG9wIH0gZnJvbSAnLi4vc2hhcmVkL2RpcmVjdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIGFkZFN0b3BUb1N0b3JlLFxuICBjb21wdXRlUmVsYXRpdmVQb3NpdGlvbixcbiAgcmVtb3ZlU3RvcEZyb21TdG9yZSxcbiAgdXBkYXRlU3RvcmVTb3J0aW5nXG59IGZyb20gJy4uL3NoYXJlZC9kaXJlY3Rpb25zLnV0aWxzJztcbmltcG9ydCB7IFN0b3BzRmVhdHVyZVN0b3JlLCBTdG9wc1N0b3JlIH0gZnJvbSAnLi4vc2hhcmVkL3N0b3JlJztcbmltcG9ydCB7IERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlIH0gZnJvbSAnLi8uLi9zaGFyZWQvZGlyZWN0aW9ucy5lbnVtJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWdvLWRpcmVjdGlvbnMtaW5wdXRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RpcmVjdGlvbnMtaW5wdXRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGlyZWN0aW9ucy1pbnB1dHMuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENka0Ryb3BMaXN0LFxuICAgIE5nRm9yLFxuICAgIENka0RyYWcsXG4gICAgTmdDbGFzcyxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTmdJZixcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRPcHRpb25Nb2R1bGUsXG4gICAgQ2RrRHJhZ0hhbmRsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgSWdvTGFuZ3VhZ2VNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEaXJlY3Rpb25zSW5wdXRzQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc3RvcHNTdG9yZTogU3RvcHNTdG9yZTtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc3RvcHNGZWF0dXJlU3RvcmU6IFN0b3BzRmVhdHVyZVN0b3JlO1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBwcm9qZWN0aW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvb3JkUm91bmRlZERlY2ltYWxzID0gNjtcbiAgQElucHV0KCkgZGVib3VuY2UgPSAyMDA7XG4gIEBJbnB1dCgpIGxlbmd0aCA9IDI7XG4gIEBPdXRwdXQoKSBzdG9wSW5wdXRIYXNGb2N1czogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGludmFsaWRLZXlzOiBzdHJpbmdbXSA9IFsnQ29udHJvbCcsICdTaGlmdCcsICdBbHQnXTtcbiAgcHJpdmF0ZSBvbk1hcENsaWNrRXZlbnRLZXlzID0gW107XG4gIHB1YmxpYyBzdG9wV2l0aEhvdmVyOiBTdG9wO1xuICBwdWJsaWMgc3RvcElzRHJhZ2dlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UpIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIHByb3BlcnR5IG9mIHRoZSBnZW9sb2NhdGlvbkNvbnRyb2xsZXIuXG4gICAqXG4gICAqIEByZXR1cm4ge0JlaGF2aW9yU3ViamVjdDxib29sZWFuPiB8IHVuZGVmaW5lZH0gVGhlIHBvc2l0aW9uIHByb3BlcnR5IG9mXG4gICAqIHRoZSBnZW9sb2NhdGlvbkNvbnRyb2xsZXIuXG4gICAqL1xuICBnZXQgY3VycmVudFBvc2l0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0b3BzRmVhdHVyZVN0b3JlPy5tYXA/Lmdlb2xvY2F0aW9uQ29udHJvbGxlcj8ucG9zaXRpb24kPy52YWx1ZVxuICAgICAgICA/LnBvc2l0aW9uICYmXG4gICAgICB0aGlzLnN0b3BzRmVhdHVyZVN0b3JlPy5tYXA/Lmdlb2xvY2F0aW9uQ29udHJvbGxlcj8udHJhY2tpbmdcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bmxpc3Rlbk1hcFNpbmdsZUNsaWNrKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0b3Agd2l0aCBob3ZlciB0byB0aGUgZ2l2ZW4gc3RvcC5cbiAgICpcbiAgICogQHBhcmFtIHtTdG9wfSBzdG9wIC0gVGhlIHN0b3AgdG8gc2V0IGFzIHRoZSBzdG9wIHdpdGggaG92ZXIuXG4gICAqL1xuICBvblN0b3BFbnRlcihzdG9wOiBTdG9wKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wV2l0aEhvdmVyID0gc3RvcDtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgc3RvcCB3aXRoIGhvdmVyIHRvIHVuZGVmaW5lZC5cbiAgICpcbiAgICovXG4gIG9uU3RvcExlYXZlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFdpdGhIb3ZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RvcCB0byB0aGUgc3RvcHMgc3RvcmUuXG4gICAqXG4gICAqL1xuICBhZGRTdG9wKCk6IHZvaWQge1xuICAgIGFkZFN0b3BUb1N0b3JlKHRoaXMuc3RvcHNTdG9yZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGl0bGUgb2YgdGhlIG9wdGlvbiBpZiBpdCBpcyBhbiBvYmplY3QgYW5kIGhhcyBhIG1ldGEgcHJvcGVydHkgd2l0aCBhIHRpdGxlLFxuICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgb3B0aW9uIGl0c2VsZi5cbiAgICpcbiAgICogQHBhcmFtIHthbnl9IG9wdGlvbiAtIFRoZSBvcHRpb24gdG8gZ2V0IHRoZSB0ZXh0IGZyb20uXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRpdGxlIG9mIHRoZSBvcHRpb24gaWYgaXQgaXMgYW4gb2JqZWN0IGFuZCBoYXMgYSBtZXRhIHByb3BlcnR5IHdpdGggYSB0aXRsZSxcbiAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIG9wdGlvbiBpdHNlbGYuXG4gICAqL1xuICBnZXRPcHRpb25UZXh0KG9wdGlvbjogYW55KTogc3RyaW5nIHtcbiAgICBpZiAob3B0aW9uIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICBjb25zdCB7IG1ldGEgfSA9IG9wdGlvbjtcbiAgICAgIHJldHVybiBtZXRhPy50aXRsZSB8fCAnJztcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaG9vc2VzIGFuIG9wdGlvbiBmcm9tIGEgTWF0QXV0b2NvbXBsZXRlIGFuZCB1cGRhdGVzIHRoZSBzdG9wIGNvb3JkaW5hdGVzIGFuZCB0ZXh0XG4gICAqIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBmZWF0dXJlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIE1hdEF1dG9jb21wbGV0ZSBhbmQgTWF0T3B0aW9uLlxuICAgKiBAcGFyYW0ge01hdEF1dG9jb21wbGV0ZX0gZXZlbnQuc291cmNlIC0gVGhlIE1hdEF1dG9jb21wbGV0ZSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSB7TWF0T3B0aW9ufSBldmVudC5vcHRpb24gLSBUaGUgc2VsZWN0ZWQgTWF0T3B0aW9uLlxuICAgKiBAcGFyYW0ge1N0b3B9IHN0b3AgLSBUaGUgc3RvcCBvYmplY3QgdG8gdXBkYXRlLlxuICAgKi9cbiAgY2hvb3NlT3B0aW9uKFxuICAgIGV2ZW50OiB7IHNvdXJjZTogTWF0QXV0b2NvbXBsZXRlOyBvcHRpb246IE1hdE9wdGlvbiB9LFxuICAgIHN0b3A6IFN0b3BcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZmVhdHVyZTogRmVhdHVyZSA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcbiAgICBpZiAoZmVhdHVyZSkge1xuICAgICAgbGV0IGNvb3JkczogQ29vcmRpbmF0ZTtcbiAgICAgIGNvbnN0IGdlb21ldHJ5OiBGZWF0dXJlR2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgY29vcmRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXMgYXMgUG9zaXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50T25GZWF0dXJlKGZlYXR1cmUuZ2VvbWV0cnkpO1xuICAgICAgICBjb29yZHMgPSBbcG9pbnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sIHBvaW50Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdXTtcbiAgICAgIH1cbiAgICAgIGlmIChjb29yZHMpIHtcbiAgICAgICAgc3RvcC5jb29yZGluYXRlcyA9IGNvb3JkcztcbiAgICAgICAgc3RvcC50ZXh0ID0gZmVhdHVyZS5tZXRhLnRpdGxlO1xuICAgICAgICB0aGlzLnN0b3BzU3RvcmUudXBkYXRlKHN0b3ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0ZXh0IG9mIGEgc3RvcCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgYW4gaW5wdXQgZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgLSBUaGUga2V5Ym9hcmQgZXZlbnQgdHJpZ2dlcmVkIGJ5IHRoZSBpbnB1dCBmaWVsZC5cbiAgICogQHBhcmFtIHtTdG9wfSBzdG9wIC0gVGhlIHN0b3Agb2JqZWN0IHRvIHVwZGF0ZS5cbiAgICovXG4gIHNldFN0b3BUZXh0KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBzdG9wOiBTdG9wKTogdm9pZCB7XG4gICAgdGhpcy51bmxpc3Rlbk1hcFNpbmdsZUNsaWNrKCk7XG4gICAgY29uc3Qgc2VhcmNoVGVybTogc3RyaW5nID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICBpZiAoc2VhcmNoVGVybS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2xlYXJTdG9wSW5wdXQoc3RvcCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnZhbGlkYXRlU2VhcmNoVGVybShzZWFyY2hUZXJtKSkge1xuICAgICAgc3RvcC50ZXh0ID0gc2VhcmNoVGVybTtcbiAgICAgIHRoaXMuc3RvcHNTdG9yZS51cGRhdGUoc3RvcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHNlYXJjaCB0ZXJtIGJ5IGNoZWNraW5nIGlmIGl0IGNvbnRhaW5zIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMgYW5kIGlmIGl0cyBsZW5ndGggaXMgdmFsaWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWFyY2hUZXJtIC0gVGhlIHNlYXJjaCB0ZXJtIHRvIGJlIHZhbGlkYXRlZC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBzZWFyY2ggdGVybSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNlYXJjaFRlcm0oc2VhcmNoVGVybTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2hhcmFjdGVyc0FyZVZhbGlkOiBib29sZWFuID1cbiAgICAgIHRoaXMuaW52YWxpZEtleXMuaW5kZXhPZihzZWFyY2hUZXJtKSA9PT0gLTE7XG4gICAgY29uc3QgbGVuZ3RoSXNWYWxpZDogYm9vbGVhbiA9XG4gICAgICBzZWFyY2hUZXJtLmxlbmd0aCA+PSB0aGlzLmxlbmd0aCB8fCBzZWFyY2hUZXJtLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gY2hhcmFjdGVyc0FyZVZhbGlkICYmIGxlbmd0aElzVmFsaWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBnaXZlbiBzdG9wIGlucHV0LlxuICAgKlxuICAgKiBAcGFyYW0ge1N0b3B9IHN0b3AgLSBUaGUgc3RvcCBjb250YWluaW5nIHJlbGF0aXZlUG9zaXRpb24gYW5kIHBvc2l0aW9uLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBsYWJlbCBmb3IgdGhlIHN0b3AgaW5wdXQuXG4gICAqL1xuICBnZXRJbnB1dExhYmVsKHN0b3A6IFN0b3ApOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgcmVsYXRpdmVQb3NpdGlvbiwgcG9zaXRpb24gfSA9IHN0b3A7XG4gICAgY29uc3QgbGFiZWw6IHN0cmluZyA9IHJlbGF0aXZlUG9zaXRpb25cbiAgICAgID8gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgYGlnby5nZW8uZGlyZWN0aW9ucy5pbnB1dC4ke3JlbGF0aXZlUG9zaXRpb259YFxuICAgICAgICApXG4gICAgICA6ICcnO1xuICAgIHJldHVybiByZWxhdGl2ZVBvc2l0aW9uID09PSBEaXJlY3Rpb25SZWxhdGl2ZVBvc2l0aW9uVHlwZS5JbnRlcm1lZGlhdGVcbiAgICAgID8gYCR7bGFiZWx9ICMke3Bvc2l0aW9ufWBcbiAgICAgIDogbGFiZWw7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHN0b3AgZnJvbSB0aGUgc3RvcHMgc3RvcmUuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RvcH0gc3RvcCAtIFRoZSBzdG9wIG9iamVjdCB0byBiZSByZW1vdmVkLlxuICAgKi9cbiAgcmVtb3ZlU3RvcChzdG9wOiBTdG9wKTogdm9pZCB7XG4gICAgcmVtb3ZlU3RvcEZyb21TdG9yZSh0aGlzLnN0b3BzU3RvcmUsIHN0b3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgc3BlY2lmaWVkIHN0b3AgaW4gdGhlIHN0b3BzIHN0b3JlLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0b3B9IHN0b3AgLSBUaGUgc3RvcCB0byBiZSBjbGVhcmVkLlxuICAgKi9cbiAgY2xlYXJTdG9wSW5wdXQoc3RvcDogU3RvcCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcHNTdG9yZS51cGRhdGUoe1xuICAgICAgaWQ6IHN0b3AuaWQsXG4gICAgICByZWxhdGl2ZVBvc2l0aW9uOiBzdG9wLnJlbGF0aXZlUG9zaXRpb24sXG4gICAgICBwb3NpdGlvbjogc3RvcC5wb3NpdGlvblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgY3VycmVudCBwb3NpdGlvbiBhcyBhIHN0b3AuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RvcH0gc3RvcCAtIFRoZSBzdG9wIHRvIHVwZGF0ZSB3aXRoIHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuICAgKi9cbiAgdXNlQ3VycmVudFBvc2l0aW9uKHN0b3A6IFN0b3ApOiB2b2lkIHtcbiAgICB0aGlzLnVzZUNvb3JkaW5hdGVzQXNTdG9wKFxuICAgICAgdGhpcy5zdG9wc0ZlYXR1cmVTdG9yZS5tYXAuZ2VvbG9jYXRpb25Db250cm9sbGVyLnBvc2l0aW9uJC52YWx1ZS5wb3NpdGlvbixcbiAgICAgIHN0b3BcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGEgc3RvcCBpbiB0aGUgbGlzdCBvZiBzdG9wcy4uXG4gICAqXG4gICAqIEBwYXJhbSB7Q2RrRHJhZ0Ryb3A8c3RyaW5nW10+fSBldmVudCAtIFRoZSBldmVudCBjb250YWluaW5nIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBpbmRleCBvZiB0aGUgZHJvcHBlZCBzdG9wLlxuICAgKi9cbiAgZHJvcFN0b3AoZXZlbnQ6IENka0RyYWdEcm9wPHN0cmluZ1tdPik6IHZvaWQge1xuICAgIHRoaXMubW92ZVN0b3BzKGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYSBzdG9wIGluIHRoZSBsaXN0IG9mIHN0b3BzIGZyb20gb25lIGluZGV4IHRvIGFub3RoZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggLSBUaGUgaW5kZXggdG8gbW92ZSB0aGUgc3RvcCBmcm9tLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdG9JbmRleCAtIFRoZSBpbmRleCB0byBtb3ZlIHRoZSBzdG9wIHRvLlxuICAgKi9cbiAgcHJpdmF0ZSBtb3ZlU3RvcHMoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChmcm9tSW5kZXggIT09IHRvSW5kZXgpIHtcbiAgICAgIGNvbnN0IHN0b3BzOiBTdG9wW10gPSBbLi4udGhpcy5zdG9wc1N0b3JlLnZpZXcuYWxsKCldO1xuICAgICAgbW92ZUl0ZW1JbkFycmF5KHN0b3BzLCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICAgICAgc3RvcHMubWFwKChzdG9wLCBzdG9wSW5kZXgpID0+IHtcbiAgICAgICAgc3RvcC5yZWxhdGl2ZVBvc2l0aW9uID0gY29tcHV0ZVJlbGF0aXZlUG9zaXRpb24oXG4gICAgICAgICAgc3RvcEluZGV4LFxuICAgICAgICAgIHN0b3BzLmxlbmd0aCAtIDFcbiAgICAgICAgKTtcbiAgICAgICAgc3RvcC5wb3NpdGlvbiA9IHN0b3BJbmRleDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdG9wc1N0b3JlLnVwZGF0ZU1hbnkoc3RvcHMpO1xuICAgICAgdXBkYXRlU3RvcmVTb3J0aW5nKHRoaXMuc3RvcHNTdG9yZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGZvY3VzIGV2ZW50IG9uIGFuIGlucHV0IGZpZWxkIGZvciBhIHN0b3AuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RvcH0gc3RvcCAtIFRoZSBzdG9wIHRoYXQgdGhlIGlucHV0IGZpZWxkIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICovXG4gIG9uSW5wdXRGb2N1cyhzdG9wOiBTdG9wKTogdm9pZCB7XG4gICAgdGhpcy51bmxpc3Rlbk1hcFNpbmdsZUNsaWNrKCk7XG4gICAgdGhpcy5zdG9wSW5wdXRIYXNGb2N1cy5lbWl0KHRydWUpO1xuICAgIHRoaXMubGlzdGVuTWFwU2luZ2xlQ2xpY2soc3RvcCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVucyBmb3IgYSBzaW5nbGUgY2xpY2sgZXZlbnQgb24gdGhlIG1hcCBhbmQgdXNlcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNsaWNrXG4gICAqIHRvIHNldCB0aGUgZ2l2ZW4gc3RvcCdzIGNvb3JkaW5hdGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0b3B9IHN0b3AgLSBUaGUgc3RvcCB0byB1cGRhdGUgd2l0aCB0aGUgY2xpY2tlZCBjb29yZGluYXRlcy5cbiAgICovXG4gIHByaXZhdGUgbGlzdGVuTWFwU2luZ2xlQ2xpY2soc3RvcDogU3RvcCk6IHZvaWQge1xuICAgIGNvbnN0IGtleTogRXZlbnRzS2V5ID0gdGhpcy5zdG9wc0ZlYXR1cmVTdG9yZS5sYXllci5tYXAub2wub25jZShcbiAgICAgICdzaW5nbGVjbGljaycsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy51c2VDb29yZGluYXRlc0FzU3RvcChldmVudC5jb29yZGluYXRlLCBzdG9wKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMub25NYXBDbGlja0V2ZW50S2V5cy5wdXNoKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVW5saXN0ZW5zIGZvciBtYXAgc2luZ2xlIGNsaWNrIGV2ZW50cyBhbmQgY2xlYXJzIHRoZSBsaXN0IG9mIGV2ZW50IGtleXMuXG4gICAqL1xuICBwcml2YXRlIHVubGlzdGVuTWFwU2luZ2xlQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5vbk1hcENsaWNrRXZlbnRLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBvbE9ic2VydmFibGUudW5CeUtleShrZXkpO1xuICAgIH0pO1xuICAgIHRoaXMub25NYXBDbGlja0V2ZW50S2V5cyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXMgdGhlIGdpdmVuIGNvb3JkaW5hdGVzIHRvIHVwZGF0ZSB0aGUgZ2l2ZW4gc3RvcC5cbiAgICpcbiAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZGluYXRlcyAtIFRoZSBjb29yZGluYXRlcyB0byB0cmFuc2Zvcm0gYW5kIHJvdW5kLlxuICAgKiBAcGFyYW0ge1N0b3B9IHN0b3AgLSBUaGUgc3RvcCB0byB1cGRhdGUgd2l0aCB0aGUgbmV3IGNvb3JkaW5hdGVzIGFuZCB0ZXh0LlxuICAgKi9cbiAgcHJpdmF0ZSB1c2VDb29yZGluYXRlc0FzU3RvcChjb29yZGluYXRlczogQ29vcmRpbmF0ZSwgc3RvcDogU3RvcCk6IHZvaWQge1xuICAgIGNvbnN0IHByb2plY3RlZENvb3JkaW5hdGVzOiBDb29yZGluYXRlID0gb2xQcm9qLnRyYW5zZm9ybShcbiAgICAgIGNvb3JkaW5hdGVzLFxuICAgICAgdGhpcy5zdG9wc0ZlYXR1cmVTdG9yZS5sYXllci5tYXAucHJvamVjdGlvbixcbiAgICAgIHRoaXMucHJvamVjdGlvblxuICAgICk7XG4gICAgY29uc3Qgcm91bmRlZENvb3JkaW5hdGVzOiBDb29yZGluYXRlID0gcm91bmRDb29yZFRvKFxuICAgICAgcHJvamVjdGVkQ29vcmRpbmF0ZXMsXG4gICAgICB0aGlzLmNvb3JkUm91bmRlZERlY2ltYWxzXG4gICAgKTtcblxuICAgIHN0b3AudGV4dCA9IHJvdW5kQ29vcmRUb1N0cmluZyhcbiAgICAgIHByb2plY3RlZENvb3JkaW5hdGVzLFxuICAgICAgdGhpcy5jb29yZFJvdW5kZWREZWNpbWFsc1xuICAgICkuam9pbignLCAnKTtcbiAgICBzdG9wLmNvb3JkaW5hdGVzID0gcm91bmRlZENvb3JkaW5hdGVzO1xuICAgIHRoaXMuc3RvcHNTdG9yZS51cGRhdGUoc3RvcCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN0b3BJbnB1dEhhc0ZvY3VzLmVtaXQoZmFsc2UpO1xuICAgIH0sIDUwMCk7XG4gIH1cbn1cbiIsIjxkaXYgY2RrRHJvcExpc3QgY2xhc3M9XCJzdG9wcy1saXN0XCIgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wU3RvcCgkZXZlbnQpXCI+XG4gIDxkaXZcbiAgICAqbmdGb3I9XCJsZXQgc3RvcCBvZiBzdG9wc1N0b3JlLnZpZXcuYWxsJCgpIHwgYXN5bmM7IGxldCBzdG9wSW5kZXggPSBpbmRleFwiXG4gICAgY2xhc3M9XCJzdG9wXCJcbiAgPlxuICAgIDxkaXZcbiAgICAgICh0b3VjaGVudGVyKT1cIm9uU3RvcEVudGVyKHN0b3ApXCJcbiAgICAgICh0b3VjaGxlYXZlKT1cIm9uU3RvcExlYXZlKClcIlxuICAgICAgKG1vdXNlb3Zlcik9XCJvblN0b3BFbnRlcihzdG9wKVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJvblN0b3BMZWF2ZSgpXCJcbiAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJzdG9wSXNEcmFnZ2VkID0gdHJ1ZVwiXG4gICAgICAoY2RrRHJhZ0VuZGVkKT1cInN0b3BJc0RyYWdnZWQgPSBmYWxzZVwiXG4gICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ5XCJcbiAgICAgIGNsYXNzPVwic3RvcC1ib3hcIlxuICAgICAgY2RrRHJhZ1xuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmVmaXgtYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJzd2lwZS12ZXJ0aWNhbFwiXG4gICAgICAgICAgY2RrRHJhZ0hhbmRsZVxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmRpcmVjdGlvbnMuaW5wdXQubW92ZVN0b3AnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPnt7IGdldElucHV0TGFiZWwoc3RvcCkgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtpZF09XCJzdG9wLmlkXCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInaWdvLmdlby5kaXJlY3Rpb25zLmlucHV0LnBsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uSW5wdXRGb2N1cyhzdG9wKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0b3AudGV4dFwiXG4gICAgICAgICAgICAoa2V5dXApPVwic2V0U3RvcFRleHQoJGV2ZW50LCBzdG9wKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50UG9zaXRpb25cIlxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBtYXRQcmVmaXhcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zLmlucHV0LmN1cnJlbnRQb3NpdGlvbicgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjb2xvcj1cImFjY2VudFwiXG4gICAgICAgICAgICAoY2xpY2spPVwidXNlQ3VycmVudFBvc2l0aW9uKHN0b3ApOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5teV9sb2NhdGlvbjwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJzdG9wLnRleHQgfHwgc3RvcC5jb29yZGluYXRlc1wiXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9ucy5pbnB1dC5jbGVhclN0b3AnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTdG9wSW5wdXQoc3RvcClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgW2Rpc3BsYXlXaXRoXT1cImdldE9wdGlvblRleHRcIlxuICAgICAgICAgICAgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cImNob29zZU9wdGlvbigkZXZlbnQsIHN0b3ApXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LW9wdGdyb3VwXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzb3VyY2Ugb2Ygc3RvcC5zZWFyY2hQcm9wb3NhbHNcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwic291cmNlLnNvdXJjZS50aXRsZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc291cmNlLnNvdXJjZS5lbmFibGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcmVzdWx0IG9mIHNvdXJjZS5yZXN1bHRzXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwicmVzdWx0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHJlc3VsdC5tZXRhID8gcmVzdWx0Lm1ldGEudGl0bGUgOiAnJyB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1vcHRncm91cD5cbiAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJkZWxldGUtYnV0dG9uXCJcbiAgICAgICAgKm5nSWY9XCIoc3RvcHNTdG9yZS5jb3VudCQgfCBhc3luYykgPiAyXCJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmRpcmVjdGlvbnMuaW5wdXQucmVtb3ZlU3RvcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgICAoY2xpY2spPVwicmVtb3ZlU3RvcChzdG9wKVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicHJlZml4LWFjdGlvbnNcIj5cbiAgICA8YnV0dG9uXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgKHN0b3BzU3RvcmUuY291bnQkIHwgYXN5bmMpICE9PSAoc3RvcHNGZWF0dXJlU3RvcmUuY291bnQkIHwgYXN5bmMpIHx8XG4gICAgICAgIHN0b3BJc0RyYWdnZWRcbiAgICAgIFwiXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kaXJlY3Rpb25zLmlucHV0LmFkZFN0b3AnIHwgdHJhbnNsYXRlXCJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAoY2xpY2spPVwiYWRkU3RvcCgpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+YWRkX2xvY2F0aW9uX2FsdDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|