@igo2/geo 18.0.0-next.8 → 18.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +4 -6
- package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +13 -10
- package/esm2022/lib/datasource/shared/capabilities.service.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +9 -1
- package/esm2022/lib/datasource/shared/datasources/carto-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +4 -1
- package/esm2022/lib/datasource/shared/datasources/osm-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +8 -1
- package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +1 -1
- package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +151 -102
- package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +177 -83
- package/esm2022/lib/directions/directions-results/directions-results.component.mjs +93 -44
- package/esm2022/lib/directions/directions-sources/directions-source.mjs +1 -1
- package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +1 -1
- package/esm2022/lib/directions/directions.component.mjs +55 -31
- package/esm2022/lib/directions/shared/directions.enum.mjs +51 -7
- package/esm2022/lib/directions/shared/directions.interface.mjs +1 -1
- package/esm2022/lib/directions/shared/directions.service.mjs +122 -96
- package/esm2022/lib/directions/shared/directions.utils.mjs +281 -318
- package/esm2022/lib/directions/shared/store.mjs +2 -2
- package/esm2022/lib/download/download-button/download-button.component.mjs +8 -20
- package/esm2022/lib/download/shared/download.service.mjs +1 -1
- package/esm2022/lib/draw/draw/draw-popup.component.mjs +1 -1
- package/esm2022/lib/draw/draw/draw.component.mjs +5 -12
- package/esm2022/lib/draw/shared/draw.utils.mjs +1 -1
- package/esm2022/lib/environment/environment.interface.mjs +1 -1
- package/esm2022/lib/feature/feature-details/feature-details.component.mjs +2 -2
- package/esm2022/lib/feature/shared/feature-store.utils.mjs +7 -6
- package/esm2022/lib/feature/shared/feature.interfaces.mjs +1 -1
- package/esm2022/lib/feature/shared/store.mjs +1 -1
- package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +3 -3
- package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +7 -4
- package/esm2022/lib/feature/shared/strategies/selection.mjs +5 -4
- package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +3 -3
- package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +2 -2
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +5 -3
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +1 -1
- package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +8 -1
- package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +1 -1
- package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +2 -8
- package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +2 -8
- package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +2 -2
- package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +13 -10
- package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +2 -2
- package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +4 -2
- package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +5 -16
- package/esm2022/lib/import-export/export-button/export-button.component.mjs +4 -17
- package/esm2022/lib/import-export/import-export/import-export.component.mjs +23 -12
- package/esm2022/lib/import-export/shared/export.service.mjs +7 -4
- package/esm2022/lib/import-export/shared/import.utils.mjs +3 -3
- package/esm2022/lib/layer/index.mjs +10 -5
- package/esm2022/lib/layer/layer-group/index.mjs +2 -0
- package/esm2022/lib/layer/layer-group/layer-group.component.mjs +103 -0
- package/esm2022/lib/layer/layer-item/layer-item.component.mjs +61 -128
- package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +5 -8
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +5 -6
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +14 -21
- package/esm2022/lib/layer/layer-list/index.mjs +1 -3
- package/esm2022/lib/layer/layer-list/layer-list.component.mjs +176 -775
- package/esm2022/lib/layer/layer-list-tool/index.mjs +1 -2
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +51 -84
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +7 -2
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +56 -16
- package/esm2022/lib/layer/layer-search/index.mjs +2 -0
- package/esm2022/lib/layer/layer-search/layer-search.component.mjs +65 -0
- package/esm2022/lib/layer/layer-unavailable/index.mjs +3 -0
- package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +25 -0
- package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +35 -0
- package/esm2022/lib/layer/layer-viewer/index.mjs +3 -0
- package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +226 -0
- package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +2 -0
- package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +2 -0
- package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +207 -0
- package/esm2022/lib/layer/layer-visibility-button/index.mjs +2 -0
- package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +83 -0
- package/esm2022/lib/layer/layer.module.mjs +51 -33
- package/esm2022/lib/layer/shared/index.mjs +2 -1
- package/esm2022/lib/layer/shared/layer-controller.mjs +316 -0
- package/esm2022/lib/layer/shared/layer-selection.mjs +38 -0
- package/esm2022/lib/layer/shared/layer.service.mjs +56 -14
- package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
- package/esm2022/lib/layer/shared/layers/any-layer.mjs +1 -1
- package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +1 -1
- package/esm2022/lib/layer/shared/layers/image-layer.mjs +8 -3
- package/esm2022/lib/layer/shared/layers/index.mjs +6 -1
- package/esm2022/lib/layer/shared/layers/layer-base.mjs +199 -0
- package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/layer-group.mjs +120 -0
- package/esm2022/lib/layer/shared/layers/layer.interface.mjs +1 -11
- package/esm2022/lib/layer/shared/layers/layer.mjs +113 -113
- package/esm2022/lib/layer/shared/layers/linked/index.mjs +4 -0
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +12 -0
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +242 -0
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +70 -0
- package/esm2022/lib/layer/shared/layers/tile-layer.mjs +8 -3
- package/esm2022/lib/layer/shared/layers/vector-layer.mjs +9 -3
- package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +8 -3
- package/esm2022/lib/layer/utils/layer.utils.mjs +47 -1
- package/esm2022/lib/layer/utils/outputLegend.mjs +5 -1
- package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +3 -3
- package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +8 -6
- package/esm2022/lib/map/map-center/map-center.component.mjs +1 -2
- package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +1 -1
- package/esm2022/lib/map/shared/controllers/view.mjs +1 -1
- package/esm2022/lib/map/shared/hover-feature.directive.mjs +1 -9
- package/esm2022/lib/map/shared/linkedLayers.utils.mjs +113 -123
- package/esm2022/lib/map/shared/map.abstract.mjs +4 -3
- package/esm2022/lib/map/shared/map.mjs +7 -243
- package/esm2022/lib/map/shared/map.service.mjs +1 -1
- package/esm2022/lib/map/shared/map.utils.mjs +3 -3
- package/esm2022/lib/map/shared/mapOffline.directive.mjs +9 -5
- package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +1 -3
- package/esm2022/lib/map/utils/index.mjs +2 -0
- package/esm2022/lib/map/utils/layer-watcher.mjs +45 -13
- package/esm2022/lib/measure/measurer/measurer.component.mjs +7 -25
- package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +6 -18
- package/esm2022/lib/offline/offline.provider.mjs +10 -11
- package/esm2022/lib/print/shared/print.service.mjs +3 -3
- package/esm2022/lib/query/shared/query.directive.mjs +9 -5
- package/esm2022/lib/query/shared/query.service.mjs +7 -7
- package/esm2022/lib/query/shared/query.utils.mjs +5 -1
- package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +15 -9
- package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +1 -10
- package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +1 -1
- package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +1 -1
- package/esm2022/lib/search/shared/sources/workspace.mjs +1 -1
- package/esm2022/lib/workspace/shared/edition-workspace.mjs +6 -4
- package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +19 -17
- package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +17 -2
- package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +22 -4
- package/esm2022/lib/workspace/shared/workspace.utils.mjs +6 -3
- package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +2 -2
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +6 -2
- package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +4 -3
- package/fesm2022/igo2-geo.mjs +22502 -21440
- package/fesm2022/igo2-geo.mjs.map +1 -1
- package/lib/datasource/shared/capabilities.service.d.ts +7 -2
- package/lib/datasource/shared/datasources/any-datasource.interface.d.ts +1 -0
- package/lib/datasource/shared/datasources/arcgisrest-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/carto-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/carto-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/cluster-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/cluster-datasource.interface.d.ts +0 -1
- package/lib/datasource/shared/datasources/datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/datasource.interface.d.ts +1 -2
- package/lib/datasource/shared/datasources/feature-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/feature-datasource.interface.d.ts +0 -3
- package/lib/datasource/shared/datasources/imagearcgisrest-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/mvt-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/mvt-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/osm-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/tilearcgisrest-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/tiledebug-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/wfs-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/wfs-datasource.interface.d.ts +3 -4
- package/lib/datasource/shared/datasources/wms-datasource.d.ts +1 -0
- package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +6 -6
- package/lib/datasource/shared/datasources/wmts-datasource.interface.d.ts +0 -2
- package/lib/datasource/shared/datasources/xyz-datasource.interface.d.ts +0 -2
- package/lib/directions/directions-buttons/directions-buttons.component.d.ts +57 -20
- package/lib/directions/directions-inputs/directions-inputs.component.d.ts +115 -13
- package/lib/directions/directions-results/directions-results.component.d.ts +50 -16
- package/lib/directions/directions-sources/directions-source.d.ts +2 -2
- package/lib/directions/directions-sources/osrm-directions-source.d.ts +2 -2
- package/lib/directions/directions.component.d.ts +5 -5
- package/lib/directions/shared/directions.enum.d.ts +42 -1
- package/lib/directions/shared/directions.interface.d.ts +50 -25
- package/lib/directions/shared/directions.service.d.ts +46 -8
- package/lib/directions/shared/directions.utils.d.ts +102 -23
- package/lib/directions/shared/store.d.ts +3 -3
- package/lib/download/download-button/download-button.component.d.ts +4 -8
- package/lib/download/shared/download.service.d.ts +1 -1
- package/lib/draw/draw/draw.component.d.ts +2 -2
- package/lib/draw/shared/draw.utils.d.ts +2 -1
- package/lib/environment/environment.interface.d.ts +2 -0
- package/lib/feature/shared/feature-store.utils.d.ts +1 -1
- package/lib/feature/shared/feature.interfaces.d.ts +1 -1
- package/lib/feature/shared/store.d.ts +1 -1
- package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +1 -1
- package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +1 -1
- package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +1 -1
- package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +2 -2
- package/lib/filter/shared/filterable-datasource.pipe.d.ts +2 -2
- package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +3 -3
- package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +3 -5
- package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +3 -5
- package/lib/filter/time-filter-button/time-filter-button.component.d.ts +1 -1
- package/lib/filter/time-filter-form/time-filter-form.component.d.ts +5 -5
- package/lib/filter/time-filter-item/time-filter-item.component.d.ts +1 -1
- package/lib/filter/time-filter-list/time-filter-list.component.d.ts +2 -7
- package/lib/import-export/export-button/export-button.component.d.ts +3 -7
- package/lib/import-export/import-export/import-export.component.d.ts +1 -2
- package/lib/import-export/shared/export.service.d.ts +2 -2
- package/lib/layer/index.d.ts +9 -4
- package/lib/layer/layer-group/index.d.ts +1 -0
- package/lib/layer/layer-group/layer-group.component.d.ts +30 -0
- package/lib/layer/layer-item/layer-item.component.d.ts +19 -38
- package/lib/layer/layer-legend/layer-legend.component.d.ts +2 -5
- package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +6 -7
- package/lib/layer/layer-list/index.d.ts +0 -2
- package/lib/layer/layer-list/layer-list.component.d.ts +51 -123
- package/lib/layer/layer-list-tool/index.d.ts +0 -1
- package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +19 -26
- package/lib/layer/layer-list-tool/layer-list-tool.interface.d.ts +5 -1
- package/lib/layer/layer-list-tool/layer-list-tool.service.d.ts +9 -8
- package/lib/layer/layer-search/index.d.ts +1 -0
- package/lib/layer/layer-search/layer-search.component.d.ts +16 -0
- package/lib/layer/layer-unavailable/index.d.ts +2 -0
- package/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.d.ts +10 -0
- package/lib/layer/layer-unavailable/layer-unavailable.component.d.ts +11 -0
- package/lib/layer/layer-viewer/index.d.ts +2 -0
- package/lib/layer/layer-viewer/layer-viewer.component.d.ts +52 -0
- package/lib/layer/layer-viewer/layer-viewer.interface.d.ts +22 -0
- package/lib/layer/layer-viewer-bottom-actions/index.d.ts +1 -0
- package/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.d.ts +44 -0
- package/lib/layer/layer-visibility-button/index.d.ts +1 -0
- package/lib/layer/layer-visibility-button/layer-visibility-button.component.d.ts +22 -0
- package/lib/layer/layer.module.d.ts +18 -6
- package/lib/layer/shared/index.d.ts +1 -0
- package/lib/layer/shared/layer-controller.d.ts +81 -0
- package/lib/layer/shared/layer-selection.d.ts +14 -0
- package/lib/layer/shared/layer.service.d.ts +12 -3
- package/lib/layer/shared/layers/any-layer.d.ts +3 -6
- package/lib/layer/shared/layers/any-layer.interface.d.ts +8 -6
- package/lib/layer/shared/layers/image-layer.d.ts +5 -2
- package/lib/layer/shared/layers/image-layer.interface.d.ts +1 -4
- package/lib/layer/shared/layers/index.d.ts +5 -0
- package/lib/layer/shared/layers/layer-base.d.ts +75 -0
- package/lib/layer/shared/layers/layer-group.d.ts +32 -0
- package/lib/layer/shared/layers/layer-group.interface.d.ts +8 -0
- package/lib/layer/shared/layers/layer.d.ts +27 -44
- package/lib/layer/shared/layers/layer.interface.d.ts +23 -41
- package/lib/layer/shared/layers/linked/index.d.ts +3 -0
- package/lib/layer/shared/layers/linked/linked-layer.d.ts +35 -0
- package/lib/layer/shared/layers/linked/linked-layer.interface.d.ts +32 -0
- package/lib/layer/shared/layers/linked/linked-layer.utils.d.ts +9 -0
- package/lib/layer/shared/layers/tile-layer.d.ts +5 -2
- package/lib/layer/shared/layers/vector-layer.d.ts +7 -3
- package/lib/layer/shared/layers/vectortile-layer.d.ts +5 -2
- package/lib/layer/utils/layer.utils.d.ts +12 -2
- package/lib/layer/utils/outputLegend.d.ts +2 -2
- package/lib/map/shared/controllers/geolocation.interface.d.ts +2 -1
- package/lib/map/shared/hover-feature.directive.d.ts +0 -1
- package/lib/map/shared/linkedLayers.utils.d.ts +13 -17
- package/lib/map/shared/map.abstract.d.ts +12 -29
- package/lib/map/shared/map.d.ts +10 -85
- package/lib/map/shared/map.service.d.ts +1 -1
- package/lib/map/shared/map.utils.d.ts +5 -3
- package/lib/map/utils/index.d.ts +1 -0
- package/lib/map/utils/layer-watcher.d.ts +18 -8
- package/lib/measure/measurer/measurer.component.d.ts +0 -8
- package/lib/metadata/metadata-button/metadata-button.component.d.ts +3 -7
- package/lib/offline/offline.provider.d.ts +1 -1
- package/lib/query/shared/query.service.d.ts +1 -1
- package/lib/query/shared/query.utils.d.ts +2 -1
- package/lib/search/search-results/search-results-add-button.component.d.ts +1 -1
- package/lib/search/shared/search-pointer-summary.directive.d.ts +0 -1
- package/lib/search/shared/sources/cadastre.providers.d.ts +1 -1
- package/lib/search/shared/sources/coordinates.providers.d.ts +1 -1
- package/lib/search/shared/sources/icherche.providers.d.ts +1 -1
- package/lib/search/shared/sources/ilayer.interfaces.d.ts +1 -1
- package/lib/search/shared/sources/ilayer.providers.d.ts +1 -1
- package/lib/search/shared/sources/nominatim.providers.d.ts +1 -1
- package/lib/search/shared/sources/storedqueries.providers.d.ts +2 -2
- package/lib/search/shared/sources/workspace.interfaces.d.ts +1 -1
- package/lib/search/shared/sources/workspace.providers.d.ts +1 -1
- package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +1 -1
- package/locale/en.geo.json +106 -89
- package/locale/fr.geo.json +105 -89
- package/package.json +5 -5
- package/src/geo-theme.scss +1 -1
- package/src/lib/directions/directions-inputs/directions-inputs.theming.scss +21 -0
- package/src/lib/directions/directions.theming.scss +2 -0
- package/src/lib/layer/layer-group/layer-group.theme.scss +28 -0
- package/src/lib/layer/layer-item/layer-item.theme.scss +12 -9
- package/src/lib/layer/layer-legend/layer-legend.theme.scss +30 -0
- package/src/lib/layer/layer-list/layer-list.theme.scss +50 -0
- package/src/lib/layer/layer-unavailable/layer-unavailable.theme.scss +19 -0
- package/src/lib/layer/layer-viewer/_layer-viewer.theme.scss +16 -0
- package/src/lib/layer/layer-visibility-button/layer-visibility-button.theme.scss +27 -0
- package/src/lib/layer/layer.theming.scss +14 -3
- package/esm2022/lib/layer/layer-list/layer-list-binding.directive.mjs +0 -70
- package/esm2022/lib/layer/layer-list/layer-list.enum.mjs +0 -19
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +0 -7
- package/lib/layer/layer-list/layer-list-binding.directive.d.ts +0 -19
- package/lib/layer/layer-list/layer-list.enum.d.ts +0 -15
- package/lib/layer/layer-list-tool/layer-list-tool.enum.d.ts +0 -5
- package/src/lib/layer/layer-legend/layer-legend.theming.scss +0 -10
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { FlatTreeControl } from '@angular/cdk/tree';
|
|
1
2
|
import { AsyncPipe, NgFor, NgIf, NgTemplateOutlet } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component,
|
|
3
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
3
4
|
import { FormsModule } from '@angular/forms';
|
|
4
5
|
import { MatBadgeModule } from '@angular/material/badge';
|
|
5
6
|
import { MatButtonModule } from '@angular/material/button';
|
|
@@ -9,823 +10,223 @@ import { MatIconModule } from '@angular/material/icon';
|
|
|
9
10
|
import { MatMenuModule } from '@angular/material/menu';
|
|
10
11
|
import { MatSliderModule } from '@angular/material/slider';
|
|
11
12
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
13
|
+
import { MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule } from '@angular/material/tree';
|
|
14
|
+
import { TreeDragDropDirective } from '@igo2/common/drag-drop';
|
|
15
|
+
import { IgoIconComponent, VECTOR_SQUARE_ICON } from '@igo2/common/icon';
|
|
12
16
|
import { ListComponent, ListItemDirective } from '@igo2/common/list';
|
|
13
17
|
import { PanelComponent } from '@igo2/common/panel';
|
|
14
18
|
import { IgoLanguageModule } from '@igo2/core/language';
|
|
15
|
-
import
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
19
|
-
import {
|
|
20
|
-
import { IgoMap } from '../../map/shared/map';
|
|
21
|
-
import { LayerItemComponent } from '../layer-item/layer-item.component';
|
|
22
|
-
import { LayerListToolComponent } from '../layer-list-tool/layer-list-tool.component';
|
|
23
|
-
import { LinkedProperties } from '../shared/layers/layer.interface';
|
|
24
|
-
import { LayerListControlsEnum, LayerListDisplacement } from './layer-list.enum';
|
|
25
|
-
import { LayerListSelectVisibleEnum } from './layer-list.enum';
|
|
19
|
+
import { MessageService } from '@igo2/core/message';
|
|
20
|
+
import { LayerGroupComponent } from '../layer-group';
|
|
21
|
+
import { LayerItemComponent } from '../layer-item';
|
|
22
|
+
import { LayerListToolComponent } from '../layer-list-tool';
|
|
23
|
+
import { isLayerGroup, isLayerItem } from '../utils/layer.utils';
|
|
26
24
|
import * as i0 from "@angular/core";
|
|
27
|
-
import * as i1 from "@
|
|
28
|
-
import * as i2 from "@angular/material/
|
|
29
|
-
import * as i3 from "@angular/material/
|
|
30
|
-
import * as i4 from "@angular/material/
|
|
31
|
-
import * as i5 from "@angular/material/icon";
|
|
32
|
-
import * as i6 from "@angular/material/badge";
|
|
33
|
-
import * as i7 from "@angular/material/menu";
|
|
34
|
-
import * as i8 from "@angular/material/slider";
|
|
35
|
-
import * as i9 from "@angular/forms";
|
|
36
|
-
import * as i10 from "@ngx-translate/core";
|
|
37
|
-
// TODO: This class could use a clean up. Also, some methods could be moved ealsewhere
|
|
25
|
+
import * as i1 from "@igo2/core/message";
|
|
26
|
+
import * as i2 from "@angular/material/button";
|
|
27
|
+
import * as i3 from "@angular/material/icon";
|
|
28
|
+
import * as i4 from "@angular/material/tree";
|
|
38
29
|
export class LayerListComponent {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
hideSelectedLayers = true;
|
|
47
|
-
activeLayer$ = new BehaviorSubject(undefined);
|
|
48
|
-
layersChecked = [];
|
|
49
|
-
selection;
|
|
50
|
-
change$$;
|
|
51
|
-
layers$$;
|
|
52
|
-
layerItemChangeDetection$ = new BehaviorSubject(undefined);
|
|
53
|
-
templateLayerToolbar;
|
|
54
|
-
layersAreAllVisible = true;
|
|
55
|
-
ogcButton = true;
|
|
56
|
-
timeButton = true;
|
|
57
|
-
get map() {
|
|
58
|
-
return this._map;
|
|
59
|
-
}
|
|
60
|
-
set map(value) {
|
|
61
|
-
this._map = value;
|
|
62
|
-
}
|
|
63
|
-
_map;
|
|
64
|
-
set layers(value) {
|
|
65
|
-
this._layers = this.removeProblemLayerInList(value);
|
|
66
|
-
this.next();
|
|
30
|
+
messageService;
|
|
31
|
+
toggleOpacity = false;
|
|
32
|
+
isInit;
|
|
33
|
+
controller;
|
|
34
|
+
set layers(layers) {
|
|
35
|
+
this._layers = layers;
|
|
36
|
+
this.updateDatasource(layers ?? []);
|
|
67
37
|
}
|
|
68
38
|
get layers() {
|
|
69
39
|
return this._layers;
|
|
70
40
|
}
|
|
71
41
|
_layers;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
this.
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
set checkOpacity(opacity) {
|
|
164
|
-
for (const layer of this.layersChecked) {
|
|
165
|
-
layer.opacity = opacity / 100;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
get layerListDisplacement() {
|
|
169
|
-
return LayerListDisplacement;
|
|
170
|
-
}
|
|
171
|
-
toggleOpacity = false;
|
|
172
|
-
selectAllCheck;
|
|
173
|
-
selectAllCheck$ = new BehaviorSubject(undefined);
|
|
174
|
-
selectAllCheck$$;
|
|
175
|
-
constructor(elRef) {
|
|
176
|
-
this.elRef = elRef;
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Subscribe to the search term stream and trigger researches
|
|
180
|
-
* @internal
|
|
181
|
-
*/
|
|
182
|
-
ngOnInit() {
|
|
183
|
-
this.change$$ = this.change$
|
|
184
|
-
.pipe(debounce(() => {
|
|
185
|
-
return this.layers.length === 0 ? EMPTY : timer(50);
|
|
186
|
-
}))
|
|
187
|
-
.subscribe(() => {
|
|
188
|
-
this.showToolbar$.next(this.computeShowToolbar());
|
|
189
|
-
this.layers$.next(this.computeLayers(this.layers.slice(0)));
|
|
190
|
-
this.appliedFilterAndSort.emit({
|
|
191
|
-
keyword: this.keyword,
|
|
192
|
-
sortAlpha: this.sortAlpha,
|
|
193
|
-
onlyVisible: this.onlyVisible
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
this.selectAllCheck$$ = this.selectAllCheck$.subscribe((value) => {
|
|
197
|
-
this.selectAllCheck = value;
|
|
198
|
-
});
|
|
199
|
-
this.layers$$ = this.layers$.subscribe(() => {
|
|
200
|
-
if (this.layers) {
|
|
201
|
-
let checks = 0;
|
|
202
|
-
for (const layer of this.layers) {
|
|
203
|
-
layer.status$.subscribe((valStatus) => {
|
|
204
|
-
if (valStatus === 0) {
|
|
205
|
-
this.map.removeLayer(layer);
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
if (layer.options.active) {
|
|
209
|
-
this.activeLayer = layer;
|
|
210
|
-
this.layerTool = true;
|
|
211
|
-
}
|
|
212
|
-
if (layer.options.check) {
|
|
213
|
-
checks += 1;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
if (this.excludeBaseLayers) {
|
|
217
|
-
this.selectAllCheck =
|
|
218
|
-
checks ===
|
|
219
|
-
this.layers.filter((lay) => lay.baseLayer !== true && lay.showInLayerList).length
|
|
220
|
-
? true
|
|
221
|
-
: false;
|
|
222
|
-
}
|
|
223
|
-
else {
|
|
224
|
-
this.selectAllCheck =
|
|
225
|
-
checks === this.layers.filter((lay) => lay.showInLayerList).length
|
|
226
|
-
? true
|
|
227
|
-
: false;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
ngOnDestroy() {
|
|
233
|
-
this.change$$.unsubscribe();
|
|
234
|
-
this.selectAllCheck$$.unsubscribe();
|
|
235
|
-
this.layers$$.unsubscribe();
|
|
236
|
-
}
|
|
237
|
-
activeLayerExtentIsValid(layer) {
|
|
238
|
-
let valid = false;
|
|
239
|
-
if (layer.options.showButtonZoomToExtent === false) {
|
|
240
|
-
return false;
|
|
241
|
-
}
|
|
242
|
-
const layerExtent = layer.options.extent;
|
|
243
|
-
const maxLayerZoomExtent = this.map.viewController.maxLayerZoomExtent;
|
|
244
|
-
if (layerExtent) {
|
|
245
|
-
if (maxLayerZoomExtent) {
|
|
246
|
-
valid = olextent.containsExtent(maxLayerZoomExtent, layerExtent);
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
valid = true;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
return valid;
|
|
253
|
-
}
|
|
254
|
-
activeLayersExtentAreValid(layers) {
|
|
255
|
-
let valid = false;
|
|
256
|
-
const layersExtent = olextent.createEmpty();
|
|
257
|
-
const maxLayerZoomExtent = this.map.viewController.maxLayerZoomExtent;
|
|
258
|
-
for (const layer of layers) {
|
|
259
|
-
const layerExtent = layer.options.extent;
|
|
260
|
-
if (layerExtent && !layerExtent.includes(Infinity)) {
|
|
261
|
-
olextent.extend(layersExtent, layerExtent);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
if (!olextent.isEmpty(layersExtent)) {
|
|
265
|
-
if (maxLayerZoomExtent) {
|
|
266
|
-
valid = olextent.containsExtent(maxLayerZoomExtent, layersExtent);
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
valid = true;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
return valid;
|
|
273
|
-
}
|
|
274
|
-
zoomLayerExtents(layer) {
|
|
275
|
-
this.map.viewController.zoomToExtent(layer.options.extent);
|
|
276
|
-
}
|
|
277
|
-
zoomLayersExtents(layers) {
|
|
278
|
-
const layersExtent = olextent.createEmpty();
|
|
279
|
-
for (const layer of layers) {
|
|
280
|
-
const layerExtent = layer.options.extent;
|
|
281
|
-
if (layerExtent) {
|
|
282
|
-
olextent.extend(layersExtent, layerExtent);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
this.map.viewController.zoomToExtent(layersExtent);
|
|
286
|
-
}
|
|
287
|
-
changeOpacity(event) {
|
|
288
|
-
this.opacity = event.value;
|
|
289
|
-
}
|
|
290
|
-
clearKeyword() {
|
|
291
|
-
this.keyword = undefined;
|
|
292
|
-
}
|
|
293
|
-
getLowerLayer() {
|
|
294
|
-
return this.layers
|
|
295
|
-
.filter((l) => !l.baseLayer)
|
|
296
|
-
.reduce((prev, current) => {
|
|
297
|
-
return prev.zIndex < current.zIndex ? prev : current;
|
|
298
|
-
}, { zIndex: undefined, id: undefined });
|
|
299
|
-
}
|
|
300
|
-
isLowerBaselayer(layer) {
|
|
301
|
-
const index = this.layers.findIndex((lay) => layer.id === lay.id);
|
|
302
|
-
if (this.layers &&
|
|
303
|
-
this.layers[index + 1] &&
|
|
304
|
-
this.layers[index + 1].baseLayer === true) {
|
|
305
|
-
return true;
|
|
306
|
-
}
|
|
307
|
-
return false;
|
|
308
|
-
}
|
|
309
|
-
getUpperLayer() {
|
|
310
|
-
return this.layers
|
|
311
|
-
.filter((l) => !l.baseLayer)
|
|
312
|
-
.reduce((prev, current) => {
|
|
313
|
-
return prev.zIndex > current.zIndex ? prev : current;
|
|
314
|
-
}, { zIndex: undefined, id: undefined });
|
|
315
|
-
}
|
|
316
|
-
isUpperBaselayer(layer) {
|
|
317
|
-
const index = this.layers.findIndex((lay) => layer.id === lay.id);
|
|
318
|
-
if (this.layers &&
|
|
319
|
-
this.layers[index - 1] &&
|
|
320
|
-
this.layers[index - 1].baseLayer === true) {
|
|
321
|
-
return true;
|
|
322
|
-
}
|
|
323
|
-
return false;
|
|
324
|
-
}
|
|
325
|
-
moveActiveLayer(activeLayer, actiontype, fromUi = false) {
|
|
326
|
-
const sortedLayersToMove = [];
|
|
327
|
-
getRootParentByProperty(this.map, activeLayer, LinkedProperties.ZINDEX);
|
|
328
|
-
let rootParentByProperty = getRootParentByProperty(this.map, activeLayer, LinkedProperties.ZINDEX);
|
|
329
|
-
if (!rootParentByProperty) {
|
|
330
|
-
rootParentByProperty = activeLayer;
|
|
331
|
-
}
|
|
332
|
-
const layersToMove = [rootParentByProperty];
|
|
333
|
-
getAllChildLayersByProperty(this.map, rootParentByProperty, layersToMove, LinkedProperties.ZINDEX);
|
|
334
|
-
this.layers.map((layer) => {
|
|
335
|
-
if (layersToMove.indexOf(layer) !== -1) {
|
|
336
|
-
sortedLayersToMove.push(layer);
|
|
337
|
-
}
|
|
338
|
-
});
|
|
339
|
-
if (actiontype === LayerListDisplacement.Raise) {
|
|
340
|
-
this.raiseLayers(sortedLayersToMove, fromUi);
|
|
341
|
-
}
|
|
342
|
-
else if (actiontype === LayerListDisplacement.Lower) {
|
|
343
|
-
this.lowerLayers(sortedLayersToMove, fromUi);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
/*
|
|
347
|
-
* For selection mode disabled attribute
|
|
348
|
-
*/
|
|
349
|
-
raisableLayers(layers) {
|
|
350
|
-
let response = false;
|
|
351
|
-
let base = 0;
|
|
352
|
-
for (const layer of layers) {
|
|
353
|
-
const mapIndex = this.layers.findIndex((lay) => layer.id === lay.id);
|
|
354
|
-
const currentLayer = this.layers[mapIndex];
|
|
355
|
-
if (currentLayer.baseLayer) {
|
|
356
|
-
base += 1;
|
|
357
|
-
}
|
|
358
|
-
const previousLayer = this.layers[mapIndex - 1];
|
|
359
|
-
if (previousLayer &&
|
|
360
|
-
previousLayer.baseLayer !== true &&
|
|
361
|
-
!layers.find((lay) => previousLayer.id === lay.id) &&
|
|
362
|
-
currentLayer.baseLayer !== true) {
|
|
363
|
-
response = true;
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
if ((this.layersChecked.length === 1 && this.layersChecked[0].baseLayer) ||
|
|
367
|
-
base === this.layersChecked.length) {
|
|
368
|
-
response = false;
|
|
369
|
-
}
|
|
370
|
-
return response;
|
|
371
|
-
}
|
|
372
|
-
/*
|
|
373
|
-
* When multiple layers is selected but some may be allow to move
|
|
374
|
-
*/
|
|
375
|
-
raisableLayer(index) {
|
|
376
|
-
if (index < 1) {
|
|
377
|
-
return false;
|
|
378
|
-
}
|
|
379
|
-
if (this.layers[index - 1].options.check) {
|
|
380
|
-
return this.raisableLayer(index - 1);
|
|
381
|
-
}
|
|
382
|
-
return true;
|
|
383
|
-
}
|
|
384
|
-
raiseLayers(layers, fromUi = true) {
|
|
385
|
-
const layersToRaise = [];
|
|
386
|
-
for (const layer of layers) {
|
|
387
|
-
const index = this.layers.findIndex((lay) => lay.id === layer.id);
|
|
388
|
-
if (this.raisableLayer(index)) {
|
|
389
|
-
layersToRaise.push(layer);
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
this.map.raiseLayers(layersToRaise);
|
|
393
|
-
if (fromUi) {
|
|
394
|
-
setTimeout(() => {
|
|
395
|
-
const checkItems = this.elRef.nativeElement.getElementsByClassName('mat-checkbox-checked');
|
|
396
|
-
const itemFocused = this.elRef.nativeElement.getElementsByClassName('igo-layer-item-focused');
|
|
397
|
-
let targetToScroll;
|
|
398
|
-
if (checkItems.length) {
|
|
399
|
-
targetToScroll = checkItems[0];
|
|
400
|
-
}
|
|
401
|
-
if (itemFocused.length) {
|
|
402
|
-
targetToScroll = itemFocused[0];
|
|
403
|
-
}
|
|
404
|
-
if (targetToScroll) {
|
|
405
|
-
scrollIntoView(targetToScroll, {
|
|
406
|
-
scrollMode: 'if-needed',
|
|
407
|
-
behavior: 'smooth',
|
|
408
|
-
block: 'end',
|
|
409
|
-
inline: 'nearest'
|
|
410
|
-
});
|
|
411
|
-
}
|
|
412
|
-
}, 100);
|
|
42
|
+
isDesktop;
|
|
43
|
+
isDragDropDisabled;
|
|
44
|
+
selectAll;
|
|
45
|
+
viewerOptions;
|
|
46
|
+
activeChange = new EventEmitter();
|
|
47
|
+
_transformer = (layer, level) => {
|
|
48
|
+
return {
|
|
49
|
+
id: layer.id || layer.options.name,
|
|
50
|
+
isGroup: !!isLayerGroup(layer),
|
|
51
|
+
descendantLevels: isLayerGroup(layer)
|
|
52
|
+
? layer.descendantsLevel
|
|
53
|
+
: undefined,
|
|
54
|
+
level: level,
|
|
55
|
+
data: layer,
|
|
56
|
+
disabled: false
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
treeControl = new FlatTreeControl((node) => node.level, (node) => node.isGroup);
|
|
60
|
+
treeFlattener = new MatTreeFlattener(this._transformer, (node) => node.level, (node) => node.isGroup, (node) => node.children
|
|
61
|
+
.filter((layer) => layer.showInLayerList)
|
|
62
|
+
.sort((a, b) => a.zIndex + b.zIndex));
|
|
63
|
+
dataSource;
|
|
64
|
+
constructor(messageService) {
|
|
65
|
+
this.messageService = messageService;
|
|
66
|
+
this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener, []);
|
|
67
|
+
}
|
|
68
|
+
isGroup = (_, node) => node.isGroup;
|
|
69
|
+
isLayerGroup = isLayerGroup;
|
|
70
|
+
isLayerItem = isLayerItem;
|
|
71
|
+
isSelected = (layer) => this.controller.isSelected(layer);
|
|
72
|
+
isDescendantSelection = (layer) => this.controller.isDescendantSelection(layer);
|
|
73
|
+
toggleActive(layer) {
|
|
74
|
+
const isSelected = this.controller.isSelected(layer);
|
|
75
|
+
this.controller.clearSelection();
|
|
76
|
+
if (!isSelected) {
|
|
77
|
+
this.controller.select(layer);
|
|
78
|
+
}
|
|
79
|
+
this.activeChange.emit(layer);
|
|
80
|
+
}
|
|
81
|
+
handleSelect(checked, layer) {
|
|
82
|
+
checked ? this.controller.select(layer) : this.controller.deselect(layer);
|
|
83
|
+
}
|
|
84
|
+
getLayerType(layer) {
|
|
85
|
+
return layer.type === 'raster'
|
|
86
|
+
? 'raster'
|
|
87
|
+
: layer.id.includes('measure')
|
|
88
|
+
? 'measure'
|
|
89
|
+
: layer.id.includes('draw')
|
|
90
|
+
? 'draw'
|
|
91
|
+
: 'vector';
|
|
92
|
+
}
|
|
93
|
+
getLayerIcon(layer) {
|
|
94
|
+
const type = this.getLayerType(layer);
|
|
95
|
+
return type === 'raster'
|
|
96
|
+
? layer.baseLayer
|
|
97
|
+
? 'wallpaper'
|
|
98
|
+
: 'image'
|
|
99
|
+
: type === 'measure'
|
|
100
|
+
? 'square_foot'
|
|
101
|
+
: type === 'draw'
|
|
102
|
+
? 'draw'
|
|
103
|
+
: VECTOR_SQUARE_ICON;
|
|
104
|
+
}
|
|
105
|
+
dropNode({ node, ref, position }) {
|
|
106
|
+
let nodesToDrop = [node.data];
|
|
107
|
+
if (this.controller.hasSelection) {
|
|
108
|
+
// The selection could contains data from the outside the TreeController
|
|
109
|
+
nodesToDrop = this.controller.selected.filter((layer) => !!this.findNodeByLayerId(layer.id));
|
|
110
|
+
}
|
|
111
|
+
if (node.isGroup) {
|
|
112
|
+
nodesToDrop = nodesToDrop.filter((nodeDrop) => !node.data.isDescendant(nodeDrop));
|
|
113
|
+
}
|
|
114
|
+
if (ref.isGroup) {
|
|
115
|
+
const isSelected = nodesToDrop.some((nodeDrop) => nodeDrop.id === ref.id);
|
|
116
|
+
if (isSelected) {
|
|
117
|
+
nodesToDrop = nodesToDrop.filter((nodeDrop) => nodeDrop.id !== ref.id);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (!nodesToDrop.includes(node.data)) {
|
|
121
|
+
nodesToDrop.push(node.data);
|
|
122
|
+
}
|
|
123
|
+
switch (position) {
|
|
124
|
+
case 'above':
|
|
125
|
+
this.controller.moveAbove(ref.data, ...nodesToDrop);
|
|
126
|
+
break;
|
|
127
|
+
case 'inside':
|
|
128
|
+
this.controller.moveInside(ref.data, ...nodesToDrop);
|
|
129
|
+
break;
|
|
130
|
+
default:
|
|
131
|
+
this.controller.moveBelow(ref.data, ...nodesToDrop);
|
|
132
|
+
break;
|
|
413
133
|
}
|
|
414
134
|
}
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
*/
|
|
418
|
-
lowerableLayers(layers) {
|
|
419
|
-
let response = false;
|
|
420
|
-
let base = 0;
|
|
421
|
-
for (const layer of layers) {
|
|
422
|
-
const mapIndex = this.layers.findIndex((lay) => layer.id === lay.id);
|
|
423
|
-
const currentLayer = this.layers[mapIndex];
|
|
424
|
-
if (currentLayer.baseLayer) {
|
|
425
|
-
base += 1;
|
|
426
|
-
}
|
|
427
|
-
const nextLayer = this.layers[mapIndex + 1];
|
|
428
|
-
if (nextLayer &&
|
|
429
|
-
nextLayer.baseLayer !== true &&
|
|
430
|
-
!layers.find((lay) => nextLayer.id === lay.id)) {
|
|
431
|
-
response = true;
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
if ((this.layersChecked.length === 1 && this.layersChecked[0].baseLayer) ||
|
|
435
|
-
base === this.layersChecked.length) {
|
|
436
|
-
response = false;
|
|
437
|
-
}
|
|
438
|
-
return response;
|
|
135
|
+
dropNodeError(details) {
|
|
136
|
+
this.messageService.alert(details.message, 'igo.geo.layer.layer', null, details.params);
|
|
439
137
|
}
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
lowerableLayer(index) {
|
|
444
|
-
if (index >
|
|
445
|
-
this.layers.filter((lay) => lay.baseLayer !== true).length - 2) {
|
|
446
|
-
return false;
|
|
447
|
-
}
|
|
448
|
-
if (this.layers[index + 1].options.check) {
|
|
449
|
-
return this.lowerableLayer(index + 1);
|
|
138
|
+
dragStart() {
|
|
139
|
+
if (this.viewerOptions.mode === 'selection') {
|
|
140
|
+
return;
|
|
450
141
|
}
|
|
451
|
-
|
|
142
|
+
this.controller.clearSelection();
|
|
452
143
|
}
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
for (const layer of layers) {
|
|
456
|
-
const index = this.layers.findIndex((lay) => lay.id === layer.id);
|
|
457
|
-
if (this.lowerableLayer(index)) {
|
|
458
|
-
layersToLower.push(layer);
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
this.map.lowerLayers(layersToLower);
|
|
462
|
-
if (fromUi) {
|
|
463
|
-
setTimeout(() => {
|
|
464
|
-
const checkItems = this.elRef.nativeElement.getElementsByClassName('mat-checkbox-checked');
|
|
465
|
-
const itemFocused = this.elRef.nativeElement.getElementsByClassName('igo-layer-item-focused');
|
|
466
|
-
let targetToScroll;
|
|
467
|
-
if (checkItems.length) {
|
|
468
|
-
targetToScroll = checkItems[checkItems.length - 1];
|
|
469
|
-
}
|
|
470
|
-
if (itemFocused.length) {
|
|
471
|
-
targetToScroll = itemFocused[0];
|
|
472
|
-
}
|
|
473
|
-
if (targetToScroll) {
|
|
474
|
-
scrollIntoView(targetToScroll, {
|
|
475
|
-
scrollMode: 'if-needed',
|
|
476
|
-
behavior: 'smooth',
|
|
477
|
-
block: 'end',
|
|
478
|
-
inline: 'nearest'
|
|
479
|
-
});
|
|
480
|
-
}
|
|
481
|
-
}, 100);
|
|
482
|
-
}
|
|
144
|
+
handleNodeToggle(node) {
|
|
145
|
+
node.data.expanded = this.treeControl.isExpanded(node);
|
|
483
146
|
}
|
|
484
|
-
|
|
485
|
-
this.
|
|
147
|
+
findNodeByLayerId(id) {
|
|
148
|
+
return this.treeControl.dataNodes.find((node) => node.id === id);
|
|
486
149
|
}
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
150
|
+
updateDatasource(layers) {
|
|
151
|
+
const expansionModel = this.treeControl.expansionModel;
|
|
152
|
+
this.dataSource.data = layers;
|
|
153
|
+
this.isInit
|
|
154
|
+
? this.restoreModel(expansionModel, (node) => this.treeControl.expand(node))
|
|
155
|
+
: this.expandGroup(layers);
|
|
156
|
+
if (!this.isInit && layers.length) {
|
|
157
|
+
this.isInit = true;
|
|
494
158
|
}
|
|
495
|
-
return layersOut;
|
|
496
|
-
}
|
|
497
|
-
onKeywordChange(term) {
|
|
498
|
-
this.keyword = term;
|
|
499
159
|
}
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
this.onlyVisible = appliedFilter.onlyVisible;
|
|
503
|
-
this.sortAlpha = appliedFilter.sortAlpha;
|
|
504
|
-
}
|
|
505
|
-
filterLayers(layers) {
|
|
506
|
-
if (this.layerFilterAndSortOptions.showToolbar === LayerListControlsEnum.never) {
|
|
507
|
-
return layers;
|
|
508
|
-
}
|
|
509
|
-
if (!this.keyword && !this.onlyVisible) {
|
|
510
|
-
return layers;
|
|
511
|
-
}
|
|
512
|
-
const keepLayerIds = layers.map((layer) => layer.id);
|
|
160
|
+
/** Recursive */
|
|
161
|
+
expandGroup(layers) {
|
|
513
162
|
layers.forEach((layer) => {
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
const metadata = layerOptions.metadata || {};
|
|
517
|
-
const keywords = metadata.keywordList || [];
|
|
518
|
-
const layerKeywords = keywords.map((kw) => {
|
|
519
|
-
return kw.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
|
|
520
|
-
});
|
|
521
|
-
if (this.keyword && layer.title) {
|
|
522
|
-
const localKeyword = this.keyword
|
|
523
|
-
.normalize('NFD')
|
|
524
|
-
.replace(/[\u0300-\u036f]/g, '');
|
|
525
|
-
const layerTitle = layer.title
|
|
526
|
-
.normalize('NFD')
|
|
527
|
-
.replace(/[\u0300-\u036f]/g, '');
|
|
528
|
-
const dataSourceType = dataSourceOptions.type || '';
|
|
529
|
-
const keywordRegex = new RegExp(localKeyword, 'gi');
|
|
530
|
-
const keywordInList = layerKeywords.find((kw) => keywordRegex.test(kw)) !==
|
|
531
|
-
undefined;
|
|
532
|
-
if (!keywordRegex.test(layerTitle) &&
|
|
533
|
-
!(this.keyword.toLowerCase() === dataSourceType.toLowerCase()) &&
|
|
534
|
-
!keywordInList) {
|
|
535
|
-
const index = keepLayerIds.indexOf(layer.id);
|
|
536
|
-
if (index > -1) {
|
|
537
|
-
keepLayerIds.splice(index, 1);
|
|
538
|
-
}
|
|
539
|
-
}
|
|
163
|
+
if (!isLayerGroup(layer)) {
|
|
164
|
+
return;
|
|
540
165
|
}
|
|
541
|
-
if (
|
|
542
|
-
const
|
|
543
|
-
if (
|
|
544
|
-
|
|
166
|
+
if (layer.expanded) {
|
|
167
|
+
const node = this.findNodeByLayerId(layer.id);
|
|
168
|
+
if (!node) {
|
|
169
|
+
return;
|
|
545
170
|
}
|
|
171
|
+
this.treeControl.expand(node);
|
|
546
172
|
}
|
|
173
|
+
this.expandGroup(layer.children);
|
|
547
174
|
});
|
|
548
|
-
return layers.filter((layer) => keepLayerIds.indexOf(layer.id) !== -1);
|
|
549
|
-
}
|
|
550
|
-
sortLayersByZindex(layers) {
|
|
551
|
-
return layers.sort((layer1, layer2) => layer2.zIndex - layer1.zIndex);
|
|
552
175
|
}
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
176
|
+
restoreModel(model, callback) {
|
|
177
|
+
const ids = Array.from(model['_selection']).map((value) => value['id']);
|
|
178
|
+
model.clear();
|
|
179
|
+
this.treeControl.dataNodes.forEach((node) => {
|
|
180
|
+
if (model.isSelected(node) || ids.includes(node.id)) {
|
|
181
|
+
callback(node);
|
|
557
182
|
}
|
|
558
|
-
if (this.normalize(a.title) > this.normalize(b.title)) {
|
|
559
|
-
return 1;
|
|
560
|
-
}
|
|
561
|
-
return 0;
|
|
562
183
|
});
|
|
563
184
|
}
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
.normalize('NFD')
|
|
567
|
-
.replace(/[\u0300-\u036f]/g, '')
|
|
568
|
-
.toLowerCase();
|
|
569
|
-
}
|
|
570
|
-
computeShowToolbar() {
|
|
571
|
-
switch (this.layerFilterAndSortOptions.showToolbar) {
|
|
572
|
-
case LayerListControlsEnum.always:
|
|
573
|
-
return true;
|
|
574
|
-
case LayerListControlsEnum.never:
|
|
575
|
-
return false;
|
|
576
|
-
default:
|
|
577
|
-
if (this.layers.length >= this.thresholdToFilterAndSort ||
|
|
578
|
-
this.keyword ||
|
|
579
|
-
this.onlyVisible) {
|
|
580
|
-
return true;
|
|
581
|
-
}
|
|
582
|
-
return false;
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
toggleLayerTool(layer) {
|
|
586
|
-
this.toggleOpacity = false;
|
|
587
|
-
if (this.layerTool && layer === this.activeLayer) {
|
|
588
|
-
this.layerTool = false;
|
|
589
|
-
}
|
|
590
|
-
else {
|
|
591
|
-
this.layerTool = true;
|
|
592
|
-
}
|
|
593
|
-
for (const lay of this.layers) {
|
|
594
|
-
lay.options.active = false;
|
|
595
|
-
}
|
|
596
|
-
layer.options.active = true;
|
|
597
|
-
this.activeLayer = layer;
|
|
598
|
-
}
|
|
599
|
-
removeLayers(layers) {
|
|
600
|
-
if (layers && layers.length > 0) {
|
|
601
|
-
this.layersChecked = [];
|
|
602
|
-
for (const layer of layers) {
|
|
603
|
-
if (layer.options.removable !== false) {
|
|
604
|
-
layer.map.removeLayer(layer);
|
|
605
|
-
}
|
|
606
|
-
else {
|
|
607
|
-
this.layersChecked.push(layer);
|
|
608
|
-
}
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
else if (!layers && this.activeLayer.options.removable !== false) {
|
|
612
|
-
this.activeLayer.map.removeLayer(this.activeLayer);
|
|
613
|
-
this.layerTool = false;
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
toggleVisibility(layers) {
|
|
617
|
-
if (layers && layers.length > 0) {
|
|
618
|
-
for (const layer of layers) {
|
|
619
|
-
layer.visible = this.hideSelectedLayers;
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
this.layerItemChangeDetection$.next(true);
|
|
623
|
-
}
|
|
624
|
-
isLayerRemovable(layer) {
|
|
625
|
-
return layer.options.removable !== false;
|
|
626
|
-
}
|
|
627
|
-
isAllLayersRemovable(layers) {
|
|
628
|
-
return layers.every((l) => this.isLayerRemovable(l));
|
|
629
|
-
}
|
|
630
|
-
get statusSelectedLayersCheck() {
|
|
631
|
-
let statusSelectedLayers = LayerListSelectVisibleEnum.NULL;
|
|
632
|
-
let findTrue = false;
|
|
633
|
-
let findFalse = false;
|
|
634
|
-
if (this.layersChecked.length === 0) {
|
|
635
|
-
statusSelectedLayers = LayerListSelectVisibleEnum.NULL;
|
|
636
|
-
}
|
|
637
|
-
else {
|
|
638
|
-
statusSelectedLayers = LayerListSelectVisibleEnum.MIXED;
|
|
639
|
-
this.hideSelectedLayers = false;
|
|
640
|
-
for (const layer2 of this.layersChecked) {
|
|
641
|
-
if (layer2.visible === true) {
|
|
642
|
-
findTrue = true;
|
|
643
|
-
}
|
|
644
|
-
if (layer2.visible === false) {
|
|
645
|
-
findFalse = true;
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
if (findTrue === true && findFalse === false) {
|
|
649
|
-
statusSelectedLayers = LayerListSelectVisibleEnum.ALL_VISIBLE;
|
|
650
|
-
}
|
|
651
|
-
if (findTrue === false && findFalse === true) {
|
|
652
|
-
statusSelectedLayers = LayerListSelectVisibleEnum.ALL_HIDDEN;
|
|
653
|
-
this.hideSelectedLayers = true;
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
return statusSelectedLayers;
|
|
657
|
-
}
|
|
658
|
-
layersCheck(event) {
|
|
659
|
-
event.layer.options.check = event.check;
|
|
660
|
-
if (event.check === true) {
|
|
661
|
-
const eventMapIndex = this.layers.findIndex((layer) => event.layer.id === layer.id);
|
|
662
|
-
for (const layer of this.layersChecked) {
|
|
663
|
-
const mapIndex = this.layers.findIndex((lay) => layer.id === lay.id);
|
|
664
|
-
if (eventMapIndex < mapIndex) {
|
|
665
|
-
this.layersChecked.splice(this.layersChecked.findIndex((lay) => layer.id === lay.id), 0, event.layer);
|
|
666
|
-
if (this.excludeBaseLayers) {
|
|
667
|
-
if (this.layersChecked.length ===
|
|
668
|
-
this.layers.filter((lay) => lay.baseLayer !== true && lay.showInLayerList).length) {
|
|
669
|
-
this.selectAllCheck = true;
|
|
670
|
-
}
|
|
671
|
-
else {
|
|
672
|
-
this.selectAllCheck = false;
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
else if (!this.excludeBaseLayers) {
|
|
676
|
-
if (this.layersChecked.length ===
|
|
677
|
-
this.layers.filter((lay) => lay.showInLayerList).length) {
|
|
678
|
-
this.selectAllCheck = true;
|
|
679
|
-
}
|
|
680
|
-
else {
|
|
681
|
-
this.selectAllCheck = false;
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
return;
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
this.layersChecked.push(event.layer);
|
|
688
|
-
}
|
|
689
|
-
else {
|
|
690
|
-
const index = this.layersChecked.findIndex((layer) => event.layer.id === layer.id);
|
|
691
|
-
this.layersChecked.splice(index, 1);
|
|
692
|
-
}
|
|
693
|
-
if (this.excludeBaseLayers) {
|
|
694
|
-
if (this.layersChecked.length ===
|
|
695
|
-
this.layers.filter((lay) => lay.baseLayer !== true && lay.showInLayerList).length) {
|
|
696
|
-
this.selectAllCheck = true;
|
|
697
|
-
}
|
|
698
|
-
else {
|
|
699
|
-
this.selectAllCheck = false;
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
else if (!this.excludeBaseLayers) {
|
|
703
|
-
if (this.layersChecked.length ===
|
|
704
|
-
this.layers.filter((lay) => lay.showInLayerList).length) {
|
|
705
|
-
this.selectAllCheck = true;
|
|
706
|
-
}
|
|
707
|
-
else {
|
|
708
|
-
this.selectAllCheck = false;
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
toggleSelectionMode(value) {
|
|
713
|
-
this.selection = value;
|
|
714
|
-
this.activeLayer = undefined;
|
|
715
|
-
if (value === true) {
|
|
716
|
-
this.layerTool = false;
|
|
717
|
-
for (const layer of this.layers) {
|
|
718
|
-
if (layer.options.check) {
|
|
719
|
-
this.layersChecked.push(layer);
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
layersCheckedOpacity() {
|
|
725
|
-
if (this.layersChecked.length > 1) {
|
|
726
|
-
return 1;
|
|
727
|
-
}
|
|
728
|
-
else {
|
|
729
|
-
const opacity = [];
|
|
730
|
-
for (const layer of this.layersChecked) {
|
|
731
|
-
opacity.push(layer.opacity);
|
|
732
|
-
}
|
|
733
|
-
return opacity;
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
selectAll() {
|
|
737
|
-
if (!this.selectAllCheck) {
|
|
738
|
-
for (const layer of this.layers) {
|
|
739
|
-
if (this.excludeBaseLayers &&
|
|
740
|
-
layer.baseLayer !== true &&
|
|
741
|
-
layer.showInLayerList) {
|
|
742
|
-
layer.options.check = true;
|
|
743
|
-
this.layersChecked.push(layer);
|
|
744
|
-
}
|
|
745
|
-
else if (!this.excludeBaseLayers && layer.showInLayerList) {
|
|
746
|
-
layer.options.check = true;
|
|
747
|
-
this.layersChecked.push(layer);
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
this.selectAllCheck$.next(true);
|
|
751
|
-
}
|
|
752
|
-
else {
|
|
753
|
-
for (const layer of this.layers) {
|
|
754
|
-
layer.options.check = false;
|
|
755
|
-
}
|
|
756
|
-
this.layersChecked = [];
|
|
757
|
-
this.selectAllCheck$.next(false);
|
|
758
|
-
}
|
|
759
|
-
}
|
|
760
|
-
isScrolledIntoView(elemSource, elem) {
|
|
761
|
-
const docViewTop = elemSource.scrollTop;
|
|
762
|
-
const docViewBottom = docViewTop + elemSource.clientHeight;
|
|
763
|
-
const elemTop = elem.offsetTop;
|
|
764
|
-
const elemBottom = elemTop + elem.clientHeight;
|
|
765
|
-
return elemBottom <= docViewBottom && elemTop >= docViewTop;
|
|
766
|
-
}
|
|
767
|
-
removeProblemLayerInList(layersList) {
|
|
768
|
-
for (const layer of layersList) {
|
|
769
|
-
if (layer.olLoadingProblem === true) {
|
|
770
|
-
this.map.removeLayer(layer);
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
return layersList;
|
|
774
|
-
}
|
|
775
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayerListComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
776
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LayerListComponent, isStandalone: true, selector: "igo-layer-list", inputs: { layersAreAllVisible: "layersAreAllVisible", ogcButton: "ogcButton", timeButton: "timeButton", map: "map", layers: "layers", floatLabel: "floatLabel", layerFilterAndSortOptions: "layerFilterAndSortOptions", excludeBaseLayers: "excludeBaseLayers", toggleLegendOnVisibilityChange: "toggleLegendOnVisibilityChange", expandLegendOfVisibleLayers: "expandLegendOfVisibleLayers", updateLegendOnResolutionChange: "updateLegendOnResolutionChange", queryBadge: "queryBadge" }, outputs: { appliedFilterAndSort: "appliedFilterAndSort" }, queries: [{ propertyName: "templateLayerToolbar", first: true, predicate: ["igoLayerItemToolbar"], descendants: true }], ngImport: i0, template: "<igo-layer-list-tool\n *ngIf=\"showToolbar$ | async\"\n floatLabel=\"auto\"\n [layersAreAllVisible]=\"layersAreAllVisible\"\n [term]=\"layerFilterAndSortOptions.keyword\"\n [onlyVisible]=\"layerFilterAndSortOptions.onlyVisible\"\n [sortAlpha]=\"layerFilterAndSortOptions.sortAlpha\"\n (appliedFilterAndSort)=\"onAppliedFilterAndSortChange($event)\"\n (selection)=\"toggleSelectionMode($event)\"\n>\n</igo-layer-list-tool>\n\n<div *ngIf=\"selection\" class=\"select-all\">\n <mat-checkbox\n class=\"select-all-checkbox\"\n [color]=\"!selectAllCheck && layersChecked.length > 0 ? 'accent' : 'primary'\"\n (change)=\"selectAll()\"\n [checked]=\"selectAllCheck\"\n [indeterminate]=\"!selectAllCheck && layersChecked.length > 0\"\n >\n {{\n selectAllCheck\n ? ('igo.geo.layer.deselectAll' | translate)\n : ('igo.geo.layer.selectAll' | translate)\n }}\n </mat-checkbox>\n</div>\n<mat-divider></mat-divider>\n\n<igo-list #igoList [navigation]=\"false\" [selection]=\"false\">\n <ng-template ngFor let-layer let-i=\"index\" [ngForOf]=\"layers$ | async\">\n <igo-layer-item\n *ngIf=\"!(excludeBaseLayers && layer.baseLayer)\"\n igoListItem\n [layer]=\"layer\"\n [activeLayer]=\"activeLayer\"\n [orderable]=\"orderable && !layer.baseLayer\"\n [lowerDisabled]=\"getLowerLayer().id === layer.id\"\n [raiseDisabled]=\"getUpperLayer().id === layer.id\"\n [queryBadge]=\"queryBadge\"\n [expandLegendIfVisible]=\"expandLegendOfVisibleLayers\"\n [updateLegendOnResolutionChange]=\"updateLegendOnResolutionChange\"\n [toggleLegendOnVisibilityChange]=\"toggleLegendOnVisibilityChange\"\n [selectionMode]=\"selection\"\n [selectAll]=\"selectAllCheck\"\n [layerCheck]=\"layer.options.check\"\n [changeDetection]=\"layerItemChangeDetection$\"\n (action)=\"toggleLayerTool($event)\"\n (checkbox)=\"layersCheck($event)\"\n >\n </igo-layer-item>\n </ng-template>\n</igo-list>\n\n<igo-panel\n *ngIf=\"!selection && layerTool && activeLayer\"\n class=\"igo-layer-actions-container\"\n [title]=\"activeLayer.title\"\n>\n <div class=\"igo-layer-button-group\">\n <button\n *ngIf=\"isLayerRemovable(activeLayer)\"\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.removeLayer' | translate\"\n (click)=\"removeLayers()\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n\n <button\n class=\"down-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterLowerLayer' | translate)\n : ('igo.geo.layer.lowerLayer' | translate)\n \"\n [disabled]=\"lowerDisabled\"\n (click)=\"moveActiveLayer(activeLayer, layerListDisplacement.Lower, true)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"lowerDisabled\"\n >arrow_downward</mat-icon\n >\n </button>\n\n <button\n class=\"up-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterRaiseLayer' | translate)\n : ('igo.geo.layer.raiseLayer' | translate)\n \"\n [disabled]=\"raiseDisabled\"\n (click)=\"moveActiveLayer(activeLayer, layerListDisplacement.Raise, true)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"raiseDisabled\"\n >arrow_upward</mat-icon\n >\n </button>\n\n <!-- <label>{{ 'igo.geo.layer.opacity' | translate }} </label> -->\n <button\n class=\"opacity-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matMenuTriggerFor]=\"opacityMenu\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"badgeOpacity\"\n matBadgeColor=\"primary\"\n matBadgeSize=\"medium\"\n >opacity</mat-icon\n >\n </button>\n\n <mat-menu #opacityMenu=\"matMenu\" class=\"panel-opacity-menu\">\n <mat-slider\n id=\"opacity-slider\"\n color=\"primary\"\n discrete\n step=\"5\"\n [min]=\"0\"\n [max]=\"100\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n (click)=\"$event.stopPropagation()\"\n matTooltipShowDelay=\"500\"\n tooltip-position=\"below\"\n #ngSlider\n ><input\n matSliderThumb\n [value]=\"opacity\"\n (input)=\"\n changeOpacity({\n source: ngSliderThumb,\n parent: ngSlider,\n value: ngSliderThumb.value\n })\n \"\n #ngSliderThumb=\"matSliderThumb\"\n />\n </mat-slider>\n </mat-menu>\n\n <button\n *ngIf=\"activeLayerExtentIsValid(activeLayer)\"\n class=\"zoomLayer-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.zoomLayer' | translate\"\n (click)=\"zoomLayerExtents(activeLayer)\"\n >\n <mat-icon matBadgeColor=\"primary\" matBadgeSize=\"medium\"\n >frame_inspect</mat-icon\n >\n </button>\n\n <ng-container\n igoLayerItemToolbar\n [ngTemplateOutlet]=\"templateLayerToolbar\"\n [ngTemplateOutletContext]=\"{ layer: activeLayer }\"\n >\n </ng-container>\n\n <ng-content select=\"[igoLayerItemToolbar]\"></ng-content>\n </div>\n</igo-panel>\n\n<igo-panel\n *ngIf=\"selection && layers.length > 0\"\n class=\"igo-layer-actions-container\"\n [title]=\"'igo.geo.layer.tools' | translate\"\n>\n <div class=\"actions-buttons-multi\">\n <button\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matTooltip]=\"\n isAllLayersRemovable(layersChecked)\n ? ('igo.geo.layer.removeSelectedLayers' | translate)\n : ('igo.geo.layer.removeSelectedLayersRestriction' | translate)\n \"\n (click)=\"removeLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"'!'\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"isAllLayersRemovable(layersChecked)\"\n >delete</mat-icon\n >\n </button>\n\n <button\n class=\"eye-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matTooltip]=\"\n statusSelectedLayersCheck === 'ALL_HIDDEN'\n ? ('igo.geo.layer.showSelectedLayers' | translate)\n : ('igo.geo.layer.hideSelectedLayers' | translate)\n \"\n (click)=\"toggleVisibility(layersChecked)\"\n >\n <mat-icon>{{\n statusSelectedLayersCheck === 'ALL_HIDDEN'\n ? 'visibility_off'\n : 'visibility'\n }}</mat-icon>\n </button>\n\n <button\n class=\"down-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterLowerLayer' | translate)\n : ('igo.geo.layer.lowerLayer' | translate)\n \"\n [disabled]=\"lowerDisabledSelection\"\n (click)=\"lowerLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"lowerDisabledSelection\"\n >arrow_downward</mat-icon\n >\n </button>\n\n <button\n class=\"up-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterRaiseLayer' | translate)\n : ('igo.geo.layer.raiseLayer' | translate)\n \"\n [disabled]=\"raiseDisabledSelection\"\n (click)=\"raiseLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"raiseDisabledSelection\"\n >arrow_upward</mat-icon\n >\n </button>\n\n <button\n class=\"opacity-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matMenuTriggerFor]=\"opacityMenu\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n >\n <mat-icon>opacity</mat-icon>\n </button>\n\n <mat-menu #opacityMenu=\"matMenu\" class=\"mat-menu-opacity-slider\">\n <div id=\"opacity-menu\">\n <!-- TODO: The 'tickInterval' property no longer exists -->\n <mat-slider\n *ngIf=\"layersChecked.length\"\n id=\"opacity-slider\"\n color=\"primary\"\n thumbLabel\n showTickMarks\n step=\"5\"\n [min]=\"0\"\n [max]=\"100\"\n [(ngModel)]=\"checkOpacity\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n matTooltipShowDelay=\"500\"\n tooltip-position=\"below\"\n (click)=\"$event.stopPropagation()\"\n ><input matSliderThumb />\n </mat-slider>\n </div>\n </mat-menu>\n\n <button\n *ngIf=\"\n layersChecked.length !== 0 && activeLayersExtentAreValid(layersChecked)\n \"\n class=\"zoomLayer-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.zoomLayers' | translate\"\n (click)=\"zoomLayersExtents(layersChecked)\"\n >\n <mat-icon>frame_inspect</mat-icon>\n </button>\n </div>\n</igo-panel>\n", styles: [":host{display:flex;flex-direction:column;height:100%}:host igo-list{flex:1;padding-top:8px}:host mat-form-field.inputFilter{width:calc(100% - 100px);max-width:200px}:host .igo-layer-actions-container{padding:0 6px 0 4px}:host .igo-layer-actions-container>div{text-align:center}:host mat-list-item ::ng-deep .mdc-list-item__content{margin-bottom:10px}:host .igo-layer-button-group,:host .actions-buttons-multi{display:flex;align-items:center;flex-direction:row-reverse;overflow-x:auto;overflow-y:hidden}:host .igo-layer-button-group::-webkit-scrollbar,:host .actions-buttons-multi::-webkit-scrollbar{height:4px}:host .igo-layer-button-group::-webkit-scrollbar-track,:host .actions-buttons-multi::-webkit-scrollbar-track{background:#f1f1f1}:host .igo-layer-button-group::-webkit-scrollbar-thumb,:host .actions-buttons-multi::-webkit-scrollbar-thumb{background:#888}:host .igo-layer-button-group::-webkit-scrollbar-thumb:hover,:host .actions-buttons-multi::-webkit-scrollbar-thumb:hover{background:#555}:host .igo-layer-button-group{padding-top:5px}:host igo-panel{height:unset}:host .select-all{display:flex;align-items:center;height:48px;padding:0 16px}::ng-deep .panel-opacity-menu{overflow:visible!important}::ng-deep .panel-opacity-menu #opacity-slider{margin:0 16px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LayerListToolComponent, selector: "igo-layer-list-tool", inputs: ["layersAreAllVisible", "floatLabel", "onlyVisible", "sortAlpha", "term"], outputs: ["appliedFilterAndSort", "selection"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i2.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: ListComponent, selector: "igo-list", inputs: ["navigation", "selection"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: LayerItemComponent, selector: "igo-layer-item", inputs: ["activeLayer", "selectAll", "layerCheck", "layer", "toggleLegendOnVisibilityChange", "expandLegendIfVisible", "updateLegendOnResolutionChange", "orderable", "lowerDisabled", "raiseDisabled", "queryBadge", "selectionMode", "changeDetection"], outputs: ["action", "checkbox"] }, { kind: "directive", type: ListItemDirective, selector: "[igoListItem]", inputs: ["color", "focused", "selected", "disabled"], outputs: ["beforeSelect", "beforeFocus", "beforeUnselect", "beforeUnfocus", "beforeDisable", "beforeEnable", "focus", "unfocus", "select", "unselect", "disable", "enable"] }, { kind: "component", type: PanelComponent, selector: "igo-panel", inputs: ["title", "withHeader", "cursorPointer"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i6.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i8.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i8.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
185
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayerListComponent, deps: [{ token: i1.MessageService }], target: i0.ɵɵFactoryTarget.Component });
|
|
186
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LayerListComponent, isStandalone: true, selector: "igo-layer-list", inputs: { controller: "controller", layers: "layers", isDesktop: "isDesktop", isDragDropDisabled: "isDragDropDisabled", selectAll: "selectAll", viewerOptions: "viewerOptions" }, outputs: { activeChange: "activeChange" }, ngImport: i0, template: "<mat-tree\n [class.--not-desktop]=\"!isDesktop\"\n igoTreeDragDrop\n [treeDragDropIsDisabled]=\"isDragDropDisabled\"\n [maxLevel]=\"viewerOptions?.group?.maxHierarchyLevel\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n (dragStart)=\"dragStart()\"\n (onDrop)=\"dropNode($event)\"\n (onDropError)=\"dropNodeError($event)\"\n>\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node\n *matTreeNodeDef=\"let node\"\n [class.--selected]=\"isSelected(node.data)\"\n [class.--children-selected]=\"isDescendantSelection(node.data)\"\n >\n <igo-layer-item\n [matTreeNodePadding]=\"node.level === 0 ? 1 : node.level\"\n [matTreeNodePaddingIndent]=\"node.level === 0 ? 16 : 24 + 16 / node.level\"\n class=\"tree-node-item\"\n [layer]=\"node.data\"\n [visible]=\"node.data.visible\"\n [viewerOptions]=\"viewerOptions\"\n [selected]=\"isSelected(node.data) || isDescendantSelection(node.data)\"\n [selectionDisabled]=\"isDescendantSelection(node.data)\"\n (action)=\"toggleActive($event)\"\n (selectChange)=\"handleSelect($event, node.data)\"\n >\n </igo-layer-item>\n </mat-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <mat-tree-node\n *matTreeNodeDef=\"let node; when: isGroup\"\n [class.--selected]=\"isSelected(node.data)\"\n [class.--children-selected]=\"isDescendantSelection(node.data)\"\n >\n <igo-layer-group\n matTreeNodePadding\n [matTreeNodePaddingIndent]=\"24\"\n class=\"tree-node-item\"\n [layer]=\"node.data\"\n [viewerOptions]=\"viewerOptions\"\n [selected]=\"isSelected(node.data) || isDescendantSelection(node.data)\"\n [selectionDisabled]=\"isDescendantSelection(node.data)\"\n (action)=\"toggleActive($event)\"\n (expand)=\"treeControl.toggle(node); handleNodeToggle(node)\"\n (selectChange)=\"handleSelect($event, node.data)\"\n >\n <button\n mat-icon-button\n matTreeNodeToggle\n class=\"layer-indicator\"\n [attr.aria-label]=\"'Toggle ' + node.data.title\"\n (click)=\"handleNodeToggle(node)\"\n >\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{\n treeControl.isExpanded(node)\n ? 'keyboard_arrow_down'\n : 'keyboard_arrow_right'\n }}\n </mat-icon>\n </button>\n </igo-layer-group>\n </mat-tree-node>\n</mat-tree>\n", styles: [".--not-desktop igo-layer-group ::ng-deep .list-secondary-actions button,.--not-desktop igo-layer-item ::ng-deep .list-secondary-actions button{visibility:visible!important}.tree-node-item{flex:1}mat-tree-node{position:relative;min-height:40px}mat-tree-node:hover:after,mat-tree-node.--drag-hover:after{content:\"\";position:absolute;inset:0;border-style:solid;border-width:1px;border-color:transparent;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "ngmodule", type: MatSliderModule }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i4.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i4.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i4.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i4.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i4.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: TreeDragDropDirective, selector: "[igoTreeDragDrop]", inputs: ["treeControl", "maxLevel", "treeDragDropIsDisabled"], outputs: ["dragStart", "onDrop", "onDropError"] }, { kind: "component", type: LayerGroupComponent, selector: "igo-layer-group", inputs: ["layer", "viewerOptions", "selected", "selectionDisabled"], outputs: ["action", "visibilityChange", "expand", "selectChange"] }, { kind: "component", type: LayerItemComponent, selector: "igo-layer-item", inputs: ["layer", "visible", "selected", "selectionDisabled", "viewerOptions"], outputs: ["action", "selectChange", "visibilityChange"] }, { kind: "ngmodule", type: IgoLanguageModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
777
187
|
}
|
|
778
188
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayerListComponent, decorators: [{
|
|
779
189
|
type: Component,
|
|
780
190
|
args: [{ selector: 'igo-layer-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
781
191
|
NgIf,
|
|
782
|
-
|
|
192
|
+
NgFor,
|
|
193
|
+
NgTemplateOutlet,
|
|
194
|
+
FormsModule,
|
|
195
|
+
AsyncPipe,
|
|
196
|
+
MatBadgeModule,
|
|
197
|
+
MatButtonModule,
|
|
783
198
|
MatCheckboxModule,
|
|
784
199
|
MatDividerModule,
|
|
200
|
+
MatIconModule,
|
|
201
|
+
MatMenuModule,
|
|
202
|
+
MatSliderModule,
|
|
203
|
+
MatTreeModule,
|
|
204
|
+
MatTooltipModule,
|
|
205
|
+
TreeDragDropDirective,
|
|
206
|
+
LayerListToolComponent,
|
|
207
|
+
LayerGroupComponent,
|
|
785
208
|
ListComponent,
|
|
786
|
-
NgFor,
|
|
787
209
|
LayerItemComponent,
|
|
788
210
|
ListItemDirective,
|
|
789
211
|
PanelComponent,
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
NgTemplateOutlet,
|
|
797
|
-
FormsModule,
|
|
798
|
-
AsyncPipe,
|
|
799
|
-
IgoLanguageModule
|
|
800
|
-
], template: "<igo-layer-list-tool\n *ngIf=\"showToolbar$ | async\"\n floatLabel=\"auto\"\n [layersAreAllVisible]=\"layersAreAllVisible\"\n [term]=\"layerFilterAndSortOptions.keyword\"\n [onlyVisible]=\"layerFilterAndSortOptions.onlyVisible\"\n [sortAlpha]=\"layerFilterAndSortOptions.sortAlpha\"\n (appliedFilterAndSort)=\"onAppliedFilterAndSortChange($event)\"\n (selection)=\"toggleSelectionMode($event)\"\n>\n</igo-layer-list-tool>\n\n<div *ngIf=\"selection\" class=\"select-all\">\n <mat-checkbox\n class=\"select-all-checkbox\"\n [color]=\"!selectAllCheck && layersChecked.length > 0 ? 'accent' : 'primary'\"\n (change)=\"selectAll()\"\n [checked]=\"selectAllCheck\"\n [indeterminate]=\"!selectAllCheck && layersChecked.length > 0\"\n >\n {{\n selectAllCheck\n ? ('igo.geo.layer.deselectAll' | translate)\n : ('igo.geo.layer.selectAll' | translate)\n }}\n </mat-checkbox>\n</div>\n<mat-divider></mat-divider>\n\n<igo-list #igoList [navigation]=\"false\" [selection]=\"false\">\n <ng-template ngFor let-layer let-i=\"index\" [ngForOf]=\"layers$ | async\">\n <igo-layer-item\n *ngIf=\"!(excludeBaseLayers && layer.baseLayer)\"\n igoListItem\n [layer]=\"layer\"\n [activeLayer]=\"activeLayer\"\n [orderable]=\"orderable && !layer.baseLayer\"\n [lowerDisabled]=\"getLowerLayer().id === layer.id\"\n [raiseDisabled]=\"getUpperLayer().id === layer.id\"\n [queryBadge]=\"queryBadge\"\n [expandLegendIfVisible]=\"expandLegendOfVisibleLayers\"\n [updateLegendOnResolutionChange]=\"updateLegendOnResolutionChange\"\n [toggleLegendOnVisibilityChange]=\"toggleLegendOnVisibilityChange\"\n [selectionMode]=\"selection\"\n [selectAll]=\"selectAllCheck\"\n [layerCheck]=\"layer.options.check\"\n [changeDetection]=\"layerItemChangeDetection$\"\n (action)=\"toggleLayerTool($event)\"\n (checkbox)=\"layersCheck($event)\"\n >\n </igo-layer-item>\n </ng-template>\n</igo-list>\n\n<igo-panel\n *ngIf=\"!selection && layerTool && activeLayer\"\n class=\"igo-layer-actions-container\"\n [title]=\"activeLayer.title\"\n>\n <div class=\"igo-layer-button-group\">\n <button\n *ngIf=\"isLayerRemovable(activeLayer)\"\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.removeLayer' | translate\"\n (click)=\"removeLayers()\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n\n <button\n class=\"down-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterLowerLayer' | translate)\n : ('igo.geo.layer.lowerLayer' | translate)\n \"\n [disabled]=\"lowerDisabled\"\n (click)=\"moveActiveLayer(activeLayer, layerListDisplacement.Lower, true)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"lowerDisabled\"\n >arrow_downward</mat-icon\n >\n </button>\n\n <button\n class=\"up-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterRaiseLayer' | translate)\n : ('igo.geo.layer.raiseLayer' | translate)\n \"\n [disabled]=\"raiseDisabled\"\n (click)=\"moveActiveLayer(activeLayer, layerListDisplacement.Raise, true)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"raiseDisabled\"\n >arrow_upward</mat-icon\n >\n </button>\n\n <!-- <label>{{ 'igo.geo.layer.opacity' | translate }} </label> -->\n <button\n class=\"opacity-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matMenuTriggerFor]=\"opacityMenu\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"badgeOpacity\"\n matBadgeColor=\"primary\"\n matBadgeSize=\"medium\"\n >opacity</mat-icon\n >\n </button>\n\n <mat-menu #opacityMenu=\"matMenu\" class=\"panel-opacity-menu\">\n <mat-slider\n id=\"opacity-slider\"\n color=\"primary\"\n discrete\n step=\"5\"\n [min]=\"0\"\n [max]=\"100\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n (click)=\"$event.stopPropagation()\"\n matTooltipShowDelay=\"500\"\n tooltip-position=\"below\"\n #ngSlider\n ><input\n matSliderThumb\n [value]=\"opacity\"\n (input)=\"\n changeOpacity({\n source: ngSliderThumb,\n parent: ngSlider,\n value: ngSliderThumb.value\n })\n \"\n #ngSliderThumb=\"matSliderThumb\"\n />\n </mat-slider>\n </mat-menu>\n\n <button\n *ngIf=\"activeLayerExtentIsValid(activeLayer)\"\n class=\"zoomLayer-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.zoomLayer' | translate\"\n (click)=\"zoomLayerExtents(activeLayer)\"\n >\n <mat-icon matBadgeColor=\"primary\" matBadgeSize=\"medium\"\n >frame_inspect</mat-icon\n >\n </button>\n\n <ng-container\n igoLayerItemToolbar\n [ngTemplateOutlet]=\"templateLayerToolbar\"\n [ngTemplateOutletContext]=\"{ layer: activeLayer }\"\n >\n </ng-container>\n\n <ng-content select=\"[igoLayerItemToolbar]\"></ng-content>\n </div>\n</igo-panel>\n\n<igo-panel\n *ngIf=\"selection && layers.length > 0\"\n class=\"igo-layer-actions-container\"\n [title]=\"'igo.geo.layer.tools' | translate\"\n>\n <div class=\"actions-buttons-multi\">\n <button\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matTooltip]=\"\n isAllLayersRemovable(layersChecked)\n ? ('igo.geo.layer.removeSelectedLayers' | translate)\n : ('igo.geo.layer.removeSelectedLayersRestriction' | translate)\n \"\n (click)=\"removeLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"'!'\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"isAllLayersRemovable(layersChecked)\"\n >delete</mat-icon\n >\n </button>\n\n <button\n class=\"eye-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matTooltip]=\"\n statusSelectedLayersCheck === 'ALL_HIDDEN'\n ? ('igo.geo.layer.showSelectedLayers' | translate)\n : ('igo.geo.layer.hideSelectedLayers' | translate)\n \"\n (click)=\"toggleVisibility(layersChecked)\"\n >\n <mat-icon>{{\n statusSelectedLayersCheck === 'ALL_HIDDEN'\n ? 'visibility_off'\n : 'visibility'\n }}</mat-icon>\n </button>\n\n <button\n class=\"down-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterLowerLayer' | translate)\n : ('igo.geo.layer.lowerLayer' | translate)\n \"\n [disabled]=\"lowerDisabledSelection\"\n (click)=\"lowerLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"lowerDisabledSelection\"\n >arrow_downward</mat-icon\n >\n </button>\n\n <button\n class=\"up-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterRaiseLayer' | translate)\n : ('igo.geo.layer.raiseLayer' | translate)\n \"\n [disabled]=\"raiseDisabledSelection\"\n (click)=\"raiseLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"raiseDisabledSelection\"\n >arrow_upward</mat-icon\n >\n </button>\n\n <button\n class=\"opacity-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matMenuTriggerFor]=\"opacityMenu\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n >\n <mat-icon>opacity</mat-icon>\n </button>\n\n <mat-menu #opacityMenu=\"matMenu\" class=\"mat-menu-opacity-slider\">\n <div id=\"opacity-menu\">\n <!-- TODO: The 'tickInterval' property no longer exists -->\n <mat-slider\n *ngIf=\"layersChecked.length\"\n id=\"opacity-slider\"\n color=\"primary\"\n thumbLabel\n showTickMarks\n step=\"5\"\n [min]=\"0\"\n [max]=\"100\"\n [(ngModel)]=\"checkOpacity\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n matTooltipShowDelay=\"500\"\n tooltip-position=\"below\"\n (click)=\"$event.stopPropagation()\"\n ><input matSliderThumb />\n </mat-slider>\n </div>\n </mat-menu>\n\n <button\n *ngIf=\"\n layersChecked.length !== 0 && activeLayersExtentAreValid(layersChecked)\n \"\n class=\"zoomLayer-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.zoomLayers' | translate\"\n (click)=\"zoomLayersExtents(layersChecked)\"\n >\n <mat-icon>frame_inspect</mat-icon>\n </button>\n </div>\n</igo-panel>\n", styles: [":host{display:flex;flex-direction:column;height:100%}:host igo-list{flex:1;padding-top:8px}:host mat-form-field.inputFilter{width:calc(100% - 100px);max-width:200px}:host .igo-layer-actions-container{padding:0 6px 0 4px}:host .igo-layer-actions-container>div{text-align:center}:host mat-list-item ::ng-deep .mdc-list-item__content{margin-bottom:10px}:host .igo-layer-button-group,:host .actions-buttons-multi{display:flex;align-items:center;flex-direction:row-reverse;overflow-x:auto;overflow-y:hidden}:host .igo-layer-button-group::-webkit-scrollbar,:host .actions-buttons-multi::-webkit-scrollbar{height:4px}:host .igo-layer-button-group::-webkit-scrollbar-track,:host .actions-buttons-multi::-webkit-scrollbar-track{background:#f1f1f1}:host .igo-layer-button-group::-webkit-scrollbar-thumb,:host .actions-buttons-multi::-webkit-scrollbar-thumb{background:#888}:host .igo-layer-button-group::-webkit-scrollbar-thumb:hover,:host .actions-buttons-multi::-webkit-scrollbar-thumb:hover{background:#555}:host .igo-layer-button-group{padding-top:5px}:host igo-panel{height:unset}:host .select-all{display:flex;align-items:center;height:48px;padding:0 16px}::ng-deep .panel-opacity-menu{overflow:visible!important}::ng-deep .panel-opacity-menu #opacity-slider{margin:0 16px}\n"] }]
|
|
801
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { templateLayerToolbar: [{
|
|
802
|
-
type: ContentChild,
|
|
803
|
-
args: ['igoLayerItemToolbar', /* TODO: add static flag */ {}]
|
|
804
|
-
}], layersAreAllVisible: [{
|
|
805
|
-
type: Input
|
|
806
|
-
}], ogcButton: [{
|
|
807
|
-
type: Input
|
|
808
|
-
}], timeButton: [{
|
|
809
|
-
type: Input
|
|
810
|
-
}], map: [{
|
|
811
|
-
type: Input
|
|
212
|
+
IgoLanguageModule,
|
|
213
|
+
IgoIconComponent
|
|
214
|
+
], template: "<mat-tree\n [class.--not-desktop]=\"!isDesktop\"\n igoTreeDragDrop\n [treeDragDropIsDisabled]=\"isDragDropDisabled\"\n [maxLevel]=\"viewerOptions?.group?.maxHierarchyLevel\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n (dragStart)=\"dragStart()\"\n (onDrop)=\"dropNode($event)\"\n (onDropError)=\"dropNodeError($event)\"\n>\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node\n *matTreeNodeDef=\"let node\"\n [class.--selected]=\"isSelected(node.data)\"\n [class.--children-selected]=\"isDescendantSelection(node.data)\"\n >\n <igo-layer-item\n [matTreeNodePadding]=\"node.level === 0 ? 1 : node.level\"\n [matTreeNodePaddingIndent]=\"node.level === 0 ? 16 : 24 + 16 / node.level\"\n class=\"tree-node-item\"\n [layer]=\"node.data\"\n [visible]=\"node.data.visible\"\n [viewerOptions]=\"viewerOptions\"\n [selected]=\"isSelected(node.data) || isDescendantSelection(node.data)\"\n [selectionDisabled]=\"isDescendantSelection(node.data)\"\n (action)=\"toggleActive($event)\"\n (selectChange)=\"handleSelect($event, node.data)\"\n >\n </igo-layer-item>\n </mat-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <mat-tree-node\n *matTreeNodeDef=\"let node; when: isGroup\"\n [class.--selected]=\"isSelected(node.data)\"\n [class.--children-selected]=\"isDescendantSelection(node.data)\"\n >\n <igo-layer-group\n matTreeNodePadding\n [matTreeNodePaddingIndent]=\"24\"\n class=\"tree-node-item\"\n [layer]=\"node.data\"\n [viewerOptions]=\"viewerOptions\"\n [selected]=\"isSelected(node.data) || isDescendantSelection(node.data)\"\n [selectionDisabled]=\"isDescendantSelection(node.data)\"\n (action)=\"toggleActive($event)\"\n (expand)=\"treeControl.toggle(node); handleNodeToggle(node)\"\n (selectChange)=\"handleSelect($event, node.data)\"\n >\n <button\n mat-icon-button\n matTreeNodeToggle\n class=\"layer-indicator\"\n [attr.aria-label]=\"'Toggle ' + node.data.title\"\n (click)=\"handleNodeToggle(node)\"\n >\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{\n treeControl.isExpanded(node)\n ? 'keyboard_arrow_down'\n : 'keyboard_arrow_right'\n }}\n </mat-icon>\n </button>\n </igo-layer-group>\n </mat-tree-node>\n</mat-tree>\n", styles: [".--not-desktop igo-layer-group ::ng-deep .list-secondary-actions button,.--not-desktop igo-layer-item ::ng-deep .list-secondary-actions button{visibility:visible!important}.tree-node-item{flex:1}mat-tree-node{position:relative;min-height:40px}mat-tree-node:hover:after,mat-tree-node.--drag-hover:after{content:\"\";position:absolute;inset:0;border-style:solid;border-width:1px;border-color:transparent;pointer-events:none}\n"] }]
|
|
215
|
+
}], ctorParameters: () => [{ type: i1.MessageService }], propDecorators: { controller: [{
|
|
216
|
+
type: Input,
|
|
217
|
+
args: [{ required: true }]
|
|
812
218
|
}], layers: [{
|
|
219
|
+
type: Input,
|
|
220
|
+
args: [{ required: true }]
|
|
221
|
+
}], isDesktop: [{
|
|
813
222
|
type: Input
|
|
814
|
-
}],
|
|
815
|
-
type: Input
|
|
816
|
-
}], layerFilterAndSortOptions: [{
|
|
817
|
-
type: Input
|
|
818
|
-
}], excludeBaseLayers: [{
|
|
819
|
-
type: Input
|
|
820
|
-
}], toggleLegendOnVisibilityChange: [{
|
|
821
|
-
type: Input
|
|
822
|
-
}], expandLegendOfVisibleLayers: [{
|
|
223
|
+
}], isDragDropDisabled: [{
|
|
823
224
|
type: Input
|
|
824
|
-
}],
|
|
225
|
+
}], selectAll: [{
|
|
825
226
|
type: Input
|
|
826
|
-
}],
|
|
227
|
+
}], viewerOptions: [{
|
|
827
228
|
type: Input
|
|
828
|
-
}],
|
|
229
|
+
}], activeChange: [{
|
|
829
230
|
type: Output
|
|
830
231
|
}] } });
|
|
831
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXItbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9sYXllci9sYXllci1saXN0L2xheWVyLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvbGF5ZXIvbGF5ZXItbGlzdC9sYXllci1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQW1CLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFP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QUFhO3dCQUNiLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsV0FBVzt3QkFDWCxTQUFTO3dCQUNULGlCQUFpQjtxQkFDbEI7K0VBeUJELG9CQUFvQjtzQkFEbkIsWUFBWTt1QkFBQyxxQkFBcUIsRUFBRSwyQkFBMkIsQ0FBQyxFQUFFO2dCQUcxRCxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdGLEdBQUc7c0JBRE4sS0FBSztnQkFVRixNQUFNO3NCQURULEtBQUs7Z0JBbUJHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyw4QkFBOEI7c0JBQXRDLEtBQUs7Z0JBRUcsMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUVHLDhCQUE4QjtzQkFBdEMsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3IsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCYWRnZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JhZGdlJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdERpdmlkZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaXZpZGVyJztcbmltcG9ydCB7IEZsb2F0TGFiZWxUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRTbGlkZXJDaGFuZ2UsIE1hdFNsaWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlcic7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IExpc3RDb21wb25lbnQsIExpc3RJdGVtRGlyZWN0aXZlIH0gZnJvbSAnQGlnbzIvY29tbW9uL2xpc3QnO1xuaW1wb3J0IHsgUGFuZWxDb21wb25lbnQgfSBmcm9tICdAaWdvMi9jb21tb24vcGFuZWwnO1xuaW1wb3J0IHsgSWdvTGFuZ3VhZ2VNb2R1bGUgfSBmcm9tICdAaWdvMi9jb3JlL2xhbmd1YWdlJztcblxuaW1wb3J0ICogYXMgb2xleHRlbnQgZnJvbSAnb2wvZXh0ZW50JztcblxuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBFTVBUWSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxuICB0aW1lclxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHNjcm9sbEludG9WaWV3IGZyb20gJ3Njcm9sbC1pbnRvLXZpZXctaWYtbmVlZGVkJztcblxuaW1wb3J0IHtcbiAgZ2V0QWxsQ2hpbGRMYXllcnNCeVByb3BlcnR5LFxuICBnZXRSb290UGFyZW50QnlQcm9wZXJ0eVxufSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL2xpbmtlZExheWVycy51dGlscyc7XG5pbXBvcnQgeyBJZ29NYXAgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcCc7XG5pbXBvcnQge1xuICBNZXRhZGF0YUxheWVyT3B0aW9ucyxcbiAgTWV0YWRhdGFPcHRpb25zXG59IGZyb20gJy4uLy4uL21ldGFkYXRhL3NoYXJlZC9tZXRhZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGF5ZXJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItaXRlbS9sYXllci1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMYXllckxpc3RUb29sQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItbGlzdC10b29sL2xheWVyLWxpc3QtdG9vbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGF5ZXJMaXN0Q29udHJvbHNPcHRpb25zIH0gZnJvbSAnLi4vbGF5ZXItbGlzdC10b29sL2xheWVyLWxpc3QtdG9vbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9zaGFyZWQvbGF5ZXJzL2xheWVyJztcbmltcG9ydCB7IExpbmtlZFByb3BlcnRpZXMgfSBmcm9tICcuLi9zaGFyZWQvbGF5ZXJzL2xheWVyLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBMYXllckxpc3RDb250cm9sc0VudW0sXG4gIExheWVyTGlzdERpc3BsYWNlbWVudFxufSBmcm9tICcuL2xheWVyLWxpc3QuZW51bSc7XG5pbXBvcnQgeyBMYXllckxpc3RTZWxlY3RWaXNpYmxlRW51bSB9IGZyb20gJy4vbGF5ZXItbGlzdC5lbnVtJztcblxuLy8gVE9ETzogVGhpcyBjbGFzcyBjb3VsZCB1c2UgYSBjbGVhbiB1cC4gQWxzbywgc29tZSBtZXRob2RzIGNvdWxkIGJlIG1vdmVkIGVhbHNld2hlcmVcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lnby1sYXllci1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xheWVyLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9sYXllci1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdJZixcbiAgICBMYXllckxpc3RUb29sQ29tcG9uZW50LFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdERpdmlkZXJNb2R1bGUsXG4gICAgTGlzdENvbXBvbmVudCxcbiAgICBOZ0ZvcixcbiAgICBMYXllckl0ZW1Db21wb25lbnQsXG4gICAgTGlzdEl0ZW1EaXJlY3RpdmUsXG4gICAgUGFuZWxDb21wb25lbnQsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRCYWRnZU1vZHVsZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIE1hdFNsaWRlck1vZHVsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBJZ29MYW5ndWFnZU1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExheWVyTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgb3JkZXJhYmxlID0gdHJ1ZTtcbiAgdGhyZXNob2xkVG9GaWx0ZXJBbmRTb3J0ID0gNTtcblxuICBsYXllcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMYXllcltdPihbXSk7XG5cbiAgY2hhbmdlJCA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuXG4gIHNob3dUb29sYmFyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHB1YmxpYyBsYXllclRvb2w6IGJvb2xlYW47XG5cbiAgcHVibGljIGhpZGVTZWxlY3RlZExheWVycyA9IHRydWU7XG4gIGFjdGl2ZUxheWVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TGF5ZXI+KHVuZGVmaW5lZCk7XG5cbiAgbGF5ZXJzQ2hlY2tlZDogTGF5ZXJbXSA9IFtdO1xuICBwdWJsaWMgc2VsZWN0aW9uOiBib29sZWFuO1xuXG4gIHByaXZhdGUgY2hhbmdlJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBsYXllcnMkJDogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgbGF5ZXJJdGVtQ2hhbmdlRGV0ZWN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcblxuICBAQ29udGVudENoaWxkKCdpZ29MYXllckl0ZW1Ub29sYmFyJywgLyogVE9ETzogYWRkIHN0YXRpYyBmbGFnICovIHt9KVxuICB0ZW1wbGF0ZUxheWVyVG9vbGJhcjogVGVtcGxhdGVSZWY8YW55PjtcblxuICBASW5wdXQoKSBsYXllcnNBcmVBbGxWaXNpYmxlID0gdHJ1ZTtcblxuICBASW5wdXQoKSBvZ2NCdXR0b24gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHRpbWVCdXR0b24gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBtYXAoKTogSWdvTWFwIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwO1xuICB9XG4gIHNldCBtYXAodmFsdWU6IElnb01hcCkge1xuICAgIHRoaXMuX21hcCA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX21hcDogSWdvTWFwO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBsYXllcnModmFsdWU6IExheWVyW10pIHtcbiAgICB0aGlzLl9sYXllcnMgPSB0aGlzLnJlbW92ZVByb2JsZW1MYXllckluTGlzdCh2YWx1ZSk7XG4gICAgdGhpcy5uZXh0KCk7XG4gIH1cbiAgZ2V0IGxheWVycygpOiBMYXllcltdIHtcbiAgICByZXR1cm4gdGhpcy5fbGF5ZXJzO1xuICB9XG4gIHByaXZhdGUgX2xheWVyczogTGF5ZXJbXTtcblxuICBzZXQgYWN0aXZlTGF5ZXIodmFsdWU6IExheWVyKSB7XG4gICAgdGhpcy5fYWN0aXZlTGF5ZXIgPSB2YWx1ZTtcbiAgICB0aGlzLmFjdGl2ZUxheWVyJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBnZXQgYWN0aXZlTGF5ZXIoKTogTGF5ZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVMYXllcjtcbiAgfVxuICBwcml2YXRlIF9hY3RpdmVMYXllcjogTGF5ZXI7XG5cbiAgQElucHV0KCkgZmxvYXRMYWJlbDogRmxvYXRMYWJlbFR5cGUgPSAnYXV0byc7XG5cbiAgQElucHV0KCkgbGF5ZXJGaWx0ZXJBbmRTb3J0T3B0aW9uczogTGF5ZXJMaXN0Q29udHJvbHNPcHRpb25zID0ge307XG5cbiAgQElucHV0KCkgZXhjbHVkZUJhc2VMYXllcnMgPSBmYWxzZTtcblxuICBASW5wdXQoKSB0b2dnbGVMZWdlbmRPblZpc2liaWxpdHlDaGFuZ2UgPSBmYWxzZTtcblxuICBASW5wdXQoKSBleHBhbmRMZWdlbmRPZlZpc2libGVMYXllcnMgPSBmYWxzZTtcblxuICBASW5wdXQoKSB1cGRhdGVMZWdlbmRPblJlc29sdXRpb25DaGFuZ2UgPSBmYWxzZTtcblxuICBASW5wdXQoKSBxdWVyeUJhZGdlID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGFwcGxpZWRGaWx0ZXJBbmRTb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxMYXllckxpc3RDb250cm9sc09wdGlvbnM+KCk7XG5cbiAgZ2V0IGtleXdvcmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fa2V5d29yZDtcbiAgfVxuICBzZXQga2V5d29yZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fa2V5d29yZCA9IHZhbHVlO1xuICAgIHRoaXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX2tleXdvcmQgPSB1bmRlZmluZWQ7XG5cbiAgZ2V0IG9ubHlWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vbmx5VmlzaWJsZTtcbiAgfVxuICBzZXQgb25seVZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9vbmx5VmlzaWJsZSA9IHZhbHVlO1xuICAgIHRoaXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX29ubHlWaXNpYmxlID0gZmFsc2U7XG5cbiAgZ2V0IHNvcnRBbHBoYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydGVkQWxwaGE7XG4gIH1cbiAgc2V0IHNvcnRBbHBoYSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3NvcnRlZEFscGhhID0gdmFsdWU7XG4gICAgdGhpcy5uZXh0KCk7XG4gIH1cbiAgcHJpdmF0ZSBfc29ydGVkQWxwaGEgPSBmYWxzZTtcblxuICBnZXQgb3BhY2l0eSgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLmFjdGl2ZUxheWVyJC5nZXRWYWx1ZSgpLm9wYWNpdHkgKiAxMDApO1xuICB9XG4gIHNldCBvcGFjaXR5KG9wYWNpdHk6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlTGF5ZXIkLmdldFZhbHVlKCkub3BhY2l0eSA9IG9wYWNpdHkgLyAxMDA7XG4gIH1cblxuICBnZXQgYmFkZ2VPcGFjaXR5KCkge1xuICAgIGlmICh0aGlzLm9wYWNpdHkgPT09IDEwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcGFjaXR5O1xuICB9XG5cbiAgZ2V0IHJhaXNlRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMub3JkZXJhYmxlIHx8XG4gICAgICB0aGlzLmFjdGl2ZUxheWVyLmJhc2VMYXllciB8fFxuICAgICAgdGhpcy5nZXRVcHBlckxheWVyKCkuaWQgPT09IHRoaXMuYWN0aXZlTGF5ZXIuaWQgfHxcbiAgICAgIHRoaXMuaXNVcHBlckJhc2VsYXllcih0aGlzLmFjdGl2ZUxheWVyKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldCBsb3dlckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLm9yZGVyYWJsZSB8fFxuICAgICAgdGhpcy5hY3RpdmVMYXllci5iYXNlTGF5ZXIgfHxcbiAgICAgIHRoaXMuZ2V0TG93ZXJMYXllcigpLmlkID09PSB0aGlzLmFjdGl2ZUxheWVyLmlkIHx8XG4gICAgICB0aGlzLmlzTG93ZXJCYXNlbGF5ZXIodGhpcy5hY3RpdmVMYXllcilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgcmFpc2VEaXNhYmxlZFNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmxheWVyc0NoZWNrZWQubGVuZ3RoID09PSAwIHx8XG4gICAgICAhdGhpcy5vcmRlcmFibGUgfHxcbiAgICAgICF0aGlzLnJhaXNhYmxlTGF5ZXJzKHRoaXMubGF5ZXJzQ2hlY2tlZCkgfHxcbiAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPT09IHRydWVcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgbG93ZXJEaXNhYmxlZFNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmxheWVyc0NoZWNrZWQubGVuZ3RoID09PSAwIHx8XG4gICAgICAhdGhpcy5vcmRlcmFibGUgfHxcbiAgICAgICF0aGlzLmxvd2VyYWJsZUxheWVycyh0aGlzLmxheWVyc0NoZWNrZWQpIHx8XG4gICAgICB0aGlzLnNlbGVjdEFsbENoZWNrID09PSB0cnVlXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IGNoZWNrT3BhY2l0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5sYXllcnNDaGVja2VkT3BhY2l0eSgpICogMTAwO1xuICB9XG4gIHNldCBjaGVja09wYWNpdHkob3BhY2l0eTogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVyc0NoZWNrZWQpIHtcbiAgICAgIGxheWVyLm9wYWNpdHkgPSBvcGFjaXR5IC8gMTAwO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYXllckxpc3REaXNwbGFjZW1lbnQoKTogdHlwZW9mIExheWVyTGlzdERpc3BsYWNlbWVudCB7XG4gICAgcmV0dXJuIExheWVyTGlzdERpc3BsYWNlbWVudDtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVPcGFjaXR5ID0gZmFsc2U7XG5cbiAgcHVibGljIHNlbGVjdEFsbENoZWNrOiBib29sZWFuO1xuICBwdWJsaWMgc2VsZWN0QWxsQ2hlY2skID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHNlbGVjdEFsbENoZWNrJCQ6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmKSB7fVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIHNlYXJjaCB0ZXJtIHN0cmVhbSBhbmQgdHJpZ2dlciByZXNlYXJjaGVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2UkJCA9IHRoaXMuY2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5sYXllcnMubGVuZ3RoID09PSAwID8gRU1QVFkgOiB0aW1lcig1MCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93VG9vbGJhciQubmV4dCh0aGlzLmNvbXB1dGVTaG93VG9vbGJhcigpKTtcbiAgICAgICAgdGhpcy5sYXllcnMkLm5leHQodGhpcy5jb21wdXRlTGF5ZXJzKHRoaXMubGF5ZXJzLnNsaWNlKDApKSk7XG4gICAgICAgIHRoaXMuYXBwbGllZEZpbHRlckFuZFNvcnQuZW1pdCh7XG4gICAgICAgICAga2V5d29yZDogdGhpcy5rZXl3b3JkLFxuICAgICAgICAgIHNvcnRBbHBoYTogdGhpcy5zb3J0QWxwaGEsXG4gICAgICAgICAgb25seVZpc2libGU6IHRoaXMub25seVZpc2libGVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2skJCA9IHRoaXMuc2VsZWN0QWxsQ2hlY2skLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHRoaXMubGF5ZXJzJCQgPSB0aGlzLmxheWVycyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmxheWVycykge1xuICAgICAgICBsZXQgY2hlY2tzID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICAgIGxheWVyLnN0YXR1cyQuc3Vic2NyaWJlKCh2YWxTdGF0dXMpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWxTdGF0dXMgPT09IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXIobGF5ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChsYXllci5vcHRpb25zLmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVMYXllciA9IGxheWVyO1xuICAgICAgICAgICAgdGhpcy5sYXllclRvb2wgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGF5ZXIub3B0aW9ucy5jaGVjaykge1xuICAgICAgICAgICAgY2hlY2tzICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmV4Y2x1ZGVCYXNlTGF5ZXJzKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9XG4gICAgICAgICAgICBjaGVja3MgPT09XG4gICAgICAgICAgICB0aGlzLmxheWVycy5maWx0ZXIoXG4gICAgICAgICAgICAgIChsYXkpID0+IGxheS5iYXNlTGF5ZXIgIT09IHRydWUgJiYgbGF5LnNob3dJbkxheWVyTGlzdFxuICAgICAgICAgICAgKS5sZW5ndGhcbiAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9XG4gICAgICAgICAgICBjaGVja3MgPT09IHRoaXMubGF5ZXJzLmZpbHRlcigobGF5KSA9PiBsYXkuc2hvd0luTGF5ZXJMaXN0KS5sZW5ndGhcbiAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY2hhbmdlJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNlbGVjdEFsbENoZWNrJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmxheWVycyQkLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhY3RpdmVMYXllckV4dGVudElzVmFsaWQobGF5ZXI6IExheWVyKTogYm9vbGVhbiB7XG4gICAgbGV0IHZhbGlkID0gZmFsc2U7XG4gICAgaWYgKGxheWVyLm9wdGlvbnMuc2hvd0J1dHRvblpvb21Ub0V4dGVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbGF5ZXJFeHRlbnQgPSBsYXllci5vcHRpb25zLmV4dGVudDtcbiAgICBjb25zdCBtYXhMYXllclpvb21FeHRlbnQgPSB0aGlzLm1hcC52aWV3Q29udHJvbGxlci5tYXhMYXllclpvb21FeHRlbnQ7XG5cbiAgICBpZiAobGF5ZXJFeHRlbnQpIHtcbiAgICAgIGlmIChtYXhMYXllclpvb21FeHRlbnQpIHtcbiAgICAgICAgdmFsaWQgPSBvbGV4dGVudC5jb250YWluc0V4dGVudChtYXhMYXllclpvb21FeHRlbnQsIGxheWVyRXh0ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgYWN0aXZlTGF5ZXJzRXh0ZW50QXJlVmFsaWQobGF5ZXJzOiBMYXllcltdKTogYm9vbGVhbiB7XG4gICAgbGV0IHZhbGlkID0gZmFsc2U7XG4gICAgY29uc3QgbGF5ZXJzRXh0ZW50ID0gb2xleHRlbnQuY3JlYXRlRW1wdHkoKTtcbiAgICBjb25zdCBtYXhMYXllclpvb21FeHRlbnQgPSB0aGlzLm1hcC52aWV3Q29udHJvbGxlci5tYXhMYXllclpvb21FeHRlbnQ7XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgY29uc3QgbGF5ZXJFeHRlbnQgPSBsYXllci5vcHRpb25zLmV4dGVudDtcblxuICAgICAgaWYgKGxheWVyRXh0ZW50ICYmICFsYXllckV4dGVudC5pbmNsdWRlcyhJbmZpbml0eSkpIHtcbiAgICAgICAgb2xleHRlbnQuZXh0ZW5kKGxheWVyc0V4dGVudCwgbGF5ZXJFeHRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghb2xleHRlbnQuaXNFbXB0eShsYXllcnNFeHRlbnQpKSB7XG4gICAgICBpZiAobWF4TGF5ZXJab29tRXh0ZW50KSB7XG4gICAgICAgIHZhbGlkID0gb2xleHRlbnQuY29udGFpbnNFeHRlbnQobWF4TGF5ZXJab29tRXh0ZW50LCBsYXllcnNFeHRlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICB6b29tTGF5ZXJFeHRlbnRzKGxheWVyOiBMYXllcikge1xuICAgIHRoaXMubWFwLnZpZXdDb250cm9sbGVyLnpvb21Ub0V4dGVudChsYXllci5vcHRpb25zLmV4dGVudCk7XG4gIH1cblxuICB6b29tTGF5ZXJzRXh0ZW50cyhsYXllcnM6IExheWVyW10pIHtcbiAgICBjb25zdCBsYXllcnNFeHRlbnQgPSBvbGV4dGVudC5jcmVhdGVFbXB0eSgpIGFzIFtcbiAgICAgIG51bWJlcixcbiAgICAgIG51bWJlcixcbiAgICAgIG51bWJlcixcbiAgICAgIG51bWJlclxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgY29uc3QgbGF5ZXJFeHRlbnQgPSBsYXllci5vcHRpb25zLmV4dGVudDtcblxuICAgICAgaWYgKGxheWVyRXh0ZW50KSB7XG4gICAgICAgIG9sZXh0ZW50LmV4dGVuZChsYXllcnNFeHRlbnQsIGxheWVyRXh0ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuem9vbVRvRXh0ZW50KGxheWVyc0V4dGVudCk7XG4gIH1cblxuICBjaGFuZ2VPcGFjaXR5KGV2ZW50OiBNYXRTbGlkZXJDaGFuZ2UpIHtcbiAgICB0aGlzLm9wYWNpdHkgPSBldmVudC52YWx1ZTtcbiAgfVxuXG4gIGNsZWFyS2V5d29yZCgpIHtcbiAgICB0aGlzLmtleXdvcmQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRMb3dlckxheWVyKCkge1xuICAgIHJldHVybiB0aGlzLmxheWVyc1xuICAgICAgLmZpbHRlcigobCkgPT4gIWwuYmFzZUxheWVyKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKHByZXYsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICByZXR1cm4gcHJldi56SW5kZXggPCBjdXJyZW50LnpJbmRleCA/IHByZXYgOiBjdXJyZW50O1xuICAgICAgICB9LFxuICAgICAgICB7IHpJbmRleDogdW5kZWZpbmVkLCBpZDogdW5kZWZpbmVkIH1cbiAgICAgICk7XG4gIH1cblxuICBpc0xvd2VyQmFzZWxheWVyKGxheWVyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVycy5maW5kSW5kZXgoKGxheSkgPT4gbGF5ZXIuaWQgPT09IGxheS5pZCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5sYXllcnMgJiZcbiAgICAgIHRoaXMubGF5ZXJzW2luZGV4ICsgMV0gJiZcbiAgICAgIHRoaXMubGF5ZXJzW2luZGV4ICsgMV0uYmFzZUxheWVyID09PSB0cnVlXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0VXBwZXJMYXllcigpIHtcbiAgICByZXR1cm4gdGhpcy5sYXllcnNcbiAgICAgIC5maWx0ZXIoKGwpID0+ICFsLmJhc2VMYXllcilcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChwcmV2LCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByZXYuekluZGV4ID4gY3VycmVudC56SW5kZXggPyBwcmV2IDogY3VycmVudDtcbiAgICAgICAgfSxcbiAgICAgICAgeyB6SW5kZXg6IHVuZGVmaW5lZCwgaWQ6IHVuZGVmaW5lZCB9XG4gICAgICApO1xuICB9XG5cbiAgaXNVcHBlckJhc2VsYXllcihsYXllcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KChsYXkpID0+IGxheWVyLmlkID09PSBsYXkuaWQpO1xuICAgIGlmIChcbiAgICAgIHRoaXMubGF5ZXJzICYmXG4gICAgICB0aGlzLmxheWVyc1tpbmRleCAtIDFdICYmXG4gICAgICB0aGlzLmxheWVyc1tpbmRleCAtIDFdLmJhc2VMYXllciA9PT0gdHJ1ZVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG1vdmVBY3RpdmVMYXllcihcbiAgICBhY3RpdmVMYXllcjogTGF5ZXIsXG4gICAgYWN0aW9udHlwZTogTGF5ZXJMaXN0RGlzcGxhY2VtZW50LFxuICAgIGZyb21VaSA9IGZhbHNlXG4gICkge1xuICAgIGNvbnN0IHNvcnRlZExheWVyc1RvTW92ZSA9IFtdO1xuICAgIGdldFJvb3RQYXJlbnRCeVByb3BlcnR5KHRoaXMubWFwLCBhY3RpdmVMYXllciwgTGlua2VkUHJvcGVydGllcy5aSU5ERVgpO1xuICAgIGxldCByb290UGFyZW50QnlQcm9wZXJ0eSA9IGdldFJvb3RQYXJlbnRCeVByb3BlcnR5KFxuICAgICAgdGhpcy5tYXAsXG4gICAgICBhY3RpdmVMYXllcixcbiAgICAgIExpbmtlZFByb3BlcnRpZXMuWklOREVYXG4gICAgKTtcbiAgICBpZiAoIXJvb3RQYXJlbnRCeVByb3BlcnR5KSB7XG4gICAgICByb290UGFyZW50QnlQcm9wZXJ0eSA9IGFjdGl2ZUxheWVyO1xuICAgIH1cbiAgICBjb25zdCBsYXllcnNUb01vdmUgPSBbcm9vdFBhcmVudEJ5UHJvcGVydHldO1xuICAgIGdldEFsbENoaWxkTGF5ZXJzQnlQcm9wZXJ0eShcbiAgICAgIHRoaXMubWFwLFxuICAgICAgcm9vdFBhcmVudEJ5UHJvcGVydHksXG4gICAgICBsYXllcnNUb01vdmUsXG4gICAgICBMaW5rZWRQcm9wZXJ0aWVzLlpJTkRFWFxuICAgICk7XG5cbiAgICB0aGlzLmxheWVycy5tYXAoKGxheWVyKSA9PiB7XG4gICAgICBpZiAobGF5ZXJzVG9Nb3ZlLmluZGV4T2YobGF5ZXIpICE9PSAtMSkge1xuICAgICAgICBzb3J0ZWRMYXllcnNUb01vdmUucHVzaChsYXllcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoYWN0aW9udHlwZSA9PT0gTGF5ZXJMaXN0RGlzcGxhY2VtZW50LlJhaXNlKSB7XG4gICAgICB0aGlzLnJhaXNlTGF5ZXJzKHNvcnRlZExheWVyc1RvTW92ZSwgZnJvbVVpKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbnR5cGUgPT09IExheWVyTGlzdERpc3BsYWNlbWVudC5Mb3dlcikge1xuICAgICAgdGhpcy5sb3dlckxheWVycyhzb3J0ZWRMYXllcnNUb01vdmUsIGZyb21VaSk7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogRm9yIHNlbGVjdGlvbiBtb2RlIGRpc2FibGVkIGF0dHJpYnV0ZVxuICAgKi9cbiAgcmFpc2FibGVMYXllcnMobGF5ZXJzOiBMYXllcltdKSB7XG4gICAgbGV0IHJlc3BvbnNlID0gZmFsc2U7XG4gICAgbGV0IGJhc2UgPSAwO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBtYXBJbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleCgobGF5KSA9PiBsYXllci5pZCA9PT0gbGF5LmlkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYXllciA9IHRoaXMubGF5ZXJzW21hcEluZGV4XTtcbiAgICAgIGlmIChjdXJyZW50TGF5ZXIuYmFzZUxheWVyKSB7XG4gICAgICAgIGJhc2UgKz0gMTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldmlvdXNMYXllciA9IHRoaXMubGF5ZXJzW21hcEluZGV4IC0gMV07XG4gICAgICBpZiAoXG4gICAgICAgIHByZXZpb3VzTGF5ZXIgJiZcbiAgICAgICAgcHJldmlvdXNMYXllci5iYXNlTGF5ZXIgIT09IHRydWUgJiZcbiAgICAgICAgIWxheWVycy5maW5kKChsYXkpID0+IHByZXZpb3VzTGF5ZXIuaWQgPT09IGxheS5pZCkgJiZcbiAgICAgICAgY3VycmVudExheWVyLmJhc2VMYXllciAhPT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgIHJlc3BvbnNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAodGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxheWVyc0NoZWNrZWRbMF0uYmFzZUxheWVyKSB8fFxuICAgICAgYmFzZSA9PT0gdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aFxuICAgICkge1xuICAgICAgcmVzcG9uc2UgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLypcbiAgICogV2hlbiBtdWx0aXBsZSBsYXllcnMgaXMgc2VsZWN0ZWQgYnV0IHNvbWUgbWF5IGJlIGFsbG93IHRvIG1vdmVcbiAgICovXG4gIHJhaXNhYmxlTGF5ZXIoaW5kZXg6IG51bWJlcikge1xuICAgIGlmIChpbmRleCA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sYXllcnNbaW5kZXggLSAxXS5vcHRpb25zLmNoZWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5yYWlzYWJsZUxheWVyKGluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmFpc2VMYXllcnMobGF5ZXJzOiBMYXllcltdLCBmcm9tVWkgPSB0cnVlKSB7XG4gICAgY29uc3QgbGF5ZXJzVG9SYWlzZSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleCgobGF5KSA9PiBsYXkuaWQgPT09IGxheWVyLmlkKTtcbiAgICAgIGlmICh0aGlzLnJhaXNhYmxlTGF5ZXIoaW5kZXgpKSB7XG4gICAgICAgIGxheWVyc1RvUmFpc2UucHVzaChsYXllcik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubWFwLnJhaXNlTGF5ZXJzKGxheWVyc1RvUmFpc2UpO1xuICAgIGlmIChmcm9tVWkpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGVja0l0ZW1zID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICAgICAgJ21hdC1jaGVja2JveC1jaGVja2VkJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBpdGVtRm9jdXNlZCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgICAgICdpZ28tbGF5ZXItaXRlbS1mb2N1c2VkJ1xuICAgICAgICApO1xuICAgICAgICBsZXQgdGFyZ2V0VG9TY3JvbGw7XG4gICAgICAgIGlmIChjaGVja0l0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgIHRhcmdldFRvU2Nyb2xsID0gY2hlY2tJdGVtc1swXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbUZvY3VzZWQubGVuZ3RoKSB7XG4gICAgICAgICAgdGFyZ2V0VG9TY3JvbGwgPSBpdGVtRm9jdXNlZFswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0VG9TY3JvbGwpIHtcbiAgICAgICAgICBzY3JvbGxJbnRvVmlldyh0YXJnZXRUb1Njcm9sbCwge1xuICAgICAgICAgICAgc2Nyb2xsTW9kZTogJ2lmLW5lZWRlZCcsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgICAgICBibG9jazogJ2VuZCcsXG4gICAgICAgICAgICBpbmxpbmU6ICduZWFyZXN0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuICAvKlxuICAgKiBGb3Igc2VsZWN0aW9uIG1vZGUgZGlzYWJsZWQgYXR0cmlidXRlXG4gICAqL1xuICBsb3dlcmFibGVMYXllcnMobGF5ZXJzOiBMYXllcltdKSB7XG4gICAgbGV0IHJlc3BvbnNlID0gZmFsc2U7XG4gICAgbGV0IGJhc2UgPSAwO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBtYXBJbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleCgobGF5KSA9PiBsYXllci5pZCA9PT0gbGF5LmlkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYXllciA9IHRoaXMubGF5ZXJzW21hcEluZGV4XTtcbiAgICAgIGlmIChjdXJyZW50TGF5ZXIuYmFzZUxheWVyKSB7XG4gICAgICAgIGJhc2UgKz0gMTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dExheWVyID0gdGhpcy5sYXllcnNbbWFwSW5kZXggKyAxXTtcbiAgICAgIGlmIChcbiAgICAgICAgbmV4dExheWVyICYmXG4gICAgICAgIG5leHRMYXllci5iYXNlTGF5ZXIgIT09IHRydWUgJiZcbiAgICAgICAgIWxheWVycy5maW5kKChsYXkpID0+IG5leHRMYXllci5pZCA9PT0gbGF5LmlkKVxuICAgICAgKSB7XG4gICAgICAgIHJlc3BvbnNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAodGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxheWVyc0NoZWNrZWRbMF0uYmFzZUxheWVyKSB8fFxuICAgICAgYmFzZSA9PT0gdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aFxuICAgICkge1xuICAgICAgcmVzcG9uc2UgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLypcbiAgICogV2hlbiBtdWx0aXBsZSBsYXllcnMgaXMgc2VsZWN0ZWQgYnV0IHNvbWUgbWF5IGJlIGFsbG93IHRvIG1vdmVcbiAgICovXG4gIGxvd2VyYWJsZUxheWVyKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICBpbmRleCA+XG4gICAgICB0aGlzLmxheWVycy5maWx0ZXIoKGxheSkgPT4gbGF5LmJhc2VMYXllciAhPT0gdHJ1ZSkubGVuZ3RoIC0gMlxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxheWVyc1tpbmRleCArIDFdLm9wdGlvbnMuY2hlY2spIHtcbiAgICAgIHJldHVybiB0aGlzLmxvd2VyYWJsZUxheWVyKGluZGV4ICsgMSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbG93ZXJMYXllcnMobGF5ZXJzOiBMYXllcltdLCBmcm9tVWkgPSB0cnVlKSB7XG4gICAgY29uc3QgbGF5ZXJzVG9Mb3dlciA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleCgobGF5KSA9PiBsYXkuaWQgPT09IGxheWVyLmlkKTtcbiAgICAgIGlmICh0aGlzLmxvd2VyYWJsZUxheWVyKGluZGV4KSkge1xuICAgICAgICBsYXllcnNUb0xvd2VyLnB1c2gobGF5ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1hcC5sb3dlckxheWVycyhsYXllcnNUb0xvd2VyKTtcbiAgICBpZiAoZnJvbVVpKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tJdGVtcyA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgICAgICdtYXQtY2hlY2tib3gtY2hlY2tlZCdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXRlbUZvY3VzZWQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgICAgICAnaWdvLWxheWVyLWl0ZW0tZm9jdXNlZCdcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHRhcmdldFRvU2Nyb2xsO1xuICAgICAgICBpZiAoY2hlY2tJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICB0YXJnZXRUb1Njcm9sbCA9IGNoZWNrSXRlbXNbY2hlY2tJdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbUZvY3VzZWQubGVuZ3RoKSB7XG4gICAgICAgICAgdGFyZ2V0VG9TY3JvbGwgPSBpdGVtRm9jdXNlZFswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0VG9TY3JvbGwpIHtcbiAgICAgICAgICBzY3JvbGxJbnRvVmlldyh0YXJnZXRUb1Njcm9sbCwge1xuICAgICAgICAgICAgc2Nyb2xsTW9kZTogJ2lmLW5lZWRlZCcsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgICAgICBibG9jazogJ2VuZCcsXG4gICAgICAgICAgICBpbmxpbmU6ICduZWFyZXN0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIG5leHQoKSB7XG4gICAgdGhpcy5jaGFuZ2UkLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUxheWVycyhsYXllcnM6IExheWVyW10pOiBMYXllcltdIHtcbiAgICBsZXQgbGF5ZXJzT3V0ID0gdGhpcy5maWx0ZXJMYXllcnMobGF5ZXJzKTtcbiAgICBpZiAodGhpcy5zb3J0QWxwaGEpIHtcbiAgICAgIGxheWVyc091dCA9IHRoaXMuc29ydExheWVyc0J5VGl0bGUobGF5ZXJzT3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5ZXJzT3V0ID0gdGhpcy5zb3J0TGF5ZXJzQnlaaW5kZXgobGF5ZXJzT3V0KTtcbiAgICB9XG4gICAgcmV0dXJuIGxheWVyc091dDtcbiAgfVxuXG4gIG9uS2V5d29yZENoYW5nZSh0ZXJtKSB7XG4gICAgdGhpcy5rZXl3b3JkID0gdGVybTtcbiAgfVxuXG4gIG9uQXBwbGllZEZpbHRlckFuZFNvcnRDaGFuZ2UoYXBwbGllZEZpbHRlcjogTGF5ZXJMaXN0Q29udHJvbHNPcHRpb25zKSB7XG4gICAgdGhpcy5rZXl3b3JkID0gYXBwbGllZEZpbHRlci5rZXl3b3JkO1xuICAgIHRoaXMub25seVZpc2libGUgPSBhcHBsaWVkRmlsdGVyLm9ubHlWaXNpYmxlO1xuICAgIHRoaXMuc29ydEFscGhhID0gYXBwbGllZEZpbHRlci5zb3J0QWxwaGE7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckxheWVycyhsYXllcnM6IExheWVyW10pOiBMYXllcltdIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmxheWVyRmlsdGVyQW5kU29ydE9wdGlvbnMuc2hvd1Rvb2xiYXIgPT09IExheWVyTGlzdENvbnRyb2xzRW51bS5uZXZlclxuICAgICkge1xuICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG4gICAgaWYgKCF0aGlzLmtleXdvcmQgJiYgIXRoaXMub25seVZpc2libGUpIHtcbiAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgY29uc3Qga2VlcExheWVySWRzID0gbGF5ZXJzLm1hcCgobGF5ZXI6IExheWVyKSA9PiBsYXllci5pZCk7XG5cbiAgICBsYXllcnMuZm9yRWFjaCgobGF5ZXI6IExheWVyKSA9PiB7XG4gICAgICBjb25zdCBsYXllck9wdGlvbnMgPSAobGF5ZXIub3B0aW9ucyBhcyBNZXRhZGF0YUxheWVyT3B0aW9ucykgfHwge307XG4gICAgICBjb25zdCBkYXRhU291cmNlT3B0aW9ucyA9IGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucyB8fCB7fTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gbGF5ZXJPcHRpb25zLm1ldGFkYXRhIHx8ICh7fSBhcyBNZXRhZGF0YU9wdGlvbnMpO1xuICAgICAgY29uc3Qga2V5d29yZHMgPSBtZXRhZGF0YS5rZXl3b3JkTGlzdCB8fCBbXTtcbiAgICAgIGNvbnN0IGxheWVyS2V5d29yZHMgPSBrZXl3b3Jkcy5tYXAoKGt3OiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGt3Lm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLmtleXdvcmQgJiYgbGF5ZXIudGl0bGUpIHtcbiAgICAgICAgY29uc3QgbG9jYWxLZXl3b3JkID0gdGhpcy5rZXl3b3JkXG4gICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpO1xuICAgICAgICBjb25zdCBsYXllclRpdGxlID0gbGF5ZXIudGl0bGVcbiAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJyk7XG4gICAgICAgIGNvbnN0IGRhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZU9wdGlvbnMudHlwZSB8fCAnJztcbiAgICAgICAgY29uc3Qga2V5d29yZFJlZ2V4ID0gbmV3IFJlZ0V4cChsb2NhbEtleXdvcmQsICdnaScpO1xuICAgICAgICBjb25zdCBrZXl3b3JkSW5MaXN0ID1cbiAgICAgICAgICBsYXllcktleXdvcmRzLmZpbmQoKGt3OiBzdHJpbmcpID0+IGtleXdvcmRSZWdleC50ZXN0KGt3KSkgIT09XG4gICAgICAgICAgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWtleXdvcmRSZWdleC50ZXN0KGxheWVyVGl0bGUpICYmXG4gICAgICAgICAgISh0aGlzLmtleXdvcmQudG9Mb3dlckNhc2UoKSA9PT0gZGF0YVNvdXJjZVR5cGUudG9Mb3dlckNhc2UoKSkgJiZcbiAgICAgICAgICAha2V5d29yZEluTGlzdFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGtlZXBMYXllcklkcy5pbmRleE9mKGxheWVyLmlkKTtcbiAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAga2VlcExheWVySWRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9ubHlWaXNpYmxlICYmIGxheWVyLnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0ga2VlcExheWVySWRzLmluZGV4T2YobGF5ZXIuaWQpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIGtlZXBMYXllcklkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGF5ZXJzLmZpbHRlcihcbiAgICAgIChsYXllcjogTGF5ZXIpID0+IGtlZXBMYXllcklkcy5pbmRleE9mKGxheWVyLmlkKSAhPT0gLTFcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0TGF5ZXJzQnlaaW5kZXgobGF5ZXJzOiBMYXllcltdKSB7XG4gICAgcmV0dXJuIGxheWVycy5zb3J0KChsYXllcjEsIGxheWVyMikgPT4gbGF5ZXIyLnpJbmRleCAtIGxheWVyMS56SW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0TGF5ZXJzQnlUaXRsZShsYXllcnM6IExheWVyW10pIHtcbiAgICByZXR1cm4gbGF5ZXJzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZShhLnRpdGxlKSA8IHRoaXMubm9ybWFsaXplKGIudGl0bGUpKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZShhLnRpdGxlKSA+IHRoaXMubm9ybWFsaXplKGIudGl0bGUpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHJcbiAgICAgIC5ub3JtYWxpemUoJ05GRCcpXG4gICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpXG4gICAgICAudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZVNob3dUb29sYmFyKCk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAodGhpcy5sYXllckZpbHRlckFuZFNvcnRPcHRpb25zLnNob3dUb29sYmFyKSB7XG4gICAgICBjYXNlIExheWVyTGlzdENvbnRyb2xzRW51bS5hbHdheXM6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSBMYXllckxpc3RDb250cm9sc0VudW0ubmV2ZXI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmxheWVycy5sZW5ndGggPj0gdGhpcy50aHJlc2hvbGRUb0ZpbHRlckFuZFNvcnQgfHxcbiAgICAgICAgICB0aGlzLmtleXdvcmQgfHxcbiAgICAgICAgICB0aGlzLm9ubHlWaXNpYmxlXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVMYXllclRvb2wobGF5ZXIpIHtcbiAgICB0aGlzLnRvZ2dsZU9wYWNpdHkgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5sYXllclRvb2wgJiYgbGF5ZXIgPT09IHRoaXMuYWN0aXZlTGF5ZXIpIHtcbiAgICAgIHRoaXMubGF5ZXJUb29sID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGF5ZXJUb29sID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxheSBvZiB0aGlzLmxheWVycykge1xuICAgICAgbGF5Lm9wdGlvbnMuYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGxheWVyLm9wdGlvbnMuYWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGl2ZUxheWVyID0gbGF5ZXI7XG4gIH1cblxuICByZW1vdmVMYXllcnMobGF5ZXJzPzogTGF5ZXJbXSkge1xuICAgIGlmIChsYXllcnMgJiYgbGF5ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZCA9IFtdO1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgaWYgKGxheWVyLm9wdGlvbnMucmVtb3ZhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICAgIGxheWVyLm1hcC5yZW1vdmVMYXllcihsYXllcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLnB1c2gobGF5ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghbGF5ZXJzICYmIHRoaXMuYWN0aXZlTGF5ZXIub3B0aW9ucy5yZW1vdmFibGUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmFjdGl2ZUxheWVyLm1hcC5yZW1vdmVMYXllcih0aGlzLmFjdGl2ZUxheWVyKTtcbiAgICAgIHRoaXMubGF5ZXJUb29sID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlVmlzaWJpbGl0eShsYXllcnM/OiBMYXllcltdKSB7XG4gICAgaWYgKGxheWVycyAmJiBsYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgbGF5ZXIudmlzaWJsZSA9IHRoaXMuaGlkZVNlbGVjdGVkTGF5ZXJzO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxheWVySXRlbUNoYW5nZURldGVjdGlvbiQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIGlzTGF5ZXJSZW1vdmFibGUobGF5ZXI6IExheWVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGxheWVyLm9wdGlvbnMucmVtb3ZhYmxlICE9PSBmYWxzZTtcbiAgfVxuXG4gIGlzQWxsTGF5ZXJzUmVtb3ZhYmxlKGxheWVyczogTGF5ZXJbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsYXllcnMuZXZlcnkoKGwpID0+IHRoaXMuaXNMYXllclJlbW92YWJsZShsKSk7XG4gIH1cblxuICBnZXQgc3RhdHVzU2VsZWN0ZWRMYXllcnNDaGVjaygpOiBMYXllckxpc3RTZWxlY3RWaXNpYmxlRW51bSB7XG4gICAgbGV0IHN0YXR1c1NlbGVjdGVkTGF5ZXJzOiBMYXllckxpc3RTZWxlY3RWaXNpYmxlRW51bSA9XG4gICAgICBMYXllckxpc3RTZWxlY3RWaXNpYmxlRW51bS5OVUxMO1xuICAgIGxldCBmaW5kVHJ1ZSA9IGZhbHNlO1xuICAgIGxldCBmaW5kRmFsc2UgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmxheWVyc0NoZWNrZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICBzdGF0dXNTZWxlY3RlZExheWVycyA9IExheWVyTGlzdFNlbGVjdFZpc2libGVFbnVtLk5VTEw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1c1NlbGVjdGVkTGF5ZXJzID0gTGF5ZXJMaXN0U2VsZWN0VmlzaWJsZUVudW0uTUlYRUQ7XG4gICAgICB0aGlzLmhpZGVTZWxlY3RlZExheWVycyA9IGZhbHNlO1xuXG4gICAgICBmb3IgKGNvbnN0IGxheWVyMiBvZiB0aGlzLmxheWVyc0NoZWNrZWQpIHtcbiAgICAgICAgaWYgKGxheWVyMi52aXNpYmxlID09PSB0cnVlKSB7XG4gICAgICAgICAgZmluZFRydWUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXllcjIudmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBmaW5kRmFsc2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5kVHJ1ZSA9PT0gdHJ1ZSAmJiBmaW5kRmFsc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIHN0YXR1c1NlbGVjdGVkTGF5ZXJzID0gTGF5ZXJMaXN0U2VsZWN0VmlzaWJsZUVudW0uQUxMX1ZJU0lCTEU7XG4gICAgICB9XG4gICAgICBpZiAoZmluZFRydWUgPT09IGZhbHNlICYmIGZpbmRGYWxzZSA9PT0gdHJ1ZSkge1xuICAgICAgICBzdGF0dXNTZWxlY3RlZExheWVycyA9IExheWVyTGlzdFNlbGVjdFZpc2libGVFbnVtLkFMTF9ISURERU47XG4gICAgICAgIHRoaXMuaGlkZVNlbGVjdGVkTGF5ZXJzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdHVzU2VsZWN0ZWRMYXllcnM7XG4gIH1cblxuICBsYXllcnNDaGVjayhldmVudDogeyBsYXllcjogTGF5ZXI7IGNoZWNrOiBib29sZWFuIH0pIHtcbiAgICBldmVudC5sYXllci5vcHRpb25zLmNoZWNrID0gZXZlbnQuY2hlY2s7XG4gICAgaWYgKGV2ZW50LmNoZWNrID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBldmVudE1hcEluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KFxuICAgICAgICAobGF5ZXIpID0+IGV2ZW50LmxheWVyLmlkID09PSBsYXllci5pZFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnNDaGVja2VkKSB7XG4gICAgICAgIGNvbnN0IG1hcEluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KChsYXkpID0+IGxheWVyLmlkID09PSBsYXkuaWQpO1xuICAgICAgICBpZiAoZXZlbnRNYXBJbmRleCA8IG1hcEluZGV4KSB7XG4gICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLnNwbGljZShcbiAgICAgICAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5maW5kSW5kZXgoKGxheSkgPT4gbGF5ZXIuaWQgPT09IGxheS5pZCksXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZXZlbnQubGF5ZXJcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZXhjbHVkZUJhc2VMYXllcnMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT1cbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChsYXkpID0+IGxheS5iYXNlTGF5ZXIgIT09IHRydWUgJiYgbGF5LnNob3dJbkxheWVyTGlzdFxuICAgICAgICAgICAgICApLmxlbmd0aFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZXhjbHVkZUJhc2VMYXllcnMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT1cbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuZmlsdGVyKChsYXkpID0+IGxheS5zaG93SW5MYXllckxpc3QpLmxlbmd0aFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5wdXNoKGV2ZW50LmxheWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVyc0NoZWNrZWQuZmluZEluZGV4KFxuICAgICAgICAobGF5ZXIpID0+IGV2ZW50LmxheWVyLmlkID09PSBsYXllci5pZFxuICAgICAgKTtcbiAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV4Y2x1ZGVCYXNlTGF5ZXJzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5sZW5ndGggPT09XG4gICAgICAgIHRoaXMubGF5ZXJzLmZpbHRlcihcbiAgICAgICAgICAobGF5KSA9PiBsYXkuYmFzZUxheWVyICE9PSB0cnVlICYmIGxheS5zaG93SW5MYXllckxpc3RcbiAgICAgICAgKS5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNlbGVjdEFsbENoZWNrID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCF0aGlzLmV4Y2x1ZGVCYXNlTGF5ZXJzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5sZW5ndGggPT09XG4gICAgICAgIHRoaXMubGF5ZXJzLmZpbHRlcigobGF5KSA9PiBsYXkuc2hvd0luTGF5ZXJMaXN0KS5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNlbGVjdEFsbENoZWNrID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b2dnbGVTZWxlY3Rpb25Nb2RlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZWxlY3Rpb24gPSB2YWx1ZTtcbiAgICB0aGlzLmFjdGl2ZUxheWVyID0gdW5kZWZpbmVkO1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5sYXllclRvb2wgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgaWYgKGxheWVyLm9wdGlvbnMuY2hlY2spIHtcbiAgICAgICAgICB0aGlzLmxheWVyc0NoZWNrZWQucHVzaChsYXllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsYXllcnNDaGVja2VkT3BhY2l0eSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmxheWVyc0NoZWNrZWQubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wYWNpdHkgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnNDaGVja2VkKSB7XG4gICAgICAgIG9wYWNpdHkucHVzaChsYXllci5vcGFjaXR5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcGFjaXR5O1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEFsbCgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0QWxsQ2hlY2spIHtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZXhjbHVkZUJhc2VMYXllcnMgJiZcbiAgICAgICAgICBsYXllci5iYXNlTGF5ZXIgIT09IHRydWUgJiZcbiAgICAgICAgICBsYXllci5zaG93SW5MYXllckxpc3RcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGF5ZXIub3B0aW9ucy5jaGVjayA9IHRydWU7XG4gICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLnB1c2gobGF5ZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmV4Y2x1ZGVCYXNlTGF5ZXJzICYmIGxheWVyLnNob3dJbkxheWVyTGlzdCkge1xuICAgICAgICAgIGxheWVyLm9wdGlvbnMuY2hlY2sgPSB0cnVlO1xuICAgICAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5wdXNoKGxheWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayQubmV4dCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICBsYXllci5vcHRpb25zLmNoZWNrID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLmxheWVyc0NoZWNrZWQgPSBbXTtcbiAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2skLm5leHQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGlzU2Nyb2xsZWRJbnRvVmlldyhlbGVtU291cmNlLCBlbGVtKSB7XG4gICAgY29uc3QgZG9jVmlld1RvcCA9IGVsZW1Tb3VyY2Uuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IGRvY1ZpZXdCb3R0b20gPSBkb2NWaWV3VG9wICsgZWxlbVNvdXJjZS5jbGllbnRIZWlnaHQ7XG5cbiAgICBjb25zdCBlbGVtVG9wID0gZWxlbS5vZmZzZXRUb3A7XG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IGVsZW1Ub3AgKyBlbGVtLmNsaWVudEhlaWdodDtcbiAgICByZXR1cm4gZWxlbUJvdHRvbSA8PSBkb2NWaWV3Qm90dG9tICYmIGVsZW1Ub3AgPj0gZG9jVmlld1RvcDtcbiAgfVxuXG4gIHJlbW92ZVByb2JsZW1MYXllckluTGlzdChsYXllcnNMaXN0OiBMYXllcltdKTogTGF5ZXJbXSB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnNMaXN0KSB7XG4gICAgICBpZiAobGF5ZXIub2xMb2FkaW5nUHJvYmxlbSA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihsYXllcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsYXllcnNMaXN0O1xuICB9XG59XG4iLCI8aWdvLWxheWVyLWxpc3QtdG9vbFxuICAqbmdJZj1cInNob3dUb29sYmFyJCB8IGFzeW5jXCJcbiAgZmxvYXRMYWJlbD1cImF1dG9cIlxuICBbbGF5ZXJzQXJlQWxsVmlzaWJsZV09XCJsYXllcnNBcmVBbGxWaXNpYmxlXCJcbiAgW3Rlcm1dPVwibGF5ZXJGaWx0ZXJBbmRTb3J0T3B0aW9ucy5rZXl3b3JkXCJcbiAgW29ubHlWaXNpYmxlXT1cImxheWVyRmlsdGVyQW5kU29ydE9wdGlvbnMub25seVZpc2libGVcIlxuICBbc29ydEFscGhhXT1cImxheWVyRmlsdGVyQW5kU29ydE9wdGlvbnMuc29ydEFscGhhXCJcbiAgKGFwcGxpZWRGaWx0ZXJBbmRTb3J0KT1cIm9uQXBwbGllZEZpbHRlckFuZFNvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gIChzZWxlY3Rpb24pPVwidG9nZ2xlU2VsZWN0aW9uTW9kZSgkZXZlbnQpXCJcbj5cbjwvaWdvLWxheWVyLWxpc3QtdG9vbD5cblxuPGRpdiAqbmdJZj1cInNlbGVjdGlvblwiIGNsYXNzPVwic2VsZWN0LWFsbFwiPlxuICA8bWF0LWNoZWNrYm94XG4gICAgY2xhc3M9XCJzZWxlY3QtYWxsLWNoZWNrYm94XCJcbiAgICBbY29sb3JdPVwiIXNlbGVjdEFsbENoZWNrICYmIGxheWVyc0NoZWNrZWQubGVuZ3RoID4gMCA/ICdhY2NlbnQnIDogJ3ByaW1hcnknXCJcbiAgICAoY2hhbmdlKT1cInNlbGVjdEFsbCgpXCJcbiAgICBbY2hlY2tlZF09XCJzZWxlY3RBbGxDaGVja1wiXG4gICAgW2luZGV0ZXJtaW5hdGVdPVwiIXNlbGVjdEFsbENoZWNrICYmIGxheWVyc0NoZWNrZWQubGVuZ3RoID4gMFwiXG4gID5cbiAgICB7e1xuICAgICAgc2VsZWN0QWxsQ2hlY2tcbiAgICAgICAgPyAoJ2lnby5nZW8ubGF5ZXIuZGVzZWxlY3RBbGwnIHwgdHJhbnNsYXRlKVxuICAgICAgICA6ICgnaWdvLmdlby5sYXllci5zZWxlY3RBbGwnIHwgdHJhbnNsYXRlKVxuICAgIH19XG4gIDwvbWF0LWNoZWNrYm94PlxuPC9kaXY+XG48bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cblxuPGlnby1saXN0ICNpZ29MaXN0IFtuYXZpZ2F0aW9uXT1cImZhbHNlXCIgW3NlbGVjdGlvbl09XCJmYWxzZVwiPlxuICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWxheWVyIGxldC1pPVwiaW5kZXhcIiBbbmdGb3JPZl09XCJsYXllcnMkIHwgYXN5bmNcIj5cbiAgICA8aWdvLWxheWVyLWl0ZW1cbiAgICAgICpuZ0lmPVwiIShleGNsdWRlQmFzZUxheWVycyAmJiBsYXllci5iYXNlTGF5ZXIpXCJcbiAgICAgIGlnb0xpc3RJdGVtXG4gICAgICBbbGF5ZXJdPVwibGF5ZXJcIlxuICAgICAgW2FjdGl2ZUxheWVyXT1cImFjdGl2ZUxheWVyXCJcbiAgICAgIFtvcmRlcmFibGVdPVwib3JkZXJhYmxlICYmICFsYXllci5iYXNlTGF5ZXJcIlxuICAgICAgW2xvd2VyRGlzYWJsZWRdPVwiZ2V0TG93ZXJMYXllcigpLmlkID09PSBsYXllci5pZFwiXG4gICAgICBbcmFpc2VEaXNhYmxlZF09XCJnZXRVcHBlckxheWVyKCkuaWQgPT09IGxheWVyLmlkXCJcbiAgICAgIFtxdWVyeUJhZGdlXT1cInF1ZXJ5QmFkZ2VcIlxuICAgICAgW2V4cGFuZExlZ2VuZElmVmlzaWJsZV09XCJleHBhbmRMZWdlbmRPZlZpc2libGVMYXllcnNcIlxuICAgICAgW3VwZGF0ZUxlZ2VuZE9uUmVzb2x1dGlvbkNoYW5nZV09XCJ1cGRhdGVMZWdlbmRPblJlc29sdXRpb25DaGFuZ2VcIlxuICAgICAgW3RvZ2dsZUxlZ2VuZE9uVmlzaWJpbGl0eUNoYW5nZV09XCJ0b2dnbGVMZWdlbmRPblZpc2liaWxpdHlDaGFuZ2VcIlxuICAgICAgW3NlbGVjdGlvbk1vZGVdPVwic2VsZWN0aW9uXCJcbiAgICAgIFtzZWxlY3RBbGxdPVwic2VsZWN0QWxsQ2hlY2tcIlxuICAgICAgW2xheWVyQ2hlY2tdPVwibGF5ZXIub3B0aW9ucy5jaGVja1wiXG4gICAgICBbY2hhbmdlRGV0ZWN0aW9uXT1cImxheWVySXRlbUNoYW5nZURldGVjdGlvbiRcIlxuICAgICAgKGFjdGlvbik9XCJ0b2dnbGVMYXllclRvb2woJGV2ZW50KVwiXG4gICAgICAoY2hlY2tib3gpPVwibGF5ZXJzQ2hlY2soJGV2ZW50KVwiXG4gICAgPlxuICAgIDwvaWdvLWxheWVyLWl0ZW0+XG4gIDwvbmctdGVtcGxhdGU+XG48L2lnby1saXN0PlxuXG48aWdvLXBhbmVsXG4gICpuZ0lmPVwiIXNlbGVjdGlvbiAmJiBsYXllclRvb2wgJiYgYWN0aXZlTGF5ZXJcIlxuICBjbGFzcz1cImlnby1sYXllci1hY3Rpb25zLWNvbnRhaW5lclwiXG4gIFt0aXRsZV09XCJhY3RpdmVMYXllci50aXRsZVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJpZ28tbGF5ZXItYnV0dG9uLWdyb3VwXCI+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJpc0xheWVyUmVtb3ZhYmxlKGFjdGl2ZUxheWVyKVwiXG4gICAgICBjbGFzcz1cImRlbGV0ZS1idXR0b25cIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIucmVtb3ZlTGF5ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgIChjbGljayk9XCJyZW1vdmVMYXllcnMoKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRvd24tYnV0dG9uXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICBzb3J0QWxwaGEgfHwgb25seVZpc2libGUgfHwga2V5d29yZFxuICAgICAgICAgID8gKCdpZ28uZ2VvLmxheWVyLmZpbHRlckxvd2VyTGF5ZXInIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIDogKCdpZ28uZ2VvLmxheWVyLmxvd2VyTGF5ZXInIHwgdHJhbnNsYXRlKVxuICAgICAgXCJcbiAgICAgIFtkaXNhYmxlZF09XCJsb3dlckRpc2FibGVkXCJcbiAgICAgIChjbGljayk9XCJtb3ZlQWN0aXZlTGF5ZXIoYWN0aXZlTGF5ZXIsIGxheWVyTGlzdERpc3BsYWNlbWVudC5Mb3dlciwgdHJ1ZSlcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvblxuICAgICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICAgICAgW21hdEJhZGdlXT1cInNvcnRBbHBoYSB8fCBvbmx5VmlzaWJsZSB8fCBrZXl3b3JkID8gJyEnIDogJydcIlxuICAgICAgICBtYXRCYWRnZUNvbG9yPVwid2FyblwiXG4gICAgICAgIG1hdEJhZGdlU2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgIFttYXRCYWRnZUhpZGRlbl09XCJsb3dlckRpc2FibGVkXCJcbiAgICAgICAgPmFycm93X2Rvd253YXJkPC9tYXQtaWNvblxuICAgICAgPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJ1cC1idXR0b25cIlxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiXG4gICAgICAgIHNvcnRBbHBoYSB8fCBvbmx5VmlzaWJsZSB8fCBrZXl3b3JkXG4gICAgICAgICAgPyAoJ2lnby5nZW8ubGF5ZXIuZmlsdGVyUmFpc2VMYXllcicgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgOiAoJ2lnby5nZW8ubGF5ZXIucmFpc2VMYXllcicgfCB0cmFuc2xhdGUpXG4gICAgICBcIlxuICAgICAgW2Rpc2FibGVkXT1cInJhaXNlRGlzYWJsZWRcIlxuICAgICAgKGNsaWNrKT1cIm1vdmVBY3RpdmVMYXllcihhY3RpdmVMYXllciwgbGF5ZXJMaXN0RGlzcGxhY2VtZW50LlJhaXNlLCB0cnVlKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uXG4gICAgICAgIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxuICAgICAgICBbbWF0QmFkZ2VdPVwic29ydEFscGhhIHx8IG9ubHlWaXNpYmxlIHx8IGtleXdvcmQgPyAnIScgOiAnJ1wiXG4gICAgICAgIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgICAgbWF0QmFkZ2VTaXplPVwibWVkaXVtXCJcbiAgICAgICAgW21hdEJhZGdlSGlkZGVuXT1cInJhaXNlRGlzYWJsZWRcIlxuICAgICAgICA+YXJyb3dfdXB3YXJkPC9tYXQtaWNvblxuICAgICAgPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSA8bGFiZWw+e3sgJ2lnby5nZW8ubGF5ZXIub3BhY2l0eScgfCB0cmFuc2xhdGUgfX0gPC9sYWJlbD4gLS0+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJvcGFjaXR5LWJ1dHRvblwiXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwib3BhY2l0eU1lbnVcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIub3BhY2l0eScgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvblxuICAgICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICAgICAgW21hdEJhZGdlXT1cImJhZGdlT3BhY2l0eVwiXG4gICAgICAgIG1hdEJhZGdlQ29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgbWF0QmFkZ2VTaXplPVwibWVkaXVtXCJcbiAgICAgICAgPm9wYWNpdHk8L21hdC1pY29uXG4gICAgICA+XG4gICAgPC9idXR0b24+XG5cbiAgICA8bWF0LW1lbnUgI29wYWNpdHlNZW51PVwibWF0TWVudVwiIGNsYXNzPVwicGFuZWwtb3BhY2l0eS1tZW51XCI+XG4gICAgICA8bWF0LXNsaWRlclxuICAgICAgICBpZD1cIm9wYWNpdHktc2xpZGVyXCJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgZGlzY3JldGVcbiAgICAgICAgc3RlcD1cIjVcIlxuICAgICAgICBbbWluXT1cIjBcIlxuICAgICAgICBbbWF4XT1cIjEwMFwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmxheWVyLm9wYWNpdHknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAjbmdTbGlkZXJcbiAgICAgICAgPjxpbnB1dFxuICAgICAgICAgIG1hdFNsaWRlclRodW1iXG4gICAgICAgICAgW3ZhbHVlXT1cIm9wYWNpdHlcIlxuICAgICAgICAgIChpbnB1dCk9XCJcbiAgICAgICAgICAgIGNoYW5nZU9wYWNpdHkoe1xuICAgICAgICAgICAgICBzb3VyY2U6IG5nU2xpZGVyVGh1bWIsXG4gICAgICAgICAgICAgIHBhcmVudDogbmdTbGlkZXIsXG4gICAgICAgICAgICAgIHZhbHVlOiBuZ1NsaWRlclRodW1iLnZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIFwiXG4gICAgICAgICAgI25nU2xpZGVyVGh1bWI9XCJtYXRTbGlkZXJUaHVtYlwiXG4gICAgICAgIC8+XG4gICAgICA8L21hdC1zbGlkZXI+XG4gICAgPC9tYXQtbWVudT5cblxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiYWN0aXZlTGF5ZXJFeHRlbnRJc1ZhbGlkKGFjdGl2ZUxheWVyKVwiXG4gICAgICBjbGFzcz1cInpvb21MYXllci1idXR0b25cIlxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIuem9vbUxheWVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAoY2xpY2spPVwiem9vbUxheWVyRXh0ZW50cyhhY3RpdmVMYXllcilcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbiBtYXRCYWRnZUNvbG9yPVwicHJpbWFyeVwiIG1hdEJhZGdlU2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgID5mcmFtZV9pbnNwZWN0PC9tYXQtaWNvblxuICAgICAgPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgaWdvTGF5ZXJJdGVtVG9vbGJhclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVMYXllclRvb2xiYXJcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgbGF5ZXI6IGFjdGl2ZUxheWVyIH1cIlxuICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpZ29MYXllckl0ZW1Ub29sYmFyXVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L2lnby1wYW5lbD5cblxuPGlnby1wYW5lbFxuICAqbmdJZj1cInNlbGVjdGlvbiAmJiBsYXllcnMubGVuZ3RoID4gMFwiXG4gIGNsYXNzPVwiaWdvLWxheWVyLWFjdGlvbnMtY29udGFpbmVyXCJcbiAgW3RpdGxlXT1cIidpZ28uZ2VvLmxheWVyLnRvb2xzJyB8IHRyYW5zbGF0ZVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWJ1dHRvbnMtbXVsdGlcIj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRlbGV0ZS1idXR0b25cIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW2Rpc2FibGVkXT1cImxheWVyc0NoZWNrZWQubGVuZ3RoID09PSAwXCJcbiAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICBpc0FsbExheWVyc1JlbW92YWJsZShsYXllcnNDaGVja2VkKVxuICAgICAgICAgID8gKCdpZ28uZ2VvLmxheWVyLnJlbW92ZVNlbGVjdGVkTGF5ZXJzJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICA6ICgnaWdvLmdlby5sYXllci5yZW1vdmVTZWxlY3RlZExheWVyc1Jlc3RyaWN0aW9uJyB8IHRyYW5zbGF0ZSlcbiAgICAgIFwiXG4gICAgICAoY2xpY2spPVwicmVtb3ZlTGF5ZXJzKGxheWVyc0NoZWNrZWQpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb25cbiAgICAgICAgYXJpYS1oaWRkZW49XCJmYWxzZVwiXG4gICAgICAgIFttYXRCYWRnZV09XCInISdcIlxuICAgICAgICBtYXRCYWRnZUNvbG9yPVwid2FyblwiXG4gICAgICAgIG1hdEJhZGdlU2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgIFttYXRCYWRnZUhpZGRlbl09XCJpc0FsbExheWVyc1JlbW92YWJsZShsYXllcnNDaGVja2VkKVwiXG4gICAgICAgID5kZWxldGU8L21hdC1pY29uXG4gICAgICA+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImV5ZS1idXR0b25cIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW2Rpc2FibGVkXT1cImxheWVyc0NoZWNrZWQubGVuZ3RoID09PSAwXCJcbiAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICBzdGF0dXNTZWxlY3RlZExheWVyc0NoZWNrID09PSAnQUxMX0hJRERFTidcbiAgICAgICAgICA/ICgnaWdvLmdlby5sYXllci5zaG93U2VsZWN0ZWRMYXllcnMnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIDogKCdpZ28uZ2VvLmxheWVyLmhpZGVTZWxlY3RlZExheWVycycgfCB0cmFuc2xhdGUpXG4gICAgICBcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZVZpc2liaWxpdHkobGF5ZXJzQ2hlY2tlZClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj57e1xuICAgICAgICBzdGF0dXNTZWxlY3RlZExheWVyc0NoZWNrID09PSAnQUxMX0hJRERFTidcbiAgICAgICAgICA/ICd2aXNpYmlsaXR5X29mZidcbiAgICAgICAgICA6ICd2aXNpYmlsaXR5J1xuICAgICAgfX08L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJkb3duLWJ1dHRvblwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICBbbWF0VG9vbHRpcF09XCJcbiAgICAgICAgc29ydEFscGhhIHx8IG9ubHlWaXNpYmxlIHx8IGtleXdvcmRcbiAgICAgICAgICA/ICgnaWdvLmdlby5sYXllci5maWx0ZXJMb3dlckxheWVyJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICA6ICgnaWdvLmdlby5sYXllci5sb3dlckxheWVyJyB8IHRyYW5zbGF0ZSlcbiAgICAgIFwiXG4gICAgICBbZGlzYWJsZWRdPVwibG93ZXJEaXNhYmxlZFNlbGVjdGlvblwiXG4gICAgICAoY2xpY2spPVwibG93ZXJMYXllcnMobGF5ZXJzQ2hlY2tlZClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvblxuICAgICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICAgICAgW21hdEJhZGdlXT1cInNvcnRBbHBoYSB8fCBvbmx5VmlzaWJsZSB8fCBrZXl3b3JkID8gJyEnIDogJydcIlxuICAgICAgICBtYXRCYWRnZUNvbG9yPVwid2FyblwiXG4gICAgICAgIG1hdEJhZGdlU2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgIFttYXRCYWRnZUhpZGRlbl09XCJsb3dlckRpc2FibGVkU2VsZWN0aW9uXCJcbiAgICAgICAgPmFycm93X2Rvd253YXJkPC9tYXQtaWNvblxuICAgICAgPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJ1cC1idXR0b25cIlxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiXG4gICAgICAgIHNvcnRBbHBoYSB8fCBvbmx5VmlzaWJsZSB8fCBrZXl3b3JkXG4gICAgICAgICAgPyAoJ2lnby5nZW8ubGF5ZXIuZmlsdGVyUmFpc2VMYXllcicgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgOiAoJ2lnby5nZW8ubGF5ZXIucmFpc2VMYXllcicgfCB0cmFuc2xhdGUpXG4gICAgICBcIlxuICAgICAgW2Rpc2FibGVkXT1cInJhaXNlRGlzYWJsZWRTZWxlY3Rpb25cIlxuICAgICAgKGNsaWNrKT1cInJhaXNlTGF5ZXJzKGxheWVyc0NoZWNrZWQpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb25cbiAgICAgICAgYXJpYS1oaWRkZW49XCJmYWxzZVwiXG4gICAgICAgIFttYXRCYWRnZV09XCJzb3J0QWxwaGEgfHwgb25seVZpc2libGUgfHwga2V5d29yZCA/ICchJyA6ICcnXCJcbiAgICAgICAgbWF0QmFkZ2VDb2xvcj1cIndhcm5cIlxuICAgICAgICBtYXRCYWRnZVNpemU9XCJtZWRpdW1cIlxuICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwicmFpc2VEaXNhYmxlZFNlbGVjdGlvblwiXG4gICAgICAgID5hcnJvd191cHdhcmQ8L21hdC1pY29uXG4gICAgICA+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cIm9wYWNpdHktYnV0dG9uXCJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgIFtkaXNhYmxlZF09XCJsYXllcnNDaGVja2VkLmxlbmd0aCA9PT0gMFwiXG4gICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwib3BhY2l0eU1lbnVcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIub3BhY2l0eScgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5vcGFjaXR5PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxtYXQtbWVudSAjb3BhY2l0eU1lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJtYXQtbWVudS1vcGFjaXR5LXNsaWRlclwiPlxuICAgICAgPGRpdiBpZD1cIm9wYWNpdHktbWVudVwiPlxuICAgICAgICA8IS0tIFRPRE86IFRoZSAndGlja0ludGVydmFsJyBwcm9wZXJ0eSBubyBsb25nZXIgZXhpc3RzIC0tPlxuICAgICAgICA8bWF0LXNsaWRlclxuICAgICAgICAgICpuZ0lmPVwibGF5ZXJzQ2hlY2tlZC5sZW5ndGhcIlxuICAgICAgICAgIGlkPVwib3BhY2l0eS1zbGlkZXJcIlxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgdGh1bWJMYWJlbFxuICAgICAgICAgIHNob3dUaWNrTWFya3NcbiAgICAgICAgICBzdGVwPVwiNVwiXG4gICAgICAgICAgW21pbl09XCIwXCJcbiAgICAgICAgICBbbWF4XT1cIjEwMFwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJjaGVja09wYWNpdHlcIlxuICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmxheWVyLm9wYWNpdHknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgID48aW5wdXQgbWF0U2xpZGVyVGh1bWIgLz5cbiAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtbWVudT5cblxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGxheWVyc0NoZWNrZWQubGVuZ3RoICE9PSAwICYmIGFjdGl2ZUxheWVyc0V4dGVudEFyZVZhbGlkKGxheWVyc0NoZWNrZWQpXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJ6b29tTGF5ZXItYnV0dG9uXCJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmxheWVyLnpvb21MYXllcnMnIHwgdHJhbnNsYXRlXCJcbiAgICAgIChjbGljayk9XCJ6b29tTGF5ZXJzRXh0ZW50cyhsYXllcnNDaGVja2VkKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmZyYW1lX2luc3BlY3Q8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvaWdvLXBhbmVsPlxuIl19
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXItbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9sYXllci9sYXllci1saXN0L2xheWVyLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvbGF5ZXIvbGF5ZXItbGlzdC9sYXllci1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixh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L2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBGbGF0VHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nRm9yLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QmFkZ2VNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXREaXZpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRTbGlkZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZXInO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHtcbiAgTWF0VHJlZUZsYXREYXRhU291cmNlLFxuICBNYXRUcmVlRmxhdHRlbmVyLFxuICBNYXRUcmVlTW9kdWxlXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xuXG5pbXBvcnQge1xuICBEcm9wUGVybWlzc2lvbixcbiAgVHJlZURyYWdEcm9wRGlyZWN0aXZlLFxuICBUcmVlRHJvcEV2ZW50LFxuICBUcmVlRmxhdE5vZGVcbn0gZnJvbSAnQGlnbzIvY29tbW9uL2RyYWctZHJvcCc7XG5pbXBvcnQge1xuICBJY29uU3ZnLFxuICBJZ29JY29uQ29tcG9uZW50LFxuICBWRUNUT1JfU1FVQVJFX0lDT05cbn0gZnJvbSAnQGlnbzIvY29tbW9uL2ljb24nO1xuaW1wb3J0IHsgTGlzdENvbXBvbmVudCwgTGlzdEl0ZW1EaXJlY3RpdmUgfSBmcm9tICdAaWdvMi9jb21tb24vbGlzdCc7XG5pbXBvcnQgeyBQYW5lbENvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbi9wYW5lbCc7XG5pbXBvcnQgeyBJZ29MYW5ndWFnZU1vZHVsZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL21lc3NhZ2UnO1xuXG5pbXBvcnQgeyBMYXllckdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItZ3JvdXAnO1xuaW1wb3J0IHsgTGF5ZXJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItaXRlbSc7XG5pbXBvcnQgeyBMYXllckxpc3RUb29sQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItbGlzdC10b29sJztcbmltcG9ydCB0eXBlIHsgTGF5ZXJWaWV3ZXJPcHRpb25zIH0gZnJvbSAnLi4vbGF5ZXItdmlld2VyL2xheWVyLXZpZXdlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGF5ZXJUeXBlIH0gZnJvbSAnLi4vc2hhcmVkJztcbmltcG9ydCB0eXBlIHsgTGF5ZXJDb250cm9sbGVyIH0gZnJvbSAnLi4vc2hhcmVkL2xheWVyLWNvbnRyb2xsZXInO1xuaW1wb3J0IHR5cGUgeyBBbnlMYXllciB9IGZyb20gJy4uL3NoYXJlZC9sYXllcnMvYW55LWxheWVyJztcbmltcG9ydCB0eXBlIHsgTGF5ZXIgfSBmcm9tICcuLi9zaGFyZWQvbGF5ZXJzL2xheWVyJztcbmltcG9ydCB0eXBlIHsgTGF5ZXJHcm91cCB9IGZyb20gJy4uL3NoYXJlZC9sYXllcnMvbGF5ZXItZ3JvdXAnO1xuaW1wb3J0IHsgaXNMYXllckdyb3VwLCBpc0xheWVySXRlbSB9IGZyb20gJy4uL3V0aWxzL2xheWVyLnV0aWxzJztcblxudHlwZSBMYXllckZsYXROb2RlPFQgPSBBbnlMYXllcj4gPSBUcmVlRmxhdE5vZGU8VD47XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lnby1sYXllci1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xheWVyLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9sYXllci1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdJZixcbiAgICBOZ0ZvcixcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBNYXRCYWRnZU1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXG4gICAgTWF0RGl2aWRlck1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgTWF0U2xpZGVyTW9kdWxlLFxuICAgIE1hdFRyZWVNb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBUcmVlRHJhZ0Ryb3BEaXJlY3RpdmUsXG4gICAgTGF5ZXJMaXN0VG9vbENvbXBvbmVudCxcbiAgICBMYXllckdyb3VwQ29tcG9uZW50LFxuICAgIExpc3RDb21wb25lbnQsXG4gICAgTGF5ZXJJdGVtQ29tcG9uZW50LFxuICAgIExpc3RJdGVtRGlyZWN0aXZlLFxuICAgIFBhbmVsQ29tcG9uZW50LFxuICAgIElnb0xhbmd1YWdlTW9kdWxlLFxuICAgIElnb0ljb25Db21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMYXllckxpc3RDb21wb25lbnQge1xuICBwdWJsaWMgdG9nZ2xlT3BhY2l0eSA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW47XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgY29udHJvbGxlcjogTGF5ZXJDb250cm9sbGVyO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHNldCBsYXllcnMobGF5ZXJzOiBBbnlMYXllcltdKSB7XG4gICAgdGhpcy5fbGF5ZXJzID0gbGF5ZXJzO1xuICAgIHRoaXMudXBkYXRlRGF0YXNvdXJjZShsYXllcnMgPz8gW10pO1xuICB9XG4gIGdldCBsYXllcnMoKTogQW55TGF5ZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheWVycztcbiAgfVxuICBwcml2YXRlIF9sYXllcnM6IEFueUxheWVyW107XG5cbiAgQElucHV0KCkgaXNEZXNrdG9wOiBib29sZWFuO1xuICBASW5wdXQoKSBpc0RyYWdEcm9wRGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNlbGVjdEFsbDogYm9vbGVhbjtcbiAgQElucHV0KCkgdmlld2VyT3B0aW9uczogTGF5ZXJWaWV3ZXJPcHRpb25zO1xuXG4gIEBPdXRwdXQoKSBhY3RpdmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFueUxheWVyPigpO1xuXG4gIHByaXZhdGUgX3RyYW5zZm9ybWVyID0gKGxheWVyOiBBbnlMYXllciwgbGV2ZWw6IG51bWJlcik6IExheWVyRmxhdE5vZGUgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogbGF5ZXIuaWQgfHwgbGF5ZXIub3B0aW9ucy5uYW1lLFxuICAgICAgaXNHcm91cDogISFpc0xheWVyR3JvdXAobGF5ZXIpLFxuICAgICAgZGVzY2VuZGFudExldmVsczogaXNMYXllckdyb3VwKGxheWVyKVxuICAgICAgICA/IGxheWVyLmRlc2NlbmRhbnRzTGV2ZWxcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBsZXZlbDogbGV2ZWwsXG4gICAgICBkYXRhOiBsYXllcixcbiAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgIH07XG4gIH07XG5cbiAgdHJlZUNvbnRyb2wgPSBuZXcgRmxhdFRyZWVDb250cm9sPExheWVyRmxhdE5vZGU+KFxuICAgIChub2RlKSA9PiBub2RlLmxldmVsLFxuICAgIChub2RlKSA9PiBub2RlLmlzR3JvdXBcbiAgKTtcblxuICB0cmVlRmxhdHRlbmVyID0gbmV3IE1hdFRyZWVGbGF0dGVuZXIoXG4gICAgdGhpcy5fdHJhbnNmb3JtZXIsXG4gICAgKG5vZGUpID0+IG5vZGUubGV2ZWwsXG4gICAgKG5vZGUpID0+IG5vZGUuaXNHcm91cCxcbiAgICAobm9kZSkgPT5cbiAgICAgIChub2RlIGFzIExheWVyR3JvdXApLmNoaWxkcmVuXG4gICAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5zaG93SW5MYXllckxpc3QpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnpJbmRleCArIGIuekluZGV4KVxuICApO1xuXG4gIGRhdGFTb3VyY2U6IE1hdFRyZWVGbGF0RGF0YVNvdXJjZTxBbnlMYXllciwgTGF5ZXJGbGF0Tm9kZT47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VHJlZUZsYXREYXRhU291cmNlKFxuICAgICAgdGhpcy50cmVlQ29udHJvbCxcbiAgICAgIHRoaXMudHJlZUZsYXR0ZW5lcixcbiAgICAgIFtdXG4gICAgKTtcbiAgfVxuXG4gIGlzR3JvdXAgPSAoXzogbnVtYmVyLCBub2RlOiBMYXllckZsYXROb2RlKSA9PiBub2RlLmlzR3JvdXA7XG5cbiAgaXNMYXllckdyb3VwID0gaXNMYXllckdyb3VwO1xuICBpc0xheWVySXRlbSA9IGlzTGF5ZXJJdGVtO1xuXG4gIGlzU2VsZWN0ZWQgPSAobGF5ZXI6IEFueUxheWVyKTogYm9vbGVhbiA9PiB0aGlzLmNvbnRyb2xsZXIuaXNTZWxlY3RlZChsYXllcik7XG4gIGlzRGVzY2VuZGFudFNlbGVjdGlvbiA9IChsYXllcjogQW55TGF5ZXIpOiBib29sZWFuID0+XG4gICAgdGhpcy5jb250cm9sbGVyLmlzRGVzY2VuZGFudFNlbGVjdGlvbihsYXllcik7XG5cbiAgdG9nZ2xlQWN0aXZlKGxheWVyOiBBbnlMYXllcik6IHZvaWQge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmNvbnRyb2xsZXIuaXNTZWxlY3RlZChsYXllcik7XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIuY2xlYXJTZWxlY3Rpb24oKTtcblxuICAgIGlmICghaXNTZWxlY3RlZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNlbGVjdChsYXllcik7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlQ2hhbmdlLmVtaXQobGF5ZXIpO1xuICB9XG5cbiAgaGFuZGxlU2VsZWN0KGNoZWNrZWQ6IGJvb2xlYW4sIGxheWVyOiBBbnlMYXllcik6IHZvaWQge1xuICAgIGNoZWNrZWQgPyB0aGlzLmNvbnRyb2xsZXIuc2VsZWN0KGxheWVyKSA6IHRoaXMuY29udHJvbGxlci5kZXNlbGVjdChsYXllcik7XG4gIH1cblxuICBnZXRMYXllclR5cGUobGF5ZXI6IExheWVyKTogTGF5ZXJUeXBlIHwgJ21lYXN1cmUnIHwgJ2RyYXcnIHtcbiAgICByZXR1cm4gbGF5ZXIudHlwZSA9PT0gJ3Jhc3RlcidcbiAgICAgID8gJ3Jhc3RlcidcbiAgICAgIDogbGF5ZXIuaWQuaW5jbHVkZXMoJ21lYXN1cmUnKVxuICAgICAgICA/ICdtZWFzdXJlJ1xuICAgICAgICA6IGxheWVyLmlkLmluY2x1ZGVzKCdkcmF3JylcbiAgICAgICAgICA/ICdkcmF3J1xuICAgICAgICAgIDogJ3ZlY3Rvcic7XG4gIH1cblxuICBnZXRMYXllckljb24obGF5ZXI6IExheWVyKTogc3RyaW5nIHwgSWNvblN2ZyB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0TGF5ZXJUeXBlKGxheWVyKTtcbiAgICByZXR1cm4gdHlwZSA9PT0gJ3Jhc3RlcidcbiAgICAgID8gbGF5ZXIuYmFzZUxheWVyXG4gICAgICAgID8gJ3dhbGxwYXBlcidcbiAgICAgICAgOiAnaW1hZ2UnXG4gICAgICA6IHR5cGUgPT09ICdtZWFzdXJlJ1xuICAgICAgICA/ICdzcXVhcmVfZm9vdCdcbiAgICAgICAgOiB0eXBlID09PSAnZHJhdydcbiAgICAgICAgICA/ICdkcmF3J1xuICAgICAgICAgIDogVkVDVE9SX1NRVUFSRV9JQ09OO1xuICB9XG5cbiAgZHJvcE5vZGUoeyBub2RlLCByZWYsIHBvc2l0aW9uIH06IFRyZWVEcm9wRXZlbnQ8QW55TGF5ZXI+KTogdm9pZCB7XG4gICAgbGV0IG5vZGVzVG9Ecm9wID0gW25vZGUuZGF0YV07XG5cbiAgICBpZiAodGhpcy5jb250cm9sbGVyLmhhc1NlbGVjdGlvbikge1xuICAgICAgLy8gVGhlIHNlbGVjdGlvbiBjb3VsZCBjb250YWlucyBkYXRhIGZyb20gdGhlIG91dHNpZGUgdGhlIFRyZWVDb250cm9sbGVyXG4gICAgICBub2Rlc1RvRHJvcCA9IHRoaXMuY29udHJvbGxlci5zZWxlY3RlZC5maWx0ZXIoXG4gICAgICAgIChsYXllcikgPT4gISF0aGlzLmZpbmROb2RlQnlMYXllcklkKGxheWVyLmlkKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5pc0dyb3VwKSB7XG4gICAgICBub2Rlc1RvRHJvcCA9IG5vZGVzVG9Ecm9wLmZpbHRlcihcbiAgICAgICAgKG5vZGVEcm9wKSA9PiAhKG5vZGUuZGF0YSBhcyBMYXllckdyb3VwKS5pc0Rlc2NlbmRhbnQobm9kZURyb3ApXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZWYuaXNHcm91cCkge1xuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IG5vZGVzVG9Ecm9wLnNvbWUoKG5vZGVEcm9wKSA9PiBub2RlRHJvcC5pZCA9PT0gcmVmLmlkKTtcbiAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgIG5vZGVzVG9Ecm9wID0gbm9kZXNUb0Ryb3AuZmlsdGVyKChub2RlRHJvcCkgPT4gbm9kZURyb3AuaWQgIT09IHJlZi5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFub2Rlc1RvRHJvcC5pbmNsdWRlcyhub2RlLmRhdGEpKSB7XG4gICAgICBub2Rlc1RvRHJvcC5wdXNoKG5vZGUuZGF0YSk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgY2FzZSAnYWJvdmUnOlxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubW92ZUFib3ZlKHJlZi5kYXRhLCAuLi5ub2Rlc1RvRHJvcCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW5zaWRlJzpcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1vdmVJbnNpZGUocmVmLmRhdGEgYXMgTGF5ZXJHcm91cCwgLi4ubm9kZXNUb0Ryb3ApO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1vdmVCZWxvdyhyZWYuZGF0YSwgLi4ubm9kZXNUb0Ryb3ApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBkcm9wTm9kZUVycm9yKGRldGFpbHM6IERyb3BQZXJtaXNzaW9uKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hbGVydChcbiAgICAgIGRldGFpbHMubWVzc2FnZSxcbiAgICAgICdpZ28uZ2VvLmxheWVyLmxheWVyJyxcbiAgICAgIG51bGwsXG4gICAgICBkZXRhaWxzLnBhcmFtc1xuICAgICk7XG4gIH1cblxuICBkcmFnU3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld2VyT3B0aW9ucy5tb2RlID09PSAnc2VsZWN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29udHJvbGxlci5jbGVhclNlbGVjdGlvbigpO1xuICB9XG5cbiAgaGFuZGxlTm9kZVRvZ2dsZShub2RlOiBMYXllckZsYXROb2RlPExheWVyR3JvdXA+KTogdm9pZCB7XG4gICAgbm9kZS5kYXRhLmV4cGFuZGVkID0gdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTm9kZUJ5TGF5ZXJJZChpZDogc3RyaW5nKTogTGF5ZXJGbGF0Tm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUuaWQgPT09IGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGF0YXNvdXJjZShsYXllcnM6IEFueUxheWVyW10pOiB2b2lkIHtcbiAgICBjb25zdCBleHBhbnNpb25Nb2RlbCA9IHRoaXMudHJlZUNvbnRyb2wuZXhwYW5zaW9uTW9kZWw7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBsYXllcnM7XG5cbiAgICB0aGlzLmlzSW5pdFxuICAgICAgPyB0aGlzLnJlc3RvcmVNb2RlbChleHBhbnNpb25Nb2RlbCwgKG5vZGUpID0+XG4gICAgICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQobm9kZSlcbiAgICAgICAgKVxuICAgICAgOiB0aGlzLmV4cGFuZEdyb3VwKGxheWVycyk7XG5cbiAgICBpZiAoIXRoaXMuaXNJbml0ICYmIGxheWVycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVjdXJzaXZlICovXG4gIHByaXZhdGUgZXhwYW5kR3JvdXAobGF5ZXJzOiBBbnlMYXllcltdKTogdm9pZCB7XG4gICAgbGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICBpZiAoIWlzTGF5ZXJHcm91cChsYXllcikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGxheWVyLmV4cGFuZGVkKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlQnlMYXllcklkKGxheWVyLmlkKTtcbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmV4cGFuZEdyb3VwKGxheWVyLmNoaWxkcmVuKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZU1vZGVsKFxuICAgIG1vZGVsOiBTZWxlY3Rpb25Nb2RlbDxMYXllckZsYXROb2RlPixcbiAgICBjYWxsYmFjazogKG5vZGU6IExheWVyRmxhdE5vZGUpID0+IHZvaWRcbiAgKSB7XG4gICAgY29uc3QgaWRzOiBzdHJpbmdbXSA9IEFycmF5LmZyb20obW9kZWxbJ19zZWxlY3Rpb24nXSkubWFwKFxuICAgICAgKHZhbHVlKSA9PiB2YWx1ZVsnaWQnXVxuICAgICk7XG4gICAgbW9kZWwuY2xlYXIoKTtcbiAgICB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBpZiAobW9kZWwuaXNTZWxlY3RlZChub2RlKSB8fCBpZHMuaW5jbHVkZXMobm9kZS5pZCkpIHtcbiAgICAgICAgY2FsbGJhY2sobm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxtYXQtdHJlZVxuICBbY2xhc3MuLS1ub3QtZGVza3RvcF09XCIhaXNEZXNrdG9wXCJcbiAgaWdvVHJlZURyYWdEcm9wXG4gIFt0cmVlRHJhZ0Ryb3BJc0Rpc2FibGVkXT1cImlzRHJhZ0Ryb3BEaXNhYmxlZFwiXG4gIFttYXhMZXZlbF09XCJ2aWV3ZXJPcHRpb25zPy5ncm91cD8ubWF4SGllcmFyY2h5TGV2ZWxcIlxuICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCJcbiAgKGRyYWdTdGFydCk9XCJkcmFnU3RhcnQoKVwiXG4gIChvbkRyb3ApPVwiZHJvcE5vZGUoJGV2ZW50KVwiXG4gIChvbkRyb3BFcnJvcik9XCJkcm9wTm9kZUVycm9yKCRldmVudClcIlxuPlxuICA8IS0tIFRoaXMgaXMgdGhlIHRyZWUgbm9kZSB0ZW1wbGF0ZSBmb3IgbGVhZiBub2RlcyAtLT5cbiAgPG1hdC10cmVlLW5vZGVcbiAgICAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZVwiXG4gICAgW2NsYXNzLi0tc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChub2RlLmRhdGEpXCJcbiAgICBbY2xhc3MuLS1jaGlsZHJlbi1zZWxlY3RlZF09XCJpc0Rlc2NlbmRhbnRTZWxlY3Rpb24obm9kZS5kYXRhKVwiXG4gID5cbiAgICA8aWdvLWxheWVyLWl0ZW1cbiAgICAgIFttYXRUcmVlTm9kZVBhZGRpbmddPVwibm9kZS5sZXZlbCA9PT0gMCA/IDEgOiBub2RlLmxldmVsXCJcbiAgICAgIFttYXRUcmVlTm9kZVBhZGRpbmdJbmRlbnRdPVwibm9kZS5sZXZlbCA9PT0gMCA/IDE2IDogMjQgKyAxNiAvIG5vZGUubGV2ZWxcIlxuICAgICAgY2xhc3M9XCJ0cmVlLW5vZGUtaXRlbVwiXG4gICAgICBbbGF5ZXJdPVwibm9kZS5kYXRhXCJcbiAgICAgIFt2aXNpYmxlXT1cIm5vZGUuZGF0YS52aXNpYmxlXCJcbiAgICAgIFt2aWV3ZXJPcHRpb25zXT1cInZpZXdlck9wdGlvbnNcIlxuICAgICAgW3NlbGVjdGVkXT1cImlzU2VsZWN0ZWQobm9kZS5kYXRhKSB8fCBpc0Rlc2NlbmRhbnRTZWxlY3Rpb24obm9kZS5kYXRhKVwiXG4gICAgICBbc2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNEZXNjZW5kYW50U2VsZWN0aW9uKG5vZGUuZGF0YSlcIlxuICAgICAgKGFjdGlvbik9XCJ0b2dnbGVBY3RpdmUoJGV2ZW50KVwiXG4gICAgICAoc2VsZWN0Q2hhbmdlKT1cImhhbmRsZVNlbGVjdCgkZXZlbnQsIG5vZGUuZGF0YSlcIlxuICAgID5cbiAgICA8L2lnby1sYXllci1pdGVtPlxuICA8L21hdC10cmVlLW5vZGU+XG4gIDwhLS0gVGhpcyBpcyB0aGUgdHJlZSBub2RlIHRlbXBsYXRlIGZvciBleHBhbmRhYmxlIG5vZGVzIC0tPlxuICA8bWF0LXRyZWUtbm9kZVxuICAgICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlOyB3aGVuOiBpc0dyb3VwXCJcbiAgICBbY2xhc3MuLS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKG5vZGUuZGF0YSlcIlxuICAgIFtjbGFzcy4tLWNoaWxkcmVuLXNlbGVjdGVkXT1cImlzRGVzY2VuZGFudFNlbGVjdGlvbihub2RlLmRhdGEpXCJcbiAgPlxuICAgIDxpZ28tbGF5ZXItZ3JvdXBcbiAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ1xuICAgICAgW21hdFRyZWVOb2RlUGFkZGluZ0luZGVudF09XCIyNFwiXG4gICAgICBjbGFzcz1cInRyZWUtbm9kZS1pdGVtXCJcbiAgICAgIFtsYXllcl09XCJub2RlLmRhdGFcIlxuICAgICAgW3ZpZXdlck9wdGlvbnNdPVwidmlld2VyT3B0aW9uc1wiXG4gICAgICBbc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChub2RlLmRhdGEpIHx8IGlzRGVzY2VuZGFudFNlbGVjdGlvbihub2RlLmRhdGEpXCJcbiAgICAgIFtzZWxlY3Rpb25EaXNhYmxlZF09XCJpc0Rlc2NlbmRhbnRTZWxlY3Rpb24obm9kZS5kYXRhKVwiXG4gICAgICAoYWN0aW9uKT1cInRvZ2dsZUFjdGl2ZSgkZXZlbnQpXCJcbiAgICAgIChleHBhbmQpPVwidHJlZUNvbnRyb2wudG9nZ2xlKG5vZGUpOyBoYW5kbGVOb2RlVG9nZ2xlKG5vZGUpXCJcbiAgICAgIChzZWxlY3RDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0KCRldmVudCwgbm9kZS5kYXRhKVwiXG4gICAgPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgbWF0VHJlZU5vZGVUb2dnbGVcbiAgICAgICAgY2xhc3M9XCJsYXllci1pbmRpY2F0b3JcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidUb2dnbGUgJyArIG5vZGUuZGF0YS50aXRsZVwiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVOb2RlVG9nZ2xlKG5vZGUpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LWljb24tcnRsLW1pcnJvclwiPlxuICAgICAgICAgIHt7XG4gICAgICAgICAgICB0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpXG4gICAgICAgICAgICAgID8gJ2tleWJvYXJkX2Fycm93X2Rvd24nXG4gICAgICAgICAgICAgIDogJ2tleWJvYXJkX2Fycm93X3JpZ2h0J1xuICAgICAgICAgIH19XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2lnby1sYXllci1ncm91cD5cbiAgPC9tYXQtdHJlZS1ub2RlPlxuPC9tYXQtdHJlZT5cbiJdfQ==
|