@igo2/geo 1.14.2 → 1.14.3
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/esm2020/igo2-geo.mjs +4 -4
- package/esm2020/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +300 -300
- package/esm2020/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +305 -305
- package/esm2020/lib/catalog/catalog-browser/catalog-browser.component.mjs +246 -246
- package/esm2020/lib/catalog/catalog-browser/catalog-browser.module.mjs +79 -79
- package/esm2020/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +208 -208
- package/esm2020/lib/catalog/catalog-library/catalog-library-item.component.mjs +78 -78
- package/esm2020/lib/catalog/catalog-library/catalog-library.component.mjs +216 -216
- package/esm2020/lib/catalog/catalog-library/catalog-library.module.mjs +94 -94
- package/esm2020/lib/catalog/catalog.module.mjs +52 -52
- package/esm2020/lib/catalog/index.mjs +4 -4
- package/esm2020/lib/catalog/shared/catalog.abstract.mjs +94 -94
- package/esm2020/lib/catalog/shared/catalog.enum.mjs +15 -15
- package/esm2020/lib/catalog/shared/catalog.interface.mjs +1 -1
- package/esm2020/lib/catalog/shared/catalog.service.mjs +605 -605
- package/esm2020/lib/catalog/shared/index.mjs +4 -4
- package/esm2020/lib/datasource/datasource.module.mjs +21 -21
- package/esm2020/lib/datasource/index.mjs +2 -2
- package/esm2020/lib/datasource/shared/capabilities.service.mjs +430 -430
- package/esm2020/lib/datasource/shared/datasource.service.mjs +235 -235
- package/esm2020/lib/datasource/shared/datasources/any-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/any-datasource.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +144 -144
- package/esm2020/lib/datasource/shared/datasources/carto-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/carto-datasource.mjs +108 -108
- package/esm2020/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/cluster-datasource.mjs +14 -14
- package/esm2020/lib/datasource/shared/datasources/data.service.mjs +2 -2
- package/esm2020/lib/datasource/shared/datasources/datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/datasource.mjs +28 -28
- package/esm2020/lib/datasource/shared/datasources/feature-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/feature-datasource.mjs +42 -42
- package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +56 -56
- package/esm2020/lib/datasource/shared/datasources/index.mjs +35 -35
- package/esm2020/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/mvt-datasource.mjs +27 -27
- package/esm2020/lib/datasource/shared/datasources/osm-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/osm-datasource.mjs +11 -11
- package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +48 -48
- package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.mjs +14 -14
- package/esm2020/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/websocket-datasource.mjs +53 -53
- package/esm2020/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/wfs-datasource.mjs +71 -71
- package/esm2020/lib/datasource/shared/datasources/wfs.service.mjs +151 -151
- package/esm2020/lib/datasource/shared/datasources/wms-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/wms-datasource.mjs +205 -205
- package/esm2020/lib/datasource/shared/datasources/wms-wfs.utils.mjs +206 -206
- package/esm2020/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/wmts-datasource.mjs +15 -15
- package/esm2020/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/xyz-datasource.mjs +8 -8
- package/esm2020/lib/datasource/shared/index.mjs +4 -4
- package/esm2020/lib/datasource/shared/options/index.mjs +4 -4
- package/esm2020/lib/datasource/shared/options/options-api.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/options/options-api.providers.mjs +14 -14
- package/esm2020/lib/datasource/shared/options/options-api.service.mjs +80 -80
- package/esm2020/lib/datasource/shared/options/options.service.mjs +2 -2
- package/esm2020/lib/datasource/utils/esri-style-generator.mjs +356 -356
- package/esm2020/lib/datasource/utils/index.mjs +2 -2
- package/esm2020/lib/datasource/utils/tilegrid.mjs +19 -19
- package/esm2020/lib/directions/directions-buttons/directions-buttons.component.mjs +223 -223
- package/esm2020/lib/directions/directions-buttons/index.mjs +1 -1
- package/esm2020/lib/directions/directions-inputs/directions-inputs.component.mjs +289 -289
- package/esm2020/lib/directions/directions-inputs/index.mjs +1 -1
- package/esm2020/lib/directions/directions-results/directions-results.component.mjs +195 -195
- package/esm2020/lib/directions/directions-results/index.mjs +1 -1
- package/esm2020/lib/directions/directions-sources/directions-source.interface.mjs +1 -1
- package/esm2020/lib/directions/directions-sources/directions-source.mjs +2 -2
- package/esm2020/lib/directions/directions-sources/directions-source.provider.mjs +15 -15
- package/esm2020/lib/directions/directions-sources/index.mjs +4 -4
- package/esm2020/lib/directions/directions-sources/osrm-directions-source.mjs +98 -98
- package/esm2020/lib/directions/directions.component.mjs +310 -310
- package/esm2020/lib/directions/directions.module.mjs +101 -101
- package/esm2020/lib/directions/index.mjs +6 -6
- package/esm2020/lib/directions/shared/directions-source.service.mjs +16 -16
- package/esm2020/lib/directions/shared/directions.enum.mjs +27 -27
- package/esm2020/lib/directions/shared/directions.interface.mjs +1 -1
- package/esm2020/lib/directions/shared/directions.service.mjs +28 -28
- package/esm2020/lib/directions/shared/directions.utils.mjs +508 -508
- package/esm2020/lib/directions/shared/index.mjs +5 -5
- package/esm2020/lib/directions/shared/store.mjs +23 -23
- package/esm2020/lib/download/download-button/download-button.component.mjs +60 -60
- package/esm2020/lib/download/download-button/index.mjs +1 -1
- package/esm2020/lib/download/download.module.mjs +41 -41
- package/esm2020/lib/download/index.mjs +2 -2
- package/esm2020/lib/download/shared/download.interface.mjs +1 -1
- package/esm2020/lib/download/shared/download.service.mjs +64 -64
- package/esm2020/lib/download/shared/index.mjs +2 -2
- package/esm2020/lib/draw/draw/draw-layer-popup.component.mjs +54 -54
- package/esm2020/lib/draw/draw/draw-popup.component.mjs +590 -590
- package/esm2020/lib/draw/draw/draw-shorcuts.component.mjs +47 -47
- package/esm2020/lib/draw/draw/draw.component.mjs +1298 -1298
- package/esm2020/lib/draw/draw/draw.module.mjs +112 -112
- package/esm2020/lib/draw/drawingTool.module.mjs +19 -19
- package/esm2020/lib/draw/index.mjs +2 -2
- package/esm2020/lib/draw/shared/draw-icon.service.mjs +26 -26
- package/esm2020/lib/draw/shared/draw-style.service.mjs +189 -189
- package/esm2020/lib/draw/shared/draw.enum.mjs +36 -36
- package/esm2020/lib/draw/shared/draw.interface.mjs +1 -1
- package/esm2020/lib/draw/shared/draw.utils.mjs +121 -121
- package/esm2020/lib/draw/shared/index.mjs +5 -5
- package/esm2020/lib/feature/feature-details/feature-details.component.mjs +404 -404
- package/esm2020/lib/feature/feature-details/feature-details.directive.mjs +53 -53
- package/esm2020/lib/feature/feature-details/feature-details.module.mjs +47 -47
- package/esm2020/lib/feature/feature-form/feature-form.component.mjs +111 -111
- package/esm2020/lib/feature/feature-form/feature-form.module.mjs +33 -33
- package/esm2020/lib/feature/feature.module.mjs +27 -27
- package/esm2020/lib/feature/index.mjs +3 -3
- package/esm2020/lib/feature/shared/feature.enums.mjs +8 -8
- package/esm2020/lib/feature/shared/feature.interfaces.mjs +1 -1
- package/esm2020/lib/feature/shared/feature.utils.mjs +346 -346
- package/esm2020/lib/feature/shared/index.mjs +6 -6
- package/esm2020/lib/feature/shared/store.mjs +123 -123
- package/esm2020/lib/feature/shared/strategies/in-map-extent.mjs +112 -112
- package/esm2020/lib/feature/shared/strategies/in-map-resolution.mjs +93 -93
- package/esm2020/lib/feature/shared/strategies/index.mjs +5 -5
- package/esm2020/lib/feature/shared/strategies/loading-layer.mjs +103 -103
- package/esm2020/lib/feature/shared/strategies/loading.mjs +132 -132
- package/esm2020/lib/feature/shared/strategies/selection.mjs +369 -369
- package/esm2020/lib/feature/shared/strategies.utils.mjs +36 -36
- package/esm2020/lib/filter/filter.module.mjs +288 -288
- package/esm2020/lib/filter/index.mjs +15 -15
- package/esm2020/lib/filter/ogc-filter-button/index.mjs +1 -1
- package/esm2020/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +139 -139
- package/esm2020/lib/filter/ogc-filter-form/index.mjs +1 -1
- package/esm2020/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +644 -644
- package/esm2020/lib/filter/ogc-filter-selection/index.mjs +1 -1
- package/esm2020/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +1301 -1301
- package/esm2020/lib/filter/ogc-filter-time/index.mjs +2 -2
- package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +176 -176
- package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +897 -897
- package/esm2020/lib/filter/ogc-filterable-form/index.mjs +1 -1
- package/esm2020/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +58 -58
- package/esm2020/lib/filter/ogc-filterable-item/index.mjs +1 -1
- package/esm2020/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +306 -306
- package/esm2020/lib/filter/ogc-filterable-list/index.mjs +2 -2
- package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +30 -30
- package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +43 -43
- package/esm2020/lib/filter/shared/filterable-datasource.pipe.mjs +54 -54
- package/esm2020/lib/filter/shared/index.mjs +11 -11
- package/esm2020/lib/filter/shared/ogc-filter-time.service.mjs +71 -71
- package/esm2020/lib/filter/shared/ogc-filter.enum.mjs +29 -29
- package/esm2020/lib/filter/shared/ogc-filter.interface.mjs +1 -1
- package/esm2020/lib/filter/shared/ogc-filter.mjs +691 -691
- package/esm2020/lib/filter/shared/ogc-filter.service.mjs +45 -45
- package/esm2020/lib/filter/shared/spatial-filter.enum.mjs +22 -22
- package/esm2020/lib/filter/shared/spatial-filter.interface.mjs +1 -1
- package/esm2020/lib/filter/shared/spatial-filter.service.mjs +268 -268
- package/esm2020/lib/filter/shared/time-filter.enum.mjs +12 -12
- package/esm2020/lib/filter/shared/time-filter.interface.mjs +1 -1
- package/esm2020/lib/filter/shared/time-filter.service.mjs +106 -106
- package/esm2020/lib/filter/spatial-filter/spatial-filter-item/index.mjs +1 -1
- package/esm2020/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +1088 -1088
- package/esm2020/lib/filter/spatial-filter/spatial-filter-list/index.mjs +1 -1
- package/esm2020/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +207 -207
- package/esm2020/lib/filter/spatial-filter/spatial-filter-type/index.mjs +1 -1
- package/esm2020/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +143 -143
- package/esm2020/lib/filter/time-filter-button/index.mjs +1 -1
- package/esm2020/lib/filter/time-filter-button/time-filter-button.component.mjs +77 -77
- package/esm2020/lib/filter/time-filter-form/index.mjs +1 -1
- package/esm2020/lib/filter/time-filter-form/time-filter-form.component.mjs +733 -733
- package/esm2020/lib/filter/time-filter-item/index.mjs +1 -1
- package/esm2020/lib/filter/time-filter-item/time-filter-item.component.mjs +118 -118
- package/esm2020/lib/filter/time-filter-list/index.mjs +2 -2
- package/esm2020/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +30 -30
- package/esm2020/lib/filter/time-filter-list/time-filter-list.component.mjs +38 -38
- package/esm2020/lib/geo.module.mjs +101 -101
- package/esm2020/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +520 -520
- package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +188 -188
- package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +63 -63
- package/esm2020/lib/geometry/geometry.module.mjs +26 -26
- package/esm2020/lib/geometry/index.mjs +3 -3
- package/esm2020/lib/geometry/shared/controls/draw.mjs +313 -313
- package/esm2020/lib/geometry/shared/controls/index.mjs +3 -3
- package/esm2020/lib/geometry/shared/controls/modify.mjs +520 -520
- package/esm2020/lib/geometry/shared/controls/slice.mjs +176 -176
- package/esm2020/lib/geometry/shared/geometry.errors.mjs +25 -25
- package/esm2020/lib/geometry/shared/geometry.interfaces.mjs +1 -1
- package/esm2020/lib/geometry/shared/geometry.utils.mjs +121 -121
- package/esm2020/lib/geometry/shared/index.mjs +4 -4
- package/esm2020/lib/import-export/export-button/export-button.component.mjs +63 -63
- package/esm2020/lib/import-export/export-button/index.mjs +1 -1
- package/esm2020/lib/import-export/import-export/import-export.component.mjs +1219 -1219
- package/esm2020/lib/import-export/import-export/index.mjs +1 -1
- package/esm2020/lib/import-export/import-export.module.mjs +95 -95
- package/esm2020/lib/import-export/index.mjs +4 -4
- package/esm2020/lib/import-export/shared/drop-geo-file.directive.mjs +134 -134
- package/esm2020/lib/import-export/shared/export.errors.mjs +14 -14
- package/esm2020/lib/import-export/shared/export.interface.mjs +1 -1
- package/esm2020/lib/import-export/shared/export.service.mjs +194 -194
- package/esm2020/lib/import-export/shared/export.type.mjs +3 -3
- package/esm2020/lib/import-export/shared/export.utils.mjs +54 -54
- package/esm2020/lib/import-export/shared/import.errors.mjs +38 -38
- package/esm2020/lib/import-export/shared/import.interface.mjs +1 -1
- package/esm2020/lib/import-export/shared/import.service.mjs +214 -214
- package/esm2020/lib/import-export/shared/import.utils.mjs +234 -234
- package/esm2020/lib/import-export/shared/index.mjs +10 -10
- package/esm2020/lib/import-export/style-list/index.mjs +4 -4
- package/esm2020/lib/import-export/style-list/style-list.interface.mjs +1 -1
- package/esm2020/lib/import-export/style-list/style-list.module.mjs +22 -22
- package/esm2020/lib/import-export/style-list/style-list.provider.mjs +20 -20
- package/esm2020/lib/import-export/style-list/style-list.service.mjs +50 -50
- package/esm2020/lib/layer/index.mjs +10 -10
- package/esm2020/lib/layer/layer-item/index.mjs +1 -1
- package/esm2020/lib/layer/layer-item/layer-item.component.mjs +299 -299
- package/esm2020/lib/layer/layer-legend/index.mjs +1 -1
- package/esm2020/lib/layer/layer-legend/layer-legend.component.mjs +387 -387
- package/esm2020/lib/layer/layer-legend-item/index.mjs +1 -1
- package/esm2020/lib/layer/layer-legend-item/layer-legend-item.component.mjs +83 -83
- package/esm2020/lib/layer/layer-legend-list/index.mjs +2 -2
- package/esm2020/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +47 -47
- package/esm2020/lib/layer/layer-legend-list/layer-legend-list.component.mjs +194 -194
- package/esm2020/lib/layer/layer-list/index.mjs +3 -3
- package/esm2020/lib/layer/layer-list/layer-list-binding.directive.mjs +58 -58
- package/esm2020/lib/layer/layer-list/layer-list.component.mjs +1008 -1008
- package/esm2020/lib/layer/layer-list/layer-list.enum.mjs +18 -18
- package/esm2020/lib/layer/layer-list-tool/index.mjs +4 -4
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.component.mjs +164 -164
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +6 -6
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +1 -1
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.service.mjs +21 -21
- package/esm2020/lib/layer/layer.module.mjs +184 -184
- package/esm2020/lib/layer/shared/clusterParam.mjs +1 -1
- package/esm2020/lib/layer/shared/index.mjs +6 -6
- package/esm2020/lib/layer/shared/layer.enums.mjs +1 -1
- package/esm2020/lib/layer/shared/layer.service.mjs +185 -185
- package/esm2020/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
- package/esm2020/lib/layer/shared/layers/any-layer.mjs +1 -1
- package/esm2020/lib/layer/shared/layers/image-layer.interface.mjs +1 -1
- package/esm2020/lib/layer/shared/layers/image-layer.mjs +67 -67
- package/esm2020/lib/layer/shared/layers/index.mjs +12 -12
- package/esm2020/lib/layer/shared/layers/layer.interface.mjs +17 -17
- package/esm2020/lib/layer/shared/layers/layer.mjs +163 -163
- package/esm2020/lib/layer/shared/layers/tile-layer.interface.mjs +1 -1
- package/esm2020/lib/layer/shared/layers/tile-layer.mjs +46 -46
- package/esm2020/lib/layer/shared/layers/vector-layer.interface.mjs +1 -1
- package/esm2020/lib/layer/shared/layers/vector-layer.mjs +377 -377
- package/esm2020/lib/layer/shared/layers/vectortile-layer.interface.mjs +1 -1
- package/esm2020/lib/layer/shared/layers/vectortile-layer.mjs +103 -103
- package/esm2020/lib/layer/shared/style.service.mjs +355 -355
- package/esm2020/lib/layer/shared/vector-style.interface.mjs +1 -1
- package/esm2020/lib/layer/style-modal/index.mjs +1 -1
- package/esm2020/lib/layer/style-modal/style-modal.component.mjs +287 -287
- package/esm2020/lib/layer/track-feature-button/index.mjs +1 -1
- package/esm2020/lib/layer/track-feature-button/track-feature-button.component.mjs +58 -58
- package/esm2020/lib/layer/utils/image-watcher.mjs +61 -61
- package/esm2020/lib/layer/utils/index.mjs +5 -5
- package/esm2020/lib/layer/utils/layer.utils.mjs +9 -9
- package/esm2020/lib/layer/utils/outputLegend.mjs +26 -26
- package/esm2020/lib/layer/utils/tile-watcher.mjs +49 -49
- package/esm2020/lib/layer/utils/vector-watcher.mjs +47 -47
- package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +19 -19
- package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +96 -96
- package/esm2020/lib/map/baselayers-switcher/index.mjs +2 -2
- package/esm2020/lib/map/baselayers-switcher/mini-basemap.component.mjs +141 -142
- package/esm2020/lib/map/geolocate-button/geolocate-button.component.mjs +78 -78
- package/esm2020/lib/map/geolocate-button/index.mjs +1 -1
- package/esm2020/lib/map/home-extent-button/home-extent-button.component.mjs +62 -62
- package/esm2020/lib/map/home-extent-button/index.mjs +1 -1
- package/esm2020/lib/map/index.mjs +13 -13
- package/esm2020/lib/map/info-section/index.mjs +1 -1
- package/esm2020/lib/map/info-section/info-section.component.mjs +29 -29
- package/esm2020/lib/map/map-browser/index.mjs +1 -1
- package/esm2020/lib/map/map-browser/map-browser.component.mjs +65 -65
- package/esm2020/lib/map/map-center/index.mjs +1 -1
- package/esm2020/lib/map/map-center/map-center.component.mjs +49 -49
- package/esm2020/lib/map/map.module.mjs +126 -126
- package/esm2020/lib/map/menu-button/index.mjs +1 -1
- package/esm2020/lib/map/menu-button/menu-button.component.mjs +61 -61
- package/esm2020/lib/map/offline-button/index.mjs +1 -1
- package/esm2020/lib/map/offline-button/offline-button.component.mjs +75 -75
- package/esm2020/lib/map/rotation-button/index.mjs +1 -1
- package/esm2020/lib/map/rotation-button/rotation-button.component.mjs +69 -69
- package/esm2020/lib/map/shared/controllers/controller.mjs +41 -41
- package/esm2020/lib/map/shared/controllers/geolocation.mjs +307 -307
- package/esm2020/lib/map/shared/controllers/index.mjs +3 -3
- package/esm2020/lib/map/shared/controllers/view.mjs +350 -350
- package/esm2020/lib/map/shared/hover-feature.directive.mjs +502 -502
- package/esm2020/lib/map/shared/index.mjs +13 -13
- package/esm2020/lib/map/shared/linkedLayers.utils.mjs +237 -237
- package/esm2020/lib/map/shared/map-pointer-position.directive.mjs +106 -106
- package/esm2020/lib/map/shared/map.enums.mjs +5 -5
- package/esm2020/lib/map/shared/map.interface.mjs +1 -1
- package/esm2020/lib/map/shared/map.mjs +406 -406
- package/esm2020/lib/map/shared/map.service.mjs +28 -28
- package/esm2020/lib/map/shared/map.utils.mjs +462 -462
- package/esm2020/lib/map/shared/mapOffline.directive.mjs +162 -162
- package/esm2020/lib/map/shared/projection.interfaces.mjs +1 -1
- package/esm2020/lib/map/shared/projection.service.mjs +64 -64
- package/esm2020/lib/map/shared/projection.utils.mjs +63 -63
- package/esm2020/lib/map/swipe-control/index.mjs +1 -1
- package/esm2020/lib/map/swipe-control/swipe-control.component.mjs +192 -192
- package/esm2020/lib/map/utils/layer-watcher.mjs +78 -78
- package/esm2020/lib/map/wake-lock-button/index.mjs +1 -1
- package/esm2020/lib/map/wake-lock-button/wake-lock-button.component.mjs +113 -113
- package/esm2020/lib/map/zoom-button/index.mjs +1 -1
- package/esm2020/lib/map/zoom-button/zoom-button.component.mjs +39 -39
- package/esm2020/lib/measure/index.mjs +3 -3
- package/esm2020/lib/measure/measure.module.mjs +19 -19
- package/esm2020/lib/measure/measurer/measure-format.pipe.mjs +36 -36
- package/esm2020/lib/measure/measurer/measurer-dialog.component.mjs +179 -179
- package/esm2020/lib/measure/measurer/measurer-item.component.mjs +139 -139
- package/esm2020/lib/measure/measurer/measurer.component.mjs +1041 -1041
- package/esm2020/lib/measure/measurer/measurer.module.mjs +93 -93
- package/esm2020/lib/measure/shared/index.mjs +3 -3
- package/esm2020/lib/measure/shared/measure.enum.mjs +36 -36
- package/esm2020/lib/measure/shared/measure.interfaces.mjs +1 -1
- package/esm2020/lib/measure/shared/measure.utils.mjs +488 -488
- package/esm2020/lib/metadata/index.mjs +2 -2
- package/esm2020/lib/metadata/metadata-button/index.mjs +1 -1
- package/esm2020/lib/metadata/metadata-button/metadata-button.component.mjs +133 -133
- package/esm2020/lib/metadata/metadata.module.mjs +54 -54
- package/esm2020/lib/metadata/shared/index.mjs +2 -2
- package/esm2020/lib/metadata/shared/metadata.interface.mjs +1 -1
- package/esm2020/lib/metadata/shared/metadata.service.mjs +18 -18
- package/esm2020/lib/offline/geoDB/configFileToGeoDB.service.mjs +104 -104
- package/esm2020/lib/offline/geoDB/geoDB.enums.mjs +5 -5
- package/esm2020/lib/offline/geoDB/geoDB.interface.mjs +1 -1
- package/esm2020/lib/offline/geoDB/geoDB.service.mjs +166 -166
- package/esm2020/lib/offline/geoDB/index.mjs +4 -4
- package/esm2020/lib/offline/index.mjs +2 -2
- package/esm2020/lib/offline/shared/geo-network.service.mjs +65 -65
- package/esm2020/lib/offline/shared/index.mjs +1 -1
- package/esm2020/lib/overlay/index.mjs +1 -1
- package/esm2020/lib/overlay/overlay.module.mjs +22 -22
- package/esm2020/lib/overlay/shared/index.mjs +6 -6
- package/esm2020/lib/overlay/shared/overlay-marker-style.utils.mjs +68 -68
- package/esm2020/lib/overlay/shared/overlay.directive.mjs +32 -32
- package/esm2020/lib/overlay/shared/overlay.enum.mjs +7 -7
- package/esm2020/lib/overlay/shared/overlay.mjs +129 -129
- package/esm2020/lib/overlay/shared/overlay.service.mjs +26 -26
- package/esm2020/lib/overlay/shared/overlay.utils.mjs +102 -102
- package/esm2020/lib/print/index.mjs +3 -3
- package/esm2020/lib/print/print/print.component.mjs +125 -125
- package/esm2020/lib/print/print-form/index.mjs +1 -1
- package/esm2020/lib/print/print-form/print-form.component.mjs +427 -427
- package/esm2020/lib/print/print.module.mjs +64 -64
- package/esm2020/lib/print/shared/geopdf.mjs +57 -57
- package/esm2020/lib/print/shared/index.mjs +4 -4
- package/esm2020/lib/print/shared/print.interface.mjs +1 -1
- package/esm2020/lib/print/shared/print.service.mjs +933 -933
- package/esm2020/lib/print/shared/print.type.mjs +29 -29
- package/esm2020/lib/query/index.mjs +1 -1
- package/esm2020/lib/query/query.module.mjs +28 -28
- package/esm2020/lib/query/shared/index.mjs +6 -6
- package/esm2020/lib/query/shared/query-search-source.mjs +34 -34
- package/esm2020/lib/query/shared/query-search-source.providers.mjs +21 -21
- package/esm2020/lib/query/shared/query.directive.mjs +260 -260
- package/esm2020/lib/query/shared/query.enums.mjs +29 -29
- package/esm2020/lib/query/shared/query.interfaces.mjs +1 -1
- package/esm2020/lib/query/shared/query.service.mjs +732 -732
- package/esm2020/lib/query/shared/query.utils.mjs +36 -36
- package/esm2020/lib/search/index.mjs +11 -11
- package/esm2020/lib/search/search-bar/search-bar.component.mjs +511 -511
- package/esm2020/lib/search/search-bar/search-bar.module.mjs +74 -74
- package/esm2020/lib/search/search-bar/search-url-param.directive.mjs +34 -34
- package/esm2020/lib/search/search-results/save-feature-dialog.component.mjs +117 -117
- package/esm2020/lib/search/search-results/search-results-add-button.component.mjs +370 -370
- package/esm2020/lib/search/search-results/search-results-item.component.mjs +123 -123
- package/esm2020/lib/search/search-results/search-results.component.mjs +339 -339
- package/esm2020/lib/search/search-results/search-results.module.mjs +103 -103
- package/esm2020/lib/search/search-selector/search-selector.component.mjs +122 -122
- package/esm2020/lib/search/search-selector/search-selector.module.mjs +55 -55
- package/esm2020/lib/search/search-settings/search-settings.component.mjs +441 -441
- package/esm2020/lib/search/search-settings/search-settings.module.mjs +59 -59
- package/esm2020/lib/search/search.module.mjs +66 -66
- package/esm2020/lib/search/shared/index.mjs +8 -8
- package/esm2020/lib/search/shared/search-pointer-summary.directive.mjs +321 -321
- package/esm2020/lib/search/shared/search-source-service.providers.mjs +19 -19
- package/esm2020/lib/search/shared/search-source.service.mjs +46 -46
- package/esm2020/lib/search/shared/search.enums.mjs +3 -3
- package/esm2020/lib/search/shared/search.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/search.service.mjs +120 -120
- package/esm2020/lib/search/shared/search.utils.mjs +90 -90
- package/esm2020/lib/search/shared/sources/coordinates.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/sources/coordinates.mjs +152 -152
- package/esm2020/lib/search/shared/sources/coordinates.providers.mjs +39 -39
- package/esm2020/lib/search/shared/sources/icherche.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/sources/icherche.mjs +766 -766
- package/esm2020/lib/search/shared/sources/icherche.providers.mjs +65 -65
- package/esm2020/lib/search/shared/sources/ilayer.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/sources/ilayer.mjs +319 -319
- package/esm2020/lib/search/shared/sources/ilayer.providers.mjs +39 -39
- package/esm2020/lib/search/shared/sources/index.mjs +17 -17
- package/esm2020/lib/search/shared/sources/nominatim.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/sources/nominatim.mjs +251 -251
- package/esm2020/lib/search/shared/sources/nominatim.providers.mjs +22 -22
- package/esm2020/lib/search/shared/sources/source.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/sources/source.mjs +178 -178
- package/esm2020/lib/search/shared/sources/storedqueries.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/sources/storedqueries.mjs +424 -424
- package/esm2020/lib/search/shared/sources/storedqueries.providers.mjs +40 -40
- package/esm2020/lib/toast/index.mjs +1 -1
- package/esm2020/lib/toast/toast.component.mjs +112 -112
- package/esm2020/lib/toast/toast.module.mjs +44 -44
- package/esm2020/lib/utils/commonVectorStyle.interface.mjs +1 -1
- package/esm2020/lib/utils/commonVectorStyle.mjs +74 -74
- package/esm2020/lib/utils/googleLinks.mjs +12 -12
- package/esm2020/lib/utils/id-generator.mjs +109 -109
- package/esm2020/lib/utils/index.mjs +5 -5
- package/esm2020/lib/utils/osmLinks.mjs +9 -9
- package/esm2020/lib/wkt/index.mjs +1 -1
- package/esm2020/lib/wkt/shared/index.mjs +1 -1
- package/esm2020/lib/wkt/shared/wkt.service.mjs +224 -224
- package/esm2020/lib/wkt/wkt.module.mjs +21 -21
- package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +47 -47
- package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +35 -35
- package/esm2020/lib/workspace/confirmation-popup/index.mjs +2 -2
- package/esm2020/lib/workspace/index.mjs +7 -7
- package/esm2020/lib/workspace/shared/edition-workspace.mjs +279 -279
- package/esm2020/lib/workspace/shared/edition-workspace.service.mjs +656 -656
- package/esm2020/lib/workspace/shared/feature-workspace.mjs +34 -34
- package/esm2020/lib/workspace/shared/feature-workspace.service.mjs +149 -149
- package/esm2020/lib/workspace/shared/index.mjs +7 -7
- package/esm2020/lib/workspace/shared/wfs-workspace.mjs +34 -34
- package/esm2020/lib/workspace/shared/wfs-workspace.service.mjs +149 -149
- package/esm2020/lib/workspace/shared/wms-workspace.service.mjs +259 -259
- package/esm2020/lib/workspace/shared/workspace.utils.mjs +23 -23
- package/esm2020/lib/workspace/widgets/index.mjs +3 -3
- package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +46 -46
- package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +35 -35
- package/esm2020/lib/workspace/widgets/widgets.mjs +14 -14
- package/esm2020/lib/workspace/workspace-selector/workspace-selector.directive.mjs +132 -132
- package/esm2020/lib/workspace/workspace-selector/workspace-selector.module.mjs +27 -27
- package/esm2020/lib/workspace/workspace-updator/workspace-updator.directive.mjs +112 -112
- package/esm2020/lib/workspace/workspace-updator/workspace-updator.module.mjs +27 -27
- package/esm2020/lib/workspace/workspace.module.mjs +61 -61
- package/esm2020/public_api.mjs +54 -54
- package/fesm2015/igo2-geo.mjs +44986 -44986
- package/fesm2015/igo2-geo.mjs.map +1 -1
- package/fesm2020/igo2-geo.mjs +43029 -43030
- package/fesm2020/igo2-geo.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/catalog/catalog-browser/catalog-browser-group.component.d.ts +126 -126
- package/lib/catalog/catalog-browser/catalog-browser-layer.component.d.ts +80 -80
- package/lib/catalog/catalog-browser/catalog-browser.component.d.ts +105 -105
- package/lib/catalog/catalog-browser/catalog-browser.module.d.ts +22 -22
- package/lib/catalog/catalog-library/add-catalog-dialog.component.d.ts +45 -45
- package/lib/catalog/catalog-library/catalog-library-item.component.d.ts +25 -25
- package/lib/catalog/catalog-library/catalog-library.component.d.ts +65 -65
- package/lib/catalog/catalog-library/catalog-library.module.d.ts +26 -26
- package/lib/catalog/catalog.module.d.ts +14 -14
- package/lib/catalog/index.d.ts +4 -4
- package/lib/catalog/shared/catalog.abstract.d.ts +50 -50
- package/lib/catalog/shared/catalog.enum.d.ts +14 -14
- package/lib/catalog/shared/catalog.interface.d.ts +66 -66
- package/lib/catalog/shared/catalog.service.d.ts +36 -36
- package/lib/catalog/shared/index.d.ts +4 -4
- package/lib/datasource/datasource.module.d.ts +8 -8
- package/lib/datasource/index.d.ts +2 -2
- package/lib/datasource/shared/capabilities.service.d.ts +37 -37
- package/lib/datasource/shared/datasource.service.d.ts +37 -37
- package/lib/datasource/shared/datasources/any-datasource.d.ts +16 -16
- package/lib/datasource/shared/datasources/any-datasource.interface.d.ts +15 -15
- package/lib/datasource/shared/datasources/arcgisrest-datasource.d.ts +14 -14
- package/lib/datasource/shared/datasources/arcgisrest-datasource.interface.d.ts +14 -14
- package/lib/datasource/shared/datasources/carto-datasource.d.ts +15 -15
- package/lib/datasource/shared/datasources/carto-datasource.interface.d.ts +13 -13
- package/lib/datasource/shared/datasources/cluster-datasource.d.ts +10 -10
- package/lib/datasource/shared/datasources/cluster-datasource.interface.d.ts +11 -11
- package/lib/datasource/shared/datasources/data.service.d.ts +3 -3
- package/lib/datasource/shared/datasources/datasource.d.ts +20 -20
- package/lib/datasource/shared/datasources/datasource.interface.d.ts +100 -100
- package/lib/datasource/shared/datasources/feature-datasource.d.ts +12 -12
- package/lib/datasource/shared/datasources/feature-datasource.interface.d.ts +18 -18
- package/lib/datasource/shared/datasources/imagearcgisrest-datasource.d.ts +15 -15
- package/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.d.ts +15 -15
- package/lib/datasource/shared/datasources/index.d.ts +35 -35
- package/lib/datasource/shared/datasources/mvt-datasource.d.ts +10 -10
- package/lib/datasource/shared/datasources/mvt-datasource.interface.d.ts +13 -13
- package/lib/datasource/shared/datasources/osm-datasource.d.ts +9 -9
- package/lib/datasource/shared/datasources/osm-datasource.interface.d.ts +7 -7
- package/lib/datasource/shared/datasources/tilearcgisrest-datasource.d.ts +15 -15
- package/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.d.ts +14 -14
- package/lib/datasource/shared/datasources/tiledebug-datasource.d.ts +9 -9
- package/lib/datasource/shared/datasources/tiledebug-datasource.interface.d.ts +9 -9
- package/lib/datasource/shared/datasources/websocket-datasource.d.ts +15 -15
- package/lib/datasource/shared/datasources/websocket-datasource.interface.d.ts +7 -7
- package/lib/datasource/shared/datasources/wfs-datasource.d.ts +20 -20
- package/lib/datasource/shared/datasources/wfs-datasource.interface.d.ts +20 -20
- package/lib/datasource/shared/datasources/wfs.service.d.ts +17 -17
- package/lib/datasource/shared/datasources/wms-datasource.d.ts +31 -31
- package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +32 -32
- package/lib/datasource/shared/datasources/wms-wfs.utils.d.ts +41 -41
- package/lib/datasource/shared/datasources/wmts-datasource.d.ts +10 -10
- package/lib/datasource/shared/datasources/wmts-datasource.interface.d.ts +13 -13
- package/lib/datasource/shared/datasources/xyz-datasource.d.ts +9 -9
- package/lib/datasource/shared/datasources/xyz-datasource.interface.d.ts +11 -11
- package/lib/datasource/shared/index.d.ts +4 -4
- package/lib/datasource/shared/options/index.d.ts +4 -4
- package/lib/datasource/shared/options/options-api.interface.d.ts +4 -4
- package/lib/datasource/shared/options/options-api.providers.d.ts +10 -10
- package/lib/datasource/shared/options/options-api.service.d.ts +16 -16
- package/lib/datasource/shared/options/options.service.d.ts +6 -6
- package/lib/datasource/utils/esri-style-generator.d.ts +21 -21
- package/lib/datasource/utils/index.d.ts +2 -2
- package/lib/datasource/utils/tilegrid.d.ts +2 -2
- package/lib/directions/directions-buttons/directions-buttons.component.d.ts +30 -30
- package/lib/directions/directions-buttons/index.d.ts +1 -1
- package/lib/directions/directions-inputs/directions-inputs.component.d.ts +45 -45
- package/lib/directions/directions-inputs/index.d.ts +1 -1
- package/lib/directions/directions-results/directions-results.component.d.ts +30 -30
- package/lib/directions/directions-results/index.d.ts +1 -1
- package/lib/directions/directions-sources/directions-source.d.ts +7 -7
- package/lib/directions/directions-sources/directions-source.interface.d.ts +11 -11
- package/lib/directions/directions-sources/directions-source.provider.d.ts +11 -11
- package/lib/directions/directions-sources/index.d.ts +4 -4
- package/lib/directions/directions-sources/osrm-directions-source.d.ts +23 -23
- package/lib/directions/directions.component.d.ts +56 -56
- package/lib/directions/directions.module.d.ts +26 -26
- package/lib/directions/index.d.ts +6 -6
- package/lib/directions/shared/directions-source.service.d.ts +11 -11
- package/lib/directions/shared/directions.enum.d.ts +22 -22
- package/lib/directions/shared/directions.interface.d.ts +126 -126
- package/lib/directions/shared/directions.service.d.ts +13 -13
- package/lib/directions/shared/directions.utils.d.ts +42 -42
- package/lib/directions/shared/index.d.ts +5 -5
- package/lib/directions/shared/store.d.ts +18 -18
- package/lib/download/download-button/download-button.component.d.ts +18 -18
- package/lib/download/download-button/index.d.ts +1 -1
- package/lib/download/download.module.d.ts +14 -14
- package/lib/download/index.d.ts +2 -2
- package/lib/download/shared/download.interface.d.ts +10 -10
- package/lib/download/shared/download.service.d.ts +11 -11
- package/lib/download/shared/index.d.ts +2 -2
- package/lib/draw/draw/draw-layer-popup.component.d.ts +14 -14
- package/lib/draw/draw/draw-popup.component.d.ts +63 -63
- package/lib/draw/draw/draw-shorcuts.component.d.ts +5 -5
- package/lib/draw/draw/draw.component.d.ts +239 -239
- package/lib/draw/draw/draw.module.d.ts +34 -34
- package/lib/draw/drawingTool.module.d.ts +7 -7
- package/lib/draw/index.d.ts +2 -2
- package/lib/draw/shared/draw-icon.service.d.ts +12 -12
- package/lib/draw/shared/draw-style.service.d.ts +36 -36
- package/lib/draw/shared/draw.enum.d.ts +32 -32
- package/lib/draw/shared/draw.interface.d.ts +40 -40
- package/lib/draw/shared/draw.utils.d.ts +35 -35
- package/lib/draw/shared/index.d.ts +5 -5
- package/lib/feature/feature-details/feature-details.component.d.ts +60 -60
- package/lib/feature/feature-details/feature-details.directive.d.ts +19 -19
- package/lib/feature/feature-details/feature-details.module.d.ts +15 -15
- package/lib/feature/feature-form/feature-form.component.d.ts +50 -50
- package/lib/feature/feature-form/feature-form.module.d.ts +12 -12
- package/lib/feature/feature.module.d.ts +9 -9
- package/lib/feature/index.d.ts +3 -3
- package/lib/feature/shared/feature.enums.d.ts +7 -7
- package/lib/feature/shared/feature.interfaces.d.ts +74 -74
- package/lib/feature/shared/feature.utils.d.ts +104 -104
- package/lib/feature/shared/index.d.ts +6 -6
- package/lib/feature/shared/store.d.ts +71 -71
- package/lib/feature/shared/strategies/in-map-extent.d.ts +52 -52
- package/lib/feature/shared/strategies/in-map-resolution.d.ts +52 -52
- package/lib/feature/shared/strategies/index.d.ts +5 -5
- package/lib/feature/shared/strategies/loading-layer.d.ts +59 -59
- package/lib/feature/shared/strategies/loading.d.ts +75 -75
- package/lib/feature/shared/strategies/selection.d.ts +176 -176
- package/lib/feature/shared/strategies.utils.d.ts +17 -17
- package/lib/filter/filter.module.d.ts +53 -53
- package/lib/filter/index.d.ts +15 -15
- package/lib/filter/ogc-filter-button/index.d.ts +1 -1
- package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +20 -20
- package/lib/filter/ogc-filter-form/index.d.ts +1 -1
- package/lib/filter/ogc-filter-form/ogc-filter-form.component.d.ts +65 -65
- package/lib/filter/ogc-filter-selection/index.d.ts +1 -1
- package/lib/filter/ogc-filter-selection/ogc-filter-selection.component.d.ts +93 -93
- package/lib/filter/ogc-filter-time/index.d.ts +2 -2
- package/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.d.ts +39 -39
- package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +86 -86
- package/lib/filter/ogc-filterable-form/index.d.ts +1 -1
- package/lib/filter/ogc-filterable-form/ogc-filterable-form.component.d.ts +15 -15
- package/lib/filter/ogc-filterable-item/index.d.ts +1 -1
- package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +41 -41
- package/lib/filter/ogc-filterable-list/index.d.ts +2 -2
- package/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.d.ts +14 -14
- package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +10 -10
- package/lib/filter/shared/filterable-datasource.pipe.d.ts +10 -10
- package/lib/filter/shared/index.d.ts +11 -11
- package/lib/filter/shared/ogc-filter-time.service.d.ts +19 -19
- package/lib/filter/shared/ogc-filter.d.ts +29 -29
- package/lib/filter/shared/ogc-filter.enum.d.ts +27 -27
- package/lib/filter/shared/ogc-filter.interface.d.ts +200 -200
- package/lib/filter/shared/ogc-filter.service.d.ts +11 -11
- package/lib/filter/shared/spatial-filter.enum.d.ts +19 -19
- package/lib/filter/shared/spatial-filter.interface.d.ts +10 -10
- package/lib/filter/shared/spatial-filter.service.d.ts +37 -37
- package/lib/filter/shared/time-filter.enum.d.ts +10 -10
- package/lib/filter/shared/time-filter.interface.d.ts +29 -29
- package/lib/filter/shared/time-filter.service.d.ts +11 -11
- package/lib/filter/spatial-filter/spatial-filter-item/index.d.ts +1 -1
- package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +166 -166
- package/lib/filter/spatial-filter/spatial-filter-list/index.d.ts +1 -1
- package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +58 -58
- package/lib/filter/spatial-filter/spatial-filter-type/index.d.ts +1 -1
- package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +45 -45
- package/lib/filter/time-filter-button/index.d.ts +1 -1
- package/lib/filter/time-filter-button/time-filter-button.component.d.ts +20 -20
- package/lib/filter/time-filter-form/index.d.ts +1 -1
- package/lib/filter/time-filter-form/time-filter-form.component.d.ts +77 -77
- package/lib/filter/time-filter-item/index.d.ts +1 -1
- package/lib/filter/time-filter-item/time-filter-item.component.d.ts +28 -28
- package/lib/filter/time-filter-list/index.d.ts +2 -2
- package/lib/filter/time-filter-list/time-filter-list-binding.directive.d.ts +14 -14
- package/lib/filter/time-filter-list/time-filter-list.component.d.ts +12 -12
- package/lib/geo.module.d.ts +28 -28
- package/lib/geometry/geometry-form-field/geometry-form-field-input.component.d.ts +206 -206
- package/lib/geometry/geometry-form-field/geometry-form-field.component.d.ts +88 -88
- package/lib/geometry/geometry-form-field/geometry-form-field.module.d.ts +19 -19
- package/lib/geometry/geometry.module.d.ts +8 -8
- package/lib/geometry/index.d.ts +3 -3
- package/lib/geometry/shared/controls/draw.d.ts +150 -150
- package/lib/geometry/shared/controls/index.d.ts +3 -3
- package/lib/geometry/shared/controls/modify.d.ts +228 -228
- package/lib/geometry/shared/controls/slice.d.ts +99 -99
- package/lib/geometry/shared/geometry.errors.d.ts +11 -11
- package/lib/geometry/shared/geometry.interfaces.d.ts +13 -13
- package/lib/geometry/shared/geometry.utils.d.ts +45 -45
- package/lib/geometry/shared/index.d.ts +4 -4
- package/lib/import-export/export-button/export-button.component.d.ts +16 -16
- package/lib/import-export/export-button/index.d.ts +1 -1
- package/lib/import-export/import-export/import-export.component.d.ts +104 -104
- package/lib/import-export/import-export/index.d.ts +1 -1
- package/lib/import-export/import-export.module.d.ts +26 -26
- package/lib/import-export/index.d.ts +4 -4
- package/lib/import-export/shared/drop-geo-file.directive.d.ts +36 -36
- package/lib/import-export/shared/export.errors.d.ts +8 -8
- package/lib/import-export/shared/export.interface.d.ts +11 -11
- package/lib/import-export/shared/export.service.d.ts +30 -30
- package/lib/import-export/shared/export.type.d.ts +16 -16
- package/lib/import-export/shared/export.utils.d.ts +19 -19
- package/lib/import-export/shared/import.errors.d.ts +20 -20
- package/lib/import-export/shared/import.interface.d.ts +8 -8
- package/lib/import-export/shared/import.service.d.ts +31 -31
- package/lib/import-export/shared/import.utils.d.ts +18 -18
- package/lib/import-export/shared/index.d.ts +10 -10
- package/lib/import-export/style-list/index.d.ts +4 -4
- package/lib/import-export/style-list/style-list.interface.d.ts +6 -6
- package/lib/import-export/style-list/style-list.module.d.ts +8 -8
- package/lib/import-export/style-list/style-list.provider.d.ts +15 -15
- package/lib/import-export/style-list/style-list.service.d.ts +18 -18
- package/lib/layer/index.d.ts +10 -10
- package/lib/layer/layer-item/index.d.ts +1 -1
- package/lib/layer/layer-item/layer-item.component.d.ts +62 -62
- package/lib/layer/layer-legend/index.d.ts +1 -1
- package/lib/layer/layer-legend/layer-legend.component.d.ts +90 -90
- package/lib/layer/layer-legend-item/index.d.ts +1 -1
- package/lib/layer/layer-legend-item/layer-legend-item.component.d.ts +22 -22
- package/lib/layer/layer-legend-list/index.d.ts +2 -2
- package/lib/layer/layer-legend-list/layer-legend-list-binding.directive.d.ts +16 -16
- package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +31 -31
- package/lib/layer/layer-list/index.d.ts +3 -3
- package/lib/layer/layer-list/layer-list-binding.directive.d.ts +19 -19
- package/lib/layer/layer-list/layer-list.component.d.ts +127 -127
- package/lib/layer/layer-list/layer-list.enum.d.ts +15 -15
- package/lib/layer/layer-list-tool/index.d.ts +4 -4
- package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +32 -32
- package/lib/layer/layer-list-tool/layer-list-tool.enum.d.ts +5 -5
- package/lib/layer/layer-list-tool/layer-list-tool.interface.d.ts +8 -8
- package/lib/layer/layer-list-tool/layer-list-tool.service.d.ts +14 -14
- package/lib/layer/layer.module.d.ts +36 -36
- package/lib/layer/shared/clusterParam.d.ts +13 -13
- package/lib/layer/shared/index.d.ts +6 -6
- package/lib/layer/shared/layer.enums.d.ts +1 -1
- package/lib/layer/shared/layer.service.d.ts +30 -30
- package/lib/layer/shared/layers/any-layer.d.ts +6 -6
- package/lib/layer/shared/layers/any-layer.interface.d.ts +6 -6
- package/lib/layer/shared/layers/image-layer.d.ts +22 -22
- package/lib/layer/shared/layers/image-layer.interface.d.ts +19 -19
- package/lib/layer/shared/layers/index.d.ts +12 -12
- package/lib/layer/shared/layers/layer.d.ts +62 -62
- package/lib/layer/shared/layers/layer.interface.d.ts +109 -107
- package/lib/layer/shared/layers/tile-layer.d.ts +31 -31
- package/lib/layer/shared/layers/tile-layer.interface.d.ts +20 -20
- package/lib/layer/shared/layers/vector-layer.d.ts +78 -78
- package/lib/layer/shared/layers/vector-layer.interface.d.ts +41 -41
- package/lib/layer/shared/layers/vectortile-layer.d.ts +28 -28
- package/lib/layer/shared/layers/vectortile-layer.interface.d.ts +18 -18
- package/lib/layer/shared/style.service.d.ts +57 -57
- package/lib/layer/shared/vector-style.interface.d.ts +38 -38
- package/lib/layer/style-modal/index.d.ts +1 -1
- package/lib/layer/style-modal/style-modal.component.d.ts +42 -42
- package/lib/layer/track-feature-button/index.d.ts +1 -1
- package/lib/layer/track-feature-button/track-feature-button.component.d.ts +15 -15
- package/lib/layer/utils/image-watcher.d.ts +17 -17
- package/lib/layer/utils/index.d.ts +5 -5
- package/lib/layer/utils/layer.utils.d.ts +2 -2
- package/lib/layer/utils/outputLegend.d.ts +7 -7
- package/lib/layer/utils/tile-watcher.d.ts +14 -14
- package/lib/layer/utils/vector-watcher.d.ts +13 -13
- package/lib/map/baselayers-switcher/baselayers-switcher.animation.d.ts +2 -2
- package/lib/map/baselayers-switcher/baselayers-switcher.component.d.ts +21 -21
- package/lib/map/baselayers-switcher/index.d.ts +2 -2
- package/lib/map/baselayers-switcher/mini-basemap.component.d.ts +29 -29
- package/lib/map/geolocate-button/geolocate-button.component.d.ts +22 -22
- package/lib/map/geolocate-button/index.d.ts +1 -1
- package/lib/map/home-extent-button/home-extent-button.component.d.ts +20 -20
- package/lib/map/home-extent-button/index.d.ts +1 -1
- package/lib/map/index.d.ts +13 -13
- package/lib/map/info-section/index.d.ts +1 -1
- package/lib/map/info-section/info-section.component.d.ts +7 -7
- package/lib/map/map-browser/index.d.ts +1 -1
- package/lib/map/map-browser/map-browser.component.d.ts +25 -25
- package/lib/map/map-center/index.d.ts +1 -1
- package/lib/map/map-center/map-center.component.d.ts +31 -31
- package/lib/map/map.module.d.ts +28 -28
- package/lib/map/menu-button/index.d.ts +1 -1
- package/lib/map/menu-button/menu-button.component.d.ts +17 -17
- package/lib/map/offline-button/index.d.ts +1 -1
- package/lib/map/offline-button/offline-button.component.d.ts +23 -23
- package/lib/map/rotation-button/index.d.ts +1 -1
- package/lib/map/rotation-button/rotation-button.component.d.ts +17 -17
- package/lib/map/shared/controllers/controller.d.ts +29 -29
- package/lib/map/shared/controllers/geolocation.d.ts +112 -112
- package/lib/map/shared/controllers/index.d.ts +3 -3
- package/lib/map/shared/controllers/view.d.ts +200 -200
- package/lib/map/shared/hover-feature.directive.d.ts +132 -132
- package/lib/map/shared/index.d.ts +13 -13
- package/lib/map/shared/linkedLayers.utils.d.ts +17 -17
- package/lib/map/shared/map-pointer-position.directive.d.ts +71 -71
- package/lib/map/shared/map.d.ts +135 -135
- package/lib/map/shared/map.enums.d.ts +4 -4
- package/lib/map/shared/map.interface.d.ts +57 -57
- package/lib/map/shared/map.service.d.ts +19 -19
- package/lib/map/shared/map.utils.d.ts +90 -90
- package/lib/map/shared/mapOffline.directive.d.ts +21 -21
- package/lib/map/shared/projection.interfaces.d.ts +29 -29
- package/lib/map/shared/projection.service.d.ts +19 -19
- package/lib/map/shared/projection.utils.d.ts +19 -19
- package/lib/map/swipe-control/index.d.ts +1 -1
- package/lib/map/swipe-control/swipe-control.component.d.ts +97 -97
- package/lib/map/utils/layer-watcher.d.ts +20 -20
- package/lib/map/wake-lock-button/index.d.ts +1 -1
- package/lib/map/wake-lock-button/wake-lock-button.component.d.ts +30 -30
- package/lib/map/zoom-button/index.d.ts +1 -1
- package/lib/map/zoom-button/zoom-button.component.d.ts +12 -12
- package/lib/measure/index.d.ts +3 -3
- package/lib/measure/measure.module.d.ts +7 -7
- package/lib/measure/measurer/measure-format.pipe.d.ts +15 -15
- package/lib/measure/measurer/measurer-dialog.component.d.ts +14 -14
- package/lib/measure/measurer/measurer-item.component.d.ts +66 -66
- package/lib/measure/measurer/measurer.component.d.ts +405 -405
- package/lib/measure/measurer/measurer.module.d.ts +25 -25
- package/lib/measure/shared/index.d.ts +3 -3
- package/lib/measure/shared/measure.enum.d.ts +33 -33
- package/lib/measure/shared/measure.interfaces.d.ts +21 -21
- package/lib/measure/shared/measure.utils.d.ts +180 -180
- package/lib/metadata/index.d.ts +2 -2
- package/lib/metadata/metadata-button/index.d.ts +1 -1
- package/lib/metadata/metadata-button/metadata-button.component.d.ts +26 -26
- package/lib/metadata/metadata.module.d.ts +15 -15
- package/lib/metadata/shared/index.d.ts +2 -2
- package/lib/metadata/shared/metadata.interface.d.ts +13 -13
- package/lib/metadata/shared/metadata.service.d.ts +8 -8
- package/lib/offline/geoDB/configFileToGeoDB.service.d.ts +14 -14
- package/lib/offline/geoDB/geoDB.enums.d.ts +4 -4
- package/lib/offline/geoDB/geoDB.interface.d.ts +19 -19
- package/lib/offline/geoDB/geoDB.service.d.ts +37 -37
- package/lib/offline/geoDB/index.d.ts +4 -4
- package/lib/offline/index.d.ts +2 -2
- package/lib/offline/shared/geo-network.service.d.ts +28 -28
- package/lib/offline/shared/index.d.ts +1 -1
- package/lib/overlay/index.d.ts +1 -1
- package/lib/overlay/overlay.module.d.ts +9 -9
- package/lib/overlay/shared/index.d.ts +6 -6
- package/lib/overlay/shared/overlay-marker-style.utils.d.ts +11 -11
- package/lib/overlay/shared/overlay.d.ts +81 -81
- package/lib/overlay/shared/overlay.directive.d.ts +18 -18
- package/lib/overlay/shared/overlay.enum.d.ts +6 -6
- package/lib/overlay/shared/overlay.service.d.ts +14 -14
- package/lib/overlay/shared/overlay.utils.d.ts +17 -17
- package/lib/print/index.d.ts +3 -3
- package/lib/print/print/print.component.d.ts +35 -35
- package/lib/print/print-form/index.d.ts +1 -1
- package/lib/print/print-form/print-form.component.d.ts +97 -97
- package/lib/print/print.module.d.ts +19 -19
- package/lib/print/shared/geopdf.d.ts +1 -1
- package/lib/print/shared/index.d.ts +4 -4
- package/lib/print/shared/print.interface.d.ts +22 -22
- package/lib/print/shared/print.service.d.ts +168 -168
- package/lib/print/shared/print.type.d.ts +45 -45
- package/lib/query/index.d.ts +1 -1
- package/lib/query/query.module.d.ts +11 -11
- package/lib/query/shared/index.d.ts +6 -6
- package/lib/query/shared/query-search-source.d.ts +17 -17
- package/lib/query/shared/query-search-source.providers.d.ts +17 -17
- package/lib/query/shared/query.directive.d.ts +105 -105
- package/lib/query/shared/query.enums.d.ts +26 -26
- package/lib/query/shared/query.interfaces.d.ts +35 -35
- package/lib/query/shared/query.service.d.ts +56 -56
- package/lib/query/shared/query.utils.d.ts +27 -27
- package/lib/search/index.d.ts +11 -11
- package/lib/search/search-bar/search-bar.component.d.ts +230 -230
- package/lib/search/search-bar/search-bar.module.d.ts +23 -23
- package/lib/search/search-bar/search-url-param.directive.d.ts +13 -13
- package/lib/search/search-results/save-feature-dialog.component.d.ts +32 -32
- package/lib/search/search-results/search-results-add-button.component.d.ts +76 -76
- package/lib/search/search-results/search-results-item.component.d.ts +47 -47
- package/lib/search/search-results/search-results.component.d.ts +161 -161
- package/lib/search/search-results/search-results.module.d.ts +28 -28
- package/lib/search/search-selector/search-selector.component.d.ts +58 -58
- package/lib/search/search-selector/search-selector.module.d.ts +19 -19
- package/lib/search/search-settings/search-settings.component.d.ts +102 -102
- package/lib/search/search-settings/search-settings.module.d.ts +20 -20
- package/lib/search/search.module.d.ts +14 -14
- package/lib/search/shared/index.d.ts +8 -8
- package/lib/search/shared/search-pointer-summary.directive.d.ts +133 -133
- package/lib/search/shared/search-source-service.providers.d.ts +15 -15
- package/lib/search/shared/search-source.service.d.ts +32 -32
- package/lib/search/shared/search.enums.d.ts +1 -1
- package/lib/search/shared/search.interfaces.d.ts +29 -29
- package/lib/search/shared/search.service.d.ts +53 -53
- package/lib/search/shared/search.utils.d.ts +39 -39
- package/lib/search/shared/sources/coordinates.d.ts +40 -40
- package/lib/search/shared/sources/coordinates.interfaces.d.ts +12 -12
- package/lib/search/shared/sources/coordinates.providers.d.ts +31 -31
- package/lib/search/shared/sources/icherche.d.ts +96 -96
- package/lib/search/shared/sources/icherche.interfaces.d.ts +30 -30
- package/lib/search/shared/sources/icherche.providers.d.ts +46 -46
- package/lib/search/shared/sources/ilayer.d.ts +55 -55
- package/lib/search/shared/sources/ilayer.interfaces.d.ts +47 -47
- package/lib/search/shared/sources/ilayer.providers.d.ts +31 -31
- package/lib/search/shared/sources/index.d.ts +17 -17
- package/lib/search/shared/sources/nominatim.d.ts +45 -45
- package/lib/search/shared/sources/nominatim.interfaces.d.ts +10 -10
- package/lib/search/shared/sources/nominatim.providers.d.ts +18 -18
- package/lib/search/shared/sources/source.d.ts +108 -108
- package/lib/search/shared/sources/source.interfaces.d.ts +47 -47
- package/lib/search/shared/sources/storedqueries.d.ts +73 -73
- package/lib/search/shared/sources/storedqueries.interfaces.d.ts +42 -42
- package/lib/search/shared/sources/storedqueries.providers.d.ts +32 -32
- package/lib/toast/index.d.ts +1 -1
- package/lib/toast/toast.component.d.ts +33 -33
- package/lib/toast/toast.module.d.ts +14 -14
- package/lib/utils/commonVectorStyle.d.ts +14 -14
- package/lib/utils/commonVectorStyle.interface.d.ts +16 -16
- package/lib/utils/googleLinks.d.ts +5 -5
- package/lib/utils/id-generator.d.ts +54 -54
- package/lib/utils/index.d.ts +5 -5
- package/lib/utils/osmLinks.d.ts +4 -4
- package/lib/wkt/index.d.ts +1 -1
- package/lib/wkt/shared/index.d.ts +1 -1
- package/lib/wkt/shared/wkt.service.d.ts +19 -19
- package/lib/wkt/wkt.module.d.ts +8 -8
- package/lib/workspace/confirmation-popup/confirmation-popup.component.d.ts +23 -23
- package/lib/workspace/confirmation-popup/confirmation-popup.module.d.ts +14 -14
- package/lib/workspace/confirmation-popup/index.d.ts +2 -2
- package/lib/workspace/index.d.ts +7 -7
- package/lib/workspace/shared/edition-workspace.d.ts +82 -82
- package/lib/workspace/shared/edition-workspace.service.d.ts +52 -52
- package/lib/workspace/shared/feature-workspace.d.ts +18 -18
- package/lib/workspace/shared/feature-workspace.service.d.ts +19 -19
- package/lib/workspace/shared/index.d.ts +7 -7
- package/lib/workspace/shared/wfs-workspace.d.ts +18 -18
- package/lib/workspace/shared/wfs-workspace.service.d.ts +19 -19
- package/lib/workspace/shared/wms-workspace.service.d.ts +22 -22
- package/lib/workspace/shared/workspace.utils.d.ts +10 -10
- package/lib/workspace/widgets/index.d.ts +3 -3
- package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +29 -29
- package/lib/workspace/widgets/ogc-filter/ogc-filter.module.d.ts +14 -14
- package/lib/workspace/widgets/widgets.d.ts +9 -9
- package/lib/workspace/workspace-selector/workspace-selector.directive.d.ts +32 -32
- package/lib/workspace/workspace-selector/workspace-selector.module.d.ts +11 -11
- package/lib/workspace/workspace-updator/workspace-updator.directive.d.ts +26 -26
- package/lib/workspace/workspace-updator/workspace-updator.module.d.ts +11 -11
- package/lib/workspace/workspace.module.d.ts +14 -14
- package/package.json +4 -4
- package/public_api.d.ts +51 -51
|
@@ -1,1042 +1,1042 @@
|
|
|
1
|
-
import { Component, Input, ChangeDetectionStrategy, ViewChild } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
import { skip } from 'rxjs/operators';
|
|
4
|
-
import OlStyle from 'ol/style/Style';
|
|
5
|
-
import OlGeoJSON from 'ol/format/GeoJSON';
|
|
6
|
-
import OlVectorSource from 'ol/source/Vector';
|
|
7
|
-
import { unByKey } from 'ol/Observable';
|
|
8
|
-
import { StorageScope } from '@igo2/core';
|
|
9
|
-
import { uuid } from '@igo2/utils';
|
|
10
|
-
import { FeatureDataSource } from '../../datasource';
|
|
11
|
-
import { FEATURE, FeatureStoreLoadingStrategy, FeatureStoreSelectionStrategy, tryBindStoreLayer, tryAddLoadingStrategy, tryAddSelectionStrategy } from '../../feature';
|
|
12
|
-
import { DrawControl, ModifyControl } from '../../geometry/shared';
|
|
13
|
-
import { VectorLayer } from '../../layer';
|
|
14
|
-
import { MeasureType, MeasureAreaUnit, MeasureLengthUnit, } from '../shared/measure.enum';
|
|
15
|
-
import { measureOlGeometry, createMeasureInteractionStyle, createMeasureLayerStyle, updateOlTooltipsAtMidpoints, updateOlTooltipAtCenter, getTooltipsOfOlGeometry, squareMetersToUnit, metersToUnit, formatMeasure } from '../shared/measure.utils';
|
|
16
|
-
import { MeasurerDialogComponent } from './measurer-dialog.component';
|
|
17
|
-
import * as i0 from "@angular/core";
|
|
18
|
-
import * as i1 from "@igo2/core";
|
|
19
|
-
import * as i2 from "@angular/material/dialog";
|
|
20
|
-
const _c0 = ["table"];
|
|
21
|
-
function MeasurerComponent_mat_divider_13_Template(rf, ctx) { if (rf & 1) {
|
|
22
|
-
i0.ɵɵelement(0, "mat-divider");
|
|
23
|
-
} }
|
|
24
|
-
function MeasurerComponent_mat_slide_toggle_15_Template(rf, ctx) { if (rf & 1) {
|
|
25
|
-
const _r12 = i0.ɵɵgetCurrentView();
|
|
26
|
-
i0.ɵɵelementStart(0, "mat-slide-toggle", 7);
|
|
27
|
-
i0.ɵɵlistener("change", function MeasurerComponent_mat_slide_toggle_15_Template_mat_slide_toggle_change_0_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r11 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r11.onToggleDisplayLines($event.checked)); });
|
|
28
|
-
i0.ɵɵtext(1);
|
|
29
|
-
i0.ɵɵpipe(2, "translate");
|
|
30
|
-
i0.ɵɵelementEnd();
|
|
31
|
-
} if (rf & 2) {
|
|
32
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
33
|
-
i0.ɵɵproperty("checked", ctx_r1.displayLines)("labelPosition", "before");
|
|
34
|
-
i0.ɵɵadvance(1);
|
|
35
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 3, "igo.geo.measure.toggleDisplayLines"), " ");
|
|
36
|
-
} }
|
|
37
|
-
function MeasurerComponent_mat_divider_17_Template(rf, ctx) { if (rf & 1) {
|
|
38
|
-
i0.ɵɵelement(0, "mat-divider");
|
|
39
|
-
} }
|
|
40
|
-
function MeasurerComponent_mat_slide_toggle_20_Template(rf, ctx) { if (rf & 1) {
|
|
41
|
-
const _r14 = i0.ɵɵgetCurrentView();
|
|
42
|
-
i0.ɵɵelementStart(0, "mat-slide-toggle", 7);
|
|
43
|
-
i0.ɵɵlistener("change", function MeasurerComponent_mat_slide_toggle_20_Template_mat_slide_toggle_change_0_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r13 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r13.onToggleDisplayDistance($event.checked)); });
|
|
44
|
-
i0.ɵɵtext(1);
|
|
45
|
-
i0.ɵɵpipe(2, "translate");
|
|
46
|
-
i0.ɵɵelementEnd();
|
|
47
|
-
} if (rf & 2) {
|
|
48
|
-
const ctx_r3 = i0.ɵɵnextContext();
|
|
49
|
-
i0.ɵɵproperty("checked", ctx_r3.displayDistance)("labelPosition", "before");
|
|
50
|
-
i0.ɵɵadvance(1);
|
|
51
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 3, "igo.geo.measure.toggleDisplayDistance"), " ");
|
|
52
|
-
} }
|
|
53
|
-
function MeasurerComponent_mat_slide_toggle_22_Template(rf, ctx) { if (rf & 1) {
|
|
54
|
-
const _r16 = i0.ɵɵgetCurrentView();
|
|
55
|
-
i0.ɵɵelementStart(0, "mat-slide-toggle", 7);
|
|
56
|
-
i0.ɵɵlistener("change", function MeasurerComponent_mat_slide_toggle_22_Template_mat_slide_toggle_change_0_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r15 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r15.onToggleDisplayAreas($event.checked)); });
|
|
57
|
-
i0.ɵɵtext(1);
|
|
58
|
-
i0.ɵɵpipe(2, "translate");
|
|
59
|
-
i0.ɵɵelementEnd();
|
|
60
|
-
} if (rf & 2) {
|
|
61
|
-
const ctx_r4 = i0.ɵɵnextContext();
|
|
62
|
-
i0.ɵɵproperty("checked", ctx_r4.displayAreas)("labelPosition", "before");
|
|
63
|
-
i0.ɵɵadvance(1);
|
|
64
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 3, "igo.geo.measure.toggleDisplayAreas"), " ");
|
|
65
|
-
} }
|
|
66
|
-
function MeasurerComponent_mat_divider_24_Template(rf, ctx) { if (rf & 1) {
|
|
67
|
-
i0.ɵɵelement(0, "mat-divider");
|
|
68
|
-
} }
|
|
69
|
-
function MeasurerComponent_ng_container_29_igo_measurer_item_1_Template(rf, ctx) { if (rf & 1) {
|
|
70
|
-
const _r21 = i0.ɵɵgetCurrentView();
|
|
71
|
-
i0.ɵɵelementStart(0, "igo-measurer-item", 14);
|
|
72
|
-
i0.ɵɵlistener("measureUnitChange", function MeasurerComponent_ng_container_29_igo_measurer_item_1_Template_igo_measurer_item_measureUnitChange_0_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r20 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r20.onLengthUnitChange($event)); });
|
|
73
|
-
i0.ɵɵpipe(1, "translate");
|
|
74
|
-
i0.ɵɵelementEnd();
|
|
75
|
-
} if (rf & 2) {
|
|
76
|
-
const measure_r17 = i0.ɵɵnextContext().ngIf;
|
|
77
|
-
const ctx_r18 = i0.ɵɵnextContext();
|
|
78
|
-
i0.ɵɵproperty("measureType", ctx_r18.measureType.Length)("measureUnit", ctx_r18.measureLengthUnit.Meters)("measure", measure_r17.length)("auto", ctx_r18.measureUnitsAuto)("placeholder", i0.ɵɵpipeBind1(1, 5, ctx_r18.activeMeasureType === ctx_r18.measureType.Area ? "igo.geo.measure.perimeter" : "igo.geo.measure.length"));
|
|
79
|
-
} }
|
|
80
|
-
function MeasurerComponent_ng_container_29_igo_measurer_item_2_Template(rf, ctx) { if (rf & 1) {
|
|
81
|
-
const _r24 = i0.ɵɵgetCurrentView();
|
|
82
|
-
i0.ɵɵelementStart(0, "igo-measurer-item", 14);
|
|
83
|
-
i0.ɵɵlistener("measureUnitChange", function MeasurerComponent_ng_container_29_igo_measurer_item_2_Template_igo_measurer_item_measureUnitChange_0_listener($event) { i0.ɵɵrestoreView(_r24); const ctx_r23 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r23.onAreaUnitChange($event)); });
|
|
84
|
-
i0.ɵɵpipe(1, "translate");
|
|
85
|
-
i0.ɵɵelementEnd();
|
|
86
|
-
} if (rf & 2) {
|
|
87
|
-
const measure_r17 = i0.ɵɵnextContext().ngIf;
|
|
88
|
-
const ctx_r19 = i0.ɵɵnextContext();
|
|
89
|
-
i0.ɵɵproperty("measureType", ctx_r19.measureType.Area)("measureUnit", ctx_r19.measureAreaUnit.SquareMeters)("measure", measure_r17.area)("auto", ctx_r19.measureUnitsAuto)("placeholder", i0.ɵɵpipeBind1(1, 5, "igo.geo.measure.area"));
|
|
90
|
-
} }
|
|
91
|
-
function MeasurerComponent_ng_container_29_Template(rf, ctx) { if (rf & 1) {
|
|
92
|
-
i0.ɵɵelementContainerStart(0);
|
|
93
|
-
i0.ɵɵtemplate(1, MeasurerComponent_ng_container_29_igo_measurer_item_1_Template, 2, 7, "igo-measurer-item", 13);
|
|
94
|
-
i0.ɵɵtemplate(2, MeasurerComponent_ng_container_29_igo_measurer_item_2_Template, 2, 7, "igo-measurer-item", 13);
|
|
95
|
-
i0.ɵɵelementContainerEnd();
|
|
96
|
-
} if (rf & 2) {
|
|
97
|
-
const ctx_r6 = i0.ɵɵnextContext();
|
|
98
|
-
i0.ɵɵadvance(1);
|
|
99
|
-
i0.ɵɵproperty("ngIf", ctx_r6.activeMeasureType === ctx_r6.measureType.Length || ctx_r6.activeMeasureType === ctx_r6.measureType.Area);
|
|
100
|
-
i0.ɵɵadvance(1);
|
|
101
|
-
i0.ɵɵproperty("ngIf", ctx_r6.activeMeasureType === ctx_r6.measureType.Area);
|
|
102
|
-
} }
|
|
103
|
-
function MeasurerComponent_mat_divider_31_Template(rf, ctx) { if (rf & 1) {
|
|
104
|
-
i0.ɵɵelement(0, "mat-divider");
|
|
105
|
-
} }
|
|
106
|
-
function MeasurerComponent_button_35_Template(rf, ctx) { if (rf & 1) {
|
|
107
|
-
const _r27 = i0.ɵɵgetCurrentView();
|
|
108
|
-
i0.ɵɵelementStart(0, "button", 15);
|
|
109
|
-
i0.ɵɵlistener("click", function MeasurerComponent_button_35_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r26 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r26.onCalculateClick()); });
|
|
110
|
-
i0.ɵɵpipe(1, "translate");
|
|
111
|
-
i0.ɵɵpipe(2, "async");
|
|
112
|
-
i0.ɵɵelement(3, "mat-icon", 16);
|
|
113
|
-
i0.ɵɵelementEnd();
|
|
114
|
-
} if (rf & 2) {
|
|
115
|
-
const ctx_r8 = i0.ɵɵnextContext();
|
|
116
|
-
i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 2, "igo.geo.measure.actionbar.calculate.tooltip"))("disabled", i0.ɵɵpipeBind1(2, 4, ctx_r8.selectedFeatures$).length === 0);
|
|
117
|
-
} }
|
|
118
|
-
function MeasurerComponent_button_38_Template(rf, ctx) { if (rf & 1) {
|
|
119
|
-
const _r29 = i0.ɵɵgetCurrentView();
|
|
120
|
-
i0.ɵɵelementStart(0, "button", 17);
|
|
121
|
-
i0.ɵɵlistener("click", function MeasurerComponent_button_38_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r28 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r28.onDeleteClick()); });
|
|
122
|
-
i0.ɵɵpipe(1, "translate");
|
|
123
|
-
i0.ɵɵpipe(2, "async");
|
|
124
|
-
i0.ɵɵelement(3, "mat-icon", 18);
|
|
125
|
-
i0.ɵɵelementEnd();
|
|
126
|
-
} if (rf & 2) {
|
|
127
|
-
const ctx_r9 = i0.ɵɵnextContext();
|
|
128
|
-
i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 2, "igo.geo.measure.actionbar.delete.tooltip"))("disabled", i0.ɵɵpipeBind1(2, 4, ctx_r9.selectedFeatures$).length === 0);
|
|
129
|
-
} }
|
|
130
|
-
/**
|
|
131
|
-
* Tool to measure lengths and areas
|
|
132
|
-
*/
|
|
133
|
-
export class MeasurerComponent {
|
|
134
|
-
constructor(languageService, dialog, storageService) {
|
|
135
|
-
this.languageService = languageService;
|
|
136
|
-
this.dialog = dialog;
|
|
137
|
-
this.storageService = storageService;
|
|
138
|
-
/**
|
|
139
|
-
* Table template
|
|
140
|
-
* @internal
|
|
141
|
-
*/
|
|
142
|
-
this.tableTemplate = {
|
|
143
|
-
selection: true,
|
|
144
|
-
selectMany: true,
|
|
145
|
-
selectionCheckbox: true,
|
|
146
|
-
sort: true,
|
|
147
|
-
columns: [
|
|
148
|
-
{
|
|
149
|
-
name: 'length',
|
|
150
|
-
title: this.languageService.translate.instant('igo.geo.measure.lengthHeader'),
|
|
151
|
-
valueAccessor: (localFeature) => {
|
|
152
|
-
const unit = this.activeLengthUnit;
|
|
153
|
-
const measure = metersToUnit(localFeature.properties.measure.length, unit);
|
|
154
|
-
return formatMeasure(measure, {
|
|
155
|
-
decimal: 1,
|
|
156
|
-
unit,
|
|
157
|
-
unitAbbr: false,
|
|
158
|
-
locale: 'fr'
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
name: 'area',
|
|
164
|
-
title: this.languageService.translate.instant('igo.geo.measure.areaHeader'),
|
|
165
|
-
valueAccessor: (localFeature) => {
|
|
166
|
-
const unit = this.activeAreaUnit;
|
|
167
|
-
const measure = squareMetersToUnit(localFeature.properties.measure.area, unit);
|
|
168
|
-
return measure ? formatMeasure(measure, {
|
|
169
|
-
decimal: 1,
|
|
170
|
-
unit,
|
|
171
|
-
unitAbbr: false,
|
|
172
|
-
locale: 'fr'
|
|
173
|
-
}) : '';
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
]
|
|
177
|
-
};
|
|
178
|
-
this.subscriptions$$ = [];
|
|
179
|
-
/**
|
|
180
|
-
* Reference to the MeasureType enum
|
|
181
|
-
* @internal
|
|
182
|
-
*/
|
|
183
|
-
this.measureType = MeasureType;
|
|
184
|
-
/**
|
|
185
|
-
* Reference to the AreaMeasureUnit enum
|
|
186
|
-
* @internal
|
|
187
|
-
*/
|
|
188
|
-
this.measureAreaUnit = MeasureAreaUnit;
|
|
189
|
-
/**
|
|
190
|
-
* Reference to the LengthMeasureUnit enum
|
|
191
|
-
* @internal
|
|
192
|
-
*/
|
|
193
|
-
this.measureLengthUnit = MeasureLengthUnit;
|
|
194
|
-
/**
|
|
195
|
-
* Whether measure units should be automatically determined
|
|
196
|
-
* @internal
|
|
197
|
-
*/
|
|
198
|
-
this.measureUnitsAuto = false;
|
|
199
|
-
/**
|
|
200
|
-
* Whether display of distances of areas
|
|
201
|
-
* @internal
|
|
202
|
-
*/
|
|
203
|
-
this.displayDistance = true;
|
|
204
|
-
/**
|
|
205
|
-
* Whether display of distances of lines
|
|
206
|
-
* @internal
|
|
207
|
-
*/
|
|
208
|
-
this.displayLines = true;
|
|
209
|
-
/**
|
|
210
|
-
* Whether display of areas
|
|
211
|
-
* @internal
|
|
212
|
-
*/
|
|
213
|
-
this.displayAreas = true;
|
|
214
|
-
/**
|
|
215
|
-
* Observable of line boolean
|
|
216
|
-
* @internal
|
|
217
|
-
*/
|
|
218
|
-
this.hasLine$ = new BehaviorSubject(false);
|
|
219
|
-
/**
|
|
220
|
-
* Observable of area boolean
|
|
221
|
-
* @internal
|
|
222
|
-
*/
|
|
223
|
-
this.hasArea$ = new BehaviorSubject(false);
|
|
224
|
-
/**
|
|
225
|
-
* Observable of area
|
|
226
|
-
* @internal
|
|
227
|
-
*/
|
|
228
|
-
this.measure$ = new BehaviorSubject({});
|
|
229
|
-
/**
|
|
230
|
-
* Observable of selected features
|
|
231
|
-
* @internal
|
|
232
|
-
*/
|
|
233
|
-
this.selectedFeatures$ = new BehaviorSubject([]);
|
|
234
|
-
/**
|
|
235
|
-
* OL draw source
|
|
236
|
-
* @internal
|
|
237
|
-
*/
|
|
238
|
-
this.showTooltips = true;
|
|
239
|
-
/**
|
|
240
|
-
* Whether draw control toggle is disabled or not
|
|
241
|
-
* @internal
|
|
242
|
-
*/
|
|
243
|
-
this.drawControlIsDisabled = true;
|
|
244
|
-
/**
|
|
245
|
-
* Active mlength unit
|
|
246
|
-
*/
|
|
247
|
-
this.activeLengthUnit = MeasureLengthUnit.Meters;
|
|
248
|
-
/**
|
|
249
|
-
* Active area unit
|
|
250
|
-
*/
|
|
251
|
-
this.activeAreaUnit = MeasureAreaUnit.SquareMeters;
|
|
252
|
-
/**
|
|
253
|
-
* OL draw source
|
|
254
|
-
*/
|
|
255
|
-
this.olDrawSource = new OlVectorSource();
|
|
256
|
-
/**
|
|
257
|
-
* The minimum length a segment must have to display a tooltip.
|
|
258
|
-
* It also applies to area tooltips.
|
|
259
|
-
*/
|
|
260
|
-
this.minSegmentLength = 10;
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Measure type
|
|
264
|
-
* @internal
|
|
265
|
-
*/
|
|
266
|
-
set activeMeasureType(value) { this.setActiveMeasureType(value); }
|
|
267
|
-
get activeMeasureType() { return this._activeMeasureType; }
|
|
268
|
-
/**
|
|
269
|
-
* Wheter one of the draw control is active
|
|
270
|
-
* @internal
|
|
271
|
-
*/
|
|
272
|
-
get drawControlIsActive() {
|
|
273
|
-
return this.activeDrawControl !== undefined;
|
|
274
|
-
}
|
|
275
|
-
get projection() {
|
|
276
|
-
return this.map.ol.getView().getProjection().getCode();
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Add draw controls and activate one
|
|
280
|
-
* @internal
|
|
281
|
-
*/
|
|
282
|
-
ngOnInit() {
|
|
283
|
-
this.initStore();
|
|
284
|
-
this.createDrawLineControl();
|
|
285
|
-
this.createDrawPolygonControl();
|
|
286
|
-
this.createModifyControl();
|
|
287
|
-
this.toggleDrawControl();
|
|
288
|
-
this.updateTooltipsOfOlSource(this.store.source.ol);
|
|
289
|
-
this.checkDistanceAreaToggle();
|
|
290
|
-
this.setActiveMeasureType(MeasureType.Length);
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Clear the overlay layer and any interaction added by this component.
|
|
294
|
-
* @internal
|
|
295
|
-
*/
|
|
296
|
-
ngOnDestroy() {
|
|
297
|
-
this.setActiveMeasureType(undefined);
|
|
298
|
-
this.deactivateModifyControl();
|
|
299
|
-
this.freezeStore();
|
|
300
|
-
this.subscriptions$$.map(s => s.unsubscribe());
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* Set the measure type
|
|
304
|
-
* @internal
|
|
305
|
-
*/
|
|
306
|
-
onMeasureTypeChange(measureType) {
|
|
307
|
-
this.activeMeasureType = measureType;
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* Activate or deactivate the current draw control
|
|
311
|
-
* @internal
|
|
312
|
-
*/
|
|
313
|
-
onToggleDrawControl(toggle) {
|
|
314
|
-
if (toggle === true) {
|
|
315
|
-
this.toggleDrawControl();
|
|
316
|
-
}
|
|
317
|
-
else {
|
|
318
|
-
this.deactivateDrawControl();
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* Activate or deactivate the current draw control
|
|
323
|
-
* @internal
|
|
324
|
-
*/
|
|
325
|
-
onToggleMeasureUnitsAuto(toggle) {
|
|
326
|
-
this.measureUnitsAuto = toggle;
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Activate or deactivate the current display of distances of the areas
|
|
330
|
-
* @internal
|
|
331
|
-
*/
|
|
332
|
-
onToggleDisplayDistance(toggle) {
|
|
333
|
-
this.displayDistance = toggle;
|
|
334
|
-
this.onDisplayDistance();
|
|
335
|
-
toggle ? (this.storageService.set('distanceToggle', true, StorageScope.SESSION)) :
|
|
336
|
-
(this.storageService.set('distanceToggle', false, StorageScope.SESSION));
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Activate or deactivate the current display of distances of the lines
|
|
340
|
-
* @internal
|
|
341
|
-
*/
|
|
342
|
-
onToggleDisplayLines(toggle) {
|
|
343
|
-
this.displayLines = toggle;
|
|
344
|
-
this.onDisplayLines();
|
|
345
|
-
toggle ? (this.storageService.set('linesToggle', true, StorageScope.SESSION)) :
|
|
346
|
-
(this.storageService.set('linesToggle', false, StorageScope.SESSION));
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* Activate or deactivate the current display of areas
|
|
350
|
-
* @internal
|
|
351
|
-
*/
|
|
352
|
-
onToggleDisplayAreas(toggle) {
|
|
353
|
-
this.displayAreas = toggle;
|
|
354
|
-
this.onDisplayAreas();
|
|
355
|
-
toggle ? (this.storageService.set('areasToggle', true, StorageScope.SESSION)) :
|
|
356
|
-
(this.storageService.set('areasToggle', false, StorageScope.SESSION));
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* Set display parametres in current values
|
|
360
|
-
* @internal
|
|
361
|
-
*/
|
|
362
|
-
checkDistanceAreaToggle() {
|
|
363
|
-
if (this.storageService.get('distanceToggle') === false) {
|
|
364
|
-
this.displayDistance = false;
|
|
365
|
-
}
|
|
366
|
-
if (this.storageService.get('linesToggle') === false) {
|
|
367
|
-
this.displayLines = false;
|
|
368
|
-
}
|
|
369
|
-
if (this.storageService.get('areasToggle') === false) {
|
|
370
|
-
this.displayAreas = false;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* Activate or deactivate the current display of distances of areas
|
|
375
|
-
* @internal
|
|
376
|
-
*/
|
|
377
|
-
onDisplayDistance() {
|
|
378
|
-
if (this.displayDistance) {
|
|
379
|
-
Array.from(document.getElementsByClassName('igo-map-tooltip-measure-polygone-segments')).map((value) => value.classList.remove('igo-map-tooltip-hidden'));
|
|
380
|
-
}
|
|
381
|
-
else {
|
|
382
|
-
Array.from(document.getElementsByClassName('igo-map-tooltip-measure-polygone-segments')).map((value) => value.classList.add('igo-map-tooltip-hidden'));
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* Activate or deactivate the current display of distances of lines
|
|
387
|
-
* @internal
|
|
388
|
-
*/
|
|
389
|
-
onDisplayLines() {
|
|
390
|
-
if (this.displayLines) {
|
|
391
|
-
Array.from(document.getElementsByClassName('igo-map-tooltip-measure-line-segments')).map((value) => value.classList.remove('igo-map-tooltip-hidden'));
|
|
392
|
-
}
|
|
393
|
-
else {
|
|
394
|
-
Array.from(document.getElementsByClassName('igo-map-tooltip-measure-line-segments')).map((value) => value.classList.add('igo-map-tooltip-hidden'));
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
/**
|
|
398
|
-
* Activate or deactivate the current display of areas
|
|
399
|
-
* @internal
|
|
400
|
-
*/
|
|
401
|
-
onDisplayAreas() {
|
|
402
|
-
if (this.displayAreas) {
|
|
403
|
-
Array.from(document.getElementsByClassName('igo-map-tooltip-measure-area')).map((value) => value.classList.remove('igo-map-tooltip-hidden'));
|
|
404
|
-
}
|
|
405
|
-
else {
|
|
406
|
-
Array.from(document.getElementsByClassName('igo-map-tooltip-measure-area')).map((value) => value.classList.add('igo-map-tooltip-hidden'));
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
/**
|
|
410
|
-
* Set the measure type
|
|
411
|
-
* @internal
|
|
412
|
-
*/
|
|
413
|
-
onLengthUnitChange(unit) {
|
|
414
|
-
this.activeLengthUnit = unit;
|
|
415
|
-
this.table.refresh();
|
|
416
|
-
this.updateTooltipsOfOlSource(this.store.source.ol);
|
|
417
|
-
if (this.activeOlGeometry !== undefined) {
|
|
418
|
-
this.updateTooltipsOfOlGeometry(this.activeOlGeometry);
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
/**
|
|
422
|
-
* Set the measure type
|
|
423
|
-
* @internal
|
|
424
|
-
*/
|
|
425
|
-
onAreaUnitChange(unit) {
|
|
426
|
-
this.activeAreaUnit = unit;
|
|
427
|
-
this.table.refresh();
|
|
428
|
-
this.updateTooltipsOfOlSource(this.store.source.ol);
|
|
429
|
-
if (this.activeOlGeometry !== undefined) {
|
|
430
|
-
this.updateTooltipsOfOlGeometry(this.activeOlGeometry);
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
onCalculateClick() {
|
|
434
|
-
const features = this.selectedFeatures$.value;
|
|
435
|
-
const area = features.reduce((sum, localFeature) => {
|
|
436
|
-
return sum + localFeature.properties.measure.area || 0;
|
|
437
|
-
}, 0);
|
|
438
|
-
const length = features.reduce((sum, localFeature) => {
|
|
439
|
-
if (localFeature.geometry.type === 'Polygon') {
|
|
440
|
-
return sum;
|
|
441
|
-
}
|
|
442
|
-
return sum + localFeature.properties.measure.length || 0;
|
|
443
|
-
}, 0);
|
|
444
|
-
const perimeter = features.reduce((sum, localFeature) => {
|
|
445
|
-
if (localFeature.geometry.type === 'LineString') {
|
|
446
|
-
return sum;
|
|
447
|
-
}
|
|
448
|
-
return sum + localFeature.properties.measure.length || 0;
|
|
449
|
-
}, 0);
|
|
450
|
-
this.openDialog({
|
|
451
|
-
area,
|
|
452
|
-
length,
|
|
453
|
-
perimeter
|
|
454
|
-
});
|
|
455
|
-
}
|
|
456
|
-
onDeleteClick() {
|
|
457
|
-
this.store.deleteMany(this.selectedFeatures$.value);
|
|
458
|
-
this.selectedFeatures$.value.forEach(selectedFeature => {
|
|
459
|
-
this.olDrawSource.getFeatures().forEach(drawingLayerFeature => {
|
|
460
|
-
const geometry = drawingLayerFeature.getGeometry();
|
|
461
|
-
if (selectedFeature.properties.id === geometry.ol_uid) {
|
|
462
|
-
this.olDrawSource.removeFeature(drawingLayerFeature);
|
|
463
|
-
}
|
|
464
|
-
});
|
|
465
|
-
});
|
|
466
|
-
}
|
|
467
|
-
onModifyClick() {
|
|
468
|
-
if (this.selectedFeatures$.value.length !== 1) {
|
|
469
|
-
return;
|
|
470
|
-
}
|
|
471
|
-
if (this.modifyControl.active === true) {
|
|
472
|
-
this.deactivateModifyControl();
|
|
473
|
-
this.toggleDrawControl();
|
|
474
|
-
}
|
|
475
|
-
else {
|
|
476
|
-
const localFeature = this.selectedFeatures$.value[0];
|
|
477
|
-
const olFeatures = this.store.layer.ol.getSource().getFeatures();
|
|
478
|
-
const olFeature = olFeatures.find((_olFeature) => {
|
|
479
|
-
return _olFeature.get('id') === localFeature.properties.id;
|
|
480
|
-
});
|
|
481
|
-
if (olFeature !== undefined) {
|
|
482
|
-
this.deactivateDrawControl();
|
|
483
|
-
this.activateModifyControl();
|
|
484
|
-
const olGeometry = olFeature.getGeometry();
|
|
485
|
-
this.clearTooltipsOfOlGeometry(olGeometry);
|
|
486
|
-
this.modifyControl.setOlGeometry(olGeometry);
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
openDialog(data) {
|
|
491
|
-
this.dialog.open(MeasurerDialogComponent, { data });
|
|
492
|
-
}
|
|
493
|
-
/**
|
|
494
|
-
* Initialize the measure store and set up some listeners
|
|
495
|
-
* @internal
|
|
496
|
-
*/
|
|
497
|
-
initStore() {
|
|
498
|
-
const store = this.store;
|
|
499
|
-
const layer = new VectorLayer({
|
|
500
|
-
title: this.languageService.translate.instant('igo.geo.measure.layerTitle'),
|
|
501
|
-
isIgoInternalLayer: true,
|
|
502
|
-
id: `igo-measures-${uuid()}`,
|
|
503
|
-
zIndex: 200,
|
|
504
|
-
source: new FeatureDataSource(),
|
|
505
|
-
style: createMeasureLayerStyle(),
|
|
506
|
-
showInLayerList: true,
|
|
507
|
-
exportable: true,
|
|
508
|
-
browsable: false,
|
|
509
|
-
workspace: { enabled: false }
|
|
510
|
-
});
|
|
511
|
-
tryBindStoreLayer(store, layer);
|
|
512
|
-
store.layer.visible = true;
|
|
513
|
-
layer.visible$.subscribe(visible => {
|
|
514
|
-
if (visible) {
|
|
515
|
-
Array.from(document.getElementsByClassName('igo-map-tooltip-measure')).map((value) => value.classList.remove('igo-map-tooltip-measure-by-display'));
|
|
516
|
-
}
|
|
517
|
-
else {
|
|
518
|
-
Array.from(document.getElementsByClassName('igo-map-tooltip-measure')).map((value) => value.classList.add('igo-map-tooltip-measure-by-display'));
|
|
519
|
-
}
|
|
520
|
-
});
|
|
521
|
-
tryAddLoadingStrategy(store);
|
|
522
|
-
tryAddSelectionStrategy(store, new FeatureStoreSelectionStrategy({
|
|
523
|
-
map: this.map,
|
|
524
|
-
many: true
|
|
525
|
-
}));
|
|
526
|
-
this.onFeatureAddedKey = store.source.ol.on('addfeature', (event) => {
|
|
527
|
-
const localFeature = event.feature;
|
|
528
|
-
const olGeometry = localFeature.getGeometry();
|
|
529
|
-
this.updateMeasureOfOlGeometry(olGeometry, localFeature.get('measure'));
|
|
530
|
-
this.onDisplayDistance();
|
|
531
|
-
});
|
|
532
|
-
this.onFeatureRemovedKey = store.source.ol.on('removefeature', (event) => {
|
|
533
|
-
const olGeometry = event.feature.getGeometry();
|
|
534
|
-
this.clearTooltipsOfOlGeometry(olGeometry);
|
|
535
|
-
});
|
|
536
|
-
this.selectedFeatures$$ = store.stateView.manyBy$((record) => {
|
|
537
|
-
return record.state.selected === true;
|
|
538
|
-
}).pipe(skip(1) // Skip initial emission
|
|
539
|
-
)
|
|
540
|
-
.subscribe((records) => {
|
|
541
|
-
if (this.modifyControl.active === true) {
|
|
542
|
-
this.deactivateModifyControl();
|
|
543
|
-
}
|
|
544
|
-
this.selectedFeatures$.next(records.map(record => record.entity));
|
|
545
|
-
});
|
|
546
|
-
this.subscriptions$$.push(this.store.entities$.subscribe(objectsExists => {
|
|
547
|
-
if (objectsExists.find(objectExist => objectExist.geometry.type === 'Polygon')) {
|
|
548
|
-
this.hasArea$.next(true);
|
|
549
|
-
}
|
|
550
|
-
else {
|
|
551
|
-
this.hasArea$.next(false);
|
|
552
|
-
}
|
|
553
|
-
if (objectsExists.find(objectExist => objectExist.geometry.type === 'LineString')) {
|
|
554
|
-
this.hasLine$.next(true);
|
|
555
|
-
}
|
|
556
|
-
else {
|
|
557
|
-
this.hasLine$.next(false);
|
|
558
|
-
}
|
|
559
|
-
}));
|
|
560
|
-
this.subscriptions$$.push(this.store.count$.subscribe(cnt => {
|
|
561
|
-
cnt >= 1 ?
|
|
562
|
-
this.store.layer.options.showInLayerList = true :
|
|
563
|
-
this.store.layer.options.showInLayerList = false;
|
|
564
|
-
}));
|
|
565
|
-
}
|
|
566
|
-
/**
|
|
567
|
-
* Freeze any store, meaning the layer is removed, strategies are deactivated
|
|
568
|
-
* and some listener removed
|
|
569
|
-
* @internal
|
|
570
|
-
*/
|
|
571
|
-
freezeStore() {
|
|
572
|
-
const store = this.store;
|
|
573
|
-
this.selectedFeatures$$.unsubscribe();
|
|
574
|
-
unByKey(this.onFeatureAddedKey);
|
|
575
|
-
unByKey(this.onFeatureRemovedKey);
|
|
576
|
-
store.deactivateStrategyOfType(FeatureStoreLoadingStrategy);
|
|
577
|
-
store.deactivateStrategyOfType(FeatureStoreSelectionStrategy);
|
|
578
|
-
}
|
|
579
|
-
/**
|
|
580
|
-
* Create a draw line control
|
|
581
|
-
*/
|
|
582
|
-
createDrawLineControl() {
|
|
583
|
-
this.drawLineControl = new DrawControl({
|
|
584
|
-
geometryType: 'LineString',
|
|
585
|
-
drawingLayerSource: this.olDrawSource,
|
|
586
|
-
interactionStyle: createMeasureInteractionStyle(),
|
|
587
|
-
drawingLayerStyle: new OlStyle({})
|
|
588
|
-
});
|
|
589
|
-
}
|
|
590
|
-
/**
|
|
591
|
-
* Create a draw polygon control
|
|
592
|
-
*/
|
|
593
|
-
createDrawPolygonControl() {
|
|
594
|
-
this.drawPolygonControl = new DrawControl({
|
|
595
|
-
geometryType: 'Polygon',
|
|
596
|
-
drawingLayerSource: this.olDrawSource,
|
|
597
|
-
interactionStyle: createMeasureInteractionStyle(),
|
|
598
|
-
drawingLayerStyle: new OlStyle({})
|
|
599
|
-
});
|
|
600
|
-
}
|
|
601
|
-
/**
|
|
602
|
-
* Create a draw polygon control
|
|
603
|
-
*/
|
|
604
|
-
createModifyControl() {
|
|
605
|
-
this.modifyControl = new ModifyControl({
|
|
606
|
-
source: this.olDrawSource,
|
|
607
|
-
drawStyle: createMeasureInteractionStyle(),
|
|
608
|
-
layerStyle: new OlStyle({})
|
|
609
|
-
});
|
|
610
|
-
}
|
|
611
|
-
/**
|
|
612
|
-
* Activate the right control
|
|
613
|
-
*/
|
|
614
|
-
toggleDrawControl() {
|
|
615
|
-
this.deactivateDrawControl();
|
|
616
|
-
// this.deactivateModifyControl();
|
|
617
|
-
if (this.activeMeasureType === MeasureType.Length) {
|
|
618
|
-
this.activateDrawControl(this.drawLineControl);
|
|
619
|
-
}
|
|
620
|
-
else if (this.activeMeasureType === MeasureType.Area) {
|
|
621
|
-
this.activateDrawControl(this.drawPolygonControl);
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
/**
|
|
625
|
-
* Activate a given control
|
|
626
|
-
* @param drawControl Draw control
|
|
627
|
-
*/
|
|
628
|
-
activateDrawControl(drawControl) {
|
|
629
|
-
this.drawControlIsDisabled = false;
|
|
630
|
-
this.activeDrawControl = drawControl;
|
|
631
|
-
this.drawStart$$ = drawControl.start$
|
|
632
|
-
.subscribe((olGeometry) => this.onDrawStart(olGeometry));
|
|
633
|
-
this.drawEnd$$ = drawControl.end$
|
|
634
|
-
.subscribe((olGeometry) => this.onDrawEnd(olGeometry));
|
|
635
|
-
this.drawChanges$$ = drawControl.changes$
|
|
636
|
-
.subscribe((olGeometry) => this.onDrawChanges(olGeometry));
|
|
637
|
-
this.drawChanges$$ = drawControl.abort$
|
|
638
|
-
.subscribe((olGeometry) => {
|
|
639
|
-
this.clearTooltipsOfOlGeometry(olGeometry);
|
|
640
|
-
this.clearMeasures();
|
|
641
|
-
});
|
|
642
|
-
drawControl.setOlMap(this.map.ol, false);
|
|
643
|
-
}
|
|
644
|
-
/**
|
|
645
|
-
* Deactivate the active draw control
|
|
646
|
-
*/
|
|
647
|
-
deactivateDrawControl() {
|
|
648
|
-
if (this.activeDrawControl === undefined) {
|
|
649
|
-
return;
|
|
650
|
-
}
|
|
651
|
-
this.olDrawSource.clear();
|
|
652
|
-
if (this.drawStart$$ !== undefined) {
|
|
653
|
-
this.drawStart$$.unsubscribe();
|
|
654
|
-
}
|
|
655
|
-
if (this.drawEnd$$ !== undefined) {
|
|
656
|
-
this.drawEnd$$.unsubscribe();
|
|
657
|
-
}
|
|
658
|
-
if (this.drawChanges$$ !== undefined) {
|
|
659
|
-
this.drawChanges$$.unsubscribe();
|
|
660
|
-
}
|
|
661
|
-
this.clearTooltipsOfOlSource(this.olDrawSource);
|
|
662
|
-
if (this.activeOlGeometry !== undefined) {
|
|
663
|
-
this.clearTooltipsOfOlGeometry(this.activeOlGeometry);
|
|
664
|
-
}
|
|
665
|
-
this.activeDrawControl.setOlMap(undefined);
|
|
666
|
-
this.activeDrawControl = undefined;
|
|
667
|
-
this.activeOlGeometry = undefined;
|
|
668
|
-
}
|
|
669
|
-
setActiveMeasureType(measureType) {
|
|
670
|
-
this._activeMeasureType = measureType;
|
|
671
|
-
this.clearMeasures();
|
|
672
|
-
this.toggleDrawControl();
|
|
673
|
-
}
|
|
674
|
-
/**
|
|
675
|
-
* Clear the draw source and track the geometry being drawn
|
|
676
|
-
* @param olGeometry Ol linestring or polygon
|
|
677
|
-
*/
|
|
678
|
-
onDrawStart(olGeometry) {
|
|
679
|
-
this.activeOlGeometry = olGeometry;
|
|
680
|
-
}
|
|
681
|
-
/**
|
|
682
|
-
* Clear the draw source and track the geometry being draw
|
|
683
|
-
* @param olGeometry Ol linestring or polygon
|
|
684
|
-
*/
|
|
685
|
-
onDrawEnd(olGeometry) {
|
|
686
|
-
this.activeOlGeometry = undefined;
|
|
687
|
-
this.finalizeMeasureOfOlGeometry(olGeometry);
|
|
688
|
-
this.addFeatureToStore(olGeometry);
|
|
689
|
-
this.clearTooltipsOfOlGeometry(olGeometry);
|
|
690
|
-
this.olDrawSource.clear(true);
|
|
691
|
-
}
|
|
692
|
-
/**
|
|
693
|
-
* Update measures observables and map tooltips
|
|
694
|
-
* @param olGeometry Ol linestring or polygon
|
|
695
|
-
*/
|
|
696
|
-
onDrawChanges(olGeometry) {
|
|
697
|
-
const measure = measureOlGeometry(olGeometry, this.projection);
|
|
698
|
-
this.updateMeasureOfOlGeometry(olGeometry, Object.assign({}, measure, {
|
|
699
|
-
area: undefined // We don't want to display an area tooltip while drawing.
|
|
700
|
-
}));
|
|
701
|
-
this.measure$.next(measure);
|
|
702
|
-
}
|
|
703
|
-
/**
|
|
704
|
-
* Activate a given control
|
|
705
|
-
* @param modifyControl Modify control
|
|
706
|
-
*/
|
|
707
|
-
activateModifyControl() {
|
|
708
|
-
const selection = this.store.getStrategyOfType(FeatureStoreSelectionStrategy);
|
|
709
|
-
selection.deactivate();
|
|
710
|
-
selection.clear();
|
|
711
|
-
this.modifyStart$$ = this.modifyControl.start$
|
|
712
|
-
.subscribe((olGeometry) => this.onModifyStart(olGeometry));
|
|
713
|
-
this.modifyEnd$$ = this.modifyControl.end$
|
|
714
|
-
.subscribe((olGeometry) => this.onModifyEnd(olGeometry));
|
|
715
|
-
this.modifyChanges$$ = this.modifyControl.changes$
|
|
716
|
-
.subscribe((olGeometry) => this.onModifyChanges(olGeometry));
|
|
717
|
-
this.modifyControl.setOlMap(this.map.ol);
|
|
718
|
-
}
|
|
719
|
-
/**
|
|
720
|
-
* Deactivate the active modify control
|
|
721
|
-
*/
|
|
722
|
-
deactivateModifyControl() {
|
|
723
|
-
if (this.modifyStart$$ !== undefined) {
|
|
724
|
-
this.modifyStart$$.unsubscribe();
|
|
725
|
-
}
|
|
726
|
-
if (this.modifyEnd$$ !== undefined) {
|
|
727
|
-
this.modifyEnd$$.unsubscribe();
|
|
728
|
-
}
|
|
729
|
-
if (this.modifyChanges$$ !== undefined) {
|
|
730
|
-
this.modifyChanges$$.unsubscribe();
|
|
731
|
-
}
|
|
732
|
-
if (this.activeOlGeometry !== undefined) {
|
|
733
|
-
if (this.selectedFeatures$.value.length === 1) {
|
|
734
|
-
const localFeature = this.selectedFeatures$.value[0];
|
|
735
|
-
this.addFeatureToStore(this.activeOlGeometry, localFeature);
|
|
736
|
-
}
|
|
737
|
-
this.finalizeMeasureOfOlGeometry(this.activeOlGeometry);
|
|
738
|
-
}
|
|
739
|
-
this.olDrawSource.clear();
|
|
740
|
-
this.store.activateStrategyOfType(FeatureStoreSelectionStrategy);
|
|
741
|
-
this.activeOlGeometry = undefined;
|
|
742
|
-
this.modifyControl.setOlMap(undefined);
|
|
743
|
-
}
|
|
744
|
-
/**
|
|
745
|
-
* Clear the draw source and track the geometry being drawn
|
|
746
|
-
* @param olGeometry Ol linestring or polygon
|
|
747
|
-
*/
|
|
748
|
-
onModifyStart(olGeometry) {
|
|
749
|
-
this.onDrawStart(olGeometry);
|
|
750
|
-
}
|
|
751
|
-
/**
|
|
752
|
-
* Update measures observables and map tooltips
|
|
753
|
-
* @param olGeometry Ol linestring or polygon
|
|
754
|
-
*/
|
|
755
|
-
onModifyChanges(olGeometry) {
|
|
756
|
-
this.onDrawChanges(olGeometry);
|
|
757
|
-
}
|
|
758
|
-
/**
|
|
759
|
-
* Clear the draw source and track the geometry being draw
|
|
760
|
-
* @param olGeometry Ol linestring or polygon
|
|
761
|
-
*/
|
|
762
|
-
onModifyEnd(olGeometry) {
|
|
763
|
-
this.finalizeMeasureOfOlGeometry(olGeometry);
|
|
764
|
-
}
|
|
765
|
-
finalizeMeasureOfOlGeometry(olGeometry) {
|
|
766
|
-
const measure = measureOlGeometry(olGeometry, this.projection);
|
|
767
|
-
this.updateMeasureOfOlGeometry(olGeometry, measure);
|
|
768
|
-
}
|
|
769
|
-
/**
|
|
770
|
-
* Update measures observables
|
|
771
|
-
* @param olGeometry Ol linestring or polygon
|
|
772
|
-
* @param measure Measure
|
|
773
|
-
*/
|
|
774
|
-
updateMeasureOfOlGeometry(olGeometry, measure) {
|
|
775
|
-
olGeometry.setProperties({ _measure: measure }, true);
|
|
776
|
-
this.updateTooltipsOfOlGeometry(olGeometry);
|
|
777
|
-
}
|
|
778
|
-
/**
|
|
779
|
-
* Clear the measures observables
|
|
780
|
-
*/
|
|
781
|
-
clearMeasures() {
|
|
782
|
-
this.measure$.next({});
|
|
783
|
-
}
|
|
784
|
-
/**
|
|
785
|
-
* Add a feature with measures to the store. The loading stragegy of the store
|
|
786
|
-
* will trigger and add the feature to the map.
|
|
787
|
-
* @internal
|
|
788
|
-
*/
|
|
789
|
-
addFeatureToStore(olGeometry, localFeature) {
|
|
790
|
-
const featureId = localFeature ? localFeature.properties.id : olGeometry.ol_uid;
|
|
791
|
-
const projection = this.map.ol.getView().getProjection();
|
|
792
|
-
const geometry = new OlGeoJSON().writeGeometryObject(olGeometry, {
|
|
793
|
-
featureProjection: projection,
|
|
794
|
-
dataProjection: projection
|
|
795
|
-
});
|
|
796
|
-
this.store.update({
|
|
797
|
-
type: FEATURE,
|
|
798
|
-
geometry,
|
|
799
|
-
projection: projection.getCode(),
|
|
800
|
-
properties: {
|
|
801
|
-
id: featureId,
|
|
802
|
-
measure: olGeometry.get('_measure')
|
|
803
|
-
},
|
|
804
|
-
meta: {
|
|
805
|
-
id: featureId
|
|
806
|
-
}
|
|
807
|
-
});
|
|
808
|
-
}
|
|
809
|
-
/**
|
|
810
|
-
* Update all the tooltips of an OL geometry
|
|
811
|
-
* @param olGeometry OL Geometry
|
|
812
|
-
* @param lengths Lengths of the OL geometry's segments
|
|
813
|
-
* @param measureUnit Display tooltip measure in those units
|
|
814
|
-
*/
|
|
815
|
-
updateTooltipsOfOlGeometry(olGeometry) {
|
|
816
|
-
const measure = olGeometry.get('_measure');
|
|
817
|
-
const lengths = measure.lengths;
|
|
818
|
-
const area = measure.area;
|
|
819
|
-
const olMidpointsTooltips = updateOlTooltipsAtMidpoints(olGeometry);
|
|
820
|
-
if (lengths.length === olMidpointsTooltips.length) {
|
|
821
|
-
for (let i = 0; i < olMidpointsTooltips.length; i++) {
|
|
822
|
-
const length = lengths[i];
|
|
823
|
-
if (length !== undefined) {
|
|
824
|
-
this.updateOlTooltip(olMidpointsTooltips[i], metersToUnit(length, this.activeLengthUnit), this.activeLengthUnit, MeasureType.Length);
|
|
825
|
-
}
|
|
826
|
-
}
|
|
827
|
-
}
|
|
828
|
-
if (area !== undefined) {
|
|
829
|
-
this.updateOlTooltip(updateOlTooltipAtCenter(olGeometry), squareMetersToUnit(area, this.activeAreaUnit), this.activeAreaUnit, MeasureType.Area);
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
/**
|
|
833
|
-
* Show the map tooltips of a geoemtry
|
|
834
|
-
*/
|
|
835
|
-
showTooltipsOfOlGeometry(olGeometry) {
|
|
836
|
-
getTooltipsOfOlGeometry(olGeometry).forEach((olTooltip) => {
|
|
837
|
-
if (this.shouldShowTooltip(olTooltip)) {
|
|
838
|
-
this.map.ol.addOverlay(olTooltip);
|
|
839
|
-
}
|
|
840
|
-
});
|
|
841
|
-
}
|
|
842
|
-
/**
|
|
843
|
-
* Clear the tooltips of an OL geometrys
|
|
844
|
-
* @param olGeometry OL geometry with tooltips
|
|
845
|
-
*/
|
|
846
|
-
clearTooltipsOfOlGeometry(olGeometry) {
|
|
847
|
-
getTooltipsOfOlGeometry(olGeometry).forEach((olTooltip) => {
|
|
848
|
-
if (olTooltip !== undefined && olTooltip.getMap() !== undefined) {
|
|
849
|
-
this.map.ol.removeOverlay(olTooltip);
|
|
850
|
-
}
|
|
851
|
-
});
|
|
852
|
-
}
|
|
853
|
-
/**
|
|
854
|
-
* Show the map tooltips of all the geometries of a source
|
|
855
|
-
*/
|
|
856
|
-
updateTooltipsOfOlSource(olSource) {
|
|
857
|
-
olSource.forEachFeature((olFeature) => {
|
|
858
|
-
this.updateTooltipsOfOlGeometry(olFeature.getGeometry());
|
|
859
|
-
});
|
|
860
|
-
}
|
|
861
|
-
/**
|
|
862
|
-
* Show the map tooltips of all the geometries of a source
|
|
863
|
-
*/
|
|
864
|
-
showTooltipsOfOlSource(olSource) {
|
|
865
|
-
olSource.forEachFeature((olFeature) => {
|
|
866
|
-
this.showTooltipsOfOlGeometry(olFeature.getGeometry());
|
|
867
|
-
});
|
|
868
|
-
}
|
|
869
|
-
/**
|
|
870
|
-
* Clear the map tooltips
|
|
871
|
-
* @param olDrawSource OL vector source
|
|
872
|
-
*/
|
|
873
|
-
clearTooltipsOfOlSource(olSource) {
|
|
874
|
-
olSource.forEachFeature((olFeature) => {
|
|
875
|
-
const olGeometry = olFeature.getGeometry();
|
|
876
|
-
if (olGeometry !== undefined) {
|
|
877
|
-
this.clearTooltipsOfOlGeometry(olFeature.getGeometry());
|
|
878
|
-
}
|
|
879
|
-
});
|
|
880
|
-
}
|
|
881
|
-
/**
|
|
882
|
-
* Update an OL tooltip properties and inner HTML and add it to the map if possible
|
|
883
|
-
* @param olTooltip OL tooltip
|
|
884
|
-
* @param measure The measure valeu ti display
|
|
885
|
-
* @param measureUnit Display tooltip measure in those units
|
|
886
|
-
*/
|
|
887
|
-
updateOlTooltip(olTooltip, measure, unit, type) {
|
|
888
|
-
olTooltip.setProperties({ _measure: measure, _unit: unit, _type: type }, true);
|
|
889
|
-
olTooltip.getElement().innerHTML = this.computeTooltipInnerHTML(olTooltip);
|
|
890
|
-
if (this.shouldShowTooltip(olTooltip)) {
|
|
891
|
-
this.map.ol.addOverlay(olTooltip);
|
|
892
|
-
}
|
|
893
|
-
}
|
|
894
|
-
/**
|
|
895
|
-
* Compute a tooltip's content
|
|
896
|
-
* @param olTooltip OL overlay
|
|
897
|
-
* @returns Inner HTML
|
|
898
|
-
*/
|
|
899
|
-
computeTooltipInnerHTML(olTooltip) {
|
|
900
|
-
const properties = olTooltip.getProperties();
|
|
901
|
-
return formatMeasure(properties._measure, {
|
|
902
|
-
decimal: 1,
|
|
903
|
-
unit: properties._unit,
|
|
904
|
-
unitAbbr: true,
|
|
905
|
-
locale: 'fr'
|
|
906
|
-
}, this.languageService);
|
|
907
|
-
}
|
|
908
|
-
/**
|
|
909
|
-
* Whether a tooltip should be showned based on the length
|
|
910
|
-
* of the segment it is bound to.
|
|
911
|
-
* @param olTooltip OL overlay
|
|
912
|
-
* @returns True if the tooltip should be shown
|
|
913
|
-
*/
|
|
914
|
-
shouldShowTooltip(olTooltip) {
|
|
915
|
-
if (this.showTooltips === false) {
|
|
916
|
-
return false;
|
|
917
|
-
}
|
|
918
|
-
const properties = olTooltip.getProperties();
|
|
919
|
-
const measure = properties._measure;
|
|
920
|
-
if (measure === undefined) {
|
|
921
|
-
return false;
|
|
922
|
-
}
|
|
923
|
-
if (properties._unit === MeasureType.Length) {
|
|
924
|
-
const minSegmentLength = metersToUnit(this.minSegmentLength, properties._unit) || 0;
|
|
925
|
-
return measure > Math.max(minSegmentLength, 0);
|
|
926
|
-
}
|
|
927
|
-
return true;
|
|
928
|
-
}
|
|
929
|
-
}
|
|
930
|
-
MeasurerComponent.ɵfac = function MeasurerComponent_Factory(t) { return new (t || MeasurerComponent)(i0.ɵɵdirectiveInject(i1.LanguageService), i0.ɵɵdirectiveInject(i2.MatDialog), i0.ɵɵdirectiveInject(i1.StorageService)); };
|
|
931
|
-
MeasurerComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MeasurerComponent, selectors: [["igo-measurer"]], viewQuery: function MeasurerComponent_Query(rf, ctx) { if (rf & 1) {
|
|
932
|
-
i0.ɵɵviewQuery(_c0, 7);
|
|
933
|
-
} if (rf & 2) {
|
|
934
|
-
let _t;
|
|
935
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.table = _t.first);
|
|
936
|
-
} }, inputs: { map: "map", store: "store", activeMeasureType: "activeMeasureType", minSegmentLength: "minSegmentLength" }, decls: 43, vars: 60, consts: [[1, "measure-type-toggle", "mat-typography"], [3, "value", "change"], [3, "value"], [1, "measure-options", "mat-typography"], [3, "disabled", "checked", "labelPosition", "change"], [4, "ngIf"], [3, "checked", "labelPosition", "change", 4, "ngIf"], [3, "checked", "labelPosition", "change"], [1, "measure-store-buttons"], ["mat-icon-button", "", "color", "accent", 3, "matTooltip", "disabled", "click", 4, "ngIf"], ["mat-icon-button", "", "color", "warn", 3, "matTooltip", "disabled", "click", 4, "ngIf"], [1, "table-compact", 3, "store", "template"], ["table", ""], [3, "measureType", "measureUnit", "measure", "auto", "placeholder", "measureUnitChange", 4, "ngIf"], [3, "measureType", "measureUnit", "measure", "auto", "placeholder", "measureUnitChange"], ["mat-icon-button", "", "color", "accent", 3, "matTooltip", "disabled", "click"], ["svgIcon", "calculator"], ["mat-icon-button", "", "color", "warn", 3, "matTooltip", "disabled", "click"], ["svgIcon", "delete"]], template: function MeasurerComponent_Template(rf, ctx) { if (rf & 1) {
|
|
937
|
-
i0.ɵɵelementStart(0, "div")(1, "div", 0)(2, "mat-button-toggle-group", 1);
|
|
938
|
-
i0.ɵɵlistener("change", function MeasurerComponent_Template_mat_button_toggle_group_change_2_listener($event) { return ctx.onMeasureTypeChange($event.value); });
|
|
939
|
-
i0.ɵɵelementStart(3, "mat-button-toggle", 2);
|
|
940
|
-
i0.ɵɵtext(4);
|
|
941
|
-
i0.ɵɵpipe(5, "translate");
|
|
942
|
-
i0.ɵɵelementEnd();
|
|
943
|
-
i0.ɵɵelementStart(6, "mat-button-toggle", 2);
|
|
944
|
-
i0.ɵɵtext(7);
|
|
945
|
-
i0.ɵɵpipe(8, "translate");
|
|
946
|
-
i0.ɵɵelementEnd()()();
|
|
947
|
-
i0.ɵɵelementStart(9, "div", 3)(10, "mat-slide-toggle", 4);
|
|
948
|
-
i0.ɵɵlistener("change", function MeasurerComponent_Template_mat_slide_toggle_change_10_listener($event) { return ctx.onToggleDrawControl($event.checked); });
|
|
949
|
-
i0.ɵɵtext(11);
|
|
950
|
-
i0.ɵɵpipe(12, "translate");
|
|
951
|
-
i0.ɵɵelementEnd();
|
|
952
|
-
i0.ɵɵtemplate(13, MeasurerComponent_mat_divider_13_Template, 1, 0, "mat-divider", 5);
|
|
953
|
-
i0.ɵɵpipe(14, "async");
|
|
954
|
-
i0.ɵɵtemplate(15, MeasurerComponent_mat_slide_toggle_15_Template, 3, 5, "mat-slide-toggle", 6);
|
|
955
|
-
i0.ɵɵpipe(16, "async");
|
|
956
|
-
i0.ɵɵtemplate(17, MeasurerComponent_mat_divider_17_Template, 1, 0, "mat-divider", 5);
|
|
957
|
-
i0.ɵɵpipe(18, "async");
|
|
958
|
-
i0.ɵɵpipe(19, "async");
|
|
959
|
-
i0.ɵɵtemplate(20, MeasurerComponent_mat_slide_toggle_20_Template, 3, 5, "mat-slide-toggle", 6);
|
|
960
|
-
i0.ɵɵpipe(21, "async");
|
|
961
|
-
i0.ɵɵtemplate(22, MeasurerComponent_mat_slide_toggle_22_Template, 3, 5, "mat-slide-toggle", 6);
|
|
962
|
-
i0.ɵɵpipe(23, "async");
|
|
963
|
-
i0.ɵɵtemplate(24, MeasurerComponent_mat_divider_24_Template, 1, 0, "mat-divider", 5);
|
|
964
|
-
i0.ɵɵpipe(25, "async");
|
|
965
|
-
i0.ɵɵelementStart(26, "mat-slide-toggle", 7);
|
|
966
|
-
i0.ɵɵlistener("change", function MeasurerComponent_Template_mat_slide_toggle_change_26_listener($event) { return ctx.onToggleMeasureUnitsAuto($event.checked); });
|
|
967
|
-
i0.ɵɵtext(27);
|
|
968
|
-
i0.ɵɵpipe(28, "translate");
|
|
969
|
-
i0.ɵɵelementEnd()();
|
|
970
|
-
i0.ɵɵtemplate(29, MeasurerComponent_ng_container_29_Template, 3, 2, "ng-container", 5);
|
|
971
|
-
i0.ɵɵpipe(30, "async");
|
|
972
|
-
i0.ɵɵtemplate(31, MeasurerComponent_mat_divider_31_Template, 1, 0, "mat-divider", 5);
|
|
973
|
-
i0.ɵɵpipe(32, "async");
|
|
974
|
-
i0.ɵɵpipe(33, "async");
|
|
975
|
-
i0.ɵɵelementStart(34, "div", 8);
|
|
976
|
-
i0.ɵɵtemplate(35, MeasurerComponent_button_35_Template, 4, 6, "button", 9);
|
|
977
|
-
i0.ɵɵpipe(36, "async");
|
|
978
|
-
i0.ɵɵpipe(37, "async");
|
|
979
|
-
i0.ɵɵtemplate(38, MeasurerComponent_button_38_Template, 4, 6, "button", 10);
|
|
980
|
-
i0.ɵɵpipe(39, "async");
|
|
981
|
-
i0.ɵɵpipe(40, "async");
|
|
982
|
-
i0.ɵɵelementEnd();
|
|
983
|
-
i0.ɵɵelement(41, "igo-entity-table", 11, 12);
|
|
984
|
-
i0.ɵɵelementEnd();
|
|
985
|
-
} if (rf & 2) {
|
|
986
|
-
i0.ɵɵadvance(2);
|
|
987
|
-
i0.ɵɵproperty("value", ctx.activeMeasureType);
|
|
988
|
-
i0.ɵɵadvance(1);
|
|
989
|
-
i0.ɵɵproperty("value", ctx.measureType.Length);
|
|
990
|
-
i0.ɵɵadvance(1);
|
|
991
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 24, "igo.geo.measure." + ctx.measureType.Length), " ");
|
|
992
|
-
i0.ɵɵadvance(2);
|
|
993
|
-
i0.ɵɵproperty("value", ctx.measureType.Area);
|
|
994
|
-
i0.ɵɵadvance(1);
|
|
995
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 26, "igo.geo.measure." + ctx.measureType.Area), " ");
|
|
996
|
-
i0.ɵɵadvance(3);
|
|
997
|
-
i0.ɵɵproperty("disabled", ctx.drawControlIsDisabled)("checked", ctx.drawControlIsActive)("labelPosition", "before");
|
|
998
|
-
i0.ɵɵadvance(1);
|
|
999
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(12, 28, "igo.geo.measure.toggleActive"), " ");
|
|
1000
|
-
i0.ɵɵadvance(2);
|
|
1001
|
-
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(14, 30, ctx.hasLine$));
|
|
1002
|
-
i0.ɵɵadvance(2);
|
|
1003
|
-
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(16, 32, ctx.hasLine$));
|
|
1004
|
-
i0.ɵɵadvance(2);
|
|
1005
|
-
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(18, 34, ctx.hasLine$) || i0.ɵɵpipeBind1(19, 36, ctx.hasArea$));
|
|
1006
|
-
i0.ɵɵadvance(3);
|
|
1007
|
-
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(21, 38, ctx.hasArea$));
|
|
1008
|
-
i0.ɵɵadvance(2);
|
|
1009
|
-
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(23, 40, ctx.hasArea$));
|
|
1010
|
-
i0.ɵɵadvance(2);
|
|
1011
|
-
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(25, 42, ctx.hasArea$));
|
|
1012
|
-
i0.ɵɵadvance(2);
|
|
1013
|
-
i0.ɵɵproperty("checked", ctx.measureUnitsAuto)("labelPosition", "before");
|
|
1014
|
-
i0.ɵɵadvance(1);
|
|
1015
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(28, 44, "igo.geo.measure.toggleAutoUnits"), " ");
|
|
1016
|
-
i0.ɵɵadvance(2);
|
|
1017
|
-
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(30, 46, ctx.measure$));
|
|
1018
|
-
i0.ɵɵadvance(2);
|
|
1019
|
-
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(32, 48, ctx.hasLine$) || i0.ɵɵpipeBind1(33, 50, ctx.hasArea$));
|
|
1020
|
-
i0.ɵɵadvance(4);
|
|
1021
|
-
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(36, 52, ctx.hasLine$) || i0.ɵɵpipeBind1(37, 54, ctx.hasArea$));
|
|
1022
|
-
i0.ɵɵadvance(3);
|
|
1023
|
-
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(39, 56, ctx.hasLine$) || i0.ɵɵpipeBind1(40, 58, ctx.hasArea$));
|
|
1024
|
-
i0.ɵɵadvance(3);
|
|
1025
|
-
i0.ɵɵproperty("store", ctx.store)("template", ctx.tableTemplate);
|
|
1026
|
-
} }, styles: [".measure-type-toggle[_ngcontent-%COMP%]{padding:10px;text-align:center}.measure-type-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{width:100%}.measure-type-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] mat-button-toggle[_ngcontent-%COMP%]{width:50%}.measure-options[_ngcontent-%COMP%]{overflow-x:hidden}.measure-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%]{width:100%;margin:10px}.measure-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%] .mat-slide-toggle-content{width:calc(100% - 60px)}.measure-store-buttons[_ngcontent-%COMP%]{margin-left:-2px}.measure-store-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:first-of-type{margin-left:14px}.table-compact[_ngcontent-%COMP%] .mat-header-cell.mat-column-selectionCheckbox{width:52px}"], changeDetection: 0 });
|
|
1027
|
-
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MeasurerComponent, [{
|
|
1028
|
-
type: Component,
|
|
1029
|
-
args: [{ selector: 'igo-measurer', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n <div class=\"measure-type-toggle mat-typography\">\n <mat-button-toggle-group\n [value]=\"activeMeasureType\"\n (change)=\"onMeasureTypeChange($event.value)\">\n <mat-button-toggle [value]=\"measureType.Length\">\n {{('igo.geo.measure.' + measureType.Length) | translate}}\n </mat-button-toggle>\n <mat-button-toggle [value]=\"measureType.Area\">\n {{('igo.geo.measure.' + measureType.Area) | translate}}\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <div class=\"measure-options mat-typography\">\n <mat-slide-toggle\n [disabled]=\"drawControlIsDisabled\"\n [checked]=\"drawControlIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDrawControl($event.checked)\">\n {{'igo.geo.measure.toggleActive' | translate}}\n </mat-slide-toggle>\n\n <mat-divider *ngIf=\"(hasLine$ | async)\"></mat-divider>\n\n <mat-slide-toggle *ngIf=\"(hasLine$ | async)\"\n [checked]=\"displayLines\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDisplayLines($event.checked)\">\n {{'igo.geo.measure.toggleDisplayLines' | translate}}\n </mat-slide-toggle>\n\n <mat-divider *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"></mat-divider>\n\n <mat-slide-toggle *ngIf=\"(hasArea$ | async)\"\n [checked]=\"displayDistance\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDisplayDistance($event.checked)\">\n {{'igo.geo.measure.toggleDisplayDistance' | translate}}\n </mat-slide-toggle>\n\n <mat-slide-toggle *ngIf=\"(hasArea$ | async)\"\n [checked]=\"displayAreas\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDisplayAreas($event.checked)\">\n {{'igo.geo.measure.toggleDisplayAreas' | translate}}\n </mat-slide-toggle>\n\n <mat-divider *ngIf=\"(hasArea$ | async)\"></mat-divider>\n\n <mat-slide-toggle\n [checked]=\"measureUnitsAuto\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleMeasureUnitsAuto($event.checked)\">\n {{'igo.geo.measure.toggleAutoUnits' | translate}}\n </mat-slide-toggle>\n </div>\n\n <ng-container *ngIf=\"measure$ | async as measure\">\n <igo-measurer-item *ngIf=\"activeMeasureType === measureType.Length || activeMeasureType === measureType.Area\"\n [measureType]=\"measureType.Length\"\n [measureUnit]=\"measureLengthUnit.Meters\"\n [measure]=\"measure.length\"\n [auto]=\"measureUnitsAuto\"\n [placeholder]=\"(activeMeasureType === measureType.Area ? 'igo.geo.measure.perimeter' : 'igo.geo.measure.length') | translate\"\n (measureUnitChange)=\"onLengthUnitChange($event)\">\n </igo-measurer-item>\n\n <igo-measurer-item *ngIf=\"activeMeasureType === measureType.Area\"\n [measureType]=\"measureType.Area\"\n [measureUnit]=\"measureAreaUnit.SquareMeters\"\n [measure]=\"measure.area\"\n [auto]=\"measureUnitsAuto\"\n [placeholder]=\"'igo.geo.measure.area' | translate\"\n (measureUnitChange)=\"onAreaUnitChange($event)\">\n </igo-measurer-item>\n </ng-container>\n\n <mat-divider *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"></mat-divider>\n\n <div class=\"measure-store-buttons\">\n <button *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"\n mat-icon-button\n [matTooltip]=\"'igo.geo.measure.actionbar.calculate.tooltip' | translate\"\n [disabled]=\"(selectedFeatures$ | async).length === 0\"\n color=\"accent\"\n (click)=\"onCalculateClick()\">\n <mat-icon svgIcon=\"calculator\"></mat-icon>\n </button>\n\n <button *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"\n mat-icon-button\n [matTooltip]=\"'igo.geo.measure.actionbar.delete.tooltip' | translate\"\n [disabled]=\"(selectedFeatures$ | async).length === 0\"\n color=\"warn\"\n (click)=\"onDeleteClick()\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n\n <!--button\n mat-icon-button\n [matTooltip]=\"'igo.geo.measure.actionbar.modify.tooltip' | translate\"\n [disabled]=\"(selectedFeatures$ | async).length !== 1\"\n (click)=\"onModifyClick()\">\n <mat-icon svgIcon=\"edit\"></mat-icon>\n </button-->\n </div>\n\n <igo-entity-table\n #table\n class=\"table-compact\"\n [store]=\"store\"\n [template]=\"tableTemplate\">\n </igo-entity-table>\n</div>\n", styles: [".measure-type-toggle{padding:10px;text-align:center}.measure-type-toggle mat-button-toggle-group{width:100%}.measure-type-toggle mat-button-toggle-group mat-button-toggle{width:50%}.measure-options{overflow-x:hidden}.measure-options mat-slide-toggle{width:100%;margin:10px}.measure-options mat-slide-toggle ::ng-deep .mat-slide-toggle-content{width:calc(100% - 60px)}.measure-store-buttons{margin-left:-2px}.measure-store-buttons button:first-of-type{margin-left:14px}.table-compact ::ng-deep .mat-header-cell.mat-column-selectionCheckbox{width:52px}\n"] }]
|
|
1030
|
-
}], function () { return [{ type: i1.LanguageService }, { type: i2.MatDialog }, { type: i1.StorageService }]; }, { map: [{
|
|
1031
|
-
type: Input
|
|
1032
|
-
}], store: [{
|
|
1033
|
-
type: Input
|
|
1034
|
-
}], activeMeasureType: [{
|
|
1035
|
-
type: Input
|
|
1036
|
-
}], minSegmentLength: [{
|
|
1037
|
-
type: Input
|
|
1038
|
-
}], table: [{
|
|
1039
|
-
type: ViewChild,
|
|
1040
|
-
args: ['table', { static: true }]
|
|
1041
|
-
}] }); })();
|
|
1
|
+
import { Component, Input, ChangeDetectionStrategy, ViewChild } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import { skip } from 'rxjs/operators';
|
|
4
|
+
import OlStyle from 'ol/style/Style';
|
|
5
|
+
import OlGeoJSON from 'ol/format/GeoJSON';
|
|
6
|
+
import OlVectorSource from 'ol/source/Vector';
|
|
7
|
+
import { unByKey } from 'ol/Observable';
|
|
8
|
+
import { StorageScope } from '@igo2/core';
|
|
9
|
+
import { uuid } from '@igo2/utils';
|
|
10
|
+
import { FeatureDataSource } from '../../datasource';
|
|
11
|
+
import { FEATURE, FeatureStoreLoadingStrategy, FeatureStoreSelectionStrategy, tryBindStoreLayer, tryAddLoadingStrategy, tryAddSelectionStrategy } from '../../feature';
|
|
12
|
+
import { DrawControl, ModifyControl } from '../../geometry/shared';
|
|
13
|
+
import { VectorLayer } from '../../layer';
|
|
14
|
+
import { MeasureType, MeasureAreaUnit, MeasureLengthUnit, } from '../shared/measure.enum';
|
|
15
|
+
import { measureOlGeometry, createMeasureInteractionStyle, createMeasureLayerStyle, updateOlTooltipsAtMidpoints, updateOlTooltipAtCenter, getTooltipsOfOlGeometry, squareMetersToUnit, metersToUnit, formatMeasure } from '../shared/measure.utils';
|
|
16
|
+
import { MeasurerDialogComponent } from './measurer-dialog.component';
|
|
17
|
+
import * as i0 from "@angular/core";
|
|
18
|
+
import * as i1 from "@igo2/core";
|
|
19
|
+
import * as i2 from "@angular/material/dialog";
|
|
20
|
+
const _c0 = ["table"];
|
|
21
|
+
function MeasurerComponent_mat_divider_13_Template(rf, ctx) { if (rf & 1) {
|
|
22
|
+
i0.ɵɵelement(0, "mat-divider");
|
|
23
|
+
} }
|
|
24
|
+
function MeasurerComponent_mat_slide_toggle_15_Template(rf, ctx) { if (rf & 1) {
|
|
25
|
+
const _r12 = i0.ɵɵgetCurrentView();
|
|
26
|
+
i0.ɵɵelementStart(0, "mat-slide-toggle", 7);
|
|
27
|
+
i0.ɵɵlistener("change", function MeasurerComponent_mat_slide_toggle_15_Template_mat_slide_toggle_change_0_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r11 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r11.onToggleDisplayLines($event.checked)); });
|
|
28
|
+
i0.ɵɵtext(1);
|
|
29
|
+
i0.ɵɵpipe(2, "translate");
|
|
30
|
+
i0.ɵɵelementEnd();
|
|
31
|
+
} if (rf & 2) {
|
|
32
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
33
|
+
i0.ɵɵproperty("checked", ctx_r1.displayLines)("labelPosition", "before");
|
|
34
|
+
i0.ɵɵadvance(1);
|
|
35
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 3, "igo.geo.measure.toggleDisplayLines"), " ");
|
|
36
|
+
} }
|
|
37
|
+
function MeasurerComponent_mat_divider_17_Template(rf, ctx) { if (rf & 1) {
|
|
38
|
+
i0.ɵɵelement(0, "mat-divider");
|
|
39
|
+
} }
|
|
40
|
+
function MeasurerComponent_mat_slide_toggle_20_Template(rf, ctx) { if (rf & 1) {
|
|
41
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
42
|
+
i0.ɵɵelementStart(0, "mat-slide-toggle", 7);
|
|
43
|
+
i0.ɵɵlistener("change", function MeasurerComponent_mat_slide_toggle_20_Template_mat_slide_toggle_change_0_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r13 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r13.onToggleDisplayDistance($event.checked)); });
|
|
44
|
+
i0.ɵɵtext(1);
|
|
45
|
+
i0.ɵɵpipe(2, "translate");
|
|
46
|
+
i0.ɵɵelementEnd();
|
|
47
|
+
} if (rf & 2) {
|
|
48
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
49
|
+
i0.ɵɵproperty("checked", ctx_r3.displayDistance)("labelPosition", "before");
|
|
50
|
+
i0.ɵɵadvance(1);
|
|
51
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 3, "igo.geo.measure.toggleDisplayDistance"), " ");
|
|
52
|
+
} }
|
|
53
|
+
function MeasurerComponent_mat_slide_toggle_22_Template(rf, ctx) { if (rf & 1) {
|
|
54
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
55
|
+
i0.ɵɵelementStart(0, "mat-slide-toggle", 7);
|
|
56
|
+
i0.ɵɵlistener("change", function MeasurerComponent_mat_slide_toggle_22_Template_mat_slide_toggle_change_0_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r15 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r15.onToggleDisplayAreas($event.checked)); });
|
|
57
|
+
i0.ɵɵtext(1);
|
|
58
|
+
i0.ɵɵpipe(2, "translate");
|
|
59
|
+
i0.ɵɵelementEnd();
|
|
60
|
+
} if (rf & 2) {
|
|
61
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
62
|
+
i0.ɵɵproperty("checked", ctx_r4.displayAreas)("labelPosition", "before");
|
|
63
|
+
i0.ɵɵadvance(1);
|
|
64
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 3, "igo.geo.measure.toggleDisplayAreas"), " ");
|
|
65
|
+
} }
|
|
66
|
+
function MeasurerComponent_mat_divider_24_Template(rf, ctx) { if (rf & 1) {
|
|
67
|
+
i0.ɵɵelement(0, "mat-divider");
|
|
68
|
+
} }
|
|
69
|
+
function MeasurerComponent_ng_container_29_igo_measurer_item_1_Template(rf, ctx) { if (rf & 1) {
|
|
70
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
71
|
+
i0.ɵɵelementStart(0, "igo-measurer-item", 14);
|
|
72
|
+
i0.ɵɵlistener("measureUnitChange", function MeasurerComponent_ng_container_29_igo_measurer_item_1_Template_igo_measurer_item_measureUnitChange_0_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r20 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r20.onLengthUnitChange($event)); });
|
|
73
|
+
i0.ɵɵpipe(1, "translate");
|
|
74
|
+
i0.ɵɵelementEnd();
|
|
75
|
+
} if (rf & 2) {
|
|
76
|
+
const measure_r17 = i0.ɵɵnextContext().ngIf;
|
|
77
|
+
const ctx_r18 = i0.ɵɵnextContext();
|
|
78
|
+
i0.ɵɵproperty("measureType", ctx_r18.measureType.Length)("measureUnit", ctx_r18.measureLengthUnit.Meters)("measure", measure_r17.length)("auto", ctx_r18.measureUnitsAuto)("placeholder", i0.ɵɵpipeBind1(1, 5, ctx_r18.activeMeasureType === ctx_r18.measureType.Area ? "igo.geo.measure.perimeter" : "igo.geo.measure.length"));
|
|
79
|
+
} }
|
|
80
|
+
function MeasurerComponent_ng_container_29_igo_measurer_item_2_Template(rf, ctx) { if (rf & 1) {
|
|
81
|
+
const _r24 = i0.ɵɵgetCurrentView();
|
|
82
|
+
i0.ɵɵelementStart(0, "igo-measurer-item", 14);
|
|
83
|
+
i0.ɵɵlistener("measureUnitChange", function MeasurerComponent_ng_container_29_igo_measurer_item_2_Template_igo_measurer_item_measureUnitChange_0_listener($event) { i0.ɵɵrestoreView(_r24); const ctx_r23 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r23.onAreaUnitChange($event)); });
|
|
84
|
+
i0.ɵɵpipe(1, "translate");
|
|
85
|
+
i0.ɵɵelementEnd();
|
|
86
|
+
} if (rf & 2) {
|
|
87
|
+
const measure_r17 = i0.ɵɵnextContext().ngIf;
|
|
88
|
+
const ctx_r19 = i0.ɵɵnextContext();
|
|
89
|
+
i0.ɵɵproperty("measureType", ctx_r19.measureType.Area)("measureUnit", ctx_r19.measureAreaUnit.SquareMeters)("measure", measure_r17.area)("auto", ctx_r19.measureUnitsAuto)("placeholder", i0.ɵɵpipeBind1(1, 5, "igo.geo.measure.area"));
|
|
90
|
+
} }
|
|
91
|
+
function MeasurerComponent_ng_container_29_Template(rf, ctx) { if (rf & 1) {
|
|
92
|
+
i0.ɵɵelementContainerStart(0);
|
|
93
|
+
i0.ɵɵtemplate(1, MeasurerComponent_ng_container_29_igo_measurer_item_1_Template, 2, 7, "igo-measurer-item", 13);
|
|
94
|
+
i0.ɵɵtemplate(2, MeasurerComponent_ng_container_29_igo_measurer_item_2_Template, 2, 7, "igo-measurer-item", 13);
|
|
95
|
+
i0.ɵɵelementContainerEnd();
|
|
96
|
+
} if (rf & 2) {
|
|
97
|
+
const ctx_r6 = i0.ɵɵnextContext();
|
|
98
|
+
i0.ɵɵadvance(1);
|
|
99
|
+
i0.ɵɵproperty("ngIf", ctx_r6.activeMeasureType === ctx_r6.measureType.Length || ctx_r6.activeMeasureType === ctx_r6.measureType.Area);
|
|
100
|
+
i0.ɵɵadvance(1);
|
|
101
|
+
i0.ɵɵproperty("ngIf", ctx_r6.activeMeasureType === ctx_r6.measureType.Area);
|
|
102
|
+
} }
|
|
103
|
+
function MeasurerComponent_mat_divider_31_Template(rf, ctx) { if (rf & 1) {
|
|
104
|
+
i0.ɵɵelement(0, "mat-divider");
|
|
105
|
+
} }
|
|
106
|
+
function MeasurerComponent_button_35_Template(rf, ctx) { if (rf & 1) {
|
|
107
|
+
const _r27 = i0.ɵɵgetCurrentView();
|
|
108
|
+
i0.ɵɵelementStart(0, "button", 15);
|
|
109
|
+
i0.ɵɵlistener("click", function MeasurerComponent_button_35_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r26 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r26.onCalculateClick()); });
|
|
110
|
+
i0.ɵɵpipe(1, "translate");
|
|
111
|
+
i0.ɵɵpipe(2, "async");
|
|
112
|
+
i0.ɵɵelement(3, "mat-icon", 16);
|
|
113
|
+
i0.ɵɵelementEnd();
|
|
114
|
+
} if (rf & 2) {
|
|
115
|
+
const ctx_r8 = i0.ɵɵnextContext();
|
|
116
|
+
i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 2, "igo.geo.measure.actionbar.calculate.tooltip"))("disabled", i0.ɵɵpipeBind1(2, 4, ctx_r8.selectedFeatures$).length === 0);
|
|
117
|
+
} }
|
|
118
|
+
function MeasurerComponent_button_38_Template(rf, ctx) { if (rf & 1) {
|
|
119
|
+
const _r29 = i0.ɵɵgetCurrentView();
|
|
120
|
+
i0.ɵɵelementStart(0, "button", 17);
|
|
121
|
+
i0.ɵɵlistener("click", function MeasurerComponent_button_38_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r28 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r28.onDeleteClick()); });
|
|
122
|
+
i0.ɵɵpipe(1, "translate");
|
|
123
|
+
i0.ɵɵpipe(2, "async");
|
|
124
|
+
i0.ɵɵelement(3, "mat-icon", 18);
|
|
125
|
+
i0.ɵɵelementEnd();
|
|
126
|
+
} if (rf & 2) {
|
|
127
|
+
const ctx_r9 = i0.ɵɵnextContext();
|
|
128
|
+
i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 2, "igo.geo.measure.actionbar.delete.tooltip"))("disabled", i0.ɵɵpipeBind1(2, 4, ctx_r9.selectedFeatures$).length === 0);
|
|
129
|
+
} }
|
|
130
|
+
/**
|
|
131
|
+
* Tool to measure lengths and areas
|
|
132
|
+
*/
|
|
133
|
+
export class MeasurerComponent {
|
|
134
|
+
constructor(languageService, dialog, storageService) {
|
|
135
|
+
this.languageService = languageService;
|
|
136
|
+
this.dialog = dialog;
|
|
137
|
+
this.storageService = storageService;
|
|
138
|
+
/**
|
|
139
|
+
* Table template
|
|
140
|
+
* @internal
|
|
141
|
+
*/
|
|
142
|
+
this.tableTemplate = {
|
|
143
|
+
selection: true,
|
|
144
|
+
selectMany: true,
|
|
145
|
+
selectionCheckbox: true,
|
|
146
|
+
sort: true,
|
|
147
|
+
columns: [
|
|
148
|
+
{
|
|
149
|
+
name: 'length',
|
|
150
|
+
title: this.languageService.translate.instant('igo.geo.measure.lengthHeader'),
|
|
151
|
+
valueAccessor: (localFeature) => {
|
|
152
|
+
const unit = this.activeLengthUnit;
|
|
153
|
+
const measure = metersToUnit(localFeature.properties.measure.length, unit);
|
|
154
|
+
return formatMeasure(measure, {
|
|
155
|
+
decimal: 1,
|
|
156
|
+
unit,
|
|
157
|
+
unitAbbr: false,
|
|
158
|
+
locale: 'fr'
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
name: 'area',
|
|
164
|
+
title: this.languageService.translate.instant('igo.geo.measure.areaHeader'),
|
|
165
|
+
valueAccessor: (localFeature) => {
|
|
166
|
+
const unit = this.activeAreaUnit;
|
|
167
|
+
const measure = squareMetersToUnit(localFeature.properties.measure.area, unit);
|
|
168
|
+
return measure ? formatMeasure(measure, {
|
|
169
|
+
decimal: 1,
|
|
170
|
+
unit,
|
|
171
|
+
unitAbbr: false,
|
|
172
|
+
locale: 'fr'
|
|
173
|
+
}) : '';
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
]
|
|
177
|
+
};
|
|
178
|
+
this.subscriptions$$ = [];
|
|
179
|
+
/**
|
|
180
|
+
* Reference to the MeasureType enum
|
|
181
|
+
* @internal
|
|
182
|
+
*/
|
|
183
|
+
this.measureType = MeasureType;
|
|
184
|
+
/**
|
|
185
|
+
* Reference to the AreaMeasureUnit enum
|
|
186
|
+
* @internal
|
|
187
|
+
*/
|
|
188
|
+
this.measureAreaUnit = MeasureAreaUnit;
|
|
189
|
+
/**
|
|
190
|
+
* Reference to the LengthMeasureUnit enum
|
|
191
|
+
* @internal
|
|
192
|
+
*/
|
|
193
|
+
this.measureLengthUnit = MeasureLengthUnit;
|
|
194
|
+
/**
|
|
195
|
+
* Whether measure units should be automatically determined
|
|
196
|
+
* @internal
|
|
197
|
+
*/
|
|
198
|
+
this.measureUnitsAuto = false;
|
|
199
|
+
/**
|
|
200
|
+
* Whether display of distances of areas
|
|
201
|
+
* @internal
|
|
202
|
+
*/
|
|
203
|
+
this.displayDistance = true;
|
|
204
|
+
/**
|
|
205
|
+
* Whether display of distances of lines
|
|
206
|
+
* @internal
|
|
207
|
+
*/
|
|
208
|
+
this.displayLines = true;
|
|
209
|
+
/**
|
|
210
|
+
* Whether display of areas
|
|
211
|
+
* @internal
|
|
212
|
+
*/
|
|
213
|
+
this.displayAreas = true;
|
|
214
|
+
/**
|
|
215
|
+
* Observable of line boolean
|
|
216
|
+
* @internal
|
|
217
|
+
*/
|
|
218
|
+
this.hasLine$ = new BehaviorSubject(false);
|
|
219
|
+
/**
|
|
220
|
+
* Observable of area boolean
|
|
221
|
+
* @internal
|
|
222
|
+
*/
|
|
223
|
+
this.hasArea$ = new BehaviorSubject(false);
|
|
224
|
+
/**
|
|
225
|
+
* Observable of area
|
|
226
|
+
* @internal
|
|
227
|
+
*/
|
|
228
|
+
this.measure$ = new BehaviorSubject({});
|
|
229
|
+
/**
|
|
230
|
+
* Observable of selected features
|
|
231
|
+
* @internal
|
|
232
|
+
*/
|
|
233
|
+
this.selectedFeatures$ = new BehaviorSubject([]);
|
|
234
|
+
/**
|
|
235
|
+
* OL draw source
|
|
236
|
+
* @internal
|
|
237
|
+
*/
|
|
238
|
+
this.showTooltips = true;
|
|
239
|
+
/**
|
|
240
|
+
* Whether draw control toggle is disabled or not
|
|
241
|
+
* @internal
|
|
242
|
+
*/
|
|
243
|
+
this.drawControlIsDisabled = true;
|
|
244
|
+
/**
|
|
245
|
+
* Active mlength unit
|
|
246
|
+
*/
|
|
247
|
+
this.activeLengthUnit = MeasureLengthUnit.Meters;
|
|
248
|
+
/**
|
|
249
|
+
* Active area unit
|
|
250
|
+
*/
|
|
251
|
+
this.activeAreaUnit = MeasureAreaUnit.SquareMeters;
|
|
252
|
+
/**
|
|
253
|
+
* OL draw source
|
|
254
|
+
*/
|
|
255
|
+
this.olDrawSource = new OlVectorSource();
|
|
256
|
+
/**
|
|
257
|
+
* The minimum length a segment must have to display a tooltip.
|
|
258
|
+
* It also applies to area tooltips.
|
|
259
|
+
*/
|
|
260
|
+
this.minSegmentLength = 10;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Measure type
|
|
264
|
+
* @internal
|
|
265
|
+
*/
|
|
266
|
+
set activeMeasureType(value) { this.setActiveMeasureType(value); }
|
|
267
|
+
get activeMeasureType() { return this._activeMeasureType; }
|
|
268
|
+
/**
|
|
269
|
+
* Wheter one of the draw control is active
|
|
270
|
+
* @internal
|
|
271
|
+
*/
|
|
272
|
+
get drawControlIsActive() {
|
|
273
|
+
return this.activeDrawControl !== undefined;
|
|
274
|
+
}
|
|
275
|
+
get projection() {
|
|
276
|
+
return this.map.ol.getView().getProjection().getCode();
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Add draw controls and activate one
|
|
280
|
+
* @internal
|
|
281
|
+
*/
|
|
282
|
+
ngOnInit() {
|
|
283
|
+
this.initStore();
|
|
284
|
+
this.createDrawLineControl();
|
|
285
|
+
this.createDrawPolygonControl();
|
|
286
|
+
this.createModifyControl();
|
|
287
|
+
this.toggleDrawControl();
|
|
288
|
+
this.updateTooltipsOfOlSource(this.store.source.ol);
|
|
289
|
+
this.checkDistanceAreaToggle();
|
|
290
|
+
this.setActiveMeasureType(MeasureType.Length);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Clear the overlay layer and any interaction added by this component.
|
|
294
|
+
* @internal
|
|
295
|
+
*/
|
|
296
|
+
ngOnDestroy() {
|
|
297
|
+
this.setActiveMeasureType(undefined);
|
|
298
|
+
this.deactivateModifyControl();
|
|
299
|
+
this.freezeStore();
|
|
300
|
+
this.subscriptions$$.map(s => s.unsubscribe());
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Set the measure type
|
|
304
|
+
* @internal
|
|
305
|
+
*/
|
|
306
|
+
onMeasureTypeChange(measureType) {
|
|
307
|
+
this.activeMeasureType = measureType;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Activate or deactivate the current draw control
|
|
311
|
+
* @internal
|
|
312
|
+
*/
|
|
313
|
+
onToggleDrawControl(toggle) {
|
|
314
|
+
if (toggle === true) {
|
|
315
|
+
this.toggleDrawControl();
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
this.deactivateDrawControl();
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Activate or deactivate the current draw control
|
|
323
|
+
* @internal
|
|
324
|
+
*/
|
|
325
|
+
onToggleMeasureUnitsAuto(toggle) {
|
|
326
|
+
this.measureUnitsAuto = toggle;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Activate or deactivate the current display of distances of the areas
|
|
330
|
+
* @internal
|
|
331
|
+
*/
|
|
332
|
+
onToggleDisplayDistance(toggle) {
|
|
333
|
+
this.displayDistance = toggle;
|
|
334
|
+
this.onDisplayDistance();
|
|
335
|
+
toggle ? (this.storageService.set('distanceToggle', true, StorageScope.SESSION)) :
|
|
336
|
+
(this.storageService.set('distanceToggle', false, StorageScope.SESSION));
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Activate or deactivate the current display of distances of the lines
|
|
340
|
+
* @internal
|
|
341
|
+
*/
|
|
342
|
+
onToggleDisplayLines(toggle) {
|
|
343
|
+
this.displayLines = toggle;
|
|
344
|
+
this.onDisplayLines();
|
|
345
|
+
toggle ? (this.storageService.set('linesToggle', true, StorageScope.SESSION)) :
|
|
346
|
+
(this.storageService.set('linesToggle', false, StorageScope.SESSION));
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Activate or deactivate the current display of areas
|
|
350
|
+
* @internal
|
|
351
|
+
*/
|
|
352
|
+
onToggleDisplayAreas(toggle) {
|
|
353
|
+
this.displayAreas = toggle;
|
|
354
|
+
this.onDisplayAreas();
|
|
355
|
+
toggle ? (this.storageService.set('areasToggle', true, StorageScope.SESSION)) :
|
|
356
|
+
(this.storageService.set('areasToggle', false, StorageScope.SESSION));
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Set display parametres in current values
|
|
360
|
+
* @internal
|
|
361
|
+
*/
|
|
362
|
+
checkDistanceAreaToggle() {
|
|
363
|
+
if (this.storageService.get('distanceToggle') === false) {
|
|
364
|
+
this.displayDistance = false;
|
|
365
|
+
}
|
|
366
|
+
if (this.storageService.get('linesToggle') === false) {
|
|
367
|
+
this.displayLines = false;
|
|
368
|
+
}
|
|
369
|
+
if (this.storageService.get('areasToggle') === false) {
|
|
370
|
+
this.displayAreas = false;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Activate or deactivate the current display of distances of areas
|
|
375
|
+
* @internal
|
|
376
|
+
*/
|
|
377
|
+
onDisplayDistance() {
|
|
378
|
+
if (this.displayDistance) {
|
|
379
|
+
Array.from(document.getElementsByClassName('igo-map-tooltip-measure-polygone-segments')).map((value) => value.classList.remove('igo-map-tooltip-hidden'));
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
Array.from(document.getElementsByClassName('igo-map-tooltip-measure-polygone-segments')).map((value) => value.classList.add('igo-map-tooltip-hidden'));
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Activate or deactivate the current display of distances of lines
|
|
387
|
+
* @internal
|
|
388
|
+
*/
|
|
389
|
+
onDisplayLines() {
|
|
390
|
+
if (this.displayLines) {
|
|
391
|
+
Array.from(document.getElementsByClassName('igo-map-tooltip-measure-line-segments')).map((value) => value.classList.remove('igo-map-tooltip-hidden'));
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
Array.from(document.getElementsByClassName('igo-map-tooltip-measure-line-segments')).map((value) => value.classList.add('igo-map-tooltip-hidden'));
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Activate or deactivate the current display of areas
|
|
399
|
+
* @internal
|
|
400
|
+
*/
|
|
401
|
+
onDisplayAreas() {
|
|
402
|
+
if (this.displayAreas) {
|
|
403
|
+
Array.from(document.getElementsByClassName('igo-map-tooltip-measure-area')).map((value) => value.classList.remove('igo-map-tooltip-hidden'));
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
Array.from(document.getElementsByClassName('igo-map-tooltip-measure-area')).map((value) => value.classList.add('igo-map-tooltip-hidden'));
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Set the measure type
|
|
411
|
+
* @internal
|
|
412
|
+
*/
|
|
413
|
+
onLengthUnitChange(unit) {
|
|
414
|
+
this.activeLengthUnit = unit;
|
|
415
|
+
this.table.refresh();
|
|
416
|
+
this.updateTooltipsOfOlSource(this.store.source.ol);
|
|
417
|
+
if (this.activeOlGeometry !== undefined) {
|
|
418
|
+
this.updateTooltipsOfOlGeometry(this.activeOlGeometry);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Set the measure type
|
|
423
|
+
* @internal
|
|
424
|
+
*/
|
|
425
|
+
onAreaUnitChange(unit) {
|
|
426
|
+
this.activeAreaUnit = unit;
|
|
427
|
+
this.table.refresh();
|
|
428
|
+
this.updateTooltipsOfOlSource(this.store.source.ol);
|
|
429
|
+
if (this.activeOlGeometry !== undefined) {
|
|
430
|
+
this.updateTooltipsOfOlGeometry(this.activeOlGeometry);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
onCalculateClick() {
|
|
434
|
+
const features = this.selectedFeatures$.value;
|
|
435
|
+
const area = features.reduce((sum, localFeature) => {
|
|
436
|
+
return sum + localFeature.properties.measure.area || 0;
|
|
437
|
+
}, 0);
|
|
438
|
+
const length = features.reduce((sum, localFeature) => {
|
|
439
|
+
if (localFeature.geometry.type === 'Polygon') {
|
|
440
|
+
return sum;
|
|
441
|
+
}
|
|
442
|
+
return sum + localFeature.properties.measure.length || 0;
|
|
443
|
+
}, 0);
|
|
444
|
+
const perimeter = features.reduce((sum, localFeature) => {
|
|
445
|
+
if (localFeature.geometry.type === 'LineString') {
|
|
446
|
+
return sum;
|
|
447
|
+
}
|
|
448
|
+
return sum + localFeature.properties.measure.length || 0;
|
|
449
|
+
}, 0);
|
|
450
|
+
this.openDialog({
|
|
451
|
+
area,
|
|
452
|
+
length,
|
|
453
|
+
perimeter
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
onDeleteClick() {
|
|
457
|
+
this.store.deleteMany(this.selectedFeatures$.value);
|
|
458
|
+
this.selectedFeatures$.value.forEach(selectedFeature => {
|
|
459
|
+
this.olDrawSource.getFeatures().forEach(drawingLayerFeature => {
|
|
460
|
+
const geometry = drawingLayerFeature.getGeometry();
|
|
461
|
+
if (selectedFeature.properties.id === geometry.ol_uid) {
|
|
462
|
+
this.olDrawSource.removeFeature(drawingLayerFeature);
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
onModifyClick() {
|
|
468
|
+
if (this.selectedFeatures$.value.length !== 1) {
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
if (this.modifyControl.active === true) {
|
|
472
|
+
this.deactivateModifyControl();
|
|
473
|
+
this.toggleDrawControl();
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
const localFeature = this.selectedFeatures$.value[0];
|
|
477
|
+
const olFeatures = this.store.layer.ol.getSource().getFeatures();
|
|
478
|
+
const olFeature = olFeatures.find((_olFeature) => {
|
|
479
|
+
return _olFeature.get('id') === localFeature.properties.id;
|
|
480
|
+
});
|
|
481
|
+
if (olFeature !== undefined) {
|
|
482
|
+
this.deactivateDrawControl();
|
|
483
|
+
this.activateModifyControl();
|
|
484
|
+
const olGeometry = olFeature.getGeometry();
|
|
485
|
+
this.clearTooltipsOfOlGeometry(olGeometry);
|
|
486
|
+
this.modifyControl.setOlGeometry(olGeometry);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
openDialog(data) {
|
|
491
|
+
this.dialog.open(MeasurerDialogComponent, { data });
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Initialize the measure store and set up some listeners
|
|
495
|
+
* @internal
|
|
496
|
+
*/
|
|
497
|
+
initStore() {
|
|
498
|
+
const store = this.store;
|
|
499
|
+
const layer = new VectorLayer({
|
|
500
|
+
title: this.languageService.translate.instant('igo.geo.measure.layerTitle'),
|
|
501
|
+
isIgoInternalLayer: true,
|
|
502
|
+
id: `igo-measures-${uuid()}`,
|
|
503
|
+
zIndex: 200,
|
|
504
|
+
source: new FeatureDataSource(),
|
|
505
|
+
style: createMeasureLayerStyle(),
|
|
506
|
+
showInLayerList: true,
|
|
507
|
+
exportable: true,
|
|
508
|
+
browsable: false,
|
|
509
|
+
workspace: { enabled: false }
|
|
510
|
+
});
|
|
511
|
+
tryBindStoreLayer(store, layer);
|
|
512
|
+
store.layer.visible = true;
|
|
513
|
+
layer.visible$.subscribe(visible => {
|
|
514
|
+
if (visible) {
|
|
515
|
+
Array.from(document.getElementsByClassName('igo-map-tooltip-measure')).map((value) => value.classList.remove('igo-map-tooltip-measure-by-display'));
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
Array.from(document.getElementsByClassName('igo-map-tooltip-measure')).map((value) => value.classList.add('igo-map-tooltip-measure-by-display'));
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
tryAddLoadingStrategy(store);
|
|
522
|
+
tryAddSelectionStrategy(store, new FeatureStoreSelectionStrategy({
|
|
523
|
+
map: this.map,
|
|
524
|
+
many: true
|
|
525
|
+
}));
|
|
526
|
+
this.onFeatureAddedKey = store.source.ol.on('addfeature', (event) => {
|
|
527
|
+
const localFeature = event.feature;
|
|
528
|
+
const olGeometry = localFeature.getGeometry();
|
|
529
|
+
this.updateMeasureOfOlGeometry(olGeometry, localFeature.get('measure'));
|
|
530
|
+
this.onDisplayDistance();
|
|
531
|
+
});
|
|
532
|
+
this.onFeatureRemovedKey = store.source.ol.on('removefeature', (event) => {
|
|
533
|
+
const olGeometry = event.feature.getGeometry();
|
|
534
|
+
this.clearTooltipsOfOlGeometry(olGeometry);
|
|
535
|
+
});
|
|
536
|
+
this.selectedFeatures$$ = store.stateView.manyBy$((record) => {
|
|
537
|
+
return record.state.selected === true;
|
|
538
|
+
}).pipe(skip(1) // Skip initial emission
|
|
539
|
+
)
|
|
540
|
+
.subscribe((records) => {
|
|
541
|
+
if (this.modifyControl.active === true) {
|
|
542
|
+
this.deactivateModifyControl();
|
|
543
|
+
}
|
|
544
|
+
this.selectedFeatures$.next(records.map(record => record.entity));
|
|
545
|
+
});
|
|
546
|
+
this.subscriptions$$.push(this.store.entities$.subscribe(objectsExists => {
|
|
547
|
+
if (objectsExists.find(objectExist => objectExist.geometry.type === 'Polygon')) {
|
|
548
|
+
this.hasArea$.next(true);
|
|
549
|
+
}
|
|
550
|
+
else {
|
|
551
|
+
this.hasArea$.next(false);
|
|
552
|
+
}
|
|
553
|
+
if (objectsExists.find(objectExist => objectExist.geometry.type === 'LineString')) {
|
|
554
|
+
this.hasLine$.next(true);
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
this.hasLine$.next(false);
|
|
558
|
+
}
|
|
559
|
+
}));
|
|
560
|
+
this.subscriptions$$.push(this.store.count$.subscribe(cnt => {
|
|
561
|
+
cnt >= 1 ?
|
|
562
|
+
this.store.layer.options.showInLayerList = true :
|
|
563
|
+
this.store.layer.options.showInLayerList = false;
|
|
564
|
+
}));
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Freeze any store, meaning the layer is removed, strategies are deactivated
|
|
568
|
+
* and some listener removed
|
|
569
|
+
* @internal
|
|
570
|
+
*/
|
|
571
|
+
freezeStore() {
|
|
572
|
+
const store = this.store;
|
|
573
|
+
this.selectedFeatures$$.unsubscribe();
|
|
574
|
+
unByKey(this.onFeatureAddedKey);
|
|
575
|
+
unByKey(this.onFeatureRemovedKey);
|
|
576
|
+
store.deactivateStrategyOfType(FeatureStoreLoadingStrategy);
|
|
577
|
+
store.deactivateStrategyOfType(FeatureStoreSelectionStrategy);
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Create a draw line control
|
|
581
|
+
*/
|
|
582
|
+
createDrawLineControl() {
|
|
583
|
+
this.drawLineControl = new DrawControl({
|
|
584
|
+
geometryType: 'LineString',
|
|
585
|
+
drawingLayerSource: this.olDrawSource,
|
|
586
|
+
interactionStyle: createMeasureInteractionStyle(),
|
|
587
|
+
drawingLayerStyle: new OlStyle({})
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* Create a draw polygon control
|
|
592
|
+
*/
|
|
593
|
+
createDrawPolygonControl() {
|
|
594
|
+
this.drawPolygonControl = new DrawControl({
|
|
595
|
+
geometryType: 'Polygon',
|
|
596
|
+
drawingLayerSource: this.olDrawSource,
|
|
597
|
+
interactionStyle: createMeasureInteractionStyle(),
|
|
598
|
+
drawingLayerStyle: new OlStyle({})
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
/**
|
|
602
|
+
* Create a draw polygon control
|
|
603
|
+
*/
|
|
604
|
+
createModifyControl() {
|
|
605
|
+
this.modifyControl = new ModifyControl({
|
|
606
|
+
source: this.olDrawSource,
|
|
607
|
+
drawStyle: createMeasureInteractionStyle(),
|
|
608
|
+
layerStyle: new OlStyle({})
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Activate the right control
|
|
613
|
+
*/
|
|
614
|
+
toggleDrawControl() {
|
|
615
|
+
this.deactivateDrawControl();
|
|
616
|
+
// this.deactivateModifyControl();
|
|
617
|
+
if (this.activeMeasureType === MeasureType.Length) {
|
|
618
|
+
this.activateDrawControl(this.drawLineControl);
|
|
619
|
+
}
|
|
620
|
+
else if (this.activeMeasureType === MeasureType.Area) {
|
|
621
|
+
this.activateDrawControl(this.drawPolygonControl);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Activate a given control
|
|
626
|
+
* @param drawControl Draw control
|
|
627
|
+
*/
|
|
628
|
+
activateDrawControl(drawControl) {
|
|
629
|
+
this.drawControlIsDisabled = false;
|
|
630
|
+
this.activeDrawControl = drawControl;
|
|
631
|
+
this.drawStart$$ = drawControl.start$
|
|
632
|
+
.subscribe((olGeometry) => this.onDrawStart(olGeometry));
|
|
633
|
+
this.drawEnd$$ = drawControl.end$
|
|
634
|
+
.subscribe((olGeometry) => this.onDrawEnd(olGeometry));
|
|
635
|
+
this.drawChanges$$ = drawControl.changes$
|
|
636
|
+
.subscribe((olGeometry) => this.onDrawChanges(olGeometry));
|
|
637
|
+
this.drawChanges$$ = drawControl.abort$
|
|
638
|
+
.subscribe((olGeometry) => {
|
|
639
|
+
this.clearTooltipsOfOlGeometry(olGeometry);
|
|
640
|
+
this.clearMeasures();
|
|
641
|
+
});
|
|
642
|
+
drawControl.setOlMap(this.map.ol, false);
|
|
643
|
+
}
|
|
644
|
+
/**
|
|
645
|
+
* Deactivate the active draw control
|
|
646
|
+
*/
|
|
647
|
+
deactivateDrawControl() {
|
|
648
|
+
if (this.activeDrawControl === undefined) {
|
|
649
|
+
return;
|
|
650
|
+
}
|
|
651
|
+
this.olDrawSource.clear();
|
|
652
|
+
if (this.drawStart$$ !== undefined) {
|
|
653
|
+
this.drawStart$$.unsubscribe();
|
|
654
|
+
}
|
|
655
|
+
if (this.drawEnd$$ !== undefined) {
|
|
656
|
+
this.drawEnd$$.unsubscribe();
|
|
657
|
+
}
|
|
658
|
+
if (this.drawChanges$$ !== undefined) {
|
|
659
|
+
this.drawChanges$$.unsubscribe();
|
|
660
|
+
}
|
|
661
|
+
this.clearTooltipsOfOlSource(this.olDrawSource);
|
|
662
|
+
if (this.activeOlGeometry !== undefined) {
|
|
663
|
+
this.clearTooltipsOfOlGeometry(this.activeOlGeometry);
|
|
664
|
+
}
|
|
665
|
+
this.activeDrawControl.setOlMap(undefined);
|
|
666
|
+
this.activeDrawControl = undefined;
|
|
667
|
+
this.activeOlGeometry = undefined;
|
|
668
|
+
}
|
|
669
|
+
setActiveMeasureType(measureType) {
|
|
670
|
+
this._activeMeasureType = measureType;
|
|
671
|
+
this.clearMeasures();
|
|
672
|
+
this.toggleDrawControl();
|
|
673
|
+
}
|
|
674
|
+
/**
|
|
675
|
+
* Clear the draw source and track the geometry being drawn
|
|
676
|
+
* @param olGeometry Ol linestring or polygon
|
|
677
|
+
*/
|
|
678
|
+
onDrawStart(olGeometry) {
|
|
679
|
+
this.activeOlGeometry = olGeometry;
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* Clear the draw source and track the geometry being draw
|
|
683
|
+
* @param olGeometry Ol linestring or polygon
|
|
684
|
+
*/
|
|
685
|
+
onDrawEnd(olGeometry) {
|
|
686
|
+
this.activeOlGeometry = undefined;
|
|
687
|
+
this.finalizeMeasureOfOlGeometry(olGeometry);
|
|
688
|
+
this.addFeatureToStore(olGeometry);
|
|
689
|
+
this.clearTooltipsOfOlGeometry(olGeometry);
|
|
690
|
+
this.olDrawSource.clear(true);
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* Update measures observables and map tooltips
|
|
694
|
+
* @param olGeometry Ol linestring or polygon
|
|
695
|
+
*/
|
|
696
|
+
onDrawChanges(olGeometry) {
|
|
697
|
+
const measure = measureOlGeometry(olGeometry, this.projection);
|
|
698
|
+
this.updateMeasureOfOlGeometry(olGeometry, Object.assign({}, measure, {
|
|
699
|
+
area: undefined // We don't want to display an area tooltip while drawing.
|
|
700
|
+
}));
|
|
701
|
+
this.measure$.next(measure);
|
|
702
|
+
}
|
|
703
|
+
/**
|
|
704
|
+
* Activate a given control
|
|
705
|
+
* @param modifyControl Modify control
|
|
706
|
+
*/
|
|
707
|
+
activateModifyControl() {
|
|
708
|
+
const selection = this.store.getStrategyOfType(FeatureStoreSelectionStrategy);
|
|
709
|
+
selection.deactivate();
|
|
710
|
+
selection.clear();
|
|
711
|
+
this.modifyStart$$ = this.modifyControl.start$
|
|
712
|
+
.subscribe((olGeometry) => this.onModifyStart(olGeometry));
|
|
713
|
+
this.modifyEnd$$ = this.modifyControl.end$
|
|
714
|
+
.subscribe((olGeometry) => this.onModifyEnd(olGeometry));
|
|
715
|
+
this.modifyChanges$$ = this.modifyControl.changes$
|
|
716
|
+
.subscribe((olGeometry) => this.onModifyChanges(olGeometry));
|
|
717
|
+
this.modifyControl.setOlMap(this.map.ol);
|
|
718
|
+
}
|
|
719
|
+
/**
|
|
720
|
+
* Deactivate the active modify control
|
|
721
|
+
*/
|
|
722
|
+
deactivateModifyControl() {
|
|
723
|
+
if (this.modifyStart$$ !== undefined) {
|
|
724
|
+
this.modifyStart$$.unsubscribe();
|
|
725
|
+
}
|
|
726
|
+
if (this.modifyEnd$$ !== undefined) {
|
|
727
|
+
this.modifyEnd$$.unsubscribe();
|
|
728
|
+
}
|
|
729
|
+
if (this.modifyChanges$$ !== undefined) {
|
|
730
|
+
this.modifyChanges$$.unsubscribe();
|
|
731
|
+
}
|
|
732
|
+
if (this.activeOlGeometry !== undefined) {
|
|
733
|
+
if (this.selectedFeatures$.value.length === 1) {
|
|
734
|
+
const localFeature = this.selectedFeatures$.value[0];
|
|
735
|
+
this.addFeatureToStore(this.activeOlGeometry, localFeature);
|
|
736
|
+
}
|
|
737
|
+
this.finalizeMeasureOfOlGeometry(this.activeOlGeometry);
|
|
738
|
+
}
|
|
739
|
+
this.olDrawSource.clear();
|
|
740
|
+
this.store.activateStrategyOfType(FeatureStoreSelectionStrategy);
|
|
741
|
+
this.activeOlGeometry = undefined;
|
|
742
|
+
this.modifyControl.setOlMap(undefined);
|
|
743
|
+
}
|
|
744
|
+
/**
|
|
745
|
+
* Clear the draw source and track the geometry being drawn
|
|
746
|
+
* @param olGeometry Ol linestring or polygon
|
|
747
|
+
*/
|
|
748
|
+
onModifyStart(olGeometry) {
|
|
749
|
+
this.onDrawStart(olGeometry);
|
|
750
|
+
}
|
|
751
|
+
/**
|
|
752
|
+
* Update measures observables and map tooltips
|
|
753
|
+
* @param olGeometry Ol linestring or polygon
|
|
754
|
+
*/
|
|
755
|
+
onModifyChanges(olGeometry) {
|
|
756
|
+
this.onDrawChanges(olGeometry);
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* Clear the draw source and track the geometry being draw
|
|
760
|
+
* @param olGeometry Ol linestring or polygon
|
|
761
|
+
*/
|
|
762
|
+
onModifyEnd(olGeometry) {
|
|
763
|
+
this.finalizeMeasureOfOlGeometry(olGeometry);
|
|
764
|
+
}
|
|
765
|
+
finalizeMeasureOfOlGeometry(olGeometry) {
|
|
766
|
+
const measure = measureOlGeometry(olGeometry, this.projection);
|
|
767
|
+
this.updateMeasureOfOlGeometry(olGeometry, measure);
|
|
768
|
+
}
|
|
769
|
+
/**
|
|
770
|
+
* Update measures observables
|
|
771
|
+
* @param olGeometry Ol linestring or polygon
|
|
772
|
+
* @param measure Measure
|
|
773
|
+
*/
|
|
774
|
+
updateMeasureOfOlGeometry(olGeometry, measure) {
|
|
775
|
+
olGeometry.setProperties({ _measure: measure }, true);
|
|
776
|
+
this.updateTooltipsOfOlGeometry(olGeometry);
|
|
777
|
+
}
|
|
778
|
+
/**
|
|
779
|
+
* Clear the measures observables
|
|
780
|
+
*/
|
|
781
|
+
clearMeasures() {
|
|
782
|
+
this.measure$.next({});
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* Add a feature with measures to the store. The loading stragegy of the store
|
|
786
|
+
* will trigger and add the feature to the map.
|
|
787
|
+
* @internal
|
|
788
|
+
*/
|
|
789
|
+
addFeatureToStore(olGeometry, localFeature) {
|
|
790
|
+
const featureId = localFeature ? localFeature.properties.id : olGeometry.ol_uid;
|
|
791
|
+
const projection = this.map.ol.getView().getProjection();
|
|
792
|
+
const geometry = new OlGeoJSON().writeGeometryObject(olGeometry, {
|
|
793
|
+
featureProjection: projection,
|
|
794
|
+
dataProjection: projection
|
|
795
|
+
});
|
|
796
|
+
this.store.update({
|
|
797
|
+
type: FEATURE,
|
|
798
|
+
geometry,
|
|
799
|
+
projection: projection.getCode(),
|
|
800
|
+
properties: {
|
|
801
|
+
id: featureId,
|
|
802
|
+
measure: olGeometry.get('_measure')
|
|
803
|
+
},
|
|
804
|
+
meta: {
|
|
805
|
+
id: featureId
|
|
806
|
+
}
|
|
807
|
+
});
|
|
808
|
+
}
|
|
809
|
+
/**
|
|
810
|
+
* Update all the tooltips of an OL geometry
|
|
811
|
+
* @param olGeometry OL Geometry
|
|
812
|
+
* @param lengths Lengths of the OL geometry's segments
|
|
813
|
+
* @param measureUnit Display tooltip measure in those units
|
|
814
|
+
*/
|
|
815
|
+
updateTooltipsOfOlGeometry(olGeometry) {
|
|
816
|
+
const measure = olGeometry.get('_measure');
|
|
817
|
+
const lengths = measure.lengths;
|
|
818
|
+
const area = measure.area;
|
|
819
|
+
const olMidpointsTooltips = updateOlTooltipsAtMidpoints(olGeometry);
|
|
820
|
+
if (lengths.length === olMidpointsTooltips.length) {
|
|
821
|
+
for (let i = 0; i < olMidpointsTooltips.length; i++) {
|
|
822
|
+
const length = lengths[i];
|
|
823
|
+
if (length !== undefined) {
|
|
824
|
+
this.updateOlTooltip(olMidpointsTooltips[i], metersToUnit(length, this.activeLengthUnit), this.activeLengthUnit, MeasureType.Length);
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
if (area !== undefined) {
|
|
829
|
+
this.updateOlTooltip(updateOlTooltipAtCenter(olGeometry), squareMetersToUnit(area, this.activeAreaUnit), this.activeAreaUnit, MeasureType.Area);
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
/**
|
|
833
|
+
* Show the map tooltips of a geoemtry
|
|
834
|
+
*/
|
|
835
|
+
showTooltipsOfOlGeometry(olGeometry) {
|
|
836
|
+
getTooltipsOfOlGeometry(olGeometry).forEach((olTooltip) => {
|
|
837
|
+
if (this.shouldShowTooltip(olTooltip)) {
|
|
838
|
+
this.map.ol.addOverlay(olTooltip);
|
|
839
|
+
}
|
|
840
|
+
});
|
|
841
|
+
}
|
|
842
|
+
/**
|
|
843
|
+
* Clear the tooltips of an OL geometrys
|
|
844
|
+
* @param olGeometry OL geometry with tooltips
|
|
845
|
+
*/
|
|
846
|
+
clearTooltipsOfOlGeometry(olGeometry) {
|
|
847
|
+
getTooltipsOfOlGeometry(olGeometry).forEach((olTooltip) => {
|
|
848
|
+
if (olTooltip !== undefined && olTooltip.getMap() !== undefined) {
|
|
849
|
+
this.map.ol.removeOverlay(olTooltip);
|
|
850
|
+
}
|
|
851
|
+
});
|
|
852
|
+
}
|
|
853
|
+
/**
|
|
854
|
+
* Show the map tooltips of all the geometries of a source
|
|
855
|
+
*/
|
|
856
|
+
updateTooltipsOfOlSource(olSource) {
|
|
857
|
+
olSource.forEachFeature((olFeature) => {
|
|
858
|
+
this.updateTooltipsOfOlGeometry(olFeature.getGeometry());
|
|
859
|
+
});
|
|
860
|
+
}
|
|
861
|
+
/**
|
|
862
|
+
* Show the map tooltips of all the geometries of a source
|
|
863
|
+
*/
|
|
864
|
+
showTooltipsOfOlSource(olSource) {
|
|
865
|
+
olSource.forEachFeature((olFeature) => {
|
|
866
|
+
this.showTooltipsOfOlGeometry(olFeature.getGeometry());
|
|
867
|
+
});
|
|
868
|
+
}
|
|
869
|
+
/**
|
|
870
|
+
* Clear the map tooltips
|
|
871
|
+
* @param olDrawSource OL vector source
|
|
872
|
+
*/
|
|
873
|
+
clearTooltipsOfOlSource(olSource) {
|
|
874
|
+
olSource.forEachFeature((olFeature) => {
|
|
875
|
+
const olGeometry = olFeature.getGeometry();
|
|
876
|
+
if (olGeometry !== undefined) {
|
|
877
|
+
this.clearTooltipsOfOlGeometry(olFeature.getGeometry());
|
|
878
|
+
}
|
|
879
|
+
});
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* Update an OL tooltip properties and inner HTML and add it to the map if possible
|
|
883
|
+
* @param olTooltip OL tooltip
|
|
884
|
+
* @param measure The measure valeu ti display
|
|
885
|
+
* @param measureUnit Display tooltip measure in those units
|
|
886
|
+
*/
|
|
887
|
+
updateOlTooltip(olTooltip, measure, unit, type) {
|
|
888
|
+
olTooltip.setProperties({ _measure: measure, _unit: unit, _type: type }, true);
|
|
889
|
+
olTooltip.getElement().innerHTML = this.computeTooltipInnerHTML(olTooltip);
|
|
890
|
+
if (this.shouldShowTooltip(olTooltip)) {
|
|
891
|
+
this.map.ol.addOverlay(olTooltip);
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
/**
|
|
895
|
+
* Compute a tooltip's content
|
|
896
|
+
* @param olTooltip OL overlay
|
|
897
|
+
* @returns Inner HTML
|
|
898
|
+
*/
|
|
899
|
+
computeTooltipInnerHTML(olTooltip) {
|
|
900
|
+
const properties = olTooltip.getProperties();
|
|
901
|
+
return formatMeasure(properties._measure, {
|
|
902
|
+
decimal: 1,
|
|
903
|
+
unit: properties._unit,
|
|
904
|
+
unitAbbr: true,
|
|
905
|
+
locale: 'fr'
|
|
906
|
+
}, this.languageService);
|
|
907
|
+
}
|
|
908
|
+
/**
|
|
909
|
+
* Whether a tooltip should be showned based on the length
|
|
910
|
+
* of the segment it is bound to.
|
|
911
|
+
* @param olTooltip OL overlay
|
|
912
|
+
* @returns True if the tooltip should be shown
|
|
913
|
+
*/
|
|
914
|
+
shouldShowTooltip(olTooltip) {
|
|
915
|
+
if (this.showTooltips === false) {
|
|
916
|
+
return false;
|
|
917
|
+
}
|
|
918
|
+
const properties = olTooltip.getProperties();
|
|
919
|
+
const measure = properties._measure;
|
|
920
|
+
if (measure === undefined) {
|
|
921
|
+
return false;
|
|
922
|
+
}
|
|
923
|
+
if (properties._unit === MeasureType.Length) {
|
|
924
|
+
const minSegmentLength = metersToUnit(this.minSegmentLength, properties._unit) || 0;
|
|
925
|
+
return measure > Math.max(minSegmentLength, 0);
|
|
926
|
+
}
|
|
927
|
+
return true;
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
MeasurerComponent.ɵfac = function MeasurerComponent_Factory(t) { return new (t || MeasurerComponent)(i0.ɵɵdirectiveInject(i1.LanguageService), i0.ɵɵdirectiveInject(i2.MatDialog), i0.ɵɵdirectiveInject(i1.StorageService)); };
|
|
931
|
+
MeasurerComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MeasurerComponent, selectors: [["igo-measurer"]], viewQuery: function MeasurerComponent_Query(rf, ctx) { if (rf & 1) {
|
|
932
|
+
i0.ɵɵviewQuery(_c0, 7);
|
|
933
|
+
} if (rf & 2) {
|
|
934
|
+
let _t;
|
|
935
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.table = _t.first);
|
|
936
|
+
} }, inputs: { map: "map", store: "store", activeMeasureType: "activeMeasureType", minSegmentLength: "minSegmentLength" }, decls: 43, vars: 60, consts: [[1, "measure-type-toggle", "mat-typography"], [3, "value", "change"], [3, "value"], [1, "measure-options", "mat-typography"], [3, "disabled", "checked", "labelPosition", "change"], [4, "ngIf"], [3, "checked", "labelPosition", "change", 4, "ngIf"], [3, "checked", "labelPosition", "change"], [1, "measure-store-buttons"], ["mat-icon-button", "", "color", "accent", 3, "matTooltip", "disabled", "click", 4, "ngIf"], ["mat-icon-button", "", "color", "warn", 3, "matTooltip", "disabled", "click", 4, "ngIf"], [1, "table-compact", 3, "store", "template"], ["table", ""], [3, "measureType", "measureUnit", "measure", "auto", "placeholder", "measureUnitChange", 4, "ngIf"], [3, "measureType", "measureUnit", "measure", "auto", "placeholder", "measureUnitChange"], ["mat-icon-button", "", "color", "accent", 3, "matTooltip", "disabled", "click"], ["svgIcon", "calculator"], ["mat-icon-button", "", "color", "warn", 3, "matTooltip", "disabled", "click"], ["svgIcon", "delete"]], template: function MeasurerComponent_Template(rf, ctx) { if (rf & 1) {
|
|
937
|
+
i0.ɵɵelementStart(0, "div")(1, "div", 0)(2, "mat-button-toggle-group", 1);
|
|
938
|
+
i0.ɵɵlistener("change", function MeasurerComponent_Template_mat_button_toggle_group_change_2_listener($event) { return ctx.onMeasureTypeChange($event.value); });
|
|
939
|
+
i0.ɵɵelementStart(3, "mat-button-toggle", 2);
|
|
940
|
+
i0.ɵɵtext(4);
|
|
941
|
+
i0.ɵɵpipe(5, "translate");
|
|
942
|
+
i0.ɵɵelementEnd();
|
|
943
|
+
i0.ɵɵelementStart(6, "mat-button-toggle", 2);
|
|
944
|
+
i0.ɵɵtext(7);
|
|
945
|
+
i0.ɵɵpipe(8, "translate");
|
|
946
|
+
i0.ɵɵelementEnd()()();
|
|
947
|
+
i0.ɵɵelementStart(9, "div", 3)(10, "mat-slide-toggle", 4);
|
|
948
|
+
i0.ɵɵlistener("change", function MeasurerComponent_Template_mat_slide_toggle_change_10_listener($event) { return ctx.onToggleDrawControl($event.checked); });
|
|
949
|
+
i0.ɵɵtext(11);
|
|
950
|
+
i0.ɵɵpipe(12, "translate");
|
|
951
|
+
i0.ɵɵelementEnd();
|
|
952
|
+
i0.ɵɵtemplate(13, MeasurerComponent_mat_divider_13_Template, 1, 0, "mat-divider", 5);
|
|
953
|
+
i0.ɵɵpipe(14, "async");
|
|
954
|
+
i0.ɵɵtemplate(15, MeasurerComponent_mat_slide_toggle_15_Template, 3, 5, "mat-slide-toggle", 6);
|
|
955
|
+
i0.ɵɵpipe(16, "async");
|
|
956
|
+
i0.ɵɵtemplate(17, MeasurerComponent_mat_divider_17_Template, 1, 0, "mat-divider", 5);
|
|
957
|
+
i0.ɵɵpipe(18, "async");
|
|
958
|
+
i0.ɵɵpipe(19, "async");
|
|
959
|
+
i0.ɵɵtemplate(20, MeasurerComponent_mat_slide_toggle_20_Template, 3, 5, "mat-slide-toggle", 6);
|
|
960
|
+
i0.ɵɵpipe(21, "async");
|
|
961
|
+
i0.ɵɵtemplate(22, MeasurerComponent_mat_slide_toggle_22_Template, 3, 5, "mat-slide-toggle", 6);
|
|
962
|
+
i0.ɵɵpipe(23, "async");
|
|
963
|
+
i0.ɵɵtemplate(24, MeasurerComponent_mat_divider_24_Template, 1, 0, "mat-divider", 5);
|
|
964
|
+
i0.ɵɵpipe(25, "async");
|
|
965
|
+
i0.ɵɵelementStart(26, "mat-slide-toggle", 7);
|
|
966
|
+
i0.ɵɵlistener("change", function MeasurerComponent_Template_mat_slide_toggle_change_26_listener($event) { return ctx.onToggleMeasureUnitsAuto($event.checked); });
|
|
967
|
+
i0.ɵɵtext(27);
|
|
968
|
+
i0.ɵɵpipe(28, "translate");
|
|
969
|
+
i0.ɵɵelementEnd()();
|
|
970
|
+
i0.ɵɵtemplate(29, MeasurerComponent_ng_container_29_Template, 3, 2, "ng-container", 5);
|
|
971
|
+
i0.ɵɵpipe(30, "async");
|
|
972
|
+
i0.ɵɵtemplate(31, MeasurerComponent_mat_divider_31_Template, 1, 0, "mat-divider", 5);
|
|
973
|
+
i0.ɵɵpipe(32, "async");
|
|
974
|
+
i0.ɵɵpipe(33, "async");
|
|
975
|
+
i0.ɵɵelementStart(34, "div", 8);
|
|
976
|
+
i0.ɵɵtemplate(35, MeasurerComponent_button_35_Template, 4, 6, "button", 9);
|
|
977
|
+
i0.ɵɵpipe(36, "async");
|
|
978
|
+
i0.ɵɵpipe(37, "async");
|
|
979
|
+
i0.ɵɵtemplate(38, MeasurerComponent_button_38_Template, 4, 6, "button", 10);
|
|
980
|
+
i0.ɵɵpipe(39, "async");
|
|
981
|
+
i0.ɵɵpipe(40, "async");
|
|
982
|
+
i0.ɵɵelementEnd();
|
|
983
|
+
i0.ɵɵelement(41, "igo-entity-table", 11, 12);
|
|
984
|
+
i0.ɵɵelementEnd();
|
|
985
|
+
} if (rf & 2) {
|
|
986
|
+
i0.ɵɵadvance(2);
|
|
987
|
+
i0.ɵɵproperty("value", ctx.activeMeasureType);
|
|
988
|
+
i0.ɵɵadvance(1);
|
|
989
|
+
i0.ɵɵproperty("value", ctx.measureType.Length);
|
|
990
|
+
i0.ɵɵadvance(1);
|
|
991
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 24, "igo.geo.measure." + ctx.measureType.Length), " ");
|
|
992
|
+
i0.ɵɵadvance(2);
|
|
993
|
+
i0.ɵɵproperty("value", ctx.measureType.Area);
|
|
994
|
+
i0.ɵɵadvance(1);
|
|
995
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 26, "igo.geo.measure." + ctx.measureType.Area), " ");
|
|
996
|
+
i0.ɵɵadvance(3);
|
|
997
|
+
i0.ɵɵproperty("disabled", ctx.drawControlIsDisabled)("checked", ctx.drawControlIsActive)("labelPosition", "before");
|
|
998
|
+
i0.ɵɵadvance(1);
|
|
999
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(12, 28, "igo.geo.measure.toggleActive"), " ");
|
|
1000
|
+
i0.ɵɵadvance(2);
|
|
1001
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(14, 30, ctx.hasLine$));
|
|
1002
|
+
i0.ɵɵadvance(2);
|
|
1003
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(16, 32, ctx.hasLine$));
|
|
1004
|
+
i0.ɵɵadvance(2);
|
|
1005
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(18, 34, ctx.hasLine$) || i0.ɵɵpipeBind1(19, 36, ctx.hasArea$));
|
|
1006
|
+
i0.ɵɵadvance(3);
|
|
1007
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(21, 38, ctx.hasArea$));
|
|
1008
|
+
i0.ɵɵadvance(2);
|
|
1009
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(23, 40, ctx.hasArea$));
|
|
1010
|
+
i0.ɵɵadvance(2);
|
|
1011
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(25, 42, ctx.hasArea$));
|
|
1012
|
+
i0.ɵɵadvance(2);
|
|
1013
|
+
i0.ɵɵproperty("checked", ctx.measureUnitsAuto)("labelPosition", "before");
|
|
1014
|
+
i0.ɵɵadvance(1);
|
|
1015
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(28, 44, "igo.geo.measure.toggleAutoUnits"), " ");
|
|
1016
|
+
i0.ɵɵadvance(2);
|
|
1017
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(30, 46, ctx.measure$));
|
|
1018
|
+
i0.ɵɵadvance(2);
|
|
1019
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(32, 48, ctx.hasLine$) || i0.ɵɵpipeBind1(33, 50, ctx.hasArea$));
|
|
1020
|
+
i0.ɵɵadvance(4);
|
|
1021
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(36, 52, ctx.hasLine$) || i0.ɵɵpipeBind1(37, 54, ctx.hasArea$));
|
|
1022
|
+
i0.ɵɵadvance(3);
|
|
1023
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(39, 56, ctx.hasLine$) || i0.ɵɵpipeBind1(40, 58, ctx.hasArea$));
|
|
1024
|
+
i0.ɵɵadvance(3);
|
|
1025
|
+
i0.ɵɵproperty("store", ctx.store)("template", ctx.tableTemplate);
|
|
1026
|
+
} }, styles: [".measure-type-toggle[_ngcontent-%COMP%]{padding:10px;text-align:center}.measure-type-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{width:100%}.measure-type-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] mat-button-toggle[_ngcontent-%COMP%]{width:50%}.measure-options[_ngcontent-%COMP%]{overflow-x:hidden}.measure-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%]{width:100%;margin:10px}.measure-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%] .mat-slide-toggle-content{width:calc(100% - 60px)}.measure-store-buttons[_ngcontent-%COMP%]{margin-left:-2px}.measure-store-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:first-of-type{margin-left:14px}.table-compact[_ngcontent-%COMP%] .mat-header-cell.mat-column-selectionCheckbox{width:52px}"], changeDetection: 0 });
|
|
1027
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MeasurerComponent, [{
|
|
1028
|
+
type: Component,
|
|
1029
|
+
args: [{ selector: 'igo-measurer', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n <div class=\"measure-type-toggle mat-typography\">\n <mat-button-toggle-group\n [value]=\"activeMeasureType\"\n (change)=\"onMeasureTypeChange($event.value)\">\n <mat-button-toggle [value]=\"measureType.Length\">\n {{('igo.geo.measure.' + measureType.Length) | translate}}\n </mat-button-toggle>\n <mat-button-toggle [value]=\"measureType.Area\">\n {{('igo.geo.measure.' + measureType.Area) | translate}}\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <div class=\"measure-options mat-typography\">\n <mat-slide-toggle\n [disabled]=\"drawControlIsDisabled\"\n [checked]=\"drawControlIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDrawControl($event.checked)\">\n {{'igo.geo.measure.toggleActive' | translate}}\n </mat-slide-toggle>\n\n <mat-divider *ngIf=\"(hasLine$ | async)\"></mat-divider>\n\n <mat-slide-toggle *ngIf=\"(hasLine$ | async)\"\n [checked]=\"displayLines\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDisplayLines($event.checked)\">\n {{'igo.geo.measure.toggleDisplayLines' | translate}}\n </mat-slide-toggle>\n\n <mat-divider *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"></mat-divider>\n\n <mat-slide-toggle *ngIf=\"(hasArea$ | async)\"\n [checked]=\"displayDistance\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDisplayDistance($event.checked)\">\n {{'igo.geo.measure.toggleDisplayDistance' | translate}}\n </mat-slide-toggle>\n\n <mat-slide-toggle *ngIf=\"(hasArea$ | async)\"\n [checked]=\"displayAreas\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDisplayAreas($event.checked)\">\n {{'igo.geo.measure.toggleDisplayAreas' | translate}}\n </mat-slide-toggle>\n\n <mat-divider *ngIf=\"(hasArea$ | async)\"></mat-divider>\n\n <mat-slide-toggle\n [checked]=\"measureUnitsAuto\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleMeasureUnitsAuto($event.checked)\">\n {{'igo.geo.measure.toggleAutoUnits' | translate}}\n </mat-slide-toggle>\n </div>\n\n <ng-container *ngIf=\"measure$ | async as measure\">\n <igo-measurer-item *ngIf=\"activeMeasureType === measureType.Length || activeMeasureType === measureType.Area\"\n [measureType]=\"measureType.Length\"\n [measureUnit]=\"measureLengthUnit.Meters\"\n [measure]=\"measure.length\"\n [auto]=\"measureUnitsAuto\"\n [placeholder]=\"(activeMeasureType === measureType.Area ? 'igo.geo.measure.perimeter' : 'igo.geo.measure.length') | translate\"\n (measureUnitChange)=\"onLengthUnitChange($event)\">\n </igo-measurer-item>\n\n <igo-measurer-item *ngIf=\"activeMeasureType === measureType.Area\"\n [measureType]=\"measureType.Area\"\n [measureUnit]=\"measureAreaUnit.SquareMeters\"\n [measure]=\"measure.area\"\n [auto]=\"measureUnitsAuto\"\n [placeholder]=\"'igo.geo.measure.area' | translate\"\n (measureUnitChange)=\"onAreaUnitChange($event)\">\n </igo-measurer-item>\n </ng-container>\n\n <mat-divider *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"></mat-divider>\n\n <div class=\"measure-store-buttons\">\n <button *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"\n mat-icon-button\n [matTooltip]=\"'igo.geo.measure.actionbar.calculate.tooltip' | translate\"\n [disabled]=\"(selectedFeatures$ | async).length === 0\"\n color=\"accent\"\n (click)=\"onCalculateClick()\">\n <mat-icon svgIcon=\"calculator\"></mat-icon>\n </button>\n\n <button *ngIf=\"(hasLine$ | async) || (hasArea$ | async)\"\n mat-icon-button\n [matTooltip]=\"'igo.geo.measure.actionbar.delete.tooltip' | translate\"\n [disabled]=\"(selectedFeatures$ | async).length === 0\"\n color=\"warn\"\n (click)=\"onDeleteClick()\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n\n <!--button\n mat-icon-button\n [matTooltip]=\"'igo.geo.measure.actionbar.modify.tooltip' | translate\"\n [disabled]=\"(selectedFeatures$ | async).length !== 1\"\n (click)=\"onModifyClick()\">\n <mat-icon svgIcon=\"edit\"></mat-icon>\n </button-->\n </div>\n\n <igo-entity-table\n #table\n class=\"table-compact\"\n [store]=\"store\"\n [template]=\"tableTemplate\">\n </igo-entity-table>\n</div>\n", styles: [".measure-type-toggle{padding:10px;text-align:center}.measure-type-toggle mat-button-toggle-group{width:100%}.measure-type-toggle mat-button-toggle-group mat-button-toggle{width:50%}.measure-options{overflow-x:hidden}.measure-options mat-slide-toggle{width:100%;margin:10px}.measure-options mat-slide-toggle ::ng-deep .mat-slide-toggle-content{width:calc(100% - 60px)}.measure-store-buttons{margin-left:-2px}.measure-store-buttons button:first-of-type{margin-left:14px}.table-compact ::ng-deep .mat-header-cell.mat-column-selectionCheckbox{width:52px}\n"] }]
|
|
1030
|
+
}], function () { return [{ type: i1.LanguageService }, { type: i2.MatDialog }, { type: i1.StorageService }]; }, { map: [{
|
|
1031
|
+
type: Input
|
|
1032
|
+
}], store: [{
|
|
1033
|
+
type: Input
|
|
1034
|
+
}], activeMeasureType: [{
|
|
1035
|
+
type: Input
|
|
1036
|
+
}], minSegmentLength: [{
|
|
1037
|
+
type: Input
|
|
1038
|
+
}], table: [{
|
|
1039
|
+
type: ViewChild,
|
|
1040
|
+
args: ['table', { static: true }]
|
|
1041
|
+
}] }); })();
|
|
1042
1042
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhc3VyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvbWVhc3VyZS9tZWFzdXJlci9tZWFzdXJlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9tZWFzdXJlL21lYXN1cmVyL21lYXN1cmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUdMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRDLE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sU0FBUyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sY0FBYyxNQUFNLGtCQUFrQixDQUFDO0FBTzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEMsT0FBTyxFQUFtQixZQUFZLEVBQWtCLE1BQU0sWUFBWSxDQUFDO0FBRzNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbkMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxFQUNMLE9BQU8sRUFFUCwyQkFBMkIsRUFDM0IsNkJBQTZCLEVBQzdCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUkxQyxPQUFPLEVBQ0ws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QjtRQU83QixlQUF3QjtRQUF4QiwyREFBd0I7UUFHcEMsZUFBNEI7UUFBNUIsOENBQTRCLDJCQUFBO1FBRzVCLGVBQ0Y7UUFERSwwRkFDRjtRQUdhLGVBQXVCO1FBQXZCLDJEQUF1QjtRQW9CeEIsZUFBOEM7UUFBOUMsbUdBQThDO1FBR2pELGVBQThDO1FBQTlDLG1HQUE4QztRQVM5QyxlQUE4QztRQUE5QyxtR0FBOEM7UUFxQnZELGVBQWU7UUFBZixpQ0FBZSwrQkFBQTs7dUZEeENOLGlCQUFpQjtjQU43QixTQUFTOzJCQUNFLGNBQWMsbUJBR1AsdUJBQXVCLENBQUMsTUFBTTt1SEFzTnRDLEdBQUc7a0JBQVgsS0FBSztZQUtHLEtBQUs7a0JBQWIsS0FBSztZQU9GLGlCQUFpQjtrQkFEcEIsS0FBSztZQVNHLGdCQUFnQjtrQkFBeEIsS0FBSztZQUVnQyxLQUFLO2tCQUExQyxTQUFTO21CQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBza2lwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgT2xTdHlsZSBmcm9tICdvbC9zdHlsZS9TdHlsZSc7XG5pbXBvcnQgT2xHZW9KU09OIGZyb20gJ29sL2Zvcm1hdC9HZW9KU09OJztcbmltcG9ydCBPbFZlY3RvclNvdXJjZSBmcm9tICdvbC9zb3VyY2UvVmVjdG9yJztcbmltcG9ydCB7IFZlY3RvclNvdXJjZUV2ZW50IGFzIE9sVmVjdG9yU291cmNlRXZlbnQgfSBmcm9tICdvbC9zb3VyY2UvVmVjdG9yJztcbmltcG9ydCBPbExpbmVTdHJpbmcgZnJvbSAnb2wvZ2VvbS9MaW5lU3RyaW5nJztcbmltcG9ydCBPbFBvbHlnb24gZnJvbSAnb2wvZ2VvbS9Qb2x5Z29uJztcbmltcG9ydCBPbEZlYXR1cmUgZnJvbSAnb2wvRmVhdHVyZSc7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuaW1wb3J0IE9sT3ZlcmxheSBmcm9tICdvbC9PdmVybGF5JztcbmltcG9ydCB7IHVuQnlLZXkgfSBmcm9tICdvbC9PYnNlcnZhYmxlJztcblxuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlLCBTdG9yYWdlU2NvcGUsIFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZSc7XG5pbXBvcnQgeyBFbnRpdHlSZWNvcmQsIEVudGl0eVRhYmxlVGVtcGxhdGUgfSBmcm9tICdAaWdvMi9jb21tb24nO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlUYWJsZUNvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbic7XG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnQGlnbzIvdXRpbHMnO1xuXG5pbXBvcnQgeyBGZWF0dXJlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGFzb3VyY2UnO1xuaW1wb3J0IHtcbiAgRkVBVFVSRSxcbiAgRmVhdHVyZVN0b3JlLFxuICBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3ksXG4gIEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5LFxuICB0cnlCaW5kU3RvcmVMYXllcixcbiAgdHJ5QWRkTG9hZGluZ1N0cmF0ZWd5LFxuICB0cnlBZGRTZWxlY3Rpb25TdHJhdGVneVxufSBmcm9tICcuLi8uLi9mZWF0dXJlJztcbmltcG9ydCB7IERyYXdDb250cm9sLCBNb2RpZnlDb250cm9sIH0gZnJvbSAnLi4vLi4vZ2VvbWV0cnkvc2hhcmVkJztcbmltcG9ydCB7IFZlY3RvckxheWVyIH0gZnJvbSAnLi4vLi4vbGF5ZXInO1xuaW1wb3J0IHsgSWdvTWFwIH0gZnJvbSAnLi4vLi4vbWFwJztcblxuaW1wb3J0IHsgTWVhc3VyZSwgTWVhc3VyZXJEaWFsb2dEYXRhLCBGZWF0dXJlV2l0aE1lYXN1cmUgfSBmcm9tICcuLi9zaGFyZWQvbWVhc3VyZS5pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIE1lYXN1cmVUeXBlLFxuICBNZWFzdXJlQXJlYVVuaXQsXG4gIE1lYXN1cmVMZW5ndGhVbml0LFxufSBmcm9tICcuLi9zaGFyZWQvbWVhc3VyZS5lbnVtJztcbmltcG9ydCB7XG4gIG1lYXN1cmVPbEdlb21ldHJ5LFxuICBjcmVhdGVNZWFzdXJlSW50ZXJhY3Rpb25TdHlsZSxcbiAgY3JlYXRlTWVhc3VyZUxheWVyU3R5bGUsXG4gIHVwZGF0ZU9sVG9vbHRpcHNBdE1pZHBvaW50cyxcbiAgdXBkYXRlT2xUb29sdGlwQXRDZW50ZXIsXG4gIGdldFRvb2x0aXBzT2ZPbEdlb21ldHJ5LFxuICBzcXVhcmVNZXRlcnNUb1VuaXQsXG4gIG1ldGVyc1RvVW5pdCxcbiAgZm9ybWF0TWVhc3VyZVxufSBmcm9tICcuLi9zaGFyZWQvbWVhc3VyZS51dGlscyc7XG5pbXBvcnQgeyBNZWFzdXJlckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vbWVhc3VyZXItZGlhbG9nLmNvbXBvbmVudCc7XG5cbi8qKlxuICogVG9vbCB0byBtZWFzdXJlIGxlbmd0aHMgYW5kIGFyZWFzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lnby1tZWFzdXJlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZWFzdXJlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21lYXN1cmVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1lYXN1cmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBUYWJsZSB0ZW1wbGF0ZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyB0YWJsZVRlbXBsYXRlOiBFbnRpdHlUYWJsZVRlbXBsYXRlID0ge1xuICAgIHNlbGVjdGlvbjogdHJ1ZSxcbiAgICBzZWxlY3RNYW55OiB0cnVlLFxuICAgIHNlbGVjdGlvbkNoZWNrYm94OiB0cnVlLFxuICAgIHNvcnQ6IHRydWUsXG4gICAgY29sdW1uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnbGVuZ3RoJyxcbiAgICAgICAgdGl0bGU6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLm1lYXN1cmUubGVuZ3RoSGVhZGVyJyksXG4gICAgICAgIHZhbHVlQWNjZXNzb3I6IChsb2NhbEZlYXR1cmU6IEZlYXR1cmVXaXRoTWVhc3VyZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVuaXQgPSB0aGlzLmFjdGl2ZUxlbmd0aFVuaXQ7XG4gICAgICAgICAgY29uc3QgbWVhc3VyZSA9IG1ldGVyc1RvVW5pdChsb2NhbEZlYXR1cmUucHJvcGVydGllcy5tZWFzdXJlLmxlbmd0aCwgdW5pdCk7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdE1lYXN1cmUobWVhc3VyZSwge1xuICAgICAgICAgICAgZGVjaW1hbDogMSxcbiAgICAgICAgICAgIHVuaXQsXG4gICAgICAgICAgICB1bml0QWJicjogZmFsc2UsXG4gICAgICAgICAgICBsb2NhbGU6ICdmcidcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2FyZWEnLFxuICAgICAgICB0aXRsZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8ubWVhc3VyZS5hcmVhSGVhZGVyJyksXG4gICAgICAgIHZhbHVlQWNjZXNzb3I6IChsb2NhbEZlYXR1cmU6IEZlYXR1cmVXaXRoTWVhc3VyZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVuaXQgPSB0aGlzLmFjdGl2ZUFyZWFVbml0O1xuICAgICAgICAgIGNvbnN0IG1lYXN1cmUgPSBzcXVhcmVNZXRlcnNUb1VuaXQobG9jYWxGZWF0dXJlLnByb3BlcnRpZXMubWVhc3VyZS5hcmVhLCB1bml0KTtcbiAgICAgICAgICByZXR1cm4gbWVhc3VyZSA/IGZvcm1hdE1lYXN1cmUobWVhc3VyZSwge1xuICAgICAgICAgICAgZGVjaW1hbDogMSxcbiAgICAgICAgICAgIHVuaXQsXG4gICAgICAgICAgICB1bml0QWJicjogZmFsc2UsXG4gICAgICAgICAgICBsb2NhbGU6ICdmcidcbiAgICAgICAgICB9KSA6ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9O1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyQkOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIE1lYXN1cmVUeXBlIGVudW1cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgbWVhc3VyZVR5cGUgPSBNZWFzdXJlVHlwZTtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBBcmVhTWVhc3VyZVVuaXQgZW51bVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBtZWFzdXJlQXJlYVVuaXQgPSBNZWFzdXJlQXJlYVVuaXQ7XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgTGVuZ3RoTWVhc3VyZVVuaXQgZW51bVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBtZWFzdXJlTGVuZ3RoVW5pdCA9IE1lYXN1cmVMZW5ndGhVbml0O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG1lYXN1cmUgdW5pdHMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBtZWFzdXJlVW5pdHNBdXRvOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZGlzcGxheSBvZiBkaXN0YW5jZXMgb2YgYXJlYXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZGlzcGxheURpc3RhbmNlOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogV2hldGhlciBkaXNwbGF5IG9mIGRpc3RhbmNlcyBvZiBsaW5lc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBkaXNwbGF5TGluZXM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGRpc3BsYXkgb2YgYXJlYXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZGlzcGxheUFyZWFzOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBvZiBsaW5lIGJvb2xlYW5cbiAgICogQGludGVybmFsXG4gICAqL1xuICAgcHVibGljIGhhc0xpbmUkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBvZiBhcmVhIGJvb2xlYW5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgaGFzQXJlYSQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIGFyZWFcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgbWVhc3VyZSQ6IEJlaGF2aW9yU3ViamVjdDxNZWFzdXJlPiA9IG5ldyBCZWhhdmlvclN1YmplY3Qoe30pO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIHNlbGVjdGVkIGZlYXR1cmVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHNlbGVjdGVkRmVhdHVyZXMkOiBCZWhhdmlvclN1YmplY3Q8RmVhdHVyZVdpdGhNZWFzdXJlW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG5cbiAgLyoqXG4gICAqIE9MIGRyYXcgc291cmNlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHNob3dUb29sdGlwczogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZHJhdyBjb250cm9sIHRvZ2dsZSBpcyBkaXNhYmxlZCBvciBub3RcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZHJhd0NvbnRyb2xJc0Rpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogRHJhdyBsaW5lIGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgZHJhd0xpbmVDb250cm9sOiBEcmF3Q29udHJvbDtcblxuICAvKipcbiAgICogRHJhdyBwb2x5Z29uIGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgZHJhd1BvbHlnb25Db250cm9sOiBEcmF3Q29udHJvbDtcblxuICAvKipcbiAgICogTW9kaWZ5IGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgbW9kaWZ5Q29udHJvbDogTW9kaWZ5Q29udHJvbDtcblxuICAvKipcbiAgICogQWN0aXZlIE9MIGdlb21ldHJ5XG4gICAqL1xuICBwcml2YXRlIGFjdGl2ZU9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbjtcblxuICAvKipcbiAgICogQWN0aXZlIG1sZW5ndGggdW5pdFxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVMZW5ndGhVbml0OiBNZWFzdXJlTGVuZ3RoVW5pdCA9IE1lYXN1cmVMZW5ndGhVbml0Lk1ldGVycztcblxuICAvKipcbiAgICogQWN0aXZlIGFyZWEgdW5pdFxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVBcmVhVW5pdDogTWVhc3VyZUFyZWFVbml0ID0gTWVhc3VyZUFyZWFVbml0LlNxdWFyZU1ldGVycztcblxuICAvKipcbiAgICogRmVhdHVyZSBhZGRlZCBsaXN0ZW5lciBrZXlcbiAgICovXG4gIHByaXZhdGUgb25GZWF0dXJlQWRkZWRLZXk7XG5cbiAgLyoqXG4gICAqIEZlYXR1cmUgcmVtb3ZlZCBsaXN0ZW5lciBrZXlcbiAgICovXG4gIHByaXZhdGUgb25GZWF0dXJlUmVtb3ZlZEtleTtcblxuICAvKipcbiAgICogQWN0aXZlIGRyYXcgY29udHJvbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgYWN0aXZlRHJhd0NvbnRyb2w6IERyYXdDb250cm9sO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gZHJhdyBzdGFydFxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3U3RhcnQkJDogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gZHJhdyBlbmRcbiAgICovXG4gIHByaXZhdGUgZHJhd0VuZCQkOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbiB0byBjb250cm9scyBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIGRyYXdDaGFuZ2VzJCQ6IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogU3Vic2NyaXB0aW9uIHRvIG1vZGlmeSBzdGFydFxuICAgKi9cbiAgcHJpdmF0ZSBtb2RpZnlTdGFydCQkOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbiB0byBtb2RpZnkgZW5kXG4gICAqL1xuICBwcml2YXRlIG1vZGlmeUVuZCQkOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbiB0byBjb250cm9scyBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIG1vZGlmeUNoYW5nZXMkJDogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gbWVhc3VyZXMgc2VsZWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHNlbGVjdGVkRmVhdHVyZXMkJDogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBPTCBkcmF3IHNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSBvbERyYXdTb3VyY2UgPSBuZXcgT2xWZWN0b3JTb3VyY2UoKTtcblxuICAvKipcbiAgICogVGhlIG1hcCB0byBtZWFzdXJlIG9uXG4gICAqL1xuICBASW5wdXQoKSBtYXA6IElnb01hcDtcblxuICAvKipcbiAgICogVGhlIG1lYXN1cmVzIHN0b3JlXG4gICAqL1xuICBASW5wdXQoKSBzdG9yZTogRmVhdHVyZVN0b3JlPEZlYXR1cmVXaXRoTWVhc3VyZT47XG5cbiAgLyoqXG4gICAqIE1lYXN1cmUgdHlwZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBhY3RpdmVNZWFzdXJlVHlwZSh2YWx1ZTogTWVhc3VyZVR5cGUpIHsgdGhpcy5zZXRBY3RpdmVNZWFzdXJlVHlwZSh2YWx1ZSk7IH1cbiAgZ2V0IGFjdGl2ZU1lYXN1cmVUeXBlKCk6IE1lYXN1cmVUeXBlIHsgcmV0dXJuIHRoaXMuX2FjdGl2ZU1lYXN1cmVUeXBlOyB9XG4gIHByaXZhdGUgX2FjdGl2ZU1lYXN1cmVUeXBlOiBNZWFzdXJlVHlwZTtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gbGVuZ3RoIGEgc2VnbWVudCBtdXN0IGhhdmUgdG8gZGlzcGxheSBhIHRvb2x0aXAuXG4gICAqIEl0IGFsc28gYXBwbGllcyB0byBhcmVhIHRvb2x0aXBzLlxuICAgKi9cbiAgQElucHV0KCkgbWluU2VnbWVudExlbmd0aDogbnVtYmVyID0gMTA7XG5cbiAgQFZpZXdDaGlsZCgndGFibGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSB0YWJsZTogRW50aXR5VGFibGVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRlciBvbmUgb2YgdGhlIGRyYXcgY29udHJvbCBpcyBhY3RpdmVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXQgZHJhd0NvbnRyb2xJc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVEcmF3Q29udHJvbCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0IHByb2plY3Rpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tYXAub2wuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKS5nZXRDb2RlKCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBBZGQgZHJhdyBjb250cm9scyBhbmQgYWN0aXZhdGUgb25lXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0U3RvcmUoKTtcbiAgICB0aGlzLmNyZWF0ZURyYXdMaW5lQ29udHJvbCgpO1xuICAgIHRoaXMuY3JlYXRlRHJhd1BvbHlnb25Db250cm9sKCk7XG4gICAgdGhpcy5jcmVhdGVNb2RpZnlDb250cm9sKCk7XG4gICAgdGhpcy50b2dnbGVEcmF3Q29udHJvbCgpO1xuICAgIHRoaXMudXBkYXRlVG9vbHRpcHNPZk9sU291cmNlKHRoaXMuc3RvcmUuc291cmNlLm9sKTtcbiAgICB0aGlzLmNoZWNrRGlzdGFuY2VBcmVhVG9nZ2xlKCk7XG4gICAgdGhpcy5zZXRBY3RpdmVNZWFzdXJlVHlwZShNZWFzdXJlVHlwZS5MZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBvdmVybGF5IGxheWVyIGFuZCBhbnkgaW50ZXJhY3Rpb24gYWRkZWQgYnkgdGhpcyBjb21wb25lbnQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zZXRBY3RpdmVNZWFzdXJlVHlwZSh1bmRlZmluZWQpO1xuICAgIHRoaXMuZGVhY3RpdmF0ZU1vZGlmeUNvbnRyb2woKTtcbiAgICB0aGlzLmZyZWV6ZVN0b3JlKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zJCQubWFwKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG1lYXN1cmUgdHlwZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uTWVhc3VyZVR5cGVDaGFuZ2UobWVhc3VyZVR5cGU6IE1lYXN1cmVUeXBlKSB7XG4gICAgdGhpcy5hY3RpdmVNZWFzdXJlVHlwZSA9IG1lYXN1cmVUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIG9yIGRlYWN0aXZhdGUgdGhlIGN1cnJlbnQgZHJhdyBjb250cm9sXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb25Ub2dnbGVEcmF3Q29udHJvbCh0b2dnbGU6IGJvb2xlYW4pIHtcbiAgICBpZiAodG9nZ2xlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnRvZ2dsZURyYXdDb250cm9sKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyYXdDb250cm9sKCk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSB0aGUgY3VycmVudCBkcmF3IGNvbnRyb2xcbiAgICogQGludGVybmFsXG4gICAqL1xuICAgb25Ub2dnbGVNZWFzdXJlVW5pdHNBdXRvKHRvZ2dsZTogYm9vbGVhbikge1xuICAgIHRoaXMubWVhc3VyZVVuaXRzQXV0byA9IHRvZ2dsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBvciBkZWFjdGl2YXRlIHRoZSBjdXJyZW50IGRpc3BsYXkgb2YgZGlzdGFuY2VzIG9mIHRoZSBhcmVhc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uVG9nZ2xlRGlzcGxheURpc3RhbmNlKHRvZ2dsZTogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzcGxheURpc3RhbmNlID0gdG9nZ2xlO1xuICAgIHRoaXMub25EaXNwbGF5RGlzdGFuY2UoKTtcbiAgICB0b2dnbGUgPyAodGhpcy5zdG9yYWdlU2VydmljZS5zZXQoJ2Rpc3RhbmNlVG9nZ2xlJywgdHJ1ZSwgU3RvcmFnZVNjb3BlLlNFU1NJT04pKSA6XG4gICAgICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCgnZGlzdGFuY2VUb2dnbGUnLCBmYWxzZSwgU3RvcmFnZVNjb3BlLlNFU1NJT04pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBvciBkZWFjdGl2YXRlIHRoZSBjdXJyZW50IGRpc3BsYXkgb2YgZGlzdGFuY2VzIG9mIHRoZSBsaW5lc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uVG9nZ2xlRGlzcGxheUxpbmVzKHRvZ2dsZTogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzcGxheUxpbmVzID0gdG9nZ2xlO1xuICAgIHRoaXMub25EaXNwbGF5TGluZXMoKTtcbiAgICB0b2dnbGUgPyAodGhpcy5zdG9yYWdlU2VydmljZS5zZXQoJ2xpbmVzVG9nZ2xlJywgdHJ1ZSwgU3RvcmFnZVNjb3BlLlNFU1NJT04pKSA6XG4gICAgICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCgnbGluZXNUb2dnbGUnLCBmYWxzZSwgU3RvcmFnZVNjb3BlLlNFU1NJT04pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBvciBkZWFjdGl2YXRlIHRoZSBjdXJyZW50IGRpc3BsYXkgb2YgYXJlYXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvblRvZ2dsZURpc3BsYXlBcmVhcyh0b2dnbGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc3BsYXlBcmVhcyA9IHRvZ2dsZTtcbiAgICB0aGlzLm9uRGlzcGxheUFyZWFzKCk7XG4gICAgdG9nZ2xlID8gKHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KCdhcmVhc1RvZ2dsZScsIHRydWUsIFN0b3JhZ2VTY29wZS5TRVNTSU9OKSkgOlxuICAgICAodGhpcy5zdG9yYWdlU2VydmljZS5zZXQoJ2FyZWFzVG9nZ2xlJywgZmFsc2UsIFN0b3JhZ2VTY29wZS5TRVNTSU9OKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRpc3BsYXkgcGFyYW1ldHJlcyBpbiBjdXJyZW50IHZhbHVlc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNoZWNrRGlzdGFuY2VBcmVhVG9nZ2xlKCl7XG4gICAgaWYgKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KCdkaXN0YW5jZVRvZ2dsZScpID09PSBmYWxzZSl7XG4gICAgICB0aGlzLmRpc3BsYXlEaXN0YW5jZSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdG9yYWdlU2VydmljZS5nZXQoJ2xpbmVzVG9nZ2xlJykgPT09IGZhbHNlKXtcbiAgICAgIHRoaXMuZGlzcGxheUxpbmVzID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgnYXJlYXNUb2dnbGUnKSA9PT0gZmFsc2Upe1xuICAgICAgdGhpcy5kaXNwbGF5QXJlYXMgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSB0aGUgY3VycmVudCBkaXNwbGF5IG9mIGRpc3RhbmNlcyBvZiBhcmVhc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uRGlzcGxheURpc3RhbmNlKCkge1xuICAgIGlmICh0aGlzLmRpc3BsYXlEaXN0YW5jZSkge1xuICAgICAgQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpZ28tbWFwLXRvb2x0aXAtbWVhc3VyZS1wb2x5Z29uZS1zZWdtZW50cycpKS5tYXAoKHZhbHVlOiBFbGVtZW50KSA9PlxuICAgICAgICB2YWx1ZS5jbGFzc0xpc3QucmVtb3ZlKCdpZ28tbWFwLXRvb2x0aXAtaGlkZGVuJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lnby1tYXAtdG9vbHRpcC1tZWFzdXJlLXBvbHlnb25lLXNlZ21lbnRzJykpLm1hcCgodmFsdWU6IEVsZW1lbnQpID0+XG4gICAgICAgIHZhbHVlLmNsYXNzTGlzdC5hZGQoJ2lnby1tYXAtdG9vbHRpcC1oaWRkZW4nKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIG9yIGRlYWN0aXZhdGUgdGhlIGN1cnJlbnQgZGlzcGxheSBvZiBkaXN0YW5jZXMgb2YgbGluZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvbkRpc3BsYXlMaW5lcygpIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5TGluZXMpIHtcbiAgICAgIEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaWdvLW1hcC10b29sdGlwLW1lYXN1cmUtbGluZS1zZWdtZW50cycpKS5tYXAoKHZhbHVlOiBFbGVtZW50KSA9PlxuICAgICAgICB2YWx1ZS5jbGFzc0xpc3QucmVtb3ZlKCdpZ28tbWFwLXRvb2x0aXAtaGlkZGVuJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lnby1tYXAtdG9vbHRpcC1tZWFzdXJlLWxpbmUtc2VnbWVudHMnKSkubWFwKCh2YWx1ZTogRWxlbWVudCkgPT5cbiAgICAgICAgdmFsdWUuY2xhc3NMaXN0LmFkZCgnaWdvLW1hcC10b29sdGlwLWhpZGRlbicpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSB0aGUgY3VycmVudCBkaXNwbGF5IG9mIGFyZWFzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb25EaXNwbGF5QXJlYXMoKSB7XG4gICAgaWYgKHRoaXMuZGlzcGxheUFyZWFzKSB7XG4gICAgICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lnby1tYXAtdG9vbHRpcC1tZWFzdXJlLWFyZWEnKSkubWFwKCh2YWx1ZTogRWxlbWVudCkgPT5cbiAgICAgICAgdmFsdWUuY2xhc3NMaXN0LnJlbW92ZSgnaWdvLW1hcC10b29sdGlwLWhpZGRlbicpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpZ28tbWFwLXRvb2x0aXAtbWVhc3VyZS1hcmVhJykpLm1hcCgodmFsdWU6IEVsZW1lbnQpID0+XG4gICAgICAgIHZhbHVlLmNsYXNzTGlzdC5hZGQoJ2lnby1tYXAtdG9vbHRpcC1oaWRkZW4nKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbWVhc3VyZSB0eXBlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb25MZW5ndGhVbml0Q2hhbmdlKHVuaXQ6IE1lYXN1cmVMZW5ndGhVbml0KSB7XG4gICAgdGhpcy5hY3RpdmVMZW5ndGhVbml0ID0gdW5pdDtcbiAgICB0aGlzLnRhYmxlLnJlZnJlc2goKTtcbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBzT2ZPbFNvdXJjZSh0aGlzLnN0b3JlLnNvdXJjZS5vbCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlT2xHZW9tZXRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBzT2ZPbEdlb21ldHJ5KHRoaXMuYWN0aXZlT2xHZW9tZXRyeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbWVhc3VyZSB0eXBlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb25BcmVhVW5pdENoYW5nZSh1bml0OiBNZWFzdXJlQXJlYVVuaXQpIHtcbiAgICB0aGlzLmFjdGl2ZUFyZWFVbml0ID0gdW5pdDtcbiAgICB0aGlzLnRhYmxlLnJlZnJlc2goKTtcbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBzT2ZPbFNvdXJjZSh0aGlzLnN0b3JlLnNvdXJjZS5vbCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlT2xHZW9tZXRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBzT2ZPbEdlb21ldHJ5KHRoaXMuYWN0aXZlT2xHZW9tZXRyeSk7XG4gICAgfVxuICB9XG5cbiAgb25DYWxjdWxhdGVDbGljaygpIHtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWU7XG4gICAgY29uc3QgYXJlYSA9IGZlYXR1cmVzLnJlZHVjZSgoc3VtOiBudW1iZXIsIGxvY2FsRmVhdHVyZTogRmVhdHVyZVdpdGhNZWFzdXJlKSA9PiB7XG4gICAgICByZXR1cm4gc3VtICsgbG9jYWxGZWF0dXJlLnByb3BlcnRpZXMubWVhc3VyZS5hcmVhIHx8IDA7XG4gICAgfSwgMCk7XG4gICAgY29uc3QgbGVuZ3RoID0gZmVhdHVyZXMucmVkdWNlKChzdW06IG51bWJlciwgbG9jYWxGZWF0dXJlOiBGZWF0dXJlV2l0aE1lYXN1cmUpID0+IHtcbiAgICAgIGlmIChsb2NhbEZlYXR1cmUuZ2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VtICsgbG9jYWxGZWF0dXJlLnByb3BlcnRpZXMubWVhc3VyZS5sZW5ndGggfHwgMDtcbiAgICB9LCAwKTtcbiAgICBjb25zdCBwZXJpbWV0ZXIgPSBmZWF0dXJlcy5yZWR1Y2UoKHN1bTogbnVtYmVyLCBsb2NhbEZlYXR1cmU6IEZlYXR1cmVXaXRoTWVhc3VyZSkgPT4ge1xuICAgICAgaWYgKGxvY2FsRmVhdHVyZS5nZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdW0gKyBsb2NhbEZlYXR1cmUucHJvcGVydGllcy5tZWFzdXJlLmxlbmd0aCB8fCAwO1xuICAgIH0sIDApO1xuXG4gICAgdGhpcy5vcGVuRGlhbG9nKHtcbiAgICAgIGFyZWEsXG4gICAgICBsZW5ndGgsXG4gICAgICBwZXJpbWV0ZXJcbiAgICB9KTtcbiAgfVxuXG4gIG9uRGVsZXRlQ2xpY2soKSB7XG4gICAgdGhpcy5zdG9yZS5kZWxldGVNYW55KHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUpO1xuICAgIHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUuZm9yRWFjaChzZWxlY3RlZEZlYXR1cmUgPT4ge1xuICAgICAgdGhpcy5vbERyYXdTb3VyY2UuZ2V0RmVhdHVyZXMoKS5mb3JFYWNoKGRyYXdpbmdMYXllckZlYXR1cmUgPT4ge1xuICAgICAgICBjb25zdCBnZW9tZXRyeSA9IGRyYXdpbmdMYXllckZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBhbnk7XG4gICAgICAgIGlmIChzZWxlY3RlZEZlYXR1cmUucHJvcGVydGllcy5pZCA9PT0gZ2VvbWV0cnkub2xfdWlkKSB7XG4gICAgICAgICAgdGhpcy5vbERyYXdTb3VyY2UucmVtb3ZlRmVhdHVyZShkcmF3aW5nTGF5ZXJGZWF0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBvbk1vZGlmeUNsaWNrKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmxlbmd0aCAhPT0gMSkgeyByZXR1cm47IH1cblxuICAgIGlmICh0aGlzLm1vZGlmeUNvbnRyb2wuYWN0aXZlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVNb2RpZnlDb250cm9sKCk7XG4gICAgICB0aGlzLnRvZ2dsZURyYXdDb250cm9sKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxvY2FsRmVhdHVyZSA9IHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWVbMF07XG4gICAgICBjb25zdCBvbEZlYXR1cmVzID0gdGhpcy5zdG9yZS5sYXllci5vbC5nZXRTb3VyY2UoKS5nZXRGZWF0dXJlcygpO1xuICAgICAgY29uc3Qgb2xGZWF0dXJlID0gb2xGZWF0dXJlcy5maW5kKChfb2xGZWF0dXJlOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT4pID0+IHtcbiAgICAgICAgcmV0dXJuIF9vbEZlYXR1cmUuZ2V0KCdpZCcpID09PSBsb2NhbEZlYXR1cmUucHJvcGVydGllcy5pZDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob2xGZWF0dXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5kZWFjdGl2YXRlRHJhd0NvbnRyb2woKTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZU1vZGlmeUNvbnRyb2woKTtcblxuICAgICAgICBjb25zdCBvbEdlb21ldHJ5ID0gb2xGZWF0dXJlLmdldEdlb21ldHJ5KCk7XG4gICAgICAgIHRoaXMuY2xlYXJUb29sdGlwc09mT2xHZW9tZXRyeShvbEdlb21ldHJ5IGFzIChPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pKTtcbiAgICAgICAgdGhpcy5tb2RpZnlDb250cm9sLnNldE9sR2VvbWV0cnkob2xHZW9tZXRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRGlhbG9nKGRhdGE6IE1lYXN1cmVyRGlhbG9nRGF0YSk6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVhc3VyZXJEaWFsb2dDb21wb25lbnQsIHtkYXRhfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgbWVhc3VyZSBzdG9yZSBhbmQgc2V0IHVwIHNvbWUgbGlzdGVuZXJzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSBpbml0U3RvcmUoKSB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlO1xuXG4gICAgY29uc3QgbGF5ZXIgPSBuZXcgVmVjdG9yTGF5ZXIoe1xuICAgICAgdGl0bGU6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLm1lYXN1cmUubGF5ZXJUaXRsZScpLFxuICAgICAgaXNJZ29JbnRlcm5hbExheWVyOiB0cnVlLFxuICAgICAgaWQ6IGBpZ28tbWVhc3VyZXMtJHt1dWlkKCl9YCxcbiAgICAgIHpJbmRleDogMjAwLFxuICAgICAgc291cmNlOiBuZXcgRmVhdHVyZURhdGFTb3VyY2UoKSxcbiAgICAgIHN0eWxlOiBjcmVhdGVNZWFzdXJlTGF5ZXJTdHlsZSgpLFxuICAgICAgc2hvd0luTGF5ZXJMaXN0OiB0cnVlLFxuICAgICAgZXhwb3J0YWJsZTogdHJ1ZSxcbiAgICAgIGJyb3dzYWJsZTogZmFsc2UsXG4gICAgICB3b3Jrc3BhY2U6IHsgZW5hYmxlZDogZmFsc2UgfVxuICAgIH0pO1xuICAgIHRyeUJpbmRTdG9yZUxheWVyKHN0b3JlLCBsYXllcik7XG4gICAgc3RvcmUubGF5ZXIudmlzaWJsZSA9IHRydWU7XG4gICAgbGF5ZXIudmlzaWJsZSQuc3Vic2NyaWJlKHZpc2libGUgPT4ge1xuICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpZ28tbWFwLXRvb2x0aXAtbWVhc3VyZScpKS5tYXAoKHZhbHVlOiBFbGVtZW50KSA9PlxuICAgICAgICB2YWx1ZS5jbGFzc0xpc3QucmVtb3ZlKCdpZ28tbWFwLXRvb2x0aXAtbWVhc3VyZS1ieS1kaXNwbGF5JykpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaWdvLW1hcC10b29sdGlwLW1lYXN1cmUnKSkubWFwKCh2YWx1ZTogRWxlbWVudCkgPT5cbiAgICAgICAgdmFsdWUuY2xhc3NMaXN0LmFkZCgnaWdvLW1hcC10b29sdGlwLW1lYXN1cmUtYnktZGlzcGxheScpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRyeUFkZExvYWRpbmdTdHJhdGVneShzdG9yZSk7XG5cbiAgICB0cnlBZGRTZWxlY3Rpb25TdHJhdGVneShzdG9yZSwgbmV3IEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5KHtcbiAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICBtYW55OiB0cnVlXG4gICAgfSkpO1xuXG4gICAgdGhpcy5vbkZlYXR1cmVBZGRlZEtleSA9IHN0b3JlLnNvdXJjZS5vbC5vbignYWRkZmVhdHVyZScsIChldmVudDogT2xWZWN0b3JTb3VyY2VFdmVudDxPbEdlb21ldHJ5PikgPT4ge1xuICAgICAgY29uc3QgbG9jYWxGZWF0dXJlID0gZXZlbnQuZmVhdHVyZTtcbiAgICAgIGNvbnN0IG9sR2VvbWV0cnkgPSBsb2NhbEZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBhbnk7XG4gICAgICB0aGlzLnVwZGF0ZU1lYXN1cmVPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSwgbG9jYWxGZWF0dXJlLmdldCgnbWVhc3VyZScpKTtcbiAgICAgIHRoaXMub25EaXNwbGF5RGlzdGFuY2UoKTtcbiAgICB9KTtcblxuICAgIHRoaXMub25GZWF0dXJlUmVtb3ZlZEtleSA9IHN0b3JlLnNvdXJjZS5vbC5vbigncmVtb3ZlZmVhdHVyZScsIChldmVudDogT2xWZWN0b3JTb3VyY2VFdmVudDxPbEdlb21ldHJ5PikgPT4ge1xuICAgICAgY29uc3Qgb2xHZW9tZXRyeSA9IGV2ZW50LmZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBhbnk7XG4gICAgICB0aGlzLmNsZWFyVG9vbHRpcHNPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkJCA9IHN0b3JlLnN0YXRlVmlldy5tYW55QnkkKChyZWNvcmQ6IEVudGl0eVJlY29yZDxGZWF0dXJlV2l0aE1lYXN1cmU+KSA9PiB7XG4gICAgICByZXR1cm4gcmVjb3JkLnN0YXRlLnNlbGVjdGVkID09PSB0cnVlO1xuICAgIH0pLnBpcGUoXG4gICAgICBza2lwKDEpIC8vIFNraXAgaW5pdGlhbCBlbWlzc2lvblxuICAgIClcbiAgICAuc3Vic2NyaWJlKChyZWNvcmRzOiBFbnRpdHlSZWNvcmQ8RmVhdHVyZVdpdGhNZWFzdXJlPltdKSA9PiB7XG4gICAgICBpZiAodGhpcy5tb2RpZnlDb250cm9sLmFjdGl2ZSA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmRlYWN0aXZhdGVNb2RpZnlDb250cm9sKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLm5leHQocmVjb3Jkcy5tYXAocmVjb3JkID0+IHJlY29yZC5lbnRpdHkpKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLnB1c2godGhpcy5zdG9yZS5lbnRpdGllcyQuc3Vic2NyaWJlKG9iamVjdHNFeGlzdHMgPT4ge1xuICAgICAgaWYgKG9iamVjdHNFeGlzdHMuZmluZChvYmplY3RFeGlzdCA9PiBvYmplY3RFeGlzdC5nZW9tZXRyeS50eXBlID09PSAnUG9seWdvbicpKXtcbiAgICAgICAgdGhpcy5oYXNBcmVhJC5uZXh0KHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oYXNBcmVhJC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9iamVjdHNFeGlzdHMuZmluZChvYmplY3RFeGlzdCA9PiBvYmplY3RFeGlzdC5nZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycpKXtcbiAgICAgICAgdGhpcy5oYXNMaW5lJC5uZXh0KHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oYXNMaW5lJC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMkJC5wdXNoKHRoaXMuc3RvcmUuY291bnQkLnN1YnNjcmliZShjbnQgPT4ge1xuICAgICAgY250ID49IDEgP1xuICAgICAgICB0aGlzLnN0b3JlLmxheWVyLm9wdGlvbnMuc2hvd0luTGF5ZXJMaXN0ID0gdHJ1ZSA6XG4gICAgICAgIHRoaXMuc3RvcmUubGF5ZXIub3B0aW9ucy5zaG93SW5MYXllckxpc3QgPSBmYWxzZTtcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRnJlZXplIGFueSBzdG9yZSwgbWVhbmluZyB0aGUgbGF5ZXIgaXMgcmVtb3ZlZCwgc3RyYXRlZ2llcyBhcmUgZGVhY3RpdmF0ZWRcbiAgICogYW5kIHNvbWUgbGlzdGVuZXIgcmVtb3ZlZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgZnJlZXplU3RvcmUoKSB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlO1xuICAgIHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQkLnVuc3Vic2NyaWJlKCk7XG4gICAgdW5CeUtleSh0aGlzLm9uRmVhdHVyZUFkZGVkS2V5KTtcbiAgICB1bkJ5S2V5KHRoaXMub25GZWF0dXJlUmVtb3ZlZEtleSk7XG4gICAgc3RvcmUuZGVhY3RpdmF0ZVN0cmF0ZWd5T2ZUeXBlKEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSk7XG4gICAgc3RvcmUuZGVhY3RpdmF0ZVN0cmF0ZWd5T2ZUeXBlKEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBkcmF3IGxpbmUgY29udHJvbFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEcmF3TGluZUNvbnRyb2woKSB7XG4gICAgdGhpcy5kcmF3TGluZUNvbnRyb2wgPSBuZXcgRHJhd0NvbnRyb2woe1xuICAgICAgZ2VvbWV0cnlUeXBlOiAnTGluZVN0cmluZycsXG4gICAgICBkcmF3aW5nTGF5ZXJTb3VyY2U6IHRoaXMub2xEcmF3U291cmNlLFxuICAgICAgaW50ZXJhY3Rpb25TdHlsZTogY3JlYXRlTWVhc3VyZUludGVyYWN0aW9uU3R5bGUoKSxcbiAgICAgIGRyYXdpbmdMYXllclN0eWxlOiBuZXcgT2xTdHlsZSh7fSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBkcmF3IHBvbHlnb24gY29udHJvbFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEcmF3UG9seWdvbkNvbnRyb2woKSB7XG4gICAgdGhpcy5kcmF3UG9seWdvbkNvbnRyb2wgPSBuZXcgRHJhd0NvbnRyb2woe1xuICAgICAgZ2VvbWV0cnlUeXBlOiAnUG9seWdvbicsXG4gICAgICBkcmF3aW5nTGF5ZXJTb3VyY2U6IHRoaXMub2xEcmF3U291cmNlLFxuICAgICAgaW50ZXJhY3Rpb25TdHlsZTogY3JlYXRlTWVhc3VyZUludGVyYWN0aW9uU3R5bGUoKSxcbiAgICAgIGRyYXdpbmdMYXllclN0eWxlOiBuZXcgT2xTdHlsZSh7fSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBkcmF3IHBvbHlnb24gY29udHJvbFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVNb2RpZnlDb250cm9sKCkge1xuICAgIHRoaXMubW9kaWZ5Q29udHJvbCA9IG5ldyBNb2RpZnlDb250cm9sKHtcbiAgICAgIHNvdXJjZTogdGhpcy5vbERyYXdTb3VyY2UsXG4gICAgICBkcmF3U3R5bGU6IGNyZWF0ZU1lYXN1cmVJbnRlcmFjdGlvblN0eWxlKCksXG4gICAgICBsYXllclN0eWxlOiBuZXcgT2xTdHlsZSh7fSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgcmlnaHQgY29udHJvbFxuICAgKi9cbiAgcHJpdmF0ZSB0b2dnbGVEcmF3Q29udHJvbCgpIHtcbiAgICB0aGlzLmRlYWN0aXZhdGVEcmF3Q29udHJvbCgpO1xuICAgIC8vIHRoaXMuZGVhY3RpdmF0ZU1vZGlmeUNvbnRyb2woKTtcbiAgICBpZiAodGhpcy5hY3RpdmVNZWFzdXJlVHlwZSA9PT0gTWVhc3VyZVR5cGUuTGVuZ3RoKSB7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJhd0NvbnRyb2wodGhpcy5kcmF3TGluZUNvbnRyb2wpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVNZWFzdXJlVHlwZSA9PT0gTWVhc3VyZVR5cGUuQXJlYSkge1xuICAgICAgdGhpcy5hY3RpdmF0ZURyYXdDb250cm9sKHRoaXMuZHJhd1BvbHlnb25Db250cm9sKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYSBnaXZlbiBjb250cm9sXG4gICAqIEBwYXJhbSBkcmF3Q29udHJvbCBEcmF3IGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgYWN0aXZhdGVEcmF3Q29udHJvbChkcmF3Q29udHJvbDogRHJhd0NvbnRyb2wpIHtcbiAgICB0aGlzLmRyYXdDb250cm9sSXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wgPSBkcmF3Q29udHJvbDtcbiAgICB0aGlzLmRyYXdTdGFydCQkID0gZHJhd0NvbnRyb2wuc3RhcnQkXG4gICAgICAuc3Vic2NyaWJlKChvbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pID0+IHRoaXMub25EcmF3U3RhcnQob2xHZW9tZXRyeSkpO1xuICAgIHRoaXMuZHJhd0VuZCQkID0gZHJhd0NvbnRyb2wuZW5kJFxuICAgICAgLnN1YnNjcmliZSgob2xHZW9tZXRyeTogT2xMaW5lU3RyaW5nIHwgT2xQb2x5Z29uKSA9PiB0aGlzLm9uRHJhd0VuZChvbEdlb21ldHJ5KSk7XG4gICAgdGhpcy5kcmF3Q2hhbmdlcyQkID0gZHJhd0NvbnRyb2wuY2hhbmdlcyRcbiAgICAgIC5zdWJzY3JpYmUoKG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikgPT4gdGhpcy5vbkRyYXdDaGFuZ2VzKG9sR2VvbWV0cnkpKTtcbiAgICB0aGlzLmRyYXdDaGFuZ2VzJCQgPSBkcmF3Q29udHJvbC5hYm9ydCRcbiAgICAgIC5zdWJzY3JpYmUoKG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikgPT4ge1xuICAgICAgICB0aGlzLmNsZWFyVG9vbHRpcHNPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSk7XG4gICAgICAgIHRoaXMuY2xlYXJNZWFzdXJlcygpO1xuICAgICAgfSk7XG4gICAgZHJhd0NvbnRyb2wuc2V0T2xNYXAodGhpcy5tYXAub2wsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWFjdGl2YXRlIHRoZSBhY3RpdmUgZHJhdyBjb250cm9sXG4gICAqL1xuICBwcml2YXRlIGRlYWN0aXZhdGVEcmF3Q29udHJvbCgpIHtcbiAgICBpZiAodGhpcy5hY3RpdmVEcmF3Q29udHJvbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vbERyYXdTb3VyY2UuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5kcmF3U3RhcnQkJCAhPT0gdW5kZWZpbmVkICkgeyB0aGlzLmRyYXdTdGFydCQkLnVuc3Vic2NyaWJlKCk7IH1cbiAgICBpZiAodGhpcy5kcmF3RW5kJCQgIT09IHVuZGVmaW5lZCApIHsgdGhpcy5kcmF3RW5kJCQudW5zdWJzY3JpYmUoKTsgfVxuICAgIGlmICh0aGlzLmRyYXdDaGFuZ2VzJCQgIT09IHVuZGVmaW5lZCApIHsgdGhpcy5kcmF3Q2hhbmdlcyQkLnVuc3Vic2NyaWJlKCk7IH1cblxuICAgIHRoaXMuY2xlYXJUb29sdGlwc09mT2xTb3VyY2UodGhpcy5vbERyYXdTb3VyY2UpO1xuICAgIGlmICh0aGlzLmFjdGl2ZU9sR2VvbWV0cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jbGVhclRvb2x0aXBzT2ZPbEdlb21ldHJ5KHRoaXMuYWN0aXZlT2xHZW9tZXRyeSk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wuc2V0T2xNYXAodW5kZWZpbmVkKTtcbiAgICB0aGlzLmFjdGl2ZURyYXdDb250cm9sID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYWN0aXZlT2xHZW9tZXRyeSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlTWVhc3VyZVR5cGUobWVhc3VyZVR5cGU6IE1lYXN1cmVUeXBlKSB7XG4gICAgdGhpcy5fYWN0aXZlTWVhc3VyZVR5cGUgPSBtZWFzdXJlVHlwZTtcbiAgICB0aGlzLmNsZWFyTWVhc3VyZXMoKTtcbiAgICB0aGlzLnRvZ2dsZURyYXdDb250cm9sKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGRyYXcgc291cmNlIGFuZCB0cmFjayB0aGUgZ2VvbWV0cnkgYmVpbmcgZHJhd25cbiAgICogQHBhcmFtIG9sR2VvbWV0cnkgT2wgbGluZXN0cmluZyBvciBwb2x5Z29uXG4gICAqL1xuICBwcml2YXRlIG9uRHJhd1N0YXJ0KG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikge1xuICAgIHRoaXMuYWN0aXZlT2xHZW9tZXRyeSA9IG9sR2VvbWV0cnk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGRyYXcgc291cmNlIGFuZCB0cmFjayB0aGUgZ2VvbWV0cnkgYmVpbmcgZHJhd1xuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSBPbCBsaW5lc3RyaW5nIG9yIHBvbHlnb25cbiAgICovXG4gIHByaXZhdGUgb25EcmF3RW5kKG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikge1xuICAgIHRoaXMuYWN0aXZlT2xHZW9tZXRyeSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmZpbmFsaXplTWVhc3VyZU9mT2xHZW9tZXRyeShvbEdlb21ldHJ5KTtcbiAgICB0aGlzLmFkZEZlYXR1cmVUb1N0b3JlKG9sR2VvbWV0cnkpO1xuICAgIHRoaXMuY2xlYXJUb29sdGlwc09mT2xHZW9tZXRyeShvbEdlb21ldHJ5KTtcbiAgICB0aGlzLm9sRHJhd1NvdXJjZS5jbGVhcih0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbWVhc3VyZXMgb2JzZXJ2YWJsZXMgYW5kIG1hcCB0b29sdGlwc1xuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSBPbCBsaW5lc3RyaW5nIG9yIHBvbHlnb25cbiAgICovXG4gIHByaXZhdGUgb25EcmF3Q2hhbmdlcyhvbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pIHtcbiAgICBjb25zdCBtZWFzdXJlID0gbWVhc3VyZU9sR2VvbWV0cnkob2xHZW9tZXRyeSwgdGhpcy5wcm9qZWN0aW9uKTtcbiAgICB0aGlzLnVwZGF0ZU1lYXN1cmVPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSwgT2JqZWN0LmFzc2lnbih7fSwgbWVhc3VyZSwge1xuICAgICAgYXJlYTogdW5kZWZpbmVkIC8vIFdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSBhbiBhcmVhIHRvb2x0aXAgd2hpbGUgZHJhd2luZy5cbiAgICB9KSk7XG4gICAgdGhpcy5tZWFzdXJlJC5uZXh0KG1lYXN1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGEgZ2l2ZW4gY29udHJvbFxuICAgKiBAcGFyYW0gbW9kaWZ5Q29udHJvbCBNb2RpZnkgY29udHJvbFxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmF0ZU1vZGlmeUNvbnRyb2woKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5zdG9yZS5nZXRTdHJhdGVneU9mVHlwZShGZWF0dXJlU3RvcmVTZWxlY3Rpb25TdHJhdGVneSkgYXMgRmVhdHVyZVN0b3JlU2VsZWN0aW9uU3RyYXRlZ3k7XG4gICAgc2VsZWN0aW9uLmRlYWN0aXZhdGUoKTtcbiAgICBzZWxlY3Rpb24uY2xlYXIoKTtcblxuICAgIHRoaXMubW9kaWZ5U3RhcnQkJCA9IHRoaXMubW9kaWZ5Q29udHJvbC5zdGFydCRcbiAgICAgIC5zdWJzY3JpYmUoKG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikgPT4gdGhpcy5vbk1vZGlmeVN0YXJ0KG9sR2VvbWV0cnkpKTtcbiAgICB0aGlzLm1vZGlmeUVuZCQkID0gdGhpcy5tb2RpZnlDb250cm9sLmVuZCRcbiAgICAgIC5zdWJzY3JpYmUoKG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikgPT4gdGhpcy5vbk1vZGlmeUVuZChvbEdlb21ldHJ5KSk7XG4gICAgdGhpcy5tb2RpZnlDaGFuZ2VzJCQgPSB0aGlzLm1vZGlmeUNvbnRyb2wuY2hhbmdlcyRcbiAgICAgIC5zdWJzY3JpYmUoKG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikgPT4gdGhpcy5vbk1vZGlmeUNoYW5nZXMob2xHZW9tZXRyeSkpO1xuICAgIHRoaXMubW9kaWZ5Q29udHJvbC5zZXRPbE1hcCh0aGlzLm1hcC5vbCk7XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSB0aGUgYWN0aXZlIG1vZGlmeSBjb250cm9sXG4gICAqL1xuICBwcml2YXRlIGRlYWN0aXZhdGVNb2RpZnlDb250cm9sKCkge1xuICAgIGlmICh0aGlzLm1vZGlmeVN0YXJ0JCQgIT09IHVuZGVmaW5lZCApIHsgdGhpcy5tb2RpZnlTdGFydCQkLnVuc3Vic2NyaWJlKCk7IH1cbiAgICBpZiAodGhpcy5tb2RpZnlFbmQkJCAhPT0gdW5kZWZpbmVkICkgeyB0aGlzLm1vZGlmeUVuZCQkLnVuc3Vic2NyaWJlKCk7IH1cbiAgICBpZiAodGhpcy5tb2RpZnlDaGFuZ2VzJCQgIT09IHVuZGVmaW5lZCApIHsgdGhpcy5tb2RpZnlDaGFuZ2VzJCQudW5zdWJzY3JpYmUoKTsgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlT2xHZW9tZXRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgbG9jYWxGZWF0dXJlID0gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZVswXTtcbiAgICAgICAgdGhpcy5hZGRGZWF0dXJlVG9TdG9yZSh0aGlzLmFjdGl2ZU9sR2VvbWV0cnksIGxvY2FsRmVhdHVyZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbmFsaXplTWVhc3VyZU9mT2xHZW9tZXRyeSh0aGlzLmFjdGl2ZU9sR2VvbWV0cnkpO1xuICAgIH1cblxuICAgIHRoaXMub2xEcmF3U291cmNlLmNsZWFyKCk7XG5cbiAgICB0aGlzLnN0b3JlLmFjdGl2YXRlU3RyYXRlZ3lPZlR5cGUoRmVhdHVyZVN0b3JlU2VsZWN0aW9uU3RyYXRlZ3kpO1xuXG4gICAgdGhpcy5hY3RpdmVPbEdlb21ldHJ5ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubW9kaWZ5Q29udHJvbC5zZXRPbE1hcCh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBkcmF3IHNvdXJjZSBhbmQgdHJhY2sgdGhlIGdlb21ldHJ5IGJlaW5nIGRyYXduXG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IE9sIGxpbmVzdHJpbmcgb3IgcG9seWdvblxuICAgKi9cbiAgcHJpdmF0ZSBvbk1vZGlmeVN0YXJ0KG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikge1xuICAgIHRoaXMub25EcmF3U3RhcnQob2xHZW9tZXRyeSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1lYXN1cmVzIG9ic2VydmFibGVzIGFuZCBtYXAgdG9vbHRpcHNcbiAgICogQHBhcmFtIG9sR2VvbWV0cnkgT2wgbGluZXN0cmluZyBvciBwb2x5Z29uXG4gICAqL1xuICBwcml2YXRlIG9uTW9kaWZ5Q2hhbmdlcyhvbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pIHtcbiAgICB0aGlzLm9uRHJhd0NoYW5nZXMob2xHZW9tZXRyeSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGRyYXcgc291cmNlIGFuZCB0cmFjayB0aGUgZ2VvbWV0cnkgYmVpbmcgZHJhd1xuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSBPbCBsaW5lc3RyaW5nIG9yIHBvbHlnb25cbiAgICovXG4gIHByaXZhdGUgb25Nb2RpZnlFbmQob2xHZW9tZXRyeTogT2xMaW5lU3RyaW5nIHwgT2xQb2x5Z29uKSB7XG4gICAgdGhpcy5maW5hbGl6ZU1lYXN1cmVPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmFsaXplTWVhc3VyZU9mT2xHZW9tZXRyeShvbEdlb21ldHJ5OiBPbExpbmVTdHJpbmcgfCBPbFBvbHlnb24pIHtcbiAgICBjb25zdCBtZWFzdXJlID0gbWVhc3VyZU9sR2VvbWV0cnkob2xHZW9tZXRyeSwgdGhpcy5wcm9qZWN0aW9uKTtcbiAgICB0aGlzLnVwZGF0ZU1lYXN1cmVPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSwgbWVhc3VyZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1lYXN1cmVzIG9ic2VydmFibGVzXG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IE9sIGxpbmVzdHJpbmcgb3IgcG9seWdvblxuICAgKiBAcGFyYW0gbWVhc3VyZSBNZWFzdXJlXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZU1lYXN1cmVPZk9sR2VvbWV0cnkob2xHZW9tZXRyeTogT2xMaW5lU3RyaW5nIHwgT2xQb2x5Z29uLCBtZWFzdXJlOiBNZWFzdXJlKSB7XG4gICAgb2xHZW9tZXRyeS5zZXRQcm9wZXJ0aWVzKHtfbWVhc3VyZTogbWVhc3VyZX0sIHRydWUpO1xuICAgIHRoaXMudXBkYXRlVG9vbHRpcHNPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIG1lYXN1cmVzIG9ic2VydmFibGVzXG4gICAqL1xuICBwcml2YXRlIGNsZWFyTWVhc3VyZXMoKSB7XG4gICAgdGhpcy5tZWFzdXJlJC5uZXh0KHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBmZWF0dXJlIHdpdGggbWVhc3VyZXMgdG8gdGhlIHN0b3JlLiBUaGUgbG9hZGluZyBzdHJhZ2VneSBvZiB0aGUgc3RvcmVcbiAgICogd2lsbCB0cmlnZ2VyIGFuZCBhZGQgdGhlIGZlYXR1cmUgdG8gdGhlIG1hcC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIGFkZEZlYXR1cmVUb1N0b3JlKG9sR2VvbWV0cnksIGxvY2FsRmVhdHVyZT86IEZlYXR1cmVXaXRoTWVhc3VyZSkge1xuICAgIGNvbnN0IGZlYXR1cmVJZCA9IGxvY2FsRmVhdHVyZSA/IGxvY2FsRmVhdHVyZS5wcm9wZXJ0aWVzLmlkIDogb2xHZW9tZXRyeS5vbF91aWQ7XG4gICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMubWFwLm9sLmdldFZpZXcoKS5nZXRQcm9qZWN0aW9uKCk7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgT2xHZW9KU09OKCkud3JpdGVHZW9tZXRyeU9iamVjdChvbEdlb21ldHJ5LCB7XG4gICAgICBmZWF0dXJlUHJvamVjdGlvbjogcHJvamVjdGlvbixcbiAgICAgIGRhdGFQcm9qZWN0aW9uOiBwcm9qZWN0aW9uXG4gICAgfSkgYXMgYW55O1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHtcbiAgICAgIHR5cGU6IEZFQVRVUkUsXG4gICAgICBnZW9tZXRyeSxcbiAgICAgIHByb2plY3Rpb246IHByb2plY3Rpb24uZ2V0Q29kZSgpLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBpZDogZmVhdHVyZUlkLFxuICAgICAgICBtZWFzdXJlOiBvbEdlb21ldHJ5LmdldCgnX21lYXN1cmUnKVxuICAgICAgfSxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgaWQ6IGZlYXR1cmVJZFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbGwgdGhlIHRvb2x0aXBzIG9mIGFuIE9MIGdlb21ldHJ5XG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IE9MIEdlb21ldHJ5XG4gICAqIEBwYXJhbSBsZW5ndGhzIExlbmd0aHMgb2YgdGhlIE9MIGdlb21ldHJ5J3Mgc2VnbWVudHNcbiAgICogQHBhcmFtIG1lYXN1cmVVbml0IERpc3BsYXkgdG9vbHRpcCBtZWFzdXJlIGluIHRob3NlIHVuaXRzXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikge1xuICAgIGNvbnN0IG1lYXN1cmUgPSBvbEdlb21ldHJ5LmdldCgnX21lYXN1cmUnKTtcbiAgICBjb25zdCBsZW5ndGhzID0gbWVhc3VyZS5sZW5ndGhzO1xuICAgIGNvbnN0IGFyZWEgPSBtZWFzdXJlLmFyZWE7XG5cbiAgICBjb25zdCBvbE1pZHBvaW50c1Rvb2x0aXBzID0gdXBkYXRlT2xUb29sdGlwc0F0TWlkcG9pbnRzKG9sR2VvbWV0cnkpO1xuICAgIGlmIChsZW5ndGhzLmxlbmd0aCA9PT0gb2xNaWRwb2ludHNUb29sdGlwcy5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2xNaWRwb2ludHNUb29sdGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBsZW5ndGhzW2ldO1xuICAgICAgICBpZiAobGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU9sVG9vbHRpcChcbiAgICAgICAgICAgIG9sTWlkcG9pbnRzVG9vbHRpcHNbaV0sXG4gICAgICAgICAgICBtZXRlcnNUb1VuaXQobGVuZ3RoLCB0aGlzLmFjdGl2ZUxlbmd0aFVuaXQpLFxuICAgICAgICAgICAgdGhpcy5hY3RpdmVMZW5ndGhVbml0LFxuICAgICAgICAgICAgTWVhc3VyZVR5cGUuTGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhcmVhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlT2xUb29sdGlwKFxuICAgICAgICB1cGRhdGVPbFRvb2x0aXBBdENlbnRlcihvbEdlb21ldHJ5KSxcbiAgICAgICAgc3F1YXJlTWV0ZXJzVG9Vbml0KGFyZWEsIHRoaXMuYWN0aXZlQXJlYVVuaXQpLFxuICAgICAgICB0aGlzLmFjdGl2ZUFyZWFVbml0LFxuICAgICAgICBNZWFzdXJlVHlwZS5BcmVhXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZSBtYXAgdG9vbHRpcHMgb2YgYSBnZW9lbXRyeVxuICAgKi9cbiAgcHJpdmF0ZSBzaG93VG9vbHRpcHNPZk9sR2VvbWV0cnkob2xHZW9tZXRyeTogT2xMaW5lU3RyaW5nIHwgT2xQb2x5Z29uKSB7XG4gICAgZ2V0VG9vbHRpcHNPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSkuZm9yRWFjaCgob2xUb29sdGlwOiBPbE92ZXJsYXkgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFNob3dUb29sdGlwKG9sVG9vbHRpcCkpIHtcbiAgICAgICAgdGhpcy5tYXAub2wuYWRkT3ZlcmxheShvbFRvb2x0aXApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSB0b29sdGlwcyBvZiBhbiBPTCBnZW9tZXRyeXNcbiAgICogQHBhcmFtIG9sR2VvbWV0cnkgT0wgZ2VvbWV0cnkgd2l0aCB0b29sdGlwc1xuICAgKi9cbiAgcHJpdmF0ZSBjbGVhclRvb2x0aXBzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnk6IE9sTGluZVN0cmluZyB8IE9sUG9seWdvbikge1xuICAgIGdldFRvb2x0aXBzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpLmZvckVhY2goKG9sVG9vbHRpcDogT2xPdmVybGF5IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAob2xUb29sdGlwICE9PSB1bmRlZmluZWQgJiYgb2xUb29sdGlwLmdldE1hcCgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5tYXAub2wucmVtb3ZlT3ZlcmxheShvbFRvb2x0aXApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIG1hcCB0b29sdGlwcyBvZiBhbGwgdGhlIGdlb21ldHJpZXMgb2YgYSBzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcHNPZk9sU291cmNlKG9sU291cmNlOiBPbFZlY3RvclNvdXJjZTxPbEdlb21ldHJ5Pikge1xuICAgIG9sU291cmNlLmZvckVhY2hGZWF0dXJlKChvbEZlYXR1cmU6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PikgPT4ge1xuICAgICAgdGhpcy51cGRhdGVUb29sdGlwc09mT2xHZW9tZXRyeShvbEZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBhbnkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIG1hcCB0b29sdGlwcyBvZiBhbGwgdGhlIGdlb21ldHJpZXMgb2YgYSBzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgc2hvd1Rvb2x0aXBzT2ZPbFNvdXJjZShvbFNvdXJjZTogT2xWZWN0b3JTb3VyY2U8T2xHZW9tZXRyeT4pIHtcbiAgICBvbFNvdXJjZS5mb3JFYWNoRmVhdHVyZSgob2xGZWF0dXJlOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT4pID0+IHtcbiAgICAgIHRoaXMuc2hvd1Rvb2x0aXBzT2ZPbEdlb21ldHJ5KG9sRmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIGFueSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIG1hcCB0b29sdGlwc1xuICAgKiBAcGFyYW0gb2xEcmF3U291cmNlIE9MIHZlY3RvciBzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgY2xlYXJUb29sdGlwc09mT2xTb3VyY2Uob2xTb3VyY2U6IE9sVmVjdG9yU291cmNlPE9sR2VvbWV0cnk+KSB7XG4gICAgb2xTb3VyY2UuZm9yRWFjaEZlYXR1cmUoKG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+KSA9PiB7XG4gICAgICBjb25zdCBvbEdlb21ldHJ5ID0gb2xGZWF0dXJlLmdldEdlb21ldHJ5KCk7XG4gICAgICBpZiAob2xHZW9tZXRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY2xlYXJUb29sdGlwc09mT2xHZW9tZXRyeShvbEZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBhbnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBPTCB0b29sdGlwIHByb3BlcnRpZXMgYW5kIGlubmVyIEhUTUwgYW5kIGFkZCBpdCB0byB0aGUgbWFwIGlmIHBvc3NpYmxlXG4gICAqIEBwYXJhbSBvbFRvb2x0aXAgT0wgdG9vbHRpcFxuICAgKiBAcGFyYW0gbWVhc3VyZSBUaGUgbWVhc3VyZSB2YWxldSB0aSBkaXNwbGF5XG4gICAqIEBwYXJhbSBtZWFzdXJlVW5pdCBEaXNwbGF5IHRvb2x0aXAgbWVhc3VyZSBpbiB0aG9zZSB1bml0c1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVPbFRvb2x0aXAoXG4gICAgb2xUb29sdGlwOiBPbE92ZXJsYXksXG4gICAgbWVhc3VyZTogbnVtYmVyLFxuICAgIHVuaXQ6IE1lYXN1cmVBcmVhVW5pdCB8IE1lYXN1cmVMZW5ndGhVbml0LFxuICAgIHR5cGU6IE1lYXN1cmVUeXBlXG4gICkge1xuICAgIG9sVG9vbHRpcC5zZXRQcm9wZXJ0aWVzKHtfbWVhc3VyZTogbWVhc3VyZSwgX3VuaXQ6IHVuaXQsIF90eXBlOiB0eXBlfSwgdHJ1ZSk7XG4gICAgb2xUb29sdGlwLmdldEVsZW1lbnQoKS5pbm5lckhUTUwgPSB0aGlzLmNvbXB1dGVUb29sdGlwSW5uZXJIVE1MKG9sVG9vbHRpcCk7XG4gICAgaWYgKHRoaXMuc2hvdWxkU2hvd1Rvb2x0aXAob2xUb29sdGlwKSkge1xuICAgICAgdGhpcy5tYXAub2wuYWRkT3ZlcmxheShvbFRvb2x0aXApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIGEgdG9vbHRpcCdzIGNvbnRlbnRcbiAgICogQHBhcmFtIG9sVG9vbHRpcCBPTCBvdmVybGF5XG4gICAqIEByZXR1cm5zIElubmVyIEhUTUxcbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZVRvb2x0aXBJbm5lckhUTUwob2xUb29sdGlwOiBPbE92ZXJsYXkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBvbFRvb2x0aXAuZ2V0UHJvcGVydGllcygpIGFzIGFueTtcbiAgICByZXR1cm4gZm9ybWF0TWVhc3VyZShwcm9wZXJ0aWVzLl9tZWFzdXJlLCB7XG4gICAgICBkZWNpbWFsOiAxLFxuICAgICAgdW5pdDogcHJvcGVydGllcy5fdW5pdCxcbiAgICAgIHVuaXRBYmJyOiB0cnVlLFxuICAgICAgbG9jYWxlOiAnZnInXG4gICAgfSwgdGhpcy5sYW5ndWFnZVNlcnZpY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB0b29sdGlwIHNob3VsZCBiZSBzaG93bmVkIGJhc2VkIG9uIHRoZSBsZW5ndGhcbiAgICogb2YgdGhlIHNlZ21lbnQgaXQgaXMgYm91bmQgdG8uXG4gICAqIEBwYXJhbSBvbFRvb2x0aXAgT0wgb3ZlcmxheVxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB0b29sdGlwIHNob3VsZCBiZSBzaG93blxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRTaG93VG9vbHRpcChvbFRvb2x0aXA6IE9sT3ZlcmxheSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNob3dUb29sdGlwcyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gb2xUb29sdGlwLmdldFByb3BlcnRpZXMoKSBhcyBhbnk7XG4gICAgY29uc3QgbWVhc3VyZSA9IHByb3BlcnRpZXMuX21lYXN1cmU7XG4gICAgaWYgKG1lYXN1cmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm9wZXJ0aWVzLl91bml0ID09PSBNZWFzdXJlVHlwZS5MZW5ndGgpIHtcbiAgICAgIGNvbnN0IG1pblNlZ21lbnRMZW5ndGggPSBtZXRlcnNUb1VuaXQodGhpcy5taW5TZWdtZW50TGVuZ3RoLCBwcm9wZXJ0aWVzLl91bml0KSB8fCAwO1xuICAgICAgcmV0dXJuIG1lYXN1cmUgPiBNYXRoLm1heChtaW5TZWdtZW50TGVuZ3RoLCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwiPGRpdj5cbiAgPGRpdiBjbGFzcz1cIm1lYXN1cmUtdHlwZS10b2dnbGUgbWF0LXR5cG9ncmFwaHlcIj5cbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXBcbiAgICAgIFt2YWx1ZV09XCJhY3RpdmVNZWFzdXJlVHlwZVwiXG4gICAgICAoY2hhbmdlKT1cIm9uTWVhc3VyZVR5cGVDaGFuZ2UoJGV2ZW50LnZhbHVlKVwiPlxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJtZWFzdXJlVHlwZS5MZW5ndGhcIj5cbiAgICAgICAge3soJ2lnby5nZW8ubWVhc3VyZS4nICsgbWVhc3VyZVR5cGUuTGVuZ3RoKSB8IHRyYW5zbGF0ZX19XG4gICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJtZWFzdXJlVHlwZS5BcmVhXCI+XG4gICAgICAgIHt7KCdpZ28uZ2VvLm1lYXN1cmUuJyArIG1lYXN1cmVUeXBlLkFyZWEpIHwgdHJhbnNsYXRlfX1cbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm1lYXN1cmUtb3B0aW9ucyBtYXQtdHlwb2dyYXBoeVwiPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICBbZGlzYWJsZWRdPVwiZHJhd0NvbnRyb2xJc0Rpc2FibGVkXCJcbiAgICAgIFtjaGVja2VkXT1cImRyYXdDb250cm9sSXNBY3RpdmVcIlxuICAgICAgW2xhYmVsUG9zaXRpb25dPVwiJ2JlZm9yZSdcIlxuICAgICAgKGNoYW5nZSk9XCJvblRvZ2dsZURyYXdDb250cm9sKCRldmVudC5jaGVja2VkKVwiPlxuICAgICAge3snaWdvLmdlby5tZWFzdXJlLnRvZ2dsZUFjdGl2ZScgfCB0cmFuc2xhdGV9fVxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cblxuICAgIDxtYXQtZGl2aWRlciAqbmdJZj1cIihoYXNMaW5lJCB8IGFzeW5jKVwiPjwvbWF0LWRpdmlkZXI+XG5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZSAqbmdJZj1cIihoYXNMaW5lJCB8IGFzeW5jKVwiXG4gICAgICBbY2hlY2tlZF09XCJkaXNwbGF5TGluZXNcIlxuICAgICAgW2xhYmVsUG9zaXRpb25dPVwiJ2JlZm9yZSdcIlxuICAgICAgKGNoYW5nZSk9XCJvblRvZ2dsZURpc3BsYXlMaW5lcygkZXZlbnQuY2hlY2tlZClcIj5cbiAgICAgIHt7J2lnby5nZW8ubWVhc3VyZS50b2dnbGVEaXNwbGF5TGluZXMnIHwgdHJhbnNsYXRlfX1cbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XG5cbiAgICA8bWF0LWRpdmlkZXIgKm5nSWY9XCIoaGFzTGluZSQgfCBhc3luYykgfHwgKGhhc0FyZWEkIHwgYXN5bmMpXCI+PC9tYXQtZGl2aWRlcj5cblxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlICpuZ0lmPVwiKGhhc0FyZWEkIHwgYXN5bmMpXCJcbiAgICAgIFtjaGVja2VkXT1cImRpc3BsYXlEaXN0YW5jZVwiXG4gICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXG4gICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlRGlzcGxheURpc3RhbmNlKCRldmVudC5jaGVja2VkKVwiPlxuICAgICAge3snaWdvLmdlby5tZWFzdXJlLnRvZ2dsZURpc3BsYXlEaXN0YW5jZScgfCB0cmFuc2xhdGV9fVxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cblxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlICpuZ0lmPVwiKGhhc0FyZWEkIHwgYXN5bmMpXCJcbiAgICAgIFtjaGVja2VkXT1cImRpc3BsYXlBcmVhc1wiXG4gICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXG4gICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlRGlzcGxheUFyZWFzKCRldmVudC5jaGVja2VkKVwiPlxuICAgICAge3snaWdvLmdlby5tZWFzdXJlLnRvZ2dsZURpc3BsYXlBcmVhcycgfCB0cmFuc2xhdGV9fVxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cblxuICAgIDxtYXQtZGl2aWRlciAqbmdJZj1cIihoYXNBcmVhJCB8IGFzeW5jKVwiPjwvbWF0LWRpdmlkZXI+XG5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgW2NoZWNrZWRdPVwibWVhc3VyZVVuaXRzQXV0b1wiXG4gICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXG4gICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlTWVhc3VyZVVuaXRzQXV0bygkZXZlbnQuY2hlY2tlZClcIj5cbiAgICAgIHt7J2lnby5nZW8ubWVhc3VyZS50b2dnbGVBdXRvVW5pdHMnIHwgdHJhbnNsYXRlfX1cbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZWFzdXJlJCB8IGFzeW5jIGFzIG1lYXN1cmVcIj5cbiAgICA8aWdvLW1lYXN1cmVyLWl0ZW0gKm5nSWY9XCJhY3RpdmVNZWFzdXJlVHlwZSA9PT0gbWVhc3VyZVR5cGUuTGVuZ3RoIHx8IGFjdGl2ZU1lYXN1cmVUeXBlID09PSBtZWFzdXJlVHlwZS5BcmVhXCJcbiAgICAgIFttZWFzdXJlVHlwZV09XCJtZWFzdXJlVHlwZS5MZW5ndGhcIlxuICAgICAgW21lYXN1cmVVbml0XT1cIm1lYXN1cmVMZW5ndGhVbml0Lk1ldGVyc1wiXG4gICAgICBbbWVhc3VyZV09XCJtZWFzdXJlLmxlbmd0aFwiXG4gICAgICBbYXV0b109XCJtZWFzdXJlVW5pdHNBdXRvXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCIoYWN0aXZlTWVhc3VyZVR5cGUgPT09IG1lYXN1cmVUeXBlLkFyZWEgPyAnaWdvLmdlby5tZWFzdXJlLnBlcmltZXRlcicgOiAnaWdvLmdlby5tZWFzdXJlLmxlbmd0aCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgIChtZWFzdXJlVW5pdENoYW5nZSk9XCJvbkxlbmd0aFVuaXRDaGFuZ2UoJGV2ZW50KVwiPlxuICAgIDwvaWdvLW1lYXN1cmVyLWl0ZW0+XG5cbiAgICA8aWdvLW1lYXN1cmVyLWl0ZW0gKm5nSWY9XCJhY3RpdmVNZWFzdXJlVHlwZSA9PT0gbWVhc3VyZVR5cGUuQXJlYVwiXG4gICAgICBbbWVhc3VyZVR5cGVdPVwibWVhc3VyZVR5cGUuQXJlYVwiXG4gICAgICBbbWVhc3VyZVVuaXRdPVwibWVhc3VyZUFyZWFVbml0LlNxdWFyZU1ldGVyc1wiXG4gICAgICBbbWVhc3VyZV09XCJtZWFzdXJlLmFyZWFcIlxuICAgICAgW2F1dG9dPVwibWVhc3VyZVVuaXRzQXV0b1wiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiJ2lnby5nZW8ubWVhc3VyZS5hcmVhJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAobWVhc3VyZVVuaXRDaGFuZ2UpPVwib25BcmVhVW5pdENoYW5nZSgkZXZlbnQpXCI+XG4gICAgPC9pZ28tbWVhc3VyZXItaXRlbT5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG1hdC1kaXZpZGVyICpuZ0lmPVwiKGhhc0xpbmUkIHwgYXN5bmMpIHx8IChoYXNBcmVhJCB8IGFzeW5jKVwiPjwvbWF0LWRpdmlkZXI+XG5cbiAgPGRpdiBjbGFzcz1cIm1lYXN1cmUtc3RvcmUtYnV0dG9uc1wiPlxuICAgIDxidXR0b24gKm5nSWY9XCIoaGFzTGluZSQgfCBhc3luYykgfHwgKGhhc0FyZWEkIHwgYXN5bmMpXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubWVhc3VyZS5hY3Rpb25iYXIuY2FsY3VsYXRlLnRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtkaXNhYmxlZF09XCIoc2VsZWN0ZWRGZWF0dXJlcyQgfCBhc3luYykubGVuZ3RoID09PSAwXCJcbiAgICAgIGNvbG9yPVwiYWNjZW50XCJcbiAgICAgIChjbGljayk9XCJvbkNhbGN1bGF0ZUNsaWNrKClcIj5cbiAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiY2FsY3VsYXRvclwiPjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uICpuZ0lmPVwiKGhhc0xpbmUkIHwgYXN5bmMpIHx8IChoYXNBcmVhJCB8IGFzeW5jKVwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLm1lYXN1cmUuYWN0aW9uYmFyLmRlbGV0ZS50b29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiKHNlbGVjdGVkRmVhdHVyZXMkIHwgYXN5bmMpLmxlbmd0aCA9PT0gMFwiXG4gICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlQ2xpY2soKVwiPlxuICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJkZWxldGVcIj48L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLWJ1dHRvblxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5tZWFzdXJlLmFjdGlvbmJhci5tb2RpZnkudG9vbHRpcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgW2Rpc2FibGVkXT1cIihzZWxlY3RlZEZlYXR1cmVzJCB8IGFzeW5jKS5sZW5ndGggIT09IDFcIlxuICAgICAgKGNsaWNrKT1cIm9uTW9kaWZ5Q2xpY2soKVwiPlxuICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJlZGl0XCI+PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbi0tPlxuICA8L2Rpdj5cblxuICA8aWdvLWVudGl0eS10YWJsZVxuICAgICN0YWJsZVxuICAgIGNsYXNzPVwidGFibGUtY29tcGFjdFwiXG4gICAgW3N0b3JlXT1cInN0b3JlXCJcbiAgICBbdGVtcGxhdGVdPVwidGFibGVUZW1wbGF0ZVwiPlxuICA8L2lnby1lbnRpdHktdGFibGU+XG48L2Rpdj5cbiJdfQ==
|